[
  {
    "path": ".dockerignore",
    "content": "/build\n"
  },
  {
    "path": ".github/workflows/debian.yml",
    "content": "name: Debian\n\non:\n  push:\n    branches:\n      - '**'\n    tags:\n      - '**'\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}\n  cancel-in-progress: true\n\njobs:\n  build:\n    strategy:\n      matrix:\n        ubuntu-version: [22.04, 24.04]\n    runs-on: ubuntu-${{ matrix.ubuntu-version }}\n\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          fetch-tags: true\n          submodules: \"recursive\"\n\n      - name: Set up build environment\n        run: |\n          sudo apt-get update\n          sudo apt-get install -y git cmake build-essential automake libtool pkg-config curl libminiupnpc-dev libjemalloc-dev libzstd-dev zlib1g-dev ocl-icd-opencl-dev qtwebengine5-dev fakeroot devscripts debhelper dpkg-dev\n\n      - name: Install CUDA Toolkit\n        uses: Jimver/cuda-toolkit@v0.2.21\n        with:\n          cuda: ${{ matrix.ubuntu-version == '24.04' && '12.5.0' || '11.8.0' }}\n          method: network\n          sub-packages: '[\"nvcc\"]'\n\n      - name: Build Debian package\n        run: |\n          ARCH=amd64 DIST=ubuntu-${{ matrix.ubuntu-version }} ./make_debian.sh\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: ubuntu-${{ matrix.ubuntu-version }}\n          path: ./mmx-node-*.deb\n      \n      - name: Upload a Build Artifact to release\n        if: startsWith(github.ref, 'refs/tags/v')\n        uses: svenstaro/upload-release-action@v2\n        with:\n          repo_token: ${{ secrets.GITHUB_TOKEN }}\n          file: ./mmx-node-*.deb\n          file_glob: true\n          tag: ${{ github.ref }}\n          overwrite: true"
  },
  {
    "path": ".github/workflows/docker.yml",
    "content": "name: Docker\n\non:\n  push:\n    branches:\n      - '**'\n    tags:\n      - '**'\n\n# Automatically cancel previous runs for the same ref (i.e. branch) and event type. The latter component prevents\n# manually dispatched events from being cancelled by pushes to the `master` branch.\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}\n  cancel-in-progress: true\n\njobs:\n  build-and-push-image:\n    name: Build and push image\n    runs-on: ubuntu-latest\n    env:\n      REGISTRY: ghcr.io\n      IMAGE_NAME: ${{ github.repository }}\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n          - final-build-stage: 'base'\n            latest-tag-behaviour: auto\n            version-suffix: ''\n            suffix-onlatest: false\n          - final-build-stage: amd\n            latest-tag-behaviour: auto\n            version-suffix: '-amd'\n            suffix-onlatest: true\n          - final-build-stage: nvidia\n            latest-tag-behaviour: auto\n            version-suffix: '-nvidia'\n            suffix-onlatest: true\n          - final-build-stage: intel\n            latest-tag-behaviour: auto\n            version-suffix: '-intel'\n            suffix-onlatest: true\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          fetch-tags: true\n          submodules: \"recursive\"\n\n      - name: Extract metadata for Docker\n        id: meta\n        uses: docker/metadata-action@v5\n        with:\n          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n          flavor: |\n            latest=${{ matrix.latest-tag-behaviour }}\n            suffix=${{ matrix.version-suffix }},onlatest=${{ matrix.suffix-onlatest }}\n          tags: |\n            type=edge\n            type=semver,pattern={{version}}\n            type=semver,pattern={{major}}.{{minor}}\n            type=semver,pattern={{major}}\n\n      - name: Set up Docker Buildx\n        uses: docker/setup-buildx-action@v3\n      - name: Login to the container registry\n        uses: docker/login-action@v3\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Build and push\n        uses: docker/build-push-action@v5\n        with:\n          context: .\n          target: ${{ matrix.final-build-stage }}\n          push: ${{ github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v') }}\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n"
  },
  {
    "path": ".github/workflows/windows.yml",
    "content": "name: Windows\n\non:\n  push:\n    branches:\n      - '**'\n    tags:\n      - '**'\n#   schedule:\n#       - cron: \"0 4 * * *\"\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}\n  cancel-in-progress: true\n\nenv:\n  CMAKE_BUILD_PRESET: \"windows-default\"\n  MMX_VERSION: ${{ github.ref_name }}\n  MMX_WIN_PACK: \"TRUE\"\n  \n  MMX_TELEGRAM_TOKEN: ${{ secrets.MMX_TELEGRAM_TOKEN }} \n  MMX_TELEGRAM_TO_1: ${{ secrets.MMX_TELEGRAM_TO_1 }}\n  MMX_TELEGRAM_TO_2: ${{ secrets.MMX_TELEGRAM_TO_2 }}\n  DISCORD_WEBHOOK: ${{ secrets.MMX_DISCORD_WEBHOOK }}\n\njobs:\n  msvc:\n    runs-on: windows-2022\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n          fetch-tags: true\n          submodules: \"recursive\"\n\n      - uses: Jimver/cuda-toolkit@v0.2.21\n        id: cuda-toolkit\n        with:\n          cuda: '12.5.0'\n          method: 'network'\n          sub-packages: '[\"nvcc\", \"cudart\"]'\n\n      - run: |\n          echo \"Installed cuda version is: ${{steps.cuda-toolkit.outputs.cuda}}\"\n          echo \"Cuda install location: ${{steps.cuda-toolkit.outputs.CUDA_PATH}}\"\n          nvcc -V\n          \n      - uses: lukka/get-cmake@latest\n        with:\n          cmakeVersion: \"~3\"\n\n      - name: Restore artifacts, or setup vcpkg (do not install any package)\n        uses: lukka/run-vcpkg@v11\n\n      - name: Run CMake consuming CMakePreset.json and vcpkg.json by mean of vcpkg.\n        uses: lukka/run-cmake@v10\n        with:\n          configurePreset: ${{ env.CMAKE_BUILD_PRESET }}\n          buildPreset: ${{ env.CMAKE_BUILD_PRESET }}\n   \n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: \"build\"\n          include-hidden-files: true\n          path: ./build/${{ env.CMAKE_BUILD_PRESET }}/!bin/Release/\n\n      - name: Run CPack\n        run: cpack -C Release --config build/${{ env.CMAKE_BUILD_PRESET }}/CPackConfig.cmake -B build/${{ env.CMAKE_BUILD_PRESET }}/!package\n\n      - name: Zip files\n        run: Get-ChildItem \"./build/${{ env.CMAKE_BUILD_PRESET }}/!package\" -Filter *.exe | Foreach-Object { 7z a ( (Convert-Path $_.PSParentPath) + \"\\\"  + $_.BaseName + \".zip\") $_.FullName }\n\n      - name: Upload a Build Artifact\n        uses: actions/upload-artifact@v4\n        with:\n          name: \"package\"\n          path: ./build/${{ env.CMAKE_BUILD_PRESET }}/!package/*.exe\n\n      - name: Upload a Build Artifact to release\n        if: startsWith(github.ref, 'refs/tags/v')\n        uses: svenstaro/upload-release-action@v2\n        with:\n          repo_token: ${{ secrets.GITHUB_TOKEN }}\n          file: ./build/${{ env.CMAKE_BUILD_PRESET }}/!package/*.zip\n          file_glob: true\n          tag: ${{ github.ref }}\n          overwrite: true\n          \n  notify:\n    if: startsWith(github.ref, 'refs/tags/v')\n    runs-on: ubuntu-latest\n    needs: [msvc]\n    steps:\n\n      - name: Get the version\n        id: get_version\n        run: echo VERSION=$(echo $GITHUB_REF | cut -d / -f 3) >> $GITHUB_OUTPUT\n        \n      - name: Telegram notification\n        if: ${{ env.MMX_TELEGRAM_TO_1 != '' }} && ${{ env.MMX_TELEGRAM_TOKEN != '' }}\n        uses: appleboy/telegram-action@master\n        with:\n          to: ${{ env.MMX_TELEGRAM_TO_1 }}\n          token: ${{ env.MMX_TELEGRAM_TOKEN }}\n          format: html\n          message: |\n            MMX Node release ${{ steps.get_version.outputs.VERSION }}\n            https://github.com/${{ github.repository }}/releases/${{ steps.get_version.outputs.VERSION }}\n            \n            <a href=\"https://t.me/mmx_node\">Telegram channel</a>\n            <a href=\"https://t.me/mmx_node_chat\">Telegram chat</a>\n            <a href=\"https://t.me/mmx_node_chat_ru\">Telegram chat[RU]</a>\n            <a href=\"https://discord.gg/tCwevssVmY\">Discord</a>\n            \n      - name: Telegram notification\n        if: ${{ env.MMX_TELEGRAM_TO_2 != '' }} && ${{ env.MMX_TELEGRAM_TOKEN != '' }}\n        uses: appleboy/telegram-action@master\n        with:\n          to: ${{ env.MMX_TELEGRAM_TO_2 }}\n          token: ${{ env.MMX_TELEGRAM_TOKEN }}\n          format: html\n          message: |\n            MMX Node release ${{ steps.get_version.outputs.VERSION }}\n            https://github.com/${{ github.repository }}/releases/${{ steps.get_version.outputs.VERSION }}\n            \n            <a href=\"https://t.me/mmx_node\">Telegram channel</a>\n            <a href=\"https://t.me/mmx_node_chat\">Telegram chat</a>\n            <a href=\"https://t.me/mmx_node_chat_ru\">Telegram chat[RU]</a>\n            <a href=\"https://discord.gg/tCwevssVmY\">Discord</a>\n            \n      - name: Discord notification\n        if: ${{ env.DISCORD_WEBHOOK != '' }}\n        uses: Ilshidur/action-discord@master\n        with:\n          args: |\n            MMX Node release ${{ steps.get_version.outputs.VERSION }}\n            https://github.com/${{ github.repository }}/releases/${{ steps.get_version.outputs.VERSION }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Prerequisites\n*.d\n\n# Compiled Object files\n*.slo\n*.lo\n*.o\n*.obj\n\n# Precompiled Headers\n*.gch\n*.pch\n\n# Compiled Dynamic libraries\n*.so\n*.dylib\n*.dll\n\n# Fortran module files\n*.mod\n*.smod\n\n# Compiled Static libraries\n*.lai\n*.la\n*.a\n*.lib\n\n# Executables\n*.exe\n*.out\n*.app\n\n*.bak\nCMakeUserPresets.json\n\n/build\n/.settings\n/.project\n/.cproject\n/.pydevproject\n/config/local\n/PASSWD\n/NETWORK\n/DB_VERSION\n/testnet*\n/mainnet*\n/tmp\n/coverage.info\n/.idea\n/_deps\n/*.dat\n/*.deb\n/config/default/build.json\n/test/vm/AFL/outputs/*\n/docs/dist\n/docs/.astro\n/docs/node_modules\n/.vscode\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"secp256k1\"]\n\tpath = lib/secp256k1\n\turl = https://github.com/bitcoin-core/secp256k1.git\n[submodule \"uint256_t\"]\n\tpath = uint256_t\n\turl = https://github.com/madMAx43v3r/uint256_t.git\n[submodule \"libbech32\"]\n\tpath = lib/libbech32\n\turl = https://github.com/dcdpr/libbech32.git\n[submodule \"vnx-addons\"]\n\tpath = vnx-addons\n\turl = https://github.com/madMAx43v3r/vnx-addons.git\n[submodule \"basic-opencl\"]\n\tpath = basic-opencl\n\turl = https://github.com/automyinc/basic-opencl.git\n[submodule \"vnx-base\"]\n\tpath = vnx-base\n\turl = https://github.com/madMAx43v3r/vnx-base.git\n[submodule \"lib/lexy\"]\n\tpath = lib/lexy\n\turl = https://github.com/foonathan/lexy.git\n"
  },
  {
    "path": "CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.13)\nproject(mmx-node C CXX ASM)\n\ninclude(FetchContent)\n\nset(CMAKE_POSITION_INDEPENDENT_CODE ON)\n\nset(CMAKE_CXX_STANDARD 17)\n\nif(MSVC)\n\tinclude(GenerateExportHeader)\n\tinclude_directories(${CMAKE_CURRENT_BINARY_DIR})\n\t\n\tadd_compile_definitions(TARGET_FILENAME=$(TargetName)$(TargetExt))\n\tadd_compile_options(/openmp /EHsc /MP)\n\n\tset(MSVC_DEBUG_OPTIONS /Od /FS)\n\tset(MSVC_RELEASE_OPTIONS /W1 /O2)\n\n\tadd_compile_options(\n\t\t\"$<$<CONFIG:Debug>:${MSVC_DEBUG_OPTIONS}>\"\n\t\t\"$<$<CONFIG:RelWithDebInfo>:${MSVC_RELEASE_OPTIONS}>\"\n\t\t\"$<$<CONFIG:Release>:${MSVC_RELEASE_OPTIONS}>\"\n\t\t\"$<$<CONFIG:MinSizeRel>:${MSVC_RELEASE_OPTIONS}>\"\n\t)\n\n\tset(MSVC_DEBUG_LINK_OPTIONS /NODEFAULTLIB:LIBCMT)\n\tset(MSVC_RELEASE_LINK_OPTIONS /NODEFAULTLIB:LIBCMT)\n\n\tadd_link_options(\n\t\t\"$<$<CONFIG:Debug>:${MSVC_DEBUG_LINK_OPTIONS}>\"\n\t\t\"$<$<CONFIG:RelWithDebInfo>:${MSVC_RELEASE_LINK_OPTIONS}>\"\n\t\t\"$<$<CONFIG:Release>:${MSVC_RELEASE_LINK_OPTIONS}>\"\n\t\t\"$<$<CONFIG:MinSizeRel>:${MSVC_RELEASE_LINK_OPTIONS}>\"\n\t)\n\t\n\tfind_library(secp256k1_LIBRARY secp256k1 HINTS ${secp256k1_LIBRARIES})\nelse()\n\tmessage(STATUS \"CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}\")\n\n\tfind_package(OpenMP REQUIRED)\n\tfind_library(JEMALLOC_LIB NAMES jemalloc)\n\t\n\tadd_compile_options(-Wall -Wno-unused-function -Wno-parentheses -Wno-unused-local-typedefs -Wno-unknown-pragmas)\n\t\n\tif(WITH_COVERAGE)\n\t\tmessage(STATUS \"Enabling -O0 -coverage\")\n\t\tadd_compile_options(-O0 --coverage)\n\t\tadd_link_options(-lgcov --coverage)\n\tendif()\n\t\n\tset_source_files_properties(src/vm/Compiler.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-but-set-variable)\n\n\tfind_library(secp256k1_LIBRARY NAMES secp256k1 PATHS \"${CMAKE_CURRENT_SOURCE_DIR}/lib/secp256k1/.libs\" NO_DEFAULT_PATH)\n\t\n\tif(ENABLE_MEM_SANITIZE)\n\t\tmessage(STATUS \"Compiling with -fsanitize=address\")\n\t\tadd_compile_options(-fsanitize=address)\n\t\tset(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address\")\n\t\tset(DISABLE_OPENCL 1)\n\telseif(ENABLE_THREAD_SANITIZE)\n\t\tmessage(STATUS \"Compiling with -fsanitize=thread\")\n\t\tadd_compile_options(-fsanitize=thread)\n\t\tset(CMAKE_EXE_LINKER_FLAGS \"${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread\")\n\t\tset(DISABLE_OPENCL 1)\n\tendif()\nendif()\n\ninclude(cmake/build_version_json.cmake)\n\nadd_library(secp256k1 INTERFACE IMPORTED)\nset_target_properties(secp256k1 PROPERTIES INTERFACE_LINK_LIBRARIES ${secp256k1_LIBRARY})\n\nget_filename_component(secp256k1_IMPORT_PREFIX \"${secp256k1_LIBRARY}\" PATH)\nget_filename_component(secp256k1_IMPORT_PREFIX \"${secp256k1_IMPORT_PREFIX}\" PATH)\n\nset_target_properties(secp256k1 PROPERTIES\n\t\tINTERFACE_INCLUDE_DIRECTORIES \"${secp256k1_IMPORT_PREFIX}/include\"\n)\n\nfile(GLOB secp256k1_LIBRARY_FILES ${secp256k1_LIBRARY}*)\n\nset(LIBBECH32_BUILD_TESTS OFF CACHE BOOL \"LIBBECH32_BUILD_TESTS\")\nset(LIBBECH32_BUILD_EXAMPLES OFF CACHE BOOL \"LIBBECH32_BUILD_EXAMPLES\")\nset(DIRENT_BUILD_TESTS OFF CACHE STRING \"DIRENT_BUILD_TESTS\")\nset(VNX_BUILD_TOOLS ON CACHE STRING \"VNX_BUILD_TOOLS\")\nset(MMX_BUILD_TOOLS ON CACHE STRING \"MMX_BUILD_TOOLS\")\nset(MMX_BUILD_TESTS ON CACHE STRING \"MMX_BUILD_TESTS\")\nset(NODE_INSTALL_PATH \".\" CACHE STRING \"Where to install scripts\")\n\nadd_subdirectory(vnx-base)\nadd_subdirectory(vnx-addons)\nadd_subdirectory(lib/libbech32)\n\nfind_package(Threads REQUIRED)\nfind_library(MINIUPNPC_LIB NAMES miniupnpc)\n\nif(NOT DISABLE_OPENCL)\n\tfind_package(OpenCL)\nendif()\nif(NOT DISABLE_CUDA)\n\tinclude(cmake/use_cuda.cmake)\nendif()\nif(NOT DISABLE_QT)\n\tfind_package(Qt5 QUIET COMPONENTS Widgets WebEngine WebEngineWidgets)\nendif()\n\nfile(GLOB GENERATED_SOURCE_FILES\n\tgenerated/src/*.cpp\n\tgenerated/vm/src/*.cpp\n\tgenerated/contract/src/*.cpp\n\tgenerated/operation/src/*.cpp\n\tgenerated/solution/src/*.cpp\n)\n\nadd_library(mmx_iface SHARED\n\t${GENERATED_SOURCE_FILES}\n\tsrc/Block.cpp\n\tsrc/BlockHeader.cpp\n\tsrc/Transaction.cpp\n\tsrc/Operation.cpp\n\tsrc/Contract.cpp\n\tsrc/Solution.cpp\n\tsrc/ProofOfTime.cpp\n\tsrc/ProofOfSpace.cpp\n\tsrc/ProofOfSpaceOG.cpp\n\tsrc/ProofOfSpaceNFT.cpp\n\tsrc/ProofResponse.cpp\n\tsrc/secp256k1.cpp\n\tsrc/uint128.cpp\n\tsrc/fixed128.cpp\n\tsrc/hash_t.cpp\n\tsrc/hash_512_t.cpp\n\tsrc/addr_t.cpp\n\tsrc/pubkey_t.cpp\n\tsrc/signature_t.cpp\n\tsrc/exec_result_t.cpp\n\tsrc/exec_error_t.cpp\n\tsrc/vm/var_t.cpp\n\tsrc/vm/varptr_t.cpp\n\tsrc/contract/Data.cpp\n\tsrc/contract/WebData.cpp\n\tsrc/contract/PubKey.cpp\n\tsrc/contract/MultiSig.cpp\n\tsrc/contract/TokenBase.cpp\n\tsrc/contract/Binary.cpp\n\tsrc/contract/Executable.cpp\n\tsrc/contract/method_t.cpp\n\tsrc/solution/PubKey.cpp\n\tsrc/solution/MultiSig.cpp\n\tsrc/operation/Deposit.cpp\n\tsrc/operation/Execute.cpp\n\tsrc/sha256_avx2.cpp\n\tsrc/sha256_64_x8.cpp\n\tsrc/sha256_ni.cpp\n\tsrc/sha256_ni_rec.cpp\n\tsrc/sha256_arm.cpp\n\tsrc/sha256_arm_rec.cpp\n\tsrc/sha512.cpp\n\tsrc/hmac_sha512.cpp\n\tsrc/wordlist_en.cpp\n\tsrc/mnemonic.cpp\n\tsrc/offer_data_t.cpp\n\tsrc/account_info_t.cpp\n\tsrc/VDF_Point.cpp\n\tsrc/Partial.cpp\n\tsrc/ChainParams.cpp\n\tsrc/utils.cpp\n\tsrc/ValidatorVote.cpp\n)\n\nadd_library(mmx_vm STATIC\n\tsrc/vm/Engine.cpp\n\tsrc/vm/Compiler.cpp\n\tsrc/vm/StorageProxy.cpp\n\tsrc/vm/StorageRAM.cpp\n\tsrc/vm/StorageCache.cpp\n\tsrc/vm/StorageDB.cpp\n\tsrc/vm/instr_t.cpp\n\tsrc/vm_interface.cpp\n)\n\nadd_library(mmx_db STATIC\n\tsrc/DataBase.cpp\n\tsrc/table.cpp\n)\n\nadd_library(mmx_pos STATIC\n\tsrc/pos/mem_hash.cpp\n\tsrc/pos/verify.cpp\n\tsrc/pos/encoding.cpp\n\tsrc/pos/Prover.cpp\n)\n\nadd_library(mmx_pos_verify STATIC\n\tsrc/pos/verify_full.cpp\n)\n\nadd_library(mmx_modules STATIC\n\tsrc/TimeLord.cpp\n\tsrc/Node.cpp\n\tsrc/Node_api.cpp\n\tsrc/Node_update.cpp\n\tsrc/Node_verify.cpp\n\tsrc/Node_validate.cpp\n\tsrc/Node_control.cpp\n\tsrc/Node_tests.cpp\n\tsrc/Wallet.cpp\n\tsrc/Farmer.cpp\n\tsrc/Harvester.cpp\n\tsrc/Router.cpp\n\tsrc/WebAPI.cpp\n\tsrc/OCL_VDF.cpp\n\tsrc/upnp_mapper.cpp\n\tsrc/http_request.cpp\n\tsrc/ProofServer.cpp\n)\n\nadd_library(mmx_qtgui STATIC\n\tsrc/Qt_GUI.cpp\n)\n\nadd_library(uint256_t STATIC\n\tuint256_t/uint128_t/uint128_t.cpp\n\tuint256_t/uint256_t.cpp\n)\n\ntarget_include_directories(mmx_vm\n\tPUBLIC lib/lexy/include\n)\n\ntarget_include_directories(mmx_pos\n\tPUBLIC include\n)\n\ntarget_include_directories(mmx_iface\n\tPUBLIC\n\t\tinclude\n\t\tgenerated/include\n\t\tgenerated/vm/include\n\t\tgenerated/contract/include\n\t\tgenerated/operation/include\n\t\tgenerated/solution/include\n)\n\ntarget_include_directories(mmx_qtgui\n\tPUBLIC include\n)\n\ntarget_include_directories(uint256_t\n\tPUBLIC uint256_t uint256_t/uint128_t\n)\n\ntarget_compile_definitions(uint256_t PUBLIC _UINT256_T_STATIC _UINT128_T_STATIC)\n\ntarget_link_libraries(mmx_iface vnx_base vnx_addons uint256_t bech32 secp256k1)\ntarget_link_libraries(mmx_db mmx_iface)\ntarget_link_libraries(mmx_pos mmx_pos_verify mmx_iface)\ntarget_link_libraries(mmx_pos_verify mmx_iface)\ntarget_link_libraries(mmx_vm mmx_db mmx_iface)\ntarget_link_libraries(mmx_modules mmx_pos mmx_vm mmx_db mmx_iface)\ntarget_link_libraries(mmx_qtgui vnx_base)\n\nif(MSVC)\n\tset_target_properties(vnx_base_static PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)\n\n\tGENERATE_EXPORT_HEADER(mmx_iface)\n\t\n\tset_target_properties(mmx_iface PROPERTIES ENABLE_EXPORTS 1)\n\tset_target_properties(mmx_iface PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS 1)\n\n\t# Workaround for:\n\t#\tLNK1189: library limit of 65535 objects exceeded\n\tset(MSVC_MMX_IFACE_DEBUG_OPTIONS /Ob1)\n\ttarget_compile_options(mmx_iface PRIVATE\n\t\t\"$<$<CONFIG:Debug>:${MSVC_MMX_IFACE_DEBUG_OPTIONS}>\"\n\t)\n\nelse()\n\ttarget_link_libraries(mmx_db OpenMP::OpenMP_CXX)\n\ttarget_link_libraries(mmx_modules OpenMP::OpenMP_CXX)\n\t\n\tif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL \"x86_64\")\n\t\tmessage(STATUS \"Enabling -mavx2 -msha\")\n\t\tset_source_files_properties(src/sha256_ni.cpp PROPERTIES COMPILE_FLAGS \"-msse4.2 -msha\")\n\t\tset_source_files_properties(src/sha256_ni_rec.cpp PROPERTIES COMPILE_FLAGS \"-msse4.2 -msha\")\n\t\tset_source_files_properties(src/sha256_avx2.cpp PROPERTIES COMPILE_FLAGS \"-mavx2\")\n\tendif()\n\n\tif(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL \"aarch64\")\n\t\tmessage(STATUS \"Enabling -march=armv8-a+crypto\")\n\t\tset_source_files_properties(src/sha256_arm.cpp PROPERTIES COMPILE_FLAGS \"-march=armv8-a+crypto\")\n\t\tset_source_files_properties(src/sha256_arm_rec.cpp PROPERTIES COMPILE_FLAGS \"-march=armv8-a+crypto\")\n\tendif()\nendif()\n\nif(OpenCL_FOUND)\n\tmessage(STATUS \"Found OpenCL\")\n\tadd_subdirectory(basic-opencl)\n\ttarget_compile_definitions(automy_basic_opencl\n\t\tPUBLIC CL_TARGET_OPENCL_VERSION=120\n\t)\n\ttarget_link_libraries(mmx_modules automy_basic_opencl)\n\ttarget_compile_definitions(mmx_modules PUBLIC WITH_OPENCL)\nendif()\n\nif(CUDA_FOUND)\n\tmessage(STATUS \"Found CUDA\")\n\tadd_compile_definitions(WITH_CUDA)\n\tcuda_add_library(mmx_pos_cuda STATIC src/pos/cuda_recompute.cu)\n\ttarget_include_directories(mmx_pos_cuda PUBLIC include)\n\ttarget_link_libraries(mmx_pos mmx_pos_cuda)\n\ttarget_link_libraries(mmx_pos_cuda mmx_pos_verify mmx_iface)\n\t\n\tif(MSVC)\n\t    # Copy CUDA DLLs to the output folder\n\t    add_custom_command(TARGET mmx_modules\n\t        POST_BUILD\n\t        COMMAND ${CMAKE_COMMAND} -E copy_if_different\n\t        \"${CUDA_TOOLKIT_ROOT_DIR}/bin/cudart64_12.dll\"\n\t        $<TARGET_FILE_DIR:mmx_modules>\n\t    )\n\tendif()\nendif()\n\nif(JEMALLOC_LIB)\n\tmessage(STATUS \"Found jemalloc\")\n\ttarget_link_libraries(mmx_modules ${JEMALLOC_LIB})\n\ttarget_compile_definitions(mmx_modules PUBLIC WITH_JEMALLOC)\nendif()\n\nif(MINIUPNPC_LIB)\n\tmessage(STATUS \"Found miniupnpc\")\n\ttarget_link_libraries(mmx_modules ${MINIUPNPC_LIB})\n\ttarget_compile_definitions(mmx_modules PRIVATE WITH_MINIUPNPC)\nendif()\n\nif(Qt5_FOUND)\n\tmessage(STATUS \"Found Qt5\")\n\tadd_compile_definitions(WITH_QT)\n\ttarget_link_libraries(mmx_qtgui Qt5::Widgets Qt5::WebEngine Qt5::WebEngineWidgets)\nendif()\n\nadd_executable(mmx src/mmx.cpp)\nadd_executable(mmx_node src/mmx_node.cpp)\nadd_executable(mmx_farmer src/mmx_farmer.cpp)\nadd_executable(mmx_wallet src/mmx_wallet.cpp)\nadd_executable(mmx_timelord src/mmx_timelord.cpp)\nadd_executable(mmx_harvester src/mmx_harvester.cpp)\n\ntarget_link_libraries(mmx mmx_iface mmx_vm)\ntarget_link_libraries(mmx_node mmx_modules mmx_qtgui)\ntarget_link_libraries(mmx_farmer mmx_modules)\ntarget_link_libraries(mmx_wallet mmx_modules mmx_qtgui)\ntarget_link_libraries(mmx_timelord mmx_modules)\ntarget_link_libraries(mmx_harvester mmx_modules)\n\ninstall(TARGETS mmx_iface DESTINATION lib)\n\ninstall(TARGETS mmx DESTINATION bin)\ninstall(TARGETS mmx_node DESTINATION bin)\ninstall(TARGETS mmx_farmer DESTINATION bin)\ninstall(TARGETS mmx_wallet DESTINATION bin)\ninstall(TARGETS mmx_timelord DESTINATION bin)\ninstall(TARGETS mmx_harvester DESTINATION bin)\n\ninstall(DIRECTORY\n\tconfig data kernel scripts\n\tDESTINATION ${NODE_INSTALL_PATH}\n\tPATTERN \"config/local\" EXCLUDE\n)\ninstall(DIRECTORY\n\twww/web-gui\n\tDESTINATION ${NODE_INSTALL_PATH}/www\n\tPATTERN \"node_modules\" EXCLUDE\n)\ninstall(FILES\n\tactivate.sh run_node.sh run_farmer.sh run_wallet.sh run_wallet_gui.sh run_timelord.sh run_harvester.sh\n\tstart_node.sh start_harvester.sh start_wallet.sh stop_node.sh stop_harvester.sh stop_wallet.sh\n\tPERMISSIONS OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ\n\tDESTINATION ${NODE_INSTALL_PATH}\n)\ninstall(FILES\n\tcmake/debian/mmx_node.desktop cmake/debian/mmx_wallet.desktop\n\tPERMISSIONS OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ\n\tDESTINATION share/applications\n)\n\nif(MMX_BUILD_TOOLS)\n\tadd_subdirectory(tools)\nendif()\nif(MMX_BUILD_TESTS)\n\tadd_subdirectory(test)\nendif()\n\nif(MSVC)\n\tinclude(cmake/win_pack.cmake)\nendif()\n"
  },
  {
    "path": "CMakePresets.json",
    "content": "{\r\n    \"version\": 4,\r\n    \"cmakeMinimumRequired\": {\r\n        \"major\": 3,\r\n        \"minor\": 11,\r\n        \"patch\": 0\r\n    },\r\n    \"configurePresets\": [\r\n\r\n        {\r\n            \"name\": \"windows-base\",\r\n            \"hidden\": true,\r\n            \"description\": \"Sets Visual Studio generator, build directory\",\r\n            \"generator\": \"Visual Studio 17 2022\",\r\n            \"binaryDir\": \"${sourceDir}/build/${presetName}\",\r\n            \"cacheVariables\": {\r\n                \"CMAKE_TOOLCHAIN_FILE\": {\r\n                    \"value\": \"$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake\",\r\n                    \"type\": \"FILEPATH\"\r\n                },\r\n                \"VCPKG_OVERLAY_TRIPLETS\": \"${sourceDir}/cmake/custom-triplets\",\r\n                \"VCPKG_TARGET_TRIPLET\": \"x64-windows-mmx\",\r\n\r\n                \"CMAKE_LIBRARY_OUTPUT_DIRECTORY\": \"${sourceDir}/build/${presetName}/!bin\",\r\n                \"CMAKE_RUNTIME_OUTPUT_DIRECTORY\": \"${sourceDir}/build/${presetName}/!bin\",\r\n\r\n                \"MMX_WIN_PACK\": \"$env{MMX_WIN_PACK}\"\r\n            }\r\n        },\r\n\r\n        {\r\n            \"name\": \"windows-default\",\r\n            \"displayName\": \"Windows x64\",\r\n            \"inherits\": \"windows-base\",\r\n            \"cacheVariables\": {\r\n                \"MMX_VERSION\": \"$env{MMX_VERSION}\"\r\n            },\r\n            \"warnings\": {\r\n                \"dev\": false\r\n            }\r\n        }\r\n\r\n    ],\r\n\r\n    \"buildPresets\": [\r\n        {\r\n            \"name\": \"windows-default\",\r\n            \"configurePreset\": \"windows-default\",\r\n            \"configuration\": \"Release\"\r\n        }\r\n    ]\r\n\r\n}\r\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM nvidia/cuda:11.8.0-devel-ubuntu22.04 AS builder\nARG DEBIAN_FRONTEND=noninteractive\nRUN apt-get update && apt-get -y upgrade \\\n\t\t&& apt-get install -y \\\n\t\t\tapt-utils \\\n\t\t\tgit \\\n\t\t\tcmake \\\n\t\t\tautomake \\\n\t\t\tlibtool \\\n\t\t\tbuild-essential \\\n\t\t\tlibminiupnpc-dev \\\n\t\t\tlibjemalloc-dev \\\n\t\t\tzlib1g-dev \\\n\t\t\tlibzstd-dev \\\n\t\t\tocl-icd-opencl-dev \\\n\t\t\tccache \\\n\t\t\t&& rm -rf /var/lib/apt/lists/*\n\nWORKDIR /app\nCOPY . .\nRUN git submodule update --init --recursive\nRUN --mount=type=cache,target=/root/.cache/ccache sh make_release.sh \"-DCMAKE_CXX_COMPILER_LAUNCHER=ccache\"\n\nFROM ubuntu:22.04 AS base\nARG DEBIAN_FRONTEND=noninteractive\nRUN apt-get update && apt-get -y upgrade \\\n\t\t&& apt-get install -y \\\n\t\t\tapt-utils \\\n\t\t\tcurl \\\n\t\t\tlibminiupnpc17 \\\n\t\t\tlibjemalloc2 \\\n\t\t\tzlib1g \\\n\t\t\tlibzstd1 \\\n\t\t\tlibgomp1 \\\n\t\t\tocl-icd-libopencl1 \\\n\t\t\ttzdata \\\n\t\t\t&& rm -rf /var/lib/apt/lists/*\n\nWORKDIR /app\nCOPY --from=builder /app/build/dist ./\nCOPY [\"docker-entrypoint.sh\", \"./\"]\n\nENV MMX_HOME=\"/data/\"\nVOLUME /data\n\n# node p2p port\nEXPOSE 11337/tcp\n# http api port\nEXPOSE 11380/tcp\n\nENTRYPOINT [\"./docker-entrypoint.sh\"]\nCMD [\"./run_node.sh\"]\n\nFROM base AS amd\nARG AMD_DRIVER=amdgpu-install_5.4.50400-1_all.deb\nARG AMD_DRIVER_URL=https://repo.radeon.com/amdgpu-install/5.4/ubuntu/jammy\nRUN mkdir -p /tmp/opencl-driver-amd \\\n    && cd /tmp/opencl-driver-amd \\\n    && curl --referer $AMD_DRIVER_URL -O $AMD_DRIVER_URL/$AMD_DRIVER \\\n\t&& dpkg -i $AMD_DRIVER \\\n\t&& rm -rf /tmp/opencl-driver-amd\nRUN apt-get update && apt-get -y upgrade \\\n\t\t&& apt-get install -y \\\n\t\t\trocm-opencl \\\n\t\t\t&& rm -rf /var/lib/apt/lists/*\n\nFROM base AS nvidia\nRUN mkdir -p /etc/OpenCL/vendors \\\n    && echo \"libnvidia-opencl.so.1\" > /etc/OpenCL/vendors/nvidia.icd\nENV NVIDIA_VISIBLE_DEVICES all\nENV NVIDIA_DRIVER_CAPABILITIES compute,utility\n\nFROM base AS intel\nRUN apt-get update && apt-get install --no-install-recommends -y intel-opencl-icd \\\n\t&& rm -rf /var/lib/apt/lists/*\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# mmx-node\n\n_“ MMX &ndash; fast, low cost, feature rich, decentralized &ndash; with tokenomics of an actual currency ”_\n\nA blockchain written from scratch, doing most things differently.\n\nWebsite: https://mmx.network \\\nWhitepaper: [MMX_Whitepaper_290125.pdf](https://docs.mmx.network/MMX_Whitepaper_290125.pdf)\n\nDesign\n- Variable token supply governed by consensus (1 block = 1 vote)\n- High throughput L1 with consistent block interval (500 TPS, 10 sec)\n- Novel Smart Contract VM for ease of development and high performance\n- Energy efficient Proof of Space and Time\n- Block reward is adjusted to stabilize price, a key property of any currency\n- Minimum transaction fee to allow large block size without spam\n- Limited external library usage to keep codebase clean and secure\n- No pre-mine, no ICO, no investors\n- Account based model\n\nElements\n- High performance C++ code (can handle over 1000 TPS easily)\n  - Transactions are executed in parallel when possible\n- Custom high-level VM for Smart Contracts\n  - Native support for variants, arrays, maps, and objects\n  - Unified memory with automatic persistence and state updates\n  - A restricted subset of JavaScript is compiled into bytecode\n  - Average of two machine instructions per line of code\n- Native token support (no \"approvals\" needed, NFT = 1 mojo)\n- Smart contract offer based trading (fixed price, OTC)\n- Liquidity pool swap based trading (AMM, multi-fee tiers, similar to Uniswap v3)\n- ECDSA signatures for seamless integration (same as Bitcoin)\n- Custom blockchain database engine (much faster than RocksDB or LevelDB overall)\n- Adaptive SHA256 VDF to govern block interval\n- Feature rich Node with built-in Block Explorer, Wallet, Market, Swap, RPC, etc\n\nRoadmap\n\n| Release | Date | Description |\n| :--- | :--- | :--- |\n| testnet7 | Sep 2022 | Finished. <sup>[1]</sup> |\n| testnet8 | Oct 2022 | Finished. Incentivized testnet, height 25k-425k. <sup>[2]</sup> |\n| testnet9 | Dec 2022 | Finished. Incentivized testnet, height 25k-1220k. <sup>[2]</sup> |\n| testnet10 | Apr 2023 | Finished. Incentivized testnet, height 40k-3200k. <sup>[2]</sup> |\n| testnet11 | May 2024 | Finished. New plot format, compression resistant. |\n| testnet12 | June 2024 | Finished. Incentivized testnet, height 25k-1720k. <sup>[2]</sup> |\n| mainnet-rc | Jan 2025 | Finished. Incentivized testnet, height 10k-110k. <sup>[2]</sup> |\n| mainnet | 17th Jan 2025 | Live |\n\n_<sup>[1]</sup> Coins farmed on testnets are not worth anything, now or later._\\\n_<sup>[2]</sup> A fixed reward of 0.5 MMX per block win on incentivized testnets will be given on mainnet genesis._\n\nSee `#mmx-news` and `#mmx-general` on Discord: https://discord.gg/BswFhNkMzY\n\n## Installation / Setup / Usage\n\nSee documentation: https://docs.mmx.network/\n\n- [Installation](https://docs.mmx.network/guides/installation/)\n- [Getting Started](https://docs.mmx.network/guides/getting-started/)\n- [CLI Commands](https://docs.mmx.network/software/cli-commands/)\n- [Plotting Guide](https://docs.mmx.network/guides/mmx-plotter/)\n\n## WebGUI\n\nTo access WebGUI, go to: http://localhost:11380/gui/\n\nIt's only available on localhost by default. \\\nThe login password is auto-generated at first launch, located in `mmx-node/PASSWD` file (`$MMX_HOME/PASSWD`).\n\n## Release Notes\n\n### Mainnet\n\n- Transactions are no longer limited to odd or even blocks\n- Validators are now previous block winners, starting at 24 blocks prior\n- Increased validator count to 33\n- Committing blocks is paused when proofs found is less than 80% expected\n- VDF checks during sync are obsolete\n- Added maximum proof limit of 20 per block\n- Faster difficulty adjustment\n- Changed VDF reward payout interval to 20 blocks (with each being 0.2 MMX)\n- Changed VDF block infusion delay to 1\n- Added remote call recursion limit of 3\n- Added maximum contract dependencies of 5\n\n### Mainnet-RC\n\n- New VDF scheme:\n  - Single VDF stream with infused Timelord reward\n  - No longer possible to steal or disable Timelord reward\n  - Proof challenges are now deterministic, apart from random infusions every 256 blocks on average\n  - If a proof's hash passes a filter, it will change future challenges and update difficutly\n  - Timelord rewards are now paid out every 50 blocks in bulk to fastest TL\n  - There are no more dummy blocks (blocks without proof)\n- VDF segment count is now dynamic, depending on TL speed:\n  - This means VDF verify time wont increase unless the GPU is at it's compute limit\n  - Previously VDF verify time would increase even if the GPU is not maxed out, due to fixed parallel work\n  - CPU verify is unchanged\n- All proofs found are now included in blocks\n  - Yields accurate netspace estimation\n  - Supports extra security (see below)\n- Recent blocks are further secured via a new voting scheme:\n  - Up to 31 farmers who found a lesser proof (didn't make a block) recently can act as a validator\n  - These validators vote on the first block received per height\n  - Only blocks made with the best known proof are voted for\n  - This prevents reverting recent blocks via double signing in most cases\n  - Previously it was always possible to replace the current peak via double signing, this is now impossible\n  - Previously if a farmer got lucky to find multiple blocks in a row:\n    - He could also replace them at will until another farmer found the next block\n    - This is now also impossible, unless the farmer has close to 50% or more netspace\n- 50% TX fee burn (to avoid farmer spam attack + allow supply contraction)\n  - Project fee is taken from burned amount\n- Virtual Plots have been removed due to an attack vector\n  - Together with the un-bounded block reward voting it was possible to generate a heavier chain with minimal real netspace\n- Improved block reward voting: Majority vote out of 8640 blocks wins, 1% change up/down per day, >50% participation required.\n- Offer contract now supports price update (at most every 1080 blocks)\n- Pooling support + Reference Pool implementation\n- Improved difficulty adjustment algorithm (targets 4 proofs per block)\n- VM improvements to reduce transaction costs\n- Send amount can now be up to 128-bit (was limited to 64-bit before)\n- Mint amount can now be up to 80-bit (was limited to 64-bit before)\n- Added block timestamps\n- Smart Contract unit test framework\n\n### Testnet12\n\n- Fixed Virtual Plots, they now win blocks at the expected rate. On TN11 it was ~20 times less.\n- Fixed block reward formula, average tx fee is subtracted from minimum reward again.\n\n### Testnet11\n\n- New plot format:\n  - k29 to k32 max\n  - 9 tables\n  - very low compression only\n  - CPU farming only\n  - SSD and HDD plot types\n  - Old format no longer valid\n- Transaction output memo support\n- Block reward voting support\n- Swap algorithm improved\n- Swap fee levels changed to: 0.05%, 0.25%, 1% and 5%\n- Using zstd compression for network traffic\n- NFT plot support (testing only)\n\n"
  },
  {
    "path": "activate.sh",
    "content": "#!/bin/bash\n\nset -e\n\nexport PATH=$PATH:$PWD/bin:$PWD/build:$PWD/build/tools:$PWD/build/vnx-base/tools:/usr/share/mmx-node/bin\nexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/lib:$PWD/lib64:$PWD/build:$PWD/build/vnx-base:$PWD/build/vnx-addons:$PWD/build/basic-opencl\n\nif [[ -z \"${MMX_HOME}\" ]]; then\n\texport MMX_HOME=\"$PWD/\"\nelse\n\tmkdir -p ${MMX_HOME}\n\techo MMX_HOME=${MMX_HOME}\nfi\n\nmkdir -p ${MMX_HOME}config/local\nif cp --update=none /dev/null /dev/null 2> /dev/null; then\n\tcp -rv --update=none config/local_init/. ${MMX_HOME}config/local\nelse\n\tcp -rnv config/local_init/. ${MMX_HOME}config/local\nfi\n\nPASSWD_PATH=\"${MMX_HOME}config/local/passwd\"\nif [ ! -f \"${PASSWD_PATH}\" ] || [[ $(cat \"${PASSWD_PATH}\" | wc -c) -lt 64 ]]; then\n\tgenerate_passwd > \"${PASSWD_PATH}\"\n\tvnxpasswd -c config/default/ \"${MMX_HOME}config/local/\" -u mmx-admin -p $(cat \"${PASSWD_PATH}\")\n\techo \"PASSWD=$(cat \"${PASSWD_PATH}\")\"\nfi\n\nchmod 600 \"${PASSWD_PATH}\"\ncp \"${PASSWD_PATH}\" \"${MMX_HOME}PASSWD\"\n\nif [ -f \"${MMX_HOME}NETWORK\" ]; then\n\tNETWORK=$(cat \"${MMX_HOME}NETWORK\")\nelse\n\tNETWORK=mainnet\n\techo ${NETWORK} > \"${MMX_HOME}NETWORK\"\nfi\n\nif [ -f \"${MMX_HOME}config/local/MMX_DATA\" ]; then\n\tMMX_DATA=$(cat \"${MMX_HOME}config/local/MMX_DATA\")\nfi\nif [[ -z \"${MMX_DATA}\" ]]; then\n\tMMX_DATA=${MMX_HOME}\nfi\n\necho NETWORK=${NETWORK}\n\nif [ \"${MMX_DATA}\" != \"${MMX_HOME}\" ]; then\n\techo MMX_DATA=${MMX_DATA}\nfi\n\nexport MMX_NETWORK=${MMX_DATA}${NETWORK}/\n\nset +e\n"
  },
  {
    "path": "clean_all.sh",
    "content": "#!/bin/bash\n\nrm -rf build\nrm -rf lib/.cache\n\n"
  },
  {
    "path": "cmake/build_version_json.cmake",
    "content": "\r\nfind_package(Git)\r\n\r\nexecute_process(\r\n  COMMAND ${GIT_EXECUTABLE} describe --tags --match \"v[0-9]*.[0-9]*.[0-9]*\"\r\n  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}\r\n  OUTPUT_VARIABLE GIT_BUILD_VERSION\r\n  OUTPUT_STRIP_TRAILING_WHITESPACE\r\n)\r\n\r\nexecute_process(\r\n  COMMAND ${GIT_EXECUTABLE} log -1 --format=%H\r\n  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}\r\n  OUTPUT_VARIABLE GIT_BUILD_COMMIT\r\n  OUTPUT_STRIP_TRAILING_WHITESPACE\r\n)\r\n\r\nstring(LENGTH \"${GIT_BUILD_VERSION}\" GIT_BUILD_VERSION_LEN)\r\nif(NOT GIT_BUILD_VERSION MATCHES \"^v[0-9]+\\\\.[0-9]+\\\\.[0-9]+$|^v[0-9]+\\\\.[0-9]+\\\\.[0-9]+\\\\-[0-9]+\\\\-g[0-9a-f]+$\" OR GIT_BUILD_VERSION_LEN GREATER 80)\r\n  string(TIMESTAMP GIT_BUILD_TIMESTAMP \"%Y%m%d\")\r\n  set(GIT_BUILD_VERSION \"v0.0.0.${GIT_BUILD_TIMESTAMP}\")\r\nendif()\r\n\r\nstring(LENGTH \"${GIT_BUILD_COMMIT}\" GIT_BUILD_COMMIT_LEN)\r\nif(NOT GIT_BUILD_COMMIT MATCHES \"^[0-9a-f]+$\" OR NOT GIT_BUILD_COMMIT_LEN EQUAL 40)\r\n  set(GIT_BUILD_COMMIT \"0000000000000000000000000000000000000000\")\r\nendif()\r\n\r\nmessage(STATUS \"GIT_BUILD_VERSION=${GIT_BUILD_VERSION}\")\r\nmessage(STATUS \"GIT_BUILD_COMMIT=${GIT_BUILD_COMMIT}\")\r\n\r\nfile(WRITE config/default/build.json \"{\\n\\t\\\"version\\\": \\\"${GIT_BUILD_VERSION}\\\",\\n\\t\\\"commit\\\": \\\"${GIT_BUILD_COMMIT}\\\"\\n}\\n\")\r\n"
  },
  {
    "path": "cmake/custom-triplets/x64-windows-mmx.cmake",
    "content": "set(VCPKG_TARGET_ARCHITECTURE x64)\r\nset(VCPKG_CRT_LINKAGE dynamic)\r\nset(VCPKG_LIBRARY_LINKAGE dynamic)\r\nset(VCPKG_BUILD_TYPE release)\r\n\r\nif(PORT MATCHES \"secp256k1\")\r\n    set(VCPKG_LIBRARY_LINKAGE static)\r\nendif()"
  },
  {
    "path": "cmake/debian/generic/control",
    "content": "Package: mmx-node\nSection: base\nPriority: optional\nDepends: curl, screen, zenity, libminiupnpc-dev, libjemalloc-dev, libzstd-dev, zlib1g-dev, ocl-icd-opencl-dev, qtwebengine5-dev\nMaintainer: Max Wittal <max.wittal@mwittal.de>\nDescription: MMX Node\nHomepage: https://mmx.network\n"
  },
  {
    "path": "cmake/debian/mmx_node.desktop",
    "content": "[Desktop Entry]\nType=Application\nName=MMX Node\nExec=sh -c \"MMX_HOME=~/.mmx/ /usr/share/mmx-node/run_node.sh --gui\"\nPath=/usr/share/mmx-node\nIcon=/usr/share/mmx-node/www/web-gui/public/assets/img/logo_circle_color_cy256.png\nTerminal=false\nCategories=Utility;Application;"
  },
  {
    "path": "cmake/debian/mmx_wallet.desktop",
    "content": "[Desktop Entry]\nType=Application\nName=MMX Wallet\nExec=sh -c \"MMX_HOME=~/.mmx/ /usr/share/mmx-node/run_wallet_gui.sh\"\nPath=/usr/share/mmx-node\nIcon=/usr/share/mmx-node/www/web-gui/public/assets/img/logo_circle_color_cy256.png\nTerminal=false\nCategories=Utility;Application;"
  },
  {
    "path": "cmake/debian/ubuntu-20.04/control",
    "content": "Package: mmx-node\nSection: base\nPriority: optional\nDepends: curl, screen, zenity, libminiupnpc17, libjemalloc2, libzstd1, zlib1g, ocl-icd-libopencl1, libgomp1, qtwebengine5-dev\nMaintainer: Max Wittal <max.wittal@mwittal.de>\nDescription: MMX Node\nHomepage: https://mmx.network\n"
  },
  {
    "path": "cmake/debian/ubuntu-22.04/control",
    "content": "Package: mmx-node\nSection: base\nPriority: optional\nDepends: curl, screen, zenity, libminiupnpc17, libjemalloc2, libzstd1, zlib1g, ocl-icd-libopencl1, libgomp1, qtwebengine5-dev\nMaintainer: Max Wittal <max.wittal@mwittal.de>\nDescription: MMX Node\nHomepage: https://mmx.network\n"
  },
  {
    "path": "cmake/debian/ubuntu-24.04/control",
    "content": "Package: mmx-node\nSection: base\nPriority: optional\nDepends: curl, screen, zenity, libminiupnpc17, libjemalloc2, libzstd1, zlib1g, ocl-icd-libopencl1, libgomp1, qtwebengine5-dev\nMaintainer: Max Wittal <max.wittal@mwittal.de>\nDescription: MMX Node\nHomepage: https://mmx.network\n"
  },
  {
    "path": "cmake/nsis/NSIS.template.in",
    "content": "﻿; CPack install script designed for a nmake build\n\n;--------------------------------\n; You must define these values\n\n  !define VERSION \"@CPACK_PACKAGE_VERSION@\"\n  !define PATCH  \"@CPACK_PACKAGE_VERSION_PATCH@\"\n  !define INST_DIR \"@CPACK_TEMPORARY_DIRECTORY@\"\n\n;--------------------------------\n;Variables\n\n  Var MUI_TEMP\n  Var STARTMENU_FOLDER\n  Var SV_ALLUSERS\n  Var START_MENU\n  Var DO_NOT_ADD_TO_PATH\n  Var ADD_TO_PATH_ALL_USERS\n  Var ADD_TO_PATH_CURRENT_USER\n  Var INSTALL_DESKTOP\n  Var IS_DEFAULT_INSTALLDIR\n\n  Var mmxDataDir\n  Var mmxDataDir_default\n;--------------------------------\n;Include Modern UI\n\n  !include \"MUI.nsh\"\n\n  ;Default installation folder\n  InstallDir \"@CPACK_NSIS_INSTALL_ROOT@\\@CPACK_PACKAGE_INSTALL_DIRECTORY@\"\n\n;--------------------------------\n;General\n\n  ;Name and file\n  Name \"@CPACK_NSIS_PACKAGE_NAME@\"\n  OutFile \"@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@\"\n\n  ;Set compression\n  SetCompressor @CPACK_NSIS_COMPRESSOR@\n\n  ;Require administrator access\n  RequestExecutionLevel admin\n\n@CPACK_NSIS_DEFINES@\n@CPACK_NSIS_MANIFEST_DPI_AWARE_CODE@\n@CPACK_NSIS_BRANDING_TEXT_CODE@\n\n  !include Sections.nsh\n\n;--- Component support macros: ---\n; The code for the add/remove functionality is from:\n;   https://nsis.sourceforge.io/Add/Remove_Functionality\n; It has been modified slightly and extended to provide\n; inter-component dependencies.\nVar AR_SecFlags\nVar AR_RegFlags\n@CPACK_NSIS_SECTION_SELECTED_VARS@\n\n; Loads the \"selected\" flag for the section named SecName into the\n; variable VarName.\n!macro LoadSectionSelectedIntoVar SecName VarName\n SectionGetFlags ${${SecName}} $${VarName}\n IntOp $${VarName} $${VarName} & ${SF_SELECTED}  ;Turn off all other bits\n!macroend\n\n; Loads the value of a variable... can we get around this?\n!macro LoadVar VarName\n  IntOp $R0 0 + $${VarName}\n!macroend\n\n; Sets the value of a variable\n!macro StoreVar VarName IntValue\n  IntOp $${VarName} 0 + ${IntValue}\n!macroend\n\n!macro InitSection SecName\n  ;  This macro reads component installed flag from the registry and\n  ;changes checked state of the section on the components page.\n  ;Input: section index constant name specified in Section command.\n\n  ClearErrors\n  ;Reading component status from registry\n  ReadRegDWORD $AR_RegFlags HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\\Components\\${SecName}\" \"Installed\"\n  IfErrors \"default_${SecName}\"\n    ;Status will stay default if registry value not found\n    ;(component was never installed)\n  IntOp $AR_RegFlags $AR_RegFlags & ${SF_SELECTED} ;Turn off all other bits\n  SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading default section flags\n  IntOp $AR_SecFlags $AR_SecFlags & 0xFFFE  ;Turn lowest (enabled) bit off\n  IntOp $AR_SecFlags $AR_RegFlags | $AR_SecFlags      ;Change lowest bit\n\n  ; Note whether this component was installed before\n  !insertmacro StoreVar ${SecName}_was_installed $AR_RegFlags\n  IntOp $R0 $AR_RegFlags & $AR_RegFlags\n\n  ;Writing modified flags\n  SectionSetFlags ${${SecName}} $AR_SecFlags\n\n \"default_${SecName}:\"\n !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected\n!macroend\n\n!macro FinishSection SecName\n  ;  This macro reads section flag set by user and removes the section\n  ;if it is not selected.\n  ;Then it writes component installed flag to registry\n  ;Input: section index constant name specified in Section command.\n\n  SectionGetFlags ${${SecName}} $AR_SecFlags  ;Reading section flags\n  ;Checking lowest bit:\n  IntOp $AR_SecFlags $AR_SecFlags & ${SF_SELECTED}\n  IntCmp $AR_SecFlags 1 \"leave_${SecName}\"\n    ;Section is not selected:\n    ;Calling Section uninstall macro and writing zero installed flag\n    !insertmacro \"Remove_${${SecName}}\"\n    WriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\\Components\\${SecName}\" \\\n  \"Installed\" 0\n    Goto \"exit_${SecName}\"\n\n \"leave_${SecName}:\"\n    ;Section is selected:\n    WriteRegDWORD HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\\Components\\${SecName}\" \\\n  \"Installed\" 1\n\n \"exit_${SecName}:\"\n!macroend\n\n!macro RemoveSection_CPack SecName\n  ;  This macro is used to call section's Remove_... macro\n  ;from the uninstaller.\n  ;Input: section index constant name specified in Section command.\n\n  !insertmacro \"Remove_${${SecName}}\"\n!macroend\n\n; Determine whether the selection of SecName changed\n!macro MaybeSelectionChanged SecName\n  !insertmacro LoadVar ${SecName}_selected\n  SectionGetFlags ${${SecName}} $R1\n  IntOp $R1 $R1 & ${SF_SELECTED} ;Turn off all other bits\n\n  ; See if the status has changed:\n  IntCmp $R0 $R1 \"${SecName}_unchanged\"\n  !insertmacro LoadSectionSelectedIntoVar ${SecName} ${SecName}_selected\n\n  IntCmp $R1 ${SF_SELECTED} \"${SecName}_was_selected\"\n  !insertmacro \"Deselect_required_by_${SecName}\"\n  goto \"${SecName}_unchanged\"\n\n  \"${SecName}_was_selected:\"\n  !insertmacro \"Select_${SecName}_depends\"\n\n  \"${SecName}_unchanged:\"\n!macroend\n;--- End of Add/Remove macros ---\n\n;--------------------------------\n;Interface Settings\n\n  !define MUI_HEADERIMAGE\n  !define MUI_ABORTWARNING\n\n;----------------------------------------\n; based upon a script of \"Written by KiCHiK 2003-01-18 05:57:02\"\n;----------------------------------------\n!verbose 3\n!include \"WinMessages.NSH\"\n!verbose 4\n;====================================================\n; get_NT_environment\n;     Returns: the selected environment\n;     Output : head of the stack\n;====================================================\n!macro select_NT_profile UN\nFunction ${UN}select_NT_profile\n   StrCmp $ADD_TO_PATH_ALL_USERS \"1\" 0 environment_single\n      DetailPrint \"Selected environment for all users\"\n      Push \"all\"\n      Return\n   environment_single:\n      DetailPrint \"Selected environment for current user only.\"\n      Push \"current\"\n      Return\nFunctionEnd\n!macroend\n!insertmacro select_NT_profile \"\"\n!insertmacro select_NT_profile \"un.\"\n;----------------------------------------------------\n!define NT_current_env 'HKCU \"Environment\"'\n!define NT_all_env     'HKLM \"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\"'\n\n!ifndef WriteEnvStr_RegKey\n  !ifdef ALL_USERS\n    !define WriteEnvStr_RegKey \\\n       'HKLM \"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment\"'\n  !else\n    !define WriteEnvStr_RegKey 'HKCU \"Environment\"'\n  !endif\n!endif\n\n; AddToPath - Adds the given dir to the search path.\n;        Input - head of the stack\n;        Note - Win9x systems requires reboot\n\nFunction AddToPath\n  Exch $0\n  Push $1\n  Push $2\n  Push $3\n\n  # don't add if the path doesn't exist\n  IfFileExists \"$0\\*.*\" \"\" AddToPath_done\n\n  ReadEnvStr $1 PATH\n  ; if the path is too long for a NSIS variable NSIS will return a 0\n  ; length string.  If we find that, then warn and skip any path\n  ; modification as it will trash the existing path.\n  StrLen $2 $1\n  IntCmp $2 0 CheckPathLength_ShowPathWarning CheckPathLength_Done CheckPathLength_Done\n    CheckPathLength_ShowPathWarning:\n    Messagebox MB_OK|MB_ICONEXCLAMATION \"Warning! PATH too long installer unable to modify PATH!\"\n    Goto AddToPath_done\n  CheckPathLength_Done:\n  Push \"$1;\"\n  Push \"$0;\"\n  Call StrStr\n  Pop $2\n  StrCmp $2 \"\" \"\" AddToPath_done\n  Push \"$1;\"\n  Push \"$0\\;\"\n  Call StrStr\n  Pop $2\n  StrCmp $2 \"\" \"\" AddToPath_done\n  GetFullPathName /SHORT $3 $0\n  Push \"$1;\"\n  Push \"$3;\"\n  Call StrStr\n  Pop $2\n  StrCmp $2 \"\" \"\" AddToPath_done\n  Push \"$1;\"\n  Push \"$3\\;\"\n  Call StrStr\n  Pop $2\n  StrCmp $2 \"\" \"\" AddToPath_done\n\n  Call IsNT\n  Pop $1\n  StrCmp $1 1 AddToPath_NT\n    ; Not on NT\n    StrCpy $1 $WINDIR 2\n    FileOpen $1 \"$1\\autoexec.bat\" a\n    FileSeek $1 -1 END\n    FileReadByte $1 $2\n    IntCmp $2 26 0 +2 +2 # DOS EOF\n      FileSeek $1 -1 END # write over EOF\n    FileWrite $1 \"$\\r$\\nSET PATH=%PATH%;$3$\\r$\\n\"\n    FileClose $1\n    SetRebootFlag true\n    Goto AddToPath_done\n\n  AddToPath_NT:\n    StrCmp $ADD_TO_PATH_ALL_USERS \"1\" ReadAllKey\n      ReadRegStr $1 ${NT_current_env} \"PATH\"\n      Goto DoTrim\n    ReadAllKey:\n      ReadRegStr $1 ${NT_all_env} \"PATH\"\n    DoTrim:\n    StrCmp $1 \"\" AddToPath_NTdoIt\n      Push $1\n      Call Trim\n      Pop $1\n      StrCpy $0 \"$1;$0\"\n    AddToPath_NTdoIt:\n      StrCmp $ADD_TO_PATH_ALL_USERS \"1\" WriteAllKey\n        WriteRegExpandStr ${NT_current_env} \"PATH\" $0\n        Goto DoSend\n      WriteAllKey:\n        WriteRegExpandStr ${NT_all_env} \"PATH\" $0\n      DoSend:\n      SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 \"STR:Environment\" /TIMEOUT=5000\n\n  AddToPath_done:\n    Pop $3\n    Pop $2\n    Pop $1\n    Pop $0\nFunctionEnd\n\n\n; RemoveFromPath - Remove a given dir from the path\n;     Input: head of the stack\n\nFunction un.RemoveFromPath\n  Exch $0\n  Push $1\n  Push $2\n  Push $3\n  Push $4\n  Push $5\n  Push $6\n\n  IntFmt $6 \"%c\" 26 # DOS EOF\n\n  Call un.IsNT\n  Pop $1\n  StrCmp $1 1 unRemoveFromPath_NT\n    ; Not on NT\n    StrCpy $1 $WINDIR 2\n    FileOpen $1 \"$1\\autoexec.bat\" r\n    GetTempFileName $4\n    FileOpen $2 $4 w\n    GetFullPathName /SHORT $0 $0\n    StrCpy $0 \"SET PATH=%PATH%;$0\"\n    Goto unRemoveFromPath_dosLoop\n\n    unRemoveFromPath_dosLoop:\n      FileRead $1 $3\n      StrCpy $5 $3 1 -1 # read last char\n      StrCmp $5 $6 0 +2 # if DOS EOF\n        StrCpy $3 $3 -1 # remove DOS EOF so we can compare\n      StrCmp $3 \"$0$\\r$\\n\" unRemoveFromPath_dosLoopRemoveLine\n      StrCmp $3 \"$0$\\n\" unRemoveFromPath_dosLoopRemoveLine\n      StrCmp $3 \"$0\" unRemoveFromPath_dosLoopRemoveLine\n      StrCmp $3 \"\" unRemoveFromPath_dosLoopEnd\n      FileWrite $2 $3\n      Goto unRemoveFromPath_dosLoop\n      unRemoveFromPath_dosLoopRemoveLine:\n        SetRebootFlag true\n        Goto unRemoveFromPath_dosLoop\n\n    unRemoveFromPath_dosLoopEnd:\n      FileClose $2\n      FileClose $1\n      StrCpy $1 $WINDIR 2\n      Delete \"$1\\autoexec.bat\"\n      CopyFiles /SILENT $4 \"$1\\autoexec.bat\"\n      Delete $4\n      Goto unRemoveFromPath_done\n\n  unRemoveFromPath_NT:\n    StrCmp $ADD_TO_PATH_ALL_USERS \"1\" unReadAllKey\n      ReadRegStr $1 ${NT_current_env} \"PATH\"\n      Goto unDoTrim\n    unReadAllKey:\n      ReadRegStr $1 ${NT_all_env} \"PATH\"\n    unDoTrim:\n    StrCpy $5 $1 1 -1 # copy last char\n    StrCmp $5 \";\" +2 # if last char != ;\n      StrCpy $1 \"$1;\" # append ;\n    Push $1\n    Push \"$0;\"\n    Call un.StrStr ; Find `$0;` in $1\n    Pop $2 ; pos of our dir\n    StrCmp $2 \"\" unRemoveFromPath_done\n      ; else, it is in path\n      # $0 - path to add\n      # $1 - path var\n      StrLen $3 \"$0;\"\n      StrLen $4 $2\n      StrCpy $5 $1 -$4 # $5 is now the part before the path to remove\n      StrCpy $6 $2 \"\" $3 # $6 is now the part after the path to remove\n      StrCpy $3 $5$6\n\n      StrCpy $5 $3 1 -1 # copy last char\n      StrCmp $5 \";\" 0 +2 # if last char == ;\n        StrCpy $3 $3 -1 # remove last char\n\n      StrCmp $ADD_TO_PATH_ALL_USERS \"1\" unWriteAllKey\n        WriteRegExpandStr ${NT_current_env} \"PATH\" $3\n        Goto unDoSend\n      unWriteAllKey:\n        WriteRegExpandStr ${NT_all_env} \"PATH\" $3\n      unDoSend:\n      SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 \"STR:Environment\" /TIMEOUT=5000\n\n  unRemoveFromPath_done:\n    Pop $6\n    Pop $5\n    Pop $4\n    Pop $3\n    Pop $2\n    Pop $1\n    Pop $0\nFunctionEnd\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n; Uninstall stuff\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n###########################################\n#            Utility Functions            #\n###########################################\n\n;====================================================\n; IsNT - Returns 1 if the current system is NT, 0\n;        otherwise.\n;     Output: head of the stack\n;====================================================\n; IsNT\n; no input\n; output, top of the stack = 1 if NT or 0 if not\n;\n; Usage:\n;   Call IsNT\n;   Pop $R0\n;  ($R0 at this point is 1 or 0)\n\n!macro IsNT un\nFunction ${un}IsNT\n  Push $0\n  ReadRegStr $0 HKLM \"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\" CurrentVersion\n  StrCmp $0 \"\" 0 IsNT_yes\n  ; we are not NT.\n  Pop $0\n  Push 0\n  Return\n\n  IsNT_yes:\n    ; NT!!!\n    Pop $0\n    Push 1\nFunctionEnd\n!macroend\n!insertmacro IsNT \"\"\n!insertmacro IsNT \"un.\"\n\n; StrStr\n; input, top of stack = string to search for\n;        top of stack-1 = string to search in\n; output, top of stack (replaces with the portion of the string remaining)\n; modifies no other variables.\n;\n; Usage:\n;   Push \"this is a long ass string\"\n;   Push \"ass\"\n;   Call StrStr\n;   Pop $R0\n;  ($R0 at this point is \"ass string\")\n\n!macro StrStr un\nFunction ${un}StrStr\nExch $R1 ; st=haystack,old$R1, $R1=needle\n  Exch    ; st=old$R1,haystack\n  Exch $R2 ; st=old$R1,old$R2, $R2=haystack\n  Push $R3\n  Push $R4\n  Push $R5\n  StrLen $R3 $R1\n  StrCpy $R4 0\n  ; $R1=needle\n  ; $R2=haystack\n  ; $R3=len(needle)\n  ; $R4=cnt\n  ; $R5=tmp\n  loop:\n    StrCpy $R5 $R2 $R3 $R4\n    StrCmp $R5 $R1 done\n    StrCmp $R5 \"\" done\n    IntOp $R4 $R4 + 1\n    Goto loop\ndone:\n  StrCpy $R1 $R2 \"\" $R4\n  Pop $R5\n  Pop $R4\n  Pop $R3\n  Pop $R2\n  Exch $R1\nFunctionEnd\n!macroend\n!insertmacro StrStr \"\"\n!insertmacro StrStr \"un.\"\n\nFunction Trim ; Added by Pelaca\n\tExch $R1\n\tPush $R2\nLoop:\n\tStrCpy $R2 \"$R1\" 1 -1\n\tStrCmp \"$R2\" \" \" RTrim\n\tStrCmp \"$R2\" \"$\\n\" RTrim\n\tStrCmp \"$R2\" \"$\\r\" RTrim\n\tStrCmp \"$R2\" \";\" RTrim\n\tGoTo Done\nRTrim:\n\tStrCpy $R1 \"$R1\" -1\n\tGoto Loop\nDone:\n\tPop $R2\n\tExch $R1\nFunctionEnd\n\nFunction ConditionalAddToRegistry\n  Pop $0\n  Pop $1\n  StrCmp \"$0\" \"\" ConditionalAddToRegistry_EmptyString\n    WriteRegStr SHCTX \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \\\n    \"$1\" \"$0\"\n    ;MessageBox MB_OK \"Set Registry: '$1' to '$0'\"\n    DetailPrint \"Set install registry entry: '$1' to '$0'\"\n  ConditionalAddToRegistry_EmptyString:\nFunctionEnd\n\n;--------------------------------\n\n!ifdef CPACK_USES_DOWNLOAD\nFunction DownloadFile\n    IfFileExists $INSTDIR\\* +2\n    CreateDirectory $INSTDIR\n    Pop $0\n\n    ; Skip if already downloaded\n    IfFileExists $INSTDIR\\$0 0 +2\n    Return\n\n    StrCpy $1 \"@CPACK_DOWNLOAD_SITE@\"\n\n  try_again:\n    NSISdl::download \"$1/$0\" \"$INSTDIR\\$0\"\n\n    Pop $1\n    StrCmp $1 \"success\" success\n    StrCmp $1 \"Cancelled\" cancel\n    MessageBox MB_OK \"Download failed: $1\"\n  cancel:\n    Return\n  success:\nFunctionEnd\n!endif\n\n;--------------------------------\n; Define some macro setting for the gui\n@CPACK_NSIS_INSTALLER_MUI_ICON_CODE@\n@CPACK_NSIS_INSTALLER_ICON_CODE@\n@CPACK_NSIS_INSTALLER_MUI_WELCOMEFINISH_CODE@\n@CPACK_NSIS_INSTALLER_MUI_UNWELCOMEFINISH_CODE@\n@CPACK_NSIS_INSTALLER_MUI_FINISHPAGE_RUN_CODE@\n\n;--------------------------------\n;Pages\n  @CPACK_NSIS_INSTALLER_WELCOME_TITLE_CODE@\n  @CPACK_NSIS_INSTALLER_WELCOME_TITLE_3LINES_CODE@\n  !insertmacro MUI_PAGE_WELCOME\n\n  @CPACK_NSIS_LICENSE_PAGE@\n  Page custom InstallOptionsPage\n  !insertmacro MUI_PAGE_DIRECTORY\n\n  !define MUI_DIRECTORYPAGE_VARIABLE $mmxDataDir\n  !define MUI_DIRECTORYPAGE_TEXT_TOP \"Setup will install $(^NameDA) blockchain data (MMX_DATA) in the following folder. To install in a different folder, click Browse and select another folder. $_CLICK\"\n  !define MUI_DIRECTORYPAGE_TEXT_DESTINATION \"Data folder\"\n  !insertmacro MUI_PAGE_DIRECTORY\n\n  ;Start Menu Folder Page Configuration\n  !define MUI_STARTMENUPAGE_REGISTRY_ROOT \"SHCTX\"\n  !define MUI_STARTMENUPAGE_REGISTRY_KEY \"Software\\@CPACK_PACKAGE_VENDOR@\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\"\n  !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME \"Start Menu Folder\"\n  !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER\n\n  @CPACK_NSIS_PAGE_COMPONENTS@\n\n  !insertmacro MUI_PAGE_INSTFILES\n  @CPACK_NSIS_INSTALLER_FINISH_TITLE_CODE@\n  @CPACK_NSIS_INSTALLER_FINISH_TITLE_3LINES_CODE@\n  !insertmacro MUI_PAGE_FINISH\n\n  !insertmacro MUI_UNPAGE_CONFIRM\n  !insertmacro MUI_UNPAGE_INSTFILES\n\n;--------------------------------\n;Languages\n\n  !insertmacro MUI_LANGUAGE \"English\" ;first language is the default language\n  !insertmacro MUI_LANGUAGE \"Afrikaans\"\n  !insertmacro MUI_LANGUAGE \"Albanian\"\n  !insertmacro MUI_LANGUAGE \"Arabic\"\n  !insertmacro MUI_LANGUAGE \"Asturian\"\n  !insertmacro MUI_LANGUAGE \"Basque\"\n  !insertmacro MUI_LANGUAGE \"Belarusian\"\n  !insertmacro MUI_LANGUAGE \"Bosnian\"\n  !insertmacro MUI_LANGUAGE \"Breton\"\n  !insertmacro MUI_LANGUAGE \"Bulgarian\"\n  !insertmacro MUI_LANGUAGE \"Catalan\"\n  !insertmacro MUI_LANGUAGE \"Corsican\"\n  !insertmacro MUI_LANGUAGE \"Croatian\"\n  !insertmacro MUI_LANGUAGE \"Czech\"\n  !insertmacro MUI_LANGUAGE \"Danish\"\n  !insertmacro MUI_LANGUAGE \"Dutch\"\n  !insertmacro MUI_LANGUAGE \"Esperanto\"\n  !insertmacro MUI_LANGUAGE \"Estonian\"\n  !insertmacro MUI_LANGUAGE \"Farsi\"\n  !insertmacro MUI_LANGUAGE \"Finnish\"\n  !insertmacro MUI_LANGUAGE \"French\"\n  !insertmacro MUI_LANGUAGE \"Galician\"\n  !insertmacro MUI_LANGUAGE \"German\"\n  !insertmacro MUI_LANGUAGE \"Greek\"\n  !insertmacro MUI_LANGUAGE \"Hebrew\"\n  !insertmacro MUI_LANGUAGE \"Hungarian\"\n  !insertmacro MUI_LANGUAGE \"Icelandic\"\n  !insertmacro MUI_LANGUAGE \"Indonesian\"\n  !insertmacro MUI_LANGUAGE \"Irish\"\n  !insertmacro MUI_LANGUAGE \"Italian\"\n  !insertmacro MUI_LANGUAGE \"Japanese\"\n  !insertmacro MUI_LANGUAGE \"Korean\"\n  !insertmacro MUI_LANGUAGE \"Kurdish\"\n  !insertmacro MUI_LANGUAGE \"Latvian\"\n  !insertmacro MUI_LANGUAGE \"Lithuanian\"\n  !insertmacro MUI_LANGUAGE \"Luxembourgish\"\n  !insertmacro MUI_LANGUAGE \"Macedonian\"\n  !insertmacro MUI_LANGUAGE \"Malay\"\n  !insertmacro MUI_LANGUAGE \"Mongolian\"\n  !insertmacro MUI_LANGUAGE \"Norwegian\"\n  !insertmacro MUI_LANGUAGE \"NorwegianNynorsk\"\n  !insertmacro MUI_LANGUAGE \"Pashto\"\n  !insertmacro MUI_LANGUAGE \"Polish\"\n  !insertmacro MUI_LANGUAGE \"Portuguese\"\n  !insertmacro MUI_LANGUAGE \"PortugueseBR\"\n  !insertmacro MUI_LANGUAGE \"Romanian\"\n  !insertmacro MUI_LANGUAGE \"Russian\"\n  !insertmacro MUI_LANGUAGE \"ScotsGaelic\"\n  !insertmacro MUI_LANGUAGE \"Serbian\"\n  !insertmacro MUI_LANGUAGE \"SerbianLatin\"\n  !insertmacro MUI_LANGUAGE \"SimpChinese\"\n  !insertmacro MUI_LANGUAGE \"Slovak\"\n  !insertmacro MUI_LANGUAGE \"Slovenian\"\n  !insertmacro MUI_LANGUAGE \"Spanish\"\n  !insertmacro MUI_LANGUAGE \"SpanishInternational\"\n  !insertmacro MUI_LANGUAGE \"Swedish\"\n  !insertmacro MUI_LANGUAGE \"Tatar\"\n  !insertmacro MUI_LANGUAGE \"Thai\"\n  !insertmacro MUI_LANGUAGE \"TradChinese\"\n  !insertmacro MUI_LANGUAGE \"Turkish\"\n  !insertmacro MUI_LANGUAGE \"Ukrainian\"\n  !insertmacro MUI_LANGUAGE \"Uzbek\"\n  !insertmacro MUI_LANGUAGE \"Vietnamese\"\n  !insertmacro MUI_LANGUAGE \"Welsh\"\n\n;--------------------------------\n;Reserve Files\n\n  ;These files should be inserted before other files in the data block\n  ;Keep these lines before any File command\n  ;Only for solid compression (by default, solid compression is enabled for BZIP2 and LZMA)\n\n  ReserveFile \"NSIS.InstallOptions.ini\"\n  !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS\n\n  ; for UserInfo::GetName and UserInfo::GetAccountType\n  ReserveFile /plugin 'UserInfo.dll'\n\n;--------------------------------\n; Installation types\n@CPACK_NSIS_INSTALLATION_TYPES@\n\n;--------------------------------\n; Component sections\n@CPACK_NSIS_COMPONENT_SECTIONS@\n@CPACK_NSIS_INSTALLER_MUI_COMPONENTS_DESC@\n;--------------------------------\n;Installer Sections\n\nSection \"-Core installation\"\n\n  WriteRegExpandStr ${NT_current_env} MMX_DATA \"$mmxDataDir\\\"\n  SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 \"STR:Environment\" /TIMEOUT=5000\n\n  ;Use the entire tree produced by the INSTALL target.  Keep the\n  ;list of directories here in sync with the RMDir commands below.\n  SetOutPath \"$INSTDIR\"\n  @CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@\n  @CPACK_NSIS_FULL_INSTALL@\n\n  ;Store installation folder\n  WriteRegStr SHCTX \"Software\\@CPACK_PACKAGE_VENDOR@\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"\" $INSTDIR\n\n  ;Create uninstaller\n  WriteUninstaller \"$INSTDIR\\@CPACK_NSIS_UNINSTALL_NAME@.exe\"\n  Push \"DisplayName\"\n  Push \"@CPACK_NSIS_DISPLAY_NAME@\"\n  Call ConditionalAddToRegistry\n  Push \"DisplayVersion\"\n  Push \"@CPACK_PACKAGE_VERSION@\"\n  Call ConditionalAddToRegistry\n  Push \"Publisher\"\n  Push \"@CPACK_PACKAGE_VENDOR@\"\n  Call ConditionalAddToRegistry\n  Push \"UninstallString\"\n  Push \"$\\\"$INSTDIR\\@CPACK_NSIS_UNINSTALL_NAME@.exe$\\\"\"\n  Call ConditionalAddToRegistry\n  Push \"NoRepair\"\n  Push \"1\"\n  Call ConditionalAddToRegistry\n\n  !ifdef CPACK_NSIS_ADD_REMOVE\n  ;Create add/remove functionality\n  Push \"ModifyPath\"\n  Push \"$INSTDIR\\AddRemove.exe\"\n  Call ConditionalAddToRegistry\n  !else\n  Push \"NoModify\"\n  Push \"1\"\n  Call ConditionalAddToRegistry\n  !endif\n\n  ; Optional registration\n  Push \"DisplayIcon\"\n  Push \"$INSTDIR\\@CPACK_NSIS_INSTALLED_ICON_NAME@\"\n  Call ConditionalAddToRegistry\n  Push \"HelpLink\"\n  Push \"@CPACK_NSIS_HELP_LINK@\"\n  Call ConditionalAddToRegistry\n  Push \"URLInfoAbout\"\n  Push \"@CPACK_NSIS_URL_INFO_ABOUT@\"\n  Call ConditionalAddToRegistry\n  Push \"Contact\"\n  Push \"@CPACK_NSIS_CONTACT@\"\n  Call ConditionalAddToRegistry\n  !insertmacro MUI_INSTALLOPTIONS_READ $INSTALL_DESKTOP \"NSIS.InstallOptions.ini\" \"Field 5\" \"State\"\n  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application\n\n  ;Create shortcuts\n  CreateDirectory \"$SMPROGRAMS\\$STARTMENU_FOLDER\"\n@CPACK_NSIS_CREATE_ICONS@\n@CPACK_NSIS_CREATE_ICONS_EXTRA@\n  CreateShortCut \"$SMPROGRAMS\\$STARTMENU_FOLDER\\Uninstall.lnk\" \"$INSTDIR\\@CPACK_NSIS_UNINSTALL_NAME@.exe\"\n\n  ;Read a value from an InstallOptions INI file\n  !insertmacro MUI_INSTALLOPTIONS_READ $DO_NOT_ADD_TO_PATH \"NSIS.InstallOptions.ini\" \"Field 2\" \"State\"\n  !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_ALL_USERS \"NSIS.InstallOptions.ini\" \"Field 3\" \"State\"\n  !insertmacro MUI_INSTALLOPTIONS_READ $ADD_TO_PATH_CURRENT_USER \"NSIS.InstallOptions.ini\" \"Field 4\" \"State\"\n\n  ; Write special uninstall registry entries\n  Push \"StartMenu\"\n  Push \"$STARTMENU_FOLDER\"\n  Call ConditionalAddToRegistry\n  Push \"DoNotAddToPath\"\n  Push \"$DO_NOT_ADD_TO_PATH\"\n  Call ConditionalAddToRegistry\n  Push \"AddToPathAllUsers\"\n  Push \"$ADD_TO_PATH_ALL_USERS\"\n  Call ConditionalAddToRegistry\n  Push \"AddToPathCurrentUser\"\n  Push \"$ADD_TO_PATH_CURRENT_USER\"\n  Call ConditionalAddToRegistry\n  Push \"InstallToDesktop\"\n  Push \"$INSTALL_DESKTOP\"\n  Call ConditionalAddToRegistry\n\n  !insertmacro MUI_STARTMENU_WRITE_END\n\n@CPACK_NSIS_EXTRA_INSTALL_COMMANDS@\n\nSectionEnd\n\nSection \"-Add to path\"\n  Push $INSTDIR\\bin\n  StrCmp \"@CPACK_NSIS_MODIFY_PATH@\" \"ON\" 0 doNotAddToPath\n  StrCmp $DO_NOT_ADD_TO_PATH \"1\" doNotAddToPath 0\n    Call AddToPath\n  doNotAddToPath:\nSectionEnd\n\n;--------------------------------\n; Create custom pages\nFunction InstallOptionsPage\n  !insertmacro MUI_HEADER_TEXT \"Install Options\" \"Choose options for installing @CPACK_NSIS_PACKAGE_NAME@\"\n  !insertmacro MUI_INSTALLOPTIONS_DISPLAY \"NSIS.InstallOptions.ini\"\n\nFunctionEnd\n\n;--------------------------------\n; determine admin versus local install\nFunction un.onInit\n\n  ClearErrors\n  UserInfo::GetName\n  IfErrors noLM\n  Pop $0\n  UserInfo::GetAccountType\n  Pop $1\n  StrCmp $1 \"Admin\" 0 +3\n    SetShellVarContext all\n    ;MessageBox MB_OK 'User \"$0\" is in the Admin group'\n    Goto done\n  StrCmp $1 \"Power\" 0 +3\n    SetShellVarContext all\n    ;MessageBox MB_OK 'User \"$0\" is in the Power Users group'\n    Goto done\n\n  noLM:\n    ;Get installation folder from registry if available\n\n  done:\n\nFunctionEnd\n\n;--- Add/Remove callback functions: ---\n!macro SectionList MacroName\n  ;This macro used to perform operation on multiple sections.\n  ;List all of your components in following manner here.\n@CPACK_NSIS_COMPONENT_SECTION_LIST@\n!macroend\n\nSection -FinishComponents\n  ;Removes unselected components and writes component status to registry\n  !insertmacro SectionList \"FinishSection\"\n\n!ifdef CPACK_NSIS_ADD_REMOVE\n  ; Get the name of the installer executable\n  System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'\n  StrCpy $R3 $R0\n\n  ; Strip off the last 13 characters, to see if we have AddRemove.exe\n  StrLen $R1 $R0\n  IntOp $R1 $R0 - 13\n  StrCpy $R2 $R0 13 $R1\n  StrCmp $R2 \"AddRemove.exe\" addremove_installed\n\n  ; We're not running AddRemove.exe, so install it\n  CopyFiles $R3 $INSTDIR\\AddRemove.exe\n\n  addremove_installed:\n!endif\nSectionEnd\n;--- End of Add/Remove callback functions ---\n\n;--------------------------------\n; Component dependencies\nFunction .onSelChange\n  !insertmacro SectionList MaybeSelectionChanged\nFunctionEnd\n\n;--------------------------------\n;Uninstaller Section\n\nSection \"Uninstall\"\n  ReadRegStr $START_MENU SHCTX \\\n   \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"StartMenu\"\n  ;MessageBox MB_OK \"Start menu is in: $START_MENU\"\n  ReadRegStr $DO_NOT_ADD_TO_PATH SHCTX \\\n    \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"DoNotAddToPath\"\n  ReadRegStr $ADD_TO_PATH_ALL_USERS SHCTX \\\n    \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"AddToPathAllUsers\"\n  ReadRegStr $ADD_TO_PATH_CURRENT_USER SHCTX \\\n    \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"AddToPathCurrentUser\"\n  ;MessageBox MB_OK \"Add to path: $DO_NOT_ADD_TO_PATH all users: $ADD_TO_PATH_ALL_USERS\"\n  ReadRegStr $INSTALL_DESKTOP SHCTX \\\n    \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"InstallToDesktop\"\n  ;MessageBox MB_OK \"Install to desktop: $INSTALL_DESKTOP \"\n\n@CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS@\n\n  ;Remove files we installed.\n  ;Keep the list of directories here in sync with the File commands above.\n@CPACK_NSIS_DELETE_FILES@\n@CPACK_NSIS_DELETE_DIRECTORIES@\n\n!ifdef CPACK_NSIS_ADD_REMOVE\n  ;Remove the add/remove program\n  Delete \"$INSTDIR\\AddRemove.exe\"\n!endif\n\n  ;Remove the uninstaller itself.\n  Delete \"$INSTDIR\\@CPACK_NSIS_UNINSTALL_NAME@.exe\"\n  DeleteRegKey SHCTX \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\"\n\n  ;Remove the installation directory if it is empty.\n  RMDir \"$INSTDIR\"\n\n  ; Remove the registry entries.\n  DeleteRegKey SHCTX \"Software\\@CPACK_PACKAGE_VENDOR@\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\"\n  ; DeleteRegValue ${NT_current_env} MMX_DATA\n\n  ; Removes all optional components\n  !insertmacro SectionList \"RemoveSection_CPack\"\n\n  !insertmacro MUI_STARTMENU_GETFOLDER Application $MUI_TEMP\n\n  Delete \"$SMPROGRAMS\\$MUI_TEMP\\Uninstall.lnk\"\n@CPACK_NSIS_DELETE_ICONS@\n@CPACK_NSIS_DELETE_ICONS_EXTRA@\n\n  ;Delete empty start menu parent directories\n  StrCpy $MUI_TEMP \"$SMPROGRAMS\\$MUI_TEMP\"\n\n  startMenuDeleteLoop:\n    ClearErrors\n    RMDir $MUI_TEMP\n    GetFullPathName $MUI_TEMP \"$MUI_TEMP\\..\"\n\n    IfErrors startMenuDeleteLoopDone\n\n    StrCmp \"$MUI_TEMP\" \"$SMPROGRAMS\" startMenuDeleteLoopDone startMenuDeleteLoop\n  startMenuDeleteLoopDone:\n\n  ; If the user changed the shortcut, then uninstall may not work. This should\n  ; try to fix it.\n  StrCpy $MUI_TEMP \"$START_MENU\"\n  Delete \"$SMPROGRAMS\\$MUI_TEMP\\Uninstall.lnk\"\n@CPACK_NSIS_DELETE_ICONS_EXTRA@\n\n  ;Delete empty start menu parent directories\n  StrCpy $MUI_TEMP \"$SMPROGRAMS\\$MUI_TEMP\"\n\n  secondStartMenuDeleteLoop:\n    ClearErrors\n    RMDir $MUI_TEMP\n    GetFullPathName $MUI_TEMP \"$MUI_TEMP\\..\"\n\n    IfErrors secondStartMenuDeleteLoopDone\n\n    StrCmp \"$MUI_TEMP\" \"$SMPROGRAMS\" secondStartMenuDeleteLoopDone secondStartMenuDeleteLoop\n  secondStartMenuDeleteLoopDone:\n\n  DeleteRegKey /ifempty SHCTX \"Software\\@CPACK_PACKAGE_VENDOR@\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\"\n\n  Push $INSTDIR\\bin\n  StrCmp $DO_NOT_ADD_TO_PATH_ \"1\" doNotRemoveFromPath 0\n    Call un.RemoveFromPath\n  doNotRemoveFromPath:\nSectionEnd\n\n;--------------------------------\n; determine admin versus local install\n; Is install for \"AllUsers\" or \"JustMe\"?\n; Default to \"JustMe\" - set to \"AllUsers\" if admin or on Win9x\n; This function is used for the very first \"custom page\" of the installer.\n; This custom page does not show up visibly, but it executes prior to the\n; first visible page and sets up $INSTDIR properly...\n; Choose different default installation folder based on SV_ALLUSERS...\n; \"Program Files\" for AllUsers, \"My Documents\" for JustMe...\n\nFunction .onInit\n  StrCpy $mmxDataDir_default \"$PROFILE\\.mmx\\\"\n  ReadRegStr $mmxDataDir ${NT_current_env} \"MMX_DATA\"\n  StrCmp $mmxDataDir \"\" 0 +2\n  StrCpy $mmxDataDir $mmxDataDir_default\n\n  StrCmp \"@CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL@\" \"ON\" 0 inst\n\n  ReadRegStr $0 HKLM \"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@\" \"UninstallString\"\n  StrCmp $0 \"\" inst\n\n  MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \\\n  \"@CPACK_NSIS_PACKAGE_NAME@ is already installed. $\\n$\\nDo you want to uninstall the old version before installing the new one?\" \\\n  /SD IDYES IDYES uninst IDNO inst\n  Abort\n\n;Run the uninstaller\nuninst:\n  ClearErrors\n  # $0 should _always_ be quoted, however older versions of CMake did not\n  # do this.  We'll conditionally remove the begin/end quotes.\n  # Remove first char if quote\n  StrCpy $2 $0 1 0      # copy first char\n  StrCmp $2 \"$\\\"\" 0 +2  # if char is quote\n  StrCpy $0 $0 \"\" 1     # remove first char\n  # Remove last char if quote\n  StrCpy $2 $0 1 -1     # copy last char\n  StrCmp $2 \"$\\\"\" 0 +2  # if char is quote\n  StrCpy $0 $0 -1       # remove last char\n\n  StrLen $2 \"\\@CPACK_NSIS_UNINSTALL_NAME@.exe\"\n  StrCpy $3 $0 -$2 # remove \"\\@CPACK_NSIS_UNINSTALL_NAME@.exe\" from UninstallString to get path\n  ExecWait '\"$0\" /S _?=$3' ;Do not copy the uninstaller to a temp file\n\n  IfErrors uninst_failed inst\nuninst_failed:\n  MessageBox MB_OK|MB_ICONSTOP \"Uninstall failed.\"\n  Abort\n\n\ninst:\n  ; Reads components status for registry\n  !insertmacro SectionList \"InitSection\"\n\n  ; check to see if /D has been used to change\n  ; the install directory by comparing it to the\n  ; install directory that is expected to be the\n  ; default\n  StrCpy $IS_DEFAULT_INSTALLDIR 0\n  StrCmp \"$INSTDIR\" \"@CPACK_NSIS_INSTALL_ROOT@\\@CPACK_PACKAGE_INSTALL_DIRECTORY@\" 0 +2\n    StrCpy $IS_DEFAULT_INSTALLDIR 1\n\n  StrCpy $SV_ALLUSERS \"JustMe\"\n  ; if default install dir then change the default\n  ; if it is installed for JustMe\n  StrCmp \"$IS_DEFAULT_INSTALLDIR\" \"1\" 0 +2\n    StrCpy $INSTDIR \"$DOCUMENTS\\@CPACK_PACKAGE_INSTALL_DIRECTORY@\"\n\n  ClearErrors\n  UserInfo::GetName\n  IfErrors noLM\n  Pop $0\n  UserInfo::GetAccountType\n  Pop $1\n  StrCmp $1 \"Admin\" 0 +4\n    SetShellVarContext all\n    ;MessageBox MB_OK 'User \"$0\" is in the Admin group'\n    StrCpy $SV_ALLUSERS \"AllUsers\"\n    Goto done\n  StrCmp $1 \"Power\" 0 +3\n    SetShellVarContext all\n    ;MessageBox MB_OK 'User \"$0\" is in the Power Users group'\n    StrCpy $SV_ALLUSERS \"AllUsers\"\n    Goto done\n\n  noLM:\n    StrCpy $SV_ALLUSERS \"AllUsers\"\n    ;Get installation folder from registry if available\n\n  done:\n  StrCmp $SV_ALLUSERS \"AllUsers\" 0 +3\n    StrCmp \"$IS_DEFAULT_INSTALLDIR\" \"1\" 0 +2\n      StrCpy $INSTDIR \"@CPACK_NSIS_INSTALL_ROOT@\\@CPACK_PACKAGE_INSTALL_DIRECTORY@\"\n\n  StrCmp \"@CPACK_NSIS_MODIFY_PATH@\" \"ON\" 0 noOptionsPage\n    !insertmacro MUI_INSTALLOPTIONS_EXTRACT \"NSIS.InstallOptions.ini\"\n\n  noOptionsPage:\nFunctionEnd\n"
  },
  {
    "path": "cmake/product_version/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015, by [halex2005](mailto:akharlov@gmail.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "cmake/product_version/VersionInfo.in",
    "content": "#pragma once\r\n\r\n#ifndef PRODUCT_VERSION_MAJOR\r\n#define PRODUCT_VERSION_MAJOR @PRODUCT_VERSION_MAJOR@\r\n#endif\r\n\r\n#ifndef PRODUCT_VERSION_MINOR\r\n#define PRODUCT_VERSION_MINOR @PRODUCT_VERSION_MINOR@\r\n#endif\r\n\r\n#ifndef PRODUCT_VERSION_PATCH\r\n#define PRODUCT_VERSION_PATCH @PRODUCT_VERSION_PATCH@\r\n#endif\r\n\r\n#ifndef PRODUCT_VERSION_BUILD\r\n#define PRODUCT_VERSION_BUILD @PRODUCT_VERSION_REVISION@\r\n#endif\r\n\r\n#ifndef FILE_VERSION_MAJOR\r\n#define FILE_VERSION_MAJOR @PRODUCT_VERSION_MAJOR@\r\n#endif\r\n\r\n#ifndef FILE_VERSION_MINOR\r\n#define FILE_VERSION_MINOR @PRODUCT_VERSION_MINOR@\r\n#endif\r\n\r\n#ifndef FILE_VERSION_PATCH\r\n#define FILE_VERSION_PATCH @PRODUCT_VERSION_PATCH@\r\n#endif\r\n\r\n#ifndef FILE_VERSION_BUILD\r\n#define FILE_VERSION_BUILD @PRODUCT_VERSION_REVISION@\r\n#endif\r\n\r\n#ifndef __TO_STRING\r\n#define __TO_STRING_IMPL(x) #x\r\n#define __TO_STRING(x) __TO_STRING_IMPL(x)\r\n#endif\r\n\r\n#define PRODUCT_VERSION_MAJOR_MINOR_STR        __TO_STRING(PRODUCT_VERSION_MAJOR) \".\" __TO_STRING(PRODUCT_VERSION_MINOR)\r\n#define PRODUCT_VERSION_MAJOR_MINOR_PATCH_STR  PRODUCT_VERSION_MAJOR_MINOR_STR \".\" __TO_STRING(PRODUCT_VERSION_PATCH)\r\n#define PRODUCT_VERSION_FULL_STR               PRODUCT_VERSION_MAJOR_MINOR_PATCH_STR \".\" __TO_STRING(PRODUCT_VERSION_BUILD)\r\n#define PRODUCT_VERSION_RESOURCE               PRODUCT_VERSION_MAJOR,PRODUCT_VERSION_MINOR,PRODUCT_VERSION_PATCH,PRODUCT_VERSION_BUILD\r\n#define PRODUCT_VERSION_RESOURCE_STR           PRODUCT_VERSION_MAJOR_MINOR_PATCH_STR \"\\0\"\r\n\r\n#define FILE_VERSION_MAJOR_MINOR_STR        __TO_STRING(FILE_VERSION_MAJOR) \".\" __TO_STRING(FILE_VERSION_MINOR)\r\n#define FILE_VERSION_MAJOR_MINOR_PATCH_STR  FILE_VERSION_MAJOR_MINOR_STR \".\" __TO_STRING(FILE_VERSION_PATCH)\r\n#define FILE_VERSION_FULL_STR               FILE_VERSION_MAJOR_MINOR_PATCH_STR \".\" __TO_STRING(FILE_VERSION_BUILD)\r\n#define FILE_VERSION_RESOURCE               FILE_VERSION_MAJOR,FILE_VERSION_MINOR,FILE_VERSION_PATCH,FILE_VERSION_BUILD\r\n#define FILE_VERSION_RESOURCE_STR           FILE_VERSION_FULL_STR \"\\0\"\r\n\r\n#ifndef PRODUCT_ICON\r\n#define PRODUCT_ICON \"@PRODUCT_ICON@\"\r\n#endif\r\n\r\n#ifndef PRODUCT_COMMENTS\r\n#define PRODUCT_COMMENTS           \"@PRODUCT_COMMENTS@\\0\"\r\n#endif\r\n\r\n#ifndef PRODUCT_COMPANY_NAME\r\n#define PRODUCT_COMPANY_NAME       \"@PRODUCT_COMPANY_NAME@\\0\"\r\n#endif\r\n\r\n#ifndef PRODUCT_COMPANY_COPYRIGHT\r\n#define PRODUCT_COMPANY_COPYRIGHT  \"@PRODUCT_COMPANY_COPYRIGHT@\\0\"\r\n#endif\r\n\r\n#ifndef PRODUCT_FILE_DESCRIPTION\r\n#define PRODUCT_FILE_DESCRIPTION   \"@PRODUCT_FILE_DESCRIPTION@\\0\"\r\n#endif\r\n\r\n#ifndef PRODUCT_INTERNAL_NAME\r\n#define PRODUCT_INTERNAL_NAME      \"@PRODUCT_NAME@\\0\"\r\n#endif\r\n\r\n#ifndef PRODUCT_ORIGINAL_FILENAME\r\n#define PRODUCT_ORIGINAL_FILENAME  __TO_STRING(TARGET_FILENAME) \"\\0\"\r\n#endif\r\n\r\n#ifndef PRODUCT_BUNDLE\r\n#define PRODUCT_BUNDLE             \"@PRODUCT_BUNDLE@\\0\"\r\n#endif\r\n"
  },
  {
    "path": "cmake/product_version/VersionResource.rc",
    "content": "#include \"VersionInfo_@PRODUCT_NAME@.h\"\r\n#include \"winres.h\"\r\n\r\n#ifdef PRODUCT_ICON\r\nIDI_ICON1               ICON                    PRODUCT_ICON\r\n#endif\r\n\r\nLANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT\r\n\r\nVS_VERSION_INFO VERSIONINFO\r\n    FILEVERSION FILE_VERSION_RESOURCE\r\n    PRODUCTVERSION PRODUCT_VERSION_RESOURCE\r\n    FILEFLAGSMASK 0x3fL\r\n#ifdef _DEBUG\r\n    FILEFLAGS 0x1L\r\n#else\r\n    FILEFLAGS 0x0L\r\n#endif\r\n    FILEOS 0x4L\r\n    FILETYPE 0x1L\r\n    FILESUBTYPE 0x0L\r\nBEGIN\r\n    BLOCK \"StringFileInfo\"\r\n    BEGIN\r\n        BLOCK \"040904b0\"\r\n        BEGIN\r\n            VALUE \"Comments\", PRODUCT_COMMENTS\r\n            VALUE \"CompanyName\", PRODUCT_COMPANY_NAME\r\n            VALUE \"FileDescription\", PRODUCT_FILE_DESCRIPTION\r\n            VALUE \"FileVersion\", FILE_VERSION_RESOURCE_STR\r\n            VALUE \"InternalName\", PRODUCT_INTERNAL_NAME\r\n            VALUE \"LegalCopyright\", PRODUCT_COMPANY_COPYRIGHT\r\n            VALUE \"OriginalFilename\", PRODUCT_ORIGINAL_FILENAME\r\n            VALUE \"ProductName\", PRODUCT_BUNDLE\r\n            VALUE \"ProductVersion\", PRODUCT_VERSION_RESOURCE_STR\r\n        END\r\n    END\r\n    BLOCK \"VarFileInfo\"\r\n    BEGIN\r\n        VALUE \"Translation\", 0x409, 1200\r\n    END\r\nEND"
  },
  {
    "path": "cmake/product_version/generate_product_version.cmake",
    "content": "include (CMakeParseArguments)\r\n\r\nset (GenerateProductVersionCurrentDir ${CMAKE_CURRENT_LIST_DIR})\r\n\r\n# generate_product_version() function\r\n#\r\n# This function uses VersionInfo.in template file and VersionResource.rc file\r\n# to generate WIN32 resource with version information and general resource strings.\r\n#\r\n# Usage:\r\n#   generate_product_version(\r\n#     SomeOutputResourceVariable\r\n#     NAME MyGreatProject\r\n#     ICON ${PATH_TO_APP_ICON}\r\n#     VERSION_MAJOR 2\r\n#     VERSION_MINOR 3\r\n#     VERSION_PATCH ${BUILD_COUNTER}\r\n#     VERSION_REVISION ${BUILD_REVISION}\r\n#   )\r\n# where BUILD_COUNTER and BUILD_REVISION could be values from your CI server.\r\n#\r\n# You can use generated resource for your executable targets:\r\n#   add_executable(target-name ${target-files} ${SomeOutputResourceVariable})\r\n#\r\n# You can specify resource strings in arguments:\r\n#   NAME               - name of executable (no defaults, ex: Microsoft Word)\r\n#   BUNDLE             - bundle (${NAME} is default, ex: Microsoft Office)\r\n#   ICON               - path to application icon (${CMAKE_SOURCE_DIR}/product.ico by default)\r\n#   VERSION_MAJOR      - 1 is default\r\n#   VERSION_MINOR      - 0 is default\r\n#   VERSION_PATCH      - 0 is default\r\n#   VERSION_REVISION   - 0 is default\r\n#   COMPANY_NAME       - your company name (no defaults)\r\n#   COMPANY_COPYRIGHT  - ${COMPANY_NAME} (C) Copyright ${CURRENT_YEAR} is default\r\n#   COMMENTS           - ${NAME} v${VERSION_MAJOR}.${VERSION_MINOR} is default\r\n#   ORIGINAL_FILENAME  - ${NAME} is default\r\n#   INTERNAL_NAME      - ${NAME} is default\r\n#   FILE_DESCRIPTION   - ${NAME} is default\r\nfunction(generate_product_version outfiles)\r\n    set (options)\r\n    set (oneValueArgs\r\n        NAME\r\n        BUNDLE\r\n        ICON\r\n        VERSION_MAJOR\r\n        VERSION_MINOR\r\n        VERSION_PATCH\r\n        VERSION_REVISION\r\n        COMPANY_NAME\r\n        COMPANY_COPYRIGHT\r\n        COMMENTS\r\n        ORIGINAL_FILENAME\r\n        INTERNAL_NAME\r\n        FILE_DESCRIPTION)\r\n    set (multiValueArgs)\r\n    cmake_parse_arguments(PRODUCT \"${options}\" \"${oneValueArgs}\" \"${multiValueArgs}\" ${ARGN})\r\n\r\n    if (NOT PRODUCT_BUNDLE OR \"${PRODUCT_BUNDLE}\" STREQUAL \"\")\r\n        set(PRODUCT_BUNDLE \"${PRODUCT_NAME}\")\r\n    endif()\r\n    # if (NOT PRODUCT_ICON OR \"${PRODUCT_ICON}\" STREQUAL \"\")\r\n    #     set(PRODUCT_ICON \"${CMAKE_SOURCE_DIR}/product.ico\")\r\n    # endif()\r\n\r\n    if (NOT PRODUCT_VERSION_MAJOR OR \"${PRODUCT_VERSION_MAJOR}\" STREQUAL \"\")\r\n        set(PRODUCT_VERSION_MAJOR 0)\r\n    endif()\r\n    if (NOT PRODUCT_VERSION_MINOR OR \"${PRODUCT_VERSION_MINOR}\" STREQUAL \"\")\r\n        set(PRODUCT_VERSION_MINOR 0)\r\n    endif()\r\n    if (NOT PRODUCT_VERSION_PATCH OR \"${PRODUCT_VERSION_PATCH}\" STREQUAL \"\")\r\n        set(PRODUCT_VERSION_PATCH 0)\r\n    endif()\r\n    if (NOT PRODUCT_VERSION_REVISION OR \"${PRODUCT_VERSION_REVISION}\" STREQUAL \"\")\r\n        set(PRODUCT_VERSION_REVISION 0)\r\n    endif()\r\n\r\n    if (NOT PRODUCT_NAME OR \"${PRODUCT_NAME}\" STREQUAL \"\")\r\n        set(PRODUCT_NAME \"\")\r\n    endif()\r\n\r\n    if (NOT PRODUCT_COMPANY_COPYRIGHT OR \"${PRODUCT_COMPANY_COPYRIGHT}\" STREQUAL \"\")\r\n        string(TIMESTAMP PRODUCT_CURRENT_YEAR \"%Y\")\r\n        set(PRODUCT_COMPANY_COPYRIGHT \"${PRODUCT_COMPANY_NAME} (C) Copyright ${PRODUCT_CURRENT_YEAR}\")\r\n    endif()\r\n    if (NOT PRODUCT_COMMENTS OR \"${PRODUCT_COMMENTS}\" STREQUAL \"\")\r\n        set(PRODUCT_COMMENTS \"${PRODUCT_NAME} v${PRODUCT_VERSION_MAJOR}.${PRODUCT_VERSION_MINOR}\")\r\n    endif()\r\n    if (NOT PRODUCT_ORIGINAL_FILENAME OR \"${PRODUCT_ORIGINAL_FILENAME}\" STREQUAL \"\")\r\n        set(PRODUCT_ORIGINAL_FILENAME \"${PRODUCT_NAME}\")\r\n    endif()\r\n    if (NOT PRODUCT_INTERNAL_NAME OR \"${PRODUCT_INTERNAL_NAME}\" STREQUAL \"\")\r\n        set(PRODUCT_INTERNAL_NAME \"${PRODUCT_NAME}\")\r\n    endif()\r\n    if (NOT PRODUCT_FILE_DESCRIPTION OR \"${PRODUCT_FILE_DESCRIPTION}\" STREQUAL \"\")\r\n        set(PRODUCT_FILE_DESCRIPTION \"${PRODUCT_NAME}\")\r\n    endif()\r\n\r\n    set (_VersionInfoFile ${CMAKE_CURRENT_BINARY_DIR}/VersionInfo/VersionInfo_${PRODUCT_NAME}.h)\r\n    set (_VersionResourceFile ${CMAKE_CURRENT_BINARY_DIR}/VersionInfo/VersionResource_${PRODUCT_NAME}.rc)\r\n    configure_file(\r\n        ${GenerateProductVersionCurrentDir}/VersionInfo.in\r\n        ${_VersionInfoFile}\r\n        @ONLY)\r\n    configure_file(\r\n        ${GenerateProductVersionCurrentDir}/VersionResource.rc\r\n        ${_VersionResourceFile}\r\n        @ONLY)\r\n    list(APPEND ${outfiles} ${_VersionInfoFile} ${_VersionResourceFile})\r\n    set (${outfiles} ${${outfiles}} PARENT_SCOPE)\r\nendfunction()\r\n"
  },
  {
    "path": "cmake/use_cuda.cmake",
    "content": "\nfind_package(CUDA)\n\nif(NOT MSVC)\n\tset(CUDA_NVCC_FLAGS \"${CUDA_NVCC_FLAGS} -Xcompiler ,-fPIC\")\nendif()\n\nset(CUDA_NVCC_FLAGS \"${CUDA_NVCC_FLAGS} -diag-suppress 611,997,68,186 -gencode arch=compute_50,code=compute_50 -gencode arch=compute_75,code=compute_75 -gencode arch=compute_86,code=compute_86\")\n"
  },
  {
    "path": "cmake/win_pack.cmake",
    "content": "set(NETWORK \"mainnet\")\r\nset(CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake/nsis/;${CMAKE_MODULE_PATH}\")\r\n\r\nfunction(get_all_targets var)\r\n    set(targets)\r\n    get_all_targets_recursive(targets ${CMAKE_CURRENT_SOURCE_DIR})\r\n    set(${var} ${targets} PARENT_SCOPE)\r\nendfunction()\r\n\r\nmacro(get_all_targets_recursive targets dir)\r\n    get_property(subdirectories DIRECTORY ${dir} PROPERTY SUBDIRECTORIES)\r\n    foreach(subdir ${subdirectories})\r\n        get_all_targets_recursive(${targets} ${subdir})\r\n    endforeach()\r\n\r\n    get_property(current_targets DIRECTORY ${dir} PROPERTY BUILDSYSTEM_TARGETS)\r\n    list(APPEND ${targets} ${current_targets})\r\nendmacro()\r\n\r\nget_all_targets(all_targets)\r\nset_target_properties(${all_targets} PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY \"$(OutDir)\")\r\nset_target_properties(${all_targets} PROPERTIES VS_DEBUGGER_ENVIRONMENT \"MMX_HOME=$(USERPROFILE)\\\\.mmx\\\\\\nMMX_DATA=$(USERPROFILE)\\\\.mmx\\\\\\nNETWORK=${NETWORK}\\nMMX_NETWORK=$(USERPROFILE)\\\\.mmx\\\\${NETWORK}\\\\\\n\")\r\nset_target_properties(mmx_node PROPERTIES VS_DEBUGGER_COMMAND_ARGUMENTS \"-c config\\\\${NETWORK}\\\\ config\\\\node\\\\ $(USERPROFILE)\\\\.mmx\\\\config\\\\local\\\\\")\r\nset_target_properties(mmx_timelord PROPERTIES VS_DEBUGGER_COMMAND_ARGUMENTS \"-c config\\\\${NETWORK}\\\\ config\\\\timelord\\\\ $(USERPROFILE)\\\\.mmx\\\\config\\\\local\\\\\")\r\nset_target_properties(mmx_wallet PROPERTIES VS_DEBUGGER_COMMAND_ARGUMENTS \"-c config\\\\${NETWORK}\\\\ config\\\\wallet\\\\ $(USERPROFILE)\\\\.mmx\\\\config\\\\local\\\\\")\r\nset_target_properties(mmx_farmer mmx_harvester PROPERTIES VS_DEBUGGER_COMMAND_ARGUMENTS \"-c config\\\\${NETWORK}\\\\ config\\\\farmer\\\\ $(USERPROFILE)\\\\.mmx\\\\config\\\\local\\\\\")\r\n\r\n\r\nadd_custom_command(TARGET mmx PRE_BUILD\r\nCOMMAND ${CMAKE_COMMAND} -E copy_directory\r\n\t${CMAKE_SOURCE_DIR}/kernel/ $<TARGET_FILE_DIR:mmx>/kernel/)\r\nadd_custom_command(TARGET mmx PRE_BUILD\r\n\tCOMMAND ${CMAKE_COMMAND} -E copy_directory\r\n\t\t${CMAKE_SOURCE_DIR}/config/ $<TARGET_FILE_DIR:mmx>/config/)\r\nadd_custom_command(TARGET mmx PRE_BUILD\r\n\tCOMMAND ${CMAKE_COMMAND} -E copy_directory\r\n\t\t${CMAKE_SOURCE_DIR}/www/ $<TARGET_FILE_DIR:mmx>/www/)\r\nadd_custom_command(TARGET mmx PRE_BUILD\r\n\tCOMMAND ${CMAKE_COMMAND} -E copy_directory\r\n\t\t${CMAKE_SOURCE_DIR}/data/ $<TARGET_FILE_DIR:mmx>/data/)\r\nadd_custom_command(TARGET mmx PRE_BUILD\r\n \tCOMMAND ${CMAKE_COMMAND} -E copy_directory\r\n \t\t${CMAKE_SOURCE_DIR}/scripts/win/ $<TARGET_FILE_DIR:mmx>)\r\n\r\nif(NOT MMX_VERSION MATCHES \"^v([0-9]+)\\\\.([0-9]+)\\\\.([0-9]+)$\")\r\n\tstring(TIMESTAMP BUILD_TIMESTAMP \"%Y%m%d\")\r\n\tset(MMX_VERSION \"v0.0.0.${BUILD_TIMESTAMP}\")\r\nendif()\r\n\r\nmessage(STATUS \"MMX_VERSION=${MMX_VERSION}\")\r\n\r\nstring(REGEX REPLACE \"^v([0-9]+).*$\" \"\\\\1\" MMX_VERSION_MAJOR \"${MMX_VERSION}\")\r\nstring(REGEX REPLACE \"^v[0-9]+\\\\.([0-9]+).*$\" \"\\\\1\" MMX_VERSION_MINOR  \"${MMX_VERSION}\")\r\nstring(REGEX REPLACE \"^v[0-9]+\\\\.[0-9]+\\\\.([0-9]+.*)$\" \"\\\\1\" MMX_VERSION_PATCH \"${MMX_VERSION}\")\r\n\r\nset(MMX_VERSION_STRING \"${MMX_VERSION_MAJOR}.${MMX_VERSION_MINOR}.${MMX_VERSION_PATCH}\")\r\n#message(STATUS \"MMX_VERSION_STRING: ${MMX_VERSION_STRING}\")\r\n\r\nset(CPACK_PACKAGE_VERSION ${MMX_VERSION_STRING})\r\nset(CPACK_PACKAGE_VERSION_MAJOR ${MMX_VERSION_MAJOR})\r\nset(CPACK_PACKAGE_VERSION_MINOR ${MMX_VERSION_MINOR})\r\nset(CPACK_PACKAGE_VERSION_PATCH ${MMX_VERSION_PATCH})\r\n\r\ninclude(cmake/product_version/generate_product_version.cmake)\r\nset(MMX_ICON \"${CMAKE_CURRENT_SOURCE_DIR}/cmake/mmx.ico\")\r\n\r\nset(MMX_BUNDLE \"MMX Node\")\r\n\r\nlist(APPEND APP_FILES\r\n\tmmx mmx_node mmx_farmer mmx_wallet mmx_timelord mmx_harvester\r\n\tmmx_compile mmx_postool mmx_posbench\r\n\tmmx_iface\r\n\tvnx_base vnx_addons url_cpp llhttp\r\n\tvnxpasswd generate_passwd\r\n\tautomy_basic_opencl\r\n)\r\n\r\nlist(APPEND TOOL_FILES\r\n\ttx_bench\r\n)\r\nforeach(APPFILE IN LISTS APP_FILES TOOL_FILES)\r\n\tset(ProductVersionFiles \"ProductVersionFiles_${APPFILE}\")\r\n\tgenerate_product_version(\r\n\t\t${ProductVersionFiles}\r\n\t\tNAME ${APPFILE}\r\n\t\tBUNDLE ${MMX_BUNDLE}\r\n\t\tCOMPANY_NAME \"madMAx43v3r\"\r\n\t\tFILE_DESCRIPTION ${APPFILE}\r\n\t\tICON ${MMX_ICON}\r\n\t\tVERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR}\r\n\t\tVERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR}\r\n\t\tVERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH}\r\n\t)\r\n\ttarget_sources(${APPFILE} PRIVATE ${${ProductVersionFiles}})\r\nendforeach()\r\n\r\nif (\"${MMX_WIN_PACK}\" STREQUAL \"TRUE\")\r\n\r\nset(CMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT libraries)\r\nset(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION ./)\r\nset(CMAKE_INSTALL_OPENMP_LIBRARIES TRUE)\r\ninclude(InstallRequiredSystemLibraries)\r\n\r\nadd_custom_target(mmx_node_gui ALL)\r\nset(MMX_NODE_GUI_GIT_TAG \"origin/main\")\r\nmessage(STATUS \"MMX Node GUI will be built from: ${MMX_NODE_GUI_GIT_TAG}\")\r\ninclude(FetchContent)\r\nFetchContent_Declare(\r\n\tmmx_node_gui\r\n\tGIT_REPOSITORY https://github.com/stotiks/mmx-node-gui.git\r\n\tGIT_TAG ${MMX_NODE_GUI_GIT_TAG}\r\n)\r\nFetchContent_MakeAvailable(mmx_node_gui)\r\nadd_custom_command(TARGET mmx_node_gui POST_BUILD\r\n\tCOMMAND ${CMAKE_MAKE_PROGRAM} Mmx.Gui.Win.Wpf/Mmx.Gui.Win.Wpf.csproj -restore -m \r\n\t\t\t/p:Configuration=Release\r\n\t\t\t/p:PlatformTarget=x64\r\n\t\t\t/p:OutputPath=${mmx_node_gui_SOURCE_DIR}/bin/Release\r\n\t\t\t/p:Version=${MMX_VERSION_STRING}\r\n\t\t\t/p:FileVersion=${MMX_VERSION_STRING}\r\n\t\tWORKING_DIRECTORY ${mmx_node_gui_SOURCE_DIR}\r\n)\r\n\r\nset(mmx_node_gui_RELEASE_DIR ${mmx_node_gui_SOURCE_DIR}/bin/CPack_Release)\r\n\r\ninstall(DIRECTORY ${mmx_node_gui_RELEASE_DIR}/ DESTINATION ./ COMPONENT gui)\r\n\r\ninstall(TARGETS ${APP_FILES} RUNTIME DESTINATION ./ COMPONENT applications)\r\ninstall(TARGETS ${TOOL_FILES} RUNTIME DESTINATION ./ COMPONENT tools)\r\n\r\ninstall(FILES \r\n\t\t\t$<TARGET_FILE_DIR:vnx_addons>/zlib1.dll\r\n\t\t\t$<TARGET_FILE_DIR:vnx_addons>/zstd.dll\r\n\t\t\t$<TARGET_FILE_DIR:automy_basic_opencl>/OpenCL.dll\r\n\t\t\t$<TARGET_FILE_DIR:mmx_node>/miniupnpc.dll\r\n\t\t\t$<TARGET_FILE_DIR:mmx_modules>/cudart64_12.dll\r\n\t\tDESTINATION ./ COMPONENT applications)\r\n\r\ninstall(DIRECTORY kernel/ DESTINATION kernel COMPONENT applications)\r\ninstall(DIRECTORY config/ DESTINATION config COMPONENT applications)\r\ninstall(DIRECTORY www/ DESTINATION www COMPONENT applications)\r\ninstall(DIRECTORY data/ DESTINATION data COMPONENT applications)\r\ninstall(DIRECTORY scripts/win/ DESTINATION ./ COMPONENT applications)\r\ninstall(FILES ${PROJECT_SOURCE_DIR}/LICENSE DESTINATION ./ COMPONENT applications)\r\n\r\n\r\nFetchContent_Declare(\r\n    mmx_cuda_plotter\r\n    GIT_REPOSITORY https://github.com/madMAx43v3r/mmx-binaries.git\r\n    GIT_TAG \"origin/master\"\r\n)\r\nFetchContent_MakeAvailable(mmx_cuda_plotter)\r\n\r\nset (MMX_DESTINATION ./)\r\nset(MMX_CUDA_PLOTTER_PATH ${mmx_cuda_plotter_SOURCE_DIR}/mmx-cuda-plotter/windows)\r\ninstall(DIRECTORY ${MMX_CUDA_PLOTTER_PATH}/ DESTINATION ${MMX_DESTINATION} COMPONENT plotters)\r\n\r\n\r\nset(CPACK_PACKAGE_NAME \"MMX Node\")\r\nset(CPACK_PACKAGE_VENDOR \"madMAx43v3r\")\r\nset(CPACK_PACKAGE_DESCRIPTION_SUMMARY \"MMX is a blockchain written from scratch using Chia's Proof Of Space and a SHA256 VDF similar to Solana\")\r\nset(CPACK_RESOURCE_FILE_LICENSE ${PROJECT_SOURCE_DIR}/LICENSE)\r\nset(CPACK_PACKAGE_HOMEPAGE_URL \"https://github.com/madMAx43v3r/mmx-node\")\r\n\r\nset(CPACK_PACKAGE_INSTALL_DIRECTORY \"MMX Node\")\r\n\r\n# Define components and their display names\r\nset(CPACK_COMPONENTS_ALL applications libraries gui plotters tools)\r\n\r\nset(CPACK_COMPONENT_APPLICATIONS_DISPLAY_NAME \"Node\")\r\nset(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME \"Libraries\")\r\nset(CPACK_COMPONENT_GUI_DISPLAY_NAME \"GUI\")\r\nset(CPACK_COMPONENT_PLOTTERS_DISPLAY_NAME \"Plotter\")\r\nset(CPACK_COMPONENT_TOOLS_DISPLAY_NAME \"Tools\")\r\n\r\n\r\nset(CPACK_COMPONENT_APPLICATIONS_REQUIRED True)\r\nset(CPACK_COMPONENT_LIBRARIES_REQUIRED True)\r\nset(CPACK_COMPONENT_GUI_REQUIRED True)\r\nset(CPACK_COMPONENT_PLOTTERS_REQUIRED True)\r\n#set(CPACK_COMPONENT_TOOLS_REQUIRED True)\r\n\r\n# Define NSIS installation types\r\nset(CPACK_ALL_INSTALL_TYPES Full Advanced)\r\n# set(CPACK_COMPONENT_APPLICATIONS_INSTALL_TYPES Full Minimal Advanced)\r\n# set(CPACK_COMPONENT_SYSLIBRARIES_INSTALL_TYPES Full Minimal Advanced)\r\n# set(CPACK_COMPONENT_GUI_INSTALL_TYPES Full Minimal Advanced)\r\n# set(CPACK_COMPONENT_PLOTTERS_INSTALL_TYPES Full Minimal Advanced)\r\nset(CPACK_COMPONENT_TOOLS_INSTALL_TYPES Advanced)\r\n\r\n\r\nset(CPACK_NSIS_PACKAGE_NAME ${CPACK_PACKAGE_NAME})\r\n\r\nset(CPACK_NSIS_MENU_LINKS\r\n\"mmx_cmd.cmd\" \"MMX CMD\"\r\n#\"http://localhost:11380/gui/\" \"MMX Node WebGUI\"\r\n\"MmxGui.exe\" \"MMX Node\"\r\n\"MmxPlotter.exe\" \"MMX Plotter\"\r\n)\r\nset(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)\r\n\r\nset(MMX_GUI_EXE \"MmxGui.exe\")\r\n\r\nset(CPACK_NSIS_MUI_ICON ${MMX_ICON})\r\nset(CPACK_NSIS_INSTALLED_ICON_NAME ${MMX_GUI_EXE})\r\n\r\n#set(CPACK_NSIS_EXECUTABLES_DIRECTORY \".\")\r\n#set(CPACK_NSIS_MUI_FINISHPAGE_RUN ${MMX_GUI_EXE})\r\n\r\n# Must be after the last CPACK macros\r\ninclude(CPack)\r\n\r\nendif() #if (${MMX_WIN_PACK} STREQUAL \"TRUE\")"
  },
  {
    "path": "codegen.sh",
    "content": "#!/bin/bash\n\ncd $(dirname \"$0\")\n\n./vnx-base/codegen.sh\n./vnx-addons/codegen.sh ../vnx-base/interface/\n\nvnxcppcodegen --cleanup generated/ mmx interface/ modules/ interface/vm/ vnx-base/interface/ vnx-addons/interface/ vnx-addons/modules/ interface/wallet/\nvnxcppcodegen --cleanup generated/contract/ mmx.contract interface/contract/ interface/ vnx-base/interface/\nvnxcppcodegen --cleanup generated/operation/ mmx.operation interface/operation/ interface/ vnx-base/interface/\nvnxcppcodegen --cleanup generated/solution/ mmx.solution interface/solution/ interface/ vnx-base/interface/\nvnxcppcodegen --cleanup generated/vm/ mmx.vm interface/vm/ vnx-base/interface/\n#vnxcppcodegen --cleanup exchange/generated/ mmx.exchange exchange/interface/ exchange/modules/ interface/ vnx-addons/interface/ vnx-addons/modules/ vnx-base/interface/\n"
  },
  {
    "path": "config/default/Farmer.json",
    "content": "{\n\t\"harvester_timeout\": 30\n}"
  },
  {
    "path": "config/default/Harvester.json",
    "content": "{\n\t\"num_threads\": 32,\n\t\"max_queue_ms\": 30000,\n\t\"config_path\": \"config/local/\",\n\t\"dir_blacklist\": [\n\t\t\".\", \"..\", \"lost+found\", \"$RECYCLE.BIN\", \"System Volume Information\"\n\t]\n}"
  },
  {
    "path": "config/default/HttpServer.json",
    "content": "{\n\t\"port\": 11380,\n\t\"stats_interval_ms\": 60000,\n\t\"default_access\": \"NETWORK\"\n}"
  },
  {
    "path": "config/default/Node.json",
    "content": "{\n\t\"num_sync_retries\": 5,\n\t\"sync_loss_delay\": 300,\n\t\"max_future_sync\": 18,\n\t\"max_sync_ahead\": 10000,\n\t\"max_sync_jobs\": 100,\n\t\"max_history\": 200,\n\t\"validate_interval_ms\": 500,\n\t\"tx_pool_limit\": 50\n}\n"
  },
  {
    "path": "config/default/Router.json",
    "content": "{\n\t\"host\": \"0.0.0.0\",\n\t\"open_port\": true,\n\t\"min_sync_peers\": 5,\n\t\"num_peers_out\": 8,\n\t\"max_peer_set\": 100,\n\t\"max_connections\": 100,\n\t\"max_queue_ms\": 5000,\n\t\"max_msg_size\": 8388608,\n\t\"max_write_queue\": 10485760,\n\t\"stats_interval_ms\": 60000,\n\t\"connect_interval_ms\": 10000,\n\t\"connection_timeout_ms\": 180000,\n\t\"fetch_timeout_ms\": 180000,\n\t\"relay_target_ms\": 2000,\n\t\"max_hash_cache\": 200000,\n\t\"max_sent_cache\": 20000,\n\t\"max_tx_upload\" : 2,\n\t\"max_pending_cost\": 0.1,\n\t\"compress_level\": 0\n}\n"
  },
  {
    "path": "config/default/TimeLord.json",
    "content": "{\n\t\"enable_reward\": true\n}"
  },
  {
    "path": "config/default/Wallet.json",
    "content": "{\n\t\"key_files\": [\n\t\t\"wallet.dat\"\n\t],\n\t\"config_path\": \"config/local/\"\n}"
  },
  {
    "path": "config/default/WebAPI.json",
    "content": "{\n\t\"config_path\": \"config/local/\"\n}"
  },
  {
    "path": "config/default/mmx_farmer.json",
    "content": "{\n\t\"log_file_level\": 3,\n\t\"log_file_name\": \"mmx_farmer\"\n}"
  },
  {
    "path": "config/default/mmx_harvester.json",
    "content": "{\n\t\"log_file_level\": 3,\n\t\"log_file_name\": \"mmx_harvester\"\n}"
  },
  {
    "path": "config/default/mmx_node.json",
    "content": "{\n\t\"log_file_level\": 3,\n\t\"log_file_name\": \"mmx_node\"\n}"
  },
  {
    "path": "config/default/timelord",
    "content": "false"
  },
  {
    "path": "config/default/vnx/authentication.json",
    "content": "{\n\t\"permissions\": {\n\t\t\"ADMIN\": [\n\t\t\t\"!PROTECTED_CONFIG\",\n\t\t\t\"mmx.permission_e.PUBLIC\",\n\t\t\t\"mmx.permission_e.REMOTE\",\n\t\t\t\"mmx.permission_e.SPENDING\",\n\t\t\t\"vnx.addons.permission_e.HTTP_REQUEST\",\n\t\t\t\"vnx.addons.permission_e.FILE_DOWNLOAD\"\n\t\t],\n\t\t\"USER\": [\n\t\t\t\"mmx.permission_e.PUBLIC\",\n\t\t\t\"mmx.permission_e.REMOTE\",\n\t\t\t\"vnx.addons.permission_e.HTTP_REQUEST\",\n\t\t\t\"vnx.addons.permission_e.FILE_DOWNLOAD\"\n\t\t],\n\t\t\"NODE\": [\n\t\t\t\"mmx.permission_e.SIGN_BLOCK\"\n\t\t],\n\t\t\"REMOTE\": [\n\t\t\t\"VIEW\",\n\t\t\t\"PUBLISH\",\n\t\t\t\"TIME_SYNC\",\n\t\t\t\"mmx.permission_e.PUBLIC\",\n\t\t\t\"mmx.permission_e.REMOTE\"\n\t\t],\n\t\t\"NETWORK\": [\n\t\t\t\"mmx.permission_e.PUBLIC\",\n\t\t\t\"vnx.addons.permission_e.HTTP_REQUEST\",\n\t\t\t\"vnx.addons.permission_e.FILE_DOWNLOAD\"\n\t\t]\n\t},\n\t\"users\": [\n\t\t{\n\t\t\t\"name\": \"mmx-admin\",\n\t\t\t\"access_roles\": [\"ADMIN\"]\n\t\t},\n\t\t{\n\t\t\t\"name\": \"mmx-user\",\n\t\t\t\"access_roles\": [\"USER\"]\n\t\t}\n\t]\n}\n"
  },
  {
    "path": "config/default/vnx/protected_config+",
    "content": "[\n\t\"passwd\",\n\t\"HttpServer.token_map\"\n]"
  },
  {
    "path": "config/farmer/Proxy.json",
    "content": "{\n\t\"export_list\": [\"vnx.log_out\"]\n}"
  },
  {
    "path": "config/local_init/Farmer.json",
    "content": "{\n\t\"reward_addr\": null\n}"
  },
  {
    "path": "config/local_init/Harvester.json",
    "content": "{\n\t\"num_threads\": 32,\n\t\"reload_interval\": 3600,\n\t\"recursive_search\": true,\n\t\"plot_dirs\": []\n}\n"
  },
  {
    "path": "config/local_init/HttpServer.json",
    "content": "{\n\t\"host\": \"localhost\",\n\t\"token_map\": []\n}"
  },
  {
    "path": "config/local_init/Node.json",
    "content": "{\n\t\"opencl_device\": 0,\n\t\"metalsdev_api_key\": null\n}"
  },
  {
    "path": "config/local_init/Router.json",
    "content": "{\n\t\"open_port\": true,\n\t\"num_peers_out\": 8,\n\t\"max_connections\": 100,\n\t\"fixed_peers\": [],\n\t\"seed_peers+\": [],\n\t\"block_peers+\": []\n}"
  },
  {
    "path": "config/local_init/TimeLord.json",
    "content": "{\n\t\"reward_addr\": null\n}"
  },
  {
    "path": "config/local_init/Wallet.json",
    "content": "{\n\t\"key_files+\": [],\n\t\"token_whitelist+\": []\n}"
  },
  {
    "path": "config/local_init/allow_remote",
    "content": "false"
  },
  {
    "path": "config/local_init/cuda.json",
    "content": "{\n\t\"enable\": true,\n\t\"devices\": []\n}"
  },
  {
    "path": "config/local_init/opencl.json",
    "content": "{\n\t\"platform\": null\n}\n"
  },
  {
    "path": "config/local_init/remote_compute",
    "content": "false"
  },
  {
    "path": "config/local_init/timelord",
    "content": "false"
  },
  {
    "path": "config/mainnet/Router.json",
    "content": "{\n\t\"seed_peers\": [\n\t    \"104.157.124.160\",\n\t    \"108.12.226.21\",\n\t    \"109.198.29.98\",\n\t    \"119.6.178.16\",\n\t    \"135.131.174.76\",\n\t    \"141.135.6.172\",\n\t    \"143.177.124.174\",\n\t    \"162.118.7.169\",\n\t    \"162.198.119.188\",\n\t    \"163.58.65.191\",\n\t    \"184.146.2.29\",\n\t    \"184.71.194.234\",\n\t    \"195.239.203.162\",\n\t    \"203.129.18.0\",\n\t    \"212.15.59.91\",\n\t    \"217.198.130.81\",\n\t    \"42.3.123.47\",\n\t    \"46.189.185.59\",\n\t    \"47.253.32.11\",\n\t    \"47.34.208.57\",\n\t    \"49.231.43.170\",\n\t    \"66.231.154.77\",\n\t    \"69.197.174.72\",\n\t    \"70.19.84.129\",\n\t    \"71.227.39.0\",\n\t    \"75.172.49.125\",\n\t    \"76.128.231.98\",\n\t    \"76.232.65.235\",\n\t    \"78.107.240.148\",\n\t    \"78.180.96.7\",\n\t    \"79.104.211.73\",\n\t    \"80.235.212.62\",\n\t    \"82.37.10.82\",\n\t    \"84.215.4.105\",\n\t    \"86.30.69.50\",\n\t    \"87.118.169.200\",\n\t    \"89.242.3.102\",\n\t    \"93.43.225.93\",\n\t    \"94.19.237.176\",\n\t    \"95.105.142.58\",\n\t    \"95.22.80.4\",\n\t    \"95.31.212.141\",\n\t    \"110.164.184.5\",\n\t    \"89.116.184.19\"\n\t]\n}\n"
  },
  {
    "path": "config/mainnet/chain/params/escrow_binary",
    "content": "mmx1wlwl4tgfdjl5nmntd4sj77mcgfn47sapztnwaf2u2cqmzrcppvrqxhx0st\n"
  },
  {
    "path": "config/mainnet/chain/params/nft_binary",
    "content": "mmx1hzz9tgs2dz9366t3p4ep8trmaejx7tk9al9ah3md2u37pkesa3qqfyepyw\n"
  },
  {
    "path": "config/mainnet/chain/params/offer_binary",
    "content": "mmx18rcdx8nhh56twmr2gq3h22kwj00slsn23ejan8qp00rqqw8yl4jq6ccysq\n"
  },
  {
    "path": "config/mainnet/chain/params/plot_binary",
    "content": "mmx19pv69aafsdjrzg8fe7aj2svgx2kwq72dqm5lj36m5h4vmmhcuj8qn9pn8y\n"
  },
  {
    "path": "config/mainnet/chain/params/plot_nft_binary",
    "content": "mmx1cw4nwrhceunjd82tdcauy8yeg8ccygsrx3r4kzr8v35prv482qvqdvz80z\n"
  },
  {
    "path": "config/mainnet/chain/params/relay_binary",
    "content": "mmx199hvcn9fzr5r9wx9jd4ppzgnerqtt0kfg6c3cgz674y60sw7kwnqznlqvp\n"
  },
  {
    "path": "config/mainnet/chain/params/swap_binary",
    "content": "mmx15qd3lrqm7d7jyqx3rrwqav09n8sq2xlwpehq9ydxfn8peyh367lsxfsfqd\n"
  },
  {
    "path": "config/mainnet/chain/params/template_binary",
    "content": "mmx18z4ts7p5437st05zw0pl4geprzm5wt8ssvcd4t2jfkdfq4k6xc2qwc2dwy\n"
  },
  {
    "path": "config/mainnet/chain/params/time_lock_binary",
    "content": "mmx1g9h53asl8ekmp38ejr2kpuumxz3mw5w2yth6cyvj6qjuaa4aaa3sqm5lc2\n"
  },
  {
    "path": "config/mainnet/chain/params/token_binary",
    "content": "mmx17pzl9cgmesyjur7rvvev70fx7f55rvyv7549cvrtf7chjml4qh4sryu9yl\n"
  },
  {
    "path": "config/mainnet/chain/params.json",
    "content": "{\n\t\"port\": 11337,\n\t\"network\": \"mainnet\",\n\t\"plot_filter\": 4,\n\t\"post_filter\": 10,\n\t\"min_ksize\": 29,\n\t\"infuse_delay\": 1,\n\t\"challenge_delay\": 6,\n\t\"challenge_interval\": 256,\n\t\"commit_delay\": 24,\n\t\"avg_proof_count\": 4,\n\t\"max_proof_count\": 20,\n\t\"max_validators\": 33,\n\t\"vdf_segment_size\": 250000,\n\t\"min_reward\": 500000,\n\t\"min_txfee\": 20000,\n\t\"min_txfee_io\": 10000,\n\t\"min_txfee_sign\": 10000,\n\t\"min_txfee_memo\": 5000,\n\t\"min_txfee_exec\": 10000,\n\t\"min_txfee_deploy\": 20000,\n\t\"min_txfee_depend\": 10000,\n\t\"min_txfee_byte\": 100,\n\t\"min_txfee_read\": 2000,\n\t\"min_txfee_read_kbyte\": 2000,\n\t\"max_block_size\":  250000000,\n\t\"max_block_cost\": 1000000000,\n\t\"max_tx_cost\":      25000000,\n\t\"max_rcall_depth\": 3,\n\t\"max_rcall_width\": 5,\n\t\"min_fee_ratio\": [1, 2, 3, 5, 10],\n\t\"initial_time_diff\":  600,\n\t\"initial_space_diff\": 100,\n\t\"initial_time_stamp\": 1737119420000,\n\t\"time_diff_divider\": 100,\n\t\"time_diff_constant\": 1000000,\n\t\"space_diff_constant\": 100000000000,\n\t\"vdf_reward\": 200000,\n\t\"vdf_reward_interval\": 20,\n\t\"reward_adjust_div\": 100,\n\t\"reward_adjust_interval\": 8640,\n\t\"min_reward_adjust\": 10000,\n\t\"reward_activation\": 10000,\n\t\"transaction_activation\": 20000,\n\t\"fixed_project_reward\": 50000,\n\t\"project_ratio\": {\n\t\t\"value\": 1,\n\t\t\"inverse\": 100\n\t},\n\t\"hardfork1_height\": 1000000\n}\n"
  },
  {
    "path": "config/mainnet/parent",
    "content": "../default/"
  },
  {
    "path": "config/mainnet-rc/Node.json",
    "content": "{\n\t\"mmx_usd_swap_addr\": \"mmx19c86u6ppjcw5cd4ghxzpzpf5zartly0j9q27k7pamavdt4mrg3dq7nujt7\"\n}"
  },
  {
    "path": "config/mainnet-rc/Router.json",
    "content": "{\n\t\"seed_peers\": [\n\t    \"104.157.124.160\",\n\t    \"108.12.226.21\",\n\t    \"109.198.29.98\",\n\t    \"119.6.178.16\",\n\t    \"135.131.174.76\",\n\t    \"141.135.6.172\",\n\t    \"143.177.124.174\",\n\t    \"162.118.7.169\",\n\t    \"162.198.119.188\",\n\t    \"163.58.65.191\",\n\t    \"184.146.2.29\",\n\t    \"184.71.194.234\",\n\t    \"195.239.203.162\",\n\t    \"203.129.18.0\",\n\t    \"212.15.59.91\",\n\t    \"217.198.130.81\",\n\t    \"42.3.123.47\",\n\t    \"46.189.185.59\",\n\t    \"47.253.32.11\",\n\t    \"47.34.208.57\",\n\t    \"49.231.43.170\",\n\t    \"66.231.154.77\",\n\t    \"69.197.174.72\",\n\t    \"70.19.84.129\",\n\t    \"71.227.39.0\",\n\t    \"75.172.49.125\",\n\t    \"76.128.231.98\",\n\t    \"76.232.65.235\",\n\t    \"78.107.240.148\",\n\t    \"78.180.96.7\",\n\t    \"79.104.211.73\",\n\t    \"80.235.212.62\",\n\t    \"82.37.10.82\",\n\t    \"84.215.4.105\",\n\t    \"86.30.69.50\",\n\t    \"87.118.169.200\",\n\t    \"89.242.3.102\",\n\t    \"93.43.225.93\",\n\t    \"94.19.237.176\",\n\t    \"95.105.142.58\",\n\t    \"95.22.80.4\",\n\t    \"95.31.212.141\",\n\t    \"110.164.184.5\",\n\t    \"89.116.184.19\"\n\t]\n}\n"
  },
  {
    "path": "config/mainnet-rc/Wallet.json",
    "content": "{\n\t\"token_whitelist\": [\n\t\t\"mmx1gk9s4xg265yxdujagqzu4tzsy3gygycy3nksr9ux8qxj8hs6zgys4shv5n\"\n\t]\n}\n"
  },
  {
    "path": "config/mainnet-rc/chain/params.json",
    "content": "{\n\t\"port\": 10337,\n\t\"network\": \"mainnet-rc\",\n\t\"plot_filter\": 4,\n\t\"min_ksize\": 26,\n\t\"infuse_delay\": 3,\n\t\"challenge_delay\": 6,\n\t\"challenge_interval\": 256,\n\t\"commit_delay\": 24,\n\t\"proofs_per_height\": 4,\n\t\"max_validators\": 31,\n\t\"vdf_segment_size\": 250000,\n\t\"min_reward\": 500000,\n\t\"min_txfee\": 20000,\n\t\"min_txfee_io\": 10000,\n\t\"min_txfee_sign\": 10000,\n\t\"min_txfee_memo\": 5000,\n\t\"min_txfee_exec\": 10000,\n\t\"min_txfee_deploy\": 20000,\n\t\"min_txfee_byte\": 100,\n\t\"min_txfee_read\": 2000,\n\t\"min_txfee_read_kbyte\": 2000,\n\t\"max_block_size\":  250000000,\n\t\"max_block_cost\": 1000000000,\n\t\"max_tx_cost\":      25000000,\n\t\"min_fee_ratio\": [1, 2, 3, 5, 10],\n\t\"initial_time_diff\":  500,\n\t\"initial_space_diff\": 50,\n\t\"initial_time_stamp\": 1735823207000,\n\t\"time_diff_divider\": 100,\n\t\"time_diff_constant\": 1000000,\n\t\"space_diff_constant\": 100000000000,\n\t\"vdf_reward\": 500000,\n\t\"vdf_reward_interval\": 50,\n\t\"reward_adjust_div\": 100,\n\t\"reward_adjust_interval\": 8640,\n\t\"min_reward_adjust\": 10000,\n\t\"reward_activation\": 50,\n\t\"transaction_activation\": 100,\n\t\"fixed_project_reward\": 50000,\n\t\"project_ratio\": {\n\t\t\"value\": 1,\n\t\t\"inverse\": 100\n\t}\n}\n"
  },
  {
    "path": "config/mainnet-rc/parent",
    "content": "../default/"
  },
  {
    "path": "config/node/.gitkeep",
    "content": ""
  },
  {
    "path": "config/server/HttpServer.json",
    "content": "{\n\t\"num_threads\": 16,\n\t\"deflate_level\": 3,\n\t\"max_connections\": 200,\n\t\"allow_anon_login\": false\n}"
  },
  {
    "path": "config/server/Node.json",
    "content": "{\n\t\"num_threads\": 32,\n\t\"num_api_threads\": 32,\n\t\"max_history\": 10000\n}"
  },
  {
    "path": "config/server/Router.json",
    "content": "{\n\t\"max_connections\": 400\n}"
  },
  {
    "path": "config/server/TimeLord.json",
    "content": "{\n\t\"enable_reward\": false\n}"
  },
  {
    "path": "config/server/wapi_threads",
    "content": "16"
  },
  {
    "path": "config/slave/Node.json",
    "content": "{\n\t\"vdf_slave_mode\": true\n}"
  },
  {
    "path": "config/slave/Router.json",
    "content": "{\n\t\"master_nodes+\": [\n\t\t\"mmx-th-1.mmx.network\",\n\t\t\"mmx-th-2.mmx.network\",\n\t\t\"mmx-us-1.mmx.network\",\n\t\t\"mmx-si-1.mmx.network\"\n\t]\n}"
  },
  {
    "path": "config/slave/farmer",
    "content": "false"
  },
  {
    "path": "config/testnet12/Node.json",
    "content": "{\n\t\"mmx_usd_swap_addr\": \"mmx1uyyxl7xt8ev0sel7fh756kmqmwze0uzqemuz87560s9w5g23vrxqp4c7vy\"\n}"
  },
  {
    "path": "config/testnet12/Router.json",
    "content": "{\n\t\"seed_peers\": [\n\t\t\"69.197.174.72\", \"49.231.43.170\", \"110.164.184.5\", \"89.116.184.19\",\n\t\t\"101.207.207.237\", \"104.157.124.160\", \"108.12.226.21\", \"109.206.144.194\", \"109.248.57.198\", \"109.63.193.28\", \"109.67.149.36\", \"112.193.2.141\", \"114.224.30.147\", \"123.112.214.2\", \"123.185.66.220\", \"125.229.48.110\", \"130.0.220.119\", \"135.131.174.76\", \"141.135.6.172\", \"145.255.12.28\", \"159.2.80.240\", \"162.198.119.188\", \"163.58.65.191\", \"176.106.160.193\", \"178.141.159.36\", \"178.205.93.141\", \"183.166.227.12\", \"184.155.122.12\", \"185.219.109.179\", \"188.134.88.65\", \"188.241.36.166\", \"192.168.1.170\", \"195.14.48.110\", \"195.239.203.162\", \"202.131.84.11\", \"203.118.131.219\", \"203.129.18.0\", \"205.250.162.213\", \"212.15.59.91\", \"220.133.2.109\", \"24.35.254.197\", \"36.62.117.220\", \"38.15.38.26\", \"46.65.247.3\", \"47.253.32.11\", \"47.34.208.57\", \"49.231.43.170\", \"5.12.248.227\", \"62.0.93.190\", \"64.254.187.156\", \"67.172.84.54\", \"68.5.105.231\", \"68.6.175.76\", \"69.127.154.48\", \"69.197.174.72\", \"71.166.51.14\", \"71.183.186.77\", \"71.227.39.0\", \"72.80.216.47\", \"73.196.143.58\", \"73.204.157.123\", \"73.205.40.161\", \"73.51.157.106\", \"75.100.41.233\", \"76.232.65.235\", \"76.76.229.88\", \"78.107.240.148\", \"78.82.157.212\", \"80.235.212.62\", \"84.215.10.74\", \"84.215.4.105\", \"84.215.8.184\", \"84.244.36.203\", \"84.52.158.183\", \"86.30.69.50\", \"87.152.18.128\", \"88.69.241.119\", \"89.45.186.200\", \"92.221.123.123\", \"92.234.41.184\", \"94.27.192.108\", \"94.61.16.125\", \"95.105.142.58\", \"95.22.80.4\", \"95.52.90.167\"\n\t]\n}\n"
  },
  {
    "path": "config/testnet12/Wallet.json",
    "content": "{\n\t\"token_whitelist\": [\n\t\t\"mmx14tmh82zku65h7wsq0hlt0xayzcjznvu8zgdat92lluwrvx9mfupsqenjla\"\n\t]\n}\n"
  },
  {
    "path": "config/testnet12/chain/params.json",
    "content": "{\n\t\"port\": 12342,\n\t\"block_time\": 10,\n\t\"plot_filter\": 4,\n\t\"min_ksize\": 26,\n\t\"infuse_delay\": 3,\n\t\"challenge_delay\": 6,\n\t\"challenge_interval\": 256,\n\t\"commit_delay\": 24,\n\t\"min_vdf_segments\": 1000,\n\t\"num_vdf_segments\": 1500,\n\t\"max_vdf_segments\": 2048,\n\t\"network\": \"testnet12\",\n\t\"vdf_reward\": 10000,\n\t\"min_reward\": 500000,\n\t\"reward_adjust_div\": 50000,\n\t\"min_txfee\": 20000,\n\t\"min_txfee_io\": 10000,\n\t\"min_txfee_sign\": 10000,\n\t\"min_txfee_memo\": 5000,\n\t\"min_txfee_exec\": 10000,\n\t\"min_txfee_deploy\": 20000,\n\t\"min_txfee_byte\": 100,\n\t\"min_txfee_read\": 2000,\n\t\"min_txfee_read_kbyte\": 2000,\n\t\"max_block_size\": 250000000,\n\t\"max_block_cost\": 1000000000,\n\t\"max_tx_cost\":     25000000,\n\t\"min_fee_ratio\": [1, 2, 3, 5, 10],\n\t\"initial_time_diff\":  20000,\n\t\"initial_space_diff\": 10,\n\t\"time_diff_constant\": 10000,\n\t\"space_diff_constant\": 10000000000,\n\t\"virtual_space_constant\": 8108,\n\t\"reward_activation\": 25000,\n\t\"transaction_activation\": 100,\n\t\"fixed_project_reward\": 50000,\n\t\"project_ratio\": {\n\t\t\"value\": 1,\n\t\t\"inverse\": 100\n\t},\n\t\"project_addr\": \"mmx1cvc060jcsk3ywg36c5sm7zmrgth0ex7wp9s7jxvh4kgjgy2c90ss46rhwp\"\n}\n"
  },
  {
    "path": "config/testnet12/parent",
    "content": "../default/"
  },
  {
    "path": "config/testnet13/Router.json",
    "content": "{\n\t\"min_sync_peers\": 1,\n\t\"seed_peers\": [\n\t    \"104.157.124.160\",\n\t    \"108.12.226.21\",\n\t    \"109.198.29.98\",\n\t    \"119.6.178.16\",\n\t    \"135.131.174.76\",\n\t    \"141.135.6.172\",\n\t    \"143.177.124.174\",\n\t    \"162.118.7.169\",\n\t    \"162.198.119.188\",\n\t    \"163.58.65.191\",\n\t    \"184.146.2.29\",\n\t    \"184.71.194.234\",\n\t    \"195.239.203.162\",\n\t    \"203.129.18.0\",\n\t    \"212.15.59.91\",\n\t    \"217.198.130.81\",\n\t    \"42.3.123.47\",\n\t    \"46.189.185.59\",\n\t    \"47.253.32.11\",\n\t    \"47.34.208.57\",\n\t    \"49.231.43.170\",\n\t    \"66.231.154.77\",\n\t    \"69.197.174.72\",\n\t    \"70.19.84.129\",\n\t    \"71.227.39.0\",\n\t    \"75.172.49.125\",\n\t    \"76.128.231.98\",\n\t    \"76.232.65.235\",\n\t    \"78.107.240.148\",\n\t    \"78.180.96.7\",\n\t    \"79.104.211.73\",\n\t    \"80.235.212.62\",\n\t    \"82.37.10.82\",\n\t    \"84.215.4.105\",\n\t    \"86.30.69.50\",\n\t    \"87.118.169.200\",\n\t    \"89.242.3.102\",\n\t    \"93.43.225.93\",\n\t    \"94.19.237.176\",\n\t    \"95.105.142.58\",\n\t    \"95.22.80.4\",\n\t    \"95.31.212.141\",\n\t    \"110.164.184.5\",\n\t    \"89.116.184.19\"\n\t]\n}\n"
  },
  {
    "path": "config/testnet13/chain/params/escrow_binary",
    "content": "mmx1whsrvcreuh086puc4jn7dyaxuhljzpp7eju8cda8xpuf78t74n3sjctwxw\n"
  },
  {
    "path": "config/testnet13/chain/params/nft_binary",
    "content": "mmx1hzp7su7e62c0ax9feyp0ef2rmdfx93xc7hu32xnhspqsrjehy5rs9fwfh2\n"
  },
  {
    "path": "config/testnet13/chain/params/offer_binary",
    "content": "mmx1egu9gtwwg0tg7vk6x5huup5kx830e6588w8qu7kexj7ememg2mgq9xxe3d\n"
  },
  {
    "path": "config/testnet13/chain/params/plot_nft_binary",
    "content": "mmx1s7xtqedy4aq2wazhdl66pfr0ycrkhvj9460zfqgtpt5cmaa3weescvuavg\n"
  },
  {
    "path": "config/testnet13/chain/params/relay_binary",
    "content": "mmx1wx2z0d8626mjweez8j5um0zdfu3uwuvg2tg7fvuxfcezvk9qmets6hac84\n"
  },
  {
    "path": "config/testnet13/chain/params/swap_binary",
    "content": "mmx1jllzzps6vdc43p7pnst3zn390p3g0c2gf8ckl5fe0eaf5yr70mms8663ya\n"
  },
  {
    "path": "config/testnet13/chain/params/template_binary",
    "content": "mmx1dmw9j67xsw50n9ax02u6khr64km84tmly35sjwz6ra9jakvav6dqqsn23k\n"
  },
  {
    "path": "config/testnet13/chain/params/time_lock_binary",
    "content": "mmx1m4gxzmwu7gthp7kl50v34yx555mejmkwaxcy36jy39k0kcxt32xqhznyqv\n"
  },
  {
    "path": "config/testnet13/chain/params/token_binary",
    "content": "mmx1xeuf6m70xk3n208qn5yncsnfunexg0862vhk9z9c479fs0axgvgsqdgexm\n"
  },
  {
    "path": "config/testnet13/chain/params.json",
    "content": "{\n\t\"port\": 12343,\n\t\"network\": \"testnet13\",\n\t\"plot_filter\": 4,\n\t\"post_filter\": 10,\n\t\"min_ksize\": 26,\n\t\"infuse_delay\": 1,\n\t\"challenge_delay\": 6,\n\t\"challenge_interval\": 256,\n\t\"commit_delay\": 24,\n\t\"avg_proof_count\": 4,\n\t\"max_proof_count\": 20,\n\t\"max_validators\": 33,\n\t\"vdf_segment_size\": 250000,\n\t\"min_reward\": 500000,\n\t\"min_txfee\": 20000,\n\t\"min_txfee_io\": 10000,\n\t\"min_txfee_sign\": 10000,\n\t\"min_txfee_memo\": 5000,\n\t\"min_txfee_exec\": 10000,\n\t\"min_txfee_deploy\": 20000,\n\t\"min_txfee_depend\": 10000,\n\t\"min_txfee_byte\": 100,\n\t\"min_txfee_read\": 2000,\n\t\"min_txfee_read_kbyte\": 2000,\n\t\"max_block_size\":  250000000,\n\t\"max_block_cost\": 1000000000,\n\t\"max_tx_cost\":      25000000,\n\t\"max_rcall_depth\": 3,\n\t\"max_rcall_width\": 5,\n\t\"min_fee_ratio\": [1, 2, 3, 5, 10],\n\t\"initial_time_diff\":  500,\n\t\"initial_space_diff\": 10,\n\t\"initial_time_stamp\": 1739216249000,\n\t\"time_diff_divider\": 100,\n\t\"time_diff_constant\": 1000000,\n\t\"space_diff_constant\": 100000000000,\n\t\"vdf_reward\": 200000,\n\t\"vdf_reward_interval\": 20,\n\t\"reward_adjust_div\": 100,\n\t\"reward_adjust_interval\": 8640,\n\t\"min_reward_adjust\": 10000,\n\t\"reward_activation\": 10000,\n\t\"transaction_activation\": 20000,\n\t\"fixed_project_reward\": 50000,\n\t\"project_ratio\": {\n\t\t\"value\": 1,\n\t\t\"inverse\": 100\n\t},\n\t\"hardfork1_height\": 100\n}\n"
  },
  {
    "path": "config/testnet13/parent",
    "content": "../default/"
  },
  {
    "path": "config/timelord/Proxy.json",
    "content": "{\n\t\"export_list\": [\"vnx.log_out\"]\n}"
  },
  {
    "path": "config/wallet/Proxy.json",
    "content": "{\n\t\"import_list\": [\"node.verified_blocks\"],\n\t\"export_list\": [\"vnx.log_out\"]\n}"
  },
  {
    "path": "data/mainnet/project_relay.json",
    "content": "{\n\t\"__type\": \"mmx.contract.Executable\",\n\t\"name\": \"Project Reward Relay\",\n\t\"binary\": \"mmx199hvcn9fzr5r9wx9jd4ppzgnerqtt0kfg6c3cgz674y60sw7kwnqznlqvp\",\n\t\"init_args\": [\"mmx1phzvhfh0ausam098r863hnkeqlulp7hxfte67czm86m5kmck7avsyaxgyh\"]\n}"
  },
  {
    "path": "data/mainnet/tx_testnet_rewards.json",
    "content": "{\n  \"__type\": \"mmx.Transaction\",\n  \"id\": \"F07579B58CACA3CBF7EB9A3BE2BFCB40D8EEAAFAAD1673504AA81B78D1D66D2D\",\n  \"version\": 0,\n  \"expires\": 4294967295,\n  \"fee_ratio\": 1024,\n  \"static_cost\": 0,\n  \"max_fee_amount\": 0,\n  \"note\": 0,\n  \"nonce\": 11337,\n  \"network\": \"mainnet\",\n  \"sender\": null,\n  \"inputs\": [],\n  \"outputs\": [{\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17dhvxq6fekkfqtvjwle2pwcyr6f76uhz3vsq6ldkc9r0uzs7nrpqvzh7zs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"147412500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1eavt4k3qfgc30z5wqtk99f93fq8xhtr82f47v6r9xd266njaqwgs56207d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"142434000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"112554500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1t49g9vz555dcm6dvrxt9hxua58jf57w5rmnjnaynnclww8lmagdqc76mnv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"96715500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"96108500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"85596000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"78844500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n39pyuyq8slux6rcrvpyfqr554tcytn7nfrmwjetkkryeww59fxsf8qvm3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"58679500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx155480tuk2thf5sqkkgft54hmuafu0mj48gql8fdxdvl08guut6mqvy5sc7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"51981000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1keg2775ll23shtjh235tw9g7lu3wj5rj50ws62vnwv89p9vd07zqwswcn8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"51854000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1w7dfqwgrq4v8uyg2kpcda5ec44hnvdeww48zysxue2mttd04tz8qdpt88v\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"49492500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uh4qtgqkndrp78xx4qp26dwu4wxmqe8h964n9kte83sq8h7ckrvq45zn3d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"47925500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1z9yl7zqwrfje5kc6j33kenvpxcyn6jztq8aq0h85kf6r8e0d9p0sumlzp7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"42749500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12wn9qtfzagz6z6ztxld2hka8cgvwr0nz55l3qjvkg0ayhhjvlscst4phad\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"39617000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"37394000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16qquaqrzyks7qpq0wv3mz4j3gdk5c0ltnutnurun8ars8s2jszqsj3wzt4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"36525000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12kjff7s048w38dpcmhelf3f2vt3ul77hrdze97fxr9mhgrw2lvmqnandaf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"36007500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1l3g7hjrczlhsvnshj4jtccavmrrm9chue6ha29hmdua6392mtffq2ddd66\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"34055000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"31511000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ff5rqk4myqr32axrt500v0rh0cjp66uh5y0q7r4ed9xy63c954dq3ea3rv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"30451000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ymnr2tt7vzcklrk97n2phwz96t2t2au64mjqw58efz2aatkex02qryjcxm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"30404000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1elqhr769rul729fampn6u3ylcxfprr6zgvvndppkzkzzmaefk6csr0s5e2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"29701000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ddxwuakc6p0mp4yzx3e9rzt6d6xtkvlvfmqnz6nx0umd2y9kc94qsyt8pe\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"29456500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10lrzsfeam8m8lmrxnhzd2zn4kahtkmnthd0nhytstw52s92d0wdq7x0824\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"29443000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"29008440000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1apz53l6jeqzdtwxry627f2rpagmjwsj42d93ca8jtwcdtht037cq9fsqhm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"27208500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"27103500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"25697500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"24194500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"24082500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"22125500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1036ucmxlqgrwmcuuheau33k0h93u0wurkxznvsl7zqgej2x2rauqaktwxw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"20850500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rlanqjxk03n363dxgqfek0390p6pfdflm4vnf5d25kp8rxd7lg5q3sf3xf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"19422500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15fpxwx7ah2d8wa0sknq05gplj90xpxf0xknweszyhdd0eacp4yfq2e43z2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"19268000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1eaxnhktjt4yegapquud644nfkryfyarth7lwdxwdedg8xhhdlxescdxp0q\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"18335500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e83q59e5gy528v9j68ewnhpgkwkdpt47y03ev9a3y5ma5plsyrqqru2dw4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"18329000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jpfmyh0ndxwz47t3d6xrdlkd0mq3nckuasn8elvjfa65xtzm2j8qamxfuw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"18051500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"17674500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mlj7rhkg5c4gp3w4k8dlck5tyf5493dce5vx3x4m4qpzn7ty8mtq6ek2jc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"17621000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"16879500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1seel6072m4ywm84s0e283gl34drku8p764x7qmw2ae24pvsa6crs6eptk7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"16847000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1w7jnglje4j85z4dv4z6gpmwagqfcgpg7nq7dh6wu98qq7ckd7umsdq9hn8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"16791000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"16645000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16kkntt0k2spk2xvxlswtwf40p02vlj97cenyvzca58ad8uav68lqfkkh9w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"15854000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"15080000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10nfcaxrj93rjxxx3us3mwzajznj8qpcd5vg459yfkk8lg90jqq9qxry935\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14819500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pstmxwmdgkyzqqll6sdu5vdxpkm82ya4tz78w8n2yq4pdcdz39eq3uwvw5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14707000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15cf5205juyar33ugp9qkh4e5ne9n0ylvnyg0uf6uyymd3tgzhc0sm47jfs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14642000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xcalpv2gy0k955p6pl97ayzrycmvrplu9cufx6dfctwrwd9uvpaqypgjxf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14622000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kezjxhxk8hxk0877hsfzr93p297xqp6ga2jrgptw52fa386gy7jqs6pz57\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14541000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vc3s0rqlmy7hrw0wr5mjfzgqx70senjwnp289x6syu9r0m58zvmsk2jl6j\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14163000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1urhh0ud9hrdzf2x4883wg7mgqe2fztfcnjehxz6kqujve3hn37gsn3f8qr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13817000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fdscrht596p4daxkpzfunczjmurs66j65u5lc3a4q0l99k7h2ayqdvrfnq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13756000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13737500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13280500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"12967000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kas9v36hhw4rzac60heh2uy9kf0wx7ed39fvhtlzqwhmr7udkl9qlxwys2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"12738000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18zjss5ccnhyskugrwlxuy935zn3vz7ns6gyqg2cj8f3r99av9mhsck4ne0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"11854500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16d3ry985fdkgpvj93xygv0tn2wc9ylpex6t08qz0x6lat9km6dmstdhdhh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"11843500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1da455czfvskaeewg4prqrcysxuzm0x5kgsge3fxafz3e6ddmvppqpyg796\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"11696000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1p76tw7re288zm3avlruq0v2h38feqe2usscg6cdcfwn3f8cs5ejsjkev6x\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"11579500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15098ny3pc66kn6sgr6t8jehvwf2yzcxm6lxljvr7dfxs3g4u5plssgudwl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"11166000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n833p7z44rd62g0yvhlua8sv3d8wmyvrt720utk7x4vxwc3j72hqst6yh4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10763000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1f4g8tdak9nw2waf5v4g8skt6gqqpnnlvxhx0y5vjkm0myv97svhstqzhm5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10640000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fqfjglclexnmhlmr5lvwhqm9x6dqvm8cnsr4dpn4ysl5uzfcdwhss0xtp4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10628000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10327000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx183ajctzcp95lcx2zztjk58gytyzmrlsdljna6lhedqj7h3jn04aqu3snsd\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10208500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1wcmc5n7v8eujvlzrtuga6fcfmk4d9yjcdhs0fmgenyrt6ycynjdqa6hh0w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10039000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"9640000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"9570000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17gtsl3areyr6g7xscq67jl2xcnz56ekkk9stxvx3qev7hhez3ccs3juqvl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"9109500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"9071500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8796000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8690000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cv94kw4ttqwzyluzql2cc4trx5mze52qx8ys2pkd7jqg2yp6wzcq0lxaef\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8663500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8444000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1478snw4amjfq0hnhpwl8de8yup2thh5f5uzmyu5g907az5sv6fpsuwfrma\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8120000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8004500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gg6twfxusn0xlnnzzfju53zzwjecm6jkr5r936favpxcjz9d8r6sp3spdn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7984500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7884000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7870000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qpyq03vzht2uwf9pzadx3rpa8w8y7pul2he0r5y3497j29ul7x3q7ac26j\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7811000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7796500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1dwr96cxjzyc6532h2gjagegkm58ns4fdrwj6muhccgxn5ysuqg5qn9mzn6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7771500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1l5dwydjks9s84n3rr52nwggsxfnrf65me7tjnwerse7xxn868ulqfmwwyg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7608500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kvyj70vfnwjwg6je8tf3dunrwrafy9mlm2wtgqx95vwgnz2mrfcskpydtk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7575500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1re75j8gejzdje5afrkdsl9xknheax4ymznewazk5jqy4msarp05qz7qqsp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7559000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ff4lyf7ulfrwt0wfnr6dtpuk6tv0w522ef3pkm5ax8e9wv8crd3qe0a7re\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7488500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lty50fwzq0wxaxwzxgjzt7y3r3mhn08eccs5ntz3y4sahd5jfxssnz6qzz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7483000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7439500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n36ek4z7vprh7xucnje6p5sr4s9mtr0ml9a3wz6xd2kp5v3hunasjn35t6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7326500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kl3y0kz6jx5w0vxrcx9afkzthe88syuge0ytumakkce4nu969uhqdtj9hu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7189000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7069000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7062500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1m96tljuk8yjc9xwu4q2awulg8hrgpg0jp6d9al5dm7r2hue2u8ysphwe0u\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7052000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hm7d3gpykrggjrt5ckm987xdqkvtqrhac05rzz4e5gjg8m5hxmpqgcvv0s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6902000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kkq8ezuwsast9zplk8ec0pa0me6u3wydkrg5jn5daycgppy63y7s9y0up7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6896000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6863000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1grhexfxkzq9js7t6595mzcnpady60mjuph254rtef25j8x074pzs6s249e\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6835500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18gzhlxuaafa5rqxlyrzn8n6ldud65ynm5tujhc0ql87f9myx5musf6wuje\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6779000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rw4n2d4a3mrve8kfwuc8gvqnszd9m68lkqsum0dzk4j4ztlq2jpqrtcpy9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6648500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6613000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17grsj5sq8z9h02gnl92mpkajy6janxcnrcrg6mm3w5l232tx8j9sufzatk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6496000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6445500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6334500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1yc5f9qcevne2cnp86szf4nnpaxj5kns2nzsx8jgg3ssal39k0cqsrsaepl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6330000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1j3p8gtyajzh07ag8cv2y776h7axrwhvppckxxtltelz08dsaxfxqg6vlwr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6289500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nxd6hsaywy69qzx0yktv2v08yskmmq88nfy3l0shgfsp2mpr38cqx89xwm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6205500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qnh3zw2utltxdu9mut6atp326nujr6pmxxhtryn7lq089kv360dq64mj2w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6187500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6077500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5985000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ju6l29nxdkdapu9cqk8jf0nhvqc2qjzkecft4ysdtdd030ma8spqh0k5wh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5790500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zm2yrzm79wn8lt7uhvaxjy0mcezkxdjujcru9fwnwczl3y5r4hls79m9l2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5748000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1j7ns20cea2havm328p28vxeyfdcv0yrhndl2h8735slc4u0q3fls6dz77y\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5700000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q8d78sjm37uz4pps54q0mn4w3yjesr9jg2pprgww6mmput9rg2jqudrwzl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5687500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16pnkxxv9mu42n7t4pte95ftduqz9ntrdd6u5epqnj5mkdn249wgsmkm77g\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5677000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1afht99ekwmgh9s9h043aygvtl8tmytx7ymgavn6lkdxxczrgjsmsqcx3je\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5657000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5543000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx129hgzhuh484dtlgz7y2r4dmc64hqzn4680z4dg8qq2gtwymfm3ksl283x6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5522000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hl8lnr4ddyyqynx5qj5psv63ah7atfrt67s9eszlck5dy5yy9aysylv93p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5495500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5414500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5403000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5278500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5254000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1guajyf4849dkedxpj2aqevkuc9a3u37fmg4hyqzmk4l02n37tfrsygnc5y\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5242000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5228500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5197000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1f3ecr58txvmxjrlhnx3nw0wg7y7zdef73gcgjfrvcf8lgrdu3czsn4yx6z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5046500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5035000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rp6q7eh4zye6494jpq9j6ft69ku2lqqlx363d4z7zspv7wqfqk2skevrl2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5033000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1shw36ys05ppa2jn68qy5s7jl5kzy050rqdk4pz8catr2wadnadmqh275ry\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4981000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4943000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4928500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1a2ytmujh3evrw2r8ljq6alul6drzqlrpa64ae9f5xp38kecen3hqcruxkg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4914000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12amu3muxtrrr54qkd6wr7xtawh2lare2aqptywufhl24rex2u94qzl4tgl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4887000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tpyah2lre4lsclru42p8zqanwfukpu9n909p6pyrvlcd4mk0dr9ssahxe8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4885000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1y0ream3up46cckzxl5tj0djvj7numxvrs2staw8zld5297xugz9szhfpq0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4876000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fheacy3c48nkd0vgukeuqtldfzuxh2qhudhytshgctqe7sek25jqv99qqt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4865000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qm7k9w4qmnqc2gufp59g6hypfx9gcvpnz5e0j25a66e4vhnztmyqn04u69\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4832500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pv4hhmymzfvyn4my5vpptp9rdqx9ex6y60y63tgaxre05f3v99vsq7uvz9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4741000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ks9t2rksthddy00395l48vaqc9rmjuznw0gyuta0jxpkzsce44qs3at8x4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4732000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lghunzj070ysr4hd2alsujacc26t99zl3cv5qm03ttjaq4ugmvaqqfy920\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4666500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1r0e4s9r8jqvuvznv3vd5k4pfa5ahzgyn6lrgchwu4mpqlzgsx8mselfar7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4664000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1aa7hmgy7dhsmkhsscp8vlk4y48jyntq0zndsd4lvn4ht0nrjk3vqrtn5mx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4656000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4654500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19zerahkctf5hxcrtdh2j5xjynl398ge4avn9nl4zsqw2hs9qe7csjqevda\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4632000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4623500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ywen6qnhge46fhjqwxtnyapckkakzv5m7gz8339j0kzkvzeev4fsex4z9j\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4591000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uj0qhzeguf0zayyg2m9z794nrdlk7y7pnprt4w798s5yezgxgvuslzd94k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4580500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1v2c3pk23x788qwmhh8dexn6mc94an2l3tgj4kp9th0ygz46997nq6xalyy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4499500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1u9lr65e2v62cht733pjlz5dctk7esxmwaxwjew2xytr7gqgmtnuq3x22cc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4465500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1wnkyn2ma6l2nnk80y44nrsqf9fdh27gtx60v3sdxvd9uzheruwfs5kf23g\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4413000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cvga7mz30hh2dnutxpaupdfr4kflug45g695vke7jmnl2kj6jfhs70rvcr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4402500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qqjqmgyqws0jk04frzf4e98ydd3pkcsfyv65g2t3lgnp9t8z4afq0kqpst\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4385500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4365000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4357500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q3eh75hak0v9f9psa365zjypz62q8d0cwv2qrpwpj2hayfn6xfvq747gj4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4352500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4345000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15tfvs7twvmtvpp4zvgpedz4suysu4fa88zuzjyj2yjrkpscme9msaye6tc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4242500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1c0lcld738xys6rmr0wfyrtgpcvcm8szcst7w9c6cawgmpme6nh6sgtq35u\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4235500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e3rlxd6da547vjhdswqp05z6tzx50afnmytanvjsuulmmd36yhcs4e6pp3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4217000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10ew79lhecezg2ewrj8l8egjtwmkffvs2jfl8rdgxy32arecyp5xqdryl8y\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4193500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rs0lu6yh5uhp3pa8tl3dwz5ts392ua52kx5v3p8h5jrd0x68g8yqc6usm5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4183500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1sp3fn6wkhmsum7jjspvdnj4696wyqc2jx7deaqpxtznus65jr05sg5pmu4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4138000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1s4pkkycenn7e0g0y4c3sz2yrkld7m98mlm8mc67y7lj4trw5se2qy4eq5z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4124000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d39vgf387ct682mq7ua9vlxpjs8w47ennw69wp05atf65stht9wq5hkxpd\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4111000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14xms6j4un330ca6y09r8ffag0d9gsw6dgka97c82k32d0qtkuu0svjvmgs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4072500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10ewttsgpc2vq980wlk0ddtc505vp5edvusl8a388y76peautetfsyj3ej7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4054500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18dkl69sxx3wz5u69s59lp9d02qj6czg8h6yv3fzzfk7d2f2dqtas9dls85\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4025500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19zr02kj3reljd7fz6lrpwdqep9s2rah2nkcwtm77yxl3ja4sqvcqdxt8gf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3996000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx109nvzs3vhyjqm3l7g72fqdxyh465fedk4xjvy2rnhfmgrw5l8c4sex2mej\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3958000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mlurm4px73xghkdn02u60qff4f795nnmt04e4as595tf4luvasmsggxmfk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3924500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3922500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mylh2r9352klltxhjqpfj5jnfll6uqfeqp7xunarlg9cqufrhjvs28jrt3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3903000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1as0ezwhva4ch25cssuzrv8hr2vk4fyt8ycefdtx7dnwt5rgadcps7ezzc4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3898000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n5w0atjthl70cnj3zll4ku3jl2w7cut8peqdkt04ck9annew2mfss5uu88\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3857500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1drdacsxd6ssaa44mauseapmf9cm0f8nah6tqpnw5hzs5r7vntafqqzqwzy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3792000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1v35z3r8m5aenzfv9gjx0wcuk9zj5qu98asrr9qa868zrq7qncssq0lsclj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3790000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kq7xc88lghdv0mu62585fck3ppnlmdxn3jwvhqpks73wc8vwc82sqzyhjq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3689500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1l3p8ljlzzs2kzr2d992wmj6ru5t95azef4cfnp289zgezfppg34ss5pch4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3664500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ed9e542ggt95rk3ygc3xt29apzs2fsx384mwhqqwy30qs4wdhqgs9qh33j\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3664000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ujghjem0z63dnwrwa8tnswgn8uf2nn8gx26seg4te50wpfjw94pqjhktte\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3654500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1eztxn269lt6rfy0kzkrv9ra79su4ujrua0ukxjxktdgf4zdqnaqsu3xfqg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3654000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10g3yj722j7psxapmpcusn3atzd2fd5r8pq5s9wmdszxweefexm0qzyjazd\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3644000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3581000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1z66g30cq7j7apzf29zmdsu28m5vrqw9x8m9jh2a3vddrxz7fsqcsh4gv0w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3522000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1u4m0jmxu7avg5am34pjw3g9lwqys7vcfp6ah53w60626rywvrs4sjzl660\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3486000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3207500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1j6nsqqj2g4cvdgf3r3y7e5f3wwvgyu6gh0e579xd2jsn0garhruqft7myr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3189000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15n95rxf5c58taud2x06sgpldy3mazdyf2lf8cemmezp83hc5nzvqp3l3vr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3146000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pdlh0rj93akpwww8apmpfj5awd08ew8c7c8ce4lk2cfehypgj6js7a2eeh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3117000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ygz7gwf3at3409ggncyfpsyp6cn0ralc4dhezcnkzsxly07x0tgs759304\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3091500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mcsgnk9wd5wgausw8se9d50gv2m0dk0x8gg658xy76cnuegl850sklk8p9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3091500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3076500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3073000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tdzqj2k7uw97ta3x459s7mk5jt2uh6p8znxl7f7u38davexzk3xs6tktrp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3051500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx143jvevjx827ac7xrc7zx59a3hwd8nvu52khqa4365dk8ct3zff0q2ee25l\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2962000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xm27rmtx3l7a00laujl97484grv5xqhrled5q7e3awlerfhe32yscwur2z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2934500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2912500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15m60pxy8mjp03mmtf9aq8kajmrt8vrzltj8epytnsucts50fh03qhw98ql\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2903000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hvdake6jsnu5qa92un6ucw70jsa89athx8egx7507eqjk3s9ujvsmzmgd4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2902500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qn07jmdsetg4k8gqvn3wmv9kqkrhrsvrmlc547zslku4grlunw9qqllens\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2881500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1j5qsf0gulds6ll7mm8aygj9xu52qhcaamadzak5k4c3smx9lajksjyvyzx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2874000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pj0uu0lna9r8rgw8ccn4nj4kudgwxchv4l0tjqpw2x97035a2v4qdye8a5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2871500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1prxda0yejv5m4h6y4pgkzmutaxrd96zsnqss6aq5az6609dzatmq5jnv0e\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2855500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2848500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ml4nf4gxrz7yc2uymnu6xdx2ssev2q6696ar90pyz72fgp8vxj7s472hym\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2824500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10px4lhql09zw5nlgn8m062d8zw0j6f75acpf000grqxsma5sg0qqj2d7ns\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2823000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mjax0p84wdxsfdffhm5tu5fg3alt3zvam683qk0zu4jh6jredj4qqz6kk0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2794000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1na96yskrphrrswsg8rwe0e0gwpy4n360t37u6guxwa42a26wqa4sqpfm9s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2780000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19jlhmuspu5xz706c63vheckjl6z7qx9ne5rg9r7c2tq4vj8rt9aqj60yvy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2772000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q65hf2l3zdkl5hgvl38syuul0q0nlnt0pn69nqf7euqmxqelqwlq8eskrq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2745000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1duvwvwf66cepnsng596tkjazant9t44v6fw7qv3umc05ehqcfmyszvzdu9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2649500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16y2cjvyxtwgkm5m0x2wy40g2lc59qcept4dqjakfygwghhxnsx4q5cg5xl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2639000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10a32q2xtl4pvm2trnjf8cgyswuyywg4allvc7j5pakau4adcdcnsvmsr0u\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2624500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kjc5re76v4htwy0393zxnut5jcutlewywd5udfgh6l4xh5ya3xps8sv4g3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2623000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ehmcg3t88xt37498wtca2geh2r0v2tzlzagk2jp5stc3heey0vesjefjzh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2604500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1aeaukjyxfu6gk38swf6s29jrswc67nkra3n3wy5wsxt2fqmvknqq44kzkn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2589000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d3vplkcw0pjqrpfr3cesjmvslk30p8qxhky5l4gdslclu70tql0qdqp9dn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2565000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1r2wcfugp9ugm44z03eed4ad0t5qhvg8ufc3p7pu40r7l5dkjurfquuahjs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2533500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13xgvpxumznaqj5mkhxc493nzhc2kf9w3ks9z99eaznesjrsln0eqgwclyq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2485000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15hfmkxyxttvpt36w04e0h3sdgr5r25869jpxehj4h6mrt66kppvqp9npnm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2468500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ye76l4yxct7a2842mqa8vcf4q3jqryksu3s6xqvj3qdlaq47es6s2nt552\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2461500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2448000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1js6nrvnl94rcgn8k80dx6uz2da2jj64utkrxqhmvcvuescmrpwwsvh2vna\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2433500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qq2w4yktpymxyhxck2s0z0grp8tlh2l5evsceycvx9af0x3xxhysd536em\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2429500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tluhal45404w3qcd59uw08lwf28vq3hhmvvd9andxhjgumajl8rqk3jjd9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2421500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2412000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2402350000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kklq024f8w5p3963qd3ac3dz4a03l8g5ejnhqwqgqg0eq0p77hnqmzjuut\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2391000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1u7me3rp6kmfs57wzytrxjh843sypnl0l27unk0c2pzkuuhjhy03qfwcyqf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2383000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fxxkthhcqf9ryfljy8xr9dcw4nq9q6mfetxx0dyqwq7qkv4vf4lql4qzgx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2358000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1veepntjet7j6lw2sfx4p9e05day63l65wj2pa7g7cu6rusyzru2qktg3rn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2322500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nh05jetwxuhj79j9k4wx6ujsamseykk84383jtmfcpzu2f2hz4wqj4e25c\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2297000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15wphyfczn8lvfmj28gkhsneg8gserwef8ergm9dxm03ngy8adnys2ypvdm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2280500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2218000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2214500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18h89t0y9m8cy8trcveul508ju6v3tnajz2hrhvcs8rm8pn23djesml7auc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2198500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2196500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19tp63ptrre654er8rkx5ntgt4z048tutqx4yplu7daxwm2tgk2gq8hp85z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2187500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e2md0mf5cu5uxmme0hxt4apxg9nd7elstzcr7v393nxmgm0rvryqlr557x\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2152500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2149000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2144500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cl8r0pfpp2q8fmg2jjk52q8dvhnmf26vx0wwms00ty8xl4snhf3sg65sm2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2140000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nwdefg4c7dq34hhvykfzl2um6d6phkfqh22pg5d2q8nderf78n7suz5x6m\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2107500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1x40j0p3ss44jghrx2t0yqr9gqcr36xx9pjss4vvxwj60gkfvg2yqauewfw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2092500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx136s9temfus3xkgz3ftwqkrg3kpw3nr67088u2ckhkfvazqknycdqe09z9d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2071000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lsgrc4ea32dg8zm35yg49a9xzanjav88wdvtvfgu28s92alec5sscmwzm0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2071000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1krwuwd0xfqxq59rhnglkkduxw8wzq39axh99vtqsy0k6tnac0zcsw7fhj4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2069000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17l3xstvyx5rqxzqvswwvf27zz38ckt5q2030selhwe4elqzwe4hscxf06z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2064000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1l0hpmq7hfw4l5y6hfrer0xc980a3mhazzyc82eycvjaugj2d6sgqn349gp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2063000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10vl3ux6k9680dmv3fv6e2c3d2yamrlveshxfvnemlv2tlhxan8fsw5vq30\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2034500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2005500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16h8zlf572dedtskx0krrajcrt6d86s0kgukd4rnm7ae9v8tmnvmqhqmdca\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1997500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xr8hes0tgn95zf7y9zx6x649t84t5c4zas0cyf048rve723u9gaskvfmvc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1992000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lc7g4gueljhtkf7ffd3l0x747d8j9gk0z88e58zd9l6f7vh73mgsuzjvx3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1923500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n0hnw7qmwehhsz4qf576s0sv5ql6kyq9afgrgmuzzwzfr03ld82q0ta37g\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1923000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xthtx2n39nvvjrrkfpshq2v6hltn82h36dnxyg942h6drj2q6snsxx32gu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1912000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx139dxs6z0y9pgp2z4f9lhx8mczfhl6fenrlcpwefv8t7eklktwqzscw26ns\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1902000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1891000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mzq54zkhcrww85glxx6kaqeeeeqckrwy0j9d377epmh7vrrssxsq8fel5y\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1870000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1837000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1815500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18d8335fhancnvy2zs5wsq8gvcp0l57n3pejex92ndg6s6s3casaqalq6hf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1810000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12uthvnq3g2af96lc3un900pd2tyy8apf0fsqag68d7fxene639tsacu4zm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1809500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1355xdy9zhgzd8k3grndkwdff9qr8qk8raucr93praws40s27fkrsjlz07p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1804500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1800500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15qatp4v00zymeq92dmz2sfee0twh36n7vutwp4kcjhdktye8zkjsqftneu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1795500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1791000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kft6gj0a0upukl0dy3qlakx0pm4de4538v92l6saa79jsqkswzcqhjtu6e\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1769000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1g9fl4jus2fumcnkw0k8w9df5cln8yukhrk3kzwuzk5rg68ndmjyqftzc4p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1760500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qg6du0mef5nz96gz7wa6f0ndmdhqnen0knwz3kw5ytf4kl9f89eq2kmrsw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1746000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gqsyr45tlv0t2ct76wqpxtd0asjjq5df8etlhdva8wfvt8facy7stqeq6c\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1743000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17gfe96qhqt3ylhxxqj7x6qxjzvt8cen7s4ks6e0mt642dplug4vq652g57\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1739000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gkwel33sdr4tgyfq55az5t5n8fzy3thum3v03jmw3q730ee6ajrs22jkde\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1724500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1g67zee4q9x4wp2s4lkfde4v2m05e90jgn0m42uxw35r22emk3r6qa8ttan\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1715500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18evqre2xyqqzgspaam0sps0avu9xt7llz7t3r9wexelpy8jnws3s0u7sev\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1682500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ahnruulrdycd5dr4xzjyymxgf7yp8n90r437ynysr2gz8n2vmpsqxk3kev\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1680000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qfvy0zcwu0smhdtkkkygyyasjf2eplaurzkq2m2l4ngrnxgy0rpqq8swwy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1671500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1advv0qlzm5l7whwluwdfspmqzwd2k3ra8rgqqvuj0m5hzy5taneqqy7hww\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1669500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uq6ytg6v53lsy525m6352hznumufehsecaugpmyq36vezznyvzusmfpxm2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1626000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xeqvfd5a63j3j7vq287dvrjxyksw628azkn8u53sc6ftd4l8wr9q40v33w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1622000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1umu7rghe9664www8lutl5fa03zv9c2gjwvv4ja9w7540zvnuuxvsyyf63z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1613000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1h9l7sgtnyagj2zctlj0xmmn7275uqpss2dn8funllmgd7aj3auvqv0fy7q\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1611500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1610000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19taynglsa6ewczfug4pds0qy0cwstd600hwzel8y02dtn2k2esyshsxfa9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1604500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uskav6veu3nxfxr4zs6efdk8yth3tuz55zptp56rf62t0ftwy4nqpvarja\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1597000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xv2dztq36sk27x79gdja33zk6lv8cytmjeqkvlux788rd55l6fuq09zq65\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1592500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15spum2ccvkzj5zg32v0qzy9xhhafsa278ujyq20m2yhwq5lpxstq8ghswd\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1590000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10ah956exf9phe4hw9xwkn3a7m3fwxa7pmhr9cyvlq5p84f8yy4fqwkygu8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1576500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1576000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jmhmzwudwu3tlhq048k7nuc0l8lqgs9amtnrg5pc75j6kl6rczzsuqxsnj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1569000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1555000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1f4k5ajf9dv0jfuw28xh9vzhmvuphv92dd8mfxxdzssverwfe9p5qdwgc8k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1544000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx107aackvhak3d2lapgz6qprp9785qfudzrclptqzvgkpzly2ppqtsypk9kk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1506000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13txgtfelvrng6mfjyk84sj74lrl3u7v05wn59659sg7ffup5f8hsl4nhzm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1494500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xr5534k53fk455wylucnrh5ap09da09jcghz7g9jg2jaarss7gesrjhu9j\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1479500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1axrdzlwdpczy66khlgcx6zffrury8z6jxxapeygehz5djt5cpyts2mqw7f\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1470500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12q3pverdv5c465fjeryz5uxnvcjpacnfanynclgq8g5fwj77y9ss2r84v0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1462000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx127sjp7qqmvy2grl0wa675djhjll46pg5rt794cvdp6s0gahg0asqav09gt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1458000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16qstch29gdwqtfadwwta8fd20zrhqy7pgkaud2h3ceeafwjcmz3q2ezr8g\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1457500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1dm7la9qquehldy67xsfynp76p39dxa5xn4veegz88m7amspgpgcshv7dfg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1448500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qwcxn8k9nxdu43ytsw0ew7wk7mmptr3ykvtenms3fsyqexg9p36sp9slcv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1437000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xdrf8vw7nl5e94grks7u3h7uxaamgeuv3s30h3mfr560td6rqdlqj2svmq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1435500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1j49546jumejnzwpq4ptdal0acmje45de4y9c99pjg5kglmazrazqxex7qz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1429500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1428000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx173nnyxacrsmasx2v80gxpejk6ypyvt52pcgejrd6jtv7yq6rtslq6pw76w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1422000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14dze6kxepm2ensphv2z0ejl4kc4hks7gwajnjr9nfpw6glnqc4fqz53s5m\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1411500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pjmyc2sn87gs6xuzaq9thr9y4msqtcgd379cecgywn2684fhcr3q54zr6y\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1404500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx193xsayg8rsy3zr5knfkc89hngtyxg2avkaykngh6gky92tatgseqppclmq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1404000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kcrktqlr88979xu79dxq5slh3xkvx727j8unxhev9frl8rhw09cqqnl6r3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1402000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fudwe8xuzgwraw6fe6rylklv69x93kqyrgu82jf3tjstsgkm8xrqtc850j\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1397000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13r385uxl5qm5dgt029l3crxsglz6g5t3sd3yy2metys0efjlzmqsl8aevk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1387500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1385500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1f69lleyu3cznmnxlp9xznjnr84xrzutmjjcl4nlsfv2359fjze5sz787ay\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1378500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1923m2hlyu8p6vwt2wvcvda97nf0cqnwm6qf6axlt6zw44gkdgwhsz90j8a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1361500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qymn8rdkm8gak0vst498qpkqvc7gh3l4qxt47m6plhdjlqnv5tzs8ncyy8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1361000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1359500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1359500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1l8ht54p69ynxxf0lxzrvm20956dcpk4lj22rv0jmdtefk70hurrq8m4j7a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1353000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uyczs9n3942y28h6jw6dpyfqr99xlhdr2r8qus4907lr2srtuwxs5cchgz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1352000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1usc52whlhctpx08phhjzge03jy0wf2ft0y9dngzgxxs2ev0y23fsgjk7kx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1349500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q33rhh00r0dh7fx79lp9wrmv3t5mgpx6m3wtpajmmenuux0lzvlqruqgnp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1319500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1aa6383rdchx47qugjavpkcyxnpjvj6v0trml9h3ez5wlcusv0vmq0gkj65\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1317500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zngflag3hu0axh6r6yutlqxt9r7vwd3fh243frzz5gtmfysqeysshp5vuk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1302000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rq2lygf5p4hs7a3ftmc8u24v7f2q9gapsskf0kgh8wjzzxsddumqjz5fsh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1295000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qm77f6cv9z9ufkavnt5nll7qq55rvjx3hru8kafx4guk3chpuawqcmd098\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1291000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1su0cegxxdg73yhm3xu226uj74309x9ll5ycd5m8eh04n9as7mjyspr0w7m\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1270000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1avcekqg5tnavcwyw7qs97809yzh0nzq5l9ltyjljelygwxtp40esgyw665\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1267000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hz0h2af4zmvnczp0twyzt8uts262pn9h93awamhc2sakdlvxvgcs8llaeh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1264500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14sfukr8xrxq5rlpu0dfvvtkzdzpqyxqyygzdjg6qn5ew34ynrkxq7pxlm6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1256000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lntqvyetpdaqzkw4f9hqhuh8kkf3f7u3rl96gxz3lgztfptfaevqk8elws\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1238000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ft660k7cfrsmh5l4twq3xxwqzauhm2cuz0cygd087pvl3u7p33sqthpl7w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1225000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vsav2xvgz8p56c0tj2lel0jew2u5v7r8mun2nm4tgu445w50vg8qx6p8yg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1216500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1k4sqj4vufu22zxtahymvhtwmjp4c633herv8h0l2z9nm2xn7uqlsjje4hn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1213500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rkkaqaqs8c99w2jk7xw5ugfgkcfyhxpnu8xq4g5a5fatxvgggtwsccyp28\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1206500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zyldvfw2ek8a2fv5zm4azulmkth7xntmvxspud576v7awhf7tgls50qg4l\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1194000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cthy5xra5u9kwcdgp3z0x55grrj4xv585g69qath07dqrejrct5qk9xrck\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1166000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1wkcf225wca3efgurwphhsw4z0wqss0e0lwsenk8r06yvymp4dacsm2gzwy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1152500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10c7skd5pzvrclcqfemg2nwk0pnpeh6p95aucnt04z3tjhpl3f2vsq6wzpg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1144000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gntkqf266vrn7swllylnxpaayt7n06yqxhxjsaglkk8fzds4xuts4gwjsw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1140500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18yu63mp0j5nrxgxmt6md2y77v4n9ltyv6knvtmwjqqzty37swagq9df8mn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1139500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1136000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14ntt0scarmrahc8dq3xfdwqqpuxddh6ez2qaq4dcdyyw0acwuevsumdgvh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1135000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rc8cv2t60pvyye2mylydmrp970nawa542u74894ejgwufzg7lycq505pp0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1130000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ausld08qthhjwmpxvxuy257ddrnvwq0u0q2qdgzwk6x95lwvp8wqun9tn7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1115500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15qq0sdefrea28hhlhe5er0vur347vztfsezj76fapg4wf2nxaekqqxsy66\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1110000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx139s60xj6eeuj5s0fvhgea06up5yy0ucn2fayvg4fd90xyeq9guwsv35zcs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1106000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d48fsux0kj7empe0c6a68y8gh6f494hv6wgl7skc42ckf2932x3swcfen0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1097000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1085500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fxscvs37ax2lac6xs4tz3ygkwv3nh2hnrtrx7r4fej48708xplmqlma5lm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1076500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1064500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pmecze7k5a4ld66auxywxljxnsad9ducwgzmy4q4k3d6ma6gr3tqtkfrnp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1062500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1essz4a6dexpprz066dfgwslmz3p8uy73czfrlc7thy3s8w782rfsx75has\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1061000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gpscz23fjv9fw32s3k2g4enc8k0arasszygjz929kmkp96a2c4us8hqqny\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1056000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rgf2v34pnkjtzg09snd40cd5262dp2hde4k3tkhcjyxdfh7mf4nqx0cf3k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1055500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14nru8xmclg23hcdvanrn72rjre93wyew7vgv7hrwtexlkx2m42mss8d782\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1053500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1049500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1sg74tyha62nx9ttjuk53vhk00248ts77s2ee55ryrcskrmuf0k6svhdwxy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1047500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vcp6ksuysun2pdtkrukz6lh2dd7g0d2lpyjk2m3ffylq0yhn4ntq9fpmkm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1046500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ug0nljja9d525wv5n8z79vgdjh9vxpf5hf57r2gyu73cm86pcn4s7v3ccg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1046000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jghsp60cua83ekgw22a905pv8qqsukjjnz4nw9gkqlllspmsfugsxnremv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1038000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1m727l7tyw3u8lhnpqg598yns3tsum2n43da05psyhddgzqcj80vq5u3fhq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1029500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1athk4etg0d9t8q9yy6s68vuruchxsa0pz37pdgqfsc83nckdmwtqlfdk4a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1026000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fp4266lrf7weqrkc3vdm2d29wnc0f32q33sksnfnhagcshq6ka4sav8d2y\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1020000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1psgwgft4tf7ult8p4e5gjp9un75t6fyzaxmhr9e64lmd6lf6kgcs53s8uf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1010000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1002500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18ee0whkd2pk6xymy9sz7a9y6mmcujphzqcyl659fxz2cdr5ln20qkd3wav\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"990000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1yl78ddxpjz4zhe0ypy4jzjgt0kgle2dzhzm4f38wlwpumds6xrpq86kel2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"990000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15v9jzpzxjwdtn8ggkzu7s5suv7kqhuw9yer4w7ngvenlgg660vlq8zgk88\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"969000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"967500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx198yry5ttr65tnmftf4ppzjwvxhqngyncxy3sq5ucz8edmsg5umwqs4u2zs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"960000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cqgrreu8yptcvyufdussnfqxnwv05z3dqaqu0n5qtfq82n4amajsprkzal\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"959500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10luguxfgx4rfd4nft0ee6ydk9dcedc4gvvwhknp0n9ux9nck45qs5m6cz8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"955000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xrydtrhnl89x5dtqpwape59f0t246hhs38tl5d3pzcamfxh65llspr5pvc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"938500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13ech6m45gf3ludnt3e3az7jf68qntxg2htk492zuewh40q3yqwjqv6jsej\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"934500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15deh8dkm0t4arjta6f2z07uzgvh49r3mnltm39hp0aeth0vc4mesdzfdfe\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"933500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vlm6nlha47hctqvcqyz8uqfc64j8h5k2sgjmkk92ysm2k9se4hnqqldyu5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"933000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1s4zvd257h9xqntzj7kd08wnktrzuk7xlya9ttlv2dmkxk79ykz4qzvmjvt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"926000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17vr7dm99pccp240q7kr4ynw0tln4r6h9n34vc9dcdk7gch3dcqgscgaw0w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"900500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18tcgc6fe94f4qz9007v53k9mvv29rvtp7mef0wvqh0vmmnadhv2q894jq4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"897000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hfhn035wpjnm6yhl223rh55e85a23ksp679ku6kpk2n7klxxaecq4xw57p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"893500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1td9zpd4vwncrlgy8kkgft4vkck4yep5nagxr60anls4vrlvs88ts964kg5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"890000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1m7uycpxww03cj05zhdgzjcen70kv3pd7gwsk8grcdtu9ltch6rsq9plyz8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"884000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pu8fla0axf3227ttsxggudd6ym9u9vs7nwcrs8uk799ej6yegvlqhnjkd2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"876500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12v7y2c99f25yntuk0dxpu4kwectxx62l7hvqsj4acuvvx0xsrqfqlds5l6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"867500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kez0lk0emjezwdl88ee6c5lvcqftu7l32ksqgl98snkdzke9cyuq58fs6d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"863000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12hpmx28f6hf0hzx5j6z9ep8vjmpcgq5kwmaxkpagkqdfksunkgssmk59vn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"855500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qvemldmglge8tr2dcwnr4gqam6vkal5dkc2jwsz2jyyy8rhry4hs58hvrc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"855000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18csvx9uspv3mp45autfk4dj0t4yzvzyce63gv66nahaq9pct73ys70ezu4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"839000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nqkt86wlfpkvjylyqdsy4pa2e024cjpfnczt667tshtsv7uh6g7qd8dnel\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"837500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lc66qe65pw30cpt5nvjt2apsmtcut80jdv8xgx3wq6d4evu65wjstsftsf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"837000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vpg8kftakr3pammp86a8hxyar9s0m54w9j4m29d9d6rlk9ztf2vsl7ck38\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"801000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zx8z2zkc0hvn9cpnjctcc8akqxf0e2au70dd3uln96hz6uxw7c6s6s7s88\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"797500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rcyj0tmkrgejq5mvfjp7en6dajqh877960vdnrc9m5ujhps0df6sfsnhl3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"797000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18gm4fpvhyu80m262mptx9y4l6apdlwrsecfye70n6rslzuwmqqwspsnw0w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"793000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19nnl9lw7td20z9l22v8wk558mxfrdeud8ky3229utv6e50cqyazs8jhq5e\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"789500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx134t4wf6h2ppxnxm02ejutn0va4sj6fm0qkyn0hsfx5r4a89x25lqznt9py\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"789000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"783000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hkmks5m9u9le0k2zmx5djjxr6eh34nyzldlnty3mzk6yhzvcevks4z2n29\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"769000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1090syeqn56ezxh9tzlw2006pqxt34ytn3ytfrkxaqaghh40cncwsya49ev\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"769000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"765500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18a9m6za5h5j0t6qgs55fhtucpmzse94aq8z9xjj8lpxhyuemsygqhstwmm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"765500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tuw784a8wp38c6q3fw6jfeqy3pvd8ggh0gj9h0xqvez00q9sew5sg0j06z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"762000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d4580utep9epx933mp6666886cect39qt9dl30qwxj767fkxpfgq9h6y3l\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"759000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1k738pwqe95qv3g8z9y0lhxsxgvf4z5dv0qgq9eh6vcy7u6juc5usrhgpsh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"755500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vkya64sext8u0kcj2fsrezryfvxyprez6xdxapkzpcywakxh7v0qu63esv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"734000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gx8an96g7ky87eur85puyex8r24qswx5wn86r2849njg8q2hkeys8zqlvp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"733500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1epzfr5tjemywh43kr67esqktf43zl5z42ttzmrkgjwyh0608nm5qdxg5js\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"732500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pangjagnfffhfwpk265ry6a3zch4rs2kgp2rup7pwtuphgmsls5sj55j2h\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"729500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nh8ca5vlqrtwuuwrk4rm6yc06fuxgxgspdm3cflj9y6anlv3r0jqp8ygza\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"719500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1m2nxpzuhfj4awyc2wnu37nhkhsy0q8spg9egnkzf3geq2kax3g7q54emhl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"713500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kky0cu2dauntftsk8a55rdche6kuhm227qt2ktfsyrhvu7v4yteq8rg4d3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"711500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fv4dvhre9mmtldnr2t63qg5hdxa02hzjeh5hu7a3zkmf8a3ql8wqv4txd0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"710500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10p75878akjmna30s8kjwnaveql56v2a45tw20fw86ruhvc8x5pxqrqemq9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"710000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e3rafs5jhzf03a8wxwp43kcguxr98eq3azy5lvatwayvezqfyrcqeumth7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"707500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx139j94tjwh6m9mnxdej2j2nkl8xc5ghzvt7fvz9pah7jvfxnhdassm4z56g\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"701500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rsjam2cenutaew3r3ssfc8zfh2uy2y3ycawafk0y4hq49djayemqnelh4z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"697500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ffrdjd4ccl6ga736hz3ran0xl8k9af5xf9ae28hqjg2fhugfdf5s4q8qr7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"695000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1t00welhtn9k0hg075ttg2laa7dj7d26jprf2as70xrx2fuhjyy6sjjp3e8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"695000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1re7sxpa7fmpseg8phu4pqamqmg72qmm3e7fzx880lz79dnyltpgsga39eg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"688500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lka3j0475gzy9yk0c3lt4f9d0p8zhlcujhsfsl3f035z6fuytpesppfrq9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"678500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1eskq3mechm032urxq0nymxa4nx8tn56s626ftknpw4g2edppag4qfdfnpu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"676500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xwq2revzzgwlq27emrpfjmskmr60q7znpayenjlhuh08f4vxcrlsm99vzk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"674500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx188uhxreda27mxl6lth04vl5y2da7qkldg72gvalsth7dkwxeh23sm9juwr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"674000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ktyudrg32h95gwzg0hfl87lf6wruuunp6w888typfdw9f52g4axqcsltyu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"671500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fr77kwzjzcv3xmrhczs5wwsmxlufp9kkvndch9d78fr3m09mqgysc6lnaa\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"668500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1652t20n0jwl4mn8xe6k3j3zalgpuw38u23e6cf5249n3h278033q3kcq00\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"668000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14tkxv7wnyfjm45lr03j8r2qac5hsa9mk75emunjg78qngwgw66essvzga7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"660000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n56f04jwuzpa2zkl46ggs3zv989fz4yx7yyrcx6nzn9ecvpwjucsudlers\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"655000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14p5y3gn5fl8t5jt0twe0l68jwe9n895djrg8lkk55t5rdupggf0s8l0kd9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"648500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18pu3yu4a0zatqgkph8t5pz3n4jy7hq2x9f348yhwafvj4wd328usef7aw5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"638000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cgx3ck3dmznw8xg78jc9xfcf7rws0yrkhpj5tymnc25dteduu35sd6p92j\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"637000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1544prt4r26fm2f6ytlvdfe3j6mwrs5p479kp3lcrz5n58kp8ugpssn2z2u\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"634000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1f8yps5v4rqakx3gyws5hhlrmapcjzzf5j80dm655ehcrf6qgz36qandk5l\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"627500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1a0lmcmccnm3ak5n82mutjxyz9pj5radgw92qzudnp4eucts6awgqym92mg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"627000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx187llktd264wz7f33nqexhh8frcykztdg0emw5t26cvmzfng8dquqzl8qwe\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"625500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10cj7u6uvj7syxwdjzzu5wzf6tk75mcg8px09sm9fas2u3le48q5qayp5gk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"624500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15qd64czwphlu49mlj6kmxru6wdcrjny326mp5d5p0hpzhuhw65sslkng8e\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"617500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1x23xelewc3rzca0ad25wgczhvx7m9g9529xp98qp8zd5pgs8dr4sld97r3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"616000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ywsu86chqesuxt45aktpkg78v7we86l0zf8xa3rcer6gn6xw8lnqnwk5tr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"615000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kyul6v54l7jhjr58e5lnqelmwyaqdy4mesqwr4wfw4ku3mvac47qk8qcj0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"614000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1c5txaqqwf9ayjvyehy9u06cawxfwtctzk70e3eh6pm0m3aqcrqlsjr54jc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"609000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e5gsd2weaqmzszdlj4gu975s2cc2gscnrtsa9agufcgjv3zat8vs606ewv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"606000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19awzztq8wmypthv24e60xmvxzymw82l86y0sdyw5cl5ehnr4ry9smhvg4s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"605000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1v5u67yws0zlnutd4lw0gqk8dk75xnjj3k87rnzjqurx3lpz7aflq863r48\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"604000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qxr2rcnvgcwvs3304d8rlm8kzcg3cdrfdnrp0vq3t6eku4g55xtqw8kd9w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"603500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nra9jrj79xztttq6hnnenveezkk9pq4w5whvlmr2nhj4s56f43wqx0paqn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"591000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17gjhpuwmfcdlymhaz9qwat2frpptev3pz2qmuq3zycj76qwnr54q40t5l0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"589000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hgvgalxcwyssgs5gqsttsfvmt2297u2hw4t7cglllnvswkhg6xuq285wez\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"586500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e2c8sqytwagkr6ekc74p7sqhzd39g8a25d2k5fqj5gckmrk0xdlsadufvm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"586500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cg5zspl8na39un48fm04caj4xpphaerynw53vnjlwh42f528ns4s53jjv4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"580000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lauskl8kzuwevqyx2ky8ale95esy87swemetk0zhc73ctrdm5c0sxy3exa\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"578000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1twps3qw5uvrx8fxmha33guk7p60esjyaa3yn96ju6drhn2hpeagshruvwk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"575000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tyrnks330n6exxr84vz7d0mjsmpey8p34kuzy07g4nrc7txl87ks63zmhn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"574000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ghyal08f7r0p3ft8gywyr24p58jhe9fsy0xmu6wwfjuq4z079q3s36cu8q\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"566500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d0xr746m7nqek3rplkuv6xjk2ne7ul0q45cjgp8gtjkut4eh8apsht6yzk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"566180000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1grclm0x96ccghh8574wnk8wmmee7g8sxt2emh6mgedezdntecsfqrtaz2t\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"558500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14ecmst5fxu52vry0k6zy9merf9m8e38d2vsw6e0kfa4z6wkptz3slcxcpz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"557000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uf668t2krsyfde2v7cwtwk3traj7gwrfcdcx0j72rjr84nnz2fqs83fpcs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"553000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12u3ppvj9yvh6xs36zscus50m644dx8ywqq530w3jkjhly8hf3qtqy6fe48\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"552500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1els3e8hj2jvteh7y2xgwwxwq2uknurtkp63ca74gcuhrcajpzc2skqmh40\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"546500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1geumptg36crcywp4tzfqeameymf7x9a43qqde9mrpaqxqjernlxqytcsus\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"546000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nkd5fyvrnu8zeqgen48aeqcnyggjxnn7dctfddj7m2mz25alrl8s74wqvz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"544000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rfkx4gam8z02m09k5am29u2nyn62wlc22f0fapkqra6ckxspnn7qa0d336\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"543500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n9k3yluqcmnwz5wdk3dclgs6uq7yf4g4tvahh25jl3z4u488ttesnf2kkx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"532000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1p27mt7n0as5pmzllk5342na0zjemu7xcylp3shlucvtdhjpeqxxqvgcnx5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"526000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1r8mm9d0q88dr7dw0v94yl0cthpr560r30x90zxcutltxcck6xq2sm3yx2k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"523500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qc75vu9xfagl297yupuwl3jgqsecwlae3szn9lwpg9m5p0zcnzwqe4adsz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"522500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kevvjxgq5hn9kzlds67gt773fsytmpv9vc4cmqnxlcqnv3ftm4zqm9y9rs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"522000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1k9mxrjecdztfeggk2v3urwmkeg90f8dyq3rqmlxxag0ewqdpv6usvk2rqc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"519500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rd8n5srxsgys0l27d3ym8wmcw0lr4jqf7temzz7pqqjx3knnksesgace7w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"519000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jycy47p4up4n073nxn85tkem6qmtwpqjjm3k5d3nu4v22w9h6jsqen8hfx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"516500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uwwzqtkhs2gv6gfja6hh8p2lhxtrv066umxq3nkccfqs4g3re5fsz9y55s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"513500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1r2s7q00hau24y49gdglqx9luqlgjug46del32hmfmujmq87fhqksw7emhl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"512000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1t797wa3smaufhnhxqpql52tpkm80t66ensrsrdf99ar4h265xjssjsucdx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"510500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cnd5cv200efsm7q85dxl2368q9ymcyq4ry5akgrmn282jgdncg0s8lrgsv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"509500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1r2su2mtnjuk6t5q33au7609wn2pajsndupzh385r3s5guvpfclfq7m6n5p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"508500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gy8npau5h8fas5er5mwtl4sqe2glvwrkr56dj9679h633mgq3eyqpvz0cg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"507500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tms3d3n23j28f9agpm0jrdqnh634f3q9rgcnwsgq64yhcshps4fqd0fv6k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"507000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qh002xzjsedzpuzqq4cz6spv4qayuwhyt84j7pd8zeylqwl0k2xsnhg9y3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"505500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1la845mwntk5rqty7x33yw2t04e7njxyl3uflmfvea7lxzcwvc6ksmr3war\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"497500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1m6dwm8wvtthgngztjnw7r0g4z9s8797xa7hdzrj2zyajctgrpc5qx2zqg7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"496000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gxx98xmhrcdv4ez5fxekmnczvwuqns3geh3wcj9l463d5jgqcwjqv35gpt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"494500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13w9j9lkwrlrqttpnxp8atw0gf9x5jrq8my08m2mrugdrn2rrk9ls8k9j7x\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"484500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vr057q49h73hph3ksrk92sy3wfm2u22g9ezklxmzrw92m7yl582sq22c4h\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"476000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18plakxe6gzc7frl7mke9gfhaz30cgr40eyahtjexsm34kexk0dhs4cdedg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"475000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx123qaxyt562xlfdxn7fg52nxx9aq6gp8q3jn6kya98xmn7n0z62kq09hk9k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"471500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1u59mc3s94cezun5apvw35vj2vnzfanjv45svwfdat84wpuefcs7qzns66s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"471000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zeqjj69mt8a5pcgdzrukt47cpgg6nwdas6m5j6aqefxapq7klcxss8tcha\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"470500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1h9p0lv7at2ahtulugvg9vdh5nkjph2uvg93uz5azp8hmmuyaj50s8ky6v6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"463500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hsxpdkzeynjv6dswp89klcu6qc8gn0vghz54gcpa95z0m5m5p6ms64gd99\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"462000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tgppefepecrczwwad3zlvcwhuujsyr63gh8mv92el5yy8egzk97sdqpjp8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"461500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1yjlle0sar0k24juhdv0krzty0qkha6asdjds0d5xvp7gv6apa0yqfr3grh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"457500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n4n4k7wa79l83ch35r68eavnh0lkwcs3h52jt2xjl6j0969lqvhqsew3wl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"456000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hm4mvj4dheczz5g7fvpw4pnmrqlm0z9arhkqtvq6yaxza5ckmlws85y7zw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"452000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n04te3zvrvfsgmvzl3dzegpntqeqevwmd2ycwwwhng0hwslxkyfqpq2ng5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"451500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1u9xsdvqzayfla2rutaxkespha2xrhn9m6wn7v8z8rhj277v9k24q44rft2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"450500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jj4r3za249xxcyp30jjyen8nz6kmtldqpypwuqhukzrp6trme30qsvdfxk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"447000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ckrmrs93ya5xud2lskwvn3z8t285awqcl4vx5v6zgyphat5eultqs6ds4l\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"436500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jmkx9m05exvtuk5swve9x9qe2u6udxx5h8p4w2drlu92523pjj6qsq8epg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"427000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1l52feg8wshacztsyf6f77ndq44qp87tdwns9wdlxv3t4uej08fssuuwng7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"426000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rz67uawsu0vhh8zx7ezvpy4d8jhtyjt4g4au39sf4qft4sguwx4sl7kjfx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"422000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1c4sffu66s9eepqph3kfjarh4fp5h5dhl3u0r8jvrqlq4jkdp3sgq4dcav7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"420500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1chmqhg48plemff47t5hrc50p7sk809q337uvwn6385cdl8y8a2jskzzcwc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"418000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vkmzqsggqcqtzy9ea8rd56zx20uln52ug5q76y5u7hzjl8jaxfeqe3f49d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"414500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hyfskfa3wpxgtajdfskdmgljj3tr7wna6jyqxqdecdeup5rgn24q4e4x67\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"413070000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fk0jqxyz6eh35qnlu70gx58v6ahgng29e4k6zjf6tqxa96y7p3gqu8w8qq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"412000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ms72mlttvspj4ga668t5xr7k8m98eedvvdwdkmwjfua2ttdmj33qvqyp7s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"412000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18tph3dn7ahfs24zu4lnlhrn9uk35s6fd46x58jf2xq3wzdw8ygjs5eamp7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"410500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1drhuec6ts2hz9qf8jjxmpan7zlung5anurrpxnvjkmqy87vvuh5seglsha\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"410500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15sme6pzzgltj9hn9s5u4xjtmyud4qx8pd2kgvj8hsymp6amx0wnsgw9u27\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"409500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nr0cpl0g86e0wdzuahcc2x7f4pc63n2y6a6zpnsjt5lfsctzmufspp6vd5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"406500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1yqycann5zs9eupjsea76ahp5h2h0d52n6hqxvd0v3whezr0wre4s3zku4g\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"405000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10jqs45t5ujdwtqyft07f4mxk7y08fac4ks0z6ee50n6fkq67992s09ezzz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"404500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zp7rs0q0dqthcwdfvpaugv6px5qylq9uvwltvq4gpepdqyk9299qhvd3tr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"402000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1sgquqfayd4n86899hjxr4xg5z066jfljxj6mjysns890vpckj5jqt2h9t3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"395500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1f4msx52tgjn7wwetqyx9e7jr63krs2ut8fx0n5ufqvp6fncfl5vswzueae\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"395500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1za0yful9pmmgtpzaqq64s9u7nclhrkfw0nzjg2wuvzng6yxex67s0sk7hf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"392000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1998n5nlledt8puwx80neyvle5xkayw0uvgdhuwup6gtpzd6ym0gqp5qzy4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"389000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1efmq0tdmmpv7k7dzd8nn5ta045f9fdylk9pa848hzshh82zlxf5sganjdn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"388500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lnwzzc8kdm0lnfezlapkh66tl59ruhn053rtsgtnd0j6qglr97xqt865yj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"385500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19ud3ev0q0tcrpsmh05tggwt4n2nkwrzrrtuwtyv0pl2t3t9w52ysy954ch\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"383000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx189rrmskkykntwceazrltap8a2at40wdhv4wvjtqc2xk8d85ttdqsu5l54m\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"371000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18tt3u9d47tc2frcp4z20yzt2yw9fpe0kn4hsnardnlzdsj9eewyqkhaxr9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"361500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xn5hqxpphvuapka2kmg6xhsserajjzd48v7fknldems5amkf2a4qf0g2j2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"360000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14fz0p5ff557c6sh6xx3ssztc8sv8a023cqugskep0vm4j85rna0s7fu03g\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"357000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx143pxg8tpjx889uqxmczg7f7wtee3qdl6ya50dnrk7qm84h82s6qqz7dktz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"353000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tsl59gk2ahk0tkrcwnhnjh2kcnfnhyljt3n76h0cu00ael973k9s9dj2aa\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"352000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gr44j33n8tsjpcmstcmffup7ap9a85kz3ykyuzd9zueegz37xh0qql5jwm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"352000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hwq6ezh6zgc6pvadxh343nnhvenc5zw0lalx4la9777ucv8lp3fqnjpwx2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"346000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"342000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ahckwehmp72cr9rkuk3sek6zv6ay0c28tt7fkrhy5qgdpe06t79qvrjsns\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"339500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ln8cwt5hwwd5l79uar8gt20njcl3vzud6m00lxtzc0uecq7zvmzql5mhez\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"337000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12j2e0ja3z0up7t0csl2fmm52jd9mrc29pavccn67uhadrls4457qpv7qls\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"336500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1h8thwkuhp0jnlr99ntwllhwhvp773yxufrcuwsh9q52vkrfcdy2q934mmu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"336500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"324000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1p38leegjxpafuxqcjqw5ddd2ny39ajs4hyy93l5hsr42hxhsdjmq67xl7x\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"315500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ksduhw2jnwayh3a62cnhmxf7vax5lult55kj09ejvqgrr7gy726qkp57w7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"315500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1998h39fzrpfxvgc54r0fmmuq48hj8c372gradmy2x6gq7r45suuszqtk3c\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"313500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n50ufuaae6aqhxcjlw0fydmhpt4h049rfzjqtgke57sn49p34sasdhzm0c\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"311000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1u6599454hfykwc52crn3wj2symdjkqsgu9rq0u3wmwteuc4z5jpsr327jw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"310000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1znmap05s26uhhzzewpz4daz634wcslefnlchrdlh6aptvem6u09s7k75zr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"300500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hd5c7v7542hzr9j3ac3zx29d4eglxyq8c38nrqvuzdsjn206837qehjl0m\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"292000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mhp72cd0lfnlfpfuclh9p6uqcuu6y0cr4cx7qnk266hleawuyuxscha8vw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"291500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"290000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1an3w925endfhcg50qelq69ahwvltupq4rt7wvnhfqd8leg2526qsgh2ret\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"288000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14fadj8tx3ksq8jvfmcsuhxnxmmn0lqdlpjs5rs8dfqphgsuluqfqxgys6j\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"288000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kdz775nc0jd7uqjrlgd3a7pk6w6qm75w9hw26wa6q8mr3u4m42nqrj38hn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"287500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fgylxyf2ef9p5zj0d6hnz6wr7wmkgukq6zt398uk3j78nhxfu2kq05qm4a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"278500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17g6gp5v6070kcjcq0tx0u6ahgqyth4gq9fha3sgsvdwe8xn0fj7sslsft8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"277500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fglt4y8vdcq2errqju4qulnmcfl3he9nr09vxqke9hl805tcnw8s2039u6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"277000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1h6lg70tzjmvsucw3c7mmdf98p553aj0hfd6sl7nekq4yucf4xnssd7hudq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"276500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19j0tzeawmjma763dj027q6c0up4a8z6leypc7htgpxwnk6wr6d7s8est7d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"275500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ezvssk3jgn6wr4t03ng5at3mccxyf6868z2kzmapnfqhuyyu2yrsa4vlkw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"270500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ccgy2ru9jn5a7d67w09zrgsxgv5hfxrkzdcv56dlpcraa7tkrtkqsrah8a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"269500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pmjftgdx7vsmtydypwy6qe8tnmtc9wgya5s2yl23myvk98c83uxszm6cvd\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"268500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1av5ws5dp8xkwp08g3ge4fsmr5r80c7y88p8yru7rcv3gsvnkcahss2pygm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"266500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx168f4qnz2e7sugjdv69keaqp2mswys30sqpyskuqmzmakqyu94d5sgt3qcq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"266000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uw2mjnw6zt8t0r2w0afqu3zw7jkjl80xjwnfgk6cx7m2c9u5052q6m24l3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"266000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rd9psq4y4kt4svwhkvsj6aqvrgwmf6t2qen6yfc9fw6thzrxt4aqmjvmvj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"265500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lnmtuqh7jvxjsmmsf92ulcavxtr4fjhzva774zhs0fwvctzf7vgs53cn9h\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"265000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n0a3t40vv5kdgfnduj82kzw9ewy3tu5utszgxhkztdvqlu8xgdks8nyh2h\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"262500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cke885syq8wasw96nqp9cuh6wcr7sezvy65a3anjqzqhk59j9s9s7jl0gt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"260000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1t9g3q5fahh5zpsqw7hnlm37mvmty3vckn77cfepfpt23jw9k4tuq7pqy52\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"259500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1p8dn5gxah24aaufh224nw9ze4e02gpu7enmc057wf3nqxef36lhsndl7cx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"259000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14tmfx4twa5spah6u7he78hg5nk7tp42zdjsq8a25fyenxz64yfqsqdzlh6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"257500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fgxwy76pzglmqdqxuvv3l258233900kkke3p0mf0gaztjwmxq2lslppuqh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"255000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1sg8mgch2566d2uncn3lew5wwwacp2femp63y4gshj0qpy9fehjqsysa3ng\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"254000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hqcfqu3r7larng7g73jep24emu4kty990jecvfyugjuwp5n4acdq7wrxdg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"254000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1arwca695tyd8rsgxx8r707xpe3laawcv3lq593hs4qz9zehlngvsz68wh7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"251500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1au96n6nrcskxc7wqedekzfmef69jrx8vlws79ypnnhuhc9hgk4hs96y2s4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"249500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx122x5elltrsykqwy27q4jpe405m5d6aaxtfte87mjl6zty5e5ju2q9ucfz8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"249000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18pyq9ckc7wykdz3wmxm5e85wsgwnwyxundkma5wxxmc98543z89q9amqhh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"248500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1g4uyjjhup8hgk6akrjqvegmxu6xg98er5pt5uzqn520ud87rlgrqjn8cvt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"244000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1arre93x7eupag0a235927awagqnz28x986tke4cqfcs667z22t5szzd8et\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"244000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vxygt3x7vzn9fdyz2rj0jk6xxelqedgfs6v2qhvlrfjy3nw3pp5qckwxcr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"243000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1avg4dzcn06t8a7hshveyekaeszh7y809jk3dneu52sx97vfal69qk30lh4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"239000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1dxxgygp75dh3p0yh6kmezeeyftncphy0q2fjws48wzxdrktsy7kscjdmd6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"237000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1k9lslhl4wmhs7ray9lfh47cxkz0j5vr827vypyaltsq80697xyqss2gn93\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"235500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1c68tgygju8yrhf4samf9mdc9rstzqe34kcz2zqnyqjxcraejlgpsq6jutc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"234500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1x3rjuxmvmcm8x7eaqjkpxxc3r9nudd7erx0g5uffj687vvx62g3q9gq8ed\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"232500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pnpxvslglu4u7qnv3cwz4x8vzcc5y9nnlhkczkuzyv7995dz96qqrvwdrl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"231500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1z8wnphkp2d50k2kk3f30eyxtp8h69e3pazzawvwtseuuerld339q904jsc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"230000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1l4nf9stg5qzuecmrfvls5wgtd8l3mdgwedcwvu5eqfa3n3pektzs2l5gvk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"227500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1l5hsvt7g2pydzauqhm77g4h8es27ffagmpseuks5tm3tn04n6nyslcafqj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"223500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ls8zjlv2t0prtqvuy4pkasq8a6axrjythsu3nvsne5uzmkk82clqh28yvt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"222000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1evudswfffa6pru342f5hkduqhmmalx3c94clvyed63ht0dkn2edq3shffh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"220500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gmvuqg5x4tn9fj53vsgahgwqa9h4jx0cz4x7xpet67kxu8n33fpseycg9t\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"220500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1wut7pf5v32hpylz6rxmrsztxfhskgxp34cgt8vawu3xqg6y8pj0szay6tj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"217000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ay2su27wuxjye9f9njdj0e7jjgxs4gah9p53upmrt4rwtv6afuhsw6awcq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"215000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tq8ewkuuc9sr8a34eml065d45atwfq2fv5r738927rx9cqzv9mvql6x3xy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"215000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1f2jdndglt2mvq37tc3wp8gtf3l3uql0sn485x80096m59y0ydl6q90ds4p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"212000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tfn2vhdwrfuemr5dspc53qrhh2qek4amsq38j5d0a6sj73fdyrmsnvjrqx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"210000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vp6lfvs36vdft6ljgmvpe7049dygsl4nqy6pvyd090huaq5m44js02y3zw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"209500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1499ujt570lt5yjmvrm7j6xqpvhlgw7kuye4lrzhfz8p724fp4zxsx66pgz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"205000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n39lrqg4kq5ey2tnk3wlqxylcuflevkkt9wffj9x2fsygma8m9hqntpsry\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"205000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rn0p87m57fzv5je8wu97aegkhejf7r5gz3clr4ajs0k42p4g57pqwh85wl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"203500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"200500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1l6yphrjzvuc0tefqug5zs9eh3gu4fupq6e8ncgsr6mrek2xvvwvsf72r4d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"197500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tagjkz3avdgz8a5kn8kkhs3lr9lur0fmdt9zuz49h9j9vcg80v9scl8fpc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"197000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cta37dl4czqsz7jaz5awly9kxy6v3v3nqes56vugfrg4h263fdzs99rgzf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"195000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fm0j6pkfxsjeufdcglg58v3veay6mn2x8qp45tevkxfny696kewsv42zg5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"193000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1h9ahw37ekqwx5sewaszmj54cn0l0pmzrksss7z0320ntkt63q6mssrfkkd\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"192000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10783gzrqc88k0n0ert2nkjz9ams2aj77ux4t0y3lsmyexnue2h0qem44ac\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"191500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx120v9ahac98w3rfj208xsf7rasweaesz3n7dtgt4f60upczzs3vsq6d67q8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"191000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d8s9yjjn824xg86x5wwhvn7nnwqe7wnvdn28t64cmtp62avpvtxs9ycy60\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"187000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1255zy749m3fss4azm0ggj304y6l5uswd2d0rm0hgdgwts9dlfygsgnzfds\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"184500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1azdpkjrjlm5v300uknw62m0af3fm3uujupd5zq07gharrx75cj8sdnh0wd\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"182500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1um9jpra87stxs84lldpz0qt25tkxh9e7atmpula5m8kuu5gzszfskfa0r8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"181000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ptz2hwskzvmmwa6a3zxvz0hw44uk4xkuyz65r92lv0jnty7tgwaqvhy630\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"179500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx128j2zgejfdmut0z3559gzw0vntm6rz2fcmhvppcgkyn9kvuekmzqkhk8hh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"179500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13j75773f8tfepkdjtcrpmv3djm4y7htcl2waq6spxkgtxs4yss3qfukrk6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"178000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ze8ugap6cs90ec5tguyd9hg9g2xv7fyrz6s78ewzlsk7uwn3pvas3dnmt3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"176500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ll2yar6vrsv84f5qdwfvh8tv80qlmkxdlr4ddqpmpzncqrgjghjs8s573z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"176000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ryur5srud4qgamfq2pmfggw780m3z2mlja4665v7f7mfp5dejyfslp6smy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"176000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx175mntfhx53xw93y6e7g228apv37j7vwt23syhtwnc3h0saptxxrq9mt0c0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"173000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1glx7a9c25wns42k936r3qczu0egjtlshkaxgv5atxpyyj2dkd6rqklrnhh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"172500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tgde3wpspejv0gq70lqe54l93n4mrdmrp3xt3ts4q96keddyrfjqe0e0t2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"171500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18gszx83xlhzj3s533m62pazj3c7v08rgu4t8sh0vs9c2leg3ldcsfgkc3y\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"167500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx165nssm0dfafy22f5fgr8ln543g7gjgwrmxmdj5w5arjwma2k6kgq700fu7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"167500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1j2awdr9j4gun67tr7e02h6dq5522u7lkcu5ftvl90ajgf9kvhqusdze086\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"165500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nnrl7rh9r8d7xtxr29tgq7evywy8nvkh45w66f7p7u7tesct8ypq063ctl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"165000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18vfpqpqwtt7htk5dwgd4lwdnyym659skm9ppf0sadkp5400w50tsxysqv3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"165000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vmxgy2uzfh8z0t99p0yqgrea3f97grmh33shc28vtvg2lkzcpygq0ls0np\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"163500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jkajyu65wp0klsuyygjs5425tyq3ujffs7t7g6wgvxa2r4arrs2qqs99pp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"157500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mg56jxv3e0plu76824vw3w72kqumgyp2hetfg5s227lr96vjzd5qr4gxnj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"156000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vv29ueqjqtr7w7wk9vhw8txgh7ye26zgue93prgnq7m8sp7hw03sdwatcr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"153500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1j07gy44rhsg9xtaf9kt95h8jr8vq8zq40ljf38dqh4mmtkekrtgsul7gud\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"153000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1yknhrstjc5uslrg7zequ278dk3j42s7ylfw5frvgjdsjzm3jxwcqu768zc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"152500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10gntxs6zapmxesqh6mk5ujdxyvkada4r9pg4pcw7s6rlr88yvyzq8hsjzd\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"151000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uth7wfnyvzfy8nf56u6t5xhf085l870ytdjazm4g6ja7qmn6w9vqljj34x\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"150500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jxl5gaxtd8wnc6r9nxmf5s748ct827cpjafdefw8rgen75lyxxws4u8a45\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"149000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1csleu9q374crgsm06k0xq2n0vdcufm34ahz3lww7kmyt7ukj38aq3ta9sv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"145500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1anyf8dhv7shc957xt95ujj6ltk2hmmwhl7hvftw67ph3uf7w4ulqpdvg9l\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"145500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12gjuxcdsh7ppxmc0632zwlegm9wldzy9zp4v2skf60c9s705k35qy04laa\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"142000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mk6v9wmyju7spyncrggntg4lm62g0ensg76yjgjhdtnmpls3nr2sd9qwqp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"142000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14xzen52t0aecda0rtqea2zgzrqsf3xlnsswt29uyvrf2qhjy85zsfderjr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"140500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mcxgagq0znvmk0g7dqvfa9ewj2qwjxhysrna634prhn89nmgknksn8ufzx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"140500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18jk3gsj6r4y3esc22r0qvxru79ues6z7keha33ahn5tgahxzcknq48ler4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"135500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qj5zysw5wc0qhwljrkgkvskmfsempcr8hf9zd2m9xw5dkger59eqf75dpg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"133000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vprl39d98qzd3u5nk95qnhus9vjp4sen2w7y59yu0m5udqll6szquzr6y5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"132000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xc2gg83p82xgxdg90kn3gud6grm4dwznrna2l6k80l8rzkg9yzzsdmf32d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"132000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kvczf9d27064yfd7kpha95ehrvem875khnq3zadd3zjyxu78ly6s2vwwp2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"131500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13l7yln6mennhvfx9celf99enpdgtfe7qs8dmr4nfr06prcfmz0eqsda2ae\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"128500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1a7mtekvyzh5f0uswz0pzqq6lys66ta9eavjyk66w4kgrseej6p7q5savlp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"128000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zxfqw42gfax4wm88lvy76tt6et99pmd7vdjhfehx8jnejr2fg3pqmcvq8w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"127500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zqrr5qw2akhgvvxnfvl3epw5zxjy8j3930fed2agnexxjelrhy9qdrrh37\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"124000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rjnt6cet0cx3m99afq29ssmk8vagnw3qvzrn2h38aawvp023emrsvskald\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"124000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19398nqhvlk3t79afq0csx9lyg6j0utftw3862295ue4h4tjgzvvsjt3pcs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"123000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mrmnxtc9vwjkgfst6z999x42wfuwl0ywnwn0rgyvypj6660l093s6htasn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"122500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1r3qvaeqnpp5hmu7tppj3pkgwj3pm2rnsrttvzck92uq93vspq09s7jdghh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"119500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1eymvxpnp4seshcfn5qfctlzsukazt49t3m5zgz9q68g4sry89cfsggxcfa\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"118500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1x225z4p73e847du0g5k63tgfj3c3zn03z2rr2zqnm6fs72n03k5qrafd09\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"117500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q5kdfkldkc735p5e7aj6y5y0szvhml9nchux98cfqfun4wa74vxsm3zr8c\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"115500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17naccyvydtmkgnaqvu7q3dpphzv3grdsgm0fk4ja220v3nxwnywqwss094\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"113000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14vvf5wwml9crhjcl7easevgykv0tar33364rhta9wkna4470uuhs7e7zs0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"111000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx139le573u5rq3g7a4adydjznp86en3u5wznrlywq5k0jy0s49fvwspq0w5k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"111000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ynae9xlz4m0ec99702l48stft3m4kvwwz5zx60zwexhnpyhp8srsxam40c\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"109500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kn9t8m4uxn7xpqpdy34xhxrdkuzs5tuhjqyc8qxw69decxqgtcns9yq940\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"109000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1py700x95hshs4cuzccjshmt0eaen0psw2kmhpv0tmy7lag9wdh6q58puuy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"108000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lpm0wnvfr4l07wgvfhhgzfgy7ur5jf5g3h024gln5ykml60nr8us9wc7tg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"107500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1r5e7qrk323nmr3jhazwr3adu4v8n8dfrh3wvmx38ptmhv7wq23cstwl09v\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"107000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1z5zgrrc2l37fg4cu6e7s80qyxm72fcw7xhfeep2caahptq7mdr2qzcl2xj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"106000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1m5zcq8hazpjhxc54lk5hma3arvwtkpfgseahf79yn0ytchv364xqjza394\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"106000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1njy6t7vkta3veyjj4atvr6ppmeeru85tgh5qvhvnmleslru54m9sqp3l60\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"105500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mq9w9vnuae4fdmn27ceh3h9wzaygmhf0c3sqa7xufy7x0l87zwwsdfm80k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"105000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1yht9eg80753876sq3qjljn7nwxl300g70rauqran8qkvdtrtqzvqxkdxq0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"104000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1x4nlvf00jq5cld2tamnnssnshzd2v9gvtp2yjun60qgh2zj98kksyxgrh5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"104000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rh2lur825y90gqc5pxmejgk5d8wl934h0v8lv972rnevrfhpsmcqsqywld\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"104000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12n7hafkn4tfwk8jta677lw48092lezrx8vgwn4t7ulsweeg6xftse7e5s9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"103500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gw4n8htnqwhunjyypmcheushazv597xama2tx9pjf8zrsdq943wq8luz82\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"103000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hsgvhawn7nz3xz6dqeu852yrnpdygf3hhahq0hydnxw25g8057qsp76xwk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"101000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14hgwpw5x8zdapw4j35qclc05ajf6xxuqnwxyffszupmtvjl8wtzsp8dgza\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"100500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1v8ram2hhzshqs55splpmpwsscfz2m3z35ajssnasm43jgmf7h0aq6sfx4m\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"98500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tsgysdg9v234m6nftjx4fse4a9f6c55ck2vstd5hau6kkrzzfhpqc9wkha\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"98000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ehfcm2ggj5hm8fe4tu5dcuxpg7u4rmedus9thyzmm09995xjttfq0u7get\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"98000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1m2qrqthgwr3x7cyhf7fc97t00yszfvet9jy6x0chtqq65ycyxkqs4pmxfm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"97500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1f9rjvatrgqk6fyyxc522xrt6h9clrlvy49nx8swanx58t2n4g3rq9nwszr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"97000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1u75x5wkrse550ag4nwnesaaqhvr3js7vtqh9r3vt0etcxzqu8z2s7u0d6h\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"95000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gxz9mgd2z0v6sr4luvnhw2u5qandh7yvl7rpxcz0d06rdfa7s9js6w6p73\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"95000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15drd8dvlexsa460klqa0dqlluy0pya79z7lnkvj08zgzuncnzt5shqewhm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"94000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1s90ctrk4g65jv9l8zcysjev9ms3v45uvktp5k52l94m97q0gfpeq886vq5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"92500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14ljuxjzlu24djfrm2varlgvfup2q0keydus50mrv6qy2qpuxu2lsmm8gza\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"92500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15w4ytftzunx9ues8qhk3z8wmrmtgcg5n88axzk3c8qwtzr3n8cts3hnhj2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"92500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1p898m68n456q533nfjd5sa28akadyqy3dvq6tywk3jxgy7chrrwqeh70e3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"89500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kn0k496puu64hyutyn6augc2cj52rc4p0vmmfcceqezp2y5kfv0s6ddymx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"87000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uhw0fqjy4v9stnzuc5fjrelvep597jx95hcm9xr7d0pqt32cenms0ggwv3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"86000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lan9judvg8w56k94gequv9k6rmzr8kwmq0fk0vh2k69muzjpauhsszypcq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"86000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"83500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gz8zq3caexftrf8f03l9pg694s4zy4t0cacz5mq0h7u7ge86yt7qjlumup\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"82500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12hvena2t6ame3sh6xu2l3fs43qq9t7djnlt00jjyssj73m0e5eks4f5vcc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"82500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cx85le3wwhvxmvhapwdyp4tyu875xx4r0lxjtk6rj0dhgwdve78qru9tfu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"82500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1k4rx2e7w5rl8jzs96hwj0hussljxc7tccyqng80r845uf4da9wcsat3pug\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"80500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1s9972ypp7cgngncz8au8737jw38rswzyc4x26u84gr4jk07q8s7qjaljld\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"80000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1humz3m6yfc5rrf9zczyjkptr7snre4e9slypuwhhgsn9eh952yds80u466\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"80000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1c2jrdpa796438jzxxjw3y68tepmlzqv3e4a28d6t52juznprsm7qpwc0fj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"79500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1m0qtqx7tvpw6rjhsmjnpr8dxgz8wyx3hypcg4qw5trnk34urxwyqxeym6v\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"78500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1j7njmgtzmqr49n9lyacawww0uv2sjgxs7d04xu2ns6k62hfqycqsh33u92\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"78000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1wtt47s3lhpsu4nxfyvzl58jpslpnuvv9ymd0gthaxpern3yer20qjykd8r\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"78000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10vkwltacvwvguxk65jg79d64pnxvr5jpvxmd66smnns7daa6xsgqu045qd\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"76500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rx03nd8ttf02y3qz69s9xlxqhrhxtk3a5x8lnkxl3s02au2nkqes8dv836\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"76000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1swqkluvn7gggzn48wa4k22c8edp8wdnrhnhv0c52jk569m5chprq6nefvu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"74000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1atwce5d7s6pn27censfqkrc4qtqkh8a8ufzylnqakngeg7elutyqs7yqek\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"72000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mvlerkhjtrg0qapvxgduxnw0ucm33pjcv6jutkhf82ampzhaewaq7ym4vt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"70000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lhqhhwzvn5y7kmgeenjx9k76pq4nnmqg4hffvar8tkns7qpu6z0qwatcyn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"69500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qn4ugnczkfstu5eh7quuzce30c03uv3etl8u7m426zrpshxpdrvq07f75y\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"69500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1u802gcgzhfkkggcq5l7388xz2fn9hswy7zvh74t5c7yvu9x3r7xq4d9r05\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"67500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1er9czf5xeu2wnpjeg69hhttxppwkpt0hmazpclhgjha0nad6kyvqeus2pv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"67000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tcwemyrrzd62wrh8ff3kn4z3hr0dts2waxpxwfpwg2jau2tz0d5s0e3kme\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"66500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1edsqjgugd0hqynwa9h0gm05vsmqpse9yhwr85eftrxyu6ww0la3qf9hspx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"66000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1f6khu080cft3c9g5l8qwqh2wlza8473382h4gwursgl0txhdadjqn2kzv7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"66000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mhhmm9rsxk4fv5y9feft68uj4mrz2c8m33df5ts7ve6uz9xj7geqgqxd73\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"64500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16cnha02fp053dvmxltjgluwjw0fdedpmxj5x72z053pwt86fgjtq7er08p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"64500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx164hdypm0mgekpt743z7xu7vtm5w80hysnvgld66zr54gvhcwm8aqrsk22s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"64000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13xu3ay8eujt4neuwyhxw002r6qlj0v5p8ldj6jus03ev0w5u7wpsxdd3v9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"59500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1450fn44pv09yuetx3yp9vtvx5k3amv89vycq0f0dvugcvp6zedlqsw05p7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"59500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1w0nzjd37pkkewp6ntwfcc39u0w36723amrl2w6rc28aer3m5yexqlztrjy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"59500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12wfqpxsx0gxlrufeptynuvwt4fn9wqflp356l2sxhveshsrkrqwst4uwh3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"58500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10qnnual5h4rxxcmjh8ts39l28azqwjqlfz0u0gjeruntvs0zpqus0fl0u9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"58500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xj8utkqx9a2m3wgt4pe95z4jh54xgsl5gtdfwxqfcg823stkplus3fv5r9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"56500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ujuywt50nv9jgt4tsu32mcgurtlu9zfvjutuvjk00d5k8peagwwq44fmqv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"56000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mtug0wju96l4p08r2452lnllej28stdrlpz9p7qc3vlfmj888uvq0zrzhl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"55500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18asaxgn4dcswsefcdwx54kldattux7l0yn96fvmndrpqn6adsluq3ffr8x\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"54500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14emrk4d8vzp3c2yztqrzhnmy8r9tsnywrpmfrl838q50j0xjenjqay73ld\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"54500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pv3lnp3q5kgp28u3w3zmxreft85a3mf4v3rk8qazpxnzwe7ykays5tjlwj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"53500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tw7lny4cxss0ks67wxz272y356nvgzl2ff6stee4x0muhr9zv55qs85vdy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"53500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1wsazxs68mvqe2j0gcpfaqwczn0277586r60vkap0gpaklcyhakfs8wztsk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"53000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1u3u8jn5824ema7zszlz8wuww49dz8vf08jd7vux952saltvx0l0syu2qzr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"52500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e0vmg4kc5ed5t85p2gjqrgql8ujrar0t95n9l63xnmkacgxv7gtsum8x2m\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"51000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e8xldlayy2j5ptk9grrze76e5jyc8p0uq0zuslawyhqeu7xme5rsh06fw0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"51000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1u2v2uf8seke36nxtxh90hpgh43dy5py836ygkvqwaqx5jhck95ysjepx8g\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"49000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1trjmkvfv40ngnfmvc5uw926gw8fndanpnp7mphq2tgqwt4xdw62qmrvn3a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"48000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1eghncmcx5lurhs30meac277fx0qrkeugexm75ku3jwfeejhcpajsyx5wqu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"48000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13k0anxdyn6e27hful6t63mugrh6asm8vphxe0rg57a0p5p5ttfxs0dy8nv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"47000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1x6j2m793ten9em7pu09q8qca794vrvrdc3jcw4yzc8zup0zrh45q8d2lqx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"46500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1haurf6xpzc0aj833h7tq0382s3qpp5a698kh9ysu4j99azma9t5seuhzdh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"46500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xazrdyth7ctuwetm9wnhrvgq30wlqvwuk6qn7p2huy7ffwg5nznqfw69ch\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"46500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12j3mpzmlpx9d77ux2990xwdhus99626yj3s75kyaxt4r80n3638s237x44\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"46500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gavx8yxen8hhfy7qgkqd0jqczysw8rgruef8nt5mp2sp7skeh3vq9lx32u\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"46000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q8uqnnncy4jylne7m098x4lnwrf34f400cn63px5jayj5eddhcqs3nuyd8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"44000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1md60nlasdkf7uu52lw7gmpvs07jepacq7u6spajhaj5prgn7vnvsecqcfy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"43500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1dh6r74r89g2anwusnw2xjwh2seuc4zuvfrxet2jzan9jll9calys05g7mq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"43500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx140ya6nvrw4a9v4ydwrkutvju5tln6tflvq0uehqk6g42d2g8m5xszxwz45\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"42500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1que54datv9wjvh6jjald43jlhxkvcpyl7e6jaqap8ch7my7sr48q0jq38k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"42500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cg9kaawjp23h0kxj2ggx5s90c244wy0lsyxp0ltygwgfkzpjnxsqaevyre\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"42000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1v5rqrf5ctkh0uj2xttjxcrkwaecztmcnaqj9zralud0rt70g8r8s5xmgv7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"41500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1h7fr39agpsasxptf6tflwaqscczaes5ep99v0qqe84sntdh0ew9sumnljk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"41500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1agcww5z2v6ctey3elyhmc2ehfpde3n9hzcnvh9s3fslrlv004rns02462z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"39500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx130vvjzlqpd3dx33j5dvvcwxd2ry8vtx2xstahwpmshpwekq953kqh5r9rv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"39500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qdsec387taxe2aw5j50sjp8qh2eq85deqxa84wmhkvywncvuvkqsygpay7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"38500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lzdxlvkgjgn3flpqqvda4rf43pxed09ycwhvz400f5m0x5306mjqxqkfq9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"38000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ksu3c85u4gd20v5dy5nkjk30fa7endp9mc2za37gr6tuak0y604susek8w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"37500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx146y8qu72rkcw0xrs8vf8y7j423t42rtyynze5d3kw6e79vdsdenqj3esfl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"37500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17kwmmmdvgdmay78tzmr4m488xvax8ft5g98xpx93qg94pu0gtrjqxym59f\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"37500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d8mj6q8tj54rejhx37skuzn88tld7emw3wra9agvjx9glraa8xaskpa5fg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"37000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1z3wfe3x5ahnzflnankn8qjc7dlcfld79n65zz878cupxukqq9akqmayj2j\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"35900000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lnh2du3xrhsjlu2dst8z78x285m5zct9p3c959uldvqpv6km8dusz05n7t\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"35500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16s93fxx6cap0rv6kx8dcc7f6syuymvjdqj7l3j0yas3qhhxw894qxgfcx3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"34500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1esr5qdwsspwt9xap0du009x6m7whdzw8xak806c82rzc2dkwqh3qu5ydzd\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"34000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rdu30vgjdheh4453heuq98es6whgaskx7csmfh28m04sckxqes7ss2y89k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"33500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1g5q667lmyzaclvskxhs3dp533pv5g3uvqu60v8n9ckdcgjm4e7xqe694xs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"33500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19fmsw5j977kh3nexv48lr0neeyese2pl0g8vgjp429d8hfurtf3s3k5ps2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"33000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jlzru5r5xgjs5zx5nktv6klrjvvucwpwqst908ursthn6cqdp7usf98vxc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"32000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1getf4e42wy8w52v4j7dxw52qu93yssytwud90uxyzhg5x0cgptwsathj03\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"31500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1l0a7tg0ux27g2lgwq5vyj0dlsuzcxgl7z7vrxeed59glajvd8f3sk5nvhg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"31500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1k5zj5jew2s2rs5w7dqfzmm2uwv3xavastvkdd06f2fd2x3e676vs8v8rwt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"31000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16aylfh9g5xtm76lt954v7ntgwts3ldppg5a2ll0uw6sd9fklge5q7cdqk7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"31000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx105ezm538jqpj859u3ygggr9umm9nrfxrgjd20mp8j3g22yvev4tqcljpj9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"31000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1can6xxmz54lhtrm53udpehkn6k6qspudttf9pdpg9evccj9hmhaqufdqfs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"30500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1r74wdy7kzh2dfdcumhc85tuherczlt8c4dsqdl03ufyg2lfa4frs2qmwlp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"30500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1m3tug5239zp7zst4qu7c7cns8f8dvel9lnjek23v2zd3ed9mmf2qzgpa9f\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"30500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1wefvja0djemhprqdj73np8mn3v258rx0ffyenpztrnr8tvndrrvsv9aggw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"30000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tw6ur95jjmd95svmhsn4qe0vw84xeev8gsnes6d2ykauuk5xqd6q76vusz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"30000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1wsnset02rd5ksettxhpf2uzw02jszrgtc5960v002c3cwdg254nqekqjen\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"29500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pfyewvtg6l24q40kx74cm2t9epm9wqwx27rph2l8uehnpzhrlqqqupy35q\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"29000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1p7sg2mhf3sknfuefhrrvqg73x8pu23wrrc565rpgqz5j8ke0vqpspgxpvx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"29000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jc22nh8pmjz20qyyz6jwlx5crml0z7wwrrgn3p66rgpt9ay8r9fq9y2864\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"29000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lgsye5dkh57mxj0n2glerlmdzrh76snfte6k92gvxemkuhvug5eqlhcjvm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"27500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10w2sp9rp2s4s6uj32fu68gdqcjvdc9e6h3jm2qmne02400ul5pws4a4r5v\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"27000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1healszdpqs9ppuc2u0lkn6l6ll9n3epeh32rj2lqwcte9g8y58zq4g4pm6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"26500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hpt8ym8h0wk67hyjsa3e3ndncgk2p6qxwam3nrz8pzuyj42rj3hsm5pu7s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"25500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19rwdhaq7taarhhqexejf6frgdk5z6c0zd72c4mvu7k4cwmcxn2es78g2t2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"25500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1x39l3phj2m3grgs0ynhd26nx2afh34faue745hltpzqr0jfsr6zszzkds2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"25000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1dun6jkgf7cscymt6udr8nlm66gjewqyylyzvnswaaq5exzfw4kdqk6nk0p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"25000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kfacc8swpse06qz30mlkefhex6an4jurgmrrancxyan58xw9w93stpsf7y\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"24500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1aepsfj9c4nqqcew5qk8rw5sqqkwer5pnmwx9y4elcdm9gy332vqq7flngz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"24500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1wy0dhr03nf78m4gufm7jcnzfvaqq244ckzmup5s2054apysy6jgq4pp76h\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"24000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1t4q59k0tu50ldpdklks90yrmtdyacw0v826aql4n4dkdvxzprets9vvt2m\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"23500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1argmcrg9rau7m7xy8k4e0s3xw9j95w7upuvpt9hlpz6epj6jhrqqkrytm8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"23000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zrkhjuv3uljccuqjh69vlpmzewvnyckr569aw7frgjz5hsdgflkq0gm7ee\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"23000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18tw0yyc28wuqes5s80nzzh8dsax0rkkpqa4jpcv3wl0t83vf228qd04d9p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"22500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19cxxrr2c4a39pyqda7zqt0dxga6ey7gc67rvlum7ecpzpagtrp2qcakr0j\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"22000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15fa2hl97h05swu4k5n8x6h6h4f37u0f09pakeletnl6ew5ak3pqq29f93n\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"21000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1wepa6m7j62en6tzc75h446sle2s9zpvllv3557t47q9zyr9y52ssu7j49x\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"20500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e39hfndd2x9atrmkyjjlcdn7j3f09cqne0klatnxqhhgqaxmkn3q4f9fd4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"20500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1htwp6wcg0g706lfp8m8zhs3me5a87kj7p9rdqvywdv3ax8lp6jhqhgkwc7\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"20500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rqrc4m6tecvqhn8rrkh9akq5hea56f36w0hkdg933qn3yxyahfdqne30lz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"20000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10aqhm9gswd5eakqkmdl9248j39w37wtwz0vnqzpxp8tsk2zhy6kqcms8w6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"19500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nmya0r2ytqy66sqs3kxctpyd6sqcklzdqcyx038d8c2geysdmhhskph2up\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"19000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15p6ass9pp2l23cja3d6xge8jq5tmpspah67vdp7hv2pnnu04rk4qd5cvcw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"18500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cxvpr0z0rjx9wfqrs7e8dzt5xshhlscpc8fk5xs79009zh3vesus9tru8m\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"18000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1c46ug6qnnu70477acd28w4xh70d45yw2ev62lrwkgvntdga9d7jsvc0497\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"18000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1x7py0zl3zdvtlrz978thjuzyqw7azyfu5264u4l8a9e287rc5juqekjvf2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"18000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1edcr8zgueucattajc94rpsfcmyazh0zseqk4pr2vs67d49kjnn7q9en6ev\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"17500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rftw5xyjw5hy7hjnurnhx2z5am5fnqxwtkhzltcu3ujxvs9f6rtqmm0kv9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"17000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13qkvk6325f25vdmqc5xjq85q485zsgmh5pedmykg37mtt738du9s670h4n\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"17000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kx9uarw6ld7w9nmxytejkzs8q6r5376cqmtlxcd78pf889fwfqwqn6pk5f\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"16500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nu2e8qz86kfx5yfnedyrv559d57makxk3jw57lgwsuet0v8dkp3qkmdh9p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"16000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12vtlj9qhp0uqhs3m9tay4ujwldpj98rgxxw60fy7huxwymgg785scc5d7f\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"16000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qneuv0d6qzv8zgchxzzcmx2w5k42j4wah6k8psw5fcgw48707drsf6nvxm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"15500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1w5vuvkweueqvfl2mtncyexuqchje6nx27552zaz50qt7vwhw5tsqjy2s57\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"15500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10k4auqde486w5wyfajnmpl4ds6tv9x7tzdus85wfxk3r496cgawse6vruy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"15500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12w9lkh26qc7fvw5038usc6y6cv28jy446qn07dczapjcv3rw49dqgk27s4\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"15500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1yqkentanxn7cp69sgz35j4eycq7jjxvel373aljj04a4fnuusqgq3nv5mw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"15500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1a2ak375lfskc6xrf6mmmc89eu3s46ywap2j7d4aj5eyeelctqy6ssshgzj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1c3jpfa9prd34jup0ny2yjc0n7adcwumfukjt90dfsj2262s3h5ds4fuwdh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19f4u3dsn5eyrsp24r0vnun6zadmnlsqpldf5cvl9w6dtqdvenvkq4qclt2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nhs4hestsaxqu42gmrj94lp8klx286q7ymp6dh2cgf6xg6nd6hlse9z9w5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zfqclk23ys7v98ck9ewfjz0x583g94xam3qzuetw28gc6f265xxsr507pc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vk59t5awts2etx5v4jyamy9cudnea8mtl2kzk4caryc8erp6j3mqj2f6xj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1eyu4e3yl3psnywtecgefejdmcpdlu2z67cdma96kh89egt9x4xgsvvejlu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d7a0q2v6qadeafuqguvt0h4a2hea9nky7dmgt7jszpkpfucu07jqwjfzt6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"14000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1z3qzxxkh09r73p9sh872xz7fqjahm048v0e80sypz5gd00u2f47qgf20p2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1knzrpleqz5ehr9j98scgy9vpzne2yg8ta3grp8zzxrxnjhwgvkrs94f6ql\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1usygfr5xcuszd23r5cn627etytpyz8gqk7klyzkllwkwzhal5mjqjtjl3t\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1aawhv22wdnreucw8dk9au0qj93wnf04gvs20hgldlapsj24ny8hs0qtjgq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1qaypsvtfwslrpaa4h0g6x2hh4j0tq9gh2p8dlla6rawr9r9t636qxd6s2k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cx52w3t5tr7ynduqhx9d74lnnvumfm84flymt2etrv2fkfrm3wnqmsd3xa\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rwrvyjx2e6q6frgdmlcqlj565unwz5atsxzapdfpdfgc3pjc583qtxg496\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zrhw7537pgw66vt6df5xxxh23f35gt85ml6s6fvc6vr2qshmdeusuufxxp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"13000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kzfexe6m93ggzewpf7xtd6jx9g9n2k3p9n0em8zhug623tx22d2qdzqnq6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"12000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lj3x3d08usvq9gdjrjvyxhzkxxjylp6qftz7pch635qyq8yjn6yq0h0xxw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"11500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lrlfmzwanfkqu3cg5c98w243du887xx4plshxezc8ljhhcn22acq4dzwew\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"11500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q24h2qhg6ju6cn8r26fh85cv36mmen8ztn2ans7w9aln36p6d5kqegu4na\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"11000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12hhyrde0aptpsm4kssvqw22k5qrq37wmy9ec9lkru47yad4hfrgs5l3jvm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1eaqtuwae4ha30s0vsk2ywg6kp4h6gj9m3ccqqfw7vpp50v49aeysg8hk2w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1de0udjakexj8n4548lm5vy8p69geex988ch6gqjpfvmdds5mquss2xt7jy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zvgs9rvzul3nflhqmtfdu8qpa2aqnqwxwsaatucsulsv5dd4svqsed4fyf\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d8h78has80qk0hv5zxfkx5jlpj5689zht8xlqq30xjhx3y9ezhtqcpw8zu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hsw9sez050ewlwv0wk0e8eglc5cj9807n9rxmzlgrhwsdltwh3mqvyuxjt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tl0fenlw4dgjcpx3hkahecqrxyzquszw8zdjwn4j005vvc7uy3jsgndw9f\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gcrf27d3pmwese0hl4ewnm7xjcwfqm9e789mrax8lyqq86xtz5tqrql96z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"10000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n9sl0wz6rjpnkmlwqphp4rema3ejfqeutujw0gkxncefe9hxglxs7csahg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"9500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lap90zlng56y8scl6qt8pxrljpme7mluaupvv0rl73067y5cxpqqjtpxzm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"9500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n8fykdy0sk7jj8rn7fwv8awzel820mc2d9c9l959hajm8y8s6v5qayvhfr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"9500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rd8z3x6ncsk5734u3xjkqskzxq8tlcn00866309kwqc993j4xnyqhs0r3s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"9000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d9gx5anuvxgg906tzj0rdkhyypjtrfc09ufdc7yykhp9h46mxecs2qe2r2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mh0eqru3fwsmct0aunq5eww9ffs22tscparsznzzq6tvpmg04x6qnzrevn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cdahyf0uv3mfk9qfpjk3q8vwrfqap5xgmg9wckkp5rlt3agn5hlqwhh3px\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vgjfpw47le6hw8kacxtf22tpmr3aqrw9umngy4gjkv94r7hp8gxqcqd55k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lqe5htxxh8ryhstdwmwfn97yjynaym9tl3wwq2x3m52e9qgld74q6uyxdu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pyy6kkvlka03n5pfgwf476ulyna2kwnx3ep9yjj4uvm8c4vzcy6qf7mg0n\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1l74cdd9j6jelh0pw9l96t6vm43zyqp8tdeelcywg09ezac7uwdhsmvnq4y\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xcfx8dstn3hg0wwfdh7lcmnm2gu6x95m849jay7ruzpyw593jpzs800vee\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rr569h8enxr68xd8jzyfplt0xwwqcghkhg2eqltyj9jqws4du60qsagq0s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"8000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15hv295x2hxwzwtzeyypg5lwj2z6k5q7j0ts80jn4n7um9u5zklvqgelhwa\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hny6mwxqqlfktwzkwq3u6l0d08gafd5eq6xwsjxnv7sp58zm8h9skzn58w\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"7000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1cjqcmqm597re656z5w5jq99f7fvyth7wvhz3v4u9xvyxxyjyv5esl8yqfh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12rg768ddyzng9npvlvd6qk4pnu8xy9tjjky6udnvwhv378v0ljcq44me5a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19wqxw4stpk67hge9epj0wmgt59r7w5fepxwxegf6tqrj4adk8emsz9zdlq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16vc774xgs3d0ce37fsc6ykjd9elnxxq8gaep2jtcwn6endwck4csz6fz0z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1d5zv5ucgwufjj9jg7k3suj4uup7ayp9ld2tchxezwz3fyfu7jtfs9wethh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1j2ej2wxexc247mxf5k90lmjcevp4r5cuuaa3ukl7ywvfq488detsgxj7jl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"6000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12gersmcmrkq2daaxsrpk3hpelxsetf2emn4u5qngvvm9x7r6k26slgztww\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10wkjgn0uvyzta7dh4dqcx0q6axx68mdctvkveptmls2e6xnkfhqqa4zlpc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n2y0dl7ktdrvgvv96kde4d042jt4e3722ftpevjcmfmqquyycv7q7s2d2k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1a5x6xect5s2cgdl7rh2hxwz7z5xqecvmlf9jjjj8za58al3mlprsr5germ\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10pxshsy5ajaf90jqgfz98xms2gfwmr8qh336yg8859khq47rjp0sm99hfn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx187hkj0kvu3rjq4tj22xqlc8qkwp8n48xe9yh4xw0nzjj8cut3mnqy28fjq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nuvnyj4t3ryqzkw86grzzlx2zzvc9plmy8u8zllvey79q7c5r8qsvz234v\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pqayqpvzg3txl8q9cl3ul0zrt3v8zdn7u6j9vzw9gn3jlj3cfxrsgskgts\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"5000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1np4pfzqpl26td6khzcfdywcsz0tz4xmyua2havtlpp452vc99yyse4wkmj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12m0cmm80y7twslqtz4z2qhesdkun9ncjhddnkdzeedf2tcap9qxq74nzf2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12ajhpfkhaxqzcgh0lm2zt03qm635e0wazc0u2xlhwp4vflneq2mqupf8uz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10f5xfpvgmx2lkulkqsf50lvafdwwatmdnjwvqh8kgcyexanrkxls49v67d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx10pckcllf4w09gz5uup0waprsh033cmq28e24gnjlcpu54y6nwp4st3su3r\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx173tum306ce679gav9xyzv9dw7m8fhhw4xh7g24xwmgqxjufv6a8q3az0ta\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1avctsmwaxyzw23nwat6mmxevcq3f0s3m9j4ll8x8yunszucx9n4srfjh9f\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"4000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ttds5ut3j7xx72wxg8c6226ewqeyrvzydml7duym8esjwxcg3jpse245zn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ysxav0zk4halpp9r56m0s3cua7r62cfx57snu0s6pqqz56qqt32s2j3jzy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1uhk9jfs34j5a77qs8q0vvk0k2hce5g6y79mr4ct5aadhsf4mt4gsrxkea3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1x758q5t2jafk32raj98u003duqlte37xzzzanwl7tef7gt4234rszr4l02\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gu2uwztus3hpv3wa26m7jfap5dum53elfglgn6wrfzm4n70wurhswl6vwx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1h5mtjmq29qwfpwzvtk8ny4gpk3a20nny5u6fda97mga8t3xfm9zq6c6htl\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vh4j6v35vxpwt9820f8uk0m3v4u6h78gyc9rr5sqrew29dfvcn6q23qgu9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ayukxr9jcev25gddx8yfpv27hauw0z3xy9z2jwzdqk8n624seayqkjhm9d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pq2x5zfqa45sq6s3zmuuy6pen0t7ezrhmdg5q9q02re4x84rakkqlj5m99\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1s84f0s73prw0dltnhwcsw62yqhtk8kxrsvrlmudsvhpgkdezc7csrds369\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1thwz6ymnevqazuq0y5ry73hzu4h45mv3a3a0qdzn8l2rjfxa9sdq0c4clz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1w29nsej9nxdsd498gqgymhhkc5e3enf4tg53a8lrnecspxu6aljsle96lx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1eegz7fuml4vntktg6jarh64sezm259qyamm6qqtghrsxf3mkryts6k4hu5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12rc5mctewx0qv33kwemry6vvqmxgcnc6rn84ksqef9rj9z0rer7spuw6dw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ddu2qyh383tuc3z88svmn7adgekm59lv2r3yc8cg35vclqqztwwsxcg356\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hut2sx0lenf2wed9atd23zp8ps8ntaacmjkd4mym8m05pcz69dssrvr0p2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12ykrc525ay96yfq0aq92vqmc5kqpnalxa0cmhy4x9sqlrvklh43svk5za5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1j6h6ans82uwhp77xnk0w6pd42c7nasqhnlvy5yfksax75l3r3mws2au86p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"3000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1s0qc9xxvasndk09qljlp5mhn78qpn0pc8qe4zg0hw38hwetjzxxs9v4les\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12s69aw0638j3u02s3hzfpklx4zfh5u42vac96scsx4468kzj9xfqxk4659\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1nwfsx2prjuvsq2q3pn2ygjntgu5rgnarpwrqq2l5adfm3wdmwwqste58cg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jz3xqle28yclk7fkk079q990tvya3vqzjrjnrf4phshvt990wt5q30rkay\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1yxqjvl97jnhxwlvqzh8n53g67vc3l2u7m78aks5y9rym5utj948q3dgmma\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jr5hkhp35t05c7g9jxfvs6wz2all566kves6rx5ckl57pz7mmvtsemw7kv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ueuf2ej4q52xk4j4vd65zcuy7vryx0jy4mjag6u2n78suwkz25ksvqvqm5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rkhdpgc8qsht500ty8jvzzqequalqpnk5vzvcx2rj3sr6cwfytksxwh08a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hmqyn4euv2pjwpp2nf3ayq9ktr77dajwuq967uet2r0xqnhj0saqqexshe\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1afqzsqeqaesyj35ugd2r0pt2x30u98uxvxr4y8u4as690zf3kktqfee809\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1dtx0w07ng5vaur9twxe9ajkvq4tfsgmgd7u909xxkvfmw976sr6qlyz0dv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xn6ynt5j0dwm7yh29pmjs6dy3gytm5nllsanwtzry86czx2j30kst7a798\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fq7a0hk0kwers7ymsdm9wswa7qes6fyw7nzguz3erm5j2xd4eynqxxflh2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12wphs5wk5nq55363secf3glve6rzkzmgqfytyq3mgk0lsun99y5s3kk77r\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1v2xtpyjklr994zu0a5hq84azaxyjmlnyz3shvt5fn0rf8nspdraq56jpgw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19klllx0v4jamkq6v2qaw9pyx5fdfvnayg5cahu6kqmajzvu82n0qlx7m63\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx129hapqyd5n0lht763e3rm9mc23fwnh70pxeh9zyntntfvmr4f0yqejt30d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ppglv79lx5ahk8a2cjpfsdvzx6y94c9qzswthyamhx09vcfqnufqvgqs36\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1edrjz53g3n2n6f3jar5prh3269ldncltyts4v7l6hheppzsczsgssp32ju\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tytgkzrx6njx5t6j9gxms2gjv832mzzn2q67kumcft57cyj765csr34n3c\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jwjpe8w9cpamhscl0svn3c3xy47cz50qsn38gu3mxed29gq96assmzaq9p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13cf0qwyp3zg6gqnkcupez7zfnwht6zpx3z2chq4erzstzypxy5xsycnjhu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jqya2nk5kzref5tpqfz7ze2yd4mcdh5ax6szxjtk9sk5wza7hr9shjjsg3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1y307v7ha8la3zys39rljvld86lgzklajw4mzur8n0ehx4mpgqm7sm34wsh\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q4nnmgqzs9lctpsysetvergsf6enfkdqvv6k6t3sedz00whpf83sf8dhkk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1sdg5chqm4y225lmu35pj7ju58p85s9y07a94dke9cs2yq7caktpq5nq7da\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rk9f4slwuur34lnw6phl9nw2465a6pfjj76p0p8zx8erzhsw0jas7pjyqj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"2000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17e4mq3llxatljnfkdf2w0sy8mujaq4fn0q3rwdgztvh8rmlweh2sxk2xdx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ctxq3czng6y2ms40mf6pnq699p7skzsncq5qerceja4k20ve24pscadkxx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13s89rmpg2vlars5nktpfh8mdjahkgzyj96mllj3zuj66zqx28h0sfmqk0k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1sr6hr6werw9vplvje6akazlplymdqlp7hae75uqxdys0z0wy46ns402jhk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14zyrz6re7l4j2zzc72mq8w03vlv5gwvwm3rem7yalq9quz98kdcs3kt6a8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1v8x90upymn830n267009ejv0xwpwmenm6a8nvx0te0v29lauvuaquh3emd\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1swf984qntzm6hrtx2695n82fsemv537ekkenwc94se0ahcxzklmsklc42d\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xc27x4s9qzcsqucjcxqzdqszlp4fjtxpuz56c2770l5yaf5e5jus84sg5f\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1t4fc7yf2t0txxvqgnxdmhxnnd3sw6rcq953z2up277ssl5m0yz8q9h9frn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vw48jzy5re9pp20c9plj77lt85x0aljktkzp945fgugupsf2uxmsmuyeaj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1prlfdpu5gmy5wh3yhtjgzlth0322mcxnw2zagydw5naant6dtegq3r7mqw\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1egfrdtt2khy7hv77kczkxmr8xml7zg4hqlc460527ka0am669q8s2asllj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1xjzpf826avm2g0puuxkv77uhts7pssram2g3eefm0t3pkpce9s2sf8m2fu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1w34up6qcsu5x8aw074ps0fwe3a5xj8wskwgrdjkjnf6v5pq5mahqs3ea04\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12djy7tqtf5xmhdqhk58jkjtp3e6elekgcuhe8zr9reak29xz3c5qdqj7h6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18nu9safwcwcfmx9vzaxgx5w8vd8phra0yf2mzjxym9ewh5t5swjquvv970\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e98kn0hsxlvmn67g9rwq4jsmgfvrmhm55yj2dh6rk0ttrf960zuqrc6e5z\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19xgatr5wuucmh45623z25w42h49zxyn6gcp94dkyr2zrwrm0xycs74mzx6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vexr269f4nrep3gq2h9uxkwvavtrxz372umadmfzupy9jamh545sv2zkch\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1739equ4zcj89u9dl27ssz72wx6h9wrms57s00plkzq3g4wqxjqwsk6q67c\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q9wzqs7kq8tzw2yhnq05ljar5urwratlsr2wvuwfgw40ff3vmcjqhy8rd8\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ms7f97heq78lkjktgxlhs7pdzes743gafp0huda2usvns9jgv8uqpgg8d3\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx18xxcvsm8vekqk6hy2xwx7aen3fwj6us476auqvce9kyw49ekfcnqk7tcwp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15cedp5xjcxgqvwj8hctcykxa7c3hgdlc0gfylnzwmk9vhlfzlz4qhcsacv\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1mtd7200fs2t6hvag0qd5zwgmeg93yjlcst4uztfj3tmx6z7xmt9srj3xhq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx175u4freddynpqmqp4c057dwf9ej62pv0hxh4ew6dwlyf37y5ekvs7djgrs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1n5tgph6psu6a3z3u365ed4xmcm66tdk2pyltztvsy7pzunhfu2dqahcdcz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vj9cy7vtmpzslkenxx9nx3pfsq9uuk0krgvnf5efetd3jxjjk4ssulv7f9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1s8vpfq0d6unp2v8f4nzgxkj0zaru70ps6vael7a20w85rwljlemqmjrqlp\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1kzultmf90j7u5lr9586l5mu3qd4xjl7h4k4yhxztms9spva8d8kqw9qj82\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1vyedt4fgr8vw96qhx2hl8ktptddm68wzs7ytcvwky0et3f2fqzws9gpj63\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19j967tm7fjn73tuwr03w9k6rat4j409295l5j6xrs7w65gl0v49s93mmjs\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1csmu30z07zqudtna93hqlstcmuzp53kalmsawt0wq58l6d488fcs8fjcjx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14cgd45zee9e06xl39x3m8k076gm4tnkr862m49q7vdeqm5ulznxqeyeuju\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17pw8cskjurc9p2503yns2y3m8uv8t3slwas2d9fav6e4xg27ww8s4j9na5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19a2ky2g4tylysduh8k5ev6kms2z2m4kk6veuljjs3cq2c0r7jexqmwewx5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1flhq9y5whh5q4t7jwcu7grfsl2vac95hmst4ywkghajptkazz7sse7je9a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19mrdy4z7gndh4k3dtrv0r38jsz6c4texjlwnmzjh0z0ccnk5t4yses5kz6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16hvwy7xwv9wxf64u0crk72d7jceqayjtk4v25xken3psfswrfhsq469ftu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1333g7ffyguql8wdurnqmspwqrvrsf43647lt7wzatnanzm5xv8cq4q7mg0\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1hruc7t3lcdz2n0mukyjh6l9dtxd9hauzegufz9f05k3yaltz9agqph6vkc\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1w67qjy2g4pyecrdayfrmaltxqk9vpvk577harjk0qdyplrycg82s2yx9fm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"1000000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1pqk0hvm2lrct9uc7k534hg54538s7t9p6xewq49vnamhqs5gp79qfmnw7a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1akhqtjzm3kkr9wlj8nh9kwuza6r7vm4g2nz3pcggmq9dayz7q92qncwv0a\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16qj5ep69xew0qfqms0hw6eh6et3jzjx46wm0xteslv5ufs02nd2qtp4rte\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12ts7lfh9cr6rqj0h9uhmha99tyep6ln6xtmskp4x9pv32s28jrzq3cksav\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17jurkuy7tns92g07uf826te4azhu3qnydcs7d7snvez9xy3dh7gqa8h2hy\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14w3wjj7c7d5w36frrsvjxy0xsuy4nlnufdxlrhuxzrz9xku5vjgsklvpgu\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1y33f8xs9evumw58unlkcdgqudwzrjn5ftk52w0p03277mqvnw4ns05ferx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gh9yw2ctnae2jy95gv3g70h7av7y9d2ha5dk6ehrf4nt0q7lppvs22d2vx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1rwglj5p9s436vdf6y33fu89puyl4sauuv2c6jmpadnqa0jmxezrq7mkt27\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx13ju5ewkc4v2qgg6p5zj3t33p0eczcyfe9eggmv6ksph27px08h7sfsavr5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx170qark2pk7xpjwsrvm4w405pxtjzwgvt3wtygu82a8t02rwan94q4r0vws\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx14v3lzf453lx676rj0uhvp7sph98g7hqzkr0f5g42mtkzppzf2dhqw5f8a2\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1skt9meytux778svqe3d6fyvl7mjfrm99nlgyfwenclgr09ftm7uqc3cqxq\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zw68exayxayyakvgpnrf4ptfkkkcth2lvlu20le3e0ghrpae4hlq4sqfa9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19wes3z0lafn8tge34fupwqs5kzf4mvm3xt7p08u0qgt0d0dg0kzqy2eh4k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx19zld6lprrjhzzhltmjskuv7dxcqnewx9sjll8ccdm538wx40ajpq2f8m0k\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1grznkf6d33xtkhee5899xa2jg8v3ktupude206jt7pzpmxgslgqqxtddgk\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1us9z3c0r8a2fxex7za3vh24zwxmhw37ylna4559ulr7etmg5n27sdnhpfa\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1fxfrkrq80vpzru94heh6vwt52yan8k9znxzvfjtazjk59lpptl3qgnkegx\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1ftt6434d6y9ekacacs5hf3cxg7a3s3uqm9vjm5l893fy5epjyxtquz8hka\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1k32fdxpu9d7lwjc9hd7qw6pz95h2summn9mu2ckyunxq5e20wk3qx7h986\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1lx2dgd8y94t40p55w45cdv0wqdk4m9q0tzaru9pvsq7decczasmq2l6gnz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx16ugged4tg26wydz3g2wasqk96ghz88nk6qzkcsep6qy0r4lcls6sk95mrj\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx15aarz3lnq8da6s86l8kuwwzy0gfw3tdqqu9xhq00lardxl4jv7jsa294sn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1jpyqylp9zekjz9xcccz8h6gaw9f796tp9syvm43x03pxa8zf6ses6lslat\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12h72n35qjgx2qjps70hqal8zuvw26v46rc3auczg4se68878ek4q8xs9xe\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1zx7dt77dgkrzrn25zqqspxxzr6yyhk9wwgt0lelkxeda0ac3jsls68fl0c\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx17s5j40067d5ugggn9ppdjg5enrxe37t0y58y8pjgnc0up25k7chq4rnaaz\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1z9p9lvrqf92x2lluafdyvrz3xjnrvag9wl7lhr6tfkfc0phzklmq8gdhzn\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1gssr7n6rfcffcu6g830sa2gusv89m7mp03sd86fula6gk4th380spllur9\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q3nqrhd9uyjcls6jyj55x4wcnzlfd2mtezfy0m99gd0qt358hy2secef8p\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1x6r4mtz74u0walwxhe4qxcu4cm4vkzkgjsj4p8a6xn9z43zg33ys37vy0e\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q3v3z5txguskd6r0nrqqm4se3u4h5xasw4plxqk4cxfyw3l7tmgqayunfm\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1q5dh2ghd660523gstn5vmc2hf4w26azr3s3nedjp2wu3ae2d27hst49hpg\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1h6lne788w8u58dn0lquz3kjp22s0xkz08sjlxx3zpmwup9k8cjcqupa8r6\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1tn8khcvlnkhprvsgn7eutwlws3vn5yc4mnh85v9vdt5ze8zs7cushvg596\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx193v808tk0f54j0cgxeqpnhywyyp3l3e847wlgl588murpgs43a5q65as7s\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1e38wzhjm5442g2z3xk73paugk479863f3y4q2j0c3yprdw50fpaq20njlr\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx1sk6k9sdj836ynxntk2nt60funlz0t9ptqttrqvg46vcv5mdkwhaqgrgnnt\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }, {\n      \"__type\": \"mmx.txout_t\",\n      \"address\": \"mmx12tkjk987c9kccda9efdrw8xvmuqmca476czrfp0t7tdsysk36hwsdsstc5\",\n      \"contract\": \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\",\n      \"amount\": \"500000\",\n      \"memo\": null\n    }],\n  \"execute\": [],\n  \"solutions\": [],\n  \"deploy\": null,\n  \"exec_result\": null,\n  \"content_hash\": \"CC1C75BEEA5FEBFA487C1EA9A4320741DD4CD5089AEC65FB95E4FCF45DB859F6\"\n}\n"
  },
  {
    "path": "data/mainnet-rc/rewards.json",
    "content": "[[\"mmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx\", 302], [\"mmx10luguxfgx4rfd4nft0ee6ydk9dcedc4gvvwhknp0n9ux9nck45qs5m6cz8\", 3], [\"mmx1ju6l29nxdkdapu9cqk8jf0nhvqc2qjzkecft4ysdtdd030ma8spqh0k5wh\", 323], [\"mmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt\", 80], [\"mmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl\", 863], [\"mmx1p7sg2mhf3sknfuefhrrvqg73x8pu23wrrc565rpgqz5j8ke0vqpspgxpvx\", 58], [\"mmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al\", 51], [\"mmx1c68tgygju8yrhf4samf9mdc9rstzqe34kcz2zqnyqjxcraejlgpsq6jutc\", 12], [\"mmx14xzen52t0aecda0rtqea2zgzrqsf3xlnsswt29uyvrf2qhjy85zsfderjr\", 281], [\"mmx1g4uyjjhup8hgk6akrjqvegmxu6xg98er5pt5uzqn520ud87rlgrqjn8cvt\", 19], [\"mmx10nfcaxrj93rjxxx3us3mwzajznj8qpcd5vg459yfkk8lg90jqq9qxry935\", 340], [\"mmx1cke885syq8wasw96nqp9cuh6wcr7sezvy65a3anjqzqhk59j9s9s7jl0gt\", 16], [\"mmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0\", 58], [\"mmx140ya6nvrw4a9v4ydwrkutvju5tln6tflvq0uehqk6g42d2g8m5xszxwz45\", 11], [\"mmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5\", 91], [\"mmx1vsav2xvgz8p56c0tj2lel0jew2u5v7r8mun2nm4tgu445w50vg8qx6p8yg\", 7], [\"mmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq\", 699], [\"mmx1vmxgy2uzfh8z0t99p0yqgrea3f97grmh33shc28vtvg2lkzcpygq0ls0np\", 8], [\"mmx10vkwltacvwvguxk65jg79d64pnxvr5jpvxmd66smnns7daa6xsgqu045qd\", 153], [\"mmx1edrjz53g3n2n6f3jar5prh3269ldncltyts4v7l6hheppzsczsgssp32ju\", 4], [\"mmx1jghsp60cua83ekgw22a905pv8qqsukjjnz4nw9gkqlllspmsfugsxnremv\", 250], [\"mmx1lnmtuqh7jvxjsmmsf92ulcavxtr4fjhzva774zhs0fwvctzf7vgs53cn9h\", 20], [\"mmx12v7y2c99f25yntuk0dxpu4kwectxx62l7hvqsj4acuvvx0xsrqfqlds5l6\", 110], [\"mmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n\", 4], [\"mmx1grclm0x96ccghh8574wnk8wmmee7g8sxt2emh6mgedezdntecsfqrtaz2t\", 92], [\"mmx14fadj8tx3ksq8jvfmcsuhxnxmmn0lqdlpjs5rs8dfqphgsuluqfqxgys6j\", 1], [\"mmx1eymvxpnp4seshcfn5qfctlzsukazt49t3m5zgz9q68g4sry89cfsggxcfa\", 40], [\"mmx1nr0cpl0g86e0wdzuahcc2x7f4pc63n2y6a6zpnsjt5lfsctzmufspp6vd5\", 35], [\"mmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq\", 89], [\"mmx1xjzpf826avm2g0puuxkv77uhts7pssram2g3eefm0t3pkpce9s2sf8m2fu\", 3], [\"mmx1axrdzlwdpczy66khlgcx6zffrury8z6jxxapeygehz5djt5cpyts2mqw7f\", 111], [\"mmx1eegz7fuml4vntktg6jarh64sezm259qyamm6qqtghrsxf3mkryts6k4hu5\", 6], [\"mmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm\", 1629], [\"mmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9\", 582], [\"mmx1h9l7sgtnyagj2zctlj0xmmn7275uqpss2dn8funllmgd7aj3auvqv0fy7q\", 261], [\"mmx136s9temfus3xkgz3ftwqkrg3kpw3nr67088u2ckhkfvazqknycdqe09z9d\", 106], [\"mmx1t49g9vz555dcm6dvrxt9hxua58jf57w5rmnjnaynnclww8lmagdqc76mnv\", 9409], [\"mmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c\", 58], [\"mmx139s60xj6eeuj5s0fvhgea06up5yy0ucn2fayvg4fd90xyeq9guwsv35zcs\", 79], [\"mmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj\", 565], [\"mmx1090syeqn56ezxh9tzlw2006pqxt34ytn3ytfrkxaqaghh40cncwsya49ev\", 56], [\"mmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\", 54], [\"mmx1mcsgnk9wd5wgausw8se9d50gv2m0dk0x8gg658xy76cnuegl850sklk8p9\", 24], [\"mmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn\", 899], [\"mmx1v35z3r8m5aenzfv9gjx0wcuk9zj5qu98asrr9qa868zrq7qncssq0lsclj\", 77], [\"mmx1zngflag3hu0axh6r6yutlqxt9r7vwd3fh243frzz5gtmfysqeysshp5vuk\", 135], [\"mmx18evqre2xyqqzgspaam0sps0avu9xt7llz7t3r9wexelpy8jnws3s0u7sev\", 26], [\"mmx1fheacy3c48nkd0vgukeuqtldfzuxh2qhudhytshgctqe7sek25jqv99qqt\", 509], [\"mmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj\", 29], [\"mmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf\", 134], [\"mmx10a32q2xtl4pvm2trnjf8cgyswuyywg4allvc7j5pakau4adcdcnsvmsr0u\", 370], [\"mmx1cg5zspl8na39un48fm04caj4xpphaerynw53vnjlwh42f528ns4s53jjv4\", 66], [\"mmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0\", 5], [\"mmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0\", 7], [\"mmx1ueuf2ej4q52xk4j4vd65zcuy7vryx0jy4mjag6u2n78suwkz25ksvqvqm5\", 5], [\"mmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs\", 87], [\"mmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0\", 134], [\"mmx1kl3y0kz6jx5w0vxrcx9afkzthe88syuge0ytumakkce4nu969uhqdtj9hu\", 151], [\"mmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82\", 98], [\"mmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn\", 20], [\"mmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl\", 25], [\"mmx19zr02kj3reljd7fz6lrpwdqep9s2rah2nkcwtm77yxl3ja4sqvcqdxt8gf\", 74], [\"mmx1rc8cv2t60pvyye2mylydmrp970nawa542u74894ejgwufzg7lycq505pp0\", 213], [\"mmx1psgwgft4tf7ult8p4e5gjp9un75t6fyzaxmhr9e64lmd6lf6kgcs53s8uf\", 107], [\"mmx12wn9qtfzagz6z6ztxld2hka8cgvwr0nz55l3qjvkg0ayhhjvlscst4phad\", 3079], [\"mmx193xsayg8rsy3zr5knfkc89hngtyxg2avkaykngh6gky92tatgseqppclmq\", 2808], [\"mmx1lgsye5dkh57mxj0n2glerlmdzrh76snfte6k92gvxemkuhvug5eqlhcjvm\", 35], [\"mmx1pyy6kkvlka03n5pfgwf476ulyna2kwnx3ep9yjj4uvm8c4vzcy6qf7mg0n\", 17], [\"mmx1zx8z2zkc0hvn9cpnjctcc8akqxf0e2au70dd3uln96hz6uxw7c6s6s7s88\", 85], [\"mmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu\", 157], [\"mmx16h8zlf572dedtskx0krrajcrt6d86s0kgukd4rnm7ae9v8tmnvmqhqmdca\", 230], [\"mmx12kjff7s048w38dpcmhelf3f2vt3ul77hrdze97fxr9mhgrw2lvmqnandaf\", 3459], [\"mmx1mlurm4px73xghkdn02u60qff4f795nnmt04e4as595tf4luvasmsggxmfk\", 284], [\"mmx1kez0lk0emjezwdl88ee6c5lvcqftu7l32ksqgl98snkdzke9cyuq58fs6d\", 98], [\"mmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru\", 17], [\"mmx1k738pwqe95qv3g8z9y0lhxsxgvf4z5dv0qgq9eh6vcy7u6juc5usrhgpsh\", 125], [\"mmx1lghunzj070ysr4hd2alsujacc26t99zl3cv5qm03ttjaq4ugmvaqqfy920\", 466], [\"mmx18d8335fhancnvy2zs5wsq8gvcp0l57n3pejex92ndg6s6s3casaqalq6hf\", 257], [\"mmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l\", 116], [\"mmx1kkq8ezuwsast9zplk8ec0pa0me6u3wydkrg5jn5daycgppy63y7s9y0up7\", 970], [\"mmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2\", 22], [\"mmx1gqsyr45tlv0t2ct76wqpxtd0asjjq5df8etlhdva8wfvt8facy7stqeq6c\", 88], [\"mmx1pu8fla0axf3227ttsxggudd6ym9u9vs7nwcrs8uk799ej6yegvlqhnjkd2\", 28], [\"mmx1ls8zjlv2t0prtqvuy4pkasq8a6axrjythsu3nvsne5uzmkk82clqh28yvt\", 22], [\"mmx1lap90zlng56y8scl6qt8pxrljpme7mluaupvv0rl73067y5cxpqqjtpxzm\", 19], [\"mmx189rrmskkykntwceazrltap8a2at40wdhv4wvjtqc2xk8d85ttdqsu5l54m\", 17], [\"mmx1ujghjem0z63dnwrwa8tnswgn8uf2nn8gx26seg4te50wpfjw94pqjhktte\", 1021], [\"mmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3\", 147], [\"mmx1gmvuqg5x4tn9fj53vsgahgwqa9h4jx0cz4x7xpet67kxu8n33fpseycg9t\", 97], [\"mmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn\", 831], [\"mmx1h5mtjmq29qwfpwzvtk8ny4gpk3a20nny5u6fda97mga8t3xfm9zq6c6htl\", 6], [\"mmx1grhexfxkzq9js7t6595mzcnpady60mjuph254rtef25j8x074pzs6s249e\", 491], [\"mmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0\", 309], [\"mmx1ayukxr9jcev25gddx8yfpv27hauw0z3xy9z2jwzdqk8n624seayqkjhm9d\", 1], [\"mmx1pv3lnp3q5kgp28u3w3zmxreft85a3mf4v3rk8qazpxnzwe7ykays5tjlwj\", 107], [\"mmx1eaqtuwae4ha30s0vsk2ywg6kp4h6gj9m3ccqqfw7vpp50v49aeysg8hk2w\", 21], [\"mmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c\", 18], [\"mmx10p75878akjmna30s8kjwnaveql56v2a45tw20fw86ruhvc8x5pxqrqemq9\", 73], [\"mmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj\", 85], [\"mmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy\", 284], [\"mmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr\", 209], [\"mmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6\", 227], [\"mmx12j3mpzmlpx9d77ux2990xwdhus99626yj3s75kyaxt4r80n3638s237x44\", 2], [\"mmx1re7sxpa7fmpseg8phu4pqamqmg72qmm3e7fzx880lz79dnyltpgsga39eg\", 2], [\"mmx1uhk9jfs34j5a77qs8q0vvk0k2hce5g6y79mr4ct5aadhsf4mt4gsrxkea3\", 7], [\"mmx10ah956exf9phe4hw9xwkn3a7m3fwxa7pmhr9cyvlq5p84f8yy4fqwkygu8\", 237], [\"mmx1l3g7hjrczlhsvnshj4jtccavmrrm9chue6ha29hmdua6392mtffq2ddd66\", 5148], [\"mmx14dze6kxepm2ensphv2z0ejl4kc4hks7gwajnjr9nfpw6glnqc4fqz53s5m\", 130], [\"mmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp\", 94], [\"mmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5\", 388], [\"mmx10jqs45t5ujdwtqyft07f4mxk7y08fac4ks0z6ee50n6fkq67992s09ezzz\", 51], [\"mmx1pmecze7k5a4ld66auxywxljxnsad9ducwgzmy4q4k3d6ma6gr3tqtkfrnp\", 89], [\"mmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn\", 270], [\"mmx15hfmkxyxttvpt36w04e0h3sdgr5r25869jpxehj4h6mrt66kppvqp9npnm\", 73], [\"mmx17gfe96qhqt3ylhxxqj7x6qxjzvt8cen7s4ks6e0mt642dplug4vq652g57\", 130], [\"mmx1aa7hmgy7dhsmkhsscp8vlk4y48jyntq0zndsd4lvn4ht0nrjk3vqrtn5mx\", 273], [\"mmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9\", 35], [\"mmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0\", 12], [\"mmx1ff5rqk4myqr32axrt500v0rh0cjp66uh5y0q7r4ed9xy63c954dq3ea3rv\", 2832], [\"mmx1rqrc4m6tecvqhn8rrkh9akq5hea56f36w0hkdg933qn3yxyahfdqne30lz\", 40], [\"mmx143jvevjx827ac7xrc7zx59a3hwd8nvu52khqa4365dk8ct3zff0q2ee25l\", 412], [\"mmx1jj4r3za249xxcyp30jjyen8nz6kmtldqpypwuqhukzrp6trme30qsvdfxk\", 17], [\"mmx12q3pverdv5c465fjeryz5uxnvcjpacnfanynclgq8g5fwj77y9ss2r84v0\", 149], [\"mmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym\", 72], [\"mmx1ff4lyf7ulfrwt0wfnr6dtpuk6tv0w522ef3pkm5ax8e9wv8crd3qe0a7re\", 1132], [\"mmx1ms72mlttvspj4ga668t5xr7k8m98eedvvdwdkmwjfua2ttdmj33qvqyp7s\", 17], [\"mmx1f6khu080cft3c9g5l8qwqh2wlza8473382h4gwursgl0txhdadjqn2kzv7\", 21], [\"mmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t\", 151], [\"mmx1p76tw7re288zm3avlruq0v2h38feqe2usscg6cdcfwn3f8cs5ejsjkev6x\", 347], [\"mmx1rgf2v34pnkjtzg09snd40cd5262dp2hde4k3tkhcjyxdfh7mf4nqx0cf3k\", 288], [\"mmx1mg56jxv3e0plu76824vw3w72kqumgyp2hetfg5s227lr96vjzd5qr4gxnj\", 2], [\"mmx1f4k5ajf9dv0jfuw28xh9vzhmvuphv92dd8mfxxdzssverwfe9p5qdwgc8k\", 309], [\"mmx1efmq0tdmmpv7k7dzd8nn5ta045f9fdylk9pa848hzshh82zlxf5sganjdn\", 42], [\"mmx1vexr269f4nrep3gq2h9uxkwvavtrxz372umadmfzupy9jamh545sv2zkch\", 2], [\"mmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3\", 28], [\"mmx12amu3muxtrrr54qkd6wr7xtawh2lare2aqptywufhl24rex2u94qzl4tgl\", 85], [\"mmx1na96yskrphrrswsg8rwe0e0gwpy4n360t37u6guxwa42a26wqa4sqpfm9s\", 89], [\"mmx1w34up6qcsu5x8aw074ps0fwe3a5xj8wskwgrdjkjnf6v5pq5mahqs3ea04\", 2], [\"mmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60\", 109], [\"mmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj\", 55], [\"mmx1qg6du0mef5nz96gz7wa6f0ndmdhqnen0knwz3kw5ytf4kl9f89eq2kmrsw\", 61], [\"mmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5\", 558], [\"mmx1s90ctrk4g65jv9l8zcysjev9ms3v45uvktp5k52l94m97q0gfpeq886vq5\", 185], [\"mmx1pstmxwmdgkyzqqll6sdu5vdxpkm82ya4tz78w8n2yq4pdcdz39eq3uwvw5\", 2966], [\"mmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu\", 36], [\"mmx1rsjam2cenutaew3r3ssfc8zfh2uy2y3ycawafk0y4hq49djayemqnelh4z\", 28], [\"mmx1hsw9sez050ewlwv0wk0e8eglc5cj9807n9rxmzlgrhwsdltwh3mqvyuxjt\", 20], [\"mmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g\", 30], [\"mmx1xv2dztq36sk27x79gdja33zk6lv8cytmjeqkvlux788rd55l6fuq09zq65\", 127], [\"mmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v\", 2783], [\"mmx1xcalpv2gy0k955p6pl97ayzrycmvrplu9cufx6dfctwrwd9uvpaqypgjxf\", 491], [\"mmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq\", 29], [\"mmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc\", 370], [\"mmx1an3w925endfhcg50qelq69ahwvltupq4rt7wvnhfqd8leg2526qsgh2ret\", 171], [\"mmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3\", 48], [\"mmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv\", 195], [\"mmx1kjc5re76v4htwy0393zxnut5jcutlewywd5udfgh6l4xh5ya3xps8sv4g3\", 189], [\"mmx13xu3ay8eujt4neuwyhxw002r6qlj0v5p8ldj6jus03ev0w5u7wpsxdd3v9\", 3], [\"mmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry\", 251], [\"mmx19wes3z0lafn8tge34fupwqs5kzf4mvm3xt7p08u0qgt0d0dg0kzqy2eh4k\", 1], [\"mmx1fudwe8xuzgwraw6fe6rylklv69x93kqyrgu82jf3tjstsgkm8xrqtc850j\", 427], [\"mmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s\", 106], [\"mmx1g9fl4jus2fumcnkw0k8w9df5cln8yukhrk3kzwuzk5rg68ndmjyqftzc4p\", 103], [\"mmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr\", 132], [\"mmx17grsj5sq8z9h02gnl92mpkajy6janxcnrcrg6mm3w5l232tx8j9sufzatk\", 559], [\"mmx1tsl59gk2ahk0tkrcwnhnjh2kcnfnhyljt3n76h0cu00ael973k9s9dj2aa\", 28], [\"mmx1azdpkjrjlm5v300uknw62m0af3fm3uujupd5zq07gharrx75cj8sdnh0wd\", 365], [\"mmx19tp63ptrre654er8rkx5ntgt4z048tutqx4yplu7daxwm2tgk2gq8hp85z\", 209], [\"mmx1a0lmcmccnm3ak5n82mutjxyz9pj5radgw92qzudnp4eucts6awgqym92mg\", 288], [\"mmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap\", 520], [\"mmx12s69aw0638j3u02s3hzfpklx4zfh5u42vac96scsx4468kzj9xfqxk4659\", 5], [\"mmx1wnkyn2ma6l2nnk80y44nrsqf9fdh27gtx60v3sdxvd9uzheruwfs5kf23g\", 153], [\"mmx1rp6q7eh4zye6494jpq9j6ft69ku2lqqlx363d4z7zspv7wqfqk2skevrl2\", 664], [\"mmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn\", 264], [\"mmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05\", 79], [\"mmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg\", 313], [\"mmx10c7skd5pzvrclcqfemg2nwk0pnpeh6p95aucnt04z3tjhpl3f2vsq6wzpg\", 25], [\"mmx1wcmc5n7v8eujvlzrtuga6fcfmk4d9yjcdhs0fmgenyrt6ycynjdqa6hh0w\", 1121], [\"mmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch\", 20], [\"mmx1qc75vu9xfagl297yupuwl3jgqsecwlae3szn9lwpg9m5p0zcnzwqe4adsz\", 112], [\"mmx1js6nrvnl94rcgn8k80dx6uz2da2jj64utkrxqhmvcvuescmrpwwsvh2vna\", 181], [\"mmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s\", 133], [\"mmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn\", 99], [\"mmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp\", 168], [\"mmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map\", 208], [\"mmx1mzq54zkhcrww85glxx6kaqeeeeqckrwy0j9d377epmh7vrrssxsq8fel5y\", 302], [\"mmx1lty50fwzq0wxaxwzxgjzt7y3r3mhn08eccs5ntz3y4sahd5jfxssnz6qzz\", 1267], [\"mmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp\", 258], [\"mmx16qstch29gdwqtfadwwta8fd20zrhqy7pgkaud2h3ceeafwjcmz3q2ezr8g\", 24], [\"mmx188uhxreda27mxl6lth04vl5y2da7qkldg72gvalsth7dkwxeh23sm9juwr\", 63], [\"mmx13ech6m45gf3ludnt3e3az7jf68qntxg2htk492zuewh40q3yqwjqv6jsej\", 68], [\"mmx1q8d78sjm37uz4pps54q0mn4w3yjesr9jg2pprgww6mmput9rg2jqudrwzl\", 144], [\"mmx1gxx98xmhrcdv4ez5fxekmnczvwuqns3geh3wcj9l463d5jgqcwjqv35gpt\", 55], [\"mmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm\", 43], [\"mmx15qatp4v00zymeq92dmz2sfee0twh36n7vutwp4kcjhdktye8zkjsqftneu\", 200], [\"mmx1v2c3pk23x788qwmhh8dexn6mc94an2l3tgj4kp9th0ygz46997nq6xalyy\", 47], [\"mmx1kdz775nc0jd7uqjrlgd3a7pk6w6qm75w9hw26wa6q8mr3u4m42nqrj38hn\", 23], [\"mmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80\", 25], [\"mmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t\", 12], [\"mmx1mjax0p84wdxsfdffhm5tu5fg3alt3zvam683qk0zu4jh6jredj4qqz6kk0\", 246], [\"mmx16y2cjvyxtwgkm5m0x2wy40g2lc59qcept4dqjakfygwghhxnsx4q5cg5xl\", 172], [\"mmx1s4zvd257h9xqntzj7kd08wnktrzuk7xlya9ttlv2dmkxk79ykz4qzvmjvt\", 108], [\"mmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3\", 120], [\"mmx10aqhm9gswd5eakqkmdl9248j39w37wtwz0vnqzpxp8tsk2zhy6kqcms8w6\", 39], [\"mmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf\", 193], [\"mmx123qaxyt562xlfdxn7fg52nxx9aq6gp8q3jn6kya98xmn7n0z62kq09hk9k\", 4], [\"mmx1tyrnks330n6exxr84vz7d0mjsmpey8p34kuzy07g4nrc7txl87ks63zmhn\", 52], [\"mmx1j5qsf0gulds6ll7mm8aygj9xu52qhcaamadzak5k4c3smx9lajksjyvyzx\", 278], [\"mmx1fqfjglclexnmhlmr5lvwhqm9x6dqvm8cnsr4dpn4ysl5uzfcdwhss0xtp4\", 1230], [\"mmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w\", 9], [\"mmx1kft6gj0a0upukl0dy3qlakx0pm4de4538v92l6saa79jsqkswzcqhjtu6e\", 105], [\"mmx1apz53l6jeqzdtwxry627f2rpagmjwsj42d93ca8jtwcdtht037cq9fsqhm\", 473], [\"mmx1elqhr769rul729fampn6u3ylcxfprr6zgvvndppkzkzzmaefk6csr0s5e2\", 31], [\"mmx1s84f0s73prw0dltnhwcsw62yqhtk8kxrsvrlmudsvhpgkdezc7csrds369\", 6], [\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\", 34], [\"mmx1eaxnhktjt4yegapquud644nfkryfyarth7lwdxwdedg8xhhdlxescdxp0q\", 1817], [\"mmx1ksduhw2jnwayh3a62cnhmxf7vax5lult55kj09ejvqgrr7gy726qkp57w7\", 1], [\"mmx155480tuk2thf5sqkkgft54hmuafu0mj48gql8fdxdvl08guut6mqvy5sc7\", 3463], [\"mmx1h9ahw37ekqwx5sewaszmj54cn0l0pmzrksss7z0320ntkt63q6mssrfkkd\", 78], [\"mmx1hgvgalxcwyssgs5gqsttsfvmt2297u2hw4t7cglllnvswkhg6xuq285wez\", 22], [\"mmx1d8mj6q8tj54rejhx37skuzn88tld7emw3wra9agvjx9glraa8xaskpa5fg\", 3], [\"mmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4\", 10], [\"mmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw\", 154], [\"mmx14ljuxjzlu24djfrm2varlgvfup2q0keydus50mrv6qy2qpuxu2lsmm8gza\", 74], [\"mmx1e83q59e5gy528v9j68ewnhpgkwkdpt47y03ev9a3y5ma5plsyrqqru2dw4\", 622], [\"mmx10wkjgn0uvyzta7dh4dqcx0q6axx68mdctvkveptmls2e6xnkfhqqa4zlpc\", 11], [\"mmx1aeaukjyxfu6gk38swf6s29jrswc67nkra3n3wy5wsxt2fqmvknqq44kzkn\", 338], [\"mmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu\", 138], [\"mmx1qfvy0zcwu0smhdtkkkygyyasjf2eplaurzkq2m2l4ngrnxgy0rpqq8swwy\", 257], [\"mmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99\", 69], [\"mmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0\", 3], [\"mmx1tluhal45404w3qcd59uw08lwf28vq3hhmvvd9andxhjgumajl8rqk3jjd9\", 109], [\"mmx1e2md0mf5cu5uxmme0hxt4apxg9nd7elstzcr7v393nxmgm0rvryqlr557x\", 174], [\"mmx1yjlle0sar0k24juhdv0krzty0qkha6asdjds0d5xvp7gv6apa0yqfr3grh\", 915], [\"mmx1qq2w4yktpymxyhxck2s0z0grp8tlh2l5evsceycvx9af0x3xxhysd536em\", 258], [\"mmx1njy6t7vkta3veyjj4atvr6ppmeeru85tgh5qvhvnmleslru54m9sqp3l60\", 16], [\"mmx1mtd7200fs2t6hvag0qd5zwgmeg93yjlcst4uztfj3tmx6z7xmt9srj3xhq\", 2], [\"mmx1geumptg36crcywp4tzfqeameymf7x9a43qqde9mrpaqxqjernlxqytcsus\", 60], [\"mmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27\", 23], [\"mmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku\", 9], [\"mmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92\", 1494], [\"mmx1998n5nlledt8puwx80neyvle5xkayw0uvgdhuwup6gtpzd6ym0gqp5qzy4\", 55], [\"mmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6\", 604], [\"mmx1ygz7gwf3at3409ggncyfpsyp6cn0ralc4dhezcnkzsxly07x0tgs759304\", 92], [\"mmx1lc7g4gueljhtkf7ffd3l0x747d8j9gk0z88e58zd9l6f7vh73mgsuzjvx3\", 221], [\"mmx1ymnr2tt7vzcklrk97n2phwz96t2t2au64mjqw58efz2aatkex02qryjcxm\", 4163], [\"mmx1mlj7rhkg5c4gp3w4k8dlck5tyf5493dce5vx3x4m4qpzn7ty8mtq6ek2jc\", 1190], [\"mmx1vcp6ksuysun2pdtkrukz6lh2dd7g0d2lpyjk2m3ffylq0yhn4ntq9fpmkm\", 102], [\"mmx1ckrmrs93ya5xud2lskwvn3z8t285awqcl4vx5v6zgyphat5eultqs6ds4l\", 37], [\"mmx1td9zpd4vwncrlgy8kkgft4vkck4yep5nagxr60anls4vrlvs88ts964kg5\", 127], [\"mmx1qn4ugnczkfstu5eh7quuzce30c03uv3etl8u7m426zrpshxpdrvq07f75y\", 139], [\"mmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz\", 2587], [\"mmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9\", 3], [\"mmx1ausld08qthhjwmpxvxuy257ddrnvwq0u0q2qdgzwk6x95lwvp8wqun9tn7\", 100], [\"mmx198yry5ttr65tnmftf4ppzjwvxhqngyncxy3sq5ucz8edmsg5umwqs4u2zs\", 163], [\"mmx1fv4dvhre9mmtldnr2t63qg5hdxa02hzjeh5hu7a3zkmf8a3ql8wqv4txd0\", 1091], [\"mmx10g3yj722j7psxapmpcusn3atzd2fd5r8pq5s9wmdszxweefexm0qzyjazd\", 329], [\"mmx19klllx0v4jamkq6v2qaw9pyx5fdfvnayg5cahu6kqmajzvu82n0qlx7m63\", 4], [\"mmx1h6lg70tzjmvsucw3c7mmdf98p553aj0hfd6sl7nekq4yucf4xnssd7hudq\", 40], [\"mmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt\", 113], [\"mmx15m60pxy8mjp03mmtf9aq8kajmrt8vrzltj8epytnsucts50fh03qhw98ql\", 74], [\"mmx14emrk4d8vzp3c2yztqrzhnmy8r9tsnywrpmfrl838q50j0xjenjqay73ld\", 72], [\"mmx1lzdxlvkgjgn3flpqqvda4rf43pxed09ycwhvz400f5m0x5306mjqxqkfq9\", 76], [\"mmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s\", 20], [\"mmx1re75j8gejzdje5afrkdsl9xknheax4ymznewazk5jqy4msarp05qz7qqsp\", 628], [\"mmx1cthy5xra5u9kwcdgp3z0x55grrj4xv585g69qath07dqrejrct5qk9xrck\", 171], [\"mmx15drd8dvlexsa460klqa0dqlluy0pya79z7lnkvj08zgzuncnzt5shqewhm\", 63], [\"mmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl\", 770], [\"mmx1ug0nljja9d525wv5n8z79vgdjh9vxpf5hf57r2gyu73cm86pcn4s7v3ccg\", 116], [\"mmx1ksu3c85u4gd20v5dy5nkjk30fa7endp9mc2za37gr6tuak0y604susek8w\", 73], [\"mmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a\", 849], [\"mmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\", 1039], [\"mmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05\", 71], [\"mmx1p8dn5gxah24aaufh224nw9ze4e02gpu7enmc057wf3nqxef36lhsndl7cx\", 518], [\"mmx1gu2uwztus3hpv3wa26m7jfap5dum53elfglgn6wrfzm4n70wurhswl6vwx\", 7], [\"mmx1e3rafs5jhzf03a8wxwp43kcguxr98eq3azy5lvatwayvezqfyrcqeumth7\", 1], [\"mmx1rh2lur825y90gqc5pxmejgk5d8wl934h0v8lv972rnevrfhpsmcqsqywld\", 8], [\"mmx1advv0qlzm5l7whwluwdfspmqzwd2k3ra8rgqqvuj0m5hzy5taneqqy7hww\", 310], [\"mmx1avcekqg5tnavcwyw7qs97809yzh0nzq5l9ltyjljelygwxtp40esgyw665\", 132], [\"mmx1g67zee4q9x4wp2s4lkfde4v2m05e90jgn0m42uxw35r22emk3r6qa8ttan\", 42], [\"mmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t\", 130], [\"mmx1c0lcld738xys6rmr0wfyrtgpcvcm8szcst7w9c6cawgmpme6nh6sgtq35u\", 326], [\"mmx1uhw0fqjy4v9stnzuc5fjrelvep597jx95hcm9xr7d0pqt32cenms0ggwv3\", 172], [\"mmx1u9lr65e2v62cht733pjlz5dctk7esxmwaxwjew2xytr7gqgmtnuq3x22cc\", 44], [\"mmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q\", 11], [\"mmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f\", 45], [\"mmx1nwdefg4c7dq34hhvykfzl2um6d6phkfqh22pg5d2q8nderf78n7suz5x6m\", 274], [\"mmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t\", 227], [\"mmx16kkntt0k2spk2xvxlswtwf40p02vlj97cenyvzca58ad8uav68lqfkkh9w\", 2395]]\n"
  },
  {
    "path": "data/mainnet-rc/rewards.txt",
    "content": "mmx1t49g9vz555dcm6dvrxt9hxua58jf57w5rmnjnaynnclww8lmagdqc76mnv\t9409\t4704.5\nmmx1l3g7hjrczlhsvnshj4jtccavmrrm9chue6ha29hmdua6392mtffq2ddd66\t5148\t2574\nmmx1ymnr2tt7vzcklrk97n2phwz96t2t2au64mjqw58efz2aatkex02qryjcxm\t4163\t2081.5\nmmx155480tuk2thf5sqkkgft54hmuafu0mj48gql8fdxdvl08guut6mqvy5sc7\t3463\t1731.5\nmmx12kjff7s048w38dpcmhelf3f2vt3ul77hrdze97fxr9mhgrw2lvmqnandaf\t3459\t1729.5\nmmx12wn9qtfzagz6z6ztxld2hka8cgvwr0nz55l3qjvkg0ayhhjvlscst4phad\t3079\t1539.5\nmmx1pstmxwmdgkyzqqll6sdu5vdxpkm82ya4tz78w8n2yq4pdcdz39eq3uwvw5\t2966\t1483\nmmx1ff5rqk4myqr32axrt500v0rh0cjp66uh5y0q7r4ed9xy63c954dq3ea3rv\t2832\t1416\nmmx193xsayg8rsy3zr5knfkc89hngtyxg2avkaykngh6gky92tatgseqppclmq\t2808\t1404\nmmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v\t2783\t1391.5\nmmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz\t2587\t1293.5\nmmx16kkntt0k2spk2xvxlswtwf40p02vlj97cenyvzca58ad8uav68lqfkkh9w\t2395\t1197.5\nmmx1eaxnhktjt4yegapquud644nfkryfyarth7lwdxwdedg8xhhdlxescdxp0q\t1817\t908.5\nmmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm\t1629\t814.5\nmmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92\t1494\t747\nmmx1lty50fwzq0wxaxwzxgjzt7y3r3mhn08eccs5ntz3y4sahd5jfxssnz6qzz\t1267\t633.5\nmmx1fqfjglclexnmhlmr5lvwhqm9x6dqvm8cnsr4dpn4ysl5uzfcdwhss0xtp4\t1230\t615\nmmx1mlj7rhkg5c4gp3w4k8dlck5tyf5493dce5vx3x4m4qpzn7ty8mtq6ek2jc\t1190\t595\nmmx1ff4lyf7ulfrwt0wfnr6dtpuk6tv0w522ef3pkm5ax8e9wv8crd3qe0a7re\t1132\t566\nmmx1wcmc5n7v8eujvlzrtuga6fcfmk4d9yjcdhs0fmgenyrt6ycynjdqa6hh0w\t1121\t560.5\nmmx1fv4dvhre9mmtldnr2t63qg5hdxa02hzjeh5hu7a3zkmf8a3ql8wqv4txd0\t1091\t545.5\nmmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\t1039\t519.5\nmmx1ujghjem0z63dnwrwa8tnswgn8uf2nn8gx26seg4te50wpfjw94pqjhktte\t1021\t510.5\nmmx1kkq8ezuwsast9zplk8ec0pa0me6u3wydkrg5jn5daycgppy63y7s9y0up7\t970\t485\nmmx1yjlle0sar0k24juhdv0krzty0qkha6asdjds0d5xvp7gv6apa0yqfr3grh\t915\t457.5\nmmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn\t899\t449.5\nmmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl\t863\t431.5\nmmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a\t849\t424.5\nmmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn\t831\t415.5\nmmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl\t770\t385\nmmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq\t699\t349.5\nmmx1rp6q7eh4zye6494jpq9j6ft69ku2lqqlx363d4z7zspv7wqfqk2skevrl2\t664\t332\nmmx1re75j8gejzdje5afrkdsl9xknheax4ymznewazk5jqy4msarp05qz7qqsp\t628\t314\nmmx1e83q59e5gy528v9j68ewnhpgkwkdpt47y03ev9a3y5ma5plsyrqqru2dw4\t622\t311\nmmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6\t604\t302\nmmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9\t582\t291\nmmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj\t565\t282.5\nmmx17grsj5sq8z9h02gnl92mpkajy6janxcnrcrg6mm3w5l232tx8j9sufzatk\t559\t279.5\nmmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5\t558\t279\nmmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap\t520\t260\nmmx1p8dn5gxah24aaufh224nw9ze4e02gpu7enmc057wf3nqxef36lhsndl7cx\t518\t259\nmmx1fheacy3c48nkd0vgukeuqtldfzuxh2qhudhytshgctqe7sek25jqv99qqt\t509\t254.5\nmmx1xcalpv2gy0k955p6pl97ayzrycmvrplu9cufx6dfctwrwd9uvpaqypgjxf\t491\t245.5\nmmx1grhexfxkzq9js7t6595mzcnpady60mjuph254rtef25j8x074pzs6s249e\t491\t245.5\nmmx1apz53l6jeqzdtwxry627f2rpagmjwsj42d93ca8jtwcdtht037cq9fsqhm\t473\t236.5\nmmx1lghunzj070ysr4hd2alsujacc26t99zl3cv5qm03ttjaq4ugmvaqqfy920\t466\t233\nmmx1fudwe8xuzgwraw6fe6rylklv69x93kqyrgu82jf3tjstsgkm8xrqtc850j\t427\t213.5\nmmx143jvevjx827ac7xrc7zx59a3hwd8nvu52khqa4365dk8ct3zff0q2ee25l\t412\t206\nmmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5\t388\t194\nmmx10a32q2xtl4pvm2trnjf8cgyswuyywg4allvc7j5pakau4adcdcnsvmsr0u\t370\t185\nmmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc\t370\t185\nmmx1azdpkjrjlm5v300uknw62m0af3fm3uujupd5zq07gharrx75cj8sdnh0wd\t365\t182.5\nmmx1p76tw7re288zm3avlruq0v2h38feqe2usscg6cdcfwn3f8cs5ejsjkev6x\t347\t173.5\nmmx10nfcaxrj93rjxxx3us3mwzajznj8qpcd5vg459yfkk8lg90jqq9qxry935\t340\t170\nmmx1aeaukjyxfu6gk38swf6s29jrswc67nkra3n3wy5wsxt2fqmvknqq44kzkn\t338\t169\nmmx10g3yj722j7psxapmpcusn3atzd2fd5r8pq5s9wmdszxweefexm0qzyjazd\t329\t164.5\nmmx1c0lcld738xys6rmr0wfyrtgpcvcm8szcst7w9c6cawgmpme6nh6sgtq35u\t326\t163\nmmx1ju6l29nxdkdapu9cqk8jf0nhvqc2qjzkecft4ysdtdd030ma8spqh0k5wh\t323\t161.5\nmmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg\t313\t156.5\nmmx1advv0qlzm5l7whwluwdfspmqzwd2k3ra8rgqqvuj0m5hzy5taneqqy7hww\t310\t155\nmmx1f4k5ajf9dv0jfuw28xh9vzhmvuphv92dd8mfxxdzssverwfe9p5qdwgc8k\t309\t154.5\nmmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0\t309\t154.5\nmmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx\t302\t151\nmmx1mzq54zkhcrww85glxx6kaqeeeeqckrwy0j9d377epmh7vrrssxsq8fel5y\t302\t151\nmmx1a0lmcmccnm3ak5n82mutjxyz9pj5radgw92qzudnp4eucts6awgqym92mg\t288\t144\nmmx1rgf2v34pnkjtzg09snd40cd5262dp2hde4k3tkhcjyxdfh7mf4nqx0cf3k\t288\t144\nmmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy\t284\t142\nmmx1mlurm4px73xghkdn02u60qff4f795nnmt04e4as595tf4luvasmsggxmfk\t284\t142\nmmx14xzen52t0aecda0rtqea2zgzrqsf3xlnsswt29uyvrf2qhjy85zsfderjr\t281\t140.5\nmmx1j5qsf0gulds6ll7mm8aygj9xu52qhcaamadzak5k4c3smx9lajksjyvyzx\t278\t139\nmmx1nwdefg4c7dq34hhvykfzl2um6d6phkfqh22pg5d2q8nderf78n7suz5x6m\t274\t137\nmmx1aa7hmgy7dhsmkhsscp8vlk4y48jyntq0zndsd4lvn4ht0nrjk3vqrtn5mx\t273\t136.5\nmmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn\t270\t135\nmmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn\t264\t132\nmmx1h9l7sgtnyagj2zctlj0xmmn7275uqpss2dn8funllmgd7aj3auvqv0fy7q\t261\t130.5\nmmx1qq2w4yktpymxyhxck2s0z0grp8tlh2l5evsceycvx9af0x3xxhysd536em\t258\t129\nmmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp\t258\t129\nmmx18d8335fhancnvy2zs5wsq8gvcp0l57n3pejex92ndg6s6s3casaqalq6hf\t257\t128.5\nmmx1qfvy0zcwu0smhdtkkkygyyasjf2eplaurzkq2m2l4ngrnxgy0rpqq8swwy\t257\t128.5\nmmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry\t251\t125.5\nmmx1jghsp60cua83ekgw22a905pv8qqsukjjnz4nw9gkqlllspmsfugsxnremv\t250\t125\nmmx1mjax0p84wdxsfdffhm5tu5fg3alt3zvam683qk0zu4jh6jredj4qqz6kk0\t246\t123\nmmx10ah956exf9phe4hw9xwkn3a7m3fwxa7pmhr9cyvlq5p84f8yy4fqwkygu8\t237\t118.5\nmmx16h8zlf572dedtskx0krrajcrt6d86s0kgukd4rnm7ae9v8tmnvmqhqmdca\t230\t115\nmmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6\t227\t113.5\nmmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t\t227\t113.5\nmmx1lc7g4gueljhtkf7ffd3l0x747d8j9gk0z88e58zd9l6f7vh73mgsuzjvx3\t221\t110.5\nmmx1rc8cv2t60pvyye2mylydmrp970nawa542u74894ejgwufzg7lycq505pp0\t213\t106.5\nmmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr\t209\t104.5\nmmx19tp63ptrre654er8rkx5ntgt4z048tutqx4yplu7daxwm2tgk2gq8hp85z\t209\t104.5\nmmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map\t208\t104\nmmx15qatp4v00zymeq92dmz2sfee0twh36n7vutwp4kcjhdktye8zkjsqftneu\t200\t100\nmmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv\t195\t97.5\nmmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf\t193\t96.5\nmmx1kjc5re76v4htwy0393zxnut5jcutlewywd5udfgh6l4xh5ya3xps8sv4g3\t189\t94.5\nmmx1s90ctrk4g65jv9l8zcysjev9ms3v45uvktp5k52l94m97q0gfpeq886vq5\t185\t92.5\nmmx1js6nrvnl94rcgn8k80dx6uz2da2jj64utkrxqhmvcvuescmrpwwsvh2vna\t181\t90.5\nmmx1e2md0mf5cu5uxmme0hxt4apxg9nd7elstzcr7v393nxmgm0rvryqlr557x\t174\t87\nmmx1uhw0fqjy4v9stnzuc5fjrelvep597jx95hcm9xr7d0pqt32cenms0ggwv3\t172\t86\nmmx16y2cjvyxtwgkm5m0x2wy40g2lc59qcept4dqjakfygwghhxnsx4q5cg5xl\t172\t86\nmmx1cthy5xra5u9kwcdgp3z0x55grrj4xv585g69qath07dqrejrct5qk9xrck\t171\t85.5\nmmx1an3w925endfhcg50qelq69ahwvltupq4rt7wvnhfqd8leg2526qsgh2ret\t171\t85.5\nmmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp\t168\t84\nmmx198yry5ttr65tnmftf4ppzjwvxhqngyncxy3sq5ucz8edmsg5umwqs4u2zs\t163\t81.5\nmmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu\t157\t78.5\nmmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw\t154\t77\nmmx10vkwltacvwvguxk65jg79d64pnxvr5jpvxmd66smnns7daa6xsgqu045qd\t153\t76.5\nmmx1wnkyn2ma6l2nnk80y44nrsqf9fdh27gtx60v3sdxvd9uzheruwfs5kf23g\t153\t76.5\nmmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t\t151\t75.5\nmmx1kl3y0kz6jx5w0vxrcx9afkzthe88syuge0ytumakkce4nu969uhqdtj9hu\t151\t75.5\nmmx12q3pverdv5c465fjeryz5uxnvcjpacnfanynclgq8g5fwj77y9ss2r84v0\t149\t74.5\nmmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3\t147\t73.5\nmmx1q8d78sjm37uz4pps54q0mn4w3yjesr9jg2pprgww6mmput9rg2jqudrwzl\t144\t72\nmmx1qn4ugnczkfstu5eh7quuzce30c03uv3etl8u7m426zrpshxpdrvq07f75y\t139\t69.5\nmmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu\t138\t69\nmmx1zngflag3hu0axh6r6yutlqxt9r7vwd3fh243frzz5gtmfysqeysshp5vuk\t135\t67.5\nmmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf\t134\t67\nmmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0\t134\t67\nmmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s\t133\t66.5\nmmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr\t132\t66\nmmx1avcekqg5tnavcwyw7qs97809yzh0nzq5l9ltyjljelygwxtp40esgyw665\t132\t66\nmmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t\t130\t65\nmmx17gfe96qhqt3ylhxxqj7x6qxjzvt8cen7s4ks6e0mt642dplug4vq652g57\t130\t65\nmmx14dze6kxepm2ensphv2z0ejl4kc4hks7gwajnjr9nfpw6glnqc4fqz53s5m\t130\t65\nmmx1xv2dztq36sk27x79gdja33zk6lv8cytmjeqkvlux788rd55l6fuq09zq65\t127\t63.5\nmmx1td9zpd4vwncrlgy8kkgft4vkck4yep5nagxr60anls4vrlvs88ts964kg5\t127\t63.5\nmmx1k738pwqe95qv3g8z9y0lhxsxgvf4z5dv0qgq9eh6vcy7u6juc5usrhgpsh\t125\t62.5\nmmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3\t120\t60\nmmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l\t116\t58\nmmx1ug0nljja9d525wv5n8z79vgdjh9vxpf5hf57r2gyu73cm86pcn4s7v3ccg\t116\t58\nmmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt\t113\t56.5\nmmx1qc75vu9xfagl297yupuwl3jgqsecwlae3szn9lwpg9m5p0zcnzwqe4adsz\t112\t56\nmmx1axrdzlwdpczy66khlgcx6zffrury8z6jxxapeygehz5djt5cpyts2mqw7f\t111\t55.5\nmmx12v7y2c99f25yntuk0dxpu4kwectxx62l7hvqsj4acuvvx0xsrqfqlds5l6\t110\t55\nmmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60\t109\t54.5\nmmx1tluhal45404w3qcd59uw08lwf28vq3hhmvvd9andxhjgumajl8rqk3jjd9\t109\t54.5\nmmx1s4zvd257h9xqntzj7kd08wnktrzuk7xlya9ttlv2dmkxk79ykz4qzvmjvt\t108\t54\nmmx1pv3lnp3q5kgp28u3w3zmxreft85a3mf4v3rk8qazpxnzwe7ykays5tjlwj\t107\t53.5\nmmx1psgwgft4tf7ult8p4e5gjp9un75t6fyzaxmhr9e64lmd6lf6kgcs53s8uf\t107\t53.5\nmmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s\t106\t53\nmmx136s9temfus3xkgz3ftwqkrg3kpw3nr67088u2ckhkfvazqknycdqe09z9d\t106\t53\nmmx1kft6gj0a0upukl0dy3qlakx0pm4de4538v92l6saa79jsqkswzcqhjtu6e\t105\t52.5\nmmx1g9fl4jus2fumcnkw0k8w9df5cln8yukhrk3kzwuzk5rg68ndmjyqftzc4p\t103\t51.5\nmmx1vcp6ksuysun2pdtkrukz6lh2dd7g0d2lpyjk2m3ffylq0yhn4ntq9fpmkm\t102\t51\nmmx1ausld08qthhjwmpxvxuy257ddrnvwq0u0q2qdgzwk6x95lwvp8wqun9tn7\t100\t50\nmmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn\t99\t49.5\nmmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82\t98\t49\nmmx1kez0lk0emjezwdl88ee6c5lvcqftu7l32ksqgl98snkdzke9cyuq58fs6d\t98\t49\nmmx1gmvuqg5x4tn9fj53vsgahgwqa9h4jx0cz4x7xpet67kxu8n33fpseycg9t\t97\t48.5\nmmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp\t94\t47\nmmx1grclm0x96ccghh8574wnk8wmmee7g8sxt2emh6mgedezdntecsfqrtaz2t\t92\t46\nmmx1ygz7gwf3at3409ggncyfpsyp6cn0ralc4dhezcnkzsxly07x0tgs759304\t92\t46\nmmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5\t91\t45.5\nmmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq\t89\t44.5\nmmx1na96yskrphrrswsg8rwe0e0gwpy4n360t37u6guxwa42a26wqa4sqpfm9s\t89\t44.5\nmmx1pmecze7k5a4ld66auxywxljxnsad9ducwgzmy4q4k3d6ma6gr3tqtkfrnp\t89\t44.5\nmmx1gqsyr45tlv0t2ct76wqpxtd0asjjq5df8etlhdva8wfvt8facy7stqeq6c\t88\t44\nmmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs\t87\t43.5\nmmx1zx8z2zkc0hvn9cpnjctcc8akqxf0e2au70dd3uln96hz6uxw7c6s6s7s88\t85\t42.5\nmmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj\t85\t42.5\nmmx12amu3muxtrrr54qkd6wr7xtawh2lare2aqptywufhl24rex2u94qzl4tgl\t85\t42.5\nmmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt\t80\t40\nmmx139s60xj6eeuj5s0fvhgea06up5yy0ucn2fayvg4fd90xyeq9guwsv35zcs\t79\t39.5\nmmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05\t79\t39.5\nmmx1h9ahw37ekqwx5sewaszmj54cn0l0pmzrksss7z0320ntkt63q6mssrfkkd\t78\t39\nmmx1v35z3r8m5aenzfv9gjx0wcuk9zj5qu98asrr9qa868zrq7qncssq0lsclj\t77\t38.5\nmmx1lzdxlvkgjgn3flpqqvda4rf43pxed09ycwhvz400f5m0x5306mjqxqkfq9\t76\t38\nmmx14ljuxjzlu24djfrm2varlgvfup2q0keydus50mrv6qy2qpuxu2lsmm8gza\t74\t37\nmmx15m60pxy8mjp03mmtf9aq8kajmrt8vrzltj8epytnsucts50fh03qhw98ql\t74\t37\nmmx19zr02kj3reljd7fz6lrpwdqep9s2rah2nkcwtm77yxl3ja4sqvcqdxt8gf\t74\t37\nmmx15hfmkxyxttvpt36w04e0h3sdgr5r25869jpxehj4h6mrt66kppvqp9npnm\t73\t36.5\nmmx1ksu3c85u4gd20v5dy5nkjk30fa7endp9mc2za37gr6tuak0y604susek8w\t73\t36.5\nmmx10p75878akjmna30s8kjwnaveql56v2a45tw20fw86ruhvc8x5pxqrqemq9\t73\t36.5\nmmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym\t72\t36\nmmx14emrk4d8vzp3c2yztqrzhnmy8r9tsnywrpmfrl838q50j0xjenjqay73ld\t72\t36\nmmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05\t71\t35.5\nmmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99\t69\t34.5\nmmx13ech6m45gf3ludnt3e3az7jf68qntxg2htk492zuewh40q3yqwjqv6jsej\t68\t34\nmmx1cg5zspl8na39un48fm04caj4xpphaerynw53vnjlwh42f528ns4s53jjv4\t66\t33\nmmx15drd8dvlexsa460klqa0dqlluy0pya79z7lnkvj08zgzuncnzt5shqewhm\t63\t31.5\nmmx188uhxreda27mxl6lth04vl5y2da7qkldg72gvalsth7dkwxeh23sm9juwr\t63\t31.5\nmmx1qg6du0mef5nz96gz7wa6f0ndmdhqnen0knwz3kw5ytf4kl9f89eq2kmrsw\t61\t30.5\nmmx1geumptg36crcywp4tzfqeameymf7x9a43qqde9mrpaqxqjernlxqytcsus\t60\t30\nmmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0\t58\t29\nmmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c\t58\t29\nmmx1p7sg2mhf3sknfuefhrrvqg73x8pu23wrrc565rpgqz5j8ke0vqpspgxpvx\t58\t29\nmmx1090syeqn56ezxh9tzlw2006pqxt34ytn3ytfrkxaqaghh40cncwsya49ev\t56\t28\nmmx1998n5nlledt8puwx80neyvle5xkayw0uvgdhuwup6gtpzd6ym0gqp5qzy4\t55\t27.5\nmmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj\t55\t27.5\nmmx1gxx98xmhrcdv4ez5fxekmnczvwuqns3geh3wcj9l463d5jgqcwjqv35gpt\t55\t27.5\nmmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\t54\t27\nmmx1tyrnks330n6exxr84vz7d0mjsmpey8p34kuzy07g4nrc7txl87ks63zmhn\t52\t26\nmmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al\t51\t25.5\nmmx10jqs45t5ujdwtqyft07f4mxk7y08fac4ks0z6ee50n6fkq67992s09ezzz\t51\t25.5\nmmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3\t48\t24\nmmx1v2c3pk23x788qwmhh8dexn6mc94an2l3tgj4kp9th0ygz46997nq6xalyy\t47\t23.5\nmmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f\t45\t22.5\nmmx1u9lr65e2v62cht733pjlz5dctk7esxmwaxwjew2xytr7gqgmtnuq3x22cc\t44\t22\nmmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm\t43\t21.5\nmmx1efmq0tdmmpv7k7dzd8nn5ta045f9fdylk9pa848hzshh82zlxf5sganjdn\t42\t21\nmmx1g67zee4q9x4wp2s4lkfde4v2m05e90jgn0m42uxw35r22emk3r6qa8ttan\t42\t21\nmmx1eymvxpnp4seshcfn5qfctlzsukazt49t3m5zgz9q68g4sry89cfsggxcfa\t40\t20\nmmx1h6lg70tzjmvsucw3c7mmdf98p553aj0hfd6sl7nekq4yucf4xnssd7hudq\t40\t20\nmmx1rqrc4m6tecvqhn8rrkh9akq5hea56f36w0hkdg933qn3yxyahfdqne30lz\t40\t20\nmmx10aqhm9gswd5eakqkmdl9248j39w37wtwz0vnqzpxp8tsk2zhy6kqcms8w6\t39\t19.5\nmmx1ckrmrs93ya5xud2lskwvn3z8t285awqcl4vx5v6zgyphat5eultqs6ds4l\t37\t18.5\nmmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu\t36\t18\nmmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9\t35\t17.5\nmmx1lgsye5dkh57mxj0n2glerlmdzrh76snfte6k92gvxemkuhvug5eqlhcjvm\t35\t17.5\nmmx1nr0cpl0g86e0wdzuahcc2x7f4pc63n2y6a6zpnsjt5lfsctzmufspp6vd5\t35\t17.5\nmmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\t34\t17\nmmx1elqhr769rul729fampn6u3ylcxfprr6zgvvndppkzkzzmaefk6csr0s5e2\t31\t15.5\nmmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g\t30\t15\nmmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq\t29\t14.5\nmmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj\t29\t14.5\nmmx1tsl59gk2ahk0tkrcwnhnjh2kcnfnhyljt3n76h0cu00ael973k9s9dj2aa\t28\t14\nmmx1pu8fla0axf3227ttsxggudd6ym9u9vs7nwcrs8uk799ej6yegvlqhnjkd2\t28\t14\nmmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3\t28\t14\nmmx1rsjam2cenutaew3r3ssfc8zfh2uy2y3ycawafk0y4hq49djayemqnelh4z\t28\t14\nmmx18evqre2xyqqzgspaam0sps0avu9xt7llz7t3r9wexelpy8jnws3s0u7sev\t26\t13\nmmx10c7skd5pzvrclcqfemg2nwk0pnpeh6p95aucnt04z3tjhpl3f2vsq6wzpg\t25\t12.5\nmmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80\t25\t12.5\nmmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl\t25\t12.5\nmmx1mcsgnk9wd5wgausw8se9d50gv2m0dk0x8gg658xy76cnuegl850sklk8p9\t24\t12\nmmx16qstch29gdwqtfadwwta8fd20zrhqy7pgkaud2h3ceeafwjcmz3q2ezr8g\t24\t12\nmmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27\t23\t11.5\nmmx1kdz775nc0jd7uqjrlgd3a7pk6w6qm75w9hw26wa6q8mr3u4m42nqrj38hn\t23\t11.5\nmmx1hgvgalxcwyssgs5gqsttsfvmt2297u2hw4t7cglllnvswkhg6xuq285wez\t22\t11\nmmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2\t22\t11\nmmx1ls8zjlv2t0prtqvuy4pkasq8a6axrjythsu3nvsne5uzmkk82clqh28yvt\t22\t11\nmmx1eaqtuwae4ha30s0vsk2ywg6kp4h6gj9m3ccqqfw7vpp50v49aeysg8hk2w\t21\t10.5\nmmx1f6khu080cft3c9g5l8qwqh2wlza8473382h4gwursgl0txhdadjqn2kzv7\t21\t10.5\nmmx1hsw9sez050ewlwv0wk0e8eglc5cj9807n9rxmzlgrhwsdltwh3mqvyuxjt\t20\t10\nmmx1lnmtuqh7jvxjsmmsf92ulcavxtr4fjhzva774zhs0fwvctzf7vgs53cn9h\t20\t10\nmmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s\t20\t10\nmmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn\t20\t10\nmmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch\t20\t10\nmmx1lap90zlng56y8scl6qt8pxrljpme7mluaupvv0rl73067y5cxpqqjtpxzm\t19\t9.5\nmmx1g4uyjjhup8hgk6akrjqvegmxu6xg98er5pt5uzqn520ud87rlgrqjn8cvt\t19\t9.5\nmmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c\t18\t9\nmmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru\t17\t8.5\nmmx1ms72mlttvspj4ga668t5xr7k8m98eedvvdwdkmwjfua2ttdmj33qvqyp7s\t17\t8.5\nmmx1jj4r3za249xxcyp30jjyen8nz6kmtldqpypwuqhukzrp6trme30qsvdfxk\t17\t8.5\nmmx1pyy6kkvlka03n5pfgwf476ulyna2kwnx3ep9yjj4uvm8c4vzcy6qf7mg0n\t17\t8.5\nmmx189rrmskkykntwceazrltap8a2at40wdhv4wvjtqc2xk8d85ttdqsu5l54m\t17\t8.5\nmmx1njy6t7vkta3veyjj4atvr6ppmeeru85tgh5qvhvnmleslru54m9sqp3l60\t16\t8\nmmx1cke885syq8wasw96nqp9cuh6wcr7sezvy65a3anjqzqhk59j9s9s7jl0gt\t16\t8\nmmx1c68tgygju8yrhf4samf9mdc9rstzqe34kcz2zqnyqjxcraejlgpsq6jutc\t12\t6\nmmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t\t12\t6\nmmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0\t12\t6\nmmx10wkjgn0uvyzta7dh4dqcx0q6axx68mdctvkveptmls2e6xnkfhqqa4zlpc\t11\t5.5\nmmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q\t11\t5.5\nmmx140ya6nvrw4a9v4ydwrkutvju5tln6tflvq0uehqk6g42d2g8m5xszxwz45\t11\t5.5\nmmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4\t10\t5\nmmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w\t9\t4.5\nmmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku\t9\t4.5\nmmx1rh2lur825y90gqc5pxmejgk5d8wl934h0v8lv972rnevrfhpsmcqsqywld\t8\t4\nmmx1vmxgy2uzfh8z0t99p0yqgrea3f97grmh33shc28vtvg2lkzcpygq0ls0np\t8\t4\nmmx1gu2uwztus3hpv3wa26m7jfap5dum53elfglgn6wrfzm4n70wurhswl6vwx\t7\t3.5\nmmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0\t7\t3.5\nmmx1vsav2xvgz8p56c0tj2lel0jew2u5v7r8mun2nm4tgu445w50vg8qx6p8yg\t7\t3.5\nmmx1uhk9jfs34j5a77qs8q0vvk0k2hce5g6y79mr4ct5aadhsf4mt4gsrxkea3\t7\t3.5\nmmx1s84f0s73prw0dltnhwcsw62yqhtk8kxrsvrlmudsvhpgkdezc7csrds369\t6\t3\nmmx1h5mtjmq29qwfpwzvtk8ny4gpk3a20nny5u6fda97mga8t3xfm9zq6c6htl\t6\t3\nmmx1eegz7fuml4vntktg6jarh64sezm259qyamm6qqtghrsxf3mkryts6k4hu5\t6\t3\nmmx1ueuf2ej4q52xk4j4vd65zcuy7vryx0jy4mjag6u2n78suwkz25ksvqvqm5\t5\t2.5\nmmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0\t5\t2.5\nmmx12s69aw0638j3u02s3hzfpklx4zfh5u42vac96scsx4468kzj9xfqxk4659\t5\t2.5\nmmx19klllx0v4jamkq6v2qaw9pyx5fdfvnayg5cahu6kqmajzvu82n0qlx7m63\t4\t2\nmmx1edrjz53g3n2n6f3jar5prh3269ldncltyts4v7l6hheppzsczsgssp32ju\t4\t2\nmmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n\t4\t2\nmmx123qaxyt562xlfdxn7fg52nxx9aq6gp8q3jn6kya98xmn7n0z62kq09hk9k\t4\t2\nmmx10luguxfgx4rfd4nft0ee6ydk9dcedc4gvvwhknp0n9ux9nck45qs5m6cz8\t3\t1.5\nmmx1d8mj6q8tj54rejhx37skuzn88tld7emw3wra9agvjx9glraa8xaskpa5fg\t3\t1.5\nmmx1xjzpf826avm2g0puuxkv77uhts7pssram2g3eefm0t3pkpce9s2sf8m2fu\t3\t1.5\nmmx13xu3ay8eujt4neuwyhxw002r6qlj0v5p8ldj6jus03ev0w5u7wpsxdd3v9\t3\t1.5\nmmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0\t3\t1.5\nmmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9\t3\t1.5\nmmx1w34up6qcsu5x8aw074ps0fwe3a5xj8wskwgrdjkjnf6v5pq5mahqs3ea04\t2\t1\nmmx1vexr269f4nrep3gq2h9uxkwvavtrxz372umadmfzupy9jamh545sv2zkch\t2\t1\nmmx1mtd7200fs2t6hvag0qd5zwgmeg93yjlcst4uztfj3tmx6z7xmt9srj3xhq\t2\t1\nmmx1mg56jxv3e0plu76824vw3w72kqumgyp2hetfg5s227lr96vjzd5qr4gxnj\t2\t1\nmmx1re7sxpa7fmpseg8phu4pqamqmg72qmm3e7fzx880lz79dnyltpgsga39eg\t2\t1\nmmx12j3mpzmlpx9d77ux2990xwdhus99626yj3s75kyaxt4r80n3638s237x44\t2\t1\nmmx1e3rafs5jhzf03a8wxwp43kcguxr98eq3azy5lvatwayvezqfyrcqeumth7\t1\t0.5\nmmx19wes3z0lafn8tge34fupwqs5kzf4mvm3xt7p08u0qgt0d0dg0kzqy2eh4k\t1\t0.5\nmmx14fadj8tx3ksq8jvfmcsuhxnxmmn0lqdlpjs5rs8dfqphgsuluqfqxgys6j\t1\t0.5\nmmx1ksduhw2jnwayh3a62cnhmxf7vax5lult55kj09ejvqgrr7gy726qkp57w7\t1\t0.5\nmmx1ayukxr9jcev25gddx8yfpv27hauw0z3xy9z2jwzdqk8n624seayqkjhm9d\t1\t0.5\n"
  },
  {
    "path": "data/mainnet-rc/timelord_rewards.json",
    "content": "[[\"mmx1d0xr746m7nqek3rplkuv6xjk2ne7ul0q45cjgp8gtjkut4eh8apsht6yzk\", 56618], [\"mmx1z3wfe3x5ahnzflnankn8qjc7dlcfld79n65zz878cupxukqq9akqmayj2j\", 3590], [\"mmx1hyfskfa3wpxgtajdfskdmgljj3tr7wna6jyqxqdecdeup5rgn24q4e4x67\", 41307], [\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\", 85], [\"mmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\", 144]]\n"
  },
  {
    "path": "data/mainnet-rc/timelord_rewards.txt",
    "content": "mmx1d0xr746m7nqek3rplkuv6xjk2ne7ul0q45cjgp8gtjkut4eh8apsht6yzk\t56618\t566.18\nmmx1hyfskfa3wpxgtajdfskdmgljj3tr7wna6jyqxqdecdeup5rgn24q4e4x67\t41307\t413.07\nmmx1z3wfe3x5ahnzflnankn8qjc7dlcfld79n65zz878cupxukqq9akqmayj2j\t3590\t35.9\nmmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\t144\t1.44\nmmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\t85\t0.85\n"
  },
  {
    "path": "data/testnet10/rewards.json",
    "content": "[[\"mmx1j7njmgtzmqr49n9lyacawww0uv2sjgxs7d04xu2ns6k62hfqycqsh33u92\", 37], [\"mmx1k9lslhl4wmhs7ray9lfh47cxkz0j5vr827vypyaltsq80697xyqss2gn93\", 90], [\"mmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx\", 16117], [\"mmx10luguxfgx4rfd4nft0ee6ydk9dcedc4gvvwhknp0n9ux9nck45qs5m6cz8\", 1280], [\"mmx1ju6l29nxdkdapu9cqk8jf0nhvqc2qjzkecft4ysdtdd030ma8spqh0k5wh\", 2992], [\"mmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt\", 1056], [\"mmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl\", 6144], [\"mmx1as0ezwhva4ch25cssuzrv8hr2vk4fyt8ycefdtx7dnwt5rgadcps7ezzc4\", 4417], [\"mmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al\", 1334], [\"mmx1544prt4r26fm2f6ytlvdfe3j6mwrs5p479kp3lcrz5n58kp8ugpssn2z2u\", 573], [\"mmx1c68tgygju8yrhf4samf9mdc9rstzqe34kcz2zqnyqjxcraejlgpsq6jutc\", 280], [\"mmx1vprl39d98qzd3u5nk95qnhus9vjp4sen2w7y59yu0m5udqll6szquzr6y5\", 88], [\"mmx1f3ecr58txvmxjrlhnx3nw0wg7y7zdef73gcgjfrvcf8lgrdu3czsn4yx6z\", 6640], [\"mmx1e8xldlayy2j5ptk9grrze76e5jyc8p0uq0zuslawyhqeu7xme5rsh06fw0\", 20], [\"mmx1seel6072m4ywm84s0e283gl34drku8p764x7qmw2ae24pvsa6crs6eptk7\", 33694], [\"mmx1fr77kwzjzcv3xmrhczs5wwsmxlufp9kkvndch9d78fr3m09mqgysc6lnaa\", 1069], [\"mmx1u2v2uf8seke36nxtxh90hpgh43dy5py836ygkvqwaqx5jhck95ysjepx8g\", 25], [\"mmx10nfcaxrj93rjxxx3us3mwzajznj8qpcd5vg459yfkk8lg90jqq9qxry935\", 21211], [\"mmx1zqrr5qw2akhgvvxnfvl3epw5zxjy8j3930fed2agnexxjelrhy9qdrrh37\", 154], [\"mmx1tagjkz3avdgz8a5kn8kkhs3lr9lur0fmdt9zuz49h9j9vcg80v9scl8fpc\", 106], [\"mmx10ew79lhecezg2ewrj8l8egjtwmkffvs2jfl8rdgxy32arecyp5xqdryl8y\", 519], [\"mmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0\", 2407], [\"mmx1mhp72cd0lfnlfpfuclh9p6uqcuu6y0cr4cx7qnk266hleawuyuxscha8vw\", 292], [\"mmx1pmjftgdx7vsmtydypwy6qe8tnmtc9wgya5s2yl23myvk98c83uxszm6cvd\", 537], [\"mmx1q5kdfkldkc735p5e7aj6y5y0szvhml9nchux98cfqfun4wa74vxsm3zr8c\", 35], [\"mmx140ya6nvrw4a9v4ydwrkutvju5tln6tflvq0uehqk6g42d2g8m5xszxwz45\", 22], [\"mmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5\", 3758], [\"mmx1vsav2xvgz8p56c0tj2lel0jew2u5v7r8mun2nm4tgu445w50vg8qx6p8yg\", 1826], [\"mmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq\", 39524], [\"mmx1vmxgy2uzfh8z0t99p0yqgrea3f97grmh33shc28vtvg2lkzcpygq0ls0np\", 227], [\"mmx1c4sffu66s9eepqph3kfjarh4fp5h5dhl3u0r8jvrqlq4jkdp3sgq4dcav7\", 681], [\"mmx1ed9e542ggt95rk3ygc3xt29apzs2fsx384mwhqqwy30qs4wdhqgs9qh33j\", 5134], [\"mmx17vr7dm99pccp240q7kr4ynw0tln4r6h9n34vc9dcdk7gch3dcqgscgaw0w\", 1523], [\"mmx1ppglv79lx5ahk8a2cjpfsdvzx6y94c9qzswthyamhx09vcfqnufqvgqs36\", 4], [\"mmx15fpxwx7ah2d8wa0sknq05gplj90xpxf0xknweszyhdd0eacp4yfq2e43z2\", 38536], [\"mmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n\", 5817], [\"mmx1n04te3zvrvfsgmvzl3dzegpntqeqevwmd2ycwwwhng0hwslxkyfqpq2ng5\", 156], [\"mmx1uw2mjnw6zt8t0r2w0afqu3zw7jkjl80xjwnfgk6cx7m2c9u5052q6m24l3\", 330], [\"mmx122x5elltrsykqwy27q4jpe405m5d6aaxtfte87mjl6zty5e5ju2q9ucfz8\", 282], [\"mmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq\", 20262], [\"mmx1els3e8hj2jvteh7y2xgwwxwq2uknurtkp63ca74gcuhrcajpzc2skqmh40\", 118], [\"mmx1r8mm9d0q88dr7dw0v94yl0cthpr560r30x90zxcutltxcck6xq2sm3yx2k\", 857], [\"mmx15spum2ccvkzj5zg32v0qzy9xhhafsa278ujyq20m2yhwq5lpxstq8ghswd\", 837], [\"mmx12u3ppvj9yvh6xs36zscus50m644dx8ywqq530w3jkjhly8hf3qtqy6fe48\", 864], [\"mmx107aackvhak3d2lapgz6qprp9785qfudzrclptqzvgkpzly2ppqtsypk9kk\", 2597], [\"mmx1gntkqf266vrn7swllylnxpaayt7n06yqxhxjsaglkk8fzds4xuts4gwjsw\", 1073], [\"mmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm\", 190434], [\"mmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9\", 11353], [\"mmx1arwca695tyd8rsgxx8r707xpe3laawcv3lq593hs4qz9zehlngvsz68wh7\", 199], [\"mmx1thwz6ymnevqazuq0y5ry73hzu4h45mv3a3a0qdzn8l2rjfxa9sdq0c4clz\", 6], [\"mmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c\", 1102], [\"mmx17naccyvydtmkgnaqvu7q3dpphzv3grdsgm0fk4ja220v3nxwnywqwss094\", 226], [\"mmx139le573u5rq3g7a4adydjznp86en3u5wznrlywq5k0jy0s49fvwspq0w5k\", 90], [\"mmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj\", 1489], [\"mmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\", 1195], [\"mmx1vkya64sext8u0kcj2fsrezryfvxyprez6xdxapkzpcywakxh7v0qu63esv\", 701], [\"mmx1mcsgnk9wd5wgausw8se9d50gv2m0dk0x8gg658xy76cnuegl850sklk8p9\", 4709], [\"mmx1kn0k496puu64hyutyn6augc2cj52rc4p0vmmfcceqezp2y5kfv0s6ddymx\", 97], [\"mmx1h9p0lv7at2ahtulugvg9vdh5nkjph2uvg93uz5azp8hmmuyaj50s8ky6v6\", 528], [\"mmx1lauskl8kzuwevqyx2ky8ale95esy87swemetk0zhc73ctrdm5c0sxy3exa\", 841], [\"mmx15cf5205juyar33ugp9qkh4e5ne9n0ylvnyg0uf6uyymd3tgzhc0sm47jfs\", 17145], [\"mmx14xms6j4un330ca6y09r8ffag0d9gsw6dgka97c82k32d0qtkuu0svjvmgs\", 3274], [\"mmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn\", 1545], [\"mmx1v35z3r8m5aenzfv9gjx0wcuk9zj5qu98asrr9qa868zrq7qncssq0lsclj\", 4294], [\"mmx12hpmx28f6hf0hzx5j6z9ep8vjmpcgq5kwmaxkpagkqdfksunkgssmk59vn\", 980], [\"mmx15qd64czwphlu49mlj6kmxru6wdcrjny326mp5d5p0hpzhuhw65sslkng8e\", 438], [\"mmx1x3rjuxmvmcm8x7eaqjkpxxc3r9nudd7erx0g5uffj687vvx62g3q9gq8ed\", 465], [\"mmx13j75773f8tfepkdjtcrpmv3djm4y7htcl2waq6spxkgtxs4yss3qfukrk6\", 73], [\"mmx1ghyal08f7r0p3ft8gywyr24p58jhe9fsy0xmu6wwfjuq4z079q3s36cu8q\", 665], [\"mmx18evqre2xyqqzgspaam0sps0avu9xt7llz7t3r9wexelpy8jnws3s0u7sev\", 2184], [\"mmx18tph3dn7ahfs24zu4lnlhrn9uk35s6fd46x58jf2xq3wzdw8ygjs5eamp7\", 610], [\"mmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj\", 1497], [\"mmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf\", 8767], [\"mmx1kn9t8m4uxn7xpqpdy34xhxrdkuzs5tuhjqyc8qxw69decxqgtcns9yq940\", 161], [\"mmx10a32q2xtl4pvm2trnjf8cgyswuyywg4allvc7j5pakau4adcdcnsvmsr0u\", 2427], [\"mmx1xthtx2n39nvvjrrkfpshq2v6hltn82h36dnxyg942h6drj2q6snsxx32gu\", 898], [\"mmx1dwr96cxjzyc6532h2gjagegkm58ns4fdrwj6muhccgxn5ysuqg5qn9mzn6\", 6318], [\"mmx1m6dwm8wvtthgngztjnw7r0g4z9s8797xa7hdzrj2zyajctgrpc5qx2zqg7\", 341], [\"mmx10cj7u6uvj7syxwdjzzu5wzf6tk75mcg8px09sm9fas2u3le48q5qayp5gk\", 1249], [\"mmx1rlanqjxk03n363dxgqfek0390p6pfdflm4vnf5d25kp8rxd7lg5q3sf3xf\", 4137], [\"mmx1pangjagnfffhfwpk265ry6a3zch4rs2kgp2rup7pwtuphgmsls5sj55j2h\", 1423], [\"mmx1pj0uu0lna9r8rgw8ccn4nj4kudgwxchv4l0tjqpw2x97035a2v4qdye8a5\", 2528], [\"mmx1eskq3mechm032urxq0nymxa4nx8tn56s626ftknpw4g2edppag4qfdfnpu\", 1353], [\"mmx1u4m0jmxu7avg5am34pjw3g9lwqys7vcfp6ah53w60626rywvrs4sjzl660\", 5621], [\"mmx109nvzs3vhyjqm3l7g72fqdxyh465fedk4xjvy2rnhfmgrw5l8c4sex2mej\", 3164], [\"mmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0\", 4305], [\"mmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0\", 1570], [\"mmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs\", 1496], [\"mmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0\", 4045], [\"mmx1r2s7q00hau24y49gdglqx9luqlgjug46del32hmfmujmq87fhqksw7emhl\", 48], [\"mmx1hkmks5m9u9le0k2zmx5djjxr6eh34nyzldlnty3mzk6yhzvcevks4z2n29\", 321], [\"mmx1n4n4k7wa79l83ch35r68eavnh0lkwcs3h52jt2xjl6j0969lqvhqsew3wl\", 74], [\"mmx1kl3y0kz6jx5w0vxrcx9afkzthe88syuge0ytumakkce4nu969uhqdtj9hu\", 9240], [\"mmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82\", 5944], [\"mmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn\", 1366], [\"mmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl\", 2059], [\"mmx1f4g8tdak9nw2waf5v4g8skt6gqqpnnlvxhx0y5vjkm0myv97svhstqzhm5\", 17071], [\"mmx14vvf5wwml9crhjcl7easevgykv0tar33364rhta9wkna4470uuhs7e7zs0\", 222], [\"mmx19zr02kj3reljd7fz6lrpwdqep9s2rah2nkcwtm77yxl3ja4sqvcqdxt8gf\", 5379], [\"mmx1dm7la9qquehldy67xsfynp76p39dxa5xn4veegz88m7amspgpgcshv7dfg\", 364], [\"mmx1hz0h2af4zmvnczp0twyzt8uts262pn9h93awamhc2sakdlvxvgcs8llaeh\", 1998], [\"mmx1z66g30cq7j7apzf29zmdsu28m5vrqw9x8m9jh2a3vddrxz7fsqcsh4gv0w\", 3983], [\"mmx17gtsl3areyr6g7xscq67jl2xcnz56ekkk9stxvx3qev7hhez3ccs3juqvl\", 3434], [\"mmx1cjqcmqm597re656z5w5jq99f7fvyth7wvhz3v4u9xvyxxyjyv5esl8yqfh\", 2], [\"mmx1t00welhtn9k0hg075ttg2laa7dj7d26jprf2as70xrx2fuhjyy6sjjp3e8\", 263], [\"mmx1ye76l4yxct7a2842mqa8vcf4q3jqryksu3s6xqvj3qdlaq47es6s2nt552\", 3942], [\"mmx1zx8z2zkc0hvn9cpnjctcc8akqxf0e2au70dd3uln96hz6uxw7c6s6s7s88\", 123], [\"mmx16ugged4tg26wydz3g2wasqk96ghz88nk6qzkcsep6qy0r4lcls6sk95mrj\", 1], [\"mmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu\", 720], [\"mmx1rq2lygf5p4hs7a3ftmc8u24v7f2q9gapsskf0kgh8wjzzxsddumqjz5fsh\", 174], [\"mmx1aa6383rdchx47qugjavpkcyxnpjvj6v0trml9h3ez5wlcusv0vmq0gkj65\", 1510], [\"mmx12kjff7s048w38dpcmhelf3f2vt3ul77hrdze97fxr9mhgrw2lvmqnandaf\", 2356], [\"mmx1vc3s0rqlmy7hrw0wr5mjfzgqx70senjwnp289x6syu9r0m58zvmsk2jl6j\", 12957], [\"mmx1afht99ekwmgh9s9h043aygvtl8tmytx7ymgavn6lkdxxczrgjsmsqcx3je\", 687], [\"mmx1mlurm4px73xghkdn02u60qff4f795nnmt04e4as595tf4luvasmsggxmfk\", 3918], [\"mmx1w7jnglje4j85z4dv4z6gpmwagqfcgpg7nq7dh6wu98qq7ckd7umsdq9hn8\", 20967], [\"mmx187llktd264wz7f33nqexhh8frcykztdg0emw5t26cvmzfng8dquqzl8qwe\", 369], [\"mmx1uj0qhzeguf0zayyg2m9z794nrdlk7y7pnprt4w798s5yezgxgvuslzd94k\", 6966], [\"mmx1998h39fzrpfxvgc54r0fmmuq48hj8c372gradmy2x6gq7r45suuszqtk3c\", 627], [\"mmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru\", 1437], [\"mmx1ze8ugap6cs90ec5tguyd9hg9g2xv7fyrz6s78ewzlsk7uwn3pvas3dnmt3\", 318], [\"mmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l\", 10496], [\"mmx1m2nxpzuhfj4awyc2wnu37nhkhsy0q8spg9egnkzf3geq2kax3g7q54emhl\", 268], [\"mmx12j2e0ja3z0up7t0csl2fmm52jd9mrc29pavccn67uhadrls4457qpv7qls\", 310], [\"mmx1n2y0dl7ktdrvgvv96kde4d042jt4e3722ftpevjcmfmqquyycv7q7s2d2k\", 11], [\"mmx1u59mc3s94cezun5apvw35vj2vnzfanjv45svwfdat84wpuefcs7qzns66s\", 677], [\"mmx1nqkt86wlfpkvjylyqdsy4pa2e024cjpfnczt667tshtsv7uh6g7qd8dnel\", 1228], [\"mmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2\", 1711], [\"mmx1gqsyr45tlv0t2ct76wqpxtd0asjjq5df8etlhdva8wfvt8facy7stqeq6c\", 1709], [\"mmx1q33rhh00r0dh7fx79lp9wrmv3t5mgpx6m3wtpajmmenuux0lzvlqruqgnp\", 1972], [\"mmx1l5dwydjks9s84n3rr52nwggsxfnrf65me7tjnwerse7xxn868ulqfmwwyg\", 9584], [\"mmx134t4wf6h2ppxnxm02ejutn0va4sj6fm0qkyn0hsfx5r4a89x25lqznt9py\", 1077], [\"mmx173nnyxacrsmasx2v80gxpejk6ypyvt52pcgejrd6jtv7yq6rtslq6pw76w\", 1119], [\"mmx15v9jzpzxjwdtn8ggkzu7s5suv7kqhuw9yer4w7ngvenlgg660vlq8zgk88\", 1455], [\"mmx1k4sqj4vufu22zxtahymvhtwmjp4c633herv8h0l2z9nm2xn7uqlsjje4hn\", 1155], [\"mmx15fa2hl97h05swu4k5n8x6h6h4f37u0f09pakeletnl6ew5ak3pqq29f93n\", 42], [\"mmx189rrmskkykntwceazrltap8a2at40wdhv4wvjtqc2xk8d85ttdqsu5l54m\", 173], [\"mmx1eztxn269lt6rfy0kzkrv9ra79su4ujrua0ukxjxktdgf4zdqnaqsu3xfqg\", 7308], [\"mmx1ks9t2rksthddy00395l48vaqc9rmjuznw0gyuta0jxpkzsce44qs3at8x4\", 8180], [\"mmx1da455czfvskaeewg4prqrcysxuzm0x5kgsge3fxafz3e6ddmvppqpyg796\", 22140], [\"mmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3\", 9132], [\"mmx1478snw4amjfq0hnhpwl8de8yup2thh5f5uzmyu5g907az5sv6fpsuwfrma\", 11837], [\"mmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn\", 98], [\"mmx1j49546jumejnzwpq4ptdal0acmje45de4y9c99pjg5kglmazrazqxex7qz\", 1644], [\"mmx19nnl9lw7td20z9l22v8wk558mxfrdeud8ky3229utv6e50cqyazs8jhq5e\", 1195], [\"mmx1grhexfxkzq9js7t6595mzcnpady60mjuph254rtef25j8x074pzs6s249e\", 4230], [\"mmx1f9rjvatrgqk6fyyxc522xrt6h9clrlvy49nx8swanx58t2n4g3rq9nwszr\", 194], [\"mmx1guajyf4849dkedxpj2aqevkuc9a3u37fmg4hyqzmk4l02n37tfrsygnc5y\", 6278], [\"mmx1r74wdy7kzh2dfdcumhc85tuherczlt8c4dsqdl03ufyg2lfa4frs2qmwlp\", 21], [\"mmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0\", 19325], [\"mmx1fdscrht596p4daxkpzfunczjmurs66j65u5lc3a4q0l99k7h2ayqdvrfnq\", 14827], [\"mmx1hl8lnr4ddyyqynx5qj5psv63ah7atfrt67s9eszlck5dy5yy9aysylv93p\", 7572], [\"mmx1x6r4mtz74u0walwxhe4qxcu4cm4vkzkgjsj4p8a6xn9z43zg33ys37vy0e\", 1], [\"mmx1gx8an96g7ky87eur85puyex8r24qswx5wn86r2849njg8q2hkeys8zqlvp\", 946], [\"mmx18csvx9uspv3mp45autfk4dj0t4yzvzyce63gv66nahaq9pct73ys70ezu4\", 1027], [\"mmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c\", 3187], [\"mmx1zp7rs0q0dqthcwdfvpaugv6px5qylq9uvwltvq4gpepdqyk9299qhvd3tr\", 590], [\"mmx1z8wnphkp2d50k2kk3f30eyxtp8h69e3pazzawvwtseuuerld339q904jsc\", 403], [\"mmx1w0nzjd37pkkewp6ntwfcc39u0w36723amrl2w6rc28aer3m5yexqlztrjy\", 119], [\"mmx1j3p8gtyajzh07ag8cv2y776h7axrwhvppckxxtltelz08dsaxfxqg6vlwr\", 6690], [\"mmx1ktyudrg32h95gwzg0hfl87lf6wruuunp6w888typfdw9f52g4axqcsltyu\", 454], [\"mmx1n39pyuyq8slux6rcrvpyfqr554tcytn7nfrmwjetkkryeww59fxsf8qvm3\", 117244], [\"mmx13k0anxdyn6e27hful6t63mugrh6asm8vphxe0rg57a0p5p5ttfxs0dy8nv\", 94], [\"mmx1tdzqj2k7uw97ta3x459s7mk5jt2uh6p8znxl7f7u38davexzk3xs6tktrp\", 6103], [\"mmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj\", 5588], [\"mmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy\", 16495], [\"mmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr\", 4877], [\"mmx173tum306ce679gav9xyzv9dw7m8fhhw4xh7g24xwmgqxjufv6a8q3az0ta\", 8], [\"mmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6\", 2549], [\"mmx1d4580utep9epx933mp6666886cect39qt9dl30qwxj767fkxpfgq9h6y3l\", 1263], [\"mmx1fk0jqxyz6eh35qnlu70gx58v6ahgng29e4k6zjf6tqxa96y7p3gqu8w8qq\", 493], [\"mmx1re7sxpa7fmpseg8phu4pqamqmg72qmm3e7fzx880lz79dnyltpgsga39eg\", 938], [\"mmx1drdacsxd6ssaa44mauseapmf9cm0f8nah6tqpnw5hzs5r7vntafqqzqwzy\", 7584], [\"mmx1tms3d3n23j28f9agpm0jrdqnh634f3q9rgcnwsgq64yhcshps4fqd0fv6k\", 116], [\"mmx1qqjqmgyqws0jk04frzf4e98ydd3pkcsfyv65g2t3lgnp9t8z4afq0kqpst\", 7095], [\"mmx1usc52whlhctpx08phhjzge03jy0wf2ft0y9dngzgxxs2ev0y23fsgjk7kx\", 923], [\"mmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp\", 10493], [\"mmx1kzfexe6m93ggzewpf7xtd6jx9g9n2k3p9n0em8zhug623tx22d2qdzqnq6\", 11], [\"mmx1s4pkkycenn7e0g0y4c3sz2yrkld7m98mlm8mc67y7lj4trw5se2qy4eq5z\", 6157], [\"mmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5\", 9850], [\"mmx1ysxav0zk4halpp9r56m0s3cua7r62cfx57snu0s6pqqz56qqt32s2j3jzy\", 7], [\"mmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn\", 18348], [\"mmx12uthvnq3g2af96lc3un900pd2tyy8apf0fsqag68d7fxene639tsacu4zm\", 1929], [\"mmx15hfmkxyxttvpt36w04e0h3sdgr5r25869jpxehj4h6mrt66kppvqp9npnm\", 3661], [\"mmx1q3eh75hak0v9f9psa365zjypz62q8d0cwv2qrpwpj2hayfn6xfvq747gj4\", 3406], [\"mmx1aa7hmgy7dhsmkhsscp8vlk4y48jyntq0zndsd4lvn4ht0nrjk3vqrtn5mx\", 4001], [\"mmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9\", 2123], [\"mmx1lntqvyetpdaqzkw4f9hqhuh8kkf3f7u3rl96gxz3lgztfptfaevqk8elws\", 2272], [\"mmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0\", 2035], [\"mmx14ntt0scarmrahc8dq3xfdwqqpuxddh6ez2qaq4dcdyyw0acwuevsumdgvh\", 1810], [\"mmx1evudswfffa6pru342f5hkduqhmmalx3c94clvyed63ht0dkn2edq3shffh\", 30], [\"mmx1nh05jetwxuhj79j9k4wx6ujsamseykk84383jtmfcpzu2f2hz4wqj4e25c\", 1584], [\"mmx1d39vgf387ct682mq7ua9vlxpjs8w47ennw69wp05atf65stht9wq5hkxpd\", 5314], [\"mmx1qm77f6cv9z9ufkavnt5nll7qq55rvjx3hru8kafx4guk3chpuawqcmd098\", 198], [\"mmx1jj4r3za249xxcyp30jjyen8nz6kmtldqpypwuqhukzrp6trme30qsvdfxk\", 151], [\"mmx1z9yl7zqwrfje5kc6j33kenvpxcyn6jztq8aq0h85kf6r8e0d9p0sumlzp7\", 85499], [\"mmx14fz0p5ff557c6sh6xx3ssztc8sv8a023cqugskep0vm4j85rna0s7fu03g\", 211], [\"mmx127sjp7qqmvy2grl0wa675djhjll46pg5rt794cvdp6s0gahg0asqav09gt\", 2916], [\"mmx1ahnruulrdycd5dr4xzjyymxgf7yp8n90r437ynysr2gz8n2vmpsqxk3kev\", 3360], [\"mmx1hut2sx0lenf2wed9atd23zp8ps8ntaacmjkd4mym8m05pcz69dssrvr0p2\", 6], [\"mmx1l52feg8wshacztsyf6f77ndq44qp87tdwns9wdlxv3t4uej08fssuuwng7\", 554], [\"mmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym\", 4558], [\"mmx1ff4lyf7ulfrwt0wfnr6dtpuk6tv0w522ef3pkm5ax8e9wv8crd3qe0a7re\", 902], [\"mmx1652t20n0jwl4mn8xe6k3j3zalgpuw38u23e6cf5249n3h278033q3kcq00\", 603], [\"mmx1edsqjgugd0hqynwa9h0gm05vsmqpse9yhwr85eftrxyu6ww0la3qf9hspx\", 34], [\"mmx1mrmnxtc9vwjkgfst6z999x42wfuwl0ywnwn0rgyvypj6660l093s6htasn\", 57], [\"mmx1tgde3wpspejv0gq70lqe54l93n4mrdmrp3xt3ts4q96keddyrfjqe0e0t2\", 131], [\"mmx1f6khu080cft3c9g5l8qwqh2wlza8473382h4gwursgl0txhdadjqn2kzv7\", 17], [\"mmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t\", 8356], [\"mmx1p76tw7re288zm3avlruq0v2h38feqe2usscg6cdcfwn3f8cs5ejsjkev6x\", 16733], [\"mmx146y8qu72rkcw0xrs8vf8y7j423t42rtyynze5d3kw6e79vdsdenqj3esfl\", 26], [\"mmx1x6j2m793ten9em7pu09q8qca794vrvrdc3jcw4yzc8zup0zrh45q8d2lqx\", 34], [\"mmx1f69lleyu3cznmnxlp9xznjnr84xrzutmjjcl4nlsfv2359fjze5sz787ay\", 2337], [\"mmx1ffrdjd4ccl6ga736hz3ran0xl8k9af5xf9ae28hqjg2fhugfdf5s4q8qr7\", 1068], [\"mmx168f4qnz2e7sugjdv69keaqp2mswys30sqpyskuqmzmakqyu94d5sgt3qcq\", 532], [\"mmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3\", 6982], [\"mmx1cgx3ck3dmznw8xg78jc9xfcf7rws0yrkhpj5tymnc25dteduu35sd6p92j\", 1069], [\"mmx12amu3muxtrrr54qkd6wr7xtawh2lare2aqptywufhl24rex2u94qzl4tgl\", 6590], [\"mmx1yqycann5zs9eupjsea76ahp5h2h0d52n6hqxvd0v3whezr0wre4s3zku4g\", 631], [\"mmx15qq0sdefrea28hhlhe5er0vur347vztfsezj76fapg4wf2nxaekqqxsy66\", 85], [\"mmx1n0a3t40vv5kdgfnduj82kzw9ewy3tu5utszgxhkztdvqlu8xgdks8nyh2h\", 367], [\"mmx129hgzhuh484dtlgz7y2r4dmc64hqzn4680z4dg8qq2gtwymfm3ksl283x6\", 7587], [\"mmx1qvemldmglge8tr2dcwnr4gqam6vkal5dkc2jwsz2jyyy8rhry4hs58hvrc\", 440], [\"mmx17l3xstvyx5rqxzqvswwvf27zz38ckt5q2030selhwe4elqzwe4hscxf06z\", 1871], [\"mmx1kcrktqlr88979xu79dxq5slh3xkvx727j8unxhev9frl8rhw09cqqnl6r3\", 410], [\"mmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60\", 5194], [\"mmx1hfhn035wpjnm6yhl223rh55e85a23ksp679ku6kpk2n7klxxaecq4xw57p\", 1660], [\"mmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj\", 7663], [\"mmx1kvyj70vfnwjwg6je8tf3dunrwrafy9mlm2wtgqx95vwgnz2mrfcskpydtk\", 9726], [\"mmx1d9gx5anuvxgg906tzj0rdkhyypjtrfc09ufdc7yykhp9h46mxecs2qe2r2\", 16], [\"mmx18gszx83xlhzj3s533m62pazj3c7v08rgu4t8sh0vs9c2leg3ldcsfgkc3y\", 243], [\"mmx1qg6du0mef5nz96gz7wa6f0ndmdhqnen0knwz3kw5ytf4kl9f89eq2kmrsw\", 1861], [\"mmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5\", 127], [\"mmx1pstmxwmdgkyzqqll6sdu5vdxpkm82ya4tz78w8n2yq4pdcdz39eq3uwvw5\", 2080], [\"mmx1lka3j0475gzy9yk0c3lt4f9d0p8zhlcujhsfsl3f035z6fuytpesppfrq9\", 514], [\"mmx1f8yps5v4rqakx3gyws5hhlrmapcjzzf5j80dm655ehcrf6qgz36qandk5l\", 690], [\"mmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu\", 3904], [\"mmx1qwcxn8k9nxdu43ytsw0ew7wk7mmptr3ykvtenms3fsyqexg9p36sp9slcv\", 1994], [\"mmx1rsjam2cenutaew3r3ssfc8zfh2uy2y3ycawafk0y4hq49djayemqnelh4z\", 635], [\"mmx15tfvs7twvmtvpp4zvgpedz4suysu4fa88zuzjyj2yjrkpscme9msaye6tc\", 2477], [\"mmx16d3ry985fdkgpvj93xygv0tn2wc9ylpex6t08qz0x6lat9km6dmstdhdhh\", 22066], [\"mmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g\", 726], [\"mmx1036ucmxlqgrwmcuuheau33k0h93u0wurkxznvsl7zqgej2x2rauqaktwxw\", 33597], [\"mmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v\", 78314], [\"mmx19jlhmuspu5xz706c63vheckjl6z7qx9ne5rg9r7c2tq4vj8rt9aqj60yvy\", 3001], [\"mmx1rd9psq4y4kt4svwhkvsj6aqvrgwmf6t2qen6yfc9fw6thzrxt4aqmjvmvj\", 531], [\"mmx1xcalpv2gy0k955p6pl97ayzrycmvrplu9cufx6dfctwrwd9uvpaqypgjxf\", 15867], [\"mmx183ajctzcp95lcx2zztjk58gytyzmrlsdljna6lhedqj7h3jn04aqu3snsd\", 14338], [\"mmx1kyul6v54l7jhjr58e5lnqelmwyaqdy4mesqwr4wfw4ku3mvac47qk8qcj0\", 1228], [\"mmx1a7mtekvyzh5f0uswz0pzqq6lys66ta9eavjyk66w4kgrseej6p7q5savlp\", 75], [\"mmx1tgppefepecrczwwad3zlvcwhuujsyr63gh8mv92el5yy8egzk97sdqpjp8\", 311], [\"mmx1xdrf8vw7nl5e94grks7u3h7uxaamgeuv3s30h3mfr560td6rqdlqj2svmq\", 1514], [\"mmx1fxxkthhcqf9ryfljy8xr9dcw4nq9q6mfetxx0dyqwq7qkv4vf4lql4qzgx\", 2606], [\"mmx1v5u67yws0zlnutd4lw0gqk8dk75xnjj3k87rnzjqurx3lpz7aflq863r48\", 545], [\"mmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq\", 265], [\"mmx1e2c8sqytwagkr6ekc74p7sqhzd39g8a25d2k5fqj5gckmrk0xdlsadufvm\", 1173], [\"mmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc\", 7754], [\"mmx1j7ns20cea2havm328p28vxeyfdcv0yrhndl2h8735slc4u0q3fls6dz77y\", 680], [\"mmx15098ny3pc66kn6sgr6t8jehvwf2yzcxm6lxljvr7dfxs3g4u5plssgudwl\", 18643], [\"mmx16qquaqrzyks7qpq0wv3mz4j3gdk5c0ltnutnurun8ars8s2jszqsj3wzt4\", 34474], [\"mmx1sg8mgch2566d2uncn3lew5wwwacp2femp63y4gshj0qpy9fehjqsysa3ng\", 308], [\"mmx1rn0p87m57fzv5je8wu97aegkhejf7r5gz3clr4ajs0k42p4g57pqwh85wl\", 184], [\"mmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3\", 6975], [\"mmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv\", 7163], [\"mmx1kjc5re76v4htwy0393zxnut5jcutlewywd5udfgh6l4xh5ya3xps8sv4g3\", 1469], [\"mmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry\", 4599], [\"mmx1keg2775ll23shtjh235tw9g7lu3wj5rj50ws62vnwv89p9vd07zqwswcn8\", 85321], [\"mmx175mntfhx53xw93y6e7g228apv37j7vwt23syhtwnc3h0saptxxrq9mt0c0\", 346], [\"mmx1rwglj5p9s436vdf6y33fu89puyl4sauuv2c6jmpadnqa0jmxezrq7mkt27\", 1], [\"mmx1355xdy9zhgzd8k3grndkwdff9qr8qk8raucr93praws40s27fkrsjlz07p\", 2547], [\"mmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s\", 2826], [\"mmx1gkwel33sdr4tgyfq55az5t5n8fzy3thum3v03jmw3q730ee6ajrs22jkde\", 2090], [\"mmx1xm27rmtx3l7a00laujl97484grv5xqhrled5q7e3awlerfhe32yscwur2z\", 1601], [\"mmx19ud3ev0q0tcrpsmh05tggwt4n2nkwrzrrtuwtyv0pl2t3t9w52ysy954ch\", 546], [\"mmx1su0cegxxdg73yhm3xu226uj74309x9ll5ycd5m8eh04n9as7mjyspr0w7m\", 1917], [\"mmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr\", 332], [\"mmx1qn07jmdsetg4k8gqvn3wmv9kqkrhrsvrmlc547zslku4grlunw9qqllens\", 3377], [\"mmx1y0ream3up46cckzxl5tj0djvj7numxvrs2staw8zld5297xugz9szhfpq0\", 9752], [\"mmx14sfukr8xrxq5rlpu0dfvvtkzdzpqyxqyygzdjg6qn5ew34ynrkxq7pxlm6\", 1141], [\"mmx1u802gcgzhfkkggcq5l7388xz2fn9hswy7zvh74t5c7yvu9x3r7xq4d9r05\", 29], [\"mmx1lnwzzc8kdm0lnfezlapkh66tl59ruhn053rtsgtnd0j6qglr97xqt865yj\", 284], [\"mmx1qh002xzjsedzpuzqq4cz6spv4qayuwhyt84j7pd8zeylqwl0k2xsnhg9y3\", 477], [\"mmx1uyczs9n3942y28h6jw6dpyfqr99xlhdr2r8qus4907lr2srtuwxs5cchgz\", 3], [\"mmx1jpfmyh0ndxwz47t3d6xrdlkd0mq3nckuasn8elvjfa65xtzm2j8qamxfuw\", 25165], [\"mmx1w7dfqwgrq4v8uyg2kpcda5ec44hnvdeww48zysxue2mttd04tz8qdpt88v\", 6344], [\"mmx1eavt4k3qfgc30z5wqtk99f93fq8xhtr82f47v6r9xd266njaqwgs56207d\", 195728], [\"mmx16pnkxxv9mu42n7t4pte95ftduqz9ntrdd6u5epqnj5mkdn249wgsmkm77g\", 9209], [\"mmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap\", 28459], [\"mmx1urhh0ud9hrdzf2x4883wg7mgqe2fztfcnjehxz6kqujve3hn37gsn3f8qr\", 19409], [\"mmx1eyu4e3yl3psnywtecgefejdmcpdlu2z67cdma96kh89egt9x4xgsvvejlu\", 28], [\"mmx1um9jpra87stxs84lldpz0qt25tkxh9e7atmpula5m8kuu5gzszfskfa0r8\", 362], [\"mmx1wnkyn2ma6l2nnk80y44nrsqf9fdh27gtx60v3sdxvd9uzheruwfs5kf23g\", 4486], [\"mmx1trjmkvfv40ngnfmvc5uw926gw8fndanpnp7mphq2tgqwt4xdw62qmrvn3a\", 90], [\"mmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn\", 29066], [\"mmx1qxr2rcnvgcwvs3304d8rlm8kzcg3cdrfdnrp0vq3t6eku4g55xtqw8kd9w\", 1102], [\"mmx1yht9eg80753876sq3qjljn7nwxl300g70rauqran8qkvdtrtqzvqxkdxq0\", 98], [\"mmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05\", 6045], [\"mmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg\", 7707], [\"mmx15n95rxf5c58taud2x06sgpldy3mazdyf2lf8cemmezp83hc5nzvqp3l3vr\", 2391], [\"mmx1vpg8kftakr3pammp86a8hxyar9s0m54w9j4m29d9d6rlk9ztf2vsl7ck38\", 361], [\"mmx10c7skd5pzvrclcqfemg2nwk0pnpeh6p95aucnt04z3tjhpl3f2vsq6wzpg\", 1102], [\"mmx1l6yphrjzvuc0tefqug5zs9eh3gu4fupq6e8ncgsr6mrek2xvvwvsf72r4d\", 331], [\"mmx1mylh2r9352klltxhjqpfj5jnfll6uqfeqp7xunarlg9cqufrhjvs28jrt3\", 5798], [\"mmx1hvdake6jsnu5qa92un6ucw70jsa89athx8egx7507eqjk3s9ujvsmzmgd4\", 4660], [\"mmx10lrzsfeam8m8lmrxnhzd2zn4kahtkmnthd0nhytstw52s92d0wdq7x0824\", 46534], [\"mmx1n5tgph6psu6a3z3u365ed4xmcm66tdk2pyltztvsy7pzunhfu2dqahcdcz\", 2], [\"mmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch\", 4], [\"mmx1ujuywt50nv9jgt4tsu32mcgurtlu9zfvjutuvjk00d5k8peagwwq44fmqv\", 66], [\"mmx1mq9w9vnuae4fdmn27ceh3h9wzaygmhf0c3sqa7xufy7x0l87zwwsdfm80k\", 158], [\"mmx1jxl5gaxtd8wnc6r9nxmf5s748ct827cpjafdefw8rgen75lyxxws4u8a45\", 66], [\"mmx1ddu2qyh383tuc3z88svmn7adgekm59lv2r3yc8cg35vclqqztwwsxcg356\", 6], [\"mmx18ee0whkd2pk6xymy9sz7a9y6mmcujphzqcyl659fxz2cdr5ln20qkd3wav\", 1531], [\"mmx1wut7pf5v32hpylz6rxmrsztxfhskgxp34cgt8vawu3xqg6y8pj0szay6tj\", 50], [\"mmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s\", 5658], [\"mmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn\", 595], [\"mmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp\", 8434], [\"mmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map\", 1318], [\"mmx1k32fdxpu9d7lwjc9hd7qw6pz95h2summn9mu2ckyunxq5e20wk3qx7h986\", 1], [\"mmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp\", 784], [\"mmx16qstch29gdwqtfadwwta8fd20zrhqy7pgkaud2h3ceeafwjcmz3q2ezr8g\", 1664], [\"mmx1qpyq03vzht2uwf9pzadx3rpa8w8y7pul2he0r5y3497j29ul7x3q7ac26j\", 509], [\"mmx14ecmst5fxu52vry0k6zy9merf9m8e38d2vsw6e0kfa4z6wkptz3slcxcpz\", 1114], [\"mmx13ech6m45gf3ludnt3e3az7jf68qntxg2htk492zuewh40q3yqwjqv6jsej\", 597], [\"mmx1kezjxhxk8hxk0877hsfzr93p297xqp6ga2jrgptw52fa386gy7jqs6pz57\", 17275], [\"mmx1q8d78sjm37uz4pps54q0mn4w3yjesr9jg2pprgww6mmput9rg2jqudrwzl\", 6673], [\"mmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm\", 2076], [\"mmx1pdlh0rj93akpwww8apmpfj5awd08ew8c7c8ce4lk2cfehypgj6js7a2eeh\", 1593], [\"mmx1chmqhg48plemff47t5hrc50p7sk809q337uvwn6385cdl8y8a2jskzzcwc\", 723], [\"mmx1v2c3pk23x788qwmhh8dexn6mc94an2l3tgj4kp9th0ygz46997nq6xalyy\", 7656], [\"mmx18jk3gsj6r4y3esc22r0qvxru79ues6z7keha33ahn5tgahxzcknq48ler4\", 117], [\"mmx1x225z4p73e847du0g5k63tgfj3c3zn03z2rr2zqnm6fs72n03k5qrafd09\", 148], [\"mmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80\", 1052], [\"mmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t\", 94], [\"mmx1tuw784a8wp38c6q3fw6jfeqy3pvd8ggh0gj9h0xqvez00q9sew5sg0j06z\", 197], [\"mmx1u9xsdvqzayfla2rutaxkespha2xrhn9m6wn7v8z8rhj277v9k24q44rft2\", 490], [\"mmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3\", 9665], [\"mmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf\", 14601], [\"mmx1fgylxyf2ef9p5zj0d6hnz6wr7wmkgukq6zt398uk3j78nhxfu2kq05qm4a\", 308], [\"mmx1dxxgygp75dh3p0yh6kmezeeyftncphy0q2fjws48wzxdrktsy7kscjdmd6\", 110], [\"mmx1n833p7z44rd62g0yvhlua8sv3d8wmyvrt720utk7x4vxwc3j72hqst6yh4\", 5892], [\"mmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w\", 912], [\"mmx1yknhrstjc5uslrg7zequ278dk3j42s7ylfw5frvgjdsjzm3jxwcqu768zc\", 131], [\"mmx1apz53l6jeqzdtwxry627f2rpagmjwsj42d93ca8jtwcdtht037cq9fsqhm\", 41027], [\"mmx1h6lne788w8u58dn0lquz3kjp22s0xkz08sjlxx3zpmwup9k8cjcqupa8r6\", 1], [\"mmx1krwuwd0xfqxq59rhnglkkduxw8wzq39axh99vtqsy0k6tnac0zcsw7fhj4\", 2956], [\"mmx1elqhr769rul729fampn6u3ylcxfprr6zgvvndppkzkzzmaefk6csr0s5e2\", 59109], [\"mmx19zerahkctf5hxcrtdh2j5xjynl398ge4avn9nl4zsqw2hs9qe7csjqevda\", 1520], [\"mmx18h89t0y9m8cy8trcveul508ju6v3tnajz2hrhvcs8rm8pn23djesml7auc\", 618], [\"mmx19rwdhaq7taarhhqexejf6frgdk5z6c0zd72c4mvu7k4cwmcxn2es78g2t2\", 51], [\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\", 2925], [\"mmx14tkxv7wnyfjm45lr03j8r2qac5hsa9mk75emunjg78qngwgw66essvzga7\", 425], [\"mmx1jmkx9m05exvtuk5swve9x9qe2u6udxx5h8p4w2drlu92523pjj6qsq8epg\", 129], [\"mmx1ksduhw2jnwayh3a62cnhmxf7vax5lult55kj09ejvqgrr7gy726qkp57w7\", 455], [\"mmx1sg74tyha62nx9ttjuk53vhk00248ts77s2ee55ryrcskrmuf0k6svhdwxy\", 1562], [\"mmx155480tuk2thf5sqkkgft54hmuafu0mj48gql8fdxdvl08guut6mqvy5sc7\", 51462], [\"mmx1hsxpdkzeynjv6dswp89klcu6qc8gn0vghz54gcpa95z0m5m5p6ms64gd99\", 914], [\"mmx14nru8xmclg23hcdvanrn72rjre93wyew7vgv7hrwtexlkx2m42mss8d782\", 1547], [\"mmx1uq6ytg6v53lsy525m6352hznumufehsecaugpmyq36vezznyvzusmfpxm2\", 2393], [\"mmx1k9mxrjecdztfeggk2v3urwmkeg90f8dyq3rqmlxxag0ewqdpv6usvk2rqc\", 1039], [\"mmx1ptz2hwskzvmmwa6a3zxvz0hw44uk4xkuyz65r92lv0jnty7tgwaqvhy630\", 359], [\"mmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4\", 270], [\"mmx1ml4nf4gxrz7yc2uymnu6xdx2ssev2q6696ar90pyz72fgp8vxj7s472hym\", 3878], [\"mmx1za0yful9pmmgtpzaqq64s9u7nclhrkfw0nzjg2wuvzng6yxex67s0sk7hf\", 784], [\"mmx1fgxwy76pzglmqdqxuvv3l258233900kkke3p0mf0gaztjwmxq2lslppuqh\", 118], [\"mmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw\", 12679], [\"mmx1e83q59e5gy528v9j68ewnhpgkwkdpt47y03ev9a3y5ma5plsyrqqru2dw4\", 29147], [\"mmx13r385uxl5qm5dgt029l3crxsglz6g5t3sd3yy2metys0efjlzmqsl8aevk\", 1542], [\"mmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu\", 1], [\"mmx1yl78ddxpjz4zhe0ypy4jzjgt0kgle2dzhzm4f38wlwpumds6xrpq86kel2\", 1980], [\"mmx1hm7d3gpykrggjrt5ckm987xdqkvtqrhac05rzz4e5gjg8m5hxmpqgcvv0s\", 13804], [\"mmx17dhvxq6fekkfqtvjwle2pwcyr6f76uhz3vsq6ldkc9r0uzs7nrpqvzh7zs\", 213202], [\"mmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99\", 2569], [\"mmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0\", 153920], [\"mmx1ln8cwt5hwwd5l79uar8gt20njcl3vzud6m00lxtzc0uecq7zvmzql5mhez\", 306], [\"mmx12ts7lfh9cr6rqj0h9uhmha99tyep6ln6xtmskp4x9pv32s28jrzq3cksav\", 1], [\"mmx1l8ht54p69ynxxf0lxzrvm20956dcpk4lj22rv0jmdtefk70hurrq8m4j7a\", 1852], [\"mmx1rjnt6cet0cx3m99afq29ssmk8vagnw3qvzrn2h38aawvp023emrsvskald\", 248], [\"mmx1rd8z3x6ncsk5734u3xjkqskzxq8tlcn00866309kwqc993j4xnyqhs0r3s\", 5], [\"mmx1rs0lu6yh5uhp3pa8tl3dwz5ts392ua52kx5v3p8h5jrd0x68g8yqc6usm5\", 4993], [\"mmx1qm7k9w4qmnqc2gufp59g6hypfx9gcvpnz5e0j25a66e4vhnztmyqn04u69\", 2949], [\"mmx1duvwvwf66cepnsng596tkjazant9t44v6fw7qv3umc05ehqcfmyszvzdu9\", 5299], [\"mmx1l5hsvt7g2pydzauqhm77g4h8es27ffagmpseuks5tm3tn04n6nyslcafqj\", 312], [\"mmx1m96tljuk8yjc9xwu4q2awulg8hrgpg0jp6d9al5dm7r2hue2u8ysphwe0u\", 11170], [\"mmx1kas9v36hhw4rzac60heh2uy9kf0wx7ed39fvhtlzqwhmr7udkl9qlxwys2\", 22736], [\"mmx1tpyah2lre4lsclru42p8zqanwfukpu9n909p6pyrvlcd4mk0dr9ssahxe8\", 2731], [\"mmx14cgd45zee9e06xl39x3m8k076gm4tnkr862m49q7vdeqm5ulznxqeyeuju\", 2], [\"mmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27\", 9330], [\"mmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku\", 3064], [\"mmx1nkd5fyvrnu8zeqgen48aeqcnyggjxnn7dctfddj7m2mz25alrl8s74wqvz\", 151], [\"mmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92\", 8727], [\"mmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6\", 26526], [\"mmx1lc7g4gueljhtkf7ffd3l0x747d8j9gk0z88e58zd9l6f7vh73mgsuzjvx3\", 48], [\"mmx1r2wcfugp9ugm44z03eed4ad0t5qhvg8ufc3p7pu40r7l5dkjurfquuahjs\", 1430], [\"mmx1essz4a6dexpprz066dfgwslmz3p8uy73czfrlc7thy3s8w782rfsx75has\", 818], [\"mmx1n5w0atjthl70cnj3zll4ku3jl2w7cut8peqdkt04ck9annew2mfss5uu88\", 5803], [\"mmx10ewttsgpc2vq980wlk0ddtc505vp5edvusl8a388y76peautetfsyj3ej7\", 7943], [\"mmx1n0hnw7qmwehhsz4qf576s0sv5ql6kyq9afgrgmuzzwzfr03ld82q0ta37g\", 1310], [\"mmx1mk6v9wmyju7spyncrggntg4lm62g0ensg76yjgjhdtnmpls3nr2sd9qwqp\", 26], [\"mmx1vr057q49h73hph3ksrk92sy3wfm2u22g9ezklxmzrw92m7yl582sq22c4h\", 928], [\"mmx1kq7xc88lghdv0mu62585fck3ppnlmdxn3jwvhqpks73wc8vwc82sqzyhjq\", 4839], [\"mmx1mlj7rhkg5c4gp3w4k8dlck5tyf5493dce5vx3x4m4qpzn7ty8mtq6ek2jc\", 4284], [\"mmx18vfpqpqwtt7htk5dwgd4lwdnyym659skm9ppf0sadkp5400w50tsxysqv3\", 12], [\"mmx1uh4qtgqkndrp78xx4qp26dwu4wxmqe8h964n9kte83sq8h7ckrvq45zn3d\", 83698], [\"mmx1e5gsd2weaqmzszdlj4gu975s2cc2gscnrtsa9agufcgjv3zat8vs606ewv\", 583], [\"mmx1qnh3zw2utltxdu9mut6atp326nujr6pmxxhtryn7lq089kv360dq64mj2w\", 8106], [\"mmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz\", 62191], [\"mmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9\", 62], [\"mmx1ausld08qthhjwmpxvxuy257ddrnvwq0u0q2qdgzwk6x95lwvp8wqun9tn7\", 208], [\"mmx1getf4e42wy8w52v4j7dxw52qu93yssytwud90uxyzhg5x0cgptwsathj03\", 63], [\"mmx1rkkaqaqs8c99w2jk7xw5ugfgkcfyhxpnu8xq4g5a5fatxvgggtwsccyp28\", 968], [\"mmx1hm4mvj4dheczz5g7fvpw4pnmrqlm0z9arhkqtvq6yaxza5ckmlws85y7zw\", 324], [\"mmx1d3vplkcw0pjqrpfr3cesjmvslk30p8qxhky5l4gdslclu70tql0qdqp9dn\", 823], [\"mmx10783gzrqc88k0n0ert2nkjz9ams2aj77ux4t0y3lsmyexnue2h0qem44ac\", 88], [\"mmx1m7uycpxww03cj05zhdgzjcen70kv3pd7gwsk8grcdtu9ltch6rsq9plyz8\", 1248], [\"mmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt\", 5206], [\"mmx1esr5qdwsspwt9xap0du009x6m7whdzw8xak806c82rzc2dkwqh3qu5ydzd\", 68], [\"mmx15m60pxy8mjp03mmtf9aq8kajmrt8vrzltj8epytnsucts50fh03qhw98ql\", 4364], [\"mmx1vv29ueqjqtr7w7wk9vhw8txgh7ye26zgue93prgnq7m8sp7hw03sdwatcr\", 307], [\"mmx1ll2yar6vrsv84f5qdwfvh8tv80qlmkxdlr4ddqpmpzncqrgjghjs8s573z\", 210], [\"mmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s\", 1495], [\"mmx1ywsu86chqesuxt45aktpkg78v7we86l0zf8xa3rcer6gn6xw8lnqnwk5tr\", 385], [\"mmx1vlm6nlha47hctqvcqyz8uqfc64j8h5k2sgjmkk92ysm2k9se4hnqqldyu5\", 1468], [\"mmx1sp3fn6wkhmsum7jjspvdnj4696wyqc2jx7deaqpxtznus65jr05sg5pmu4\", 2033], [\"mmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl\", 48420], [\"mmx1drhuec6ts2hz9qf8jjxmpan7zlung5anurrpxnvjkmqy87vvuh5seglsha\", 636], [\"mmx12vtlj9qhp0uqhs3m9tay4ujwldpj98rgxxw60fy7huxwymgg785scc5d7f\", 32], [\"mmx1ccgy2ru9jn5a7d67w09zrgsxgv5hfxrkzdcv56dlpcraa7tkrtkqsrah8a\", 241], [\"mmx1zrkhjuv3uljccuqjh69vlpmzewvnyckr569aw7frgjz5hsdgflkq0gm7ee\", 46], [\"mmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a\", 22635], [\"mmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\", 32986], [\"mmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05\", 1190], [\"mmx18zjss5ccnhyskugrwlxuy935zn3vz7ns6gyqg2cj8f3r99av9mhsck4ne0\", 759], [\"mmx13txgtfelvrng6mfjyk84sj74lrl3u7v05wn59659sg7ffup5f8hsl4nhzm\", 1608], [\"mmx1e3rafs5jhzf03a8wxwp43kcguxr98eq3azy5lvatwayvezqfyrcqeumth7\", 1040], [\"mmx1nxd6hsaywy69qzx0yktv2v08yskmmq88nfy3l0shgfsp2mpr38cqx89xwm\", 12411], [\"mmx13l7yln6mennhvfx9celf99enpdgtfe7qs8dmr4nfr06prcfmz0eqsda2ae\", 113], [\"mmx1kky0cu2dauntftsk8a55rdche6kuhm227qt2ktfsyrhvu7v4yteq8rg4d3\", 1168], [\"mmx13xgvpxumznaqj5mkhxc493nzhc2kf9w3ks9z99eaznesjrsln0eqgwclyq\", 388], [\"mmx1n9k3yluqcmnwz5wdk3dclgs6uq7yf4g4tvahh25jl3z4u488ttesnf2kkx\", 158], [\"mmx1f2jdndglt2mvq37tc3wp8gtf3l3uql0sn485x80096m59y0ydl6q90ds4p\", 339], [\"mmx1dtx0w07ng5vaur9twxe9ajkvq4tfsgmgd7u909xxkvfmw976sr6qlyz0dv\", 4], [\"mmx1g67zee4q9x4wp2s4lkfde4v2m05e90jgn0m42uxw35r22emk3r6qa8ttan\", 1623], [\"mmx1gg6twfxusn0xlnnzzfju53zzwjecm6jkr5r936favpxcjz9d8r6sp3spdn\", 8563], [\"mmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t\", 482], [\"mmx1prxda0yejv5m4h6y4pgkzmutaxrd96zsnqss6aq5az6609dzatmq5jnv0e\", 972], [\"mmx1r0e4s9r8jqvuvznv3vd5k4pfa5ahzgyn6lrgchwu4mpqlzgsx8mselfar7\", 4936], [\"mmx1u9lr65e2v62cht733pjlz5dctk7esxmwaxwjew2xytr7gqgmtnuq3x22cc\", 5673], [\"mmx18asaxgn4dcswsefcdwx54kldattux7l0yn96fvmndrpqn6adsluq3ffr8x\", 37], [\"mmx1lpm0wnvfr4l07wgvfhhgzfgy7ur5jf5g3h024gln5ykml60nr8us9wc7tg\", 198], [\"mmx18pu3yu4a0zatqgkph8t5pz3n4jy7hq2x9f348yhwafvj4wd328usef7aw5\", 650], [\"mmx18gzhlxuaafa5rqxlyrzn8n6ldud65ynm5tujhc0ql87f9myx5musf6wuje\", 2307], [\"mmx1csleu9q374crgsm06k0xq2n0vdcufm34ahz3lww7kmyt7ukj38aq3ta9sv\", 83], [\"mmx1can6xxmz54lhtrm53udpehkn6k6qspudttf9pdpg9evccj9hmhaqufdqfs\", 14], [\"mmx18dkl69sxx3wz5u69s59lp9d02qj6czg8h6yv3fzzfk7d2f2dqtas9dls85\", 6541], [\"mmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q\", 137], [\"mmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f\", 7], [\"mmx1n36ek4z7vprh7xucnje6p5sr4s9mtr0ml9a3wz6xd2kp5v3hunasjn35t6\", 196], [\"mmx1c2jrdpa796438jzxxjw3y68tepmlzqv3e4a28d6t52juznprsm7qpwc0fj\", 2], [\"mmx1rfkx4gam8z02m09k5am29u2nyn62wlc22f0fapkqra6ckxspnn7qa0d336\", 827], [\"mmx1y307v7ha8la3zys39rljvld86lgzklajw4mzur8n0ehx4mpgqm7sm34wsh\", 4], [\"mmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t\", 6845], [\"mmx1xrydtrhnl89x5dtqpwape59f0t246hhs38tl5d3pzcamfxh65llspr5pvc\", 1258], [\"mmx1zm2yrzm79wn8lt7uhvaxjy0mcezkxdjujcru9fwnwczl3y5r4hls79m9l2\", 3518], [\"mmx1xwq2revzzgwlq27emrpfjmskmr60q7znpayenjlhuh08f4vxcrlsm99vzk\", 873]]\n"
  },
  {
    "path": "data/testnet10/rewards.txt",
    "content": "mmx17dhvxq6fekkfqtvjwle2pwcyr6f76uhz3vsq6ldkc9r0uzs7nrpqvzh7zs\t213202\t106601\nmmx1eavt4k3qfgc30z5wqtk99f93fq8xhtr82f47v6r9xd266njaqwgs56207d\t195728\t97864\nmmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm\t190434\t95217\nmmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0\t153920\t76960\nmmx1n39pyuyq8slux6rcrvpyfqr554tcytn7nfrmwjetkkryeww59fxsf8qvm3\t117244\t58622\nmmx1z9yl7zqwrfje5kc6j33kenvpxcyn6jztq8aq0h85kf6r8e0d9p0sumlzp7\t85499\t42749.5\nmmx1keg2775ll23shtjh235tw9g7lu3wj5rj50ws62vnwv89p9vd07zqwswcn8\t85321\t42660.5\nmmx1uh4qtgqkndrp78xx4qp26dwu4wxmqe8h964n9kte83sq8h7ckrvq45zn3d\t83698\t41849\nmmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v\t78314\t39157\nmmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz\t62191\t31095.5\nmmx1elqhr769rul729fampn6u3ylcxfprr6zgvvndppkzkzzmaefk6csr0s5e2\t59109\t29554.5\nmmx155480tuk2thf5sqkkgft54hmuafu0mj48gql8fdxdvl08guut6mqvy5sc7\t51462\t25731\nmmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl\t48420\t24210\nmmx10lrzsfeam8m8lmrxnhzd2zn4kahtkmnthd0nhytstw52s92d0wdq7x0824\t46534\t23267\nmmx1apz53l6jeqzdtwxry627f2rpagmjwsj42d93ca8jtwcdtht037cq9fsqhm\t41027\t20513.5\nmmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq\t39524\t19762\nmmx15fpxwx7ah2d8wa0sknq05gplj90xpxf0xknweszyhdd0eacp4yfq2e43z2\t38536\t19268\nmmx16qquaqrzyks7qpq0wv3mz4j3gdk5c0ltnutnurun8ars8s2jszqsj3wzt4\t34474\t17237\nmmx1seel6072m4ywm84s0e283gl34drku8p764x7qmw2ae24pvsa6crs6eptk7\t33694\t16847\nmmx1036ucmxlqgrwmcuuheau33k0h93u0wurkxznvsl7zqgej2x2rauqaktwxw\t33597\t16798.5\nmmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\t32986\t16493\nmmx1e83q59e5gy528v9j68ewnhpgkwkdpt47y03ev9a3y5ma5plsyrqqru2dw4\t29147\t14573.5\nmmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn\t29066\t14533\nmmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap\t28459\t14229.5\nmmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6\t26526\t13263\nmmx1jpfmyh0ndxwz47t3d6xrdlkd0mq3nckuasn8elvjfa65xtzm2j8qamxfuw\t25165\t12582.5\nmmx1kas9v36hhw4rzac60heh2uy9kf0wx7ed39fvhtlzqwhmr7udkl9qlxwys2\t22736\t11368\nmmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a\t22635\t11317.5\nmmx1da455czfvskaeewg4prqrcysxuzm0x5kgsge3fxafz3e6ddmvppqpyg796\t22140\t11070\nmmx16d3ry985fdkgpvj93xygv0tn2wc9ylpex6t08qz0x6lat9km6dmstdhdhh\t22066\t11033\nmmx10nfcaxrj93rjxxx3us3mwzajznj8qpcd5vg459yfkk8lg90jqq9qxry935\t21211\t10605.5\nmmx1w7jnglje4j85z4dv4z6gpmwagqfcgpg7nq7dh6wu98qq7ckd7umsdq9hn8\t20967\t10483.5\nmmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq\t20262\t10131\nmmx1urhh0ud9hrdzf2x4883wg7mgqe2fztfcnjehxz6kqujve3hn37gsn3f8qr\t19409\t9704.5\nmmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0\t19325\t9662.5\nmmx15098ny3pc66kn6sgr6t8jehvwf2yzcxm6lxljvr7dfxs3g4u5plssgudwl\t18643\t9321.5\nmmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn\t18348\t9174\nmmx1kezjxhxk8hxk0877hsfzr93p297xqp6ga2jrgptw52fa386gy7jqs6pz57\t17275\t8637.5\nmmx15cf5205juyar33ugp9qkh4e5ne9n0ylvnyg0uf6uyymd3tgzhc0sm47jfs\t17145\t8572.5\nmmx1f4g8tdak9nw2waf5v4g8skt6gqqpnnlvxhx0y5vjkm0myv97svhstqzhm5\t17071\t8535.5\nmmx1p76tw7re288zm3avlruq0v2h38feqe2usscg6cdcfwn3f8cs5ejsjkev6x\t16733\t8366.5\nmmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy\t16495\t8247.5\nmmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx\t16117\t8058.5\nmmx1xcalpv2gy0k955p6pl97ayzrycmvrplu9cufx6dfctwrwd9uvpaqypgjxf\t15867\t7933.5\nmmx1fdscrht596p4daxkpzfunczjmurs66j65u5lc3a4q0l99k7h2ayqdvrfnq\t14827\t7413.5\nmmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf\t14601\t7300.5\nmmx183ajctzcp95lcx2zztjk58gytyzmrlsdljna6lhedqj7h3jn04aqu3snsd\t14338\t7169\nmmx1hm7d3gpykrggjrt5ckm987xdqkvtqrhac05rzz4e5gjg8m5hxmpqgcvv0s\t13804\t6902\nmmx1vc3s0rqlmy7hrw0wr5mjfzgqx70senjwnp289x6syu9r0m58zvmsk2jl6j\t12957\t6478.5\nmmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw\t12679\t6339.5\nmmx1nxd6hsaywy69qzx0yktv2v08yskmmq88nfy3l0shgfsp2mpr38cqx89xwm\t12411\t6205.5\nmmx1478snw4amjfq0hnhpwl8de8yup2thh5f5uzmyu5g907az5sv6fpsuwfrma\t11837\t5918.5\nmmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9\t11353\t5676.5\nmmx1m96tljuk8yjc9xwu4q2awulg8hrgpg0jp6d9al5dm7r2hue2u8ysphwe0u\t11170\t5585\nmmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l\t10496\t5248\nmmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp\t10493\t5246.5\nmmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5\t9850\t4925\nmmx1y0ream3up46cckzxl5tj0djvj7numxvrs2staw8zld5297xugz9szhfpq0\t9752\t4876\nmmx1kvyj70vfnwjwg6je8tf3dunrwrafy9mlm2wtgqx95vwgnz2mrfcskpydtk\t9726\t4863\nmmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3\t9665\t4832.5\nmmx1l5dwydjks9s84n3rr52nwggsxfnrf65me7tjnwerse7xxn868ulqfmwwyg\t9584\t4792\nmmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27\t9330\t4665\nmmx1kl3y0kz6jx5w0vxrcx9afkzthe88syuge0ytumakkce4nu969uhqdtj9hu\t9240\t4620\nmmx16pnkxxv9mu42n7t4pte95ftduqz9ntrdd6u5epqnj5mkdn249wgsmkm77g\t9209\t4604.5\nmmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3\t9132\t4566\nmmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf\t8767\t4383.5\nmmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92\t8727\t4363.5\nmmx1gg6twfxusn0xlnnzzfju53zzwjecm6jkr5r936favpxcjz9d8r6sp3spdn\t8563\t4281.5\nmmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp\t8434\t4217\nmmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t\t8356\t4178\nmmx1ks9t2rksthddy00395l48vaqc9rmjuznw0gyuta0jxpkzsce44qs3at8x4\t8180\t4090\nmmx1qnh3zw2utltxdu9mut6atp326nujr6pmxxhtryn7lq089kv360dq64mj2w\t8106\t4053\nmmx10ewttsgpc2vq980wlk0ddtc505vp5edvusl8a388y76peautetfsyj3ej7\t7943\t3971.5\nmmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc\t7754\t3877\nmmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg\t7707\t3853.5\nmmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj\t7663\t3831.5\nmmx1v2c3pk23x788qwmhh8dexn6mc94an2l3tgj4kp9th0ygz46997nq6xalyy\t7656\t3828\nmmx129hgzhuh484dtlgz7y2r4dmc64hqzn4680z4dg8qq2gtwymfm3ksl283x6\t7587\t3793.5\nmmx1drdacsxd6ssaa44mauseapmf9cm0f8nah6tqpnw5hzs5r7vntafqqzqwzy\t7584\t3792\nmmx1hl8lnr4ddyyqynx5qj5psv63ah7atfrt67s9eszlck5dy5yy9aysylv93p\t7572\t3786\nmmx1eztxn269lt6rfy0kzkrv9ra79su4ujrua0ukxjxktdgf4zdqnaqsu3xfqg\t7308\t3654\nmmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv\t7163\t3581.5\nmmx1qqjqmgyqws0jk04frzf4e98ydd3pkcsfyv65g2t3lgnp9t8z4afq0kqpst\t7095\t3547.5\nmmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3\t6982\t3491\nmmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3\t6975\t3487.5\nmmx1uj0qhzeguf0zayyg2m9z794nrdlk7y7pnprt4w798s5yezgxgvuslzd94k\t6966\t3483\nmmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t\t6845\t3422.5\nmmx1j3p8gtyajzh07ag8cv2y776h7axrwhvppckxxtltelz08dsaxfxqg6vlwr\t6690\t3345\nmmx1q8d78sjm37uz4pps54q0mn4w3yjesr9jg2pprgww6mmput9rg2jqudrwzl\t6673\t3336.5\nmmx1f3ecr58txvmxjrlhnx3nw0wg7y7zdef73gcgjfrvcf8lgrdu3czsn4yx6z\t6640\t3320\nmmx12amu3muxtrrr54qkd6wr7xtawh2lare2aqptywufhl24rex2u94qzl4tgl\t6590\t3295\nmmx18dkl69sxx3wz5u69s59lp9d02qj6czg8h6yv3fzzfk7d2f2dqtas9dls85\t6541\t3270.5\nmmx1w7dfqwgrq4v8uyg2kpcda5ec44hnvdeww48zysxue2mttd04tz8qdpt88v\t6344\t3172\nmmx1dwr96cxjzyc6532h2gjagegkm58ns4fdrwj6muhccgxn5ysuqg5qn9mzn6\t6318\t3159\nmmx1guajyf4849dkedxpj2aqevkuc9a3u37fmg4hyqzmk4l02n37tfrsygnc5y\t6278\t3139\nmmx1s4pkkycenn7e0g0y4c3sz2yrkld7m98mlm8mc67y7lj4trw5se2qy4eq5z\t6157\t3078.5\nmmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl\t6144\t3072\nmmx1tdzqj2k7uw97ta3x459s7mk5jt2uh6p8znxl7f7u38davexzk3xs6tktrp\t6103\t3051.5\nmmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05\t6045\t3022.5\nmmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82\t5944\t2972\nmmx1n833p7z44rd62g0yvhlua8sv3d8wmyvrt720utk7x4vxwc3j72hqst6yh4\t5892\t2946\nmmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n\t5817\t2908.5\nmmx1n5w0atjthl70cnj3zll4ku3jl2w7cut8peqdkt04ck9annew2mfss5uu88\t5803\t2901.5\nmmx1mylh2r9352klltxhjqpfj5jnfll6uqfeqp7xunarlg9cqufrhjvs28jrt3\t5798\t2899\nmmx1u9lr65e2v62cht733pjlz5dctk7esxmwaxwjew2xytr7gqgmtnuq3x22cc\t5673\t2836.5\nmmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s\t5658\t2829\nmmx1u4m0jmxu7avg5am34pjw3g9lwqys7vcfp6ah53w60626rywvrs4sjzl660\t5621\t2810.5\nmmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj\t5588\t2794\nmmx19zr02kj3reljd7fz6lrpwdqep9s2rah2nkcwtm77yxl3ja4sqvcqdxt8gf\t5379\t2689.5\nmmx1d39vgf387ct682mq7ua9vlxpjs8w47ennw69wp05atf65stht9wq5hkxpd\t5314\t2657\nmmx1duvwvwf66cepnsng596tkjazant9t44v6fw7qv3umc05ehqcfmyszvzdu9\t5299\t2649.5\nmmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt\t5206\t2603\nmmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60\t5194\t2597\nmmx1ed9e542ggt95rk3ygc3xt29apzs2fsx384mwhqqwy30qs4wdhqgs9qh33j\t5134\t2567\nmmx1rs0lu6yh5uhp3pa8tl3dwz5ts392ua52kx5v3p8h5jrd0x68g8yqc6usm5\t4993\t2496.5\nmmx1r0e4s9r8jqvuvznv3vd5k4pfa5ahzgyn6lrgchwu4mpqlzgsx8mselfar7\t4936\t2468\nmmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr\t4877\t2438.5\nmmx1kq7xc88lghdv0mu62585fck3ppnlmdxn3jwvhqpks73wc8vwc82sqzyhjq\t4839\t2419.5\nmmx1mcsgnk9wd5wgausw8se9d50gv2m0dk0x8gg658xy76cnuegl850sklk8p9\t4709\t2354.5\nmmx1hvdake6jsnu5qa92un6ucw70jsa89athx8egx7507eqjk3s9ujvsmzmgd4\t4660\t2330\nmmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry\t4599\t2299.5\nmmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym\t4558\t2279\nmmx1wnkyn2ma6l2nnk80y44nrsqf9fdh27gtx60v3sdxvd9uzheruwfs5kf23g\t4486\t2243\nmmx1as0ezwhva4ch25cssuzrv8hr2vk4fyt8ycefdtx7dnwt5rgadcps7ezzc4\t4417\t2208.5\nmmx15m60pxy8mjp03mmtf9aq8kajmrt8vrzltj8epytnsucts50fh03qhw98ql\t4364\t2182\nmmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0\t4305\t2152.5\nmmx1v35z3r8m5aenzfv9gjx0wcuk9zj5qu98asrr9qa868zrq7qncssq0lsclj\t4294\t2147\nmmx1mlj7rhkg5c4gp3w4k8dlck5tyf5493dce5vx3x4m4qpzn7ty8mtq6ek2jc\t4284\t2142\nmmx1grhexfxkzq9js7t6595mzcnpady60mjuph254rtef25j8x074pzs6s249e\t4230\t2115\nmmx1rlanqjxk03n363dxgqfek0390p6pfdflm4vnf5d25kp8rxd7lg5q3sf3xf\t4137\t2068.5\nmmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0\t4045\t2022.5\nmmx1aa7hmgy7dhsmkhsscp8vlk4y48jyntq0zndsd4lvn4ht0nrjk3vqrtn5mx\t4001\t2000.5\nmmx1z66g30cq7j7apzf29zmdsu28m5vrqw9x8m9jh2a3vddrxz7fsqcsh4gv0w\t3983\t1991.5\nmmx1ye76l4yxct7a2842mqa8vcf4q3jqryksu3s6xqvj3qdlaq47es6s2nt552\t3942\t1971\nmmx1mlurm4px73xghkdn02u60qff4f795nnmt04e4as595tf4luvasmsggxmfk\t3918\t1959\nmmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu\t3904\t1952\nmmx1ml4nf4gxrz7yc2uymnu6xdx2ssev2q6696ar90pyz72fgp8vxj7s472hym\t3878\t1939\nmmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5\t3758\t1879\nmmx15hfmkxyxttvpt36w04e0h3sdgr5r25869jpxehj4h6mrt66kppvqp9npnm\t3661\t1830.5\nmmx1zm2yrzm79wn8lt7uhvaxjy0mcezkxdjujcru9fwnwczl3y5r4hls79m9l2\t3518\t1759\nmmx17gtsl3areyr6g7xscq67jl2xcnz56ekkk9stxvx3qev7hhez3ccs3juqvl\t3434\t1717\nmmx1q3eh75hak0v9f9psa365zjypz62q8d0cwv2qrpwpj2hayfn6xfvq747gj4\t3406\t1703\nmmx1qn07jmdsetg4k8gqvn3wmv9kqkrhrsvrmlc547zslku4grlunw9qqllens\t3377\t1688.5\nmmx1ahnruulrdycd5dr4xzjyymxgf7yp8n90r437ynysr2gz8n2vmpsqxk3kev\t3360\t1680\nmmx14xms6j4un330ca6y09r8ffag0d9gsw6dgka97c82k32d0qtkuu0svjvmgs\t3274\t1637\nmmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c\t3187\t1593.5\nmmx109nvzs3vhyjqm3l7g72fqdxyh465fedk4xjvy2rnhfmgrw5l8c4sex2mej\t3164\t1582\nmmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku\t3064\t1532\nmmx19jlhmuspu5xz706c63vheckjl6z7qx9ne5rg9r7c2tq4vj8rt9aqj60yvy\t3001\t1500.5\nmmx1ju6l29nxdkdapu9cqk8jf0nhvqc2qjzkecft4ysdtdd030ma8spqh0k5wh\t2992\t1496\nmmx1krwuwd0xfqxq59rhnglkkduxw8wzq39axh99vtqsy0k6tnac0zcsw7fhj4\t2956\t1478\nmmx1qm7k9w4qmnqc2gufp59g6hypfx9gcvpnz5e0j25a66e4vhnztmyqn04u69\t2949\t1474.5\nmmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\t2925\t1462.5\nmmx127sjp7qqmvy2grl0wa675djhjll46pg5rt794cvdp6s0gahg0asqav09gt\t2916\t1458\nmmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s\t2826\t1413\nmmx1tpyah2lre4lsclru42p8zqanwfukpu9n909p6pyrvlcd4mk0dr9ssahxe8\t2731\t1365.5\nmmx1fxxkthhcqf9ryfljy8xr9dcw4nq9q6mfetxx0dyqwq7qkv4vf4lql4qzgx\t2606\t1303\nmmx107aackvhak3d2lapgz6qprp9785qfudzrclptqzvgkpzly2ppqtsypk9kk\t2597\t1298.5\nmmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99\t2569\t1284.5\nmmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6\t2549\t1274.5\nmmx1355xdy9zhgzd8k3grndkwdff9qr8qk8raucr93praws40s27fkrsjlz07p\t2547\t1273.5\nmmx1pj0uu0lna9r8rgw8ccn4nj4kudgwxchv4l0tjqpw2x97035a2v4qdye8a5\t2528\t1264\nmmx15tfvs7twvmtvpp4zvgpedz4suysu4fa88zuzjyj2yjrkpscme9msaye6tc\t2477\t1238.5\nmmx10a32q2xtl4pvm2trnjf8cgyswuyywg4allvc7j5pakau4adcdcnsvmsr0u\t2427\t1213.5\nmmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0\t2407\t1203.5\nmmx1uq6ytg6v53lsy525m6352hznumufehsecaugpmyq36vezznyvzusmfpxm2\t2393\t1196.5\nmmx15n95rxf5c58taud2x06sgpldy3mazdyf2lf8cemmezp83hc5nzvqp3l3vr\t2391\t1195.5\nmmx12kjff7s048w38dpcmhelf3f2vt3ul77hrdze97fxr9mhgrw2lvmqnandaf\t2356\t1178\nmmx1f69lleyu3cznmnxlp9xznjnr84xrzutmjjcl4nlsfv2359fjze5sz787ay\t2337\t1168.5\nmmx18gzhlxuaafa5rqxlyrzn8n6ldud65ynm5tujhc0ql87f9myx5musf6wuje\t2307\t1153.5\nmmx1lntqvyetpdaqzkw4f9hqhuh8kkf3f7u3rl96gxz3lgztfptfaevqk8elws\t2272\t1136\nmmx18evqre2xyqqzgspaam0sps0avu9xt7llz7t3r9wexelpy8jnws3s0u7sev\t2184\t1092\nmmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9\t2123\t1061.5\nmmx1gkwel33sdr4tgyfq55az5t5n8fzy3thum3v03jmw3q730ee6ajrs22jkde\t2090\t1045\nmmx1pstmxwmdgkyzqqll6sdu5vdxpkm82ya4tz78w8n2yq4pdcdz39eq3uwvw5\t2080\t1040\nmmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm\t2076\t1038\nmmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl\t2059\t1029.5\nmmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0\t2035\t1017.5\nmmx1sp3fn6wkhmsum7jjspvdnj4696wyqc2jx7deaqpxtznus65jr05sg5pmu4\t2033\t1016.5\nmmx1hz0h2af4zmvnczp0twyzt8uts262pn9h93awamhc2sakdlvxvgcs8llaeh\t1998\t999\nmmx1qwcxn8k9nxdu43ytsw0ew7wk7mmptr3ykvtenms3fsyqexg9p36sp9slcv\t1994\t997\nmmx1yl78ddxpjz4zhe0ypy4jzjgt0kgle2dzhzm4f38wlwpumds6xrpq86kel2\t1980\t990\nmmx1q33rhh00r0dh7fx79lp9wrmv3t5mgpx6m3wtpajmmenuux0lzvlqruqgnp\t1972\t986\nmmx12uthvnq3g2af96lc3un900pd2tyy8apf0fsqag68d7fxene639tsacu4zm\t1929\t964.5\nmmx1su0cegxxdg73yhm3xu226uj74309x9ll5ycd5m8eh04n9as7mjyspr0w7m\t1917\t958.5\nmmx17l3xstvyx5rqxzqvswwvf27zz38ckt5q2030selhwe4elqzwe4hscxf06z\t1871\t935.5\nmmx1qg6du0mef5nz96gz7wa6f0ndmdhqnen0knwz3kw5ytf4kl9f89eq2kmrsw\t1861\t930.5\nmmx1l8ht54p69ynxxf0lxzrvm20956dcpk4lj22rv0jmdtefk70hurrq8m4j7a\t1852\t926\nmmx1vsav2xvgz8p56c0tj2lel0jew2u5v7r8mun2nm4tgu445w50vg8qx6p8yg\t1826\t913\nmmx14ntt0scarmrahc8dq3xfdwqqpuxddh6ez2qaq4dcdyyw0acwuevsumdgvh\t1810\t905\nmmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2\t1711\t855.5\nmmx1gqsyr45tlv0t2ct76wqpxtd0asjjq5df8etlhdva8wfvt8facy7stqeq6c\t1709\t854.5\nmmx16qstch29gdwqtfadwwta8fd20zrhqy7pgkaud2h3ceeafwjcmz3q2ezr8g\t1664\t832\nmmx1hfhn035wpjnm6yhl223rh55e85a23ksp679ku6kpk2n7klxxaecq4xw57p\t1660\t830\nmmx1j49546jumejnzwpq4ptdal0acmje45de4y9c99pjg5kglmazrazqxex7qz\t1644\t822\nmmx1g67zee4q9x4wp2s4lkfde4v2m05e90jgn0m42uxw35r22emk3r6qa8ttan\t1623\t811.5\nmmx13txgtfelvrng6mfjyk84sj74lrl3u7v05wn59659sg7ffup5f8hsl4nhzm\t1608\t804\nmmx1xm27rmtx3l7a00laujl97484grv5xqhrled5q7e3awlerfhe32yscwur2z\t1601\t800.5\nmmx1pdlh0rj93akpwww8apmpfj5awd08ew8c7c8ce4lk2cfehypgj6js7a2eeh\t1593\t796.5\nmmx1nh05jetwxuhj79j9k4wx6ujsamseykk84383jtmfcpzu2f2hz4wqj4e25c\t1584\t792\nmmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0\t1570\t785\nmmx1sg74tyha62nx9ttjuk53vhk00248ts77s2ee55ryrcskrmuf0k6svhdwxy\t1562\t781\nmmx14nru8xmclg23hcdvanrn72rjre93wyew7vgv7hrwtexlkx2m42mss8d782\t1547\t773.5\nmmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn\t1545\t772.5\nmmx13r385uxl5qm5dgt029l3crxsglz6g5t3sd3yy2metys0efjlzmqsl8aevk\t1542\t771\nmmx18ee0whkd2pk6xymy9sz7a9y6mmcujphzqcyl659fxz2cdr5ln20qkd3wav\t1531\t765.5\nmmx17vr7dm99pccp240q7kr4ynw0tln4r6h9n34vc9dcdk7gch3dcqgscgaw0w\t1523\t761.5\nmmx19zerahkctf5hxcrtdh2j5xjynl398ge4avn9nl4zsqw2hs9qe7csjqevda\t1520\t760\nmmx1xdrf8vw7nl5e94grks7u3h7uxaamgeuv3s30h3mfr560td6rqdlqj2svmq\t1514\t757\nmmx1aa6383rdchx47qugjavpkcyxnpjvj6v0trml9h3ez5wlcusv0vmq0gkj65\t1510\t755\nmmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj\t1497\t748.5\nmmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs\t1496\t748\nmmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s\t1495\t747.5\nmmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj\t1489\t744.5\nmmx1kjc5re76v4htwy0393zxnut5jcutlewywd5udfgh6l4xh5ya3xps8sv4g3\t1469\t734.5\nmmx1vlm6nlha47hctqvcqyz8uqfc64j8h5k2sgjmkk92ysm2k9se4hnqqldyu5\t1468\t734\nmmx15v9jzpzxjwdtn8ggkzu7s5suv7kqhuw9yer4w7ngvenlgg660vlq8zgk88\t1455\t727.5\nmmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru\t1437\t718.5\nmmx1r2wcfugp9ugm44z03eed4ad0t5qhvg8ufc3p7pu40r7l5dkjurfquuahjs\t1430\t715\nmmx1pangjagnfffhfwpk265ry6a3zch4rs2kgp2rup7pwtuphgmsls5sj55j2h\t1423\t711.5\nmmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn\t1366\t683\nmmx1eskq3mechm032urxq0nymxa4nx8tn56s626ftknpw4g2edppag4qfdfnpu\t1353\t676.5\nmmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al\t1334\t667\nmmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map\t1318\t659\nmmx1n0hnw7qmwehhsz4qf576s0sv5ql6kyq9afgrgmuzzwzfr03ld82q0ta37g\t1310\t655\nmmx10luguxfgx4rfd4nft0ee6ydk9dcedc4gvvwhknp0n9ux9nck45qs5m6cz8\t1280\t640\nmmx1d4580utep9epx933mp6666886cect39qt9dl30qwxj767fkxpfgq9h6y3l\t1263\t631.5\nmmx1xrydtrhnl89x5dtqpwape59f0t246hhs38tl5d3pzcamfxh65llspr5pvc\t1258\t629\nmmx10cj7u6uvj7syxwdjzzu5wzf6tk75mcg8px09sm9fas2u3le48q5qayp5gk\t1249\t624.5\nmmx1m7uycpxww03cj05zhdgzjcen70kv3pd7gwsk8grcdtu9ltch6rsq9plyz8\t1248\t624\nmmx1kyul6v54l7jhjr58e5lnqelmwyaqdy4mesqwr4wfw4ku3mvac47qk8qcj0\t1228\t614\nmmx1nqkt86wlfpkvjylyqdsy4pa2e024cjpfnczt667tshtsv7uh6g7qd8dnel\t1228\t614\nmmx19nnl9lw7td20z9l22v8wk558mxfrdeud8ky3229utv6e50cqyazs8jhq5e\t1195\t597.5\nmmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\t1195\t597.5\nmmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05\t1190\t595\nmmx1e2c8sqytwagkr6ekc74p7sqhzd39g8a25d2k5fqj5gckmrk0xdlsadufvm\t1173\t586.5\nmmx1kky0cu2dauntftsk8a55rdche6kuhm227qt2ktfsyrhvu7v4yteq8rg4d3\t1168\t584\nmmx1k4sqj4vufu22zxtahymvhtwmjp4c633herv8h0l2z9nm2xn7uqlsjje4hn\t1155\t577.5\nmmx14sfukr8xrxq5rlpu0dfvvtkzdzpqyxqyygzdjg6qn5ew34ynrkxq7pxlm6\t1141\t570.5\nmmx173nnyxacrsmasx2v80gxpejk6ypyvt52pcgejrd6jtv7yq6rtslq6pw76w\t1119\t559.5\nmmx14ecmst5fxu52vry0k6zy9merf9m8e38d2vsw6e0kfa4z6wkptz3slcxcpz\t1114\t557\nmmx10c7skd5pzvrclcqfemg2nwk0pnpeh6p95aucnt04z3tjhpl3f2vsq6wzpg\t1102\t551\nmmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c\t1102\t551\nmmx1qxr2rcnvgcwvs3304d8rlm8kzcg3cdrfdnrp0vq3t6eku4g55xtqw8kd9w\t1102\t551\nmmx134t4wf6h2ppxnxm02ejutn0va4sj6fm0qkyn0hsfx5r4a89x25lqznt9py\t1077\t538.5\nmmx1gntkqf266vrn7swllylnxpaayt7n06yqxhxjsaglkk8fzds4xuts4gwjsw\t1073\t536.5\nmmx1fr77kwzjzcv3xmrhczs5wwsmxlufp9kkvndch9d78fr3m09mqgysc6lnaa\t1069\t534.5\nmmx1cgx3ck3dmznw8xg78jc9xfcf7rws0yrkhpj5tymnc25dteduu35sd6p92j\t1069\t534.5\nmmx1ffrdjd4ccl6ga736hz3ran0xl8k9af5xf9ae28hqjg2fhugfdf5s4q8qr7\t1068\t534\nmmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt\t1056\t528\nmmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80\t1052\t526\nmmx1e3rafs5jhzf03a8wxwp43kcguxr98eq3azy5lvatwayvezqfyrcqeumth7\t1040\t520\nmmx1k9mxrjecdztfeggk2v3urwmkeg90f8dyq3rqmlxxag0ewqdpv6usvk2rqc\t1039\t519.5\nmmx18csvx9uspv3mp45autfk4dj0t4yzvzyce63gv66nahaq9pct73ys70ezu4\t1027\t513.5\nmmx12hpmx28f6hf0hzx5j6z9ep8vjmpcgq5kwmaxkpagkqdfksunkgssmk59vn\t980\t490\nmmx1prxda0yejv5m4h6y4pgkzmutaxrd96zsnqss6aq5az6609dzatmq5jnv0e\t972\t486\nmmx1rkkaqaqs8c99w2jk7xw5ugfgkcfyhxpnu8xq4g5a5fatxvgggtwsccyp28\t968\t484\nmmx1gx8an96g7ky87eur85puyex8r24qswx5wn86r2849njg8q2hkeys8zqlvp\t946\t473\nmmx1re7sxpa7fmpseg8phu4pqamqmg72qmm3e7fzx880lz79dnyltpgsga39eg\t938\t469\nmmx1vr057q49h73hph3ksrk92sy3wfm2u22g9ezklxmzrw92m7yl582sq22c4h\t928\t464\nmmx1usc52whlhctpx08phhjzge03jy0wf2ft0y9dngzgxxs2ev0y23fsgjk7kx\t923\t461.5\nmmx1hsxpdkzeynjv6dswp89klcu6qc8gn0vghz54gcpa95z0m5m5p6ms64gd99\t914\t457\nmmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w\t912\t456\nmmx1ff4lyf7ulfrwt0wfnr6dtpuk6tv0w522ef3pkm5ax8e9wv8crd3qe0a7re\t902\t451\nmmx1xthtx2n39nvvjrrkfpshq2v6hltn82h36dnxyg942h6drj2q6snsxx32gu\t898\t449\nmmx1xwq2revzzgwlq27emrpfjmskmr60q7znpayenjlhuh08f4vxcrlsm99vzk\t873\t436.5\nmmx12u3ppvj9yvh6xs36zscus50m644dx8ywqq530w3jkjhly8hf3qtqy6fe48\t864\t432\nmmx1r8mm9d0q88dr7dw0v94yl0cthpr560r30x90zxcutltxcck6xq2sm3yx2k\t857\t428.5\nmmx1lauskl8kzuwevqyx2ky8ale95esy87swemetk0zhc73ctrdm5c0sxy3exa\t841\t420.5\nmmx15spum2ccvkzj5zg32v0qzy9xhhafsa278ujyq20m2yhwq5lpxstq8ghswd\t837\t418.5\nmmx1rfkx4gam8z02m09k5am29u2nyn62wlc22f0fapkqra6ckxspnn7qa0d336\t827\t413.5\nmmx1d3vplkcw0pjqrpfr3cesjmvslk30p8qxhky5l4gdslclu70tql0qdqp9dn\t823\t411.5\nmmx1essz4a6dexpprz066dfgwslmz3p8uy73czfrlc7thy3s8w782rfsx75has\t818\t409\nmmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp\t784\t392\nmmx1za0yful9pmmgtpzaqq64s9u7nclhrkfw0nzjg2wuvzng6yxex67s0sk7hf\t784\t392\nmmx18zjss5ccnhyskugrwlxuy935zn3vz7ns6gyqg2cj8f3r99av9mhsck4ne0\t759\t379.5\nmmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g\t726\t363\nmmx1chmqhg48plemff47t5hrc50p7sk809q337uvwn6385cdl8y8a2jskzzcwc\t723\t361.5\nmmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu\t720\t360\nmmx1vkya64sext8u0kcj2fsrezryfvxyprez6xdxapkzpcywakxh7v0qu63esv\t701\t350.5\nmmx1f8yps5v4rqakx3gyws5hhlrmapcjzzf5j80dm655ehcrf6qgz36qandk5l\t690\t345\nmmx1afht99ekwmgh9s9h043aygvtl8tmytx7ymgavn6lkdxxczrgjsmsqcx3je\t687\t343.5\nmmx1c4sffu66s9eepqph3kfjarh4fp5h5dhl3u0r8jvrqlq4jkdp3sgq4dcav7\t681\t340.5\nmmx1j7ns20cea2havm328p28vxeyfdcv0yrhndl2h8735slc4u0q3fls6dz77y\t680\t340\nmmx1u59mc3s94cezun5apvw35vj2vnzfanjv45svwfdat84wpuefcs7qzns66s\t677\t338.5\nmmx1ghyal08f7r0p3ft8gywyr24p58jhe9fsy0xmu6wwfjuq4z079q3s36cu8q\t665\t332.5\nmmx18pu3yu4a0zatqgkph8t5pz3n4jy7hq2x9f348yhwafvj4wd328usef7aw5\t650\t325\nmmx1drhuec6ts2hz9qf8jjxmpan7zlung5anurrpxnvjkmqy87vvuh5seglsha\t636\t318\nmmx1rsjam2cenutaew3r3ssfc8zfh2uy2y3ycawafk0y4hq49djayemqnelh4z\t635\t317.5\nmmx1yqycann5zs9eupjsea76ahp5h2h0d52n6hqxvd0v3whezr0wre4s3zku4g\t631\t315.5\nmmx1998h39fzrpfxvgc54r0fmmuq48hj8c372gradmy2x6gq7r45suuszqtk3c\t627\t313.5\nmmx18h89t0y9m8cy8trcveul508ju6v3tnajz2hrhvcs8rm8pn23djesml7auc\t618\t309\nmmx18tph3dn7ahfs24zu4lnlhrn9uk35s6fd46x58jf2xq3wzdw8ygjs5eamp7\t610\t305\nmmx1652t20n0jwl4mn8xe6k3j3zalgpuw38u23e6cf5249n3h278033q3kcq00\t603\t301.5\nmmx13ech6m45gf3ludnt3e3az7jf68qntxg2htk492zuewh40q3yqwjqv6jsej\t597\t298.5\nmmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn\t595\t297.5\nmmx1zp7rs0q0dqthcwdfvpaugv6px5qylq9uvwltvq4gpepdqyk9299qhvd3tr\t590\t295\nmmx1e5gsd2weaqmzszdlj4gu975s2cc2gscnrtsa9agufcgjv3zat8vs606ewv\t583\t291.5\nmmx1544prt4r26fm2f6ytlvdfe3j6mwrs5p479kp3lcrz5n58kp8ugpssn2z2u\t573\t286.5\nmmx1l52feg8wshacztsyf6f77ndq44qp87tdwns9wdlxv3t4uej08fssuuwng7\t554\t277\nmmx19ud3ev0q0tcrpsmh05tggwt4n2nkwrzrrtuwtyv0pl2t3t9w52ysy954ch\t546\t273\nmmx1v5u67yws0zlnutd4lw0gqk8dk75xnjj3k87rnzjqurx3lpz7aflq863r48\t545\t272.5\nmmx1pmjftgdx7vsmtydypwy6qe8tnmtc9wgya5s2yl23myvk98c83uxszm6cvd\t537\t268.5\nmmx168f4qnz2e7sugjdv69keaqp2mswys30sqpyskuqmzmakqyu94d5sgt3qcq\t532\t266\nmmx1rd9psq4y4kt4svwhkvsj6aqvrgwmf6t2qen6yfc9fw6thzrxt4aqmjvmvj\t531\t265.5\nmmx1h9p0lv7at2ahtulugvg9vdh5nkjph2uvg93uz5azp8hmmuyaj50s8ky6v6\t528\t264\nmmx10ew79lhecezg2ewrj8l8egjtwmkffvs2jfl8rdgxy32arecyp5xqdryl8y\t519\t259.5\nmmx1lka3j0475gzy9yk0c3lt4f9d0p8zhlcujhsfsl3f035z6fuytpesppfrq9\t514\t257\nmmx1qpyq03vzht2uwf9pzadx3rpa8w8y7pul2he0r5y3497j29ul7x3q7ac26j\t509\t254.5\nmmx1fk0jqxyz6eh35qnlu70gx58v6ahgng29e4k6zjf6tqxa96y7p3gqu8w8qq\t493\t246.5\nmmx1u9xsdvqzayfla2rutaxkespha2xrhn9m6wn7v8z8rhj277v9k24q44rft2\t490\t245\nmmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t\t482\t241\nmmx1qh002xzjsedzpuzqq4cz6spv4qayuwhyt84j7pd8zeylqwl0k2xsnhg9y3\t477\t238.5\nmmx1x3rjuxmvmcm8x7eaqjkpxxc3r9nudd7erx0g5uffj687vvx62g3q9gq8ed\t465\t232.5\nmmx1ksduhw2jnwayh3a62cnhmxf7vax5lult55kj09ejvqgrr7gy726qkp57w7\t455\t227.5\nmmx1ktyudrg32h95gwzg0hfl87lf6wruuunp6w888typfdw9f52g4axqcsltyu\t454\t227\nmmx1qvemldmglge8tr2dcwnr4gqam6vkal5dkc2jwsz2jyyy8rhry4hs58hvrc\t440\t220\nmmx15qd64czwphlu49mlj6kmxru6wdcrjny326mp5d5p0hpzhuhw65sslkng8e\t438\t219\nmmx14tkxv7wnyfjm45lr03j8r2qac5hsa9mk75emunjg78qngwgw66essvzga7\t425\t212.5\nmmx1kcrktqlr88979xu79dxq5slh3xkvx727j8unxhev9frl8rhw09cqqnl6r3\t410\t205\nmmx1z8wnphkp2d50k2kk3f30eyxtp8h69e3pazzawvwtseuuerld339q904jsc\t403\t201.5\nmmx13xgvpxumznaqj5mkhxc493nzhc2kf9w3ks9z99eaznesjrsln0eqgwclyq\t388\t194\nmmx1ywsu86chqesuxt45aktpkg78v7we86l0zf8xa3rcer6gn6xw8lnqnwk5tr\t385\t192.5\nmmx187llktd264wz7f33nqexhh8frcykztdg0emw5t26cvmzfng8dquqzl8qwe\t369\t184.5\nmmx1n0a3t40vv5kdgfnduj82kzw9ewy3tu5utszgxhkztdvqlu8xgdks8nyh2h\t367\t183.5\nmmx1dm7la9qquehldy67xsfynp76p39dxa5xn4veegz88m7amspgpgcshv7dfg\t364\t182\nmmx1um9jpra87stxs84lldpz0qt25tkxh9e7atmpula5m8kuu5gzszfskfa0r8\t362\t181\nmmx1vpg8kftakr3pammp86a8hxyar9s0m54w9j4m29d9d6rlk9ztf2vsl7ck38\t361\t180.5\nmmx1ptz2hwskzvmmwa6a3zxvz0hw44uk4xkuyz65r92lv0jnty7tgwaqvhy630\t359\t179.5\nmmx175mntfhx53xw93y6e7g228apv37j7vwt23syhtwnc3h0saptxxrq9mt0c0\t346\t173\nmmx1m6dwm8wvtthgngztjnw7r0g4z9s8797xa7hdzrj2zyajctgrpc5qx2zqg7\t341\t170.5\nmmx1f2jdndglt2mvq37tc3wp8gtf3l3uql0sn485x80096m59y0ydl6q90ds4p\t339\t169.5\nmmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr\t332\t166\nmmx1l6yphrjzvuc0tefqug5zs9eh3gu4fupq6e8ncgsr6mrek2xvvwvsf72r4d\t331\t165.5\nmmx1uw2mjnw6zt8t0r2w0afqu3zw7jkjl80xjwnfgk6cx7m2c9u5052q6m24l3\t330\t165\nmmx1hm4mvj4dheczz5g7fvpw4pnmrqlm0z9arhkqtvq6yaxza5ckmlws85y7zw\t324\t162\nmmx1hkmks5m9u9le0k2zmx5djjxr6eh34nyzldlnty3mzk6yhzvcevks4z2n29\t321\t160.5\nmmx1ze8ugap6cs90ec5tguyd9hg9g2xv7fyrz6s78ewzlsk7uwn3pvas3dnmt3\t318\t159\nmmx1l5hsvt7g2pydzauqhm77g4h8es27ffagmpseuks5tm3tn04n6nyslcafqj\t312\t156\nmmx1tgppefepecrczwwad3zlvcwhuujsyr63gh8mv92el5yy8egzk97sdqpjp8\t311\t155.5\nmmx12j2e0ja3z0up7t0csl2fmm52jd9mrc29pavccn67uhadrls4457qpv7qls\t310\t155\nmmx1sg8mgch2566d2uncn3lew5wwwacp2femp63y4gshj0qpy9fehjqsysa3ng\t308\t154\nmmx1fgylxyf2ef9p5zj0d6hnz6wr7wmkgukq6zt398uk3j78nhxfu2kq05qm4a\t308\t154\nmmx1vv29ueqjqtr7w7wk9vhw8txgh7ye26zgue93prgnq7m8sp7hw03sdwatcr\t307\t153.5\nmmx1ln8cwt5hwwd5l79uar8gt20njcl3vzud6m00lxtzc0uecq7zvmzql5mhez\t306\t153\nmmx1mhp72cd0lfnlfpfuclh9p6uqcuu6y0cr4cx7qnk266hleawuyuxscha8vw\t292\t146\nmmx1lnwzzc8kdm0lnfezlapkh66tl59ruhn053rtsgtnd0j6qglr97xqt865yj\t284\t142\nmmx122x5elltrsykqwy27q4jpe405m5d6aaxtfte87mjl6zty5e5ju2q9ucfz8\t282\t141\nmmx1c68tgygju8yrhf4samf9mdc9rstzqe34kcz2zqnyqjxcraejlgpsq6jutc\t280\t140\nmmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4\t270\t135\nmmx1m2nxpzuhfj4awyc2wnu37nhkhsy0q8spg9egnkzf3geq2kax3g7q54emhl\t268\t134\nmmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq\t265\t132.5\nmmx1t00welhtn9k0hg075ttg2laa7dj7d26jprf2as70xrx2fuhjyy6sjjp3e8\t263\t131.5\nmmx1rjnt6cet0cx3m99afq29ssmk8vagnw3qvzrn2h38aawvp023emrsvskald\t248\t124\nmmx18gszx83xlhzj3s533m62pazj3c7v08rgu4t8sh0vs9c2leg3ldcsfgkc3y\t243\t121.5\nmmx1ccgy2ru9jn5a7d67w09zrgsxgv5hfxrkzdcv56dlpcraa7tkrtkqsrah8a\t241\t120.5\nmmx1vmxgy2uzfh8z0t99p0yqgrea3f97grmh33shc28vtvg2lkzcpygq0ls0np\t227\t113.5\nmmx17naccyvydtmkgnaqvu7q3dpphzv3grdsgm0fk4ja220v3nxwnywqwss094\t226\t113\nmmx14vvf5wwml9crhjcl7easevgykv0tar33364rhta9wkna4470uuhs7e7zs0\t222\t111\nmmx14fz0p5ff557c6sh6xx3ssztc8sv8a023cqugskep0vm4j85rna0s7fu03g\t211\t105.5\nmmx1ll2yar6vrsv84f5qdwfvh8tv80qlmkxdlr4ddqpmpzncqrgjghjs8s573z\t210\t105\nmmx1ausld08qthhjwmpxvxuy257ddrnvwq0u0q2qdgzwk6x95lwvp8wqun9tn7\t208\t104\nmmx1arwca695tyd8rsgxx8r707xpe3laawcv3lq593hs4qz9zehlngvsz68wh7\t199\t99.5\nmmx1lpm0wnvfr4l07wgvfhhgzfgy7ur5jf5g3h024gln5ykml60nr8us9wc7tg\t198\t99\nmmx1qm77f6cv9z9ufkavnt5nll7qq55rvjx3hru8kafx4guk3chpuawqcmd098\t198\t99\nmmx1tuw784a8wp38c6q3fw6jfeqy3pvd8ggh0gj9h0xqvez00q9sew5sg0j06z\t197\t98.5\nmmx1n36ek4z7vprh7xucnje6p5sr4s9mtr0ml9a3wz6xd2kp5v3hunasjn35t6\t196\t98\nmmx1f9rjvatrgqk6fyyxc522xrt6h9clrlvy49nx8swanx58t2n4g3rq9nwszr\t194\t97\nmmx1rn0p87m57fzv5je8wu97aegkhejf7r5gz3clr4ajs0k42p4g57pqwh85wl\t184\t92\nmmx1rq2lygf5p4hs7a3ftmc8u24v7f2q9gapsskf0kgh8wjzzxsddumqjz5fsh\t174\t87\nmmx189rrmskkykntwceazrltap8a2at40wdhv4wvjtqc2xk8d85ttdqsu5l54m\t173\t86.5\nmmx1kn9t8m4uxn7xpqpdy34xhxrdkuzs5tuhjqyc8qxw69decxqgtcns9yq940\t161\t80.5\nmmx1mq9w9vnuae4fdmn27ceh3h9wzaygmhf0c3sqa7xufy7x0l87zwwsdfm80k\t158\t79\nmmx1n9k3yluqcmnwz5wdk3dclgs6uq7yf4g4tvahh25jl3z4u488ttesnf2kkx\t158\t79\nmmx1n04te3zvrvfsgmvzl3dzegpntqeqevwmd2ycwwwhng0hwslxkyfqpq2ng5\t156\t78\nmmx1zqrr5qw2akhgvvxnfvl3epw5zxjy8j3930fed2agnexxjelrhy9qdrrh37\t154\t77\nmmx1nkd5fyvrnu8zeqgen48aeqcnyggjxnn7dctfddj7m2mz25alrl8s74wqvz\t151\t75.5\nmmx1jj4r3za249xxcyp30jjyen8nz6kmtldqpypwuqhukzrp6trme30qsvdfxk\t151\t75.5\nmmx1x225z4p73e847du0g5k63tgfj3c3zn03z2rr2zqnm6fs72n03k5qrafd09\t148\t74\nmmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q\t137\t68.5\nmmx1yknhrstjc5uslrg7zequ278dk3j42s7ylfw5frvgjdsjzm3jxwcqu768zc\t131\t65.5\nmmx1tgde3wpspejv0gq70lqe54l93n4mrdmrp3xt3ts4q96keddyrfjqe0e0t2\t131\t65.5\nmmx1jmkx9m05exvtuk5swve9x9qe2u6udxx5h8p4w2drlu92523pjj6qsq8epg\t129\t64.5\nmmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5\t127\t63.5\nmmx1zx8z2zkc0hvn9cpnjctcc8akqxf0e2au70dd3uln96hz6uxw7c6s6s7s88\t123\t61.5\nmmx1w0nzjd37pkkewp6ntwfcc39u0w36723amrl2w6rc28aer3m5yexqlztrjy\t119\t59.5\nmmx1fgxwy76pzglmqdqxuvv3l258233900kkke3p0mf0gaztjwmxq2lslppuqh\t118\t59\nmmx1els3e8hj2jvteh7y2xgwwxwq2uknurtkp63ca74gcuhrcajpzc2skqmh40\t118\t59\nmmx18jk3gsj6r4y3esc22r0qvxru79ues6z7keha33ahn5tgahxzcknq48ler4\t117\t58.5\nmmx1tms3d3n23j28f9agpm0jrdqnh634f3q9rgcnwsgq64yhcshps4fqd0fv6k\t116\t58\nmmx13l7yln6mennhvfx9celf99enpdgtfe7qs8dmr4nfr06prcfmz0eqsda2ae\t113\t56.5\nmmx1dxxgygp75dh3p0yh6kmezeeyftncphy0q2fjws48wzxdrktsy7kscjdmd6\t110\t55\nmmx1tagjkz3avdgz8a5kn8kkhs3lr9lur0fmdt9zuz49h9j9vcg80v9scl8fpc\t106\t53\nmmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn\t98\t49\nmmx1yht9eg80753876sq3qjljn7nwxl300g70rauqran8qkvdtrtqzvqxkdxq0\t98\t49\nmmx1kn0k496puu64hyutyn6augc2cj52rc4p0vmmfcceqezp2y5kfv0s6ddymx\t97\t48.5\nmmx13k0anxdyn6e27hful6t63mugrh6asm8vphxe0rg57a0p5p5ttfxs0dy8nv\t94\t47\nmmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t\t94\t47\nmmx1k9lslhl4wmhs7ray9lfh47cxkz0j5vr827vypyaltsq80697xyqss2gn93\t90\t45\nmmx1trjmkvfv40ngnfmvc5uw926gw8fndanpnp7mphq2tgqwt4xdw62qmrvn3a\t90\t45\nmmx139le573u5rq3g7a4adydjznp86en3u5wznrlywq5k0jy0s49fvwspq0w5k\t90\t45\nmmx10783gzrqc88k0n0ert2nkjz9ams2aj77ux4t0y3lsmyexnue2h0qem44ac\t88\t44\nmmx1vprl39d98qzd3u5nk95qnhus9vjp4sen2w7y59yu0m5udqll6szquzr6y5\t88\t44\nmmx15qq0sdefrea28hhlhe5er0vur347vztfsezj76fapg4wf2nxaekqqxsy66\t85\t42.5\nmmx1csleu9q374crgsm06k0xq2n0vdcufm34ahz3lww7kmyt7ukj38aq3ta9sv\t83\t41.5\nmmx1a7mtekvyzh5f0uswz0pzqq6lys66ta9eavjyk66w4kgrseej6p7q5savlp\t75\t37.5\nmmx1n4n4k7wa79l83ch35r68eavnh0lkwcs3h52jt2xjl6j0969lqvhqsew3wl\t74\t37\nmmx13j75773f8tfepkdjtcrpmv3djm4y7htcl2waq6spxkgtxs4yss3qfukrk6\t73\t36.5\nmmx1esr5qdwsspwt9xap0du009x6m7whdzw8xak806c82rzc2dkwqh3qu5ydzd\t68\t34\nmmx1ujuywt50nv9jgt4tsu32mcgurtlu9zfvjutuvjk00d5k8peagwwq44fmqv\t66\t33\nmmx1jxl5gaxtd8wnc6r9nxmf5s748ct827cpjafdefw8rgen75lyxxws4u8a45\t66\t33\nmmx1getf4e42wy8w52v4j7dxw52qu93yssytwud90uxyzhg5x0cgptwsathj03\t63\t31.5\nmmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9\t62\t31\nmmx1mrmnxtc9vwjkgfst6z999x42wfuwl0ywnwn0rgyvypj6660l093s6htasn\t57\t28.5\nmmx19rwdhaq7taarhhqexejf6frgdk5z6c0zd72c4mvu7k4cwmcxn2es78g2t2\t51\t25.5\nmmx1wut7pf5v32hpylz6rxmrsztxfhskgxp34cgt8vawu3xqg6y8pj0szay6tj\t50\t25\nmmx1r2s7q00hau24y49gdglqx9luqlgjug46del32hmfmujmq87fhqksw7emhl\t48\t24\nmmx1lc7g4gueljhtkf7ffd3l0x747d8j9gk0z88e58zd9l6f7vh73mgsuzjvx3\t48\t24\nmmx1zrkhjuv3uljccuqjh69vlpmzewvnyckr569aw7frgjz5hsdgflkq0gm7ee\t46\t23\nmmx15fa2hl97h05swu4k5n8x6h6h4f37u0f09pakeletnl6ew5ak3pqq29f93n\t42\t21\nmmx1j7njmgtzmqr49n9lyacawww0uv2sjgxs7d04xu2ns6k62hfqycqsh33u92\t37\t18.5\nmmx18asaxgn4dcswsefcdwx54kldattux7l0yn96fvmndrpqn6adsluq3ffr8x\t37\t18.5\nmmx1q5kdfkldkc735p5e7aj6y5y0szvhml9nchux98cfqfun4wa74vxsm3zr8c\t35\t17.5\nmmx1x6j2m793ten9em7pu09q8qca794vrvrdc3jcw4yzc8zup0zrh45q8d2lqx\t34\t17\nmmx1edsqjgugd0hqynwa9h0gm05vsmqpse9yhwr85eftrxyu6ww0la3qf9hspx\t34\t17\nmmx12vtlj9qhp0uqhs3m9tay4ujwldpj98rgxxw60fy7huxwymgg785scc5d7f\t32\t16\nmmx1evudswfffa6pru342f5hkduqhmmalx3c94clvyed63ht0dkn2edq3shffh\t30\t15\nmmx1u802gcgzhfkkggcq5l7388xz2fn9hswy7zvh74t5c7yvu9x3r7xq4d9r05\t29\t14.5\nmmx1eyu4e3yl3psnywtecgefejdmcpdlu2z67cdma96kh89egt9x4xgsvvejlu\t28\t14\nmmx1mk6v9wmyju7spyncrggntg4lm62g0ensg76yjgjhdtnmpls3nr2sd9qwqp\t26\t13\nmmx146y8qu72rkcw0xrs8vf8y7j423t42rtyynze5d3kw6e79vdsdenqj3esfl\t26\t13\nmmx1u2v2uf8seke36nxtxh90hpgh43dy5py836ygkvqwaqx5jhck95ysjepx8g\t25\t12.5\nmmx140ya6nvrw4a9v4ydwrkutvju5tln6tflvq0uehqk6g42d2g8m5xszxwz45\t22\t11\nmmx1r74wdy7kzh2dfdcumhc85tuherczlt8c4dsqdl03ufyg2lfa4frs2qmwlp\t21\t10.5\nmmx1e8xldlayy2j5ptk9grrze76e5jyc8p0uq0zuslawyhqeu7xme5rsh06fw0\t20\t10\nmmx1f6khu080cft3c9g5l8qwqh2wlza8473382h4gwursgl0txhdadjqn2kzv7\t17\t8.5\nmmx1d9gx5anuvxgg906tzj0rdkhyypjtrfc09ufdc7yykhp9h46mxecs2qe2r2\t16\t8\nmmx1can6xxmz54lhtrm53udpehkn6k6qspudttf9pdpg9evccj9hmhaqufdqfs\t14\t7\nmmx18vfpqpqwtt7htk5dwgd4lwdnyym659skm9ppf0sadkp5400w50tsxysqv3\t12\t6\nmmx1n2y0dl7ktdrvgvv96kde4d042jt4e3722ftpevjcmfmqquyycv7q7s2d2k\t11\t5.5\nmmx1kzfexe6m93ggzewpf7xtd6jx9g9n2k3p9n0em8zhug623tx22d2qdzqnq6\t11\t5.5\nmmx173tum306ce679gav9xyzv9dw7m8fhhw4xh7g24xwmgqxjufv6a8q3az0ta\t8\t4\nmmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f\t7\t3.5\nmmx1ysxav0zk4halpp9r56m0s3cua7r62cfx57snu0s6pqqz56qqt32s2j3jzy\t7\t3.5\nmmx1hut2sx0lenf2wed9atd23zp8ps8ntaacmjkd4mym8m05pcz69dssrvr0p2\t6\t3\nmmx1thwz6ymnevqazuq0y5ry73hzu4h45mv3a3a0qdzn8l2rjfxa9sdq0c4clz\t6\t3\nmmx1ddu2qyh383tuc3z88svmn7adgekm59lv2r3yc8cg35vclqqztwwsxcg356\t6\t3\nmmx1rd8z3x6ncsk5734u3xjkqskzxq8tlcn00866309kwqc993j4xnyqhs0r3s\t5\t2.5\nmmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch\t4\t2\nmmx1y307v7ha8la3zys39rljvld86lgzklajw4mzur8n0ehx4mpgqm7sm34wsh\t4\t2\nmmx1dtx0w07ng5vaur9twxe9ajkvq4tfsgmgd7u909xxkvfmw976sr6qlyz0dv\t4\t2\nmmx1ppglv79lx5ahk8a2cjpfsdvzx6y94c9qzswthyamhx09vcfqnufqvgqs36\t4\t2\nmmx1uyczs9n3942y28h6jw6dpyfqr99xlhdr2r8qus4907lr2srtuwxs5cchgz\t3\t1.5\nmmx1c2jrdpa796438jzxxjw3y68tepmlzqv3e4a28d6t52juznprsm7qpwc0fj\t2\t1\nmmx14cgd45zee9e06xl39x3m8k076gm4tnkr862m49q7vdeqm5ulznxqeyeuju\t2\t1\nmmx1n5tgph6psu6a3z3u365ed4xmcm66tdk2pyltztvsy7pzunhfu2dqahcdcz\t2\t1\nmmx1cjqcmqm597re656z5w5jq99f7fvyth7wvhz3v4u9xvyxxyjyv5esl8yqfh\t2\t1\nmmx1k32fdxpu9d7lwjc9hd7qw6pz95h2summn9mu2ckyunxq5e20wk3qx7h986\t1\t0.5\nmmx1h6lne788w8u58dn0lquz3kjp22s0xkz08sjlxx3zpmwup9k8cjcqupa8r6\t1\t0.5\nmmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu\t1\t0.5\nmmx16ugged4tg26wydz3g2wasqk96ghz88nk6qzkcsep6qy0r4lcls6sk95mrj\t1\t0.5\nmmx1rwglj5p9s436vdf6y33fu89puyl4sauuv2c6jmpadnqa0jmxezrq7mkt27\t1\t0.5\nmmx12ts7lfh9cr6rqj0h9uhmha99tyep6ln6xtmskp4x9pv32s28jrzq3cksav\t1\t0.5\nmmx1x6r4mtz74u0walwxhe4qxcu4cm4vkzkgjsj4p8a6xn9z43zg33ys37vy0e\t1\t0.5\n"
  },
  {
    "path": "data/testnet12/rewards.json",
    "content": "[[\"mmx1yc5f9qcevne2cnp86szf4nnpaxj5kns2nzsx8jgg3ssal39k0cqsrsaepl\", 12660], [\"mmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx\", 5937], [\"mmx10luguxfgx4rfd4nft0ee6ydk9dcedc4gvvwhknp0n9ux9nck45qs5m6cz8\", 322], [\"mmx1ju6l29nxdkdapu9cqk8jf0nhvqc2qjzkecft4ysdtdd030ma8spqh0k5wh\", 8266], [\"mmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt\", 795], [\"mmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl\", 10588], [\"mmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al\", 27], [\"mmx1c68tgygju8yrhf4samf9mdc9rstzqe34kcz2zqnyqjxcraejlgpsq6jutc\", 132], [\"mmx139dxs6z0y9pgp2z4f9lhx8mczfhl6fenrlcpwefv8t7eklktwqzscw26ns\", 3804], [\"mmx1g4uyjjhup8hgk6akrjqvegmxu6xg98er5pt5uzqn520ud87rlgrqjn8cvt\", 469], [\"mmx19taynglsa6ewczfug4pds0qy0cwstd600hwzel8y02dtn2k2esyshsxfa9\", 3209], [\"mmx10nfcaxrj93rjxxx3us3mwzajznj8qpcd5vg459yfkk8lg90jqq9qxry935\", 7249], [\"mmx1cke885syq8wasw96nqp9cuh6wcr7sezvy65a3anjqzqhk59j9s9s7jl0gt\", 504], [\"mmx10ew79lhecezg2ewrj8l8egjtwmkffvs2jfl8rdgxy32arecyp5xqdryl8y\", 613], [\"mmx12m0cmm80y7twslqtz4z2qhesdkun9ncjhddnkdzeedf2tcap9qxq74nzf2\", 9], [\"mmx1vgjfpw47le6hw8kacxtf22tpmr3aqrw9umngy4gjkv94r7hp8gxqcqd55k\", 17], [\"mmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0\", 1297], [\"mmx140ya6nvrw4a9v4ydwrkutvju5tln6tflvq0uehqk6g42d2g8m5xszxwz45\", 52], [\"mmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5\", 1206], [\"mmx1vsav2xvgz8p56c0tj2lel0jew2u5v7r8mun2nm4tgu445w50vg8qx6p8yg\", 554], [\"mmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq\", 17931], [\"mmx1vmxgy2uzfh8z0t99p0yqgrea3f97grmh33shc28vtvg2lkzcpygq0ls0np\", 90], [\"mmx1l0hpmq7hfw4l5y6hfrer0xc980a3mhazzyc82eycvjaugj2d6sgqn349gp\", 4126], [\"mmx1jghsp60cua83ekgw22a905pv8qqsukjjnz4nw9gkqlllspmsfugsxnremv\", 1826], [\"mmx1lnmtuqh7jvxjsmmsf92ulcavxtr4fjhzva774zhs0fwvctzf7vgs53cn9h\", 510], [\"mmx12v7y2c99f25yntuk0dxpu4kwectxx62l7hvqsj4acuvvx0xsrqfqlds5l6\", 1625], [\"mmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n\", 3101], [\"mmx1grclm0x96ccghh8574wnk8wmmee7g8sxt2emh6mgedezdntecsfqrtaz2t\", 1025], [\"mmx14fadj8tx3ksq8jvfmcsuhxnxmmn0lqdlpjs5rs8dfqphgsuluqfqxgys6j\", 575], [\"mmx1eymvxpnp4seshcfn5qfctlzsukazt49t3m5zgz9q68g4sry89cfsggxcfa\", 197], [\"mmx1nr0cpl0g86e0wdzuahcc2x7f4pc63n2y6a6zpnsjt5lfsctzmufspp6vd5\", 778], [\"mmx1jkajyu65wp0klsuyygjs5425tyq3ujffs7t7g6wgvxa2r4arrs2qqs99pp\", 315], [\"mmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq\", 5328], [\"mmx1axrdzlwdpczy66khlgcx6zffrury8z6jxxapeygehz5djt5cpyts2mqw7f\", 1779], [\"mmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm\", 18640], [\"mmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9\", 10249], [\"mmx1h9l7sgtnyagj2zctlj0xmmn7275uqpss2dn8funllmgd7aj3auvqv0fy7q\", 2063], [\"mmx136s9temfus3xkgz3ftwqkrg3kpw3nr67088u2ckhkfvazqknycdqe09z9d\", 600], [\"mmx1t49g9vz555dcm6dvrxt9hxua58jf57w5rmnjnaynnclww8lmagdqc76mnv\", 184022], [\"mmx1hqcfqu3r7larng7g73jep24emu4kty990jecvfyugjuwp5n4acdq7wrxdg\", 508], [\"mmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c\", 1310], [\"mmx139s60xj6eeuj5s0fvhgea06up5yy0ucn2fayvg4fd90xyeq9guwsv35zcs\", 2133], [\"mmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj\", 5927], [\"mmx1090syeqn56ezxh9tzlw2006pqxt34ytn3ytfrkxaqaghh40cncwsya49ev\", 1482], [\"mmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\", 1440], [\"mmx1mcsgnk9wd5wgausw8se9d50gv2m0dk0x8gg658xy76cnuegl850sklk8p9\", 1405], [\"mmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn\", 5549], [\"mmx1v35z3r8m5aenzfv9gjx0wcuk9zj5qu98asrr9qa868zrq7qncssq0lsclj\", 1970], [\"mmx1zngflag3hu0axh6r6yutlqxt9r7vwd3fh243frzz5gtmfysqeysshp5vuk\", 2469], [\"mmx18evqre2xyqqzgspaam0sps0avu9xt7llz7t3r9wexelpy8jnws3s0u7sev\", 785], [\"mmx1fheacy3c48nkd0vgukeuqtldfzuxh2qhudhytshgctqe7sek25jqv99qqt\", 9221], [\"mmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj\", 914], [\"mmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf\", 3417], [\"mmx10a32q2xtl4pvm2trnjf8cgyswuyywg4allvc7j5pakau4adcdcnsvmsr0u\", 1931], [\"mmx1xthtx2n39nvvjrrkfpshq2v6hltn82h36dnxyg942h6drj2q6snsxx32gu\", 2926], [\"mmx1cg5zspl8na39un48fm04caj4xpphaerynw53vnjlwh42f528ns4s53jjv4\", 1094], [\"mmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0\", 353], [\"mmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0\", 32], [\"mmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs\", 1701], [\"mmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0\", 3], [\"mmx1kl3y0kz6jx5w0vxrcx9afkzthe88syuge0ytumakkce4nu969uhqdtj9hu\", 4987], [\"mmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82\", 2692], [\"mmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn\", 417], [\"mmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl\", 626], [\"mmx19zr02kj3reljd7fz6lrpwdqep9s2rah2nkcwtm77yxl3ja4sqvcqdxt8gf\", 1472], [\"mmx1rc8cv2t60pvyye2mylydmrp970nawa542u74894ejgwufzg7lycq505pp0\", 2047], [\"mmx17gtsl3areyr6g7xscq67jl2xcnz56ekkk9stxvx3qev7hhez3ccs3juqvl\", 9474], [\"mmx1psgwgft4tf7ult8p4e5gjp9un75t6fyzaxmhr9e64lmd6lf6kgcs53s8uf\", 1913], [\"mmx12wn9qtfzagz6z6ztxld2hka8cgvwr0nz55l3qjvkg0ayhhjvlscst4phad\", 76155], [\"mmx1lgsye5dkh57mxj0n2glerlmdzrh76snfte6k92gvxemkuhvug5eqlhcjvm\", 20], [\"mmx1ye76l4yxct7a2842mqa8vcf4q3jqryksu3s6xqvj3qdlaq47es6s2nt552\", 46], [\"mmx1zx8z2zkc0hvn9cpnjctcc8akqxf0e2au70dd3uln96hz6uxw7c6s6s7s88\", 1272], [\"mmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu\", 1977], [\"mmx1rq2lygf5p4hs7a3ftmc8u24v7f2q9gapsskf0kgh8wjzzxsddumqjz5fsh\", 88], [\"mmx16h8zlf572dedtskx0krrajcrt6d86s0kgukd4rnm7ae9v8tmnvmqhqmdca\", 3765], [\"mmx12kjff7s048w38dpcmhelf3f2vt3ul77hrdze97fxr9mhgrw2lvmqnandaf\", 66200], [\"mmx1afht99ekwmgh9s9h043aygvtl8tmytx7ymgavn6lkdxxczrgjsmsqcx3je\", 2057], [\"mmx1mlurm4px73xghkdn02u60qff4f795nnmt04e4as595tf4luvasmsggxmfk\", 2953], [\"mmx1w7jnglje4j85z4dv4z6gpmwagqfcgpg7nq7dh6wu98qq7ckd7umsdq9hn8\", 7627], [\"mmx1kez0lk0emjezwdl88ee6c5lvcqftu7l32ksqgl98snkdzke9cyuq58fs6d\", 1628], [\"mmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru\", 5942], [\"mmx1k738pwqe95qv3g8z9y0lhxsxgvf4z5dv0qgq9eh6vcy7u6juc5usrhgpsh\", 1386], [\"mmx1cxvpr0z0rjx9wfqrs7e8dzt5xshhlscpc8fk5xs79009zh3vesus9tru8m\", 36], [\"mmx1lghunzj070ysr4hd2alsujacc26t99zl3cv5qm03ttjaq4ugmvaqqfy920\", 8867], [\"mmx18d8335fhancnvy2zs5wsq8gvcp0l57n3pejex92ndg6s6s3casaqalq6hf\", 3363], [\"mmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l\", 3092], [\"mmx1s9972ypp7cgngncz8au8737jw38rswzyc4x26u84gr4jk07q8s7qjaljld\", 160], [\"mmx1kkq8ezuwsast9zplk8ec0pa0me6u3wydkrg5jn5daycgppy63y7s9y0up7\", 12822], [\"mmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2\", 605], [\"mmx1gqsyr45tlv0t2ct76wqpxtd0asjjq5df8etlhdva8wfvt8facy7stqeq6c\", 1647], [\"mmx1l5dwydjks9s84n3rr52nwggsxfnrf65me7tjnwerse7xxn868ulqfmwwyg\", 2961], [\"mmx1pu8fla0axf3227ttsxggudd6ym9u9vs7nwcrs8uk799ej6yegvlqhnjkd2\", 1725], [\"mmx1ls8zjlv2t0prtqvuy4pkasq8a6axrjythsu3nvsne5uzmkk82clqh28yvt\", 422], [\"mmx15v9jzpzxjwdtn8ggkzu7s5suv7kqhuw9yer4w7ngvenlgg660vlq8zgk88\", 12], [\"mmx1anyf8dhv7shc957xt95ujj6ltk2hmmwhl7hvftw67ph3uf7w4ulqpdvg9l\", 291], [\"mmx189rrmskkykntwceazrltap8a2at40wdhv4wvjtqc2xk8d85ttdqsu5l54m\", 511], [\"mmx1ks9t2rksthddy00395l48vaqc9rmjuznw0gyuta0jxpkzsce44qs3at8x4\", 650], [\"mmx1ujghjem0z63dnwrwa8tnswgn8uf2nn8gx26seg4te50wpfjw94pqjhktte\", 6288], [\"mmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3\", 3208], [\"mmx1ctxq3czng6y2ms40mf6pnq699p7skzsncq5qerceja4k20ve24pscadkxx\", 3], [\"mmx1gmvuqg5x4tn9fj53vsgahgwqa9h4jx0cz4x7xpet67kxu8n33fpseycg9t\", 344], [\"mmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn\", 10488], [\"mmx1grhexfxkzq9js7t6595mzcnpady60mjuph254rtef25j8x074pzs6s249e\", 8950], [\"mmx1x758q5t2jafk32raj98u003duqlte37xzzzanwl7tef7gt4234rszr4l02\", 7], [\"mmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0\", 5727], [\"mmx1ayukxr9jcev25gddx8yfpv27hauw0z3xy9z2jwzdqk8n624seayqkjhm9d\", 5], [\"mmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c\", 308], [\"mmx10p75878akjmna30s8kjwnaveql56v2a45tw20fw86ruhvc8x5pxqrqemq9\", 1347], [\"mmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj\", 1946], [\"mmx1yxqjvl97jnhxwlvqzh8n53g67vc3l2u7m78aks5y9rym5utj948q3dgmma\", 5], [\"mmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy\", 7811], [\"mmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr\", 4140], [\"mmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6\", 5206], [\"mmx12j3mpzmlpx9d77ux2990xwdhus99626yj3s75kyaxt4r80n3638s237x44\", 91], [\"mmx1twps3qw5uvrx8fxmha33guk7p60esjyaa3yn96ju6drhn2hpeagshruvwk\", 1150], [\"mmx10ah956exf9phe4hw9xwkn3a7m3fwxa7pmhr9cyvlq5p84f8yy4fqwkygu8\", 2882], [\"mmx1l3g7hjrczlhsvnshj4jtccavmrrm9chue6ha29hmdua6392mtffq2ddd66\", 62962], [\"mmx14dze6kxepm2ensphv2z0ejl4kc4hks7gwajnjr9nfpw6glnqc4fqz53s5m\", 2693], [\"mmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp\", 3170], [\"mmx16qj5ep69xew0qfqms0hw6eh6et3jzjx46wm0xteslv5ufs02nd2qtp4rte\", 1], [\"mmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5\", 5733], [\"mmx10jqs45t5ujdwtqyft07f4mxk7y08fac4ks0z6ee50n6fkq67992s09ezzz\", 758], [\"mmx1pmecze7k5a4ld66auxywxljxnsad9ducwgzmy4q4k3d6ma6gr3tqtkfrnp\", 2036], [\"mmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn\", 6158], [\"mmx15hfmkxyxttvpt36w04e0h3sdgr5r25869jpxehj4h6mrt66kppvqp9npnm\", 765], [\"mmx17gfe96qhqt3ylhxxqj7x6qxjzvt8cen7s4ks6e0mt642dplug4vq652g57\", 2114], [\"mmx1aa7hmgy7dhsmkhsscp8vlk4y48jyntq0zndsd4lvn4ht0nrjk3vqrtn5mx\", 2345], [\"mmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9\", 396], [\"mmx1pv4hhmymzfvyn4my5vpptp9rdqx9ex6y60y63tgaxre05f3v99vsq7uvz9\", 9482], [\"mmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0\", 348], [\"mmx1ff5rqk4myqr32axrt500v0rh0cjp66uh5y0q7r4ed9xy63c954dq3ea3rv\", 58070], [\"mmx1d39vgf387ct682mq7ua9vlxpjs8w47ennw69wp05atf65stht9wq5hkxpd\", 934], [\"mmx10w2sp9rp2s4s6uj32fu68gdqcjvdc9e6h3jm2qmne02400ul5pws4a4r5v\", 54], [\"mmx143jvevjx827ac7xrc7zx59a3hwd8nvu52khqa4365dk8ct3zff0q2ee25l\", 5512], [\"mmx1jj4r3za249xxcyp30jjyen8nz6kmtldqpypwuqhukzrp6trme30qsvdfxk\", 666], [\"mmx14p5y3gn5fl8t5jt0twe0l68jwe9n895djrg8lkk55t5rdupggf0s8l0kd9\", 294], [\"mmx12q3pverdv5c465fjeryz5uxnvcjpacnfanynclgq8g5fwj77y9ss2r84v0\", 2775], [\"mmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym\", 1730], [\"mmx1jwjpe8w9cpamhscl0svn3c3xy47cz50qsn38gu3mxed29gq96assmzaq9p\", 4], [\"mmx1ff4lyf7ulfrwt0wfnr6dtpuk6tv0w522ef3pkm5ax8e9wv8crd3qe0a7re\", 12141], [\"mmx1ms72mlttvspj4ga668t5xr7k8m98eedvvdwdkmwjfua2ttdmj33qvqyp7s\", 807], [\"mmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t\", 3920], [\"mmx1p76tw7re288zm3avlruq0v2h38feqe2usscg6cdcfwn3f8cs5ejsjkev6x\", 5019], [\"mmx1rgf2v34pnkjtzg09snd40cd5262dp2hde4k3tkhcjyxdfh7mf4nqx0cf3k\", 1823], [\"mmx146y8qu72rkcw0xrs8vf8y7j423t42rtyynze5d3kw6e79vdsdenqj3esfl\", 49], [\"mmx1mg56jxv3e0plu76824vw3w72kqumgyp2hetfg5s227lr96vjzd5qr4gxnj\", 310], [\"mmx1f4k5ajf9dv0jfuw28xh9vzhmvuphv92dd8mfxxdzssverwfe9p5qdwgc8k\", 2779], [\"mmx193v808tk0f54j0cgxeqpnhywyyp3l3e847wlgl588murpgs43a5q65as7s\", 1], [\"mmx1efmq0tdmmpv7k7dzd8nn5ta045f9fdylk9pa848hzshh82zlxf5sganjdn\", 735], [\"mmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3\", 752], [\"mmx12amu3muxtrrr54qkd6wr7xtawh2lare2aqptywufhl24rex2u94qzl4tgl\", 2076], [\"mmx1na96yskrphrrswsg8rwe0e0gwpy4n360t37u6guxwa42a26wqa4sqpfm9s\", 5471], [\"mmx1qvemldmglge8tr2dcwnr4gqam6vkal5dkc2jwsz2jyyy8rhry4hs58hvrc\", 509], [\"mmx1cvga7mz30hh2dnutxpaupdfr4kflug45g695vke7jmnl2kj6jfhs70rvcr\", 8805], [\"mmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60\", 2561], [\"mmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj\", 1965], [\"mmx1qg6du0mef5nz96gz7wa6f0ndmdhqnen0knwz3kw5ytf4kl9f89eq2kmrsw\", 1431], [\"mmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5\", 5317], [\"mmx1pstmxwmdgkyzqqll6sdu5vdxpkm82ya4tz78w8n2yq4pdcdz39eq3uwvw5\", 18014], [\"mmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu\", 869], [\"mmx1qwcxn8k9nxdu43ytsw0ew7wk7mmptr3ykvtenms3fsyqexg9p36sp9slcv\", 307], [\"mmx1rsjam2cenutaew3r3ssfc8zfh2uy2y3ycawafk0y4hq49djayemqnelh4z\", 673], [\"mmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g\", 955], [\"mmx1036ucmxlqgrwmcuuheau33k0h93u0wurkxznvsl7zqgej2x2rauqaktwxw\", 5344], [\"mmx1xv2dztq36sk27x79gdja33zk6lv8cytmjeqkvlux788rd55l6fuq09zq65\", 3058], [\"mmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v\", 23953], [\"mmx1xcalpv2gy0k955p6pl97ayzrycmvrplu9cufx6dfctwrwd9uvpaqypgjxf\", 11177], [\"mmx1z3qzxxkh09r73p9sh872xz7fqjahm048v0e80sypz5gd00u2f47qgf20p2\", 27], [\"mmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq\", 860], [\"mmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc\", 8255], [\"mmx1pnpxvslglu4u7qnv3cwz4x8vzcc5y9nnlhkczkuzyv7995dz96qqrvwdrl\", 463], [\"mmx1an3w925endfhcg50qelq69ahwvltupq4rt7wvnhfqd8leg2526qsgh2ret\", 405], [\"mmx1nwfsx2prjuvsq2q3pn2ygjntgu5rgnarpwrqq2l5adfm3wdmwwqste58cg\", 5], [\"mmx19zld6lprrjhzzhltmjskuv7dxcqnewx9sjll8ccdm538wx40ajpq2f8m0k\", 1], [\"mmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3\", 1880], [\"mmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv\", 2836], [\"mmx1kjc5re76v4htwy0393zxnut5jcutlewywd5udfgh6l4xh5ya3xps8sv4g3\", 3588], [\"mmx13xu3ay8eujt4neuwyhxw002r6qlj0v5p8ldj6jus03ev0w5u7wpsxdd3v9\", 116], [\"mmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry\", 3801], [\"mmx1jmhmzwudwu3tlhq048k7nuc0l8lqgs9amtnrg5pc75j6kl6rczzsuqxsnj\", 3138], [\"mmx1fudwe8xuzgwraw6fe6rylklv69x93kqyrgu82jf3tjstsgkm8xrqtc850j\", 2367], [\"mmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s\", 550], [\"mmx1m0qtqx7tvpw6rjhsmjnpr8dxgz8wyx3hypcg4qw5trnk34urxwyqxeym6v\", 157], [\"mmx1x40j0p3ss44jghrx2t0yqr9gqcr36xx9pjss4vvxwj60gkfvg2yqauewfw\", 2567], [\"mmx1g9fl4jus2fumcnkw0k8w9df5cln8yukhrk3kzwuzk5rg68ndmjyqftzc4p\", 3418], [\"mmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr\", 1414], [\"mmx17grsj5sq8z9h02gnl92mpkajy6janxcnrcrg6mm3w5l232tx8j9sufzatk\", 12433], [\"mmx1tsl59gk2ahk0tkrcwnhnjh2kcnfnhyljt3n76h0cu00ael973k9s9dj2aa\", 676], [\"mmx1jpfmyh0ndxwz47t3d6xrdlkd0mq3nckuasn8elvjfa65xtzm2j8qamxfuw\", 8], [\"mmx19tp63ptrre654er8rkx5ntgt4z048tutqx4yplu7daxwm2tgk2gq8hp85z\", 4166], [\"mmx1wy0dhr03nf78m4gufm7jcnzfvaqq244ckzmup5s2054apysy6jgq4pp76h\", 48], [\"mmx1a0lmcmccnm3ak5n82mutjxyz9pj5radgw92qzudnp4eucts6awgqym92mg\", 966], [\"mmx1eavt4k3qfgc30z5wqtk99f93fq8xhtr82f47v6r9xd266njaqwgs56207d\", 32899], [\"mmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap\", 11489], [\"mmx1wnkyn2ma6l2nnk80y44nrsqf9fdh27gtx60v3sdxvd9uzheruwfs5kf23g\", 3219], [\"mmx1rp6q7eh4zye6494jpq9j6ft69ku2lqqlx363d4z7zspv7wqfqk2skevrl2\", 9402], [\"mmx1u75x5wkrse550ag4nwnesaaqhvr3js7vtqh9r3vt0etcxzqu8z2s7u0d6h\", 190], [\"mmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn\", 8672], [\"mmx16cnha02fp053dvmxltjgluwjw0fdedpmxj5x72z053pwt86fgjtq7er08p\", 129], [\"mmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05\", 1907], [\"mmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg\", 6415], [\"mmx1umu7rghe9664www8lutl5fa03zv9c2gjwvv4ja9w7540zvnuuxvsyyf63z\", 3226], [\"mmx1wcmc5n7v8eujvlzrtuga6fcfmk4d9yjcdhs0fmgenyrt6ycynjdqa6hh0w\", 18957], [\"mmx1dun6jkgf7cscymt6udr8nlm66gjewqyylyzvnswaaq5exzfw4kdqk6nk0p\", 50], [\"mmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch\", 439], [\"mmx1qc75vu9xfagl297yupuwl3jgqsecwlae3szn9lwpg9m5p0zcnzwqe4adsz\", 933], [\"mmx1js6nrvnl94rcgn8k80dx6uz2da2jj64utkrxqhmvcvuescmrpwwsvh2vna\", 4686], [\"mmx1wtt47s3lhpsu4nxfyvzl58jpslpnuvv9ymd0gthaxpern3yer20qjykd8r\", 156], [\"mmx18ee0whkd2pk6xymy9sz7a9y6mmcujphzqcyl659fxz2cdr5ln20qkd3wav\", 2], [\"mmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s\", 2887], [\"mmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn\", 1241], [\"mmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp\", 1828], [\"mmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map\", 3753], [\"mmx1mzq54zkhcrww85glxx6kaqeeeeqckrwy0j9d377epmh7vrrssxsq8fel5y\", 3438], [\"mmx1jycy47p4up4n073nxn85tkem6qmtwpqjjm3k5d3nu4v22w9h6jsqen8hfx\", 1033], [\"mmx1lty50fwzq0wxaxwzxgjzt7y3r3mhn08eccs5ntz3y4sahd5jfxssnz6qzz\", 13699], [\"mmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp\", 654], [\"mmx16qstch29gdwqtfadwwta8fd20zrhqy7pgkaud2h3ceeafwjcmz3q2ezr8g\", 792], [\"mmx188uhxreda27mxl6lth04vl5y2da7qkldg72gvalsth7dkwxeh23sm9juwr\", 1285], [\"mmx13ech6m45gf3ludnt3e3az7jf68qntxg2htk492zuewh40q3yqwjqv6jsej\", 1180], [\"mmx1q8d78sjm37uz4pps54q0mn4w3yjesr9jg2pprgww6mmput9rg2jqudrwzl\", 636], [\"mmx1gxx98xmhrcdv4ez5fxekmnczvwuqns3geh3wcj9l463d5jgqcwjqv35gpt\", 934], [\"mmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm\", 1106], [\"mmx15qatp4v00zymeq92dmz2sfee0twh36n7vutwp4kcjhdktye8zkjsqftneu\", 3391], [\"mmx15aarz3lnq8da6s86l8kuwwzy0gfw3tdqqu9xhq00lardxl4jv7jsa294sn\", 1], [\"mmx1lc66qe65pw30cpt5nvjt2apsmtcut80jdv8xgx3wq6d4evu65wjstsftsf\", 1674], [\"mmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80\", 307], [\"mmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t\", 764], [\"mmx1mjax0p84wdxsfdffhm5tu5fg3alt3zvam683qk0zu4jh6jredj4qqz6kk0\", 5342], [\"mmx16y2cjvyxtwgkm5m0x2wy40g2lc59qcept4dqjakfygwghhxnsx4q5cg5xl\", 5106], [\"mmx1s4zvd257h9xqntzj7kd08wnktrzuk7xlya9ttlv2dmkxk79ykz4qzvmjvt\", 1744], [\"mmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3\", 3247], [\"mmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf\", 840], [\"mmx123qaxyt562xlfdxn7fg52nxx9aq6gp8q3jn6kya98xmn7n0z62kq09hk9k\", 939], [\"mmx1fgylxyf2ef9p5zj0d6hnz6wr7wmkgukq6zt398uk3j78nhxfu2kq05qm4a\", 76], [\"mmx1x4nlvf00jq5cld2tamnnssnshzd2v9gvtp2yjun60qgh2zj98kksyxgrh5\", 208], [\"mmx1tyrnks330n6exxr84vz7d0mjsmpey8p34kuzy07g4nrc7txl87ks63zmhn\", 1096], [\"mmx1j5qsf0gulds6ll7mm8aygj9xu52qhcaamadzak5k4c3smx9lajksjyvyzx\", 5470], [\"mmx1fqfjglclexnmhlmr5lvwhqm9x6dqvm8cnsr4dpn4ysl5uzfcdwhss0xtp4\", 20026], [\"mmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w\", 210], [\"mmx1kft6gj0a0upukl0dy3qlakx0pm4de4538v92l6saa79jsqkswzcqhjtu6e\", 3433], [\"mmx1apz53l6jeqzdtwxry627f2rpagmjwsj42d93ca8jtwcdtht037cq9fsqhm\", 9648], [\"mmx1k4rx2e7w5rl8jzs96hwj0hussljxc7tccyqng80r845uf4da9wcsat3pug\", 161], [\"mmx1krwuwd0xfqxq59rhnglkkduxw8wzq39axh99vtqsy0k6tnac0zcsw7fhj4\", 20], [\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\", 1124], [\"mmx1eaxnhktjt4yegapquud644nfkryfyarth7lwdxwdedg8xhhdlxescdxp0q\", 34854], [\"mmx1ksduhw2jnwayh3a62cnhmxf7vax5lult55kj09ejvqgrr7gy726qkp57w7\", 25], [\"mmx155480tuk2thf5sqkkgft54hmuafu0mj48gql8fdxdvl08guut6mqvy5sc7\", 47362], [\"mmx1h9ahw37ekqwx5sewaszmj54cn0l0pmzrksss7z0320ntkt63q6mssrfkkd\", 306], [\"mmx1e98kn0hsxlvmn67g9rwq4jsmgfvrmhm55yj2dh6rk0ttrf960zuqrc6e5z\", 2], [\"mmx1hgvgalxcwyssgs5gqsttsfvmt2297u2hw4t7cglllnvswkhg6xuq285wez\", 1151], [\"mmx1skt9meytux778svqe3d6fyvl7mjfrm99nlgyfwenclgr09ftm7uqc3cqxq\", 1], [\"mmx1d8mj6q8tj54rejhx37skuzn88tld7emw3wra9agvjx9glraa8xaskpa5fg\", 71], [\"mmx1rk9f4slwuur34lnw6phl9nw2465a6pfjj76p0p8zx8erzhsw0jas7pjyqj\", 4], [\"mmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4\", 265], [\"mmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw\", 3828], [\"mmx14ljuxjzlu24djfrm2varlgvfup2q0keydus50mrv6qy2qpuxu2lsmm8gza\", 111], [\"mmx1e83q59e5gy528v9j68ewnhpgkwkdpt47y03ev9a3y5ma5plsyrqqru2dw4\", 6407], [\"mmx1aeaukjyxfu6gk38swf6s29jrswc67nkra3n3wy5wsxt2fqmvknqq44kzkn\", 4840], [\"mmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu\", 3011], [\"mmx1qfvy0zcwu0smhdtkkkygyyasjf2eplaurzkq2m2l4ngrnxgy0rpqq8swwy\", 3086], [\"mmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99\", 1332], [\"mmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0\", 2], [\"mmx1tluhal45404w3qcd59uw08lwf28vq3hhmvvd9andxhjgumajl8rqk3jjd9\", 4728], [\"mmx1e2md0mf5cu5uxmme0hxt4apxg9nd7elstzcr7v393nxmgm0rvryqlr557x\", 4131], [\"mmx1qq2w4yktpymxyhxck2s0z0grp8tlh2l5evsceycvx9af0x3xxhysd536em\", 4601], [\"mmx1njy6t7vkta3veyjj4atvr6ppmeeru85tgh5qvhvnmleslru54m9sqp3l60\", 195], [\"mmx1jqya2nk5kzref5tpqfz7ze2yd4mcdh5ax6szxjtk9sk5wza7hr9shjjsg3\", 4], [\"mmx1geumptg36crcywp4tzfqeameymf7x9a43qqde9mrpaqxqjernlxqytcsus\", 1032], [\"mmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27\", 2829], [\"mmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku\", 669], [\"mmx1v5rqrf5ctkh0uj2xttjxcrkwaecztmcnaqj9zralud0rt70g8r8s5xmgv7\", 83], [\"mmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92\", 37175], [\"mmx1998n5nlledt8puwx80neyvle5xkayw0uvgdhuwup6gtpzd6ym0gqp5qzy4\", 723], [\"mmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6\", 15493], [\"mmx1ygz7gwf3at3409ggncyfpsyp6cn0ralc4dhezcnkzsxly07x0tgs759304\", 6091], [\"mmx1lc7g4gueljhtkf7ffd3l0x747d8j9gk0z88e58zd9l6f7vh73mgsuzjvx3\", 3578], [\"mmx1n5w0atjthl70cnj3zll4ku3jl2w7cut8peqdkt04ck9annew2mfss5uu88\", 375], [\"mmx10vl3ux6k9680dmv3fv6e2c3d2yamrlveshxfvnemlv2tlhxan8fsw5vq30\", 4069], [\"mmx10ewttsgpc2vq980wlk0ddtc505vp5edvusl8a388y76peautetfsyj3ej7\", 166], [\"mmx1ymnr2tt7vzcklrk97n2phwz96t2t2au64mjqw58efz2aatkex02qryjcxm\", 56645], [\"mmx1z5zgrrc2l37fg4cu6e7s80qyxm72fcw7xhfeep2caahptq7mdr2qzcl2xj\", 212], [\"mmx1mlj7rhkg5c4gp3w4k8dlck5tyf5493dce5vx3x4m4qpzn7ty8mtq6ek2jc\", 29768], [\"mmx1vcp6ksuysun2pdtkrukz6lh2dd7g0d2lpyjk2m3ffylq0yhn4ntq9fpmkm\", 1991], [\"mmx1ckrmrs93ya5xud2lskwvn3z8t285awqcl4vx5v6zgyphat5eultqs6ds4l\", 674], [\"mmx1td9zpd4vwncrlgy8kkgft4vkck4yep5nagxr60anls4vrlvs88ts964kg5\", 1653], [\"mmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz\", 63053], [\"mmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9\", 99], [\"mmx1ausld08qthhjwmpxvxuy257ddrnvwq0u0q2qdgzwk6x95lwvp8wqun9tn7\", 1923], [\"mmx198yry5ttr65tnmftf4ppzjwvxhqngyncxy3sq5ucz8edmsg5umwqs4u2zs\", 1757], [\"mmx1fv4dvhre9mmtldnr2t63qg5hdxa02hzjeh5hu7a3zkmf8a3ql8wqv4txd0\", 318], [\"mmx1d3vplkcw0pjqrpfr3cesjmvslk30p8qxhky5l4gdslclu70tql0qdqp9dn\", 3518], [\"mmx10g3yj722j7psxapmpcusn3atzd2fd5r8pq5s9wmdszxweefexm0qzyjazd\", 6959], [\"mmx1u3u8jn5824ema7zszlz8wuww49dz8vf08jd7vux952saltvx0l0syu2qzr\", 105], [\"mmx1gssr7n6rfcffcu6g830sa2gusv89m7mp03sd86fula6gk4th380spllur9\", 1], [\"mmx1h6lg70tzjmvsucw3c7mmdf98p553aj0hfd6sl7nekq4yucf4xnssd7hudq\", 513], [\"mmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt\", 2091], [\"mmx15m60pxy8mjp03mmtf9aq8kajmrt8vrzltj8epytnsucts50fh03qhw98ql\", 455], [\"mmx1pjmyc2sn87gs6xuzaq9thr9y4msqtcgd379cecgywn2684fhcr3q54zr6y\", 2809], [\"mmx17kwmmmdvgdmay78tzmr4m488xvax8ft5g98xpx93qg94pu0gtrjqxym59f\", 75], [\"mmx1usygfr5xcuszd23r5cn627etytpyz8gqk7klyzkllwkwzhal5mjqjtjl3t\", 27], [\"mmx14emrk4d8vzp3c2yztqrzhnmy8r9tsnywrpmfrl838q50j0xjenjqay73ld\", 37], [\"mmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s\", 1078], [\"mmx1ywsu86chqesuxt45aktpkg78v7we86l0zf8xa3rcer6gn6xw8lnqnwk5tr\", 845], [\"mmx187hkj0kvu3rjq4tj22xqlc8qkwp8n48xe9yh4xw0nzjj8cut3mnqy28fjq\", 10], [\"mmx1re75j8gejzdje5afrkdsl9xknheax4ymznewazk5jqy4msarp05qz7qqsp\", 13450], [\"mmx1cthy5xra5u9kwcdgp3z0x55grrj4xv585g69qath07dqrejrct5qk9xrck\", 2161], [\"mmx15drd8dvlexsa460klqa0dqlluy0pya79z7lnkvj08zgzuncnzt5shqewhm\", 125], [\"mmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl\", 19993], [\"mmx1ug0nljja9d525wv5n8z79vgdjh9vxpf5hf57r2gyu73cm86pcn4s7v3ccg\", 1976], [\"mmx1ksu3c85u4gd20v5dy5nkjk30fa7endp9mc2za37gr6tuak0y604susek8w\", 2], [\"mmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a\", 12942], [\"mmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\", 15209], [\"mmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05\", 1763], [\"mmx1aawhv22wdnreucw8dk9au0qj93wnf04gvs20hgldlapsj24ny8hs0qtjgq\", 27], [\"mmx1e3rafs5jhzf03a8wxwp43kcguxr98eq3azy5lvatwayvezqfyrcqeumth7\", 178], [\"mmx1rh2lur825y90gqc5pxmejgk5d8wl934h0v8lv972rnevrfhpsmcqsqywld\", 200], [\"mmx1advv0qlzm5l7whwluwdfspmqzwd2k3ra8rgqqvuj0m5hzy5taneqqy7hww\", 3013], [\"mmx1avcekqg5tnavcwyw7qs97809yzh0nzq5l9ltyjljelygwxtp40esgyw665\", 2402], [\"mmx1g67zee4q9x4wp2s4lkfde4v2m05e90jgn0m42uxw35r22emk3r6qa8ttan\", 1193], [\"mmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t\", 3009], [\"mmx1c0lcld738xys6rmr0wfyrtgpcvcm8szcst7w9c6cawgmpme6nh6sgtq35u\", 8145], [\"mmx1r0e4s9r8jqvuvznv3vd5k4pfa5ahzgyn6lrgchwu4mpqlzgsx8mselfar7\", 1142], [\"mmx1u9lr65e2v62cht733pjlz5dctk7esxmwaxwjew2xytr7gqgmtnuq3x22cc\", 1867], [\"mmx18asaxgn4dcswsefcdwx54kldattux7l0yn96fvmndrpqn6adsluq3ffr8x\", 69], [\"mmx1sk6k9sdj836ynxntk2nt60funlz0t9ptqttrqvg46vcv5mdkwhaqgrgnnt\", 1], [\"mmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q\", 205], [\"mmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f\", 536], [\"mmx1rfkx4gam8z02m09k5am29u2nyn62wlc22f0fapkqra6ckxspnn7qa0d336\", 18], [\"mmx1nwdefg4c7dq34hhvykfzl2um6d6phkfqh22pg5d2q8nderf78n7suz5x6m\", 3941], [\"mmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t\", 6000], [\"mmx1zw68exayxayyakvgpnrf4ptfkkkcth2lvlu20le3e0ghrpae4hlq4sqfa9\", 1], [\"mmx16kkntt0k2spk2xvxlswtwf40p02vlj97cenyvzca58ad8uav68lqfkkh9w\", 29313]]\n"
  },
  {
    "path": "data/testnet12/rewards.txt",
    "content": "mmx1t49g9vz555dcm6dvrxt9hxua58jf57w5rmnjnaynnclww8lmagdqc76mnv\t184022\t92011\nmmx12wn9qtfzagz6z6ztxld2hka8cgvwr0nz55l3qjvkg0ayhhjvlscst4phad\t76155\t38077.5\nmmx12kjff7s048w38dpcmhelf3f2vt3ul77hrdze97fxr9mhgrw2lvmqnandaf\t66200\t33100\nmmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz\t63053\t31526.5\nmmx1l3g7hjrczlhsvnshj4jtccavmrrm9chue6ha29hmdua6392mtffq2ddd66\t62962\t31481\nmmx1ff5rqk4myqr32axrt500v0rh0cjp66uh5y0q7r4ed9xy63c954dq3ea3rv\t58070\t29035\nmmx1ymnr2tt7vzcklrk97n2phwz96t2t2au64mjqw58efz2aatkex02qryjcxm\t56645\t28322.5\nmmx155480tuk2thf5sqkkgft54hmuafu0mj48gql8fdxdvl08guut6mqvy5sc7\t47362\t23681\nmmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92\t37175\t18587.5\nmmx1eaxnhktjt4yegapquud644nfkryfyarth7lwdxwdedg8xhhdlxescdxp0q\t34854\t17427\nmmx1eavt4k3qfgc30z5wqtk99f93fq8xhtr82f47v6r9xd266njaqwgs56207d\t32899\t16449.5\nmmx1mlj7rhkg5c4gp3w4k8dlck5tyf5493dce5vx3x4m4qpzn7ty8mtq6ek2jc\t29768\t14884\nmmx16kkntt0k2spk2xvxlswtwf40p02vlj97cenyvzca58ad8uav68lqfkkh9w\t29313\t14656.5\nmmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v\t23953\t11976.5\nmmx1fqfjglclexnmhlmr5lvwhqm9x6dqvm8cnsr4dpn4ysl5uzfcdwhss0xtp4\t20026\t10013\nmmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl\t19993\t9996.5\nmmx1wcmc5n7v8eujvlzrtuga6fcfmk4d9yjcdhs0fmgenyrt6ycynjdqa6hh0w\t18957\t9478.5\nmmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm\t18640\t9320\nmmx1pstmxwmdgkyzqqll6sdu5vdxpkm82ya4tz78w8n2yq4pdcdz39eq3uwvw5\t18014\t9007\nmmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq\t17931\t8965.5\nmmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6\t15493\t7746.5\nmmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\t15209\t7604.5\nmmx1lty50fwzq0wxaxwzxgjzt7y3r3mhn08eccs5ntz3y4sahd5jfxssnz6qzz\t13699\t6849.5\nmmx1re75j8gejzdje5afrkdsl9xknheax4ymznewazk5jqy4msarp05qz7qqsp\t13450\t6725\nmmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a\t12942\t6471\nmmx1kkq8ezuwsast9zplk8ec0pa0me6u3wydkrg5jn5daycgppy63y7s9y0up7\t12822\t6411\nmmx1yc5f9qcevne2cnp86szf4nnpaxj5kns2nzsx8jgg3ssal39k0cqsrsaepl\t12660\t6330\nmmx17grsj5sq8z9h02gnl92mpkajy6janxcnrcrg6mm3w5l232tx8j9sufzatk\t12433\t6216.5\nmmx1ff4lyf7ulfrwt0wfnr6dtpuk6tv0w522ef3pkm5ax8e9wv8crd3qe0a7re\t12141\t6070.5\nmmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap\t11489\t5744.5\nmmx1xcalpv2gy0k955p6pl97ayzrycmvrplu9cufx6dfctwrwd9uvpaqypgjxf\t11177\t5588.5\nmmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl\t10588\t5294\nmmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn\t10488\t5244\nmmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9\t10249\t5124.5\nmmx1apz53l6jeqzdtwxry627f2rpagmjwsj42d93ca8jtwcdtht037cq9fsqhm\t9648\t4824\nmmx1pv4hhmymzfvyn4my5vpptp9rdqx9ex6y60y63tgaxre05f3v99vsq7uvz9\t9482\t4741\nmmx17gtsl3areyr6g7xscq67jl2xcnz56ekkk9stxvx3qev7hhez3ccs3juqvl\t9474\t4737\nmmx1rp6q7eh4zye6494jpq9j6ft69ku2lqqlx363d4z7zspv7wqfqk2skevrl2\t9402\t4701\nmmx1fheacy3c48nkd0vgukeuqtldfzuxh2qhudhytshgctqe7sek25jqv99qqt\t9221\t4610.5\nmmx1grhexfxkzq9js7t6595mzcnpady60mjuph254rtef25j8x074pzs6s249e\t8950\t4475\nmmx1lghunzj070ysr4hd2alsujacc26t99zl3cv5qm03ttjaq4ugmvaqqfy920\t8867\t4433.5\nmmx1cvga7mz30hh2dnutxpaupdfr4kflug45g695vke7jmnl2kj6jfhs70rvcr\t8805\t4402.5\nmmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn\t8672\t4336\nmmx1ju6l29nxdkdapu9cqk8jf0nhvqc2qjzkecft4ysdtdd030ma8spqh0k5wh\t8266\t4133\nmmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc\t8255\t4127.5\nmmx1c0lcld738xys6rmr0wfyrtgpcvcm8szcst7w9c6cawgmpme6nh6sgtq35u\t8145\t4072.5\nmmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy\t7811\t3905.5\nmmx1w7jnglje4j85z4dv4z6gpmwagqfcgpg7nq7dh6wu98qq7ckd7umsdq9hn8\t7627\t3813.5\nmmx10nfcaxrj93rjxxx3us3mwzajznj8qpcd5vg459yfkk8lg90jqq9qxry935\t7249\t3624.5\nmmx10g3yj722j7psxapmpcusn3atzd2fd5r8pq5s9wmdszxweefexm0qzyjazd\t6959\t3479.5\nmmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg\t6415\t3207.5\nmmx1e83q59e5gy528v9j68ewnhpgkwkdpt47y03ev9a3y5ma5plsyrqqru2dw4\t6407\t3203.5\nmmx1ujghjem0z63dnwrwa8tnswgn8uf2nn8gx26seg4te50wpfjw94pqjhktte\t6288\t3144\nmmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn\t6158\t3079\nmmx1ygz7gwf3at3409ggncyfpsyp6cn0ralc4dhezcnkzsxly07x0tgs759304\t6091\t3045.5\nmmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t\t6000\t3000\nmmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru\t5942\t2971\nmmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx\t5937\t2968.5\nmmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj\t5927\t2963.5\nmmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5\t5733\t2866.5\nmmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0\t5727\t2863.5\nmmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn\t5549\t2774.5\nmmx143jvevjx827ac7xrc7zx59a3hwd8nvu52khqa4365dk8ct3zff0q2ee25l\t5512\t2756\nmmx1na96yskrphrrswsg8rwe0e0gwpy4n360t37u6guxwa42a26wqa4sqpfm9s\t5471\t2735.5\nmmx1j5qsf0gulds6ll7mm8aygj9xu52qhcaamadzak5k4c3smx9lajksjyvyzx\t5470\t2735\nmmx1036ucmxlqgrwmcuuheau33k0h93u0wurkxznvsl7zqgej2x2rauqaktwxw\t5344\t2672\nmmx1mjax0p84wdxsfdffhm5tu5fg3alt3zvam683qk0zu4jh6jredj4qqz6kk0\t5342\t2671\nmmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq\t5328\t2664\nmmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5\t5317\t2658.5\nmmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6\t5206\t2603\nmmx16y2cjvyxtwgkm5m0x2wy40g2lc59qcept4dqjakfygwghhxnsx4q5cg5xl\t5106\t2553\nmmx1p76tw7re288zm3avlruq0v2h38feqe2usscg6cdcfwn3f8cs5ejsjkev6x\t5019\t2509.5\nmmx1kl3y0kz6jx5w0vxrcx9afkzthe88syuge0ytumakkce4nu969uhqdtj9hu\t4987\t2493.5\nmmx1aeaukjyxfu6gk38swf6s29jrswc67nkra3n3wy5wsxt2fqmvknqq44kzkn\t4840\t2420\nmmx1tluhal45404w3qcd59uw08lwf28vq3hhmvvd9andxhjgumajl8rqk3jjd9\t4728\t2364\nmmx1js6nrvnl94rcgn8k80dx6uz2da2jj64utkrxqhmvcvuescmrpwwsvh2vna\t4686\t2343\nmmx1qq2w4yktpymxyhxck2s0z0grp8tlh2l5evsceycvx9af0x3xxhysd536em\t4601\t2300.5\nmmx19tp63ptrre654er8rkx5ntgt4z048tutqx4yplu7daxwm2tgk2gq8hp85z\t4166\t2083\nmmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr\t4140\t2070\nmmx1e2md0mf5cu5uxmme0hxt4apxg9nd7elstzcr7v393nxmgm0rvryqlr557x\t4131\t2065.5\nmmx1l0hpmq7hfw4l5y6hfrer0xc980a3mhazzyc82eycvjaugj2d6sgqn349gp\t4126\t2063\nmmx10vl3ux6k9680dmv3fv6e2c3d2yamrlveshxfvnemlv2tlhxan8fsw5vq30\t4069\t2034.5\nmmx1nwdefg4c7dq34hhvykfzl2um6d6phkfqh22pg5d2q8nderf78n7suz5x6m\t3941\t1970.5\nmmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t\t3920\t1960\nmmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw\t3828\t1914\nmmx139dxs6z0y9pgp2z4f9lhx8mczfhl6fenrlcpwefv8t7eklktwqzscw26ns\t3804\t1902\nmmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry\t3801\t1900.5\nmmx16h8zlf572dedtskx0krrajcrt6d86s0kgukd4rnm7ae9v8tmnvmqhqmdca\t3765\t1882.5\nmmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map\t3753\t1876.5\nmmx1kjc5re76v4htwy0393zxnut5jcutlewywd5udfgh6l4xh5ya3xps8sv4g3\t3588\t1794\nmmx1lc7g4gueljhtkf7ffd3l0x747d8j9gk0z88e58zd9l6f7vh73mgsuzjvx3\t3578\t1789\nmmx1d3vplkcw0pjqrpfr3cesjmvslk30p8qxhky5l4gdslclu70tql0qdqp9dn\t3518\t1759\nmmx1mzq54zkhcrww85glxx6kaqeeeeqckrwy0j9d377epmh7vrrssxsq8fel5y\t3438\t1719\nmmx1kft6gj0a0upukl0dy3qlakx0pm4de4538v92l6saa79jsqkswzcqhjtu6e\t3433\t1716.5\nmmx1g9fl4jus2fumcnkw0k8w9df5cln8yukhrk3kzwuzk5rg68ndmjyqftzc4p\t3418\t1709\nmmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf\t3417\t1708.5\nmmx15qatp4v00zymeq92dmz2sfee0twh36n7vutwp4kcjhdktye8zkjsqftneu\t3391\t1695.5\nmmx18d8335fhancnvy2zs5wsq8gvcp0l57n3pejex92ndg6s6s3casaqalq6hf\t3363\t1681.5\nmmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3\t3247\t1623.5\nmmx1umu7rghe9664www8lutl5fa03zv9c2gjwvv4ja9w7540zvnuuxvsyyf63z\t3226\t1613\nmmx1wnkyn2ma6l2nnk80y44nrsqf9fdh27gtx60v3sdxvd9uzheruwfs5kf23g\t3219\t1609.5\nmmx19taynglsa6ewczfug4pds0qy0cwstd600hwzel8y02dtn2k2esyshsxfa9\t3209\t1604.5\nmmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3\t3208\t1604\nmmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp\t3170\t1585\nmmx1jmhmzwudwu3tlhq048k7nuc0l8lqgs9amtnrg5pc75j6kl6rczzsuqxsnj\t3138\t1569\nmmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n\t3101\t1550.5\nmmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l\t3092\t1546\nmmx1qfvy0zcwu0smhdtkkkygyyasjf2eplaurzkq2m2l4ngrnxgy0rpqq8swwy\t3086\t1543\nmmx1xv2dztq36sk27x79gdja33zk6lv8cytmjeqkvlux788rd55l6fuq09zq65\t3058\t1529\nmmx1advv0qlzm5l7whwluwdfspmqzwd2k3ra8rgqqvuj0m5hzy5taneqqy7hww\t3013\t1506.5\nmmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu\t3011\t1505.5\nmmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t\t3009\t1504.5\nmmx1l5dwydjks9s84n3rr52nwggsxfnrf65me7tjnwerse7xxn868ulqfmwwyg\t2961\t1480.5\nmmx1mlurm4px73xghkdn02u60qff4f795nnmt04e4as595tf4luvasmsggxmfk\t2953\t1476.5\nmmx1xthtx2n39nvvjrrkfpshq2v6hltn82h36dnxyg942h6drj2q6snsxx32gu\t2926\t1463\nmmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s\t2887\t1443.5\nmmx10ah956exf9phe4hw9xwkn3a7m3fwxa7pmhr9cyvlq5p84f8yy4fqwkygu8\t2882\t1441\nmmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv\t2836\t1418\nmmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27\t2829\t1414.5\nmmx1pjmyc2sn87gs6xuzaq9thr9y4msqtcgd379cecgywn2684fhcr3q54zr6y\t2809\t1404.5\nmmx1f4k5ajf9dv0jfuw28xh9vzhmvuphv92dd8mfxxdzssverwfe9p5qdwgc8k\t2779\t1389.5\nmmx12q3pverdv5c465fjeryz5uxnvcjpacnfanynclgq8g5fwj77y9ss2r84v0\t2775\t1387.5\nmmx14dze6kxepm2ensphv2z0ejl4kc4hks7gwajnjr9nfpw6glnqc4fqz53s5m\t2693\t1346.5\nmmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82\t2692\t1346\nmmx1x40j0p3ss44jghrx2t0yqr9gqcr36xx9pjss4vvxwj60gkfvg2yqauewfw\t2567\t1283.5\nmmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60\t2561\t1280.5\nmmx1zngflag3hu0axh6r6yutlqxt9r7vwd3fh243frzz5gtmfysqeysshp5vuk\t2469\t1234.5\nmmx1avcekqg5tnavcwyw7qs97809yzh0nzq5l9ltyjljelygwxtp40esgyw665\t2402\t1201\nmmx1fudwe8xuzgwraw6fe6rylklv69x93kqyrgu82jf3tjstsgkm8xrqtc850j\t2367\t1183.5\nmmx1aa7hmgy7dhsmkhsscp8vlk4y48jyntq0zndsd4lvn4ht0nrjk3vqrtn5mx\t2345\t1172.5\nmmx1cthy5xra5u9kwcdgp3z0x55grrj4xv585g69qath07dqrejrct5qk9xrck\t2161\t1080.5\nmmx139s60xj6eeuj5s0fvhgea06up5yy0ucn2fayvg4fd90xyeq9guwsv35zcs\t2133\t1066.5\nmmx17gfe96qhqt3ylhxxqj7x6qxjzvt8cen7s4ks6e0mt642dplug4vq652g57\t2114\t1057\nmmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt\t2091\t1045.5\nmmx12amu3muxtrrr54qkd6wr7xtawh2lare2aqptywufhl24rex2u94qzl4tgl\t2076\t1038\nmmx1h9l7sgtnyagj2zctlj0xmmn7275uqpss2dn8funllmgd7aj3auvqv0fy7q\t2063\t1031.5\nmmx1afht99ekwmgh9s9h043aygvtl8tmytx7ymgavn6lkdxxczrgjsmsqcx3je\t2057\t1028.5\nmmx1rc8cv2t60pvyye2mylydmrp970nawa542u74894ejgwufzg7lycq505pp0\t2047\t1023.5\nmmx1pmecze7k5a4ld66auxywxljxnsad9ducwgzmy4q4k3d6ma6gr3tqtkfrnp\t2036\t1018\nmmx1vcp6ksuysun2pdtkrukz6lh2dd7g0d2lpyjk2m3ffylq0yhn4ntq9fpmkm\t1991\t995.5\nmmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu\t1977\t988.5\nmmx1ug0nljja9d525wv5n8z79vgdjh9vxpf5hf57r2gyu73cm86pcn4s7v3ccg\t1976\t988\nmmx1v35z3r8m5aenzfv9gjx0wcuk9zj5qu98asrr9qa868zrq7qncssq0lsclj\t1970\t985\nmmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj\t1965\t982.5\nmmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj\t1946\t973\nmmx10a32q2xtl4pvm2trnjf8cgyswuyywg4allvc7j5pakau4adcdcnsvmsr0u\t1931\t965.5\nmmx1ausld08qthhjwmpxvxuy257ddrnvwq0u0q2qdgzwk6x95lwvp8wqun9tn7\t1923\t961.5\nmmx1psgwgft4tf7ult8p4e5gjp9un75t6fyzaxmhr9e64lmd6lf6kgcs53s8uf\t1913\t956.5\nmmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05\t1907\t953.5\nmmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3\t1880\t940\nmmx1u9lr65e2v62cht733pjlz5dctk7esxmwaxwjew2xytr7gqgmtnuq3x22cc\t1867\t933.5\nmmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp\t1828\t914\nmmx1jghsp60cua83ekgw22a905pv8qqsukjjnz4nw9gkqlllspmsfugsxnremv\t1826\t913\nmmx1rgf2v34pnkjtzg09snd40cd5262dp2hde4k3tkhcjyxdfh7mf4nqx0cf3k\t1823\t911.5\nmmx1axrdzlwdpczy66khlgcx6zffrury8z6jxxapeygehz5djt5cpyts2mqw7f\t1779\t889.5\nmmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05\t1763\t881.5\nmmx198yry5ttr65tnmftf4ppzjwvxhqngyncxy3sq5ucz8edmsg5umwqs4u2zs\t1757\t878.5\nmmx1s4zvd257h9xqntzj7kd08wnktrzuk7xlya9ttlv2dmkxk79ykz4qzvmjvt\t1744\t872\nmmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym\t1730\t865\nmmx1pu8fla0axf3227ttsxggudd6ym9u9vs7nwcrs8uk799ej6yegvlqhnjkd2\t1725\t862.5\nmmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs\t1701\t850.5\nmmx1lc66qe65pw30cpt5nvjt2apsmtcut80jdv8xgx3wq6d4evu65wjstsftsf\t1674\t837\nmmx1td9zpd4vwncrlgy8kkgft4vkck4yep5nagxr60anls4vrlvs88ts964kg5\t1653\t826.5\nmmx1gqsyr45tlv0t2ct76wqpxtd0asjjq5df8etlhdva8wfvt8facy7stqeq6c\t1647\t823.5\nmmx1kez0lk0emjezwdl88ee6c5lvcqftu7l32ksqgl98snkdzke9cyuq58fs6d\t1628\t814\nmmx12v7y2c99f25yntuk0dxpu4kwectxx62l7hvqsj4acuvvx0xsrqfqlds5l6\t1625\t812.5\nmmx1090syeqn56ezxh9tzlw2006pqxt34ytn3ytfrkxaqaghh40cncwsya49ev\t1482\t741\nmmx19zr02kj3reljd7fz6lrpwdqep9s2rah2nkcwtm77yxl3ja4sqvcqdxt8gf\t1472\t736\nmmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\t1440\t720\nmmx1qg6du0mef5nz96gz7wa6f0ndmdhqnen0knwz3kw5ytf4kl9f89eq2kmrsw\t1431\t715.5\nmmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr\t1414\t707\nmmx1mcsgnk9wd5wgausw8se9d50gv2m0dk0x8gg658xy76cnuegl850sklk8p9\t1405\t702.5\nmmx1k738pwqe95qv3g8z9y0lhxsxgvf4z5dv0qgq9eh6vcy7u6juc5usrhgpsh\t1386\t693\nmmx10p75878akjmna30s8kjwnaveql56v2a45tw20fw86ruhvc8x5pxqrqemq9\t1347\t673.5\nmmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99\t1332\t666\nmmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c\t1310\t655\nmmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0\t1297\t648.5\nmmx188uhxreda27mxl6lth04vl5y2da7qkldg72gvalsth7dkwxeh23sm9juwr\t1285\t642.5\nmmx1zx8z2zkc0hvn9cpnjctcc8akqxf0e2au70dd3uln96hz6uxw7c6s6s7s88\t1272\t636\nmmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn\t1241\t620.5\nmmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5\t1206\t603\nmmx1g67zee4q9x4wp2s4lkfde4v2m05e90jgn0m42uxw35r22emk3r6qa8ttan\t1193\t596.5\nmmx13ech6m45gf3ludnt3e3az7jf68qntxg2htk492zuewh40q3yqwjqv6jsej\t1180\t590\nmmx1hgvgalxcwyssgs5gqsttsfvmt2297u2hw4t7cglllnvswkhg6xuq285wez\t1151\t575.5\nmmx1twps3qw5uvrx8fxmha33guk7p60esjyaa3yn96ju6drhn2hpeagshruvwk\t1150\t575\nmmx1r0e4s9r8jqvuvznv3vd5k4pfa5ahzgyn6lrgchwu4mpqlzgsx8mselfar7\t1142\t571\nmmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\t1124\t562\nmmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm\t1106\t553\nmmx1tyrnks330n6exxr84vz7d0mjsmpey8p34kuzy07g4nrc7txl87ks63zmhn\t1096\t548\nmmx1cg5zspl8na39un48fm04caj4xpphaerynw53vnjlwh42f528ns4s53jjv4\t1094\t547\nmmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s\t1078\t539\nmmx1jycy47p4up4n073nxn85tkem6qmtwpqjjm3k5d3nu4v22w9h6jsqen8hfx\t1033\t516.5\nmmx1geumptg36crcywp4tzfqeameymf7x9a43qqde9mrpaqxqjernlxqytcsus\t1032\t516\nmmx1grclm0x96ccghh8574wnk8wmmee7g8sxt2emh6mgedezdntecsfqrtaz2t\t1025\t512.5\nmmx1a0lmcmccnm3ak5n82mutjxyz9pj5radgw92qzudnp4eucts6awgqym92mg\t966\t483\nmmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g\t955\t477.5\nmmx123qaxyt562xlfdxn7fg52nxx9aq6gp8q3jn6kya98xmn7n0z62kq09hk9k\t939\t469.5\nmmx1gxx98xmhrcdv4ez5fxekmnczvwuqns3geh3wcj9l463d5jgqcwjqv35gpt\t934\t467\nmmx1d39vgf387ct682mq7ua9vlxpjs8w47ennw69wp05atf65stht9wq5hkxpd\t934\t467\nmmx1qc75vu9xfagl297yupuwl3jgqsecwlae3szn9lwpg9m5p0zcnzwqe4adsz\t933\t466.5\nmmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj\t914\t457\nmmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu\t869\t434.5\nmmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq\t860\t430\nmmx1ywsu86chqesuxt45aktpkg78v7we86l0zf8xa3rcer6gn6xw8lnqnwk5tr\t845\t422.5\nmmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf\t840\t420\nmmx1ms72mlttvspj4ga668t5xr7k8m98eedvvdwdkmwjfua2ttdmj33qvqyp7s\t807\t403.5\nmmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt\t795\t397.5\nmmx16qstch29gdwqtfadwwta8fd20zrhqy7pgkaud2h3ceeafwjcmz3q2ezr8g\t792\t396\nmmx18evqre2xyqqzgspaam0sps0avu9xt7llz7t3r9wexelpy8jnws3s0u7sev\t785\t392.5\nmmx1nr0cpl0g86e0wdzuahcc2x7f4pc63n2y6a6zpnsjt5lfsctzmufspp6vd5\t778\t389\nmmx15hfmkxyxttvpt36w04e0h3sdgr5r25869jpxehj4h6mrt66kppvqp9npnm\t765\t382.5\nmmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t\t764\t382\nmmx10jqs45t5ujdwtqyft07f4mxk7y08fac4ks0z6ee50n6fkq67992s09ezzz\t758\t379\nmmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3\t752\t376\nmmx1efmq0tdmmpv7k7dzd8nn5ta045f9fdylk9pa848hzshh82zlxf5sganjdn\t735\t367.5\nmmx1998n5nlledt8puwx80neyvle5xkayw0uvgdhuwup6gtpzd6ym0gqp5qzy4\t723\t361.5\nmmx1tsl59gk2ahk0tkrcwnhnjh2kcnfnhyljt3n76h0cu00ael973k9s9dj2aa\t676\t338\nmmx1ckrmrs93ya5xud2lskwvn3z8t285awqcl4vx5v6zgyphat5eultqs6ds4l\t674\t337\nmmx1rsjam2cenutaew3r3ssfc8zfh2uy2y3ycawafk0y4hq49djayemqnelh4z\t673\t336.5\nmmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku\t669\t334.5\nmmx1jj4r3za249xxcyp30jjyen8nz6kmtldqpypwuqhukzrp6trme30qsvdfxk\t666\t333\nmmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp\t654\t327\nmmx1ks9t2rksthddy00395l48vaqc9rmjuznw0gyuta0jxpkzsce44qs3at8x4\t650\t325\nmmx1q8d78sjm37uz4pps54q0mn4w3yjesr9jg2pprgww6mmput9rg2jqudrwzl\t636\t318\nmmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl\t626\t313\nmmx10ew79lhecezg2ewrj8l8egjtwmkffvs2jfl8rdgxy32arecyp5xqdryl8y\t613\t306.5\nmmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2\t605\t302.5\nmmx136s9temfus3xkgz3ftwqkrg3kpw3nr67088u2ckhkfvazqknycdqe09z9d\t600\t300\nmmx14fadj8tx3ksq8jvfmcsuhxnxmmn0lqdlpjs5rs8dfqphgsuluqfqxgys6j\t575\t287.5\nmmx1vsav2xvgz8p56c0tj2lel0jew2u5v7r8mun2nm4tgu445w50vg8qx6p8yg\t554\t277\nmmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s\t550\t275\nmmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f\t536\t268\nmmx1h6lg70tzjmvsucw3c7mmdf98p553aj0hfd6sl7nekq4yucf4xnssd7hudq\t513\t256.5\nmmx189rrmskkykntwceazrltap8a2at40wdhv4wvjtqc2xk8d85ttdqsu5l54m\t511\t255.5\nmmx1lnmtuqh7jvxjsmmsf92ulcavxtr4fjhzva774zhs0fwvctzf7vgs53cn9h\t510\t255\nmmx1qvemldmglge8tr2dcwnr4gqam6vkal5dkc2jwsz2jyyy8rhry4hs58hvrc\t509\t254.5\nmmx1hqcfqu3r7larng7g73jep24emu4kty990jecvfyugjuwp5n4acdq7wrxdg\t508\t254\nmmx1cke885syq8wasw96nqp9cuh6wcr7sezvy65a3anjqzqhk59j9s9s7jl0gt\t504\t252\nmmx1g4uyjjhup8hgk6akrjqvegmxu6xg98er5pt5uzqn520ud87rlgrqjn8cvt\t469\t234.5\nmmx1pnpxvslglu4u7qnv3cwz4x8vzcc5y9nnlhkczkuzyv7995dz96qqrvwdrl\t463\t231.5\nmmx15m60pxy8mjp03mmtf9aq8kajmrt8vrzltj8epytnsucts50fh03qhw98ql\t455\t227.5\nmmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch\t439\t219.5\nmmx1ls8zjlv2t0prtqvuy4pkasq8a6axrjythsu3nvsne5uzmkk82clqh28yvt\t422\t211\nmmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn\t417\t208.5\nmmx1an3w925endfhcg50qelq69ahwvltupq4rt7wvnhfqd8leg2526qsgh2ret\t405\t202.5\nmmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9\t396\t198\nmmx1n5w0atjthl70cnj3zll4ku3jl2w7cut8peqdkt04ck9annew2mfss5uu88\t375\t187.5\nmmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0\t353\t176.5\nmmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0\t348\t174\nmmx1gmvuqg5x4tn9fj53vsgahgwqa9h4jx0cz4x7xpet67kxu8n33fpseycg9t\t344\t172\nmmx10luguxfgx4rfd4nft0ee6ydk9dcedc4gvvwhknp0n9ux9nck45qs5m6cz8\t322\t161\nmmx1fv4dvhre9mmtldnr2t63qg5hdxa02hzjeh5hu7a3zkmf8a3ql8wqv4txd0\t318\t159\nmmx1jkajyu65wp0klsuyygjs5425tyq3ujffs7t7g6wgvxa2r4arrs2qqs99pp\t315\t157.5\nmmx1mg56jxv3e0plu76824vw3w72kqumgyp2hetfg5s227lr96vjzd5qr4gxnj\t310\t155\nmmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c\t308\t154\nmmx1qwcxn8k9nxdu43ytsw0ew7wk7mmptr3ykvtenms3fsyqexg9p36sp9slcv\t307\t153.5\nmmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80\t307\t153.5\nmmx1h9ahw37ekqwx5sewaszmj54cn0l0pmzrksss7z0320ntkt63q6mssrfkkd\t306\t153\nmmx14p5y3gn5fl8t5jt0twe0l68jwe9n895djrg8lkk55t5rdupggf0s8l0kd9\t294\t147\nmmx1anyf8dhv7shc957xt95ujj6ltk2hmmwhl7hvftw67ph3uf7w4ulqpdvg9l\t291\t145.5\nmmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4\t265\t132.5\nmmx1z5zgrrc2l37fg4cu6e7s80qyxm72fcw7xhfeep2caahptq7mdr2qzcl2xj\t212\t106\nmmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w\t210\t105\nmmx1x4nlvf00jq5cld2tamnnssnshzd2v9gvtp2yjun60qgh2zj98kksyxgrh5\t208\t104\nmmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q\t205\t102.5\nmmx1rh2lur825y90gqc5pxmejgk5d8wl934h0v8lv972rnevrfhpsmcqsqywld\t200\t100\nmmx1eymvxpnp4seshcfn5qfctlzsukazt49t3m5zgz9q68g4sry89cfsggxcfa\t197\t98.5\nmmx1njy6t7vkta3veyjj4atvr6ppmeeru85tgh5qvhvnmleslru54m9sqp3l60\t195\t97.5\nmmx1u75x5wkrse550ag4nwnesaaqhvr3js7vtqh9r3vt0etcxzqu8z2s7u0d6h\t190\t95\nmmx1e3rafs5jhzf03a8wxwp43kcguxr98eq3azy5lvatwayvezqfyrcqeumth7\t178\t89\nmmx10ewttsgpc2vq980wlk0ddtc505vp5edvusl8a388y76peautetfsyj3ej7\t166\t83\nmmx1k4rx2e7w5rl8jzs96hwj0hussljxc7tccyqng80r845uf4da9wcsat3pug\t161\t80.5\nmmx1s9972ypp7cgngncz8au8737jw38rswzyc4x26u84gr4jk07q8s7qjaljld\t160\t80\nmmx1m0qtqx7tvpw6rjhsmjnpr8dxgz8wyx3hypcg4qw5trnk34urxwyqxeym6v\t157\t78.5\nmmx1wtt47s3lhpsu4nxfyvzl58jpslpnuvv9ymd0gthaxpern3yer20qjykd8r\t156\t78\nmmx1c68tgygju8yrhf4samf9mdc9rstzqe34kcz2zqnyqjxcraejlgpsq6jutc\t132\t66\nmmx16cnha02fp053dvmxltjgluwjw0fdedpmxj5x72z053pwt86fgjtq7er08p\t129\t64.5\nmmx15drd8dvlexsa460klqa0dqlluy0pya79z7lnkvj08zgzuncnzt5shqewhm\t125\t62.5\nmmx13xu3ay8eujt4neuwyhxw002r6qlj0v5p8ldj6jus03ev0w5u7wpsxdd3v9\t116\t58\nmmx14ljuxjzlu24djfrm2varlgvfup2q0keydus50mrv6qy2qpuxu2lsmm8gza\t111\t55.5\nmmx1u3u8jn5824ema7zszlz8wuww49dz8vf08jd7vux952saltvx0l0syu2qzr\t105\t52.5\nmmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9\t99\t49.5\nmmx12j3mpzmlpx9d77ux2990xwdhus99626yj3s75kyaxt4r80n3638s237x44\t91\t45.5\nmmx1vmxgy2uzfh8z0t99p0yqgrea3f97grmh33shc28vtvg2lkzcpygq0ls0np\t90\t45\nmmx1rq2lygf5p4hs7a3ftmc8u24v7f2q9gapsskf0kgh8wjzzxsddumqjz5fsh\t88\t44\nmmx1v5rqrf5ctkh0uj2xttjxcrkwaecztmcnaqj9zralud0rt70g8r8s5xmgv7\t83\t41.5\nmmx1fgylxyf2ef9p5zj0d6hnz6wr7wmkgukq6zt398uk3j78nhxfu2kq05qm4a\t76\t38\nmmx17kwmmmdvgdmay78tzmr4m488xvax8ft5g98xpx93qg94pu0gtrjqxym59f\t75\t37.5\nmmx1d8mj6q8tj54rejhx37skuzn88tld7emw3wra9agvjx9glraa8xaskpa5fg\t71\t35.5\nmmx18asaxgn4dcswsefcdwx54kldattux7l0yn96fvmndrpqn6adsluq3ffr8x\t69\t34.5\nmmx10w2sp9rp2s4s6uj32fu68gdqcjvdc9e6h3jm2qmne02400ul5pws4a4r5v\t54\t27\nmmx140ya6nvrw4a9v4ydwrkutvju5tln6tflvq0uehqk6g42d2g8m5xszxwz45\t52\t26\nmmx1dun6jkgf7cscymt6udr8nlm66gjewqyylyzvnswaaq5exzfw4kdqk6nk0p\t50\t25\nmmx146y8qu72rkcw0xrs8vf8y7j423t42rtyynze5d3kw6e79vdsdenqj3esfl\t49\t24.5\nmmx1wy0dhr03nf78m4gufm7jcnzfvaqq244ckzmup5s2054apysy6jgq4pp76h\t48\t24\nmmx1ye76l4yxct7a2842mqa8vcf4q3jqryksu3s6xqvj3qdlaq47es6s2nt552\t46\t23\nmmx14emrk4d8vzp3c2yztqrzhnmy8r9tsnywrpmfrl838q50j0xjenjqay73ld\t37\t18.5\nmmx1cxvpr0z0rjx9wfqrs7e8dzt5xshhlscpc8fk5xs79009zh3vesus9tru8m\t36\t18\nmmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0\t32\t16\nmmx1z3qzxxkh09r73p9sh872xz7fqjahm048v0e80sypz5gd00u2f47qgf20p2\t27\t13.5\nmmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al\t27\t13.5\nmmx1usygfr5xcuszd23r5cn627etytpyz8gqk7klyzkllwkwzhal5mjqjtjl3t\t27\t13.5\nmmx1aawhv22wdnreucw8dk9au0qj93wnf04gvs20hgldlapsj24ny8hs0qtjgq\t27\t13.5\nmmx1ksduhw2jnwayh3a62cnhmxf7vax5lult55kj09ejvqgrr7gy726qkp57w7\t25\t12.5\nmmx1krwuwd0xfqxq59rhnglkkduxw8wzq39axh99vtqsy0k6tnac0zcsw7fhj4\t20\t10\nmmx1lgsye5dkh57mxj0n2glerlmdzrh76snfte6k92gvxemkuhvug5eqlhcjvm\t20\t10\nmmx1rfkx4gam8z02m09k5am29u2nyn62wlc22f0fapkqra6ckxspnn7qa0d336\t18\t9\nmmx1vgjfpw47le6hw8kacxtf22tpmr3aqrw9umngy4gjkv94r7hp8gxqcqd55k\t17\t8.5\nmmx15v9jzpzxjwdtn8ggkzu7s5suv7kqhuw9yer4w7ngvenlgg660vlq8zgk88\t12\t6\nmmx187hkj0kvu3rjq4tj22xqlc8qkwp8n48xe9yh4xw0nzjj8cut3mnqy28fjq\t10\t5\nmmx12m0cmm80y7twslqtz4z2qhesdkun9ncjhddnkdzeedf2tcap9qxq74nzf2\t9\t4.5\nmmx1jpfmyh0ndxwz47t3d6xrdlkd0mq3nckuasn8elvjfa65xtzm2j8qamxfuw\t8\t4\nmmx1x758q5t2jafk32raj98u003duqlte37xzzzanwl7tef7gt4234rszr4l02\t7\t3.5\nmmx1nwfsx2prjuvsq2q3pn2ygjntgu5rgnarpwrqq2l5adfm3wdmwwqste58cg\t5\t2.5\nmmx1yxqjvl97jnhxwlvqzh8n53g67vc3l2u7m78aks5y9rym5utj948q3dgmma\t5\t2.5\nmmx1ayukxr9jcev25gddx8yfpv27hauw0z3xy9z2jwzdqk8n624seayqkjhm9d\t5\t2.5\nmmx1jwjpe8w9cpamhscl0svn3c3xy47cz50qsn38gu3mxed29gq96assmzaq9p\t4\t2\nmmx1rk9f4slwuur34lnw6phl9nw2465a6pfjj76p0p8zx8erzhsw0jas7pjyqj\t4\t2\nmmx1jqya2nk5kzref5tpqfz7ze2yd4mcdh5ax6szxjtk9sk5wza7hr9shjjsg3\t4\t2\nmmx1ctxq3czng6y2ms40mf6pnq699p7skzsncq5qerceja4k20ve24pscadkxx\t3\t1.5\nmmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0\t3\t1.5\nmmx1e98kn0hsxlvmn67g9rwq4jsmgfvrmhm55yj2dh6rk0ttrf960zuqrc6e5z\t2\t1\nmmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0\t2\t1\nmmx1ksu3c85u4gd20v5dy5nkjk30fa7endp9mc2za37gr6tuak0y604susek8w\t2\t1\nmmx18ee0whkd2pk6xymy9sz7a9y6mmcujphzqcyl659fxz2cdr5ln20qkd3wav\t2\t1\nmmx193v808tk0f54j0cgxeqpnhywyyp3l3e847wlgl588murpgs43a5q65as7s\t1\t0.5\nmmx15aarz3lnq8da6s86l8kuwwzy0gfw3tdqqu9xhq00lardxl4jv7jsa294sn\t1\t0.5\nmmx1skt9meytux778svqe3d6fyvl7mjfrm99nlgyfwenclgr09ftm7uqc3cqxq\t1\t0.5\nmmx1gssr7n6rfcffcu6g830sa2gusv89m7mp03sd86fula6gk4th380spllur9\t1\t0.5\nmmx1sk6k9sdj836ynxntk2nt60funlz0t9ptqttrqvg46vcv5mdkwhaqgrgnnt\t1\t0.5\nmmx19zld6lprrjhzzhltmjskuv7dxcqnewx9sjll8ccdm538wx40ajpq2f8m0k\t1\t0.5\nmmx1zw68exayxayyakvgpnrf4ptfkkkcth2lvlu20le3e0ghrpae4hlq4sqfa9\t1\t0.5\nmmx16qj5ep69xew0qfqms0hw6eh6et3jzjx46wm0xteslv5ufs02nd2qtp4rte\t1\t0.5\n"
  },
  {
    "path": "data/testnet8/fix.js",
    "content": "\nconst data = [[\"mmx1aepsfj9c4nqqcew5qk8rw5sqqkwer5pnmwx9y4elcdm9gy332vqq7flngz\", 12250000], [\"mmx1grznkf6d33xtkhee5899xa2jg8v3ktupude206jt7pzpmxgslgqqxtddgk\", 250000], [\"mmx1j7njmgtzmqr49n9lyacawww0uv2sjgxs7d04xu2ns6k62hfqycqsh33u92\", 12500000], [\"mmx1k9lslhl4wmhs7ray9lfh47cxkz0j5vr827vypyaltsq80697xyqss2gn93\", 24750000], [\"mmx1zvgs9rvzul3nflhqmtfdu8qpa2aqnqwxwsaatucsulsv5dd4svqsed4fyf\", 5250000], [\"mmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx\", 95000000], [\"mmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt\", 128000000], [\"mmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl\", 87250000], [\"mmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al\", 67500000], [\"mmx1544prt4r26fm2f6ytlvdfe3j6mwrs5p479kp3lcrz5n58kp8ugpssn2z2u\", 27500000], [\"mmx10gntxs6zapmxesqh6mk5ujdxyvkada4r9pg4pcw7s6rlr88yvyzq8hsjzd\", 75500000], [\"mmx1f3ecr58txvmxjrlhnx3nw0wg7y7zdef73gcgjfrvcf8lgrdu3czsn4yx6z\", 96750000], [\"mmx1ezvssk3jgn6wr4t03ng5at3mccxyf6868z2kzmapnfqhuyyu2yrsa4vlkw\", 37250000], [\"mmx1e8xldlayy2j5ptk9grrze76e5jyc8p0uq0zuslawyhqeu7xme5rsh06fw0\", 6000000], [\"mmx1fr77kwzjzcv3xmrhczs5wwsmxlufp9kkvndch9d78fr3m09mqgysc6lnaa\", 15750000], [\"mmx1np4pfzqpl26td6khzcfdywcsz0tz4xmyua2havtlpp452vc99yyse4wkmj\", 750000], [\"mmx1zqrr5qw2akhgvvxnfvl3epw5zxjy8j3930fed2agnexxjelrhy9qdrrh37\", 4500000], [\"mmx19awzztq8wmypthv24e60xmvxzymw82l86y0sdyw5cl5ehnr4ry9smhvg4s\", 76000000], [\"mmx13qkvk6325f25vdmqc5xjq85q485zsgmh5pedmykg37mtt738du9s670h4n\", 8500000], [\"mmx1tagjkz3avdgz8a5kn8kkhs3lr9lur0fmdt9zuz49h9j9vcg80v9scl8fpc\", 14000000], [\"mmx10ew79lhecezg2ewrj8l8egjtwmkffvs2jfl8rdgxy32arecyp5xqdryl8y\", 402750000], [\"mmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0\", 95500000], [\"mmx13cf0qwyp3zg6gqnkcupez7zfnwht6zpx3z2chq4erzstzypxy5xsycnjhu\", 1000000], [\"mmx1q5kdfkldkc735p5e7aj6y5y0szvhml9nchux98cfqfun4wa74vxsm3zr8c\", 24250000], [\"mmx1zeqjj69mt8a5pcgdzrukt47cpgg6nwdas6m5j6aqefxapq7klcxss8tcha\", 55750000], [\"mmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5\", 93000000], [\"mmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq\", 125250000], [\"mmx1yqkentanxn7cp69sgz35j4eycq7jjxvel373aljj04a4fnuusqgq3nv5mw\", 7750000], [\"mmx1255zy749m3fss4azm0ggj304y6l5uswd2d0rm0hgdgwts9dlfygsgnzfds\", 75500000], [\"mmx1ed9e542ggt95rk3ygc3xt29apzs2fsx384mwhqqwy30qs4wdhqgs9qh33j\", 176500000], [\"mmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n\", 349750000], [\"mmx1n04te3zvrvfsgmvzl3dzegpntqeqevwmd2ycwwwhng0hwslxkyfqpq2ng5\", 70500000], [\"mmx1uwwzqtkhs2gv6gfja6hh8p2lhxtrv066umxq3nkccfqs4g3re5fsz9y55s\", 256750000], [\"mmx1h8thwkuhp0jnlr99ntwllhwhvp773yxufrcuwsh9q52vkrfcdy2q934mmu\", 84500000], [\"mmx1uw2mjnw6zt8t0r2w0afqu3zw7jkjl80xjwnfgk6cx7m2c9u5052q6m24l3\", 16250000], [\"mmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq\", 603750000], [\"mmx1els3e8hj2jvteh7y2xgwwxwq2uknurtkp63ca74gcuhrcajpzc2skqmh40\", 73750000], [\"mmx1r8mm9d0q88dr7dw0v94yl0cthpr560r30x90zxcutltxcck6xq2sm3yx2k\", 500000], [\"mmx1q3nqrhd9uyjcls6jyj55x4wcnzlfd2mtezfy0m99gd0qt358hy2secef8p\", 250000], [\"mmx1gcrf27d3pmwese0hl4ewnm7xjcwfqm9e789mrax8lyqq86xtz5tqrql96z\", 750000], [\"mmx15spum2ccvkzj5zg32v0qzy9xhhafsa278ujyq20m2yhwq5lpxstq8ghswd\", 51250000], [\"mmx12u3ppvj9yvh6xs36zscus50m644dx8ywqq530w3jkjhly8hf3qtqy6fe48\", 60250000], [\"mmx1axrdzlwdpczy66khlgcx6zffrury8z6jxxapeygehz5djt5cpyts2mqw7f\", 146500000], [\"mmx1gntkqf266vrn7swllylnxpaayt7n06yqxhxjsaglkk8fzds4xuts4gwjsw\", 17500000], [\"mmx15w4ytftzunx9ues8qhk3z8wmrmtgcg5n88axzk3c8qwtzr3n8cts3hnhj2\", 20750000], [\"mmx1jr5hkhp35t05c7g9jxfvs6wz2all566kves6rx5ckl57pz7mmvtsemw7kv\", 1250000], [\"mmx1e0vmg4kc5ed5t85p2gjqrgql8ujrar0t95n9l63xnmkacgxv7gtsum8x2m\", 25500000], [\"mmx1mtug0wju96l4p08r2452lnllej28stdrlpz9p7qc3vlfmj888uvq0zrzhl\", 26250000], [\"mmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm\", 28500000], [\"mmx1er9czf5xeu2wnpjeg69hhttxppwkpt0hmazpclhgjha0nad6kyvqeus2pv\", 4000000], [\"mmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9\", 216500000], [\"mmx1h9l7sgtnyagj2zctlj0xmmn7275uqpss2dn8funllmgd7aj3auvqv0fy7q\", 1250000], [\"mmx1arwca695tyd8rsgxx8r707xpe3laawcv3lq593hs4qz9zehlngvsz68wh7\", 22500000], [\"mmx1f4msx52tgjn7wwetqyx9e7jr63krs2ut8fx0n5ufqvp6fncfl5vswzueae\", 124000000], [\"mmx136s9temfus3xkgz3ftwqkrg3kpw3nr67088u2ckhkfvazqknycdqe09z9d\", 182500000], [\"mmx1humz3m6yfc5rrf9zczyjkptr7snre4e9slypuwhhgsn9eh952yds80u466\", 24500000], [\"mmx1kx9uarw6ld7w9nmxytejkzs8q6r5376cqmtlxcd78pf889fwfqwqn6pk5f\", 2750000], [\"mmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c\", 33750000], [\"mmx18gm4fpvhyu80m262mptx9y4l6apdlwrsecfye70n6rslzuwmqqwspsnw0w\", 137250000], [\"mmx12wfqpxsx0gxlrufeptynuvwt4fn9wqflp356l2sxhveshsrkrqwst4uwh3\", 21750000], [\"mmx139le573u5rq3g7a4adydjznp86en3u5wznrlywq5k0jy0s49fvwspq0w5k\", 9250000], [\"mmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj\", 169500000], [\"mmx1739equ4zcj89u9dl27ssz72wx6h9wrms57s00plkzq3g4wqxjqwsk6q67c\", 500000], [\"mmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\", 29750000], [\"mmx1h9p0lv7at2ahtulugvg9vdh5nkjph2uvg93uz5azp8hmmuyaj50s8ky6v6\", 36500000], [\"mmx1lauskl8kzuwevqyx2ky8ale95esy87swemetk0zhc73ctrdm5c0sxy3exa\", 23000000], [\"mmx15cf5205juyar33ugp9qkh4e5ne9n0ylvnyg0uf6uyymd3tgzhc0sm47jfs\", 327250000], [\"mmx14xms6j4un330ca6y09r8ffag0d9gsw6dgka97c82k32d0qtkuu0svjvmgs\", 343750000], [\"mmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn\", 6000000], [\"mmx120v9ahac98w3rfj208xsf7rasweaesz3n7dtgt4f60upczzs3vsq6d67q8\", 95500000], [\"mmx12hpmx28f6hf0hzx5j6z9ep8vjmpcgq5kwmaxkpagkqdfksunkgssmk59vn\", 54250000], [\"mmx1lsgrc4ea32dg8zm35yg49a9xzanjav88wdvtvfgu28s92alec5sscmwzm0\", 352750000], [\"mmx15qd64czwphlu49mlj6kmxru6wdcrjny326mp5d5p0hpzhuhw65sslkng8e\", 88000000], [\"mmx13j75773f8tfepkdjtcrpmv3djm4y7htcl2waq6spxkgtxs4yss3qfukrk6\", 30750000], [\"mmx1ghyal08f7r0p3ft8gywyr24p58jhe9fsy0xmu6wwfjuq4z079q3s36cu8q\", 37500000], [\"mmx18tph3dn7ahfs24zu4lnlhrn9uk35s6fd46x58jf2xq3wzdw8ygjs5eamp7\", 52750000], [\"mmx18xxcvsm8vekqk6hy2xwx7aen3fwj6us476auqvce9kyw49ekfcnqk7tcwp\", 500000], [\"mmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj\", 500000], [\"mmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf\", 200750000], [\"mmx1fq7a0hk0kwers7ymsdm9wswa7qes6fyw7nzguz3erm5j2xd4eynqxxflh2\", 1000000], [\"mmx1dwr96cxjzyc6532h2gjagegkm58ns4fdrwj6muhccgxn5ysuqg5qn9mzn6\", 707750000], [\"mmx1m6dwm8wvtthgngztjnw7r0g4z9s8797xa7hdzrj2zyajctgrpc5qx2zqg7\", 63000000], [\"mmx1tw7lny4cxss0ks67wxz272y356nvgzl2ff6stee4x0muhr9zv55qs85vdy\", 26750000], [\"mmx12djy7tqtf5xmhdqhk58jkjtp3e6elekgcuhe8zr9reak29xz3c5qdqj7h6\", 500000], [\"mmx1n8fykdy0sk7jj8rn7fwv8awzel820mc2d9c9l959hajm8y8s6v5qayvhfr\", 4750000], [\"mmx1rlanqjxk03n363dxgqfek0390p6pfdflm4vnf5d25kp8rxd7lg5q3sf3xf\", 1270000000], [\"mmx17gjhpuwmfcdlymhaz9qwat2frpptev3pz2qmuq3zycj76qwnr54q40t5l0\", 121750000], [\"mmx1pj0uu0lna9r8rgw8ccn4nj4kudgwxchv4l0tjqpw2x97035a2v4qdye8a5\", 342750000], [\"mmx1u4m0jmxu7avg5am34pjw3g9lwqys7vcfp6ah53w60626rywvrs4sjzl660\", 27750000], [\"mmx109nvzs3vhyjqm3l7g72fqdxyh465fedk4xjvy2rnhfmgrw5l8c4sex2mej\", 362500000], [\"mmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0\", 122000000], [\"mmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0\", 18250000], [\"mmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs\", 86750000], [\"mmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0\", 566500000], [\"mmx1r2s7q00hau24y49gdglqx9luqlgjug46del32hmfmujmq87fhqksw7emhl\", 64250000], [\"mmx1hkmks5m9u9le0k2zmx5djjxr6eh34nyzldlnty3mzk6yhzvcevks4z2n29\", 85250000], [\"mmx1n4n4k7wa79l83ch35r68eavnh0lkwcs3h52jt2xjl6j0969lqvhqsew3wl\", 68500000], [\"mmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82\", 151250000], [\"mmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn\", 19250000], [\"mmx17s5j40067d5ugggn9ppdjg5enrxe37t0y58y8pjgnc0up25k7chq4rnaaz\", 250000], [\"mmx1ay2su27wuxjye9f9njdj0e7jjgxs4gah9p53upmrt4rwtv6afuhsw6awcq\", 40250000], [\"mmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl\", 72250000], [\"mmx1f4g8tdak9nw2waf5v4g8skt6gqqpnnlvxhx0y5vjkm0myv97svhstqzhm5\", 177000000], [\"mmx1dm7la9qquehldy67xsfynp76p39dxa5xn4veegz88m7amspgpgcshv7dfg\", 1750000], [\"mmx1hz0h2af4zmvnczp0twyzt8uts262pn9h93awamhc2sakdlvxvgcs8llaeh\", 5250000], [\"mmx17gtsl3areyr6g7xscq67jl2xcnz56ekkk9stxvx3qev7hhez3ccs3juqvl\", 145750000], [\"mmx1n56f04jwuzpa2zkl46ggs3zv989fz4yx7yyrcx6nzn9ecvpwjucsudlers\", 85750000], [\"mmx1mhhmm9rsxk4fv5y9feft68uj4mrz2c8m33df5ts7ve6uz9xj7geqgqxd73\", 32250000], [\"mmx1ehmcg3t88xt37498wtca2geh2r0v2tzlzagk2jp5stc3heey0vesjefjzh\", 1302250000], [\"mmx1rx03nd8ttf02y3qz69s9xlxqhrhxtk3a5x8lnkxl3s02au2nkqes8dv836\", 22750000], [\"mmx1rd8n5srxsgys0l27d3ym8wmcw0lr4jqf7temzz7pqqjx3knnksesgace7w\", 52750000], [\"mmx1xr5534k53fk455wylucnrh5ap09da09jcghz7g9jg2jaarss7gesrjhu9j\", 319750000], [\"mmx1a2ak375lfskc6xrf6mmmc89eu3s46ywap2j7d4aj5eyeelctqy6ssshgzj\", 2500000], [\"mmx1t00welhtn9k0hg075ttg2laa7dj7d26jprf2as70xrx2fuhjyy6sjjp3e8\", 34000000], [\"mmx1ye76l4yxct7a2842mqa8vcf4q3jqryksu3s6xqvj3qdlaq47es6s2nt552\", 15500000], [\"mmx1kvczf9d27064yfd7kpha95ehrvem875khnq3zadd3zjyxu78ly6s2vwwp2\", 2250000], [\"mmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu\", 67750000], [\"mmx1aa6383rdchx47qugjavpkcyxnpjvj6v0trml9h3ez5wlcusv0vmq0gkj65\", 96750000], [\"mmx1lx2dgd8y94t40p55w45cdv0wqdk4m9q0tzaru9pvsq7decczasmq2l6gnz\", 250000], [\"mmx1vc3s0rqlmy7hrw0wr5mjfzgqx70senjwnp289x6syu9r0m58zvmsk2jl6j\", 72500000], [\"mmx1afht99ekwmgh9s9h043aygvtl8tmytx7ymgavn6lkdxxczrgjsmsqcx3je\", 558750000], [\"mmx1w7jnglje4j85z4dv4z6gpmwagqfcgpg7nq7dh6wu98qq7ckd7umsdq9hn8\", 285750000], [\"mmx10qnnual5h4rxxcmjh8ts39l28azqwjqlfz0u0gjeruntvs0zpqus0fl0u9\", 2250000], [\"mmx1uj0qhzeguf0zayyg2m9z794nrdlk7y7pnprt4w798s5yezgxgvuslzd94k\", 71250000], [\"mmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru\", 223000000], [\"mmx1j2awdr9j4gun67tr7e02h6dq5522u7lkcu5ftvl90ajgf9kvhqusdze086\", 11000000], [\"mmx1tn8khcvlnkhprvsgn7eutwlws3vn5yc4mnh85v9vdt5ze8zs7cushvg596\", 250000], [\"mmx1v8x90upymn830n267009ejv0xwpwmenm6a8nvx0te0v29lauvuaquh3emd\", 750000], [\"mmx1xr8hes0tgn95zf7y9zx6x649t84t5c4zas0cyf048rve723u9gaskvfmvc\", 421500000], [\"mmx1n50ufuaae6aqhxcjlw0fydmhpt4h049rfzjqtgke57sn49p34sasdhzm0c\", 21500000], [\"mmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l\", 394500000], [\"mmx1m2nxpzuhfj4awyc2wnu37nhkhsy0q8spg9egnkzf3geq2kax3g7q54emhl\", 83000000], [\"mmx1u59mc3s94cezun5apvw35vj2vnzfanjv45svwfdat84wpuefcs7qzns66s\", 17500000], [\"mmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2\", 17750000], [\"mmx1rdu30vgjdheh4453heuq98es6whgaskx7csmfh28m04sckxqes7ss2y89k\", 16750000], [\"mmx1q33rhh00r0dh7fx79lp9wrmv3t5mgpx6m3wtpajmmenuux0lzvlqruqgnp\", 20000000], [\"mmx1l5dwydjks9s84n3rr52nwggsxfnrf65me7tjnwerse7xxn868ulqfmwwyg\", 241250000], [\"mmx134t4wf6h2ppxnxm02ejutn0va4sj6fm0qkyn0hsfx5r4a89x25lqznt9py\", 2000000], [\"mmx173nnyxacrsmasx2v80gxpejk6ypyvt52pcgejrd6jtv7yq6rtslq6pw76w\", 123750000], [\"mmx15v9jzpzxjwdtn8ggkzu7s5suv7kqhuw9yer4w7ngvenlgg660vlq8zgk88\", 24750000], [\"mmx1zyldvfw2ek8a2fv5zm4azulmkth7xntmvxspud576v7awhf7tgls50qg4l\", 206250000], [\"mmx1zx7dt77dgkrzrn25zqqspxxzr6yyhk9wwgt0lelkxeda0ac3jsls68fl0c\", 250000], [\"mmx1k4sqj4vufu22zxtahymvhtwmjp4c633herv8h0l2z9nm2xn7uqlsjje4hn\", 87750000], [\"mmx14tmfx4twa5spah6u7he78hg5nk7tp42zdjsq8a25fyenxz64yfqsqdzlh6\", 15000000], [\"mmx1uf668t2krsyfde2v7cwtwk3traj7gwrfcdcx0j72rjr84nnz2fqs83fpcs\", 176750000], [\"mmx1ks9t2rksthddy00395l48vaqc9rmjuznw0gyuta0jxpkzsce44qs3at8x4\", 61000000], [\"mmx1zxfqw42gfax4wm88lvy76tt6et99pmd7vdjhfehx8jnejr2fg3pqmcvq8w\", 63750000], [\"mmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3\", 258250000], [\"mmx1478snw4amjfq0hnhpwl8de8yup2thh5f5uzmyu5g907az5sv6fpsuwfrma\", 169000000], [\"mmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn\", 160000000], [\"mmx1kevvjxgq5hn9kzlds67gt773fsytmpv9vc4cmqnxlcqnv3ftm4zqm9y9rs\", 244500000], [\"mmx19nnl9lw7td20z9l22v8wk558mxfrdeud8ky3229utv6e50cqyazs8jhq5e\", 20000000], [\"mmx1cta37dl4czqsz7jaz5awly9kxy6v3v3nqes56vugfrg4h263fdzs99rgzf\", 5250000], [\"mmx1swqkluvn7gggzn48wa4k22c8edp8wdnrhnhv0c52jk569m5chprq6nefvu\", 17750000], [\"mmx1guajyf4849dkedxpj2aqevkuc9a3u37fmg4hyqzmk4l02n37tfrsygnc5y\", 292500000], [\"mmx1qneuv0d6qzv8zgchxzzcmx2w5k42j4wah6k8psw5fcgw48707drsf6nvxm\", 2250000], [\"mmx1a5x6xect5s2cgdl7rh2hxwz7z5xqecvmlf9jjjj8za58al3mlprsr5germ\", 2750000], [\"mmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0\", 684500000], [\"mmx1fdscrht596p4daxkpzfunczjmurs66j65u5lc3a4q0l99k7h2ayqdvrfnq\", 304750000], [\"mmx1gy8npau5h8fas5er5mwtl4sqe2glvwrkr56dj9679h633mgq3eyqpvz0cg\", 65000000], [\"mmx19mrdy4z7gndh4k3dtrv0r38jsz6c4texjlwnmzjh0z0ccnk5t4yses5kz6\", 500000], [\"mmx1gx8an96g7ky87eur85puyex8r24qswx5wn86r2849njg8q2hkeys8zqlvp\", 39750000], [\"mmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c\", 7250000], [\"mmx1zp7rs0q0dqthcwdfvpaugv6px5qylq9uvwltvq4gpepdqyk9299qhvd3tr\", 10250000], [\"mmx19a2ky2g4tylysduh8k5ev6kms2z2m4kk6veuljjs3cq2c0r7jexqmwewx5\", 500000], [\"mmx1ktyudrg32h95gwzg0hfl87lf6wruuunp6w888typfdw9f52g4axqcsltyu\", 65500000], [\"mmx1m5zcq8hazpjhxc54lk5hma3arvwtkpfgseahf79yn0ytchv364xqjza394\", 53000000], [\"mmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj\", 118000000], [\"mmx1que54datv9wjvh6jjald43jlhxkvcpyl7e6jaqap8ch7my7sr48q0jq38k\", 21250000], [\"mmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy\", 353000000], [\"mmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr\", 158500000], [\"mmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6\", 57250000], [\"mmx1hruc7t3lcdz2n0mukyjh6l9dtxd9hauzegufz9f05k3yaltz9agqph6vkc\", 500000], [\"mmx1prlfdpu5gmy5wh3yhtjgzlth0322mcxnw2zagydw5naant6dtegq3r7mqw\", 750000], [\"mmx18yu63mp0j5nrxgxmt6md2y77v4n9ltyv6knvtmwjqqzty37swagq9df8mn\", 220250000], [\"mmx1re7sxpa7fmpseg8phu4pqamqmg72qmm3e7fzx880lz79dnyltpgsga39eg\", 58750000], [\"mmx1jc22nh8pmjz20qyyz6jwlx5crml0z7wwrrgn3p66rgpt9ay8r9fq9y2864\", 14500000], [\"mmx1tms3d3n23j28f9agpm0jrdqnh634f3q9rgcnwsgq64yhcshps4fqd0fv6k\", 91250000], [\"mmx1qqjqmgyqws0jk04frzf4e98ydd3pkcsfyv65g2t3lgnp9t8z4afq0kqpst\", 102500000], [\"mmx1usc52whlhctpx08phhjzge03jy0wf2ft0y9dngzgxxs2ev0y23fsgjk7kx\", 149500000], [\"mmx1ywen6qnhge46fhjqwxtnyapckkakzv5m7gz8339j0kzkvzeev4fsex4z9j\", 873000000], [\"mmx19cxxrr2c4a39pyqda7zqt0dxga6ey7gc67rvlum7ecpzpagtrp2qcakr0j\", 8250000], [\"mmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp\", 6250000], [\"mmx1kzfexe6m93ggzewpf7xtd6jx9g9n2k3p9n0em8zhug623tx22d2qdzqnq6\", 500000], [\"mmx1s4pkkycenn7e0g0y4c3sz2yrkld7m98mlm8mc67y7lj4trw5se2qy4eq5z\", 94000000], [\"mmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5\", 78250000], [\"mmx1m3tug5239zp7zst4qu7c7cns8f8dvel9lnjek23v2zd3ed9mmf2qzgpa9f\", 5250000], [\"mmx105ezm538jqpj859u3ygggr9umm9nrfxrgjd20mp8j3g22yvev4tqcljpj9\", 1250000], [\"mmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn\", 17250000], [\"mmx1j2ej2wxexc247mxf5k90lmjcevp4r5cuuaa3ukl7ywvfq488detsgxj7jl\", 1250000], [\"mmx12uthvnq3g2af96lc3un900pd2tyy8apf0fsqag68d7fxene639tsacu4zm\", 113750000], [\"mmx1q3eh75hak0v9f9psa365zjypz62q8d0cwv2qrpwpj2hayfn6xfvq747gj4\", 467750000], [\"mmx17gfe96qhqt3ylhxxqj7x6qxjzvt8cen7s4ks6e0mt642dplug4vq652g57\", 170000000], [\"mmx1uth7wfnyvzfy8nf56u6t5xhf085l870ytdjazm4g6ja7qmn6w9vqljj34x\", 36750000], [\"mmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9\", 250000], [\"mmx1gavx8yxen8hhfy7qgkqd0jqczysw8rgruef8nt5mp2sp7skeh3vq9lx32u\", 23000000], [\"mmx1gh9yw2ctnae2jy95gv3g70h7av7y9d2ha5dk6ehrf4nt0q7lppvs22d2vx\", 250000], [\"mmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0\", 13500000], [\"mmx1evudswfffa6pru342f5hkduqhmmalx3c94clvyed63ht0dkn2edq3shffh\", 35750000], [\"mmx12w9lkh26qc7fvw5038usc6y6cv28jy446qn07dczapjcv3rw49dqgk27s4\", 7750000], [\"mmx1nh05jetwxuhj79j9k4wx6ujsamseykk84383jtmfcpzu2f2hz4wqj4e25c\", 23750000], [\"mmx1d39vgf387ct682mq7ua9vlxpjs8w47ennw69wp05atf65stht9wq5hkxpd\", 110250000], [\"mmx1nra9jrj79xztttq6hnnenveezkk9pq4w5whvlmr2nhj4s56f43wqx0paqn\", 208250000], [\"mmx1qm77f6cv9z9ufkavnt5nll7qq55rvjx3hru8kafx4guk3chpuawqcmd098\", 354250000], [\"mmx10k4auqde486w5wyfajnmpl4ds6tv9x7tzdus85wfxk3r496cgawse6vruy\", 5500000], [\"mmx1fm0j6pkfxsjeufdcglg58v3veay6mn2x8qp45tevkxfny696kewsv42zg5\", 14250000], [\"mmx14p5y3gn5fl8t5jt0twe0l68jwe9n895djrg8lkk55t5rdupggf0s8l0kd9\", 248750000], [\"mmx1ft660k7cfrsmh5l4twq3xxwqzauhm2cuz0cygd087pvl3u7p33sqthpl7w\", 32500000], [\"mmx1l52feg8wshacztsyf6f77ndq44qp87tdwns9wdlxv3t4uej08fssuuwng7\", 23500000], [\"mmx139j94tjwh6m9mnxdej2j2nkl8xc5ghzvt7fvz9pah7jvfxnhdassm4z56g\", 201250000], [\"mmx1vj9cy7vtmpzslkenxx9nx3pfsq9uuk0krgvnf5efetd3jxjjk4ssulv7f9\", 500000], [\"mmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym\", 166500000], [\"mmx1652t20n0jwl4mn8xe6k3j3zalgpuw38u23e6cf5249n3h278033q3kcq00\", 47750000], [\"mmx1edsqjgugd0hqynwa9h0gm05vsmqpse9yhwr85eftrxyu6ww0la3qf9hspx\", 5250000], [\"mmx1kfacc8swpse06qz30mlkefhex6an4jurgmrrancxyan58xw9w93stpsf7y\", 12250000], [\"mmx1mrmnxtc9vwjkgfst6z999x42wfuwl0ywnwn0rgyvypj6660l093s6htasn\", 17250000], [\"mmx1cl8r0pfpp2q8fmg2jjk52q8dvhnmf26vx0wwms00ty8xl4snhf3sg65sm2\", 390500000], [\"mmx12ykrc525ay96yfq0aq92vqmc5kqpnalxa0cmhy4x9sqlrvklh43svk5za5\", 1500000], [\"mmx1tgde3wpspejv0gq70lqe54l93n4mrdmrp3xt3ts4q96keddyrfjqe0e0t2\", 7000000], [\"mmx1f6khu080cft3c9g5l8qwqh2wlza8473382h4gwursgl0txhdadjqn2kzv7\", 15500000], [\"mmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t\", 237250000], [\"mmx1eghncmcx5lurhs30meac277fx0qrkeugexm75ku3jwfeejhcpajsyx5wqu\", 12250000], [\"mmx1tl0fenlw4dgjcpx3hkahecqrxyzquszw8zdjwn4j005vvc7uy3jsgndw9f\", 5000000], [\"mmx1gxz9mgd2z0v6sr4luvnhw2u5qandh7yvl7rpxcz0d06rdfa7s9js6w6p73\", 17250000], [\"mmx1uskav6veu3nxfxr4zs6efdk8yth3tuz55zptp56rf62t0ftwy4nqpvarja\", 203750000], [\"mmx1wsnset02rd5ksettxhpf2uzw02jszrgtc5960v002c3cwdg254nqekqjen\", 11250000], [\"mmx1y33f8xs9evumw58unlkcdgqudwzrjn5ftk52w0p03277mqvnw4ns05ferx\", 250000], [\"mmx1vxygt3x7vzn9fdyz2rj0jk6xxelqedgfs6v2qhvlrfjy3nw3pp5qckwxcr\", 121500000], [\"mmx16aylfh9g5xtm76lt954v7ntgwts3ldppg5a2ll0uw6sd9fklge5q7cdqk7\", 15500000], [\"mmx12gjuxcdsh7ppxmc0632zwlegm9wldzy9zp4v2skf60c9s705k35qy04laa\", 70500000], [\"mmx1f69lleyu3cznmnxlp9xznjnr84xrzutmjjcl4nlsfv2359fjze5sz787ay\", 2250000], [\"mmx1ffrdjd4ccl6ga736hz3ran0xl8k9af5xf9ae28hqjg2fhugfdf5s4q8qr7\", 10000000], [\"mmx1tcwemyrrzd62wrh8ff3kn4z3hr0dts2waxpxwfpwg2jau2tz0d5s0e3kme\", 6750000], [\"mmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3\", 194750000], [\"mmx16s93fxx6cap0rv6kx8dcc7f6syuymvjdqj7l3j0yas3qhhxw894qxgfcx3\", 17250000], [\"mmx1xn5hqxpphvuapka2kmg6xhsserajjzd48v7fknldems5amkf2a4qf0g2j2\", 68000000], [\"mmx170qark2pk7xpjwsrvm4w405pxtjzwgvt3wtygu82a8t02rwan94q4r0vws\", 250000], [\"mmx1ddxwuakc6p0mp4yzx3e9rzt6d6xtkvlvfmqnz6nx0umd2y9kc94qsyt8pe\", 3371750000], [\"mmx1yqycann5zs9eupjsea76ahp5h2h0d52n6hqxvd0v3whezr0wre4s3zku4g\", 750000], [\"mmx1l3p8ljlzzs2kzr2d992wmj6ru5t95azef4cfnp289zgezfppg34ss5pch4\", 276750000], [\"mmx10pckcllf4w09gz5uup0waprsh033cmq28e24gnjlcpu54y6nwp4st3su3r\", 2000000], [\"mmx1fp4266lrf7weqrkc3vdm2d29wnc0f32q33sksnfnhagcshq6ka4sav8d2y\", 17250000], [\"mmx130vvjzlqpd3dx33j5dvvcwxd2ry8vtx2xstahwpmshpwekq953kqh5r9rv\", 8000000], [\"mmx15qq0sdefrea28hhlhe5er0vur347vztfsezj76fapg4wf2nxaekqqxsy66\", 180250000], [\"mmx1n0a3t40vv5kdgfnduj82kzw9ewy3tu5utszgxhkztdvqlu8xgdks8nyh2h\", 10500000], [\"mmx12hvena2t6ame3sh6xu2l3fs43qq9t7djnlt00jjyssj73m0e5eks4f5vcc\", 41250000], [\"mmx129hgzhuh484dtlgz7y2r4dmc64hqzn4680z4dg8qq2gtwymfm3ksl283x6\", 86500000], [\"mmx1a2ytmujh3evrw2r8ljq6alul6drzqlrpa64ae9f5xp38kecen3hqcruxkg\", 757750000], [\"mmx1n39lrqg4kq5ey2tnk3wlqxylcuflevkkt9wffj9x2fsygma8m9hqntpsry\", 4500000], [\"mmx1qvemldmglge8tr2dcwnr4gqam6vkal5dkc2jwsz2jyyy8rhry4hs58hvrc\", 42250000], [\"mmx1hpt8ym8h0wk67hyjsa3e3ndncgk2p6qxwam3nrz8pzuyj42rj3hsm5pu7s\", 12750000], [\"mmx1au96n6nrcskxc7wqedekzfmef69jrx8vlws79ypnnhuhc9hgk4hs96y2s4\", 96750000], [\"mmx1av5ws5dp8xkwp08g3ge4fsmr5r80c7y88p8yru7rcv3gsvnkcahss2pygm\", 32750000], [\"mmx1lrlfmzwanfkqu3cg5c98w243du887xx4plshxezc8ljhhcn22acq4dzwew\", 5750000], [\"mmx1kcrktqlr88979xu79dxq5slh3xkvx727j8unxhev9frl8rhw09cqqnl6r3\", 211250000], [\"mmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60\", 189750000], [\"mmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj\", 160750000], [\"mmx1csmu30z07zqudtna93hqlstcmuzp53kalmsawt0wq58l6d488fcs8fjcjx\", 500000], [\"mmx14zyrz6re7l4j2zzc72mq8w03vlv5gwvwm3rem7yalq9quz98kdcs3kt6a8\", 750000], [\"mmx18gszx83xlhzj3s533m62pazj3c7v08rgu4t8sh0vs9c2leg3ldcsfgkc3y\", 4000000], [\"mmx1vkmzqsggqcqtzy9ea8rd56zx20uln52ug5q76y5u7hzjl8jaxfeqe3f49d\", 84250000], [\"mmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5\", 12500000], [\"mmx1qj5zysw5wc0qhwljrkgkvskmfsempcr8hf9zd2m9xw5dkger59eqf75dpg\", 17250000], [\"mmx1lka3j0475gzy9yk0c3lt4f9d0p8zhlcujhsfsl3f035z6fuytpesppfrq9\", 99250000], [\"mmx1tw6ur95jjmd95svmhsn4qe0vw84xeev8gsnes6d2ykauuk5xqd6q76vusz\", 15000000], [\"mmx1qaypsvtfwslrpaa4h0g6x2hh4j0tq9gh2p8dlla6rawr9r9t636qxd6s2k\", 6750000], [\"mmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu\", 26500000], [\"mmx1qwcxn8k9nxdu43ytsw0ew7wk7mmptr3ykvtenms3fsyqexg9p36sp9slcv\", 1250000], [\"mmx1rcyj0tmkrgejq5mvfjp7en6dajqh877960vdnrc9m5ujhps0df6sfsnhl3\", 125500000], [\"mmx1vk59t5awts2etx5v4jyamy9cudnea8mtl2kzk4caryc8erp6j3mqj2f6xj\", 7000000], [\"mmx1shw36ys05ppa2jn68qy5s7jl5kzy050rqdk4pz8catr2wadnadmqh275ry\", 873750000], [\"mmx15tfvs7twvmtvpp4zvgpedz4suysu4fa88zuzjyj2yjrkpscme9msaye6tc\", 341250000], [\"mmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g\", 105750000], [\"mmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v\", 6031750000], [\"mmx1gpscz23fjv9fw32s3k2g4enc8k0arasszygjz929kmkp96a2c4us8hqqny\", 28250000], [\"mmx1e38wzhjm5442g2z3xk73paugk479863f3y4q2j0c3yprdw50fpaq20njlr\", 250000], [\"mmx19jlhmuspu5xz706c63vheckjl6z7qx9ne5rg9r7c2tq4vj8rt9aqj60yvy\", 36750000], [\"mmx183ajctzcp95lcx2zztjk58gytyzmrlsdljna6lhedqj7h3jn04aqu3snsd\", 505750000], [\"mmx1hd5c7v7542hzr9j3ac3zx29d4eglxyq8c38nrqvuzdsjn206837qehjl0m\", 93500000], [\"mmx1a7mtekvyzh5f0uswz0pzqq6lys66ta9eavjyk66w4kgrseej6p7q5savlp\", 5500000], [\"mmx1tgppefepecrczwwad3zlvcwhuujsyr63gh8mv92el5yy8egzk97sdqpjp8\", 18000000], [\"mmx19j0tzeawmjma763dj027q6c0up4a8z6leypc7htgpxwnk6wr6d7s8est7d\", 61500000], [\"mmx1xdrf8vw7nl5e94grks7u3h7uxaamgeuv3s30h3mfr560td6rqdlqj2svmq\", 91750000], [\"mmx1fxxkthhcqf9ryfljy8xr9dcw4nq9q6mfetxx0dyqwq7qkv4vf4lql4qzgx\", 134750000], [\"mmx1450fn44pv09yuetx3yp9vtvx5k3amv89vycq0f0dvugcvp6zedlqsw05p7\", 20750000], [\"mmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq\", 75750000], [\"mmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc\", 86250000], [\"mmx1j7ns20cea2havm328p28vxeyfdcv0yrhndl2h8735slc4u0q3fls6dz77y\", 750000000], [\"mmx13w9j9lkwrlrqttpnxp8atw0gf9x5jrq8my08m2mrugdrn2rrk9ls8k9j7x\", 242250000], [\"mmx143pxg8tpjx889uqxmczg7f7wtee3qdl6ya50dnrk7qm84h82s6qqz7dktz\", 59500000], [\"mmx1m2qrqthgwr3x7cyhf7fc97t00yszfvet9jy6x0chtqq65ycyxkqs4pmxfm\", 2000000], [\"mmx16qquaqrzyks7qpq0wv3mz4j3gdk5c0ltnutnurun8ars8s2jszqsj3wzt4\", 2665250000], [\"mmx1hsgvhawn7nz3xz6dqeu852yrnpdygf3hhahq0hydnxw25g8057qsp76xwk\", 16250000], [\"mmx1sg8mgch2566d2uncn3lew5wwwacp2femp63y4gshj0qpy9fehjqsysa3ng\", 8250000], [\"mmx1rw4n2d4a3mrve8kfwuc8gvqnszd9m68lkqsum0dzk4j4ztlq2jpqrtcpy9\", 1867750000], [\"mmx1rn0p87m57fzv5je8wu97aegkhejf7r5gz3clr4ajs0k42p4g57pqwh85wl\", 11250000], [\"mmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3\", 108000000], [\"mmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv\", 38000000], [\"mmx1u6599454hfykwc52crn3wj2symdjkqsgu9rq0u3wmwteuc4z5jpsr327jw\", 62250000], [\"mmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry\", 134500000], [\"mmx1keg2775ll23shtjh235tw9g7lu3wj5rj50ws62vnwv89p9vd07zqwswcn8\", 1940500000], [\"mmx1x39l3phj2m3grgs0ynhd26nx2afh34faue745hltpzqr0jfsr6zszzkds2\", 12500000], [\"mmx1xc2gg83p82xgxdg90kn3gud6grm4dwznrna2l6k80l8rzkg9yzzsdmf32d\", 66000000], [\"mmx1glx7a9c25wns42k936r3qczu0egjtlshkaxgv5atxpyyj2dkd6rqklrnhh\", 23000000], [\"mmx1355xdy9zhgzd8k3grndkwdff9qr8qk8raucr93praws40s27fkrsjlz07p\", 84750000], [\"mmx1knzrpleqz5ehr9j98scgy9vpzne2yg8ta3grp8zzxrxnjhwgvkrs94f6ql\", 6750000], [\"mmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s\", 271000000], [\"mmx1gkwel33sdr4tgyfq55az5t5n8fzy3thum3v03jmw3q730ee6ajrs22jkde\", 91750000], [\"mmx1x40j0p3ss44jghrx2t0yqr9gqcr36xx9pjss4vvxwj60gkfvg2yqauewfw\", 229750000], [\"mmx1lj3x3d08usvq9gdjrjvyxhzkxxjylp6qftz7pch635qyq8yjn6yq0h0xxw\", 5750000], [\"mmx18tt3u9d47tc2frcp4z20yzt2yw9fpe0kn4hsnardnlzdsj9eewyqkhaxr9\", 101750000], [\"mmx1xm27rmtx3l7a00laujl97484grv5xqhrled5q7e3awlerfhe32yscwur2z\", 245500000], [\"mmx1su0cegxxdg73yhm3xu226uj74309x9ll5ycd5m8eh04n9as7mjyspr0w7m\", 19750000], [\"mmx1pqk0hvm2lrct9uc7k534hg54538s7t9p6xewq49vnamhqs5gp79qfmnw7a\", 250000], [\"mmx1ahckwehmp72cr9rkuk3sek6zv6ay0c28tt7fkrhy5qgdpe06t79qvrjsns\", 119750000], [\"mmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr\", 229750000], [\"mmx1qn07jmdsetg4k8gqvn3wmv9kqkrhrsvrmlc547zslku4grlunw9qqllens\", 185000000], [\"mmx1avg4dzcn06t8a7hshveyekaeszh7y809jk3dneu52sx97vfal69qk30lh4\", 119500000], [\"mmx14sfukr8xrxq5rlpu0dfvvtkzdzpqyxqyygzdjg6qn5ew34ynrkxq7pxlm6\", 30000000], [\"mmx1u802gcgzhfkkggcq5l7388xz2fn9hswy7zvh74t5c7yvu9x3r7xq4d9r05\", 7000000], [\"mmx1lnwzzc8kdm0lnfezlapkh66tl59ruhn053rtsgtnd0j6qglr97xqt865yj\", 24500000], [\"mmx1s0qc9xxvasndk09qljlp5mhn78qpn0pc8qe4zg0hw38hwetjzxxs9v4les\", 1250000], [\"mmx1zfqclk23ys7v98ck9ewfjz0x583g94xam3qzuetw28gc6f265xxsr507pc\", 7000000], [\"mmx1499ujt570lt5yjmvrm7j6xqpvhlgw7kuye4lrzhfz8p724fp4zxsx66pgz\", 32750000], [\"mmx1uyczs9n3942y28h6jw6dpyfqr99xlhdr2r8qus4907lr2srtuwxs5cchgz\", 675250000], [\"mmx1t4fc7yf2t0txxvqgnxdmhxnnd3sw6rcq953z2up277ssl5m0yz8q9h9frn\", 750000], [\"mmx18tw0yyc28wuqes5s80nzzh8dsax0rkkpqa4jpcv3wl0t83vf228qd04d9p\", 11250000], [\"mmx1jpfmyh0ndxwz47t3d6xrdlkd0mq3nckuasn8elvjfa65xtzm2j8qamxfuw\", 380000000], [\"mmx1w7dfqwgrq4v8uyg2kpcda5ec44hnvdeww48zysxue2mttd04tz8qdpt88v\", 6297750000], [\"mmx1cx85le3wwhvxmvhapwdyp4tyu875xx4r0lxjtk6rj0dhgwdve78qru9tfu\", 41250000], [\"mmx17pw8cskjurc9p2503yns2y3m8uv8t3slwas2d9fav6e4xg27ww8s4j9na5\", 500000], [\"mmx1fglt4y8vdcq2errqju4qulnmcfl3he9nr09vxqke9hl805tcnw8s2039u6\", 51250000], [\"mmx165nssm0dfafy22f5fgr8ln543g7gjgwrmxmdj5w5arjwma2k6kgq700fu7\", 48500000], [\"mmx1eavt4k3qfgc30z5wqtk99f93fq8xhtr82f47v6r9xd266njaqwgs56207d\", 3145750000], [\"mmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap\", 252750000], [\"mmx14w3wjj7c7d5w36frrsvjxy0xsuy4nlnufdxlrhuxzrz9xku5vjgsklvpgu\", 250000], [\"mmx1urhh0ud9hrdzf2x4883wg7mgqe2fztfcnjehxz6kqujve3hn37gsn3f8qr\", 605750000], [\"mmx1wsazxs68mvqe2j0gcpfaqwczn0277586r60vkap0gpaklcyhakfs8wztsk\", 26500000], [\"mmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn\", 824500000], [\"mmx1afqzsqeqaesyj35ugd2r0pt2x30u98uxvxr4y8u4as690zf3kktqfee809\", 1250000], [\"mmx1athk4etg0d9t8q9yy6s68vuruchxsa0pz37pdgqfsc83nckdmwtqlfdk4a\", 42750000], [\"mmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05\", 145250000], [\"mmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg\", 355000000], [\"mmx15n95rxf5c58taud2x06sgpldy3mazdyf2lf8cemmezp83hc5nzvqp3l3vr\", 188000000], [\"mmx1vpg8kftakr3pammp86a8hxyar9s0m54w9j4m29d9d6rlk9ztf2vsl7ck38\", 81500000], [\"mmx10c7skd5pzvrclcqfemg2nwk0pnpeh6p95aucnt04z3tjhpl3f2vsq6wzpg\", 78250000], [\"mmx1l6yphrjzvuc0tefqug5zs9eh3gu4fupq6e8ncgsr6mrek2xvvwvsf72r4d\", 12250000], [\"mmx1mylh2r9352klltxhjqpfj5jnfll6uqfeqp7xunarlg9cqufrhjvs28jrt3\", 113750000], [\"mmx1hvdake6jsnu5qa92un6ucw70jsa89athx8egx7507eqjk3s9ujvsmzmgd4\", 16250000], [\"mmx10lrzsfeam8m8lmrxnhzd2zn4kahtkmnthd0nhytstw52s92d0wdq7x0824\", 691750000], [\"mmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch\", 8750000], [\"mmx1vyedt4fgr8vw96qhx2hl8ktptddm68wzs7ytcvwky0et3f2fqzws9gpj63\", 500000], [\"mmx1mq9w9vnuae4fdmn27ceh3h9wzaygmhf0c3sqa7xufy7x0l87zwwsdfm80k\", 2000000], [\"mmx1jxl5gaxtd8wnc6r9nxmf5s748ct827cpjafdefw8rgen75lyxxws4u8a45\", 18000000], [\"mmx18ee0whkd2pk6xymy9sz7a9y6mmcujphzqcyl659fxz2cdr5ln20qkd3wav\", 19000000], [\"mmx1lhqhhwzvn5y7kmgeenjx9k76pq4nnmqg4hffvar8tkns7qpu6z0qwatcyn\", 16250000], [\"mmx1rr569h8enxr68xd8jzyfplt0xwwqcghkhg2eqltyj9jqws4du60qsagq0s\", 4000000], [\"mmx1wut7pf5v32hpylz6rxmrsztxfhskgxp34cgt8vawu3xqg6y8pj0szay6tj\", 16750000], [\"mmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s\", 113750000], [\"mmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn\", 7000000], [\"mmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp\", 205000000], [\"mmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map\", 392000000], [\"mmx1cg9kaawjp23h0kxj2ggx5s90c244wy0lsyxp0ltygwgfkzpjnxsqaevyre\", 18750000], [\"mmx1flhq9y5whh5q4t7jwcu7grfsl2vac95hmst4ywkghajptkazz7sse7je9a\", 500000], [\"mmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp\", 191250000], [\"mmx1qpyq03vzht2uwf9pzadx3rpa8w8y7pul2he0r5y3497j29ul7x3q7ac26j\", 1035500000], [\"mmx1d48fsux0kj7empe0c6a68y8gh6f494hv6wgl7skc42ckf2932x3swcfen0\", 311750000], [\"mmx1kezjxhxk8hxk0877hsfzr93p297xqp6ga2jrgptw52fa386gy7jqs6pz57\", 1045250000], [\"mmx1d7a0q2v6qadeafuqguvt0h4a2hea9nky7dmgt7jszpkpfucu07jqwjfzt6\", 7000000], [\"mmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm\", 38750000], [\"mmx1c46ug6qnnu70477acd28w4xh70d45yw2ev62lrwkgvntdga9d7jsvc0497\", 9000000], [\"mmx1pdlh0rj93akpwww8apmpfj5awd08ew8c7c8ce4lk2cfehypgj6js7a2eeh\", 345750000], [\"mmx1cx52w3t5tr7ynduqhx9d74lnnvumfm84flymt2etrv2fkfrm3wnqmsd3xa\", 6750000], [\"mmx1xazrdyth7ctuwetm9wnhrvgq30wlqvwuk6qn7p2huy7ffwg5nznqfw69ch\", 23250000], [\"mmx1kdz775nc0jd7uqjrlgd3a7pk6w6qm75w9hw26wa6q8mr3u4m42nqrj38hn\", 53250000], [\"mmx1sr6hr6werw9vplvje6akazlplymdqlp7hae75uqxdys0z0wy46ns402jhk\", 750000], [\"mmx1x225z4p73e847du0g5k63tgfj3c3zn03z2rr2zqnm6fs72n03k5qrafd09\", 5000000], [\"mmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80\", 36250000], [\"mmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t\", 29000000], [\"mmx1tuw784a8wp38c6q3fw6jfeqy3pvd8ggh0gj9h0xqvez00q9sew5sg0j06z\", 96000000], [\"mmx15p6ass9pp2l23cja3d6xge8jq5tmpspah67vdp7hv2pnnu04rk4qd5cvcw\", 9250000], [\"mmx1lqe5htxxh8ryhstdwmwfn97yjynaym9tl3wwq2x3m52e9qgld74q6uyxdu\", 4250000], [\"mmx1u9xsdvqzayfla2rutaxkespha2xrhn9m6wn7v8z8rhj277v9k24q44rft2\", 23750000], [\"mmx15cedp5xjcxgqvwj8hctcykxa7c3hgdlc0gfylnzwmk9vhlfzlz4qhcsacv\", 500000], [\"mmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3\", 109000000], [\"mmx1rz67uawsu0vhh8zx7ezvpy4d8jhtyjt4g4au39sf4qft4sguwx4sl7kjfx\", 186000000], [\"mmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf\", 1247500000], [\"mmx1fgylxyf2ef9p5zj0d6hnz6wr7wmkgukq6zt398uk3j78nhxfu2kq05qm4a\", 250000], [\"mmx1dxxgygp75dh3p0yh6kmezeeyftncphy0q2fjws48wzxdrktsy7kscjdmd6\", 12500000], [\"mmx1la845mwntk5rqty7x33yw2t04e7njxyl3uflmfvea7lxzcwvc6ksmr3war\", 105000000], [\"mmx1htwp6wcg0g706lfp8m8zhs3me5a87kj7p9rdqvywdv3ax8lp6jhqhgkwc7\", 10250000], [\"mmx1n833p7z44rd62g0yvhlua8sv3d8wmyvrt720utk7x4vxwc3j72hqst6yh4\", 1128500000], [\"mmx1923m2hlyu8p6vwt2wvcvda97nf0cqnwm6qf6axlt6zw44gkdgwhsz90j8a\", 292750000], [\"mmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w\", 12750000], [\"mmx1yknhrstjc5uslrg7zequ278dk3j42s7ylfw5frvgjdsjzm3jxwcqu768zc\", 10250000], [\"mmx1cv94kw4ttqwzyluzql2cc4trx5mze52qx8ys2pkd7jqg2yp6wzcq0lxaef\", 681250000], [\"mmx19zerahkctf5hxcrtdh2j5xjynl398ge4avn9nl4zsqw2hs9qe7csjqevda\", 102000000], [\"mmx18h89t0y9m8cy8trcveul508ju6v3tnajz2hrhvcs8rm8pn23djesml7auc\", 223000000], [\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\", 42250000], [\"mmx1jmkx9m05exvtuk5swve9x9qe2u6udxx5h8p4w2drlu92523pjj6qsq8epg\", 55250000], [\"mmx1mh0eqru3fwsmct0aunq5eww9ffs22tscparsznzzq6tvpmg04x6qnzrevn\", 4250000], [\"mmx1sg74tyha62nx9ttjuk53vhk00248ts77s2ee55ryrcskrmuf0k6svhdwxy\", 19250000], [\"mmx12gersmcmrkq2daaxsrpk3hpelxsetf2emn4u5qngvvm9x7r6k26slgztww\", 2750000], [\"mmx1p38leegjxpafuxqcjqw5ddd2ny39ajs4hyy93l5hsr42hxhsdjmq67xl7x\", 57500000], [\"mmx14nru8xmclg23hcdvanrn72rjre93wyew7vgv7hrwtexlkx2m42mss8d782\", 20750000], [\"mmx1vw48jzy5re9pp20c9plj77lt85x0aljktkzp945fgugupsf2uxmsmuyeaj\", 750000], [\"mmx1jlzru5r5xgjs5zx5nktv6klrjvvucwpwqst908ursthn6cqdp7usf98vxc\", 16000000], [\"mmx1uq6ytg6v53lsy525m6352hznumufehsecaugpmyq36vezznyvzusmfpxm2\", 26500000], [\"mmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4\", 750000], [\"mmx1ml4nf4gxrz7yc2uymnu6xdx2ssev2q6696ar90pyz72fgp8vxj7s472hym\", 78750000], [\"mmx1us9z3c0r8a2fxex7za3vh24zwxmhw37ylna4559ulr7etmg5n27sdnhpfa\", 250000], [\"mmx1q65hf2l3zdkl5hgvl38syuul0q0nlnt0pn69nqf7euqmxqelqwlq8eskrq\", 913250000], [\"mmx1fgxwy76pzglmqdqxuvv3l258233900kkke3p0mf0gaztjwmxq2lslppuqh\", 33250000], [\"mmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw\", 303500000], [\"mmx10f5xfpvgmx2lkulkqsf50lvafdwwatmdnjwvqh8kgcyexanrkxls49v67d\", 2000000], [\"mmx10px4lhql09zw5nlgn8m062d8zw0j6f75acpf000grqxsma5sg0qqj2d7ns\", 760250000], [\"mmx1argmcrg9rau7m7xy8k4e0s3xw9j95w7upuvpt9hlpz6epj6jhrqqkrytm8\", 9500000], [\"mmx13r385uxl5qm5dgt029l3crxsglz6g5t3sd3yy2metys0efjlzmqsl8aevk\", 12000000], [\"mmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu\", 85250000], [\"mmx1tsgysdg9v234m6nftjx4fse4a9f6c55ck2vstd5hau6kkrzzfhpqc9wkha\", 34750000], [\"mmx17dhvxq6fekkfqtvjwle2pwcyr6f76uhz3vsq6ldkc9r0uzs7nrpqvzh7zs\", 3908750000], [\"mmx1sdg5chqm4y225lmu35pj7ju58p85s9y07a94dke9cs2yq7caktpq5nq7da\", 1000000], [\"mmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99\", 37750000], [\"mmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0\", 2864750000], [\"mmx1ln8cwt5hwwd5l79uar8gt20njcl3vzud6m00lxtzc0uecq7zvmzql5mhez\", 15500000], [\"mmx1healszdpqs9ppuc2u0lkn6l6ll9n3epeh32rj2lqwcte9g8y58zq4g4pm6\", 13250000], [\"mmx128j2zgejfdmut0z3559gzw0vntm6rz2fcmhvppcgkyn9kvuekmzqkhk8hh\", 21500000], [\"mmx14hgwpw5x8zdapw4j35qclc05ajf6xxuqnwxyffszupmtvjl8wtzsp8dgza\", 50000000], [\"mmx1qymn8rdkm8gak0vst498qpkqvc7gh3l4qxt47m6plhdjlqnv5tzs8ncyy8\", 353250000], [\"mmx1l8ht54p69ynxxf0lxzrvm20956dcpk4lj22rv0jmdtefk70hurrq8m4j7a\", 60500000], [\"mmx1rs0lu6yh5uhp3pa8tl3dwz5ts392ua52kx5v3p8h5jrd0x68g8yqc6usm5\", 299750000], [\"mmx129hapqyd5n0lht763e3rm9mc23fwnh70pxeh9zyntntfvmr4f0yqejt30d\", 1000000], [\"mmx1qm7k9w4qmnqc2gufp59g6hypfx9gcvpnz5e0j25a66e4vhnztmyqn04u69\", 401750000], [\"mmx1atwce5d7s6pn27censfqkrc4qtqkh8a8ufzylnqakngeg7elutyqs7yqek\", 6000000], [\"mmx15wphyfczn8lvfmj28gkhsneg8gserwef8ergm9dxm03ngy8adnys2ypvdm\", 284750000], [\"mmx1l5hsvt7g2pydzauqhm77g4h8es27ffagmpseuks5tm3tn04n6nyslcafqj\", 250000], [\"mmx1m96tljuk8yjc9xwu4q2awulg8hrgpg0jp6d9al5dm7r2hue2u8ysphwe0u\", 64000000], [\"mmx1dh6r74r89g2anwusnw2xjwh2seuc4zuvfrxet2jzan9jll9calys05g7mq\", 21750000], [\"mmx18pyq9ckc7wykdz3wmxm5e85wsgwnwyxundkma5wxxmc98543z89q9amqhh\", 51750000], [\"mmx1xeqvfd5a63j3j7vq287dvrjxyksw628azkn8u53sc6ftd4l8wr9q40v33w\", 301500000], [\"mmx1kas9v36hhw4rzac60heh2uy9kf0wx7ed39fvhtlzqwhmr7udkl9qlxwys2\", 59500000], [\"mmx1r3qvaeqnpp5hmu7tppj3pkgwj3pm2rnsrttvzck92uq93vspq09s7jdghh\", 59750000], [\"mmx1tpyah2lre4lsclru42p8zqanwfukpu9n909p6pyrvlcd4mk0dr9ssahxe8\", 630000000], [\"mmx1znmap05s26uhhzzewpz4daz634wcslefnlchrdlh6aptvem6u09s7k75zr\", 57000000], [\"mmx1n9sl0wz6rjpnkmlwqphp4rema3ejfqeutujw0gkxncefe9hxglxs7csahg\", 4750000], [\"mmx1d8s9yjjn824xg86x5wwhvn7nnwqe7wnvdn28t64cmtp62avpvtxs9ycy60\", 59000000], [\"mmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27\", 436750000], [\"mmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku\", 223500000], [\"mmx1nkd5fyvrnu8zeqgen48aeqcnyggjxnn7dctfddj7m2mz25alrl8s74wqvz\", 75750000], [\"mmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92\", 652750000], [\"mmx1q3v3z5txguskd6r0nrqqm4se3u4h5xasw4plxqk4cxfyw3l7tmgqayunfm\", 250000], [\"mmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6\", 441500000], [\"mmx1j07gy44rhsg9xtaf9kt95h8jr8vq8zq40ljf38dqh4mmtkekrtgsul7gud\", 250000], [\"mmx12hhyrde0aptpsm4kssvqw22k5qrq37wmy9ec9lkru47yad4hfrgs5l3jvm\", 5250000], [\"mmx1ehfcm2ggj5hm8fe4tu5dcuxpg7u4rmedus9thyzmm09995xjttfq0u7get\", 49000000], [\"mmx1r2wcfugp9ugm44z03eed4ad0t5qhvg8ufc3p7pu40r7l5dkjurfquuahjs\", 467500000], [\"mmx1essz4a6dexpprz066dfgwslmz3p8uy73czfrlc7thy3s8w782rfsx75has\", 93500000], [\"mmx1n5w0atjthl70cnj3zll4ku3jl2w7cut8peqdkt04ck9annew2mfss5uu88\", 75000000], [\"mmx1d5zv5ucgwufjj9jg7k3suj4uup7ayp9ld2tchxezwz3fyfu7jtfs9wethh\", 3000000], [\"mmx1n0hnw7qmwehhsz4qf576s0sv5ql6kyq9afgrgmuzzwzfr03ld82q0ta37g\", 192750000], [\"mmx1w67qjy2g4pyecrdayfrmaltxqk9vpvk577harjk0qdyplrycg82s2yx9fm\", 500000], [\"mmx1vr057q49h73hph3ksrk92sy3wfm2u22g9ezklxmzrw92m7yl582sq22c4h\", 6000000], [\"mmx17e4mq3llxatljnfkdf2w0sy8mujaq4fn0q3rwdgztvh8rmlweh2sxk2xdx\", 750000], [\"mmx18vfpqpqwtt7htk5dwgd4lwdnyym659skm9ppf0sadkp5400w50tsxysqv3\", 26250000], [\"mmx1tq8ewkuuc9sr8a34eml065d45atwfq2fv5r738927rx9cqzv9mvql6x3xy\", 86500000], [\"mmx1uh4qtgqkndrp78xx4qp26dwu4wxmqe8h964n9kte83sq8h7ckrvq45zn3d\", 438750000], [\"mmx15hv295x2hxwzwtzeyypg5lwj2z6k5q7j0ts80jn4n7um9u5zklvqgelhwa\", 3500000], [\"mmx1wefvja0djemhprqdj73np8mn3v258rx0ffyenpztrnr8tvndrrvsv9aggw\", 6500000], [\"mmx1e5gsd2weaqmzszdlj4gu975s2cc2gscnrtsa9agufcgjv3zat8vs606ewv\", 56750000], [\"mmx1qnh3zw2utltxdu9mut6atp326nujr6pmxxhtryn7lq089kv360dq64mj2w\", 308250000], [\"mmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz\", 2082500000], [\"mmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9\", 500000], [\"mmx1p898m68n456q533nfjd5sa28akadyqy3dvq6tywk3jxgy7chrrwqeh70e3\", 6500000], [\"mmx1fv4dvhre9mmtldnr2t63qg5hdxa02hzjeh5hu7a3zkmf8a3ql8wqv4txd0\", 1000000], [\"mmx1rkkaqaqs8c99w2jk7xw5ugfgkcfyhxpnu8xq4g5a5fatxvgggtwsccyp28\", 124250000], [\"mmx1j6h6ans82uwhp77xnk0w6pd42c7nasqhnlvy5yfksax75l3r3mws2au86p\", 1500000], [\"mmx12tkjk987c9kccda9efdrw8xvmuqmca476czrfp0t7tdsysk36hwsdsstc5\", 250000], [\"mmx1hm4mvj4dheczz5g7fvpw4pnmrqlm0z9arhkqtvq6yaxza5ckmlws85y7zw\", 46000000], [\"mmx1d3vplkcw0pjqrpfr3cesjmvslk30p8qxhky5l4gdslclu70tql0qdqp9dn\", 55250000], [\"mmx1gr44j33n8tsjpcmstcmffup7ap9a85kz3ykyuzd9zueegz37xh0qql5jwm\", 63250000], [\"mmx13s89rmpg2vlars5nktpfh8mdjahkgzyj96mllj3zuj66zqx28h0sfmqk0k\", 750000], [\"mmx16hvwy7xwv9wxf64u0crk72d7jceqayjtk4v25xken3psfswrfhsq469ftu\", 500000], [\"mmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt\", 31000000], [\"mmx1u7me3rp6kmfs57wzytrxjh843sypnl0l27unk0c2pzkuuhjhy03qfwcyqf\", 1049000000], [\"mmx1rwrvyjx2e6q6frgdmlcqlj565unwz5atsxzapdfpdfgc3pjc583qtxg496\", 6500000], [\"mmx1e39hfndd2x9atrmkyjjlcdn7j3f09cqne0klatnxqhhgqaxmkn3q4f9fd4\", 10250000], [\"mmx1q4nnmgqzs9lctpsysetvergsf6enfkdqvv6k6t3sedz00whpf83sf8dhkk\", 1000000], [\"mmx1nh8ca5vlqrtwuuwrk4rm6yc06fuxgxgspdm3cflj9y6anlv3r0jqp8ygza\", 67500000], [\"mmx1ll2yar6vrsv84f5qdwfvh8tv80qlmkxdlr4ddqpmpzncqrgjghjs8s573z\", 7750000], [\"mmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s\", 47750000], [\"mmx1w29nsej9nxdsd498gqgymhhkc5e3enf4tg53a8lrnecspxu6aljsle96lx\", 1500000], [\"mmx1vlm6nlha47hctqvcqyz8uqfc64j8h5k2sgjmkk92ysm2k9se4hnqqldyu5\", 1000000], [\"mmx1kklq024f8w5p3963qd3ac3dz4a03l8g5ejnhqwqgqg0eq0p77hnqmzjuut\", 415000000], [\"mmx1agcww5z2v6ctey3elyhmc2ehfpde3n9hzcnvh9s3fslrlv004rns02462z\", 17000000], [\"mmx1re75j8gejzdje5afrkdsl9xknheax4ymznewazk5jqy4msarp05qz7qqsp\", 103000000], [\"mmx1epzfr5tjemywh43kr67esqktf43zl5z42ttzmrkgjwyh0608nm5qdxg5js\", 365000000], [\"mmx1sp3fn6wkhmsum7jjspvdnj4696wyqc2jx7deaqpxtznus65jr05sg5pmu4\", 302750000], [\"mmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl\", 323500000], [\"mmx1arre93x7eupag0a235927awagqnz28x986tke4cqfcs667z22t5szzd8et\", 122000000], [\"mmx1drhuec6ts2hz9qf8jjxmpan7zlung5anurrpxnvjkmqy87vvuh5seglsha\", 8000000], [\"mmx1x23xelewc3rzca0ad25wgczhvx7m9g9529xp98qp8zd5pgs8dr4sld97r3\", 307500000], [\"mmx1ccgy2ru9jn5a7d67w09zrgsxgv5hfxrkzdcv56dlpcraa7tkrtkqsrah8a\", 17750000], [\"mmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a\", 214750000], [\"mmx1kzultmf90j7u5lr9586l5mu3qd4xjl7h4k4yhxztms9spva8d8kqw9qj82\", 500000], [\"mmx1rkhdpgc8qsht500ty8jvzzqequalqpnk5vzvcx2rj3sr6cwfytksxwh08a\", 1250000], [\"mmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\", 408750000], [\"mmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05\", 46750000], [\"mmx18zjss5ccnhyskugrwlxuy935zn3vz7ns6gyqg2cj8f3r99av9mhsck4ne0\", 647750000], [\"mmx1nmya0r2ytqy66sqs3kxctpyd6sqcklzdqcyx038d8c2geysdmhhskph2up\", 750000], [\"mmx1333g7ffyguql8wdurnqmspwqrvrsf43647lt7wzatnanzm5xv8cq4q7mg0\", 500000], [\"mmx1e3rlxd6da547vjhdswqp05z6tzx50afnmytanvjsuulmmd36yhcs4e6pp3\", 1462750000], [\"mmx13l7yln6mennhvfx9celf99enpdgtfe7qs8dmr4nfr06prcfmz0eqsda2ae\", 4250000], [\"mmx13xgvpxumznaqj5mkhxc493nzhc2kf9w3ks9z99eaznesjrsln0eqgwclyq\", 64000000], [\"mmx1n9k3yluqcmnwz5wdk3dclgs6uq7yf4g4tvahh25jl3z4u488ttesnf2kkx\", 77500000], [\"mmx15deh8dkm0t4arjta6f2z07uzgvh49r3mnltm39hp0aeth0vc4mesdzfdfe\", 11750000], [\"mmx1py700x95hshs4cuzccjshmt0eaen0psw2kmhpv0tmy7lag9wdh6q58puuy\", 11750000], [\"mmx1gg6twfxusn0xlnnzzfju53zzwjecm6jkr5r936favpxcjz9d8r6sp3spdn\", 65750000], [\"mmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t\", 44500000], [\"mmx1fxscvs37ax2lac6xs4tz3ygkwv3nh2hnrtrx7r4fej48708xplmqlma5lm\", 170750000], [\"mmx1z9p9lvrqf92x2lluafdyvrz3xjnrvag9wl7lhr6tfkfc0phzklmq8gdhzn\", 250000], [\"mmx1prxda0yejv5m4h6y4pgkzmutaxrd96zsnqss6aq5az6609dzatmq5jnv0e\", 431500000], [\"mmx1tfn2vhdwrfuemr5dspc53qrhh2qek4amsq38j5d0a6sj73fdyrmsnvjrqx\", 47750000], [\"mmx1r0e4s9r8jqvuvznv3vd5k4pfa5ahzgyn6lrgchwu4mpqlzgsx8mselfar7\", 193250000], [\"mmx18asaxgn4dcswsefcdwx54kldattux7l0yn96fvmndrpqn6adsluq3ffr8x\", 500000], [\"mmx1t9g3q5fahh5zpsqw7hnlm37mvmty3vckn77cfepfpt23jw9k4tuq7pqy52\", 54750000], [\"mmx1j6nsqqj2g4cvdgf3r3y7e5f3wwvgyu6gh0e579xd2jsn0garhruqft7myr\", 713250000], [\"mmx1xj8utkqx9a2m3wgt4pe95z4jh54xgsl5gtdfwxqfcg823stkplus3fv5r9\", 6250000], [\"mmx18pu3yu4a0zatqgkph8t5pz3n4jy7hq2x9f348yhwafvj4wd328usef7aw5\", 31250000], [\"mmx18gzhlxuaafa5rqxlyrzn8n6ldud65ynm5tujhc0ql87f9myx5musf6wuje\", 425750000], [\"mmx1v2xtpyjklr994zu0a5hq84azaxyjmlnyz3shvt5fn0rf8nspdraq56jpgw\", 1000000], [\"mmx1csleu9q374crgsm06k0xq2n0vdcufm34ahz3lww7kmyt7ukj38aq3ta9sv\", 8250000], [\"mmx1v8ram2hhzshqs55splpmpwsscfz2m3z35ajssnasm43jgmf7h0aq6sfx4m\", 49250000], [\"mmx1can6xxmz54lhtrm53udpehkn6k6qspudttf9pdpg9evccj9hmhaqufdqfs\", 2250000], [\"mmx18dkl69sxx3wz5u69s59lp9d02qj6czg8h6yv3fzzfk7d2f2dqtas9dls85\", 119000000], [\"mmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q\", 2500000], [\"mmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f\", 6500000], [\"mmx1n36ek4z7vprh7xucnje6p5sr4s9mtr0ml9a3wz6xd2kp5v3hunasjn35t6\", 1341500000], [\"mmx1gz8zq3caexftrf8f03l9pg694s4zy4t0cacz5mq0h7u7ge86yt7qjlumup\", 13750000], [\"mmx1rfkx4gam8z02m09k5am29u2nyn62wlc22f0fapkqra6ckxspnn7qa0d336\", 10250000], [\"mmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t\", 30000000], [\"mmx1xrydtrhnl89x5dtqpwape59f0t246hhs38tl5d3pzcamfxh65llspr5pvc\", 62500000], [\"mmx1zm2yrzm79wn8lt7uhvaxjy0mcezkxdjujcru9fwnwczl3y5r4hls79m9l2\", 580250000], [\"mmx1xwq2revzzgwlq27emrpfjmskmr60q7znpayenjlhuh08f4vxcrlsm99vzk\", 35750000], [\"mmx1nhs4hestsaxqu42gmrj94lp8klx286q7ymp6dh2cgf6xg6nd6hlse9z9w5\", 1000000]]\n\nfor(const entry of data) {\n    entry[1] = entry[1] / 250000;\n}\n\nconsole.log(JSON.stringify(data));\n\nconst sorted = data.sort((a, b) => b[1] - a[1]);\n\nfor(const entry of sorted) {\n    console.log(entry[0], entry[1], entry[1] * 0.5);\n}\n"
  },
  {
    "path": "data/testnet8/rewards.json",
    "content": "[[\"mmx1aepsfj9c4nqqcew5qk8rw5sqqkwer5pnmwx9y4elcdm9gy332vqq7flngz\",49],[\"mmx1grznkf6d33xtkhee5899xa2jg8v3ktupude206jt7pzpmxgslgqqxtddgk\",1],[\"mmx1j7njmgtzmqr49n9lyacawww0uv2sjgxs7d04xu2ns6k62hfqycqsh33u92\",50],[\"mmx1k9lslhl4wmhs7ray9lfh47cxkz0j5vr827vypyaltsq80697xyqss2gn93\",99],[\"mmx1zvgs9rvzul3nflhqmtfdu8qpa2aqnqwxwsaatucsulsv5dd4svqsed4fyf\",21],[\"mmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx\",380],[\"mmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt\",512],[\"mmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl\",349],[\"mmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al\",270],[\"mmx1544prt4r26fm2f6ytlvdfe3j6mwrs5p479kp3lcrz5n58kp8ugpssn2z2u\",110],[\"mmx10gntxs6zapmxesqh6mk5ujdxyvkada4r9pg4pcw7s6rlr88yvyzq8hsjzd\",302],[\"mmx1f3ecr58txvmxjrlhnx3nw0wg7y7zdef73gcgjfrvcf8lgrdu3czsn4yx6z\",387],[\"mmx1ezvssk3jgn6wr4t03ng5at3mccxyf6868z2kzmapnfqhuyyu2yrsa4vlkw\",149],[\"mmx1e8xldlayy2j5ptk9grrze76e5jyc8p0uq0zuslawyhqeu7xme5rsh06fw0\",24],[\"mmx1fr77kwzjzcv3xmrhczs5wwsmxlufp9kkvndch9d78fr3m09mqgysc6lnaa\",63],[\"mmx1np4pfzqpl26td6khzcfdywcsz0tz4xmyua2havtlpp452vc99yyse4wkmj\",3],[\"mmx1zqrr5qw2akhgvvxnfvl3epw5zxjy8j3930fed2agnexxjelrhy9qdrrh37\",18],[\"mmx19awzztq8wmypthv24e60xmvxzymw82l86y0sdyw5cl5ehnr4ry9smhvg4s\",304],[\"mmx13qkvk6325f25vdmqc5xjq85q485zsgmh5pedmykg37mtt738du9s670h4n\",34],[\"mmx1tagjkz3avdgz8a5kn8kkhs3lr9lur0fmdt9zuz49h9j9vcg80v9scl8fpc\",56],[\"mmx10ew79lhecezg2ewrj8l8egjtwmkffvs2jfl8rdgxy32arecyp5xqdryl8y\",1611],[\"mmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0\",382],[\"mmx13cf0qwyp3zg6gqnkcupez7zfnwht6zpx3z2chq4erzstzypxy5xsycnjhu\",4],[\"mmx1q5kdfkldkc735p5e7aj6y5y0szvhml9nchux98cfqfun4wa74vxsm3zr8c\",97],[\"mmx1zeqjj69mt8a5pcgdzrukt47cpgg6nwdas6m5j6aqefxapq7klcxss8tcha\",223],[\"mmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5\",372],[\"mmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq\",501],[\"mmx1yqkentanxn7cp69sgz35j4eycq7jjxvel373aljj04a4fnuusqgq3nv5mw\",31],[\"mmx1255zy749m3fss4azm0ggj304y6l5uswd2d0rm0hgdgwts9dlfygsgnzfds\",302],[\"mmx1ed9e542ggt95rk3ygc3xt29apzs2fsx384mwhqqwy30qs4wdhqgs9qh33j\",706],[\"mmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n\",1399],[\"mmx1n04te3zvrvfsgmvzl3dzegpntqeqevwmd2ycwwwhng0hwslxkyfqpq2ng5\",282],[\"mmx1uwwzqtkhs2gv6gfja6hh8p2lhxtrv066umxq3nkccfqs4g3re5fsz9y55s\",1027],[\"mmx1h8thwkuhp0jnlr99ntwllhwhvp773yxufrcuwsh9q52vkrfcdy2q934mmu\",338],[\"mmx1uw2mjnw6zt8t0r2w0afqu3zw7jkjl80xjwnfgk6cx7m2c9u5052q6m24l3\",65],[\"mmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq\",2415],[\"mmx1els3e8hj2jvteh7y2xgwwxwq2uknurtkp63ca74gcuhrcajpzc2skqmh40\",295],[\"mmx1r8mm9d0q88dr7dw0v94yl0cthpr560r30x90zxcutltxcck6xq2sm3yx2k\",2],[\"mmx1q3nqrhd9uyjcls6jyj55x4wcnzlfd2mtezfy0m99gd0qt358hy2secef8p\",1],[\"mmx1gcrf27d3pmwese0hl4ewnm7xjcwfqm9e789mrax8lyqq86xtz5tqrql96z\",3],[\"mmx15spum2ccvkzj5zg32v0qzy9xhhafsa278ujyq20m2yhwq5lpxstq8ghswd\",205],[\"mmx12u3ppvj9yvh6xs36zscus50m644dx8ywqq530w3jkjhly8hf3qtqy6fe48\",241],[\"mmx1axrdzlwdpczy66khlgcx6zffrury8z6jxxapeygehz5djt5cpyts2mqw7f\",586],[\"mmx1gntkqf266vrn7swllylnxpaayt7n06yqxhxjsaglkk8fzds4xuts4gwjsw\",70],[\"mmx15w4ytftzunx9ues8qhk3z8wmrmtgcg5n88axzk3c8qwtzr3n8cts3hnhj2\",83],[\"mmx1jr5hkhp35t05c7g9jxfvs6wz2all566kves6rx5ckl57pz7mmvtsemw7kv\",5],[\"mmx1e0vmg4kc5ed5t85p2gjqrgql8ujrar0t95n9l63xnmkacgxv7gtsum8x2m\",102],[\"mmx1mtug0wju96l4p08r2452lnllej28stdrlpz9p7qc3vlfmj888uvq0zrzhl\",105],[\"mmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm\",114],[\"mmx1er9czf5xeu2wnpjeg69hhttxppwkpt0hmazpclhgjha0nad6kyvqeus2pv\",16],[\"mmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9\",866],[\"mmx1h9l7sgtnyagj2zctlj0xmmn7275uqpss2dn8funllmgd7aj3auvqv0fy7q\",5],[\"mmx1arwca695tyd8rsgxx8r707xpe3laawcv3lq593hs4qz9zehlngvsz68wh7\",90],[\"mmx1f4msx52tgjn7wwetqyx9e7jr63krs2ut8fx0n5ufqvp6fncfl5vswzueae\",496],[\"mmx136s9temfus3xkgz3ftwqkrg3kpw3nr67088u2ckhkfvazqknycdqe09z9d\",730],[\"mmx1humz3m6yfc5rrf9zczyjkptr7snre4e9slypuwhhgsn9eh952yds80u466\",98],[\"mmx1kx9uarw6ld7w9nmxytejkzs8q6r5376cqmtlxcd78pf889fwfqwqn6pk5f\",11],[\"mmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c\",135],[\"mmx18gm4fpvhyu80m262mptx9y4l6apdlwrsecfye70n6rslzuwmqqwspsnw0w\",549],[\"mmx12wfqpxsx0gxlrufeptynuvwt4fn9wqflp356l2sxhveshsrkrqwst4uwh3\",87],[\"mmx139le573u5rq3g7a4adydjznp86en3u5wznrlywq5k0jy0s49fvwspq0w5k\",37],[\"mmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj\",678],[\"mmx1739equ4zcj89u9dl27ssz72wx6h9wrms57s00plkzq3g4wqxjqwsk6q67c\",2],[\"mmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\",119],[\"mmx1h9p0lv7at2ahtulugvg9vdh5nkjph2uvg93uz5azp8hmmuyaj50s8ky6v6\",146],[\"mmx1lauskl8kzuwevqyx2ky8ale95esy87swemetk0zhc73ctrdm5c0sxy3exa\",92],[\"mmx15cf5205juyar33ugp9qkh4e5ne9n0ylvnyg0uf6uyymd3tgzhc0sm47jfs\",1309],[\"mmx14xms6j4un330ca6y09r8ffag0d9gsw6dgka97c82k32d0qtkuu0svjvmgs\",1375],[\"mmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn\",24],[\"mmx120v9ahac98w3rfj208xsf7rasweaesz3n7dtgt4f60upczzs3vsq6d67q8\",382],[\"mmx12hpmx28f6hf0hzx5j6z9ep8vjmpcgq5kwmaxkpagkqdfksunkgssmk59vn\",217],[\"mmx1lsgrc4ea32dg8zm35yg49a9xzanjav88wdvtvfgu28s92alec5sscmwzm0\",1411],[\"mmx15qd64czwphlu49mlj6kmxru6wdcrjny326mp5d5p0hpzhuhw65sslkng8e\",352],[\"mmx13j75773f8tfepkdjtcrpmv3djm4y7htcl2waq6spxkgtxs4yss3qfukrk6\",123],[\"mmx1ghyal08f7r0p3ft8gywyr24p58jhe9fsy0xmu6wwfjuq4z079q3s36cu8q\",150],[\"mmx18tph3dn7ahfs24zu4lnlhrn9uk35s6fd46x58jf2xq3wzdw8ygjs5eamp7\",211],[\"mmx18xxcvsm8vekqk6hy2xwx7aen3fwj6us476auqvce9kyw49ekfcnqk7tcwp\",2],[\"mmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj\",2],[\"mmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf\",803],[\"mmx1fq7a0hk0kwers7ymsdm9wswa7qes6fyw7nzguz3erm5j2xd4eynqxxflh2\",4],[\"mmx1dwr96cxjzyc6532h2gjagegkm58ns4fdrwj6muhccgxn5ysuqg5qn9mzn6\",2831],[\"mmx1m6dwm8wvtthgngztjnw7r0g4z9s8797xa7hdzrj2zyajctgrpc5qx2zqg7\",252],[\"mmx1tw7lny4cxss0ks67wxz272y356nvgzl2ff6stee4x0muhr9zv55qs85vdy\",107],[\"mmx12djy7tqtf5xmhdqhk58jkjtp3e6elekgcuhe8zr9reak29xz3c5qdqj7h6\",2],[\"mmx1n8fykdy0sk7jj8rn7fwv8awzel820mc2d9c9l959hajm8y8s6v5qayvhfr\",19],[\"mmx1rlanqjxk03n363dxgqfek0390p6pfdflm4vnf5d25kp8rxd7lg5q3sf3xf\",5080],[\"mmx17gjhpuwmfcdlymhaz9qwat2frpptev3pz2qmuq3zycj76qwnr54q40t5l0\",487],[\"mmx1pj0uu0lna9r8rgw8ccn4nj4kudgwxchv4l0tjqpw2x97035a2v4qdye8a5\",1371],[\"mmx1u4m0jmxu7avg5am34pjw3g9lwqys7vcfp6ah53w60626rywvrs4sjzl660\",111],[\"mmx109nvzs3vhyjqm3l7g72fqdxyh465fedk4xjvy2rnhfmgrw5l8c4sex2mej\",1450],[\"mmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0\",488],[\"mmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0\",73],[\"mmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs\",347],[\"mmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0\",2266],[\"mmx1r2s7q00hau24y49gdglqx9luqlgjug46del32hmfmujmq87fhqksw7emhl\",257],[\"mmx1hkmks5m9u9le0k2zmx5djjxr6eh34nyzldlnty3mzk6yhzvcevks4z2n29\",341],[\"mmx1n4n4k7wa79l83ch35r68eavnh0lkwcs3h52jt2xjl6j0969lqvhqsew3wl\",274],[\"mmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82\",605],[\"mmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn\",77],[\"mmx17s5j40067d5ugggn9ppdjg5enrxe37t0y58y8pjgnc0up25k7chq4rnaaz\",1],[\"mmx1ay2su27wuxjye9f9njdj0e7jjgxs4gah9p53upmrt4rwtv6afuhsw6awcq\",161],[\"mmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl\",289],[\"mmx1f4g8tdak9nw2waf5v4g8skt6gqqpnnlvxhx0y5vjkm0myv97svhstqzhm5\",708],[\"mmx1dm7la9qquehldy67xsfynp76p39dxa5xn4veegz88m7amspgpgcshv7dfg\",7],[\"mmx1hz0h2af4zmvnczp0twyzt8uts262pn9h93awamhc2sakdlvxvgcs8llaeh\",21],[\"mmx17gtsl3areyr6g7xscq67jl2xcnz56ekkk9stxvx3qev7hhez3ccs3juqvl\",583],[\"mmx1n56f04jwuzpa2zkl46ggs3zv989fz4yx7yyrcx6nzn9ecvpwjucsudlers\",343],[\"mmx1mhhmm9rsxk4fv5y9feft68uj4mrz2c8m33df5ts7ve6uz9xj7geqgqxd73\",129],[\"mmx1ehmcg3t88xt37498wtca2geh2r0v2tzlzagk2jp5stc3heey0vesjefjzh\",5209],[\"mmx1rx03nd8ttf02y3qz69s9xlxqhrhxtk3a5x8lnkxl3s02au2nkqes8dv836\",91],[\"mmx1rd8n5srxsgys0l27d3ym8wmcw0lr4jqf7temzz7pqqjx3knnksesgace7w\",211],[\"mmx1xr5534k53fk455wylucnrh5ap09da09jcghz7g9jg2jaarss7gesrjhu9j\",1279],[\"mmx1a2ak375lfskc6xrf6mmmc89eu3s46ywap2j7d4aj5eyeelctqy6ssshgzj\",10],[\"mmx1t00welhtn9k0hg075ttg2laa7dj7d26jprf2as70xrx2fuhjyy6sjjp3e8\",136],[\"mmx1ye76l4yxct7a2842mqa8vcf4q3jqryksu3s6xqvj3qdlaq47es6s2nt552\",62],[\"mmx1kvczf9d27064yfd7kpha95ehrvem875khnq3zadd3zjyxu78ly6s2vwwp2\",9],[\"mmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu\",271],[\"mmx1aa6383rdchx47qugjavpkcyxnpjvj6v0trml9h3ez5wlcusv0vmq0gkj65\",387],[\"mmx1lx2dgd8y94t40p55w45cdv0wqdk4m9q0tzaru9pvsq7decczasmq2l6gnz\",1],[\"mmx1vc3s0rqlmy7hrw0wr5mjfzgqx70senjwnp289x6syu9r0m58zvmsk2jl6j\",290],[\"mmx1afht99ekwmgh9s9h043aygvtl8tmytx7ymgavn6lkdxxczrgjsmsqcx3je\",2235],[\"mmx1w7jnglje4j85z4dv4z6gpmwagqfcgpg7nq7dh6wu98qq7ckd7umsdq9hn8\",1143],[\"mmx10qnnual5h4rxxcmjh8ts39l28azqwjqlfz0u0gjeruntvs0zpqus0fl0u9\",9],[\"mmx1uj0qhzeguf0zayyg2m9z794nrdlk7y7pnprt4w798s5yezgxgvuslzd94k\",285],[\"mmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru\",892],[\"mmx1j2awdr9j4gun67tr7e02h6dq5522u7lkcu5ftvl90ajgf9kvhqusdze086\",44],[\"mmx1tn8khcvlnkhprvsgn7eutwlws3vn5yc4mnh85v9vdt5ze8zs7cushvg596\",1],[\"mmx1v8x90upymn830n267009ejv0xwpwmenm6a8nvx0te0v29lauvuaquh3emd\",3],[\"mmx1xr8hes0tgn95zf7y9zx6x649t84t5c4zas0cyf048rve723u9gaskvfmvc\",1686],[\"mmx1n50ufuaae6aqhxcjlw0fydmhpt4h049rfzjqtgke57sn49p34sasdhzm0c\",86],[\"mmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l\",1578],[\"mmx1m2nxpzuhfj4awyc2wnu37nhkhsy0q8spg9egnkzf3geq2kax3g7q54emhl\",332],[\"mmx1u59mc3s94cezun5apvw35vj2vnzfanjv45svwfdat84wpuefcs7qzns66s\",70],[\"mmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2\",71],[\"mmx1rdu30vgjdheh4453heuq98es6whgaskx7csmfh28m04sckxqes7ss2y89k\",67],[\"mmx1q33rhh00r0dh7fx79lp9wrmv3t5mgpx6m3wtpajmmenuux0lzvlqruqgnp\",80],[\"mmx1l5dwydjks9s84n3rr52nwggsxfnrf65me7tjnwerse7xxn868ulqfmwwyg\",965],[\"mmx134t4wf6h2ppxnxm02ejutn0va4sj6fm0qkyn0hsfx5r4a89x25lqznt9py\",8],[\"mmx173nnyxacrsmasx2v80gxpejk6ypyvt52pcgejrd6jtv7yq6rtslq6pw76w\",495],[\"mmx15v9jzpzxjwdtn8ggkzu7s5suv7kqhuw9yer4w7ngvenlgg660vlq8zgk88\",99],[\"mmx1zyldvfw2ek8a2fv5zm4azulmkth7xntmvxspud576v7awhf7tgls50qg4l\",825],[\"mmx1zx7dt77dgkrzrn25zqqspxxzr6yyhk9wwgt0lelkxeda0ac3jsls68fl0c\",1],[\"mmx1k4sqj4vufu22zxtahymvhtwmjp4c633herv8h0l2z9nm2xn7uqlsjje4hn\",351],[\"mmx14tmfx4twa5spah6u7he78hg5nk7tp42zdjsq8a25fyenxz64yfqsqdzlh6\",60],[\"mmx1uf668t2krsyfde2v7cwtwk3traj7gwrfcdcx0j72rjr84nnz2fqs83fpcs\",707],[\"mmx1ks9t2rksthddy00395l48vaqc9rmjuznw0gyuta0jxpkzsce44qs3at8x4\",244],[\"mmx1zxfqw42gfax4wm88lvy76tt6et99pmd7vdjhfehx8jnejr2fg3pqmcvq8w\",255],[\"mmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3\",1033],[\"mmx1478snw4amjfq0hnhpwl8de8yup2thh5f5uzmyu5g907az5sv6fpsuwfrma\",676],[\"mmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn\",640],[\"mmx1kevvjxgq5hn9kzlds67gt773fsytmpv9vc4cmqnxlcqnv3ftm4zqm9y9rs\",978],[\"mmx19nnl9lw7td20z9l22v8wk558mxfrdeud8ky3229utv6e50cqyazs8jhq5e\",80],[\"mmx1cta37dl4czqsz7jaz5awly9kxy6v3v3nqes56vugfrg4h263fdzs99rgzf\",21],[\"mmx1swqkluvn7gggzn48wa4k22c8edp8wdnrhnhv0c52jk569m5chprq6nefvu\",71],[\"mmx1guajyf4849dkedxpj2aqevkuc9a3u37fmg4hyqzmk4l02n37tfrsygnc5y\",1170],[\"mmx1qneuv0d6qzv8zgchxzzcmx2w5k42j4wah6k8psw5fcgw48707drsf6nvxm\",9],[\"mmx1a5x6xect5s2cgdl7rh2hxwz7z5xqecvmlf9jjjj8za58al3mlprsr5germ\",11],[\"mmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0\",2738],[\"mmx1fdscrht596p4daxkpzfunczjmurs66j65u5lc3a4q0l99k7h2ayqdvrfnq\",1219],[\"mmx1gy8npau5h8fas5er5mwtl4sqe2glvwrkr56dj9679h633mgq3eyqpvz0cg\",260],[\"mmx19mrdy4z7gndh4k3dtrv0r38jsz6c4texjlwnmzjh0z0ccnk5t4yses5kz6\",2],[\"mmx1gx8an96g7ky87eur85puyex8r24qswx5wn86r2849njg8q2hkeys8zqlvp\",159],[\"mmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c\",29],[\"mmx1zp7rs0q0dqthcwdfvpaugv6px5qylq9uvwltvq4gpepdqyk9299qhvd3tr\",41],[\"mmx19a2ky2g4tylysduh8k5ev6kms2z2m4kk6veuljjs3cq2c0r7jexqmwewx5\",2],[\"mmx1ktyudrg32h95gwzg0hfl87lf6wruuunp6w888typfdw9f52g4axqcsltyu\",262],[\"mmx1m5zcq8hazpjhxc54lk5hma3arvwtkpfgseahf79yn0ytchv364xqjza394\",212],[\"mmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj\",472],[\"mmx1que54datv9wjvh6jjald43jlhxkvcpyl7e6jaqap8ch7my7sr48q0jq38k\",85],[\"mmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy\",1412],[\"mmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr\",634],[\"mmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6\",229],[\"mmx1hruc7t3lcdz2n0mukyjh6l9dtxd9hauzegufz9f05k3yaltz9agqph6vkc\",2],[\"mmx1prlfdpu5gmy5wh3yhtjgzlth0322mcxnw2zagydw5naant6dtegq3r7mqw\",3],[\"mmx18yu63mp0j5nrxgxmt6md2y77v4n9ltyv6knvtmwjqqzty37swagq9df8mn\",881],[\"mmx1re7sxpa7fmpseg8phu4pqamqmg72qmm3e7fzx880lz79dnyltpgsga39eg\",235],[\"mmx1jc22nh8pmjz20qyyz6jwlx5crml0z7wwrrgn3p66rgpt9ay8r9fq9y2864\",58],[\"mmx1tms3d3n23j28f9agpm0jrdqnh634f3q9rgcnwsgq64yhcshps4fqd0fv6k\",365],[\"mmx1qqjqmgyqws0jk04frzf4e98ydd3pkcsfyv65g2t3lgnp9t8z4afq0kqpst\",410],[\"mmx1usc52whlhctpx08phhjzge03jy0wf2ft0y9dngzgxxs2ev0y23fsgjk7kx\",598],[\"mmx1ywen6qnhge46fhjqwxtnyapckkakzv5m7gz8339j0kzkvzeev4fsex4z9j\",3492],[\"mmx19cxxrr2c4a39pyqda7zqt0dxga6ey7gc67rvlum7ecpzpagtrp2qcakr0j\",33],[\"mmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp\",25],[\"mmx1kzfexe6m93ggzewpf7xtd6jx9g9n2k3p9n0em8zhug623tx22d2qdzqnq6\",2],[\"mmx1s4pkkycenn7e0g0y4c3sz2yrkld7m98mlm8mc67y7lj4trw5se2qy4eq5z\",376],[\"mmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5\",313],[\"mmx1m3tug5239zp7zst4qu7c7cns8f8dvel9lnjek23v2zd3ed9mmf2qzgpa9f\",21],[\"mmx105ezm538jqpj859u3ygggr9umm9nrfxrgjd20mp8j3g22yvev4tqcljpj9\",5],[\"mmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn\",69],[\"mmx1j2ej2wxexc247mxf5k90lmjcevp4r5cuuaa3ukl7ywvfq488detsgxj7jl\",5],[\"mmx12uthvnq3g2af96lc3un900pd2tyy8apf0fsqag68d7fxene639tsacu4zm\",455],[\"mmx1q3eh75hak0v9f9psa365zjypz62q8d0cwv2qrpwpj2hayfn6xfvq747gj4\",1871],[\"mmx17gfe96qhqt3ylhxxqj7x6qxjzvt8cen7s4ks6e0mt642dplug4vq652g57\",680],[\"mmx1uth7wfnyvzfy8nf56u6t5xhf085l870ytdjazm4g6ja7qmn6w9vqljj34x\",147],[\"mmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9\",1],[\"mmx1gavx8yxen8hhfy7qgkqd0jqczysw8rgruef8nt5mp2sp7skeh3vq9lx32u\",92],[\"mmx1gh9yw2ctnae2jy95gv3g70h7av7y9d2ha5dk6ehrf4nt0q7lppvs22d2vx\",1],[\"mmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0\",54],[\"mmx1evudswfffa6pru342f5hkduqhmmalx3c94clvyed63ht0dkn2edq3shffh\",143],[\"mmx12w9lkh26qc7fvw5038usc6y6cv28jy446qn07dczapjcv3rw49dqgk27s4\",31],[\"mmx1nh05jetwxuhj79j9k4wx6ujsamseykk84383jtmfcpzu2f2hz4wqj4e25c\",95],[\"mmx1d39vgf387ct682mq7ua9vlxpjs8w47ennw69wp05atf65stht9wq5hkxpd\",441],[\"mmx1nra9jrj79xztttq6hnnenveezkk9pq4w5whvlmr2nhj4s56f43wqx0paqn\",833],[\"mmx1qm77f6cv9z9ufkavnt5nll7qq55rvjx3hru8kafx4guk3chpuawqcmd098\",1417],[\"mmx10k4auqde486w5wyfajnmpl4ds6tv9x7tzdus85wfxk3r496cgawse6vruy\",22],[\"mmx1fm0j6pkfxsjeufdcglg58v3veay6mn2x8qp45tevkxfny696kewsv42zg5\",57],[\"mmx14p5y3gn5fl8t5jt0twe0l68jwe9n895djrg8lkk55t5rdupggf0s8l0kd9\",995],[\"mmx1ft660k7cfrsmh5l4twq3xxwqzauhm2cuz0cygd087pvl3u7p33sqthpl7w\",130],[\"mmx1l52feg8wshacztsyf6f77ndq44qp87tdwns9wdlxv3t4uej08fssuuwng7\",94],[\"mmx139j94tjwh6m9mnxdej2j2nkl8xc5ghzvt7fvz9pah7jvfxnhdassm4z56g\",805],[\"mmx1vj9cy7vtmpzslkenxx9nx3pfsq9uuk0krgvnf5efetd3jxjjk4ssulv7f9\",2],[\"mmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym\",666],[\"mmx1652t20n0jwl4mn8xe6k3j3zalgpuw38u23e6cf5249n3h278033q3kcq00\",191],[\"mmx1edsqjgugd0hqynwa9h0gm05vsmqpse9yhwr85eftrxyu6ww0la3qf9hspx\",21],[\"mmx1kfacc8swpse06qz30mlkefhex6an4jurgmrrancxyan58xw9w93stpsf7y\",49],[\"mmx1mrmnxtc9vwjkgfst6z999x42wfuwl0ywnwn0rgyvypj6660l093s6htasn\",69],[\"mmx1cl8r0pfpp2q8fmg2jjk52q8dvhnmf26vx0wwms00ty8xl4snhf3sg65sm2\",1562],[\"mmx12ykrc525ay96yfq0aq92vqmc5kqpnalxa0cmhy4x9sqlrvklh43svk5za5\",6],[\"mmx1tgde3wpspejv0gq70lqe54l93n4mrdmrp3xt3ts4q96keddyrfjqe0e0t2\",28],[\"mmx1f6khu080cft3c9g5l8qwqh2wlza8473382h4gwursgl0txhdadjqn2kzv7\",62],[\"mmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t\",949],[\"mmx1eghncmcx5lurhs30meac277fx0qrkeugexm75ku3jwfeejhcpajsyx5wqu\",49],[\"mmx1tl0fenlw4dgjcpx3hkahecqrxyzquszw8zdjwn4j005vvc7uy3jsgndw9f\",20],[\"mmx1gxz9mgd2z0v6sr4luvnhw2u5qandh7yvl7rpxcz0d06rdfa7s9js6w6p73\",69],[\"mmx1uskav6veu3nxfxr4zs6efdk8yth3tuz55zptp56rf62t0ftwy4nqpvarja\",815],[\"mmx1wsnset02rd5ksettxhpf2uzw02jszrgtc5960v002c3cwdg254nqekqjen\",45],[\"mmx1y33f8xs9evumw58unlkcdgqudwzrjn5ftk52w0p03277mqvnw4ns05ferx\",1],[\"mmx1vxygt3x7vzn9fdyz2rj0jk6xxelqedgfs6v2qhvlrfjy3nw3pp5qckwxcr\",486],[\"mmx16aylfh9g5xtm76lt954v7ntgwts3ldppg5a2ll0uw6sd9fklge5q7cdqk7\",62],[\"mmx12gjuxcdsh7ppxmc0632zwlegm9wldzy9zp4v2skf60c9s705k35qy04laa\",282],[\"mmx1f69lleyu3cznmnxlp9xznjnr84xrzutmjjcl4nlsfv2359fjze5sz787ay\",9],[\"mmx1ffrdjd4ccl6ga736hz3ran0xl8k9af5xf9ae28hqjg2fhugfdf5s4q8qr7\",40],[\"mmx1tcwemyrrzd62wrh8ff3kn4z3hr0dts2waxpxwfpwg2jau2tz0d5s0e3kme\",27],[\"mmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3\",779],[\"mmx16s93fxx6cap0rv6kx8dcc7f6syuymvjdqj7l3j0yas3qhhxw894qxgfcx3\",69],[\"mmx1xn5hqxpphvuapka2kmg6xhsserajjzd48v7fknldems5amkf2a4qf0g2j2\",272],[\"mmx170qark2pk7xpjwsrvm4w405pxtjzwgvt3wtygu82a8t02rwan94q4r0vws\",1],[\"mmx1ddxwuakc6p0mp4yzx3e9rzt6d6xtkvlvfmqnz6nx0umd2y9kc94qsyt8pe\",13487],[\"mmx1yqycann5zs9eupjsea76ahp5h2h0d52n6hqxvd0v3whezr0wre4s3zku4g\",3],[\"mmx1l3p8ljlzzs2kzr2d992wmj6ru5t95azef4cfnp289zgezfppg34ss5pch4\",1107],[\"mmx10pckcllf4w09gz5uup0waprsh033cmq28e24gnjlcpu54y6nwp4st3su3r\",8],[\"mmx1fp4266lrf7weqrkc3vdm2d29wnc0f32q33sksnfnhagcshq6ka4sav8d2y\",69],[\"mmx130vvjzlqpd3dx33j5dvvcwxd2ry8vtx2xstahwpmshpwekq953kqh5r9rv\",32],[\"mmx15qq0sdefrea28hhlhe5er0vur347vztfsezj76fapg4wf2nxaekqqxsy66\",721],[\"mmx1n0a3t40vv5kdgfnduj82kzw9ewy3tu5utszgxhkztdvqlu8xgdks8nyh2h\",42],[\"mmx12hvena2t6ame3sh6xu2l3fs43qq9t7djnlt00jjyssj73m0e5eks4f5vcc\",165],[\"mmx129hgzhuh484dtlgz7y2r4dmc64hqzn4680z4dg8qq2gtwymfm3ksl283x6\",346],[\"mmx1a2ytmujh3evrw2r8ljq6alul6drzqlrpa64ae9f5xp38kecen3hqcruxkg\",3031],[\"mmx1n39lrqg4kq5ey2tnk3wlqxylcuflevkkt9wffj9x2fsygma8m9hqntpsry\",18],[\"mmx1qvemldmglge8tr2dcwnr4gqam6vkal5dkc2jwsz2jyyy8rhry4hs58hvrc\",169],[\"mmx1hpt8ym8h0wk67hyjsa3e3ndncgk2p6qxwam3nrz8pzuyj42rj3hsm5pu7s\",51],[\"mmx1au96n6nrcskxc7wqedekzfmef69jrx8vlws79ypnnhuhc9hgk4hs96y2s4\",387],[\"mmx1av5ws5dp8xkwp08g3ge4fsmr5r80c7y88p8yru7rcv3gsvnkcahss2pygm\",131],[\"mmx1lrlfmzwanfkqu3cg5c98w243du887xx4plshxezc8ljhhcn22acq4dzwew\",23],[\"mmx1kcrktqlr88979xu79dxq5slh3xkvx727j8unxhev9frl8rhw09cqqnl6r3\",845],[\"mmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60\",759],[\"mmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj\",643],[\"mmx1csmu30z07zqudtna93hqlstcmuzp53kalmsawt0wq58l6d488fcs8fjcjx\",2],[\"mmx14zyrz6re7l4j2zzc72mq8w03vlv5gwvwm3rem7yalq9quz98kdcs3kt6a8\",3],[\"mmx18gszx83xlhzj3s533m62pazj3c7v08rgu4t8sh0vs9c2leg3ldcsfgkc3y\",16],[\"mmx1vkmzqsggqcqtzy9ea8rd56zx20uln52ug5q76y5u7hzjl8jaxfeqe3f49d\",337],[\"mmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5\",50],[\"mmx1qj5zysw5wc0qhwljrkgkvskmfsempcr8hf9zd2m9xw5dkger59eqf75dpg\",69],[\"mmx1lka3j0475gzy9yk0c3lt4f9d0p8zhlcujhsfsl3f035z6fuytpesppfrq9\",397],[\"mmx1tw6ur95jjmd95svmhsn4qe0vw84xeev8gsnes6d2ykauuk5xqd6q76vusz\",60],[\"mmx1qaypsvtfwslrpaa4h0g6x2hh4j0tq9gh2p8dlla6rawr9r9t636qxd6s2k\",27],[\"mmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu\",106],[\"mmx1qwcxn8k9nxdu43ytsw0ew7wk7mmptr3ykvtenms3fsyqexg9p36sp9slcv\",5],[\"mmx1rcyj0tmkrgejq5mvfjp7en6dajqh877960vdnrc9m5ujhps0df6sfsnhl3\",502],[\"mmx1vk59t5awts2etx5v4jyamy9cudnea8mtl2kzk4caryc8erp6j3mqj2f6xj\",28],[\"mmx1shw36ys05ppa2jn68qy5s7jl5kzy050rqdk4pz8catr2wadnadmqh275ry\",3495],[\"mmx15tfvs7twvmtvpp4zvgpedz4suysu4fa88zuzjyj2yjrkpscme9msaye6tc\",1365],[\"mmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g\",423],[\"mmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v\",24127],[\"mmx1gpscz23fjv9fw32s3k2g4enc8k0arasszygjz929kmkp96a2c4us8hqqny\",113],[\"mmx1e38wzhjm5442g2z3xk73paugk479863f3y4q2j0c3yprdw50fpaq20njlr\",1],[\"mmx19jlhmuspu5xz706c63vheckjl6z7qx9ne5rg9r7c2tq4vj8rt9aqj60yvy\",147],[\"mmx183ajctzcp95lcx2zztjk58gytyzmrlsdljna6lhedqj7h3jn04aqu3snsd\",2023],[\"mmx1hd5c7v7542hzr9j3ac3zx29d4eglxyq8c38nrqvuzdsjn206837qehjl0m\",374],[\"mmx1a7mtekvyzh5f0uswz0pzqq6lys66ta9eavjyk66w4kgrseej6p7q5savlp\",22],[\"mmx1tgppefepecrczwwad3zlvcwhuujsyr63gh8mv92el5yy8egzk97sdqpjp8\",72],[\"mmx19j0tzeawmjma763dj027q6c0up4a8z6leypc7htgpxwnk6wr6d7s8est7d\",246],[\"mmx1xdrf8vw7nl5e94grks7u3h7uxaamgeuv3s30h3mfr560td6rqdlqj2svmq\",367],[\"mmx1fxxkthhcqf9ryfljy8xr9dcw4nq9q6mfetxx0dyqwq7qkv4vf4lql4qzgx\",539],[\"mmx1450fn44pv09yuetx3yp9vtvx5k3amv89vycq0f0dvugcvp6zedlqsw05p7\",83],[\"mmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq\",303],[\"mmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc\",345],[\"mmx1j7ns20cea2havm328p28vxeyfdcv0yrhndl2h8735slc4u0q3fls6dz77y\",3000],[\"mmx13w9j9lkwrlrqttpnxp8atw0gf9x5jrq8my08m2mrugdrn2rrk9ls8k9j7x\",969],[\"mmx143pxg8tpjx889uqxmczg7f7wtee3qdl6ya50dnrk7qm84h82s6qqz7dktz\",238],[\"mmx1m2qrqthgwr3x7cyhf7fc97t00yszfvet9jy6x0chtqq65ycyxkqs4pmxfm\",8],[\"mmx16qquaqrzyks7qpq0wv3mz4j3gdk5c0ltnutnurun8ars8s2jszqsj3wzt4\",10661],[\"mmx1hsgvhawn7nz3xz6dqeu852yrnpdygf3hhahq0hydnxw25g8057qsp76xwk\",65],[\"mmx1sg8mgch2566d2uncn3lew5wwwacp2femp63y4gshj0qpy9fehjqsysa3ng\",33],[\"mmx1rw4n2d4a3mrve8kfwuc8gvqnszd9m68lkqsum0dzk4j4ztlq2jpqrtcpy9\",7471],[\"mmx1rn0p87m57fzv5je8wu97aegkhejf7r5gz3clr4ajs0k42p4g57pqwh85wl\",45],[\"mmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3\",432],[\"mmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv\",152],[\"mmx1u6599454hfykwc52crn3wj2symdjkqsgu9rq0u3wmwteuc4z5jpsr327jw\",249],[\"mmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry\",538],[\"mmx1keg2775ll23shtjh235tw9g7lu3wj5rj50ws62vnwv89p9vd07zqwswcn8\",7762],[\"mmx1x39l3phj2m3grgs0ynhd26nx2afh34faue745hltpzqr0jfsr6zszzkds2\",50],[\"mmx1xc2gg83p82xgxdg90kn3gud6grm4dwznrna2l6k80l8rzkg9yzzsdmf32d\",264],[\"mmx1glx7a9c25wns42k936r3qczu0egjtlshkaxgv5atxpyyj2dkd6rqklrnhh\",92],[\"mmx1355xdy9zhgzd8k3grndkwdff9qr8qk8raucr93praws40s27fkrsjlz07p\",339],[\"mmx1knzrpleqz5ehr9j98scgy9vpzne2yg8ta3grp8zzxrxnjhwgvkrs94f6ql\",27],[\"mmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s\",1084],[\"mmx1gkwel33sdr4tgyfq55az5t5n8fzy3thum3v03jmw3q730ee6ajrs22jkde\",367],[\"mmx1x40j0p3ss44jghrx2t0yqr9gqcr36xx9pjss4vvxwj60gkfvg2yqauewfw\",919],[\"mmx1lj3x3d08usvq9gdjrjvyxhzkxxjylp6qftz7pch635qyq8yjn6yq0h0xxw\",23],[\"mmx18tt3u9d47tc2frcp4z20yzt2yw9fpe0kn4hsnardnlzdsj9eewyqkhaxr9\",407],[\"mmx1xm27rmtx3l7a00laujl97484grv5xqhrled5q7e3awlerfhe32yscwur2z\",982],[\"mmx1su0cegxxdg73yhm3xu226uj74309x9ll5ycd5m8eh04n9as7mjyspr0w7m\",79],[\"mmx1pqk0hvm2lrct9uc7k534hg54538s7t9p6xewq49vnamhqs5gp79qfmnw7a\",1],[\"mmx1ahckwehmp72cr9rkuk3sek6zv6ay0c28tt7fkrhy5qgdpe06t79qvrjsns\",479],[\"mmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr\",919],[\"mmx1qn07jmdsetg4k8gqvn3wmv9kqkrhrsvrmlc547zslku4grlunw9qqllens\",740],[\"mmx1avg4dzcn06t8a7hshveyekaeszh7y809jk3dneu52sx97vfal69qk30lh4\",478],[\"mmx14sfukr8xrxq5rlpu0dfvvtkzdzpqyxqyygzdjg6qn5ew34ynrkxq7pxlm6\",120],[\"mmx1u802gcgzhfkkggcq5l7388xz2fn9hswy7zvh74t5c7yvu9x3r7xq4d9r05\",28],[\"mmx1lnwzzc8kdm0lnfezlapkh66tl59ruhn053rtsgtnd0j6qglr97xqt865yj\",98],[\"mmx1s0qc9xxvasndk09qljlp5mhn78qpn0pc8qe4zg0hw38hwetjzxxs9v4les\",5],[\"mmx1zfqclk23ys7v98ck9ewfjz0x583g94xam3qzuetw28gc6f265xxsr507pc\",28],[\"mmx1499ujt570lt5yjmvrm7j6xqpvhlgw7kuye4lrzhfz8p724fp4zxsx66pgz\",131],[\"mmx1uyczs9n3942y28h6jw6dpyfqr99xlhdr2r8qus4907lr2srtuwxs5cchgz\",2701],[\"mmx1t4fc7yf2t0txxvqgnxdmhxnnd3sw6rcq953z2up277ssl5m0yz8q9h9frn\",3],[\"mmx18tw0yyc28wuqes5s80nzzh8dsax0rkkpqa4jpcv3wl0t83vf228qd04d9p\",45],[\"mmx1jpfmyh0ndxwz47t3d6xrdlkd0mq3nckuasn8elvjfa65xtzm2j8qamxfuw\",1520],[\"mmx1w7dfqwgrq4v8uyg2kpcda5ec44hnvdeww48zysxue2mttd04tz8qdpt88v\",25191],[\"mmx1cx85le3wwhvxmvhapwdyp4tyu875xx4r0lxjtk6rj0dhgwdve78qru9tfu\",165],[\"mmx17pw8cskjurc9p2503yns2y3m8uv8t3slwas2d9fav6e4xg27ww8s4j9na5\",2],[\"mmx1fglt4y8vdcq2errqju4qulnmcfl3he9nr09vxqke9hl805tcnw8s2039u6\",205],[\"mmx165nssm0dfafy22f5fgr8ln543g7gjgwrmxmdj5w5arjwma2k6kgq700fu7\",194],[\"mmx1eavt4k3qfgc30z5wqtk99f93fq8xhtr82f47v6r9xd266njaqwgs56207d\",12583],[\"mmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap\",1011],[\"mmx14w3wjj7c7d5w36frrsvjxy0xsuy4nlnufdxlrhuxzrz9xku5vjgsklvpgu\",1],[\"mmx1urhh0ud9hrdzf2x4883wg7mgqe2fztfcnjehxz6kqujve3hn37gsn3f8qr\",2423],[\"mmx1wsazxs68mvqe2j0gcpfaqwczn0277586r60vkap0gpaklcyhakfs8wztsk\",106],[\"mmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn\",3298],[\"mmx1afqzsqeqaesyj35ugd2r0pt2x30u98uxvxr4y8u4as690zf3kktqfee809\",5],[\"mmx1athk4etg0d9t8q9yy6s68vuruchxsa0pz37pdgqfsc83nckdmwtqlfdk4a\",171],[\"mmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05\",581],[\"mmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg\",1420],[\"mmx15n95rxf5c58taud2x06sgpldy3mazdyf2lf8cemmezp83hc5nzvqp3l3vr\",752],[\"mmx1vpg8kftakr3pammp86a8hxyar9s0m54w9j4m29d9d6rlk9ztf2vsl7ck38\",326],[\"mmx10c7skd5pzvrclcqfemg2nwk0pnpeh6p95aucnt04z3tjhpl3f2vsq6wzpg\",313],[\"mmx1l6yphrjzvuc0tefqug5zs9eh3gu4fupq6e8ncgsr6mrek2xvvwvsf72r4d\",49],[\"mmx1mylh2r9352klltxhjqpfj5jnfll6uqfeqp7xunarlg9cqufrhjvs28jrt3\",455],[\"mmx1hvdake6jsnu5qa92un6ucw70jsa89athx8egx7507eqjk3s9ujvsmzmgd4\",65],[\"mmx10lrzsfeam8m8lmrxnhzd2zn4kahtkmnthd0nhytstw52s92d0wdq7x0824\",2767],[\"mmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch\",35],[\"mmx1vyedt4fgr8vw96qhx2hl8ktptddm68wzs7ytcvwky0et3f2fqzws9gpj63\",2],[\"mmx1mq9w9vnuae4fdmn27ceh3h9wzaygmhf0c3sqa7xufy7x0l87zwwsdfm80k\",8],[\"mmx1jxl5gaxtd8wnc6r9nxmf5s748ct827cpjafdefw8rgen75lyxxws4u8a45\",72],[\"mmx18ee0whkd2pk6xymy9sz7a9y6mmcujphzqcyl659fxz2cdr5ln20qkd3wav\",76],[\"mmx1lhqhhwzvn5y7kmgeenjx9k76pq4nnmqg4hffvar8tkns7qpu6z0qwatcyn\",65],[\"mmx1rr569h8enxr68xd8jzyfplt0xwwqcghkhg2eqltyj9jqws4du60qsagq0s\",16],[\"mmx1wut7pf5v32hpylz6rxmrsztxfhskgxp34cgt8vawu3xqg6y8pj0szay6tj\",67],[\"mmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s\",455],[\"mmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn\",28],[\"mmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp\",820],[\"mmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map\",1568],[\"mmx1cg9kaawjp23h0kxj2ggx5s90c244wy0lsyxp0ltygwgfkzpjnxsqaevyre\",75],[\"mmx1flhq9y5whh5q4t7jwcu7grfsl2vac95hmst4ywkghajptkazz7sse7je9a\",2],[\"mmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp\",765],[\"mmx1qpyq03vzht2uwf9pzadx3rpa8w8y7pul2he0r5y3497j29ul7x3q7ac26j\",4142],[\"mmx1d48fsux0kj7empe0c6a68y8gh6f494hv6wgl7skc42ckf2932x3swcfen0\",1247],[\"mmx1kezjxhxk8hxk0877hsfzr93p297xqp6ga2jrgptw52fa386gy7jqs6pz57\",4181],[\"mmx1d7a0q2v6qadeafuqguvt0h4a2hea9nky7dmgt7jszpkpfucu07jqwjfzt6\",28],[\"mmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm\",155],[\"mmx1c46ug6qnnu70477acd28w4xh70d45yw2ev62lrwkgvntdga9d7jsvc0497\",36],[\"mmx1pdlh0rj93akpwww8apmpfj5awd08ew8c7c8ce4lk2cfehypgj6js7a2eeh\",1383],[\"mmx1cx52w3t5tr7ynduqhx9d74lnnvumfm84flymt2etrv2fkfrm3wnqmsd3xa\",27],[\"mmx1xazrdyth7ctuwetm9wnhrvgq30wlqvwuk6qn7p2huy7ffwg5nznqfw69ch\",93],[\"mmx1kdz775nc0jd7uqjrlgd3a7pk6w6qm75w9hw26wa6q8mr3u4m42nqrj38hn\",213],[\"mmx1sr6hr6werw9vplvje6akazlplymdqlp7hae75uqxdys0z0wy46ns402jhk\",3],[\"mmx1x225z4p73e847du0g5k63tgfj3c3zn03z2rr2zqnm6fs72n03k5qrafd09\",20],[\"mmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80\",145],[\"mmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t\",116],[\"mmx1tuw784a8wp38c6q3fw6jfeqy3pvd8ggh0gj9h0xqvez00q9sew5sg0j06z\",384],[\"mmx15p6ass9pp2l23cja3d6xge8jq5tmpspah67vdp7hv2pnnu04rk4qd5cvcw\",37],[\"mmx1lqe5htxxh8ryhstdwmwfn97yjynaym9tl3wwq2x3m52e9qgld74q6uyxdu\",17],[\"mmx1u9xsdvqzayfla2rutaxkespha2xrhn9m6wn7v8z8rhj277v9k24q44rft2\",95],[\"mmx15cedp5xjcxgqvwj8hctcykxa7c3hgdlc0gfylnzwmk9vhlfzlz4qhcsacv\",2],[\"mmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3\",436],[\"mmx1rz67uawsu0vhh8zx7ezvpy4d8jhtyjt4g4au39sf4qft4sguwx4sl7kjfx\",744],[\"mmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf\",4990],[\"mmx1fgylxyf2ef9p5zj0d6hnz6wr7wmkgukq6zt398uk3j78nhxfu2kq05qm4a\",1],[\"mmx1dxxgygp75dh3p0yh6kmezeeyftncphy0q2fjws48wzxdrktsy7kscjdmd6\",50],[\"mmx1la845mwntk5rqty7x33yw2t04e7njxyl3uflmfvea7lxzcwvc6ksmr3war\",420],[\"mmx1htwp6wcg0g706lfp8m8zhs3me5a87kj7p9rdqvywdv3ax8lp6jhqhgkwc7\",41],[\"mmx1n833p7z44rd62g0yvhlua8sv3d8wmyvrt720utk7x4vxwc3j72hqst6yh4\",4514],[\"mmx1923m2hlyu8p6vwt2wvcvda97nf0cqnwm6qf6axlt6zw44gkdgwhsz90j8a\",1171],[\"mmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w\",51],[\"mmx1yknhrstjc5uslrg7zequ278dk3j42s7ylfw5frvgjdsjzm3jxwcqu768zc\",41],[\"mmx1cv94kw4ttqwzyluzql2cc4trx5mze52qx8ys2pkd7jqg2yp6wzcq0lxaef\",2725],[\"mmx19zerahkctf5hxcrtdh2j5xjynl398ge4avn9nl4zsqw2hs9qe7csjqevda\",408],[\"mmx18h89t0y9m8cy8trcveul508ju6v3tnajz2hrhvcs8rm8pn23djesml7auc\",892],[\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\",169],[\"mmx1jmkx9m05exvtuk5swve9x9qe2u6udxx5h8p4w2drlu92523pjj6qsq8epg\",221],[\"mmx1mh0eqru3fwsmct0aunq5eww9ffs22tscparsznzzq6tvpmg04x6qnzrevn\",17],[\"mmx1sg74tyha62nx9ttjuk53vhk00248ts77s2ee55ryrcskrmuf0k6svhdwxy\",77],[\"mmx12gersmcmrkq2daaxsrpk3hpelxsetf2emn4u5qngvvm9x7r6k26slgztww\",11],[\"mmx1p38leegjxpafuxqcjqw5ddd2ny39ajs4hyy93l5hsr42hxhsdjmq67xl7x\",230],[\"mmx14nru8xmclg23hcdvanrn72rjre93wyew7vgv7hrwtexlkx2m42mss8d782\",83],[\"mmx1vw48jzy5re9pp20c9plj77lt85x0aljktkzp945fgugupsf2uxmsmuyeaj\",3],[\"mmx1jlzru5r5xgjs5zx5nktv6klrjvvucwpwqst908ursthn6cqdp7usf98vxc\",64],[\"mmx1uq6ytg6v53lsy525m6352hznumufehsecaugpmyq36vezznyvzusmfpxm2\",106],[\"mmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4\",3],[\"mmx1ml4nf4gxrz7yc2uymnu6xdx2ssev2q6696ar90pyz72fgp8vxj7s472hym\",315],[\"mmx1us9z3c0r8a2fxex7za3vh24zwxmhw37ylna4559ulr7etmg5n27sdnhpfa\",1],[\"mmx1q65hf2l3zdkl5hgvl38syuul0q0nlnt0pn69nqf7euqmxqelqwlq8eskrq\",3653],[\"mmx1fgxwy76pzglmqdqxuvv3l258233900kkke3p0mf0gaztjwmxq2lslppuqh\",133],[\"mmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw\",1214],[\"mmx10f5xfpvgmx2lkulkqsf50lvafdwwatmdnjwvqh8kgcyexanrkxls49v67d\",8],[\"mmx10px4lhql09zw5nlgn8m062d8zw0j6f75acpf000grqxsma5sg0qqj2d7ns\",3041],[\"mmx1argmcrg9rau7m7xy8k4e0s3xw9j95w7upuvpt9hlpz6epj6jhrqqkrytm8\",38],[\"mmx13r385uxl5qm5dgt029l3crxsglz6g5t3sd3yy2metys0efjlzmqsl8aevk\",48],[\"mmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu\",341],[\"mmx1tsgysdg9v234m6nftjx4fse4a9f6c55ck2vstd5hau6kkrzzfhpqc9wkha\",139],[\"mmx17dhvxq6fekkfqtvjwle2pwcyr6f76uhz3vsq6ldkc9r0uzs7nrpqvzh7zs\",15635],[\"mmx1sdg5chqm4y225lmu35pj7ju58p85s9y07a94dke9cs2yq7caktpq5nq7da\",4],[\"mmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99\",151],[\"mmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0\",11459],[\"mmx1ln8cwt5hwwd5l79uar8gt20njcl3vzud6m00lxtzc0uecq7zvmzql5mhez\",62],[\"mmx1healszdpqs9ppuc2u0lkn6l6ll9n3epeh32rj2lqwcte9g8y58zq4g4pm6\",53],[\"mmx128j2zgejfdmut0z3559gzw0vntm6rz2fcmhvppcgkyn9kvuekmzqkhk8hh\",86],[\"mmx14hgwpw5x8zdapw4j35qclc05ajf6xxuqnwxyffszupmtvjl8wtzsp8dgza\",200],[\"mmx1qymn8rdkm8gak0vst498qpkqvc7gh3l4qxt47m6plhdjlqnv5tzs8ncyy8\",1413],[\"mmx1l8ht54p69ynxxf0lxzrvm20956dcpk4lj22rv0jmdtefk70hurrq8m4j7a\",242],[\"mmx1rs0lu6yh5uhp3pa8tl3dwz5ts392ua52kx5v3p8h5jrd0x68g8yqc6usm5\",1199],[\"mmx129hapqyd5n0lht763e3rm9mc23fwnh70pxeh9zyntntfvmr4f0yqejt30d\",4],[\"mmx1qm7k9w4qmnqc2gufp59g6hypfx9gcvpnz5e0j25a66e4vhnztmyqn04u69\",1607],[\"mmx1atwce5d7s6pn27censfqkrc4qtqkh8a8ufzylnqakngeg7elutyqs7yqek\",24],[\"mmx15wphyfczn8lvfmj28gkhsneg8gserwef8ergm9dxm03ngy8adnys2ypvdm\",1139],[\"mmx1l5hsvt7g2pydzauqhm77g4h8es27ffagmpseuks5tm3tn04n6nyslcafqj\",1],[\"mmx1m96tljuk8yjc9xwu4q2awulg8hrgpg0jp6d9al5dm7r2hue2u8ysphwe0u\",256],[\"mmx1dh6r74r89g2anwusnw2xjwh2seuc4zuvfrxet2jzan9jll9calys05g7mq\",87],[\"mmx18pyq9ckc7wykdz3wmxm5e85wsgwnwyxundkma5wxxmc98543z89q9amqhh\",207],[\"mmx1xeqvfd5a63j3j7vq287dvrjxyksw628azkn8u53sc6ftd4l8wr9q40v33w\",1206],[\"mmx1kas9v36hhw4rzac60heh2uy9kf0wx7ed39fvhtlzqwhmr7udkl9qlxwys2\",238],[\"mmx1r3qvaeqnpp5hmu7tppj3pkgwj3pm2rnsrttvzck92uq93vspq09s7jdghh\",239],[\"mmx1tpyah2lre4lsclru42p8zqanwfukpu9n909p6pyrvlcd4mk0dr9ssahxe8\",2520],[\"mmx1znmap05s26uhhzzewpz4daz634wcslefnlchrdlh6aptvem6u09s7k75zr\",228],[\"mmx1n9sl0wz6rjpnkmlwqphp4rema3ejfqeutujw0gkxncefe9hxglxs7csahg\",19],[\"mmx1d8s9yjjn824xg86x5wwhvn7nnwqe7wnvdn28t64cmtp62avpvtxs9ycy60\",236],[\"mmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27\",1747],[\"mmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku\",894],[\"mmx1nkd5fyvrnu8zeqgen48aeqcnyggjxnn7dctfddj7m2mz25alrl8s74wqvz\",303],[\"mmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92\",2611],[\"mmx1q3v3z5txguskd6r0nrqqm4se3u4h5xasw4plxqk4cxfyw3l7tmgqayunfm\",1],[\"mmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6\",1766],[\"mmx1j07gy44rhsg9xtaf9kt95h8jr8vq8zq40ljf38dqh4mmtkekrtgsul7gud\",1],[\"mmx12hhyrde0aptpsm4kssvqw22k5qrq37wmy9ec9lkru47yad4hfrgs5l3jvm\",21],[\"mmx1ehfcm2ggj5hm8fe4tu5dcuxpg7u4rmedus9thyzmm09995xjttfq0u7get\",196],[\"mmx1r2wcfugp9ugm44z03eed4ad0t5qhvg8ufc3p7pu40r7l5dkjurfquuahjs\",1870],[\"mmx1essz4a6dexpprz066dfgwslmz3p8uy73czfrlc7thy3s8w782rfsx75has\",374],[\"mmx1n5w0atjthl70cnj3zll4ku3jl2w7cut8peqdkt04ck9annew2mfss5uu88\",300],[\"mmx1d5zv5ucgwufjj9jg7k3suj4uup7ayp9ld2tchxezwz3fyfu7jtfs9wethh\",12],[\"mmx1n0hnw7qmwehhsz4qf576s0sv5ql6kyq9afgrgmuzzwzfr03ld82q0ta37g\",771],[\"mmx1w67qjy2g4pyecrdayfrmaltxqk9vpvk577harjk0qdyplrycg82s2yx9fm\",2],[\"mmx1vr057q49h73hph3ksrk92sy3wfm2u22g9ezklxmzrw92m7yl582sq22c4h\",24],[\"mmx17e4mq3llxatljnfkdf2w0sy8mujaq4fn0q3rwdgztvh8rmlweh2sxk2xdx\",3],[\"mmx18vfpqpqwtt7htk5dwgd4lwdnyym659skm9ppf0sadkp5400w50tsxysqv3\",105],[\"mmx1tq8ewkuuc9sr8a34eml065d45atwfq2fv5r738927rx9cqzv9mvql6x3xy\",346],[\"mmx1uh4qtgqkndrp78xx4qp26dwu4wxmqe8h964n9kte83sq8h7ckrvq45zn3d\",1755],[\"mmx15hv295x2hxwzwtzeyypg5lwj2z6k5q7j0ts80jn4n7um9u5zklvqgelhwa\",14],[\"mmx1wefvja0djemhprqdj73np8mn3v258rx0ffyenpztrnr8tvndrrvsv9aggw\",26],[\"mmx1e5gsd2weaqmzszdlj4gu975s2cc2gscnrtsa9agufcgjv3zat8vs606ewv\",227],[\"mmx1qnh3zw2utltxdu9mut6atp326nujr6pmxxhtryn7lq089kv360dq64mj2w\",1233],[\"mmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz\",8330],[\"mmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9\",2],[\"mmx1p898m68n456q533nfjd5sa28akadyqy3dvq6tywk3jxgy7chrrwqeh70e3\",26],[\"mmx1fv4dvhre9mmtldnr2t63qg5hdxa02hzjeh5hu7a3zkmf8a3ql8wqv4txd0\",4],[\"mmx1rkkaqaqs8c99w2jk7xw5ugfgkcfyhxpnu8xq4g5a5fatxvgggtwsccyp28\",497],[\"mmx1j6h6ans82uwhp77xnk0w6pd42c7nasqhnlvy5yfksax75l3r3mws2au86p\",6],[\"mmx12tkjk987c9kccda9efdrw8xvmuqmca476czrfp0t7tdsysk36hwsdsstc5\",1],[\"mmx1hm4mvj4dheczz5g7fvpw4pnmrqlm0z9arhkqtvq6yaxza5ckmlws85y7zw\",184],[\"mmx1d3vplkcw0pjqrpfr3cesjmvslk30p8qxhky5l4gdslclu70tql0qdqp9dn\",221],[\"mmx1gr44j33n8tsjpcmstcmffup7ap9a85kz3ykyuzd9zueegz37xh0qql5jwm\",253],[\"mmx13s89rmpg2vlars5nktpfh8mdjahkgzyj96mllj3zuj66zqx28h0sfmqk0k\",3],[\"mmx16hvwy7xwv9wxf64u0crk72d7jceqayjtk4v25xken3psfswrfhsq469ftu\",2],[\"mmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt\",124],[\"mmx1u7me3rp6kmfs57wzytrxjh843sypnl0l27unk0c2pzkuuhjhy03qfwcyqf\",4196],[\"mmx1rwrvyjx2e6q6frgdmlcqlj565unwz5atsxzapdfpdfgc3pjc583qtxg496\",26],[\"mmx1e39hfndd2x9atrmkyjjlcdn7j3f09cqne0klatnxqhhgqaxmkn3q4f9fd4\",41],[\"mmx1q4nnmgqzs9lctpsysetvergsf6enfkdqvv6k6t3sedz00whpf83sf8dhkk\",4],[\"mmx1nh8ca5vlqrtwuuwrk4rm6yc06fuxgxgspdm3cflj9y6anlv3r0jqp8ygza\",270],[\"mmx1ll2yar6vrsv84f5qdwfvh8tv80qlmkxdlr4ddqpmpzncqrgjghjs8s573z\",31],[\"mmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s\",191],[\"mmx1w29nsej9nxdsd498gqgymhhkc5e3enf4tg53a8lrnecspxu6aljsle96lx\",6],[\"mmx1vlm6nlha47hctqvcqyz8uqfc64j8h5k2sgjmkk92ysm2k9se4hnqqldyu5\",4],[\"mmx1kklq024f8w5p3963qd3ac3dz4a03l8g5ejnhqwqgqg0eq0p77hnqmzjuut\",1660],[\"mmx1agcww5z2v6ctey3elyhmc2ehfpde3n9hzcnvh9s3fslrlv004rns02462z\",68],[\"mmx1re75j8gejzdje5afrkdsl9xknheax4ymznewazk5jqy4msarp05qz7qqsp\",412],[\"mmx1epzfr5tjemywh43kr67esqktf43zl5z42ttzmrkgjwyh0608nm5qdxg5js\",1460],[\"mmx1sp3fn6wkhmsum7jjspvdnj4696wyqc2jx7deaqpxtznus65jr05sg5pmu4\",1211],[\"mmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl\",1294],[\"mmx1arre93x7eupag0a235927awagqnz28x986tke4cqfcs667z22t5szzd8et\",488],[\"mmx1drhuec6ts2hz9qf8jjxmpan7zlung5anurrpxnvjkmqy87vvuh5seglsha\",32],[\"mmx1x23xelewc3rzca0ad25wgczhvx7m9g9529xp98qp8zd5pgs8dr4sld97r3\",1230],[\"mmx1ccgy2ru9jn5a7d67w09zrgsxgv5hfxrkzdcv56dlpcraa7tkrtkqsrah8a\",71],[\"mmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a\",859],[\"mmx1kzultmf90j7u5lr9586l5mu3qd4xjl7h4k4yhxztms9spva8d8kqw9qj82\",2],[\"mmx1rkhdpgc8qsht500ty8jvzzqequalqpnk5vzvcx2rj3sr6cwfytksxwh08a\",5],[\"mmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\",1635],[\"mmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05\",187],[\"mmx18zjss5ccnhyskugrwlxuy935zn3vz7ns6gyqg2cj8f3r99av9mhsck4ne0\",2591],[\"mmx1nmya0r2ytqy66sqs3kxctpyd6sqcklzdqcyx038d8c2geysdmhhskph2up\",3],[\"mmx1333g7ffyguql8wdurnqmspwqrvrsf43647lt7wzatnanzm5xv8cq4q7mg0\",2],[\"mmx1e3rlxd6da547vjhdswqp05z6tzx50afnmytanvjsuulmmd36yhcs4e6pp3\",5851],[\"mmx13l7yln6mennhvfx9celf99enpdgtfe7qs8dmr4nfr06prcfmz0eqsda2ae\",17],[\"mmx13xgvpxumznaqj5mkhxc493nzhc2kf9w3ks9z99eaznesjrsln0eqgwclyq\",256],[\"mmx1n9k3yluqcmnwz5wdk3dclgs6uq7yf4g4tvahh25jl3z4u488ttesnf2kkx\",310],[\"mmx15deh8dkm0t4arjta6f2z07uzgvh49r3mnltm39hp0aeth0vc4mesdzfdfe\",47],[\"mmx1py700x95hshs4cuzccjshmt0eaen0psw2kmhpv0tmy7lag9wdh6q58puuy\",47],[\"mmx1gg6twfxusn0xlnnzzfju53zzwjecm6jkr5r936favpxcjz9d8r6sp3spdn\",263],[\"mmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t\",178],[\"mmx1fxscvs37ax2lac6xs4tz3ygkwv3nh2hnrtrx7r4fej48708xplmqlma5lm\",683],[\"mmx1z9p9lvrqf92x2lluafdyvrz3xjnrvag9wl7lhr6tfkfc0phzklmq8gdhzn\",1],[\"mmx1prxda0yejv5m4h6y4pgkzmutaxrd96zsnqss6aq5az6609dzatmq5jnv0e\",1726],[\"mmx1tfn2vhdwrfuemr5dspc53qrhh2qek4amsq38j5d0a6sj73fdyrmsnvjrqx\",191],[\"mmx1r0e4s9r8jqvuvznv3vd5k4pfa5ahzgyn6lrgchwu4mpqlzgsx8mselfar7\",773],[\"mmx18asaxgn4dcswsefcdwx54kldattux7l0yn96fvmndrpqn6adsluq3ffr8x\",2],[\"mmx1t9g3q5fahh5zpsqw7hnlm37mvmty3vckn77cfepfpt23jw9k4tuq7pqy52\",219],[\"mmx1j6nsqqj2g4cvdgf3r3y7e5f3wwvgyu6gh0e579xd2jsn0garhruqft7myr\",2853],[\"mmx1xj8utkqx9a2m3wgt4pe95z4jh54xgsl5gtdfwxqfcg823stkplus3fv5r9\",25],[\"mmx18pu3yu4a0zatqgkph8t5pz3n4jy7hq2x9f348yhwafvj4wd328usef7aw5\",125],[\"mmx18gzhlxuaafa5rqxlyrzn8n6ldud65ynm5tujhc0ql87f9myx5musf6wuje\",1703],[\"mmx1v2xtpyjklr994zu0a5hq84azaxyjmlnyz3shvt5fn0rf8nspdraq56jpgw\",4],[\"mmx1csleu9q374crgsm06k0xq2n0vdcufm34ahz3lww7kmyt7ukj38aq3ta9sv\",33],[\"mmx1v8ram2hhzshqs55splpmpwsscfz2m3z35ajssnasm43jgmf7h0aq6sfx4m\",197],[\"mmx1can6xxmz54lhtrm53udpehkn6k6qspudttf9pdpg9evccj9hmhaqufdqfs\",9],[\"mmx18dkl69sxx3wz5u69s59lp9d02qj6czg8h6yv3fzzfk7d2f2dqtas9dls85\",476],[\"mmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q\",10],[\"mmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f\",26],[\"mmx1n36ek4z7vprh7xucnje6p5sr4s9mtr0ml9a3wz6xd2kp5v3hunasjn35t6\",5366],[\"mmx1gz8zq3caexftrf8f03l9pg694s4zy4t0cacz5mq0h7u7ge86yt7qjlumup\",55],[\"mmx1rfkx4gam8z02m09k5am29u2nyn62wlc22f0fapkqra6ckxspnn7qa0d336\",41],[\"mmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t\",120],[\"mmx1xrydtrhnl89x5dtqpwape59f0t246hhs38tl5d3pzcamfxh65llspr5pvc\",250],[\"mmx1zm2yrzm79wn8lt7uhvaxjy0mcezkxdjujcru9fwnwczl3y5r4hls79m9l2\",2321],[\"mmx1xwq2revzzgwlq27emrpfjmskmr60q7znpayenjlhuh08f4vxcrlsm99vzk\",143],[\"mmx1nhs4hestsaxqu42gmrj94lp8klx286q7ymp6dh2cgf6xg6nd6hlse9z9w5\",4]]\n"
  },
  {
    "path": "data/testnet8/rewards.txt",
    "content": "mmx1w7dfqwgrq4v8uyg2kpcda5ec44hnvdeww48zysxue2mttd04tz8qdpt88v 25191 12595.5\nmmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v 24127 12063.5\nmmx17dhvxq6fekkfqtvjwle2pwcyr6f76uhz3vsq6ldkc9r0uzs7nrpqvzh7zs 15635 7817.5\nmmx1ddxwuakc6p0mp4yzx3e9rzt6d6xtkvlvfmqnz6nx0umd2y9kc94qsyt8pe 13487 6743.5\nmmx1eavt4k3qfgc30z5wqtk99f93fq8xhtr82f47v6r9xd266njaqwgs56207d 12583 6291.5\nmmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0 11459 5729.5\nmmx16qquaqrzyks7qpq0wv3mz4j3gdk5c0ltnutnurun8ars8s2jszqsj3wzt4 10661 5330.5\nmmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz 8330 4165\nmmx1keg2775ll23shtjh235tw9g7lu3wj5rj50ws62vnwv89p9vd07zqwswcn8 7762 3881\nmmx1rw4n2d4a3mrve8kfwuc8gvqnszd9m68lkqsum0dzk4j4ztlq2jpqrtcpy9 7471 3735.5\nmmx1e3rlxd6da547vjhdswqp05z6tzx50afnmytanvjsuulmmd36yhcs4e6pp3 5851 2925.5\nmmx1n36ek4z7vprh7xucnje6p5sr4s9mtr0ml9a3wz6xd2kp5v3hunasjn35t6 5366 2683\nmmx1ehmcg3t88xt37498wtca2geh2r0v2tzlzagk2jp5stc3heey0vesjefjzh 5209 2604.5\nmmx1rlanqjxk03n363dxgqfek0390p6pfdflm4vnf5d25kp8rxd7lg5q3sf3xf 5080 2540\nmmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf 4990 2495\nmmx1n833p7z44rd62g0yvhlua8sv3d8wmyvrt720utk7x4vxwc3j72hqst6yh4 4514 2257\nmmx1u7me3rp6kmfs57wzytrxjh843sypnl0l27unk0c2pzkuuhjhy03qfwcyqf 4196 2098\nmmx1kezjxhxk8hxk0877hsfzr93p297xqp6ga2jrgptw52fa386gy7jqs6pz57 4181 2090.5\nmmx1qpyq03vzht2uwf9pzadx3rpa8w8y7pul2he0r5y3497j29ul7x3q7ac26j 4142 2071\nmmx1q65hf2l3zdkl5hgvl38syuul0q0nlnt0pn69nqf7euqmxqelqwlq8eskrq 3653 1826.5\nmmx1shw36ys05ppa2jn68qy5s7jl5kzy050rqdk4pz8catr2wadnadmqh275ry 3495 1747.5\nmmx1ywen6qnhge46fhjqwxtnyapckkakzv5m7gz8339j0kzkvzeev4fsex4z9j 3492 1746\nmmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn 3298 1649\nmmx10px4lhql09zw5nlgn8m062d8zw0j6f75acpf000grqxsma5sg0qqj2d7ns 3041 1520.5\nmmx1a2ytmujh3evrw2r8ljq6alul6drzqlrpa64ae9f5xp38kecen3hqcruxkg 3031 1515.5\nmmx1j7ns20cea2havm328p28vxeyfdcv0yrhndl2h8735slc4u0q3fls6dz77y 3000 1500\nmmx1j6nsqqj2g4cvdgf3r3y7e5f3wwvgyu6gh0e579xd2jsn0garhruqft7myr 2853 1426.5\nmmx1dwr96cxjzyc6532h2gjagegkm58ns4fdrwj6muhccgxn5ysuqg5qn9mzn6 2831 1415.5\nmmx10lrzsfeam8m8lmrxnhzd2zn4kahtkmnthd0nhytstw52s92d0wdq7x0824 2767 1383.5\nmmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0 2738 1369\nmmx1cv94kw4ttqwzyluzql2cc4trx5mze52qx8ys2pkd7jqg2yp6wzcq0lxaef 2725 1362.5\nmmx1uyczs9n3942y28h6jw6dpyfqr99xlhdr2r8qus4907lr2srtuwxs5cchgz 2701 1350.5\nmmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92 2611 1305.5\nmmx18zjss5ccnhyskugrwlxuy935zn3vz7ns6gyqg2cj8f3r99av9mhsck4ne0 2591 1295.5\nmmx1tpyah2lre4lsclru42p8zqanwfukpu9n909p6pyrvlcd4mk0dr9ssahxe8 2520 1260\nmmx1urhh0ud9hrdzf2x4883wg7mgqe2fztfcnjehxz6kqujve3hn37gsn3f8qr 2423 1211.5\nmmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq 2415 1207.5\nmmx1zm2yrzm79wn8lt7uhvaxjy0mcezkxdjujcru9fwnwczl3y5r4hls79m9l2 2321 1160.5\nmmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0 2266 1133\nmmx1afht99ekwmgh9s9h043aygvtl8tmytx7ymgavn6lkdxxczrgjsmsqcx3je 2235 1117.5\nmmx183ajctzcp95lcx2zztjk58gytyzmrlsdljna6lhedqj7h3jn04aqu3snsd 2023 1011.5\nmmx1q3eh75hak0v9f9psa365zjypz62q8d0cwv2qrpwpj2hayfn6xfvq747gj4 1871 935.5\nmmx1r2wcfugp9ugm44z03eed4ad0t5qhvg8ufc3p7pu40r7l5dkjurfquuahjs 1870 935\nmmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6 1766 883\nmmx1uh4qtgqkndrp78xx4qp26dwu4wxmqe8h964n9kte83sq8h7ckrvq45zn3d 1755 877.5\nmmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27 1747 873.5\nmmx1prxda0yejv5m4h6y4pgkzmutaxrd96zsnqss6aq5az6609dzatmq5jnv0e 1726 863\nmmx18gzhlxuaafa5rqxlyrzn8n6ldud65ynm5tujhc0ql87f9myx5musf6wuje 1703 851.5\nmmx1xr8hes0tgn95zf7y9zx6x649t84t5c4zas0cyf048rve723u9gaskvfmvc 1686 843\nmmx1kklq024f8w5p3963qd3ac3dz4a03l8g5ejnhqwqgqg0eq0p77hnqmzjuut 1660 830\nmmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z 1635 817.5\nmmx10ew79lhecezg2ewrj8l8egjtwmkffvs2jfl8rdgxy32arecyp5xqdryl8y 1611 805.5\nmmx1qm7k9w4qmnqc2gufp59g6hypfx9gcvpnz5e0j25a66e4vhnztmyqn04u69 1607 803.5\nmmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l 1578 789\nmmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map 1568 784\nmmx1cl8r0pfpp2q8fmg2jjk52q8dvhnmf26vx0wwms00ty8xl4snhf3sg65sm2 1562 781\nmmx1jpfmyh0ndxwz47t3d6xrdlkd0mq3nckuasn8elvjfa65xtzm2j8qamxfuw 1520 760\nmmx1epzfr5tjemywh43kr67esqktf43zl5z42ttzmrkgjwyh0608nm5qdxg5js 1460 730\nmmx109nvzs3vhyjqm3l7g72fqdxyh465fedk4xjvy2rnhfmgrw5l8c4sex2mej 1450 725\nmmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg 1420 710\nmmx1qm77f6cv9z9ufkavnt5nll7qq55rvjx3hru8kafx4guk3chpuawqcmd098 1417 708.5\nmmx1qymn8rdkm8gak0vst498qpkqvc7gh3l4qxt47m6plhdjlqnv5tzs8ncyy8 1413 706.5\nmmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy 1412 706\nmmx1lsgrc4ea32dg8zm35yg49a9xzanjav88wdvtvfgu28s92alec5sscmwzm0 1411 705.5\nmmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n 1399 699.5\nmmx1pdlh0rj93akpwww8apmpfj5awd08ew8c7c8ce4lk2cfehypgj6js7a2eeh 1383 691.5\nmmx14xms6j4un330ca6y09r8ffag0d9gsw6dgka97c82k32d0qtkuu0svjvmgs 1375 687.5\nmmx1pj0uu0lna9r8rgw8ccn4nj4kudgwxchv4l0tjqpw2x97035a2v4qdye8a5 1371 685.5\nmmx15tfvs7twvmtvpp4zvgpedz4suysu4fa88zuzjyj2yjrkpscme9msaye6tc 1365 682.5\nmmx15cf5205juyar33ugp9qkh4e5ne9n0ylvnyg0uf6uyymd3tgzhc0sm47jfs 1309 654.5\nmmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl 1294 647\nmmx1xr5534k53fk455wylucnrh5ap09da09jcghz7g9jg2jaarss7gesrjhu9j 1279 639.5\nmmx1d48fsux0kj7empe0c6a68y8gh6f494hv6wgl7skc42ckf2932x3swcfen0 1247 623.5\nmmx1qnh3zw2utltxdu9mut6atp326nujr6pmxxhtryn7lq089kv360dq64mj2w 1233 616.5\nmmx1x23xelewc3rzca0ad25wgczhvx7m9g9529xp98qp8zd5pgs8dr4sld97r3 1230 615\nmmx1fdscrht596p4daxkpzfunczjmurs66j65u5lc3a4q0l99k7h2ayqdvrfnq 1219 609.5\nmmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw 1214 607\nmmx1sp3fn6wkhmsum7jjspvdnj4696wyqc2jx7deaqpxtznus65jr05sg5pmu4 1211 605.5\nmmx1xeqvfd5a63j3j7vq287dvrjxyksw628azkn8u53sc6ftd4l8wr9q40v33w 1206 603\nmmx1rs0lu6yh5uhp3pa8tl3dwz5ts392ua52kx5v3p8h5jrd0x68g8yqc6usm5 1199 599.5\nmmx1923m2hlyu8p6vwt2wvcvda97nf0cqnwm6qf6axlt6zw44gkdgwhsz90j8a 1171 585.5\nmmx1guajyf4849dkedxpj2aqevkuc9a3u37fmg4hyqzmk4l02n37tfrsygnc5y 1170 585\nmmx1w7jnglje4j85z4dv4z6gpmwagqfcgpg7nq7dh6wu98qq7ckd7umsdq9hn8 1143 571.5\nmmx15wphyfczn8lvfmj28gkhsneg8gserwef8ergm9dxm03ngy8adnys2ypvdm 1139 569.5\nmmx1l3p8ljlzzs2kzr2d992wmj6ru5t95azef4cfnp289zgezfppg34ss5pch4 1107 553.5\nmmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s 1084 542\nmmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3 1033 516.5\nmmx1uwwzqtkhs2gv6gfja6hh8p2lhxtrv066umxq3nkccfqs4g3re5fsz9y55s 1027 513.5\nmmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap 1011 505.5\nmmx14p5y3gn5fl8t5jt0twe0l68jwe9n895djrg8lkk55t5rdupggf0s8l0kd9 995 497.5\nmmx1xm27rmtx3l7a00laujl97484grv5xqhrled5q7e3awlerfhe32yscwur2z 982 491\nmmx1kevvjxgq5hn9kzlds67gt773fsytmpv9vc4cmqnxlcqnv3ftm4zqm9y9rs 978 489\nmmx13w9j9lkwrlrqttpnxp8atw0gf9x5jrq8my08m2mrugdrn2rrk9ls8k9j7x 969 484.5\nmmx1l5dwydjks9s84n3rr52nwggsxfnrf65me7tjnwerse7xxn868ulqfmwwyg 965 482.5\nmmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t 949 474.5\nmmx1x40j0p3ss44jghrx2t0yqr9gqcr36xx9pjss4vvxwj60gkfvg2yqauewfw 919 459.5\nmmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr 919 459.5\nmmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku 894 447\nmmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru 892 446\nmmx18h89t0y9m8cy8trcveul508ju6v3tnajz2hrhvcs8rm8pn23djesml7auc 892 446\nmmx18yu63mp0j5nrxgxmt6md2y77v4n9ltyv6knvtmwjqqzty37swagq9df8mn 881 440.5\nmmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9 866 433\nmmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a 859 429.5\nmmx1kcrktqlr88979xu79dxq5slh3xkvx727j8unxhev9frl8rhw09cqqnl6r3 845 422.5\nmmx1nra9jrj79xztttq6hnnenveezkk9pq4w5whvlmr2nhj4s56f43wqx0paqn 833 416.5\nmmx1zyldvfw2ek8a2fv5zm4azulmkth7xntmvxspud576v7awhf7tgls50qg4l 825 412.5\nmmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp 820 410\nmmx1uskav6veu3nxfxr4zs6efdk8yth3tuz55zptp56rf62t0ftwy4nqpvarja 815 407.5\nmmx139j94tjwh6m9mnxdej2j2nkl8xc5ghzvt7fvz9pah7jvfxnhdassm4z56g 805 402.5\nmmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf 803 401.5\nmmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3 779 389.5\nmmx1r0e4s9r8jqvuvznv3vd5k4pfa5ahzgyn6lrgchwu4mpqlzgsx8mselfar7 773 386.5\nmmx1n0hnw7qmwehhsz4qf576s0sv5ql6kyq9afgrgmuzzwzfr03ld82q0ta37g 771 385.5\nmmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp 765 382.5\nmmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60 759 379.5\nmmx15n95rxf5c58taud2x06sgpldy3mazdyf2lf8cemmezp83hc5nzvqp3l3vr 752 376\nmmx1rz67uawsu0vhh8zx7ezvpy4d8jhtyjt4g4au39sf4qft4sguwx4sl7kjfx 744 372\nmmx1qn07jmdsetg4k8gqvn3wmv9kqkrhrsvrmlc547zslku4grlunw9qqllens 740 370\nmmx136s9temfus3xkgz3ftwqkrg3kpw3nr67088u2ckhkfvazqknycdqe09z9d 730 365\nmmx15qq0sdefrea28hhlhe5er0vur347vztfsezj76fapg4wf2nxaekqqxsy66 721 360.5\nmmx1f4g8tdak9nw2waf5v4g8skt6gqqpnnlvxhx0y5vjkm0myv97svhstqzhm5 708 354\nmmx1uf668t2krsyfde2v7cwtwk3traj7gwrfcdcx0j72rjr84nnz2fqs83fpcs 707 353.5\nmmx1ed9e542ggt95rk3ygc3xt29apzs2fsx384mwhqqwy30qs4wdhqgs9qh33j 706 353\nmmx1fxscvs37ax2lac6xs4tz3ygkwv3nh2hnrtrx7r4fej48708xplmqlma5lm 683 341.5\nmmx17gfe96qhqt3ylhxxqj7x6qxjzvt8cen7s4ks6e0mt642dplug4vq652g57 680 340\nmmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj 678 339\nmmx1478snw4amjfq0hnhpwl8de8yup2thh5f5uzmyu5g907az5sv6fpsuwfrma 676 338\nmmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym 666 333\nmmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj 643 321.5\nmmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn 640 320\nmmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr 634 317\nmmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82 605 302.5\nmmx1usc52whlhctpx08phhjzge03jy0wf2ft0y9dngzgxxs2ev0y23fsgjk7kx 598 299\nmmx1axrdzlwdpczy66khlgcx6zffrury8z6jxxapeygehz5djt5cpyts2mqw7f 586 293\nmmx17gtsl3areyr6g7xscq67jl2xcnz56ekkk9stxvx3qev7hhez3ccs3juqvl 583 291.5\nmmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05 581 290.5\nmmx18gm4fpvhyu80m262mptx9y4l6apdlwrsecfye70n6rslzuwmqqwspsnw0w 549 274.5\nmmx1fxxkthhcqf9ryfljy8xr9dcw4nq9q6mfetxx0dyqwq7qkv4vf4lql4qzgx 539 269.5\nmmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry 538 269\nmmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt 512 256\nmmx1rcyj0tmkrgejq5mvfjp7en6dajqh877960vdnrc9m5ujhps0df6sfsnhl3 502 251\nmmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq 501 250.5\nmmx1rkkaqaqs8c99w2jk7xw5ugfgkcfyhxpnu8xq4g5a5fatxvgggtwsccyp28 497 248.5\nmmx1f4msx52tgjn7wwetqyx9e7jr63krs2ut8fx0n5ufqvp6fncfl5vswzueae 496 248\nmmx173nnyxacrsmasx2v80gxpejk6ypyvt52pcgejrd6jtv7yq6rtslq6pw76w 495 247.5\nmmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0 488 244\nmmx1arre93x7eupag0a235927awagqnz28x986tke4cqfcs667z22t5szzd8et 488 244\nmmx17gjhpuwmfcdlymhaz9qwat2frpptev3pz2qmuq3zycj76qwnr54q40t5l0 487 243.5\nmmx1vxygt3x7vzn9fdyz2rj0jk6xxelqedgfs6v2qhvlrfjy3nw3pp5qckwxcr 486 243\nmmx1ahckwehmp72cr9rkuk3sek6zv6ay0c28tt7fkrhy5qgdpe06t79qvrjsns 479 239.5\nmmx1avg4dzcn06t8a7hshveyekaeszh7y809jk3dneu52sx97vfal69qk30lh4 478 239\nmmx18dkl69sxx3wz5u69s59lp9d02qj6czg8h6yv3fzzfk7d2f2dqtas9dls85 476 238\nmmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj 472 236\nmmx12uthvnq3g2af96lc3un900pd2tyy8apf0fsqag68d7fxene639tsacu4zm 455 227.5\nmmx1mylh2r9352klltxhjqpfj5jnfll6uqfeqp7xunarlg9cqufrhjvs28jrt3 455 227.5\nmmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s 455 227.5\nmmx1d39vgf387ct682mq7ua9vlxpjs8w47ennw69wp05atf65stht9wq5hkxpd 441 220.5\nmmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3 436 218\nmmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3 432 216\nmmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g 423 211.5\nmmx1la845mwntk5rqty7x33yw2t04e7njxyl3uflmfvea7lxzcwvc6ksmr3war 420 210\nmmx1re75j8gejzdje5afrkdsl9xknheax4ymznewazk5jqy4msarp05qz7qqsp 412 206\nmmx1qqjqmgyqws0jk04frzf4e98ydd3pkcsfyv65g2t3lgnp9t8z4afq0kqpst 410 205\nmmx19zerahkctf5hxcrtdh2j5xjynl398ge4avn9nl4zsqw2hs9qe7csjqevda 408 204\nmmx18tt3u9d47tc2frcp4z20yzt2yw9fpe0kn4hsnardnlzdsj9eewyqkhaxr9 407 203.5\nmmx1lka3j0475gzy9yk0c3lt4f9d0p8zhlcujhsfsl3f035z6fuytpesppfrq9 397 198.5\nmmx1f3ecr58txvmxjrlhnx3nw0wg7y7zdef73gcgjfrvcf8lgrdu3czsn4yx6z 387 193.5\nmmx1aa6383rdchx47qugjavpkcyxnpjvj6v0trml9h3ez5wlcusv0vmq0gkj65 387 193.5\nmmx1au96n6nrcskxc7wqedekzfmef69jrx8vlws79ypnnhuhc9hgk4hs96y2s4 387 193.5\nmmx1tuw784a8wp38c6q3fw6jfeqy3pvd8ggh0gj9h0xqvez00q9sew5sg0j06z 384 192\nmmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0 382 191\nmmx120v9ahac98w3rfj208xsf7rasweaesz3n7dtgt4f60upczzs3vsq6d67q8 382 191\nmmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx 380 190\nmmx1s4pkkycenn7e0g0y4c3sz2yrkld7m98mlm8mc67y7lj4trw5se2qy4eq5z 376 188\nmmx1hd5c7v7542hzr9j3ac3zx29d4eglxyq8c38nrqvuzdsjn206837qehjl0m 374 187\nmmx1essz4a6dexpprz066dfgwslmz3p8uy73czfrlc7thy3s8w782rfsx75has 374 187\nmmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5 372 186\nmmx1xdrf8vw7nl5e94grks7u3h7uxaamgeuv3s30h3mfr560td6rqdlqj2svmq 367 183.5\nmmx1gkwel33sdr4tgyfq55az5t5n8fzy3thum3v03jmw3q730ee6ajrs22jkde 367 183.5\nmmx1tms3d3n23j28f9agpm0jrdqnh634f3q9rgcnwsgq64yhcshps4fqd0fv6k 365 182.5\nmmx15qd64czwphlu49mlj6kmxru6wdcrjny326mp5d5p0hpzhuhw65sslkng8e 352 176\nmmx1k4sqj4vufu22zxtahymvhtwmjp4c633herv8h0l2z9nm2xn7uqlsjje4hn 351 175.5\nmmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl 349 174.5\nmmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs 347 173.5\nmmx129hgzhuh484dtlgz7y2r4dmc64hqzn4680z4dg8qq2gtwymfm3ksl283x6 346 173\nmmx1tq8ewkuuc9sr8a34eml065d45atwfq2fv5r738927rx9cqzv9mvql6x3xy 346 173\nmmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc 345 172.5\nmmx1n56f04jwuzpa2zkl46ggs3zv989fz4yx7yyrcx6nzn9ecvpwjucsudlers 343 171.5\nmmx1hkmks5m9u9le0k2zmx5djjxr6eh34nyzldlnty3mzk6yhzvcevks4z2n29 341 170.5\nmmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu 341 170.5\nmmx1355xdy9zhgzd8k3grndkwdff9qr8qk8raucr93praws40s27fkrsjlz07p 339 169.5\nmmx1h8thwkuhp0jnlr99ntwllhwhvp773yxufrcuwsh9q52vkrfcdy2q934mmu 338 169\nmmx1vkmzqsggqcqtzy9ea8rd56zx20uln52ug5q76y5u7hzjl8jaxfeqe3f49d 337 168.5\nmmx1m2nxpzuhfj4awyc2wnu37nhkhsy0q8spg9egnkzf3geq2kax3g7q54emhl 332 166\nmmx1vpg8kftakr3pammp86a8hxyar9s0m54w9j4m29d9d6rlk9ztf2vsl7ck38 326 163\nmmx1ml4nf4gxrz7yc2uymnu6xdx2ssev2q6696ar90pyz72fgp8vxj7s472hym 315 157.5\nmmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5 313 156.5\nmmx10c7skd5pzvrclcqfemg2nwk0pnpeh6p95aucnt04z3tjhpl3f2vsq6wzpg 313 156.5\nmmx1n9k3yluqcmnwz5wdk3dclgs6uq7yf4g4tvahh25jl3z4u488ttesnf2kkx 310 155\nmmx19awzztq8wmypthv24e60xmvxzymw82l86y0sdyw5cl5ehnr4ry9smhvg4s 304 152\nmmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq 303 151.5\nmmx1nkd5fyvrnu8zeqgen48aeqcnyggjxnn7dctfddj7m2mz25alrl8s74wqvz 303 151.5\nmmx10gntxs6zapmxesqh6mk5ujdxyvkada4r9pg4pcw7s6rlr88yvyzq8hsjzd 302 151\nmmx1255zy749m3fss4azm0ggj304y6l5uswd2d0rm0hgdgwts9dlfygsgnzfds 302 151\nmmx1n5w0atjthl70cnj3zll4ku3jl2w7cut8peqdkt04ck9annew2mfss5uu88 300 150\nmmx1els3e8hj2jvteh7y2xgwwxwq2uknurtkp63ca74gcuhrcajpzc2skqmh40 295 147.5\nmmx1vc3s0rqlmy7hrw0wr5mjfzgqx70senjwnp289x6syu9r0m58zvmsk2jl6j 290 145\nmmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl 289 144.5\nmmx1uj0qhzeguf0zayyg2m9z794nrdlk7y7pnprt4w798s5yezgxgvuslzd94k 285 142.5\nmmx1n04te3zvrvfsgmvzl3dzegpntqeqevwmd2ycwwwhng0hwslxkyfqpq2ng5 282 141\nmmx12gjuxcdsh7ppxmc0632zwlegm9wldzy9zp4v2skf60c9s705k35qy04laa 282 141\nmmx1n4n4k7wa79l83ch35r68eavnh0lkwcs3h52jt2xjl6j0969lqvhqsew3wl 274 137\nmmx1xn5hqxpphvuapka2kmg6xhsserajjzd48v7fknldems5amkf2a4qf0g2j2 272 136\nmmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu 271 135.5\nmmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al 270 135\nmmx1nh8ca5vlqrtwuuwrk4rm6yc06fuxgxgspdm3cflj9y6anlv3r0jqp8ygza 270 135\nmmx1xc2gg83p82xgxdg90kn3gud6grm4dwznrna2l6k80l8rzkg9yzzsdmf32d 264 132\nmmx1gg6twfxusn0xlnnzzfju53zzwjecm6jkr5r936favpxcjz9d8r6sp3spdn 263 131.5\nmmx1ktyudrg32h95gwzg0hfl87lf6wruuunp6w888typfdw9f52g4axqcsltyu 262 131\nmmx1gy8npau5h8fas5er5mwtl4sqe2glvwrkr56dj9679h633mgq3eyqpvz0cg 260 130\nmmx1r2s7q00hau24y49gdglqx9luqlgjug46del32hmfmujmq87fhqksw7emhl 257 128.5\nmmx1m96tljuk8yjc9xwu4q2awulg8hrgpg0jp6d9al5dm7r2hue2u8ysphwe0u 256 128\nmmx13xgvpxumznaqj5mkhxc493nzhc2kf9w3ks9z99eaznesjrsln0eqgwclyq 256 128\nmmx1zxfqw42gfax4wm88lvy76tt6et99pmd7vdjhfehx8jnejr2fg3pqmcvq8w 255 127.5\nmmx1gr44j33n8tsjpcmstcmffup7ap9a85kz3ykyuzd9zueegz37xh0qql5jwm 253 126.5\nmmx1m6dwm8wvtthgngztjnw7r0g4z9s8797xa7hdzrj2zyajctgrpc5qx2zqg7 252 126\nmmx1xrydtrhnl89x5dtqpwape59f0t246hhs38tl5d3pzcamfxh65llspr5pvc 250 125\nmmx1u6599454hfykwc52crn3wj2symdjkqsgu9rq0u3wmwteuc4z5jpsr327jw 249 124.5\nmmx19j0tzeawmjma763dj027q6c0up4a8z6leypc7htgpxwnk6wr6d7s8est7d 246 123\nmmx1ks9t2rksthddy00395l48vaqc9rmjuznw0gyuta0jxpkzsce44qs3at8x4 244 122\nmmx1l8ht54p69ynxxf0lxzrvm20956dcpk4lj22rv0jmdtefk70hurrq8m4j7a 242 121\nmmx12u3ppvj9yvh6xs36zscus50m644dx8ywqq530w3jkjhly8hf3qtqy6fe48 241 120.5\nmmx1r3qvaeqnpp5hmu7tppj3pkgwj3pm2rnsrttvzck92uq93vspq09s7jdghh 239 119.5\nmmx143pxg8tpjx889uqxmczg7f7wtee3qdl6ya50dnrk7qm84h82s6qqz7dktz 238 119\nmmx1kas9v36hhw4rzac60heh2uy9kf0wx7ed39fvhtlzqwhmr7udkl9qlxwys2 238 119\nmmx1d8s9yjjn824xg86x5wwhvn7nnwqe7wnvdn28t64cmtp62avpvtxs9ycy60 236 118\nmmx1re7sxpa7fmpseg8phu4pqamqmg72qmm3e7fzx880lz79dnyltpgsga39eg 235 117.5\nmmx1p38leegjxpafuxqcjqw5ddd2ny39ajs4hyy93l5hsr42hxhsdjmq67xl7x 230 115\nmmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6 229 114.5\nmmx1znmap05s26uhhzzewpz4daz634wcslefnlchrdlh6aptvem6u09s7k75zr 228 114\nmmx1e5gsd2weaqmzszdlj4gu975s2cc2gscnrtsa9agufcgjv3zat8vs606ewv 227 113.5\nmmx1zeqjj69mt8a5pcgdzrukt47cpgg6nwdas6m5j6aqefxapq7klcxss8tcha 223 111.5\nmmx1jmkx9m05exvtuk5swve9x9qe2u6udxx5h8p4w2drlu92523pjj6qsq8epg 221 110.5\nmmx1d3vplkcw0pjqrpfr3cesjmvslk30p8qxhky5l4gdslclu70tql0qdqp9dn 221 110.5\nmmx1t9g3q5fahh5zpsqw7hnlm37mvmty3vckn77cfepfpt23jw9k4tuq7pqy52 219 109.5\nmmx12hpmx28f6hf0hzx5j6z9ep8vjmpcgq5kwmaxkpagkqdfksunkgssmk59vn 217 108.5\nmmx1kdz775nc0jd7uqjrlgd3a7pk6w6qm75w9hw26wa6q8mr3u4m42nqrj38hn 213 106.5\nmmx1m5zcq8hazpjhxc54lk5hma3arvwtkpfgseahf79yn0ytchv364xqjza394 212 106\nmmx18tph3dn7ahfs24zu4lnlhrn9uk35s6fd46x58jf2xq3wzdw8ygjs5eamp7 211 105.5\nmmx1rd8n5srxsgys0l27d3ym8wmcw0lr4jqf7temzz7pqqjx3knnksesgace7w 211 105.5\nmmx18pyq9ckc7wykdz3wmxm5e85wsgwnwyxundkma5wxxmc98543z89q9amqhh 207 103.5\nmmx15spum2ccvkzj5zg32v0qzy9xhhafsa278ujyq20m2yhwq5lpxstq8ghswd 205 102.5\nmmx1fglt4y8vdcq2errqju4qulnmcfl3he9nr09vxqke9hl805tcnw8s2039u6 205 102.5\nmmx14hgwpw5x8zdapw4j35qclc05ajf6xxuqnwxyffszupmtvjl8wtzsp8dgza 200 100\nmmx1v8ram2hhzshqs55splpmpwsscfz2m3z35ajssnasm43jgmf7h0aq6sfx4m 197 98.5\nmmx1ehfcm2ggj5hm8fe4tu5dcuxpg7u4rmedus9thyzmm09995xjttfq0u7get 196 98\nmmx165nssm0dfafy22f5fgr8ln543g7gjgwrmxmdj5w5arjwma2k6kgq700fu7 194 97\nmmx1652t20n0jwl4mn8xe6k3j3zalgpuw38u23e6cf5249n3h278033q3kcq00 191 95.5\nmmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s 191 95.5\nmmx1tfn2vhdwrfuemr5dspc53qrhh2qek4amsq38j5d0a6sj73fdyrmsnvjrqx 191 95.5\nmmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05 187 93.5\nmmx1hm4mvj4dheczz5g7fvpw4pnmrqlm0z9arhkqtvq6yaxza5ckmlws85y7zw 184 92\nmmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t 178 89\nmmx1athk4etg0d9t8q9yy6s68vuruchxsa0pz37pdgqfsc83nckdmwtqlfdk4a 171 85.5\nmmx1qvemldmglge8tr2dcwnr4gqam6vkal5dkc2jwsz2jyyy8rhry4hs58hvrc 169 84.5\nmmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z 169 84.5\nmmx12hvena2t6ame3sh6xu2l3fs43qq9t7djnlt00jjyssj73m0e5eks4f5vcc 165 82.5\nmmx1cx85le3wwhvxmvhapwdyp4tyu875xx4r0lxjtk6rj0dhgwdve78qru9tfu 165 82.5\nmmx1ay2su27wuxjye9f9njdj0e7jjgxs4gah9p53upmrt4rwtv6afuhsw6awcq 161 80.5\nmmx1gx8an96g7ky87eur85puyex8r24qswx5wn86r2849njg8q2hkeys8zqlvp 159 79.5\nmmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm 155 77.5\nmmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv 152 76\nmmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99 151 75.5\nmmx1ghyal08f7r0p3ft8gywyr24p58jhe9fsy0xmu6wwfjuq4z079q3s36cu8q 150 75\nmmx1ezvssk3jgn6wr4t03ng5at3mccxyf6868z2kzmapnfqhuyyu2yrsa4vlkw 149 74.5\nmmx1uth7wfnyvzfy8nf56u6t5xhf085l870ytdjazm4g6ja7qmn6w9vqljj34x 147 73.5\nmmx19jlhmuspu5xz706c63vheckjl6z7qx9ne5rg9r7c2tq4vj8rt9aqj60yvy 147 73.5\nmmx1h9p0lv7at2ahtulugvg9vdh5nkjph2uvg93uz5azp8hmmuyaj50s8ky6v6 146 73\nmmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80 145 72.5\nmmx1evudswfffa6pru342f5hkduqhmmalx3c94clvyed63ht0dkn2edq3shffh 143 71.5\nmmx1xwq2revzzgwlq27emrpfjmskmr60q7znpayenjlhuh08f4vxcrlsm99vzk 143 71.5\nmmx1tsgysdg9v234m6nftjx4fse4a9f6c55ck2vstd5hau6kkrzzfhpqc9wkha 139 69.5\nmmx1t00welhtn9k0hg075ttg2laa7dj7d26jprf2as70xrx2fuhjyy6sjjp3e8 136 68\nmmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c 135 67.5\nmmx1fgxwy76pzglmqdqxuvv3l258233900kkke3p0mf0gaztjwmxq2lslppuqh 133 66.5\nmmx1av5ws5dp8xkwp08g3ge4fsmr5r80c7y88p8yru7rcv3gsvnkcahss2pygm 131 65.5\nmmx1499ujt570lt5yjmvrm7j6xqpvhlgw7kuye4lrzhfz8p724fp4zxsx66pgz 131 65.5\nmmx1ft660k7cfrsmh5l4twq3xxwqzauhm2cuz0cygd087pvl3u7p33sqthpl7w 130 65\nmmx1mhhmm9rsxk4fv5y9feft68uj4mrz2c8m33df5ts7ve6uz9xj7geqgqxd73 129 64.5\nmmx18pu3yu4a0zatqgkph8t5pz3n4jy7hq2x9f348yhwafvj4wd328usef7aw5 125 62.5\nmmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt 124 62\nmmx13j75773f8tfepkdjtcrpmv3djm4y7htcl2waq6spxkgtxs4yss3qfukrk6 123 61.5\nmmx14sfukr8xrxq5rlpu0dfvvtkzdzpqyxqyygzdjg6qn5ew34ynrkxq7pxlm6 120 60\nmmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t 120 60\nmmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr 119 59.5\nmmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t 116 58\nmmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm 114 57\nmmx1gpscz23fjv9fw32s3k2g4enc8k0arasszygjz929kmkp96a2c4us8hqqny 113 56.5\nmmx1u4m0jmxu7avg5am34pjw3g9lwqys7vcfp6ah53w60626rywvrs4sjzl660 111 55.5\nmmx1544prt4r26fm2f6ytlvdfe3j6mwrs5p479kp3lcrz5n58kp8ugpssn2z2u 110 55\nmmx1tw7lny4cxss0ks67wxz272y356nvgzl2ff6stee4x0muhr9zv55qs85vdy 107 53.5\nmmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu 106 53\nmmx1wsazxs68mvqe2j0gcpfaqwczn0277586r60vkap0gpaklcyhakfs8wztsk 106 53\nmmx1uq6ytg6v53lsy525m6352hznumufehsecaugpmyq36vezznyvzusmfpxm2 106 53\nmmx1mtug0wju96l4p08r2452lnllej28stdrlpz9p7qc3vlfmj888uvq0zrzhl 105 52.5\nmmx18vfpqpqwtt7htk5dwgd4lwdnyym659skm9ppf0sadkp5400w50tsxysqv3 105 52.5\nmmx1e0vmg4kc5ed5t85p2gjqrgql8ujrar0t95n9l63xnmkacgxv7gtsum8x2m 102 51\nmmx1k9lslhl4wmhs7ray9lfh47cxkz0j5vr827vypyaltsq80697xyqss2gn93 99 49.5\nmmx15v9jzpzxjwdtn8ggkzu7s5suv7kqhuw9yer4w7ngvenlgg660vlq8zgk88 99 49.5\nmmx1humz3m6yfc5rrf9zczyjkptr7snre4e9slypuwhhgsn9eh952yds80u466 98 49\nmmx1lnwzzc8kdm0lnfezlapkh66tl59ruhn053rtsgtnd0j6qglr97xqt865yj 98 49\nmmx1q5kdfkldkc735p5e7aj6y5y0szvhml9nchux98cfqfun4wa74vxsm3zr8c 97 48.5\nmmx1nh05jetwxuhj79j9k4wx6ujsamseykk84383jtmfcpzu2f2hz4wqj4e25c 95 47.5\nmmx1u9xsdvqzayfla2rutaxkespha2xrhn9m6wn7v8z8rhj277v9k24q44rft2 95 47.5\nmmx1l52feg8wshacztsyf6f77ndq44qp87tdwns9wdlxv3t4uej08fssuuwng7 94 47\nmmx1xazrdyth7ctuwetm9wnhrvgq30wlqvwuk6qn7p2huy7ffwg5nznqfw69ch 93 46.5\nmmx1lauskl8kzuwevqyx2ky8ale95esy87swemetk0zhc73ctrdm5c0sxy3exa 92 46\nmmx1gavx8yxen8hhfy7qgkqd0jqczysw8rgruef8nt5mp2sp7skeh3vq9lx32u 92 46\nmmx1glx7a9c25wns42k936r3qczu0egjtlshkaxgv5atxpyyj2dkd6rqklrnhh 92 46\nmmx1rx03nd8ttf02y3qz69s9xlxqhrhxtk3a5x8lnkxl3s02au2nkqes8dv836 91 45.5\nmmx1arwca695tyd8rsgxx8r707xpe3laawcv3lq593hs4qz9zehlngvsz68wh7 90 45\nmmx12wfqpxsx0gxlrufeptynuvwt4fn9wqflp356l2sxhveshsrkrqwst4uwh3 87 43.5\nmmx1dh6r74r89g2anwusnw2xjwh2seuc4zuvfrxet2jzan9jll9calys05g7mq 87 43.5\nmmx1n50ufuaae6aqhxcjlw0fydmhpt4h049rfzjqtgke57sn49p34sasdhzm0c 86 43\nmmx128j2zgejfdmut0z3559gzw0vntm6rz2fcmhvppcgkyn9kvuekmzqkhk8hh 86 43\nmmx1que54datv9wjvh6jjald43jlhxkvcpyl7e6jaqap8ch7my7sr48q0jq38k 85 42.5\nmmx15w4ytftzunx9ues8qhk3z8wmrmtgcg5n88axzk3c8qwtzr3n8cts3hnhj2 83 41.5\nmmx1450fn44pv09yuetx3yp9vtvx5k3amv89vycq0f0dvugcvp6zedlqsw05p7 83 41.5\nmmx14nru8xmclg23hcdvanrn72rjre93wyew7vgv7hrwtexlkx2m42mss8d782 83 41.5\nmmx1q33rhh00r0dh7fx79lp9wrmv3t5mgpx6m3wtpajmmenuux0lzvlqruqgnp 80 40\nmmx19nnl9lw7td20z9l22v8wk558mxfrdeud8ky3229utv6e50cqyazs8jhq5e 80 40\nmmx1su0cegxxdg73yhm3xu226uj74309x9ll5ycd5m8eh04n9as7mjyspr0w7m 79 39.5\nmmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn 77 38.5\nmmx1sg74tyha62nx9ttjuk53vhk00248ts77s2ee55ryrcskrmuf0k6svhdwxy 77 38.5\nmmx18ee0whkd2pk6xymy9sz7a9y6mmcujphzqcyl659fxz2cdr5ln20qkd3wav 76 38\nmmx1cg9kaawjp23h0kxj2ggx5s90c244wy0lsyxp0ltygwgfkzpjnxsqaevyre 75 37.5\nmmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0 73 36.5\nmmx1tgppefepecrczwwad3zlvcwhuujsyr63gh8mv92el5yy8egzk97sdqpjp8 72 36\nmmx1jxl5gaxtd8wnc6r9nxmf5s748ct827cpjafdefw8rgen75lyxxws4u8a45 72 36\nmmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2 71 35.5\nmmx1swqkluvn7gggzn48wa4k22c8edp8wdnrhnhv0c52jk569m5chprq6nefvu 71 35.5\nmmx1ccgy2ru9jn5a7d67w09zrgsxgv5hfxrkzdcv56dlpcraa7tkrtkqsrah8a 71 35.5\nmmx1gntkqf266vrn7swllylnxpaayt7n06yqxhxjsaglkk8fzds4xuts4gwjsw 70 35\nmmx1u59mc3s94cezun5apvw35vj2vnzfanjv45svwfdat84wpuefcs7qzns66s 70 35\nmmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn 69 34.5\nmmx1mrmnxtc9vwjkgfst6z999x42wfuwl0ywnwn0rgyvypj6660l093s6htasn 69 34.5\nmmx1gxz9mgd2z0v6sr4luvnhw2u5qandh7yvl7rpxcz0d06rdfa7s9js6w6p73 69 34.5\nmmx16s93fxx6cap0rv6kx8dcc7f6syuymvjdqj7l3j0yas3qhhxw894qxgfcx3 69 34.5\nmmx1fp4266lrf7weqrkc3vdm2d29wnc0f32q33sksnfnhagcshq6ka4sav8d2y 69 34.5\nmmx1qj5zysw5wc0qhwljrkgkvskmfsempcr8hf9zd2m9xw5dkger59eqf75dpg 69 34.5\nmmx1agcww5z2v6ctey3elyhmc2ehfpde3n9hzcnvh9s3fslrlv004rns02462z 68 34\nmmx1rdu30vgjdheh4453heuq98es6whgaskx7csmfh28m04sckxqes7ss2y89k 67 33.5\nmmx1wut7pf5v32hpylz6rxmrsztxfhskgxp34cgt8vawu3xqg6y8pj0szay6tj 67 33.5\nmmx1uw2mjnw6zt8t0r2w0afqu3zw7jkjl80xjwnfgk6cx7m2c9u5052q6m24l3 65 32.5\nmmx1hsgvhawn7nz3xz6dqeu852yrnpdygf3hhahq0hydnxw25g8057qsp76xwk 65 32.5\nmmx1hvdake6jsnu5qa92un6ucw70jsa89athx8egx7507eqjk3s9ujvsmzmgd4 65 32.5\nmmx1lhqhhwzvn5y7kmgeenjx9k76pq4nnmqg4hffvar8tkns7qpu6z0qwatcyn 65 32.5\nmmx1jlzru5r5xgjs5zx5nktv6klrjvvucwpwqst908ursthn6cqdp7usf98vxc 64 32\nmmx1fr77kwzjzcv3xmrhczs5wwsmxlufp9kkvndch9d78fr3m09mqgysc6lnaa 63 31.5\nmmx1ye76l4yxct7a2842mqa8vcf4q3jqryksu3s6xqvj3qdlaq47es6s2nt552 62 31\nmmx1f6khu080cft3c9g5l8qwqh2wlza8473382h4gwursgl0txhdadjqn2kzv7 62 31\nmmx16aylfh9g5xtm76lt954v7ntgwts3ldppg5a2ll0uw6sd9fklge5q7cdqk7 62 31\nmmx1ln8cwt5hwwd5l79uar8gt20njcl3vzud6m00lxtzc0uecq7zvmzql5mhez 62 31\nmmx14tmfx4twa5spah6u7he78hg5nk7tp42zdjsq8a25fyenxz64yfqsqdzlh6 60 30\nmmx1tw6ur95jjmd95svmhsn4qe0vw84xeev8gsnes6d2ykauuk5xqd6q76vusz 60 30\nmmx1jc22nh8pmjz20qyyz6jwlx5crml0z7wwrrgn3p66rgpt9ay8r9fq9y2864 58 29\nmmx1fm0j6pkfxsjeufdcglg58v3veay6mn2x8qp45tevkxfny696kewsv42zg5 57 28.5\nmmx1tagjkz3avdgz8a5kn8kkhs3lr9lur0fmdt9zuz49h9j9vcg80v9scl8fpc 56 28\nmmx1gz8zq3caexftrf8f03l9pg694s4zy4t0cacz5mq0h7u7ge86yt7qjlumup 55 27.5\nmmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0 54 27\nmmx1healszdpqs9ppuc2u0lkn6l6ll9n3epeh32rj2lqwcte9g8y58zq4g4pm6 53 26.5\nmmx1hpt8ym8h0wk67hyjsa3e3ndncgk2p6qxwam3nrz8pzuyj42rj3hsm5pu7s 51 25.5\nmmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w 51 25.5\nmmx1j7njmgtzmqr49n9lyacawww0uv2sjgxs7d04xu2ns6k62hfqycqsh33u92 50 25\nmmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5 50 25\nmmx1x39l3phj2m3grgs0ynhd26nx2afh34faue745hltpzqr0jfsr6zszzkds2 50 25\nmmx1dxxgygp75dh3p0yh6kmezeeyftncphy0q2fjws48wzxdrktsy7kscjdmd6 50 25\nmmx1aepsfj9c4nqqcew5qk8rw5sqqkwer5pnmwx9y4elcdm9gy332vqq7flngz 49 24.5\nmmx1kfacc8swpse06qz30mlkefhex6an4jurgmrrancxyan58xw9w93stpsf7y 49 24.5\nmmx1eghncmcx5lurhs30meac277fx0qrkeugexm75ku3jwfeejhcpajsyx5wqu 49 24.5\nmmx1l6yphrjzvuc0tefqug5zs9eh3gu4fupq6e8ncgsr6mrek2xvvwvsf72r4d 49 24.5\nmmx13r385uxl5qm5dgt029l3crxsglz6g5t3sd3yy2metys0efjlzmqsl8aevk 48 24\nmmx15deh8dkm0t4arjta6f2z07uzgvh49r3mnltm39hp0aeth0vc4mesdzfdfe 47 23.5\nmmx1py700x95hshs4cuzccjshmt0eaen0psw2kmhpv0tmy7lag9wdh6q58puuy 47 23.5\nmmx1wsnset02rd5ksettxhpf2uzw02jszrgtc5960v002c3cwdg254nqekqjen 45 22.5\nmmx1rn0p87m57fzv5je8wu97aegkhejf7r5gz3clr4ajs0k42p4g57pqwh85wl 45 22.5\nmmx18tw0yyc28wuqes5s80nzzh8dsax0rkkpqa4jpcv3wl0t83vf228qd04d9p 45 22.5\nmmx1j2awdr9j4gun67tr7e02h6dq5522u7lkcu5ftvl90ajgf9kvhqusdze086 44 22\nmmx1n0a3t40vv5kdgfnduj82kzw9ewy3tu5utszgxhkztdvqlu8xgdks8nyh2h 42 21\nmmx1zp7rs0q0dqthcwdfvpaugv6px5qylq9uvwltvq4gpepdqyk9299qhvd3tr 41 20.5\nmmx1htwp6wcg0g706lfp8m8zhs3me5a87kj7p9rdqvywdv3ax8lp6jhqhgkwc7 41 20.5\nmmx1yknhrstjc5uslrg7zequ278dk3j42s7ylfw5frvgjdsjzm3jxwcqu768zc 41 20.5\nmmx1e39hfndd2x9atrmkyjjlcdn7j3f09cqne0klatnxqhhgqaxmkn3q4f9fd4 41 20.5\nmmx1rfkx4gam8z02m09k5am29u2nyn62wlc22f0fapkqra6ckxspnn7qa0d336 41 20.5\nmmx1ffrdjd4ccl6ga736hz3ran0xl8k9af5xf9ae28hqjg2fhugfdf5s4q8qr7 40 20\nmmx1argmcrg9rau7m7xy8k4e0s3xw9j95w7upuvpt9hlpz6epj6jhrqqkrytm8 38 19\nmmx139le573u5rq3g7a4adydjznp86en3u5wznrlywq5k0jy0s49fvwspq0w5k 37 18.5\nmmx15p6ass9pp2l23cja3d6xge8jq5tmpspah67vdp7hv2pnnu04rk4qd5cvcw 37 18.5\nmmx1c46ug6qnnu70477acd28w4xh70d45yw2ev62lrwkgvntdga9d7jsvc0497 36 18\nmmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch 35 17.5\nmmx13qkvk6325f25vdmqc5xjq85q485zsgmh5pedmykg37mtt738du9s670h4n 34 17\nmmx19cxxrr2c4a39pyqda7zqt0dxga6ey7gc67rvlum7ecpzpagtrp2qcakr0j 33 16.5\nmmx1sg8mgch2566d2uncn3lew5wwwacp2femp63y4gshj0qpy9fehjqsysa3ng 33 16.5\nmmx1csleu9q374crgsm06k0xq2n0vdcufm34ahz3lww7kmyt7ukj38aq3ta9sv 33 16.5\nmmx130vvjzlqpd3dx33j5dvvcwxd2ry8vtx2xstahwpmshpwekq953kqh5r9rv 32 16\nmmx1drhuec6ts2hz9qf8jjxmpan7zlung5anurrpxnvjkmqy87vvuh5seglsha 32 16\nmmx1yqkentanxn7cp69sgz35j4eycq7jjxvel373aljj04a4fnuusqgq3nv5mw 31 15.5\nmmx12w9lkh26qc7fvw5038usc6y6cv28jy446qn07dczapjcv3rw49dqgk27s4 31 15.5\nmmx1ll2yar6vrsv84f5qdwfvh8tv80qlmkxdlr4ddqpmpzncqrgjghjs8s573z 31 15.5\nmmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c 29 14.5\nmmx1tgde3wpspejv0gq70lqe54l93n4mrdmrp3xt3ts4q96keddyrfjqe0e0t2 28 14\nmmx1vk59t5awts2etx5v4jyamy9cudnea8mtl2kzk4caryc8erp6j3mqj2f6xj 28 14\nmmx1u802gcgzhfkkggcq5l7388xz2fn9hswy7zvh74t5c7yvu9x3r7xq4d9r05 28 14\nmmx1zfqclk23ys7v98ck9ewfjz0x583g94xam3qzuetw28gc6f265xxsr507pc 28 14\nmmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn 28 14\nmmx1d7a0q2v6qadeafuqguvt0h4a2hea9nky7dmgt7jszpkpfucu07jqwjfzt6 28 14\nmmx1tcwemyrrzd62wrh8ff3kn4z3hr0dts2waxpxwfpwg2jau2tz0d5s0e3kme 27 13.5\nmmx1qaypsvtfwslrpaa4h0g6x2hh4j0tq9gh2p8dlla6rawr9r9t636qxd6s2k 27 13.5\nmmx1knzrpleqz5ehr9j98scgy9vpzne2yg8ta3grp8zzxrxnjhwgvkrs94f6ql 27 13.5\nmmx1cx52w3t5tr7ynduqhx9d74lnnvumfm84flymt2etrv2fkfrm3wnqmsd3xa 27 13.5\nmmx1wefvja0djemhprqdj73np8mn3v258rx0ffyenpztrnr8tvndrrvsv9aggw 26 13\nmmx1p898m68n456q533nfjd5sa28akadyqy3dvq6tywk3jxgy7chrrwqeh70e3 26 13\nmmx1rwrvyjx2e6q6frgdmlcqlj565unwz5atsxzapdfpdfgc3pjc583qtxg496 26 13\nmmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f 26 13\nmmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp 25 12.5\nmmx1xj8utkqx9a2m3wgt4pe95z4jh54xgsl5gtdfwxqfcg823stkplus3fv5r9 25 12.5\nmmx1e8xldlayy2j5ptk9grrze76e5jyc8p0uq0zuslawyhqeu7xme5rsh06fw0 24 12\nmmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn 24 12\nmmx1atwce5d7s6pn27censfqkrc4qtqkh8a8ufzylnqakngeg7elutyqs7yqek 24 12\nmmx1vr057q49h73hph3ksrk92sy3wfm2u22g9ezklxmzrw92m7yl582sq22c4h 24 12\nmmx1lrlfmzwanfkqu3cg5c98w243du887xx4plshxezc8ljhhcn22acq4dzwew 23 11.5\nmmx1lj3x3d08usvq9gdjrjvyxhzkxxjylp6qftz7pch635qyq8yjn6yq0h0xxw 23 11.5\nmmx10k4auqde486w5wyfajnmpl4ds6tv9x7tzdus85wfxk3r496cgawse6vruy 22 11\nmmx1a7mtekvyzh5f0uswz0pzqq6lys66ta9eavjyk66w4kgrseej6p7q5savlp 22 11\nmmx1zvgs9rvzul3nflhqmtfdu8qpa2aqnqwxwsaatucsulsv5dd4svqsed4fyf 21 10.5\nmmx1hz0h2af4zmvnczp0twyzt8uts262pn9h93awamhc2sakdlvxvgcs8llaeh 21 10.5\nmmx1cta37dl4czqsz7jaz5awly9kxy6v3v3nqes56vugfrg4h263fdzs99rgzf 21 10.5\nmmx1m3tug5239zp7zst4qu7c7cns8f8dvel9lnjek23v2zd3ed9mmf2qzgpa9f 21 10.5\nmmx1edsqjgugd0hqynwa9h0gm05vsmqpse9yhwr85eftrxyu6ww0la3qf9hspx 21 10.5\nmmx12hhyrde0aptpsm4kssvqw22k5qrq37wmy9ec9lkru47yad4hfrgs5l3jvm 21 10.5\nmmx1tl0fenlw4dgjcpx3hkahecqrxyzquszw8zdjwn4j005vvc7uy3jsgndw9f 20 10\nmmx1x225z4p73e847du0g5k63tgfj3c3zn03z2rr2zqnm6fs72n03k5qrafd09 20 10\nmmx1n8fykdy0sk7jj8rn7fwv8awzel820mc2d9c9l959hajm8y8s6v5qayvhfr 19 9.5\nmmx1n9sl0wz6rjpnkmlwqphp4rema3ejfqeutujw0gkxncefe9hxglxs7csahg 19 9.5\nmmx1zqrr5qw2akhgvvxnfvl3epw5zxjy8j3930fed2agnexxjelrhy9qdrrh37 18 9\nmmx1n39lrqg4kq5ey2tnk3wlqxylcuflevkkt9wffj9x2fsygma8m9hqntpsry 18 9\nmmx1lqe5htxxh8ryhstdwmwfn97yjynaym9tl3wwq2x3m52e9qgld74q6uyxdu 17 8.5\nmmx1mh0eqru3fwsmct0aunq5eww9ffs22tscparsznzzq6tvpmg04x6qnzrevn 17 8.5\nmmx13l7yln6mennhvfx9celf99enpdgtfe7qs8dmr4nfr06prcfmz0eqsda2ae 17 8.5\nmmx1er9czf5xeu2wnpjeg69hhttxppwkpt0hmazpclhgjha0nad6kyvqeus2pv 16 8\nmmx18gszx83xlhzj3s533m62pazj3c7v08rgu4t8sh0vs9c2leg3ldcsfgkc3y 16 8\nmmx1rr569h8enxr68xd8jzyfplt0xwwqcghkhg2eqltyj9jqws4du60qsagq0s 16 8\nmmx15hv295x2hxwzwtzeyypg5lwj2z6k5q7j0ts80jn4n7um9u5zklvqgelhwa 14 7\nmmx1d5zv5ucgwufjj9jg7k3suj4uup7ayp9ld2tchxezwz3fyfu7jtfs9wethh 12 6\nmmx1kx9uarw6ld7w9nmxytejkzs8q6r5376cqmtlxcd78pf889fwfqwqn6pk5f 11 5.5\nmmx1a5x6xect5s2cgdl7rh2hxwz7z5xqecvmlf9jjjj8za58al3mlprsr5germ 11 5.5\nmmx12gersmcmrkq2daaxsrpk3hpelxsetf2emn4u5qngvvm9x7r6k26slgztww 11 5.5\nmmx1a2ak375lfskc6xrf6mmmc89eu3s46ywap2j7d4aj5eyeelctqy6ssshgzj 10 5\nmmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q 10 5\nmmx1kvczf9d27064yfd7kpha95ehrvem875khnq3zadd3zjyxu78ly6s2vwwp2 9 4.5\nmmx10qnnual5h4rxxcmjh8ts39l28azqwjqlfz0u0gjeruntvs0zpqus0fl0u9 9 4.5\nmmx1qneuv0d6qzv8zgchxzzcmx2w5k42j4wah6k8psw5fcgw48707drsf6nvxm 9 4.5\nmmx1f69lleyu3cznmnxlp9xznjnr84xrzutmjjcl4nlsfv2359fjze5sz787ay 9 4.5\nmmx1can6xxmz54lhtrm53udpehkn6k6qspudttf9pdpg9evccj9hmhaqufdqfs 9 4.5\nmmx134t4wf6h2ppxnxm02ejutn0va4sj6fm0qkyn0hsfx5r4a89x25lqznt9py 8 4\nmmx10pckcllf4w09gz5uup0waprsh033cmq28e24gnjlcpu54y6nwp4st3su3r 8 4\nmmx1m2qrqthgwr3x7cyhf7fc97t00yszfvet9jy6x0chtqq65ycyxkqs4pmxfm 8 4\nmmx1mq9w9vnuae4fdmn27ceh3h9wzaygmhf0c3sqa7xufy7x0l87zwwsdfm80k 8 4\nmmx10f5xfpvgmx2lkulkqsf50lvafdwwatmdnjwvqh8kgcyexanrkxls49v67d 8 4\nmmx1dm7la9qquehldy67xsfynp76p39dxa5xn4veegz88m7amspgpgcshv7dfg 7 3.5\nmmx12ykrc525ay96yfq0aq92vqmc5kqpnalxa0cmhy4x9sqlrvklh43svk5za5 6 3\nmmx1j6h6ans82uwhp77xnk0w6pd42c7nasqhnlvy5yfksax75l3r3mws2au86p 6 3\nmmx1w29nsej9nxdsd498gqgymhhkc5e3enf4tg53a8lrnecspxu6aljsle96lx 6 3\nmmx1jr5hkhp35t05c7g9jxfvs6wz2all566kves6rx5ckl57pz7mmvtsemw7kv 5 2.5\nmmx1h9l7sgtnyagj2zctlj0xmmn7275uqpss2dn8funllmgd7aj3auvqv0fy7q 5 2.5\nmmx105ezm538jqpj859u3ygggr9umm9nrfxrgjd20mp8j3g22yvev4tqcljpj9 5 2.5\nmmx1j2ej2wxexc247mxf5k90lmjcevp4r5cuuaa3ukl7ywvfq488detsgxj7jl 5 2.5\nmmx1qwcxn8k9nxdu43ytsw0ew7wk7mmptr3ykvtenms3fsyqexg9p36sp9slcv 5 2.5\nmmx1s0qc9xxvasndk09qljlp5mhn78qpn0pc8qe4zg0hw38hwetjzxxs9v4les 5 2.5\nmmx1afqzsqeqaesyj35ugd2r0pt2x30u98uxvxr4y8u4as690zf3kktqfee809 5 2.5\nmmx1rkhdpgc8qsht500ty8jvzzqequalqpnk5vzvcx2rj3sr6cwfytksxwh08a 5 2.5\nmmx13cf0qwyp3zg6gqnkcupez7zfnwht6zpx3z2chq4erzstzypxy5xsycnjhu 4 2\nmmx1fq7a0hk0kwers7ymsdm9wswa7qes6fyw7nzguz3erm5j2xd4eynqxxflh2 4 2\nmmx1sdg5chqm4y225lmu35pj7ju58p85s9y07a94dke9cs2yq7caktpq5nq7da 4 2\nmmx129hapqyd5n0lht763e3rm9mc23fwnh70pxeh9zyntntfvmr4f0yqejt30d 4 2\nmmx1fv4dvhre9mmtldnr2t63qg5hdxa02hzjeh5hu7a3zkmf8a3ql8wqv4txd0 4 2\nmmx1q4nnmgqzs9lctpsysetvergsf6enfkdqvv6k6t3sedz00whpf83sf8dhkk 4 2\nmmx1vlm6nlha47hctqvcqyz8uqfc64j8h5k2sgjmkk92ysm2k9se4hnqqldyu5 4 2\nmmx1v2xtpyjklr994zu0a5hq84azaxyjmlnyz3shvt5fn0rf8nspdraq56jpgw 4 2\nmmx1nhs4hestsaxqu42gmrj94lp8klx286q7ymp6dh2cgf6xg6nd6hlse9z9w5 4 2\nmmx1np4pfzqpl26td6khzcfdywcsz0tz4xmyua2havtlpp452vc99yyse4wkmj 3 1.5\nmmx1gcrf27d3pmwese0hl4ewnm7xjcwfqm9e789mrax8lyqq86xtz5tqrql96z 3 1.5\nmmx1v8x90upymn830n267009ejv0xwpwmenm6a8nvx0te0v29lauvuaquh3emd 3 1.5\nmmx1prlfdpu5gmy5wh3yhtjgzlth0322mcxnw2zagydw5naant6dtegq3r7mqw 3 1.5\nmmx1yqycann5zs9eupjsea76ahp5h2h0d52n6hqxvd0v3whezr0wre4s3zku4g 3 1.5\nmmx14zyrz6re7l4j2zzc72mq8w03vlv5gwvwm3rem7yalq9quz98kdcs3kt6a8 3 1.5\nmmx1t4fc7yf2t0txxvqgnxdmhxnnd3sw6rcq953z2up277ssl5m0yz8q9h9frn 3 1.5\nmmx1sr6hr6werw9vplvje6akazlplymdqlp7hae75uqxdys0z0wy46ns402jhk 3 1.5\nmmx1vw48jzy5re9pp20c9plj77lt85x0aljktkzp945fgugupsf2uxmsmuyeaj 3 1.5\nmmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4 3 1.5\nmmx17e4mq3llxatljnfkdf2w0sy8mujaq4fn0q3rwdgztvh8rmlweh2sxk2xdx 3 1.5\nmmx13s89rmpg2vlars5nktpfh8mdjahkgzyj96mllj3zuj66zqx28h0sfmqk0k 3 1.5\nmmx1nmya0r2ytqy66sqs3kxctpyd6sqcklzdqcyx038d8c2geysdmhhskph2up 3 1.5\nmmx1r8mm9d0q88dr7dw0v94yl0cthpr560r30x90zxcutltxcck6xq2sm3yx2k 2 1\nmmx1739equ4zcj89u9dl27ssz72wx6h9wrms57s00plkzq3g4wqxjqwsk6q67c 2 1\nmmx18xxcvsm8vekqk6hy2xwx7aen3fwj6us476auqvce9kyw49ekfcnqk7tcwp 2 1\nmmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj 2 1\nmmx12djy7tqtf5xmhdqhk58jkjtp3e6elekgcuhe8zr9reak29xz3c5qdqj7h6 2 1\nmmx19mrdy4z7gndh4k3dtrv0r38jsz6c4texjlwnmzjh0z0ccnk5t4yses5kz6 2 1\nmmx19a2ky2g4tylysduh8k5ev6kms2z2m4kk6veuljjs3cq2c0r7jexqmwewx5 2 1\nmmx1hruc7t3lcdz2n0mukyjh6l9dtxd9hauzegufz9f05k3yaltz9agqph6vkc 2 1\nmmx1kzfexe6m93ggzewpf7xtd6jx9g9n2k3p9n0em8zhug623tx22d2qdzqnq6 2 1\nmmx1vj9cy7vtmpzslkenxx9nx3pfsq9uuk0krgvnf5efetd3jxjjk4ssulv7f9 2 1\nmmx1csmu30z07zqudtna93hqlstcmuzp53kalmsawt0wq58l6d488fcs8fjcjx 2 1\nmmx17pw8cskjurc9p2503yns2y3m8uv8t3slwas2d9fav6e4xg27ww8s4j9na5 2 1\nmmx1vyedt4fgr8vw96qhx2hl8ktptddm68wzs7ytcvwky0et3f2fqzws9gpj63 2 1\nmmx1flhq9y5whh5q4t7jwcu7grfsl2vac95hmst4ywkghajptkazz7sse7je9a 2 1\nmmx15cedp5xjcxgqvwj8hctcykxa7c3hgdlc0gfylnzwmk9vhlfzlz4qhcsacv 2 1\nmmx1w67qjy2g4pyecrdayfrmaltxqk9vpvk577harjk0qdyplrycg82s2yx9fm 2 1\nmmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9 2 1\nmmx16hvwy7xwv9wxf64u0crk72d7jceqayjtk4v25xken3psfswrfhsq469ftu 2 1\nmmx1kzultmf90j7u5lr9586l5mu3qd4xjl7h4k4yhxztms9spva8d8kqw9qj82 2 1\nmmx1333g7ffyguql8wdurnqmspwqrvrsf43647lt7wzatnanzm5xv8cq4q7mg0 2 1\nmmx18asaxgn4dcswsefcdwx54kldattux7l0yn96fvmndrpqn6adsluq3ffr8x 2 1\nmmx1grznkf6d33xtkhee5899xa2jg8v3ktupude206jt7pzpmxgslgqqxtddgk 1 0.5\nmmx1q3nqrhd9uyjcls6jyj55x4wcnzlfd2mtezfy0m99gd0qt358hy2secef8p 1 0.5\nmmx17s5j40067d5ugggn9ppdjg5enrxe37t0y58y8pjgnc0up25k7chq4rnaaz 1 0.5\nmmx1lx2dgd8y94t40p55w45cdv0wqdk4m9q0tzaru9pvsq7decczasmq2l6gnz 1 0.5\nmmx1tn8khcvlnkhprvsgn7eutwlws3vn5yc4mnh85v9vdt5ze8zs7cushvg596 1 0.5\nmmx1zx7dt77dgkrzrn25zqqspxxzr6yyhk9wwgt0lelkxeda0ac3jsls68fl0c 1 0.5\nmmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9 1 0.5\nmmx1gh9yw2ctnae2jy95gv3g70h7av7y9d2ha5dk6ehrf4nt0q7lppvs22d2vx 1 0.5\nmmx1y33f8xs9evumw58unlkcdgqudwzrjn5ftk52w0p03277mqvnw4ns05ferx 1 0.5\nmmx170qark2pk7xpjwsrvm4w405pxtjzwgvt3wtygu82a8t02rwan94q4r0vws 1 0.5\nmmx1e38wzhjm5442g2z3xk73paugk479863f3y4q2j0c3yprdw50fpaq20njlr 1 0.5\nmmx1pqk0hvm2lrct9uc7k534hg54538s7t9p6xewq49vnamhqs5gp79qfmnw7a 1 0.5\nmmx14w3wjj7c7d5w36frrsvjxy0xsuy4nlnufdxlrhuxzrz9xku5vjgsklvpgu 1 0.5\nmmx1fgylxyf2ef9p5zj0d6hnz6wr7wmkgukq6zt398uk3j78nhxfu2kq05qm4a 1 0.5\nmmx1us9z3c0r8a2fxex7za3vh24zwxmhw37ylna4559ulr7etmg5n27sdnhpfa 1 0.5\nmmx1l5hsvt7g2pydzauqhm77g4h8es27ffagmpseuks5tm3tn04n6nyslcafqj 1 0.5\nmmx1q3v3z5txguskd6r0nrqqm4se3u4h5xasw4plxqk4cxfyw3l7tmgqayunfm 1 0.5\nmmx1j07gy44rhsg9xtaf9kt95h8jr8vq8zq40ljf38dqh4mmtkekrtgsul7gud 1 0.5\nmmx12tkjk987c9kccda9efdrw8xvmuqmca476czrfp0t7tdsysk36hwsdsstc5 1 0.5\nmmx1z9p9lvrqf92x2lluafdyvrz3xjnrvag9wl7lhr6tfkfc0phzklmq8gdhzn 1 0.5\n"
  },
  {
    "path": "data/testnet9/rewards.json",
    "content": "[[\"mmx1pfyewvtg6l24q40kx74cm2t9epm9wqwx27rph2l8uehnpzhrlqqqupy35q\", 58], [\"mmx1j7njmgtzmqr49n9lyacawww0uv2sjgxs7d04xu2ns6k62hfqycqsh33u92\", 69], [\"mmx1k9lslhl4wmhs7ray9lfh47cxkz0j5vr827vypyaltsq80697xyqss2gn93\", 282], [\"mmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx\", 3825], [\"mmx10luguxfgx4rfd4nft0ee6ydk9dcedc4gvvwhknp0n9ux9nck45qs5m6cz8\", 305], [\"mmx1q8uqnnncy4jylne7m098x4lnwrf34f400cn63px5jayj5eddhcqs3nuyd8\", 88], [\"mmx1nnrl7rh9r8d7xtxr29tgq7evywy8nvkh45w66f7p7u7tesct8ypq063ctl\", 330], [\"mmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt\", 1188], [\"mmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl\", 1336], [\"mmx1as0ezwhva4ch25cssuzrv8hr2vk4fyt8ycefdtx7dnwt5rgadcps7ezzc4\", 3379], [\"mmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al\", 590], [\"mmx1544prt4r26fm2f6ytlvdfe3j6mwrs5p479kp3lcrz5n58kp8ugpssn2z2u\", 585], [\"mmx1c68tgygju8yrhf4samf9mdc9rstzqe34kcz2zqnyqjxcraejlgpsq6jutc\", 45], [\"mmx1vprl39d98qzd3u5nk95qnhus9vjp4sen2w7y59yu0m5udqll6szquzr6y5\", 176], [\"mmx1f3ecr58txvmxjrlhnx3nw0wg7y7zdef73gcgjfrvcf8lgrdu3czsn4yx6z\", 3066], [\"mmx1ynae9xlz4m0ec99702l48stft3m4kvwwz5zx60zwexhnpyhp8srsxam40c\", 219], [\"mmx1ezvssk3jgn6wr4t03ng5at3mccxyf6868z2kzmapnfqhuyyu2yrsa4vlkw\", 392], [\"mmx1e8xldlayy2j5ptk9grrze76e5jyc8p0uq0zuslawyhqeu7xme5rsh06fw0\", 58], [\"mmx1fr77kwzjzcv3xmrhczs5wwsmxlufp9kkvndch9d78fr3m09mqgysc6lnaa\", 205], [\"mmx1np4pfzqpl26td6khzcfdywcsz0tz4xmyua2havtlpp452vc99yyse4wkmj\", 6], [\"mmx1u2v2uf8seke36nxtxh90hpgh43dy5py836ygkvqwaqx5jhck95ysjepx8g\", 73], [\"mmx10nfcaxrj93rjxxx3us3mwzajznj8qpcd5vg459yfkk8lg90jqq9qxry935\", 839], [\"mmx1zqrr5qw2akhgvvxnfvl3epw5zxjy8j3930fed2agnexxjelrhy9qdrrh37\", 76], [\"mmx19awzztq8wmypthv24e60xmvxzymw82l86y0sdyw5cl5ehnr4ry9smhvg4s\", 906], [\"mmx1tagjkz3avdgz8a5kn8kkhs3lr9lur0fmdt9zuz49h9j9vcg80v9scl8fpc\", 232], [\"mmx10ew79lhecezg2ewrj8l8egjtwmkffvs2jfl8rdgxy32arecyp5xqdryl8y\", 5644], [\"mmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0\", 752], [\"mmx1mhp72cd0lfnlfpfuclh9p6uqcuu6y0cr4cx7qnk266hleawuyuxscha8vw\", 291], [\"mmx1q5kdfkldkc735p5e7aj6y5y0szvhml9nchux98cfqfun4wa74vxsm3zr8c\", 99], [\"mmx1zeqjj69mt8a5pcgdzrukt47cpgg6nwdas6m5j6aqefxapq7klcxss8tcha\", 718], [\"mmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5\", 719], [\"mmx1vsav2xvgz8p56c0tj2lel0jew2u5v7r8mun2nm4tgu445w50vg8qx6p8yg\", 46], [\"mmx1egfrdtt2khy7hv77kczkxmr8xml7zg4hqlc460527ka0am669q8s2asllj\", 3], [\"mmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq\", 4367], [\"mmx1vmxgy2uzfh8z0t99p0yqgrea3f97grmh33shc28vtvg2lkzcpygq0ls0np\", 2], [\"mmx18a9m6za5h5j0t6qgs55fhtucpmzse94aq8z9xjj8lpxhyuemsygqhstwmm\", 1531], [\"mmx1c4sffu66s9eepqph3kfjarh4fp5h5dhl3u0r8jvrqlq4jkdp3sgq4dcav7\", 160], [\"mmx1255zy749m3fss4azm0ggj304y6l5uswd2d0rm0hgdgwts9dlfygsgnzfds\", 67], [\"mmx1ed9e542ggt95rk3ygc3xt29apzs2fsx384mwhqqwy30qs4wdhqgs9qh33j\", 1488], [\"mmx17vr7dm99pccp240q7kr4ynw0tln4r6h9n34vc9dcdk7gch3dcqgscgaw0w\", 278], [\"mmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n\", 3405], [\"mmx1n04te3zvrvfsgmvzl3dzegpntqeqevwmd2ycwwwhng0hwslxkyfqpq2ng5\", 465], [\"mmx1ryur5srud4qgamfq2pmfggw780m3z2mlja4665v7f7mfp5dejyfslp6smy\", 352], [\"mmx1veepntjet7j6lw2sfx4p9e05day63l65wj2pa7g7cu6rusyzru2qktg3rn\", 4645], [\"mmx1h8thwkuhp0jnlr99ntwllhwhvp773yxufrcuwsh9q52vkrfcdy2q934mmu\", 335], [\"mmx1uw2mjnw6zt8t0r2w0afqu3zw7jkjl80xjwnfgk6cx7m2c9u5052q6m24l3\", 137], [\"mmx122x5elltrsykqwy27q4jpe405m5d6aaxtfte87mjl6zty5e5ju2q9ucfz8\", 216], [\"mmx18tcgc6fe94f4qz9007v53k9mvv29rvtp7mef0wvqh0vmmnadhv2q894jq4\", 1794], [\"mmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq\", 5196], [\"mmx1els3e8hj2jvteh7y2xgwwxwq2uknurtkp63ca74gcuhrcajpzc2skqmh40\", 680], [\"mmx1r8mm9d0q88dr7dw0v94yl0cthpr560r30x90zxcutltxcck6xq2sm3yx2k\", 188], [\"mmx1gcrf27d3pmwese0hl4ewnm7xjcwfqm9e789mrax8lyqq86xtz5tqrql96z\", 17], [\"mmx15spum2ccvkzj5zg32v0qzy9xhhafsa278ujyq20m2yhwq5lpxstq8ghswd\", 2138], [\"mmx107aackvhak3d2lapgz6qprp9785qfudzrclptqzvgkpzly2ppqtsypk9kk\", 415], [\"mmx1axrdzlwdpczy66khlgcx6zffrury8z6jxxapeygehz5djt5cpyts2mqw7f\", 465], [\"mmx1gntkqf266vrn7swllylnxpaayt7n06yqxhxjsaglkk8fzds4xuts4gwjsw\", 1138], [\"mmx15w4ytftzunx9ues8qhk3z8wmrmtgcg5n88axzk3c8qwtzr3n8cts3hnhj2\", 102], [\"mmx1mtug0wju96l4p08r2452lnllej28stdrlpz9p7qc3vlfmj888uvq0zrzhl\", 6], [\"mmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm\", 14292], [\"mmx1er9czf5xeu2wnpjeg69hhttxppwkpt0hmazpclhgjha0nad6kyvqeus2pv\", 118], [\"mmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9\", 2884], [\"mmx1h9l7sgtnyagj2zctlj0xmmn7275uqpss2dn8funllmgd7aj3auvqv0fy7q\", 894], [\"mmx19398nqhvlk3t79afq0csx9lyg6j0utftw3862295ue4h4tjgzvvsjt3pcs\", 246], [\"mmx1arwca695tyd8rsgxx8r707xpe3laawcv3lq593hs4qz9zehlngvsz68wh7\", 214], [\"mmx1f4msx52tgjn7wwetqyx9e7jr63krs2ut8fx0n5ufqvp6fncfl5vswzueae\", 295], [\"mmx136s9temfus3xkgz3ftwqkrg3kpw3nr67088u2ckhkfvazqknycdqe09z9d\", 2706], [\"mmx1humz3m6yfc5rrf9zczyjkptr7snre4e9slypuwhhgsn9eh952yds80u466\", 62], [\"mmx1c3jpfa9prd34jup0ny2yjc0n7adcwumfukjt90dfsj2262s3h5ds4fuwdh\", 29], [\"mmx1kx9uarw6ld7w9nmxytejkzs8q6r5376cqmtlxcd78pf889fwfqwqn6pk5f\", 22], [\"mmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c\", 996], [\"mmx18gm4fpvhyu80m262mptx9y4l6apdlwrsecfye70n6rslzuwmqqwspsnw0w\", 1037], [\"mmx12wfqpxsx0gxlrufeptynuvwt4fn9wqflp356l2sxhveshsrkrqwst4uwh3\", 30], [\"mmx139le573u5rq3g7a4adydjznp86en3u5wznrlywq5k0jy0s49fvwspq0w5k\", 95], [\"mmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj\", 2427], [\"mmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\", 344], [\"mmx1vkya64sext8u0kcj2fsrezryfvxyprez6xdxapkzpcywakxh7v0qu63esv\", 767], [\"mmx1mcsgnk9wd5wgausw8se9d50gv2m0dk0x8gg658xy76cnuegl850sklk8p9\", 45], [\"mmx1kn0k496puu64hyutyn6augc2cj52rc4p0vmmfcceqezp2y5kfv0s6ddymx\", 77], [\"mmx1h9p0lv7at2ahtulugvg9vdh5nkjph2uvg93uz5azp8hmmuyaj50s8ky6v6\", 253], [\"mmx1lauskl8kzuwevqyx2ky8ale95esy87swemetk0zhc73ctrdm5c0sxy3exa\", 223], [\"mmx15cf5205juyar33ugp9qkh4e5ne9n0ylvnyg0uf6uyymd3tgzhc0sm47jfs\", 10830], [\"mmx1cnd5cv200efsm7q85dxl2368q9ymcyq4ry5akgrmn282jgdncg0s8lrgsv\", 1019], [\"mmx14xms6j4un330ca6y09r8ffag0d9gsw6dgka97c82k32d0qtkuu0svjvmgs\", 3496], [\"mmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn\", 1869], [\"mmx1v35z3r8m5aenzfv9gjx0wcuk9zj5qu98asrr9qa868zrq7qncssq0lsclj\", 1239], [\"mmx1de0udjakexj8n4548lm5vy8p69geex988ch6gqjpfvmdds5mquss2xt7jy\", 21], [\"mmx12hpmx28f6hf0hzx5j6z9ep8vjmpcgq5kwmaxkpagkqdfksunkgssmk59vn\", 514], [\"mmx1lsgrc4ea32dg8zm35yg49a9xzanjav88wdvtvfgu28s92alec5sscmwzm0\", 2731], [\"mmx15qd64czwphlu49mlj6kmxru6wdcrjny326mp5d5p0hpzhuhw65sslkng8e\", 445], [\"mmx13j75773f8tfepkdjtcrpmv3djm4y7htcl2waq6spxkgtxs4yss3qfukrk6\", 160], [\"mmx1ghyal08f7r0p3ft8gywyr24p58jhe9fsy0xmu6wwfjuq4z079q3s36cu8q\", 318], [\"mmx18evqre2xyqqzgspaam0sps0avu9xt7llz7t3r9wexelpy8jnws3s0u7sev\", 370], [\"mmx1sgquqfayd4n86899hjxr4xg5z066jfljxj6mjysns890vpckj5jqt2h9t3\", 791], [\"mmx1q9wzqs7kq8tzw2yhnq05ljar5urwratlsr2wvuwfgw40ff3vmcjqhy8rd8\", 2], [\"mmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj\", 277], [\"mmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf\", 1758], [\"mmx1kn9t8m4uxn7xpqpdy34xhxrdkuzs5tuhjqyc8qxw69decxqgtcns9yq940\", 57], [\"mmx10a32q2xtl4pvm2trnjf8cgyswuyywg4allvc7j5pakau4adcdcnsvmsr0u\", 521], [\"mmx1dwr96cxjzyc6532h2gjagegkm58ns4fdrwj6muhccgxn5ysuqg5qn9mzn6\", 6394], [\"mmx1m6dwm8wvtthgngztjnw7r0g4z9s8797xa7hdzrj2zyajctgrpc5qx2zqg7\", 399], [\"mmx1rlanqjxk03n363dxgqfek0390p6pfdflm4vnf5d25kp8rxd7lg5q3sf3xf\", 29628], [\"mmx12wphs5wk5nq55363secf3glve6rzkzmgqfytyq3mgk0lsun99y5s3kk77r\", 4], [\"mmx1pangjagnfffhfwpk265ry6a3zch4rs2kgp2rup7pwtuphgmsls5sj55j2h\", 36], [\"mmx17gjhpuwmfcdlymhaz9qwat2frpptev3pz2qmuq3zycj76qwnr54q40t5l0\", 691], [\"mmx1pj0uu0lna9r8rgw8ccn4nj4kudgwxchv4l0tjqpw2x97035a2v4qdye8a5\", 1844], [\"mmx1u4m0jmxu7avg5am34pjw3g9lwqys7vcfp6ah53w60626rywvrs4sjzl660\", 1240], [\"mmx109nvzs3vhyjqm3l7g72fqdxyh465fedk4xjvy2rnhfmgrw5l8c4sex2mej\", 3302], [\"mmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0\", 674], [\"mmx1q24h2qhg6ju6cn8r26fh85cv36mmen8ztn2ans7w9aln36p6d5kqegu4na\", 22], [\"mmx19f4u3dsn5eyrsp24r0vnun6zadmnlsqpldf5cvl9w6dtqdvenvkq4qclt2\", 29], [\"mmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0\", 447], [\"mmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs\", 667], [\"mmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0\", 2282], [\"mmx1r2s7q00hau24y49gdglqx9luqlgjug46del32hmfmujmq87fhqksw7emhl\", 719], [\"mmx1hkmks5m9u9le0k2zmx5djjxr6eh34nyzldlnty3mzk6yhzvcevks4z2n29\", 876], [\"mmx1n4n4k7wa79l83ch35r68eavnh0lkwcs3h52jt2xjl6j0969lqvhqsew3wl\", 564], [\"mmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82\", 1467], [\"mmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn\", 291], [\"mmx1ay2su27wuxjye9f9njdj0e7jjgxs4gah9p53upmrt4rwtv6afuhsw6awcq\", 269], [\"mmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl\", 583], [\"mmx1f4g8tdak9nw2waf5v4g8skt6gqqpnnlvxhx0y5vjkm0myv97svhstqzhm5\", 3501], [\"mmx1lan9judvg8w56k94gequv9k6rmzr8kwmq0fk0vh2k69muzjpauhsszypcq\", 172], [\"mmx19zr02kj3reljd7fz6lrpwdqep9s2rah2nkcwtm77yxl3ja4sqvcqdxt8gf\", 1067], [\"mmx1dm7la9qquehldy67xsfynp76p39dxa5xn4veegz88m7amspgpgcshv7dfg\", 2526], [\"mmx19xgatr5wuucmh45623z25w42h49zxyn6gcp94dkyr2zrwrm0xycs74mzx6\", 2], [\"mmx1hz0h2af4zmvnczp0twyzt8uts262pn9h93awamhc2sakdlvxvgcs8llaeh\", 510], [\"mmx1z66g30cq7j7apzf29zmdsu28m5vrqw9x8m9jh2a3vddrxz7fsqcsh4gv0w\", 3061], [\"mmx17gtsl3areyr6g7xscq67jl2xcnz56ekkk9stxvx3qev7hhez3ccs3juqvl\", 4728], [\"mmx1n56f04jwuzpa2zkl46ggs3zv989fz4yx7yyrcx6nzn9ecvpwjucsudlers\", 967], [\"mmx1tytgkzrx6njx5t6j9gxms2gjv832mzzn2q67kumcft57cyj765csr34n3c\", 4], [\"mmx1cjqcmqm597re656z5w5jq99f7fvyth7wvhz3v4u9xvyxxyjyv5esl8yqfh\", 11], [\"mmx1rx03nd8ttf02y3qz69s9xlxqhrhxtk3a5x8lnkxl3s02au2nkqes8dv836\", 61], [\"mmx1rd8n5srxsgys0l27d3ym8wmcw0lr4jqf7temzz7pqqjx3knnksesgace7w\", 827], [\"mmx1jpyqylp9zekjz9xcccz8h6gaw9f796tp9syvm43x03pxa8zf6ses6lslat\", 1], [\"mmx1xr5534k53fk455wylucnrh5ap09da09jcghz7g9jg2jaarss7gesrjhu9j\", 1680], [\"mmx1a2ak375lfskc6xrf6mmmc89eu3s46ywap2j7d4aj5eyeelctqy6ssshgzj\", 19], [\"mmx1t00welhtn9k0hg075ttg2laa7dj7d26jprf2as70xrx2fuhjyy6sjjp3e8\", 991], [\"mmx1ye76l4yxct7a2842mqa8vcf4q3jqryksu3s6xqvj3qdlaq47es6s2nt552\", 873], [\"mmx1zx8z2zkc0hvn9cpnjctcc8akqxf0e2au70dd3uln96hz6uxw7c6s6s7s88\", 115], [\"mmx1kvczf9d27064yfd7kpha95ehrvem875khnq3zadd3zjyxu78ly6s2vwwp2\", 254], [\"mmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu\", 549], [\"mmx1rq2lygf5p4hs7a3ftmc8u24v7f2q9gapsskf0kgh8wjzzxsddumqjz5fsh\", 2328], [\"mmx1aa6383rdchx47qugjavpkcyxnpjvj6v0trml9h3ez5wlcusv0vmq0gkj65\", 738], [\"mmx1vc3s0rqlmy7hrw0wr5mjfzgqx70senjwnp289x6syu9r0m58zvmsk2jl6j\", 15079], [\"mmx1afht99ekwmgh9s9h043aygvtl8tmytx7ymgavn6lkdxxczrgjsmsqcx3je\", 6335], [\"mmx1mlurm4px73xghkdn02u60qff4f795nnmt04e4as595tf4luvasmsggxmfk\", 694], [\"mmx1w7jnglje4j85z4dv4z6gpmwagqfcgpg7nq7dh6wu98qq7ckd7umsdq9hn8\", 3845], [\"mmx187llktd264wz7f33nqexhh8frcykztdg0emw5t26cvmzfng8dquqzl8qwe\", 882], [\"mmx10qnnual5h4rxxcmjh8ts39l28azqwjqlfz0u0gjeruntvs0zpqus0fl0u9\", 108], [\"mmx1uj0qhzeguf0zayyg2m9z794nrdlk7y7pnprt4w798s5yezgxgvuslzd94k\", 1910], [\"mmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru\", 3867], [\"mmx1j2awdr9j4gun67tr7e02h6dq5522u7lkcu5ftvl90ajgf9kvhqusdze086\", 287], [\"mmx1hmqyn4euv2pjwpp2nf3ayq9ktr77dajwuq967uet2r0xqnhj0saqqexshe\", 5], [\"mmx1ze8ugap6cs90ec5tguyd9hg9g2xv7fyrz6s78ewzlsk7uwn3pvas3dnmt3\", 35], [\"mmx1xr8hes0tgn95zf7y9zx6x649t84t5c4zas0cyf048rve723u9gaskvfmvc\", 2298], [\"mmx1n50ufuaae6aqhxcjlw0fydmhpt4h049rfzjqtgke57sn49p34sasdhzm0c\", 536], [\"mmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l\", 2310], [\"mmx1m2nxpzuhfj4awyc2wnu37nhkhsy0q8spg9egnkzf3geq2kax3g7q54emhl\", 827], [\"mmx12j2e0ja3z0up7t0csl2fmm52jd9mrc29pavccn67uhadrls4457qpv7qls\", 363], [\"mmx1u59mc3s94cezun5apvw35vj2vnzfanjv45svwfdat84wpuefcs7qzns66s\", 195], [\"mmx1nqkt86wlfpkvjylyqdsy4pa2e024cjpfnczt667tshtsv7uh6g7qd8dnel\", 447], [\"mmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2\", 310], [\"mmx1gqsyr45tlv0t2ct76wqpxtd0asjjq5df8etlhdva8wfvt8facy7stqeq6c\", 42], [\"mmx1q33rhh00r0dh7fx79lp9wrmv3t5mgpx6m3wtpajmmenuux0lzvlqruqgnp\", 587], [\"mmx1l5dwydjks9s84n3rr52nwggsxfnrf65me7tjnwerse7xxn868ulqfmwwyg\", 1707], [\"mmx134t4wf6h2ppxnxm02ejutn0va4sj6fm0qkyn0hsfx5r4a89x25lqznt9py\", 493], [\"mmx173nnyxacrsmasx2v80gxpejk6ypyvt52pcgejrd6jtv7yq6rtslq6pw76w\", 1230], [\"mmx15v9jzpzxjwdtn8ggkzu7s5suv7kqhuw9yer4w7ngvenlgg660vlq8zgk88\", 372], [\"mmx1c5txaqqwf9ayjvyehy9u06cawxfwtctzk70e3eh6pm0m3aqcrqlsjr54jc\", 1218], [\"mmx1zyldvfw2ek8a2fv5zm4azulmkth7xntmvxspud576v7awhf7tgls50qg4l\", 1563], [\"mmx1k4sqj4vufu22zxtahymvhtwmjp4c633herv8h0l2z9nm2xn7uqlsjje4hn\", 921], [\"mmx14tmfx4twa5spah6u7he78hg5nk7tp42zdjsq8a25fyenxz64yfqsqdzlh6\", 455], [\"mmx1uf668t2krsyfde2v7cwtwk3traj7gwrfcdcx0j72rjr84nnz2fqs83fpcs\", 399], [\"mmx189rrmskkykntwceazrltap8a2at40wdhv4wvjtqc2xk8d85ttdqsu5l54m\", 41], [\"mmx1ks9t2rksthddy00395l48vaqc9rmjuznw0gyuta0jxpkzsce44qs3at8x4\", 390], [\"mmx1da455czfvskaeewg4prqrcysxuzm0x5kgsge3fxafz3e6ddmvppqpyg796\", 1252], [\"mmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3\", 2248], [\"mmx1478snw4amjfq0hnhpwl8de8yup2thh5f5uzmyu5g907az5sv6fpsuwfrma\", 3727], [\"mmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn\", 2068], [\"mmx1j49546jumejnzwpq4ptdal0acmje45de4y9c99pjg5kglmazrazqxex7qz\", 1215], [\"mmx1kevvjxgq5hn9kzlds67gt773fsytmpv9vc4cmqnxlcqnv3ftm4zqm9y9rs\", 66], [\"mmx19nnl9lw7td20z9l22v8wk558mxfrdeud8ky3229utv6e50cqyazs8jhq5e\", 304], [\"mmx1cta37dl4czqsz7jaz5awly9kxy6v3v3nqes56vugfrg4h263fdzs99rgzf\", 369], [\"mmx1xcfx8dstn3hg0wwfdh7lcmnm2gu6x95m849jay7ruzpyw593jpzs800vee\", 16], [\"mmx1swqkluvn7gggzn48wa4k22c8edp8wdnrhnhv0c52jk569m5chprq6nefvu\", 77], [\"mmx1guajyf4849dkedxpj2aqevkuc9a3u37fmg4hyqzmk4l02n37tfrsygnc5y\", 3036], [\"mmx1r74wdy7kzh2dfdcumhc85tuherczlt8c4dsqdl03ufyg2lfa4frs2qmwlp\", 40], [\"mmx1qneuv0d6qzv8zgchxzzcmx2w5k42j4wah6k8psw5fcgw48707drsf6nvxm\", 22], [\"mmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0\", 7250], [\"mmx1fdscrht596p4daxkpzfunczjmurs66j65u5lc3a4q0l99k7h2ayqdvrfnq\", 11466], [\"mmx1gy8npau5h8fas5er5mwtl4sqe2glvwrkr56dj9679h633mgq3eyqpvz0cg\", 755], [\"mmx1hl8lnr4ddyyqynx5qj5psv63ah7atfrt67s9eszlck5dy5yy9aysylv93p\", 3419], [\"mmx1gx8an96g7ky87eur85puyex8r24qswx5wn86r2849njg8q2hkeys8zqlvp\", 362], [\"mmx18csvx9uspv3mp45autfk4dj0t4yzvzyce63gv66nahaq9pct73ys70ezu4\", 651], [\"mmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c\", 887], [\"mmx1zp7rs0q0dqthcwdfvpaugv6px5qylq9uvwltvq4gpepdqyk9299qhvd3tr\", 173], [\"mmx1z8wnphkp2d50k2kk3f30eyxtp8h69e3pazzawvwtseuuerld339q904jsc\", 57], [\"mmx19j967tm7fjn73tuwr03w9k6rat4j409295l5j6xrs7w65gl0v49s93mmjs\", 2], [\"mmx1j3p8gtyajzh07ag8cv2y776h7axrwhvppckxxtltelz08dsaxfxqg6vlwr\", 5889], [\"mmx1ktyudrg32h95gwzg0hfl87lf6wruuunp6w888typfdw9f52g4axqcsltyu\", 627], [\"mmx1n39pyuyq8slux6rcrvpyfqr554tcytn7nfrmwjetkkryeww59fxsf8qvm3\", 115], [\"mmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj\", 1218], [\"mmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy\", 4158], [\"mmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr\", 3031], [\"mmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6\", 479], [\"mmx1d4580utep9epx933mp6666886cect39qt9dl30qwxj767fkxpfgq9h6y3l\", 255], [\"mmx1fk0jqxyz6eh35qnlu70gx58v6ahgng29e4k6zjf6tqxa96y7p3gqu8w8qq\", 331], [\"mmx18yu63mp0j5nrxgxmt6md2y77v4n9ltyv6knvtmwjqqzty37swagq9df8mn\", 1398], [\"mmx1re7sxpa7fmpseg8phu4pqamqmg72qmm3e7fzx880lz79dnyltpgsga39eg\", 202], [\"mmx1hwq6ezh6zgc6pvadxh343nnhvenc5zw0lalx4la9777ucv8lp3fqnjpwx2\", 692], [\"mmx10ah956exf9phe4hw9xwkn3a7m3fwxa7pmhr9cyvlq5p84f8yy4fqwkygu8\", 34], [\"mmx1tms3d3n23j28f9agpm0jrdqnh634f3q9rgcnwsgq64yhcshps4fqd0fv6k\", 533], [\"mmx1qqjqmgyqws0jk04frzf4e98ydd3pkcsfyv65g2t3lgnp9t8z4afq0kqpst\", 1266], [\"mmx1usc52whlhctpx08phhjzge03jy0wf2ft0y9dngzgxxs2ev0y23fsgjk7kx\", 1178], [\"mmx1ywen6qnhge46fhjqwxtnyapckkakzv5m7gz8339j0kzkvzeev4fsex4z9j\", 5690], [\"mmx1akhqtjzm3kkr9wlj8nh9kwuza6r7vm4g2nz3pcggmq9dayz7q92qncwv0a\", 1], [\"mmx19cxxrr2c4a39pyqda7zqt0dxga6ey7gc67rvlum7ecpzpagtrp2qcakr0j\", 11], [\"mmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp\", 2227], [\"mmx1kzfexe6m93ggzewpf7xtd6jx9g9n2k3p9n0em8zhug623tx22d2qdzqnq6\", 11], [\"mmx1s4pkkycenn7e0g0y4c3sz2yrkld7m98mlm8mc67y7lj4trw5se2qy4eq5z\", 1715], [\"mmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5\", 604], [\"mmx1m3tug5239zp7zst4qu7c7cns8f8dvel9lnjek23v2zd3ed9mmf2qzgpa9f\", 40], [\"mmx105ezm538jqpj859u3ygggr9umm9nrfxrgjd20mp8j3g22yvev4tqcljpj9\", 57], [\"mmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn\", 2630], [\"mmx1t4q59k0tu50ldpdklks90yrmtdyacw0v826aql4n4dkdvxzprets9vvt2m\", 47], [\"mmx12n7hafkn4tfwk8jta677lw48092lezrx8vgwn4t7ulsweeg6xftse7e5s9\", 207], [\"mmx1j2ej2wxexc247mxf5k90lmjcevp4r5cuuaa3ukl7ywvfq488detsgxj7jl\", 7], [\"mmx12uthvnq3g2af96lc3un900pd2tyy8apf0fsqag68d7fxene639tsacu4zm\", 1235], [\"mmx15hfmkxyxttvpt36w04e0h3sdgr5r25869jpxehj4h6mrt66kppvqp9npnm\", 438], [\"mmx1q3eh75hak0v9f9psa365zjypz62q8d0cwv2qrpwpj2hayfn6xfvq747gj4\", 3428], [\"mmx17gfe96qhqt3ylhxxqj7x6qxjzvt8cen7s4ks6e0mt642dplug4vq652g57\", 554], [\"mmx1uth7wfnyvzfy8nf56u6t5xhf085l870ytdjazm4g6ja7qmn6w9vqljj34x\", 154], [\"mmx1aa7hmgy7dhsmkhsscp8vlk4y48jyntq0zndsd4lvn4ht0nrjk3vqrtn5mx\", 2693], [\"mmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9\", 301], [\"mmx1lntqvyetpdaqzkw4f9hqhuh8kkf3f7u3rl96gxz3lgztfptfaevqk8elws\", 204], [\"mmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0\", 322], [\"mmx14ntt0scarmrahc8dq3xfdwqqpuxddh6ez2qaq4dcdyyw0acwuevsumdgvh\", 460], [\"mmx1evudswfffa6pru342f5hkduqhmmalx3c94clvyed63ht0dkn2edq3shffh\", 268], [\"mmx1nh05jetwxuhj79j9k4wx6ujsamseykk84383jtmfcpzu2f2hz4wqj4e25c\", 2915], [\"mmx1d39vgf387ct682mq7ua9vlxpjs8w47ennw69wp05atf65stht9wq5hkxpd\", 1533], [\"mmx1gw4n8htnqwhunjyypmcheushazv597xama2tx9pjf8zrsdq943wq8luz82\", 206], [\"mmx1nra9jrj79xztttq6hnnenveezkk9pq4w5whvlmr2nhj4s56f43wqx0paqn\", 349], [\"mmx1qm77f6cv9z9ufkavnt5nll7qq55rvjx3hru8kafx4guk3chpuawqcmd098\", 967], [\"mmx10k4auqde486w5wyfajnmpl4ds6tv9x7tzdus85wfxk3r496cgawse6vruy\", 9], [\"mmx1fm0j6pkfxsjeufdcglg58v3veay6mn2x8qp45tevkxfny696kewsv42zg5\", 329], [\"mmx1jj4r3za249xxcyp30jjyen8nz6kmtldqpypwuqhukzrp6trme30qsvdfxk\", 60], [\"mmx14p5y3gn5fl8t5jt0twe0l68jwe9n895djrg8lkk55t5rdupggf0s8l0kd9\", 8], [\"mmx10pxshsy5ajaf90jqgfz98xms2gfwmr8qh336yg8859khq47rjp0sm99hfn\", 10], [\"mmx14fz0p5ff557c6sh6xx3ssztc8sv8a023cqugskep0vm4j85rna0s7fu03g\", 503], [\"mmx1ft660k7cfrsmh5l4twq3xxwqzauhm2cuz0cygd087pvl3u7p33sqthpl7w\", 2320], [\"mmx1l52feg8wshacztsyf6f77ndq44qp87tdwns9wdlxv3t4uej08fssuuwng7\", 204], [\"mmx139j94tjwh6m9mnxdej2j2nkl8xc5ghzvt7fvz9pah7jvfxnhdassm4z56g\", 598], [\"mmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym\", 2221], [\"mmx1ff4lyf7ulfrwt0wfnr6dtpuk6tv0w522ef3pkm5ax8e9wv8crd3qe0a7re\", 802], [\"mmx1652t20n0jwl4mn8xe6k3j3zalgpuw38u23e6cf5249n3h278033q3kcq00\", 542], [\"mmx1nu2e8qz86kfx5yfnedyrv559d57makxk3jw57lgwsuet0v8dkp3qkmdh9p\", 32], [\"mmx1edsqjgugd0hqynwa9h0gm05vsmqpse9yhwr85eftrxyu6ww0la3qf9hspx\", 77], [\"mmx1l0a7tg0ux27g2lgwq5vyj0dlsuzcxgl7z7vrxeed59glajvd8f3sk5nvhg\", 63], [\"mmx19fmsw5j977kh3nexv48lr0neeyese2pl0g8vgjp429d8hfurtf3s3k5ps2\", 66], [\"mmx1mrmnxtc9vwjkgfst6z999x42wfuwl0ywnwn0rgyvypj6660l093s6htasn\", 119], [\"mmx1cl8r0pfpp2q8fmg2jjk52q8dvhnmf26vx0wwms00ty8xl4snhf3sg65sm2\", 2718], [\"mmx1tgde3wpspejv0gq70lqe54l93n4mrdmrp3xt3ts4q96keddyrfjqe0e0t2\", 184], [\"mmx1f6khu080cft3c9g5l8qwqh2wlza8473382h4gwursgl0txhdadjqn2kzv7\", 32], [\"mmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t\", 2217], [\"mmx1eghncmcx5lurhs30meac277fx0qrkeugexm75ku3jwfeejhcpajsyx5wqu\", 47], [\"mmx1gxz9mgd2z0v6sr4luvnhw2u5qandh7yvl7rpxcz0d06rdfa7s9js6w6p73\", 121], [\"mmx1p76tw7re288zm3avlruq0v2h38feqe2usscg6cdcfwn3f8cs5ejsjkev6x\", 1060], [\"mmx1vp6lfvs36vdft6ljgmvpe7049dygsl4nqy6pvyd090huaq5m44js02y3zw\", 419], [\"mmx1cqgrreu8yptcvyufdussnfqxnwv05z3dqaqu0n5qtfq82n4amajsprkzal\", 1919], [\"mmx1uskav6veu3nxfxr4zs6efdk8yth3tuz55zptp56rf62t0ftwy4nqpvarja\", 2379], [\"mmx1wsnset02rd5ksettxhpf2uzw02jszrgtc5960v002c3cwdg254nqekqjen\", 14], [\"mmx12gjuxcdsh7ppxmc0632zwlegm9wldzy9zp4v2skf60c9s705k35qy04laa\", 2], [\"mmx1x6j2m793ten9em7pu09q8qca794vrvrdc3jcw4yzc8zup0zrh45q8d2lqx\", 59], [\"mmx1f69lleyu3cznmnxlp9xznjnr84xrzutmjjcl4nlsfv2359fjze5sz787ay\", 411], [\"mmx1ffrdjd4ccl6ga736hz3ran0xl8k9af5xf9ae28hqjg2fhugfdf5s4q8qr7\", 282], [\"mmx1tcwemyrrzd62wrh8ff3kn4z3hr0dts2waxpxwfpwg2jau2tz0d5s0e3kme\", 106], [\"mmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3\", 2016], [\"mmx1cgx3ck3dmznw8xg78jc9xfcf7rws0yrkhpj5tymnc25dteduu35sd6p92j\", 205], [\"mmx1xn5hqxpphvuapka2kmg6xhsserajjzd48v7fknldems5amkf2a4qf0g2j2\", 448], [\"mmx1ddxwuakc6p0mp4yzx3e9rzt6d6xtkvlvfmqnz6nx0umd2y9kc94qsyt8pe\", 45426], [\"mmx12amu3muxtrrr54qkd6wr7xtawh2lare2aqptywufhl24rex2u94qzl4tgl\", 1023], [\"mmx1yqycann5zs9eupjsea76ahp5h2h0d52n6hqxvd0v3whezr0wre4s3zku4g\", 176], [\"mmx1l3p8ljlzzs2kzr2d992wmj6ru5t95azef4cfnp289zgezfppg34ss5pch4\", 6222], [\"mmx1fp4266lrf7weqrkc3vdm2d29wnc0f32q33sksnfnhagcshq6ka4sav8d2y\", 1971], [\"mmx130vvjzlqpd3dx33j5dvvcwxd2ry8vtx2xstahwpmshpwekq953kqh5r9rv\", 47], [\"mmx15qq0sdefrea28hhlhe5er0vur347vztfsezj76fapg4wf2nxaekqqxsy66\", 1414], [\"mmx1n0a3t40vv5kdgfnduj82kzw9ewy3tu5utszgxhkztdvqlu8xgdks8nyh2h\", 116], [\"mmx129hgzhuh484dtlgz7y2r4dmc64hqzn4680z4dg8qq2gtwymfm3ksl283x6\", 3111], [\"mmx14v3lzf453lx676rj0uhvp7sph98g7hqzkr0f5g42mtkzppzf2dhqw5f8a2\", 1], [\"mmx1a2ytmujh3evrw2r8ljq6alul6drzqlrpa64ae9f5xp38kecen3hqcruxkg\", 6797], [\"mmx1n39lrqg4kq5ey2tnk3wlqxylcuflevkkt9wffj9x2fsygma8m9hqntpsry\", 392], [\"mmx1qvemldmglge8tr2dcwnr4gqam6vkal5dkc2jwsz2jyyy8rhry4hs58hvrc\", 592], [\"mmx1l74cdd9j6jelh0pw9l96t6vm43zyqp8tdeelcywg09ezac7uwdhsmvnq4y\", 16], [\"mmx18plakxe6gzc7frl7mke9gfhaz30cgr40eyahtjexsm34kexk0dhs4cdedg\", 950], [\"mmx1au96n6nrcskxc7wqedekzfmef69jrx8vlws79ypnnhuhc9hgk4hs96y2s4\", 112], [\"mmx1av5ws5dp8xkwp08g3ge4fsmr5r80c7y88p8yru7rcv3gsvnkcahss2pygm\", 402], [\"mmx17l3xstvyx5rqxzqvswwvf27zz38ckt5q2030selhwe4elqzwe4hscxf06z\", 2257], [\"mmx1kcrktqlr88979xu79dxq5slh3xkvx727j8unxhev9frl8rhw09cqqnl6r3\", 1549], [\"mmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60\", 1771], [\"mmx1hfhn035wpjnm6yhl223rh55e85a23ksp679ku6kpk2n7klxxaecq4xw57p\", 127], [\"mmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj\", 1644], [\"mmx1kvyj70vfnwjwg6je8tf3dunrwrafy9mlm2wtgqx95vwgnz2mrfcskpydtk\", 5425], [\"mmx1d9gx5anuvxgg906tzj0rdkhyypjtrfc09ufdc7yykhp9h46mxecs2qe2r2\", 1], [\"mmx1r5e7qrk323nmr3jhazwr3adu4v8n8dfrh3wvmx38ptmhv7wq23cstwl09v\", 214], [\"mmx1wkcf225wca3efgurwphhsw4z0wqss0e0lwsenk8r06yvymp4dacsm2gzwy\", 2305], [\"mmx16vc774xgs3d0ce37fsc6ykjd9elnxxq8gaep2jtcwn6endwck4csz6fz0z\", 12], [\"mmx18gszx83xlhzj3s533m62pazj3c7v08rgu4t8sh0vs9c2leg3ldcsfgkc3y\", 76], [\"mmx1vkmzqsggqcqtzy9ea8rd56zx20uln52ug5q76y5u7hzjl8jaxfeqe3f49d\", 492], [\"mmx1qg6du0mef5nz96gz7wa6f0ndmdhqnen0knwz3kw5ytf4kl9f89eq2kmrsw\", 139], [\"mmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5\", 101], [\"mmx1pstmxwmdgkyzqqll6sdu5vdxpkm82ya4tz78w8n2yq4pdcdz39eq3uwvw5\", 6354], [\"mmx1qj5zysw5wc0qhwljrkgkvskmfsempcr8hf9zd2m9xw5dkger59eqf75dpg\", 197], [\"mmx1lka3j0475gzy9yk0c3lt4f9d0p8zhlcujhsfsl3f035z6fuytpesppfrq9\", 446], [\"mmx1f8yps5v4rqakx3gyws5hhlrmapcjzzf5j80dm655ehcrf6qgz36qandk5l\", 565], [\"mmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu\", 782], [\"mmx1qwcxn8k9nxdu43ytsw0ew7wk7mmptr3ykvtenms3fsyqexg9p36sp9slcv\", 568], [\"mmx1rcyj0tmkrgejq5mvfjp7en6dajqh877960vdnrc9m5ujhps0df6sfsnhl3\", 1092], [\"mmx1rsjam2cenutaew3r3ssfc8zfh2uy2y3ycawafk0y4hq49djayemqnelh4z\", 59], [\"mmx1shw36ys05ppa2jn68qy5s7jl5kzy050rqdk4pz8catr2wadnadmqh275ry\", 6467], [\"mmx1s8vpfq0d6unp2v8f4nzgxkj0zaru70ps6vael7a20w85rwljlemqmjrqlp\", 2], [\"mmx19wqxw4stpk67hge9epj0wmgt59r7w5fepxwxegf6tqrj4adk8emsz9zdlq\", 13], [\"mmx15tfvs7twvmtvpp4zvgpedz4suysu4fa88zuzjyj2yjrkpscme9msaye6tc\", 4643], [\"mmx16d3ry985fdkgpvj93xygv0tn2wc9ylpex6t08qz0x6lat9km6dmstdhdhh\", 1621], [\"mmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g\", 976], [\"mmx1036ucmxlqgrwmcuuheau33k0h93u0wurkxznvsl7zqgej2x2rauqaktwxw\", 2760], [\"mmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v\", 42015], [\"mmx1lnh2du3xrhsjlu2dst8z78x285m5zct9p3c959uldvqpv6km8dusz05n7t\", 71], [\"mmx1zrhw7537pgw66vt6df5xxxh23f35gt85ml6s6fvc6vr2qshmdeusuufxxp\", 26], [\"mmx1gpscz23fjv9fw32s3k2g4enc8k0arasszygjz929kmkp96a2c4us8hqqny\", 1999], [\"mmx19jlhmuspu5xz706c63vheckjl6z7qx9ne5rg9r7c2tq4vj8rt9aqj60yvy\", 2396], [\"mmx1xcalpv2gy0k955p6pl97ayzrycmvrplu9cufx6dfctwrwd9uvpaqypgjxf\", 1709], [\"mmx183ajctzcp95lcx2zztjk58gytyzmrlsdljna6lhedqj7h3jn04aqu3snsd\", 4056], [\"mmx1hd5c7v7542hzr9j3ac3zx29d4eglxyq8c38nrqvuzdsjn206837qehjl0m\", 210], [\"mmx1a7mtekvyzh5f0uswz0pzqq6lys66ta9eavjyk66w4kgrseej6p7q5savlp\", 159], [\"mmx1tgppefepecrczwwad3zlvcwhuujsyr63gh8mv92el5yy8egzk97sdqpjp8\", 540], [\"mmx19j0tzeawmjma763dj027q6c0up4a8z6leypc7htgpxwnk6wr6d7s8est7d\", 305], [\"mmx1xdrf8vw7nl5e94grks7u3h7uxaamgeuv3s30h3mfr560td6rqdlqj2svmq\", 990], [\"mmx1fxxkthhcqf9ryfljy8xr9dcw4nq9q6mfetxx0dyqwq7qkv4vf4lql4qzgx\", 1571], [\"mmx1450fn44pv09yuetx3yp9vtvx5k3amv89vycq0f0dvugcvp6zedlqsw05p7\", 36], [\"mmx1v5u67yws0zlnutd4lw0gqk8dk75xnjj3k87rnzjqurx3lpz7aflq863r48\", 663], [\"mmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq\", 548], [\"mmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc\", 1419], [\"mmx1j7ns20cea2havm328p28vxeyfdcv0yrhndl2h8735slc4u0q3fls6dz77y\", 7720], [\"mmx15098ny3pc66kn6sgr6t8jehvwf2yzcxm6lxljvr7dfxs3g4u5plssgudwl\", 3689], [\"mmx143pxg8tpjx889uqxmczg7f7wtee3qdl6ya50dnrk7qm84h82s6qqz7dktz\", 468], [\"mmx1m2qrqthgwr3x7cyhf7fc97t00yszfvet9jy6x0chtqq65ycyxkqs4pmxfm\", 187], [\"mmx1qdsec387taxe2aw5j50sjp8qh2eq85deqxa84wmhkvywncvuvkqsygpay7\", 77], [\"mmx16qquaqrzyks7qpq0wv3mz4j3gdk5c0ltnutnurun8ars8s2jszqsj3wzt4\", 27915], [\"mmx1hsgvhawn7nz3xz6dqeu852yrnpdygf3hhahq0hydnxw25g8057qsp76xwk\", 137], [\"mmx1sg8mgch2566d2uncn3lew5wwwacp2femp63y4gshj0qpy9fehjqsysa3ng\", 167], [\"mmx1rw4n2d4a3mrve8kfwuc8gvqnszd9m68lkqsum0dzk4j4ztlq2jpqrtcpy9\", 5826], [\"mmx1rn0p87m57fzv5je8wu97aegkhejf7r5gz3clr4ajs0k42p4g57pqwh85wl\", 178], [\"mmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3\", 1494], [\"mmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv\", 2323], [\"mmx1ttds5ut3j7xx72wxg8c6226ewqeyrvzydml7duym8esjwxcg3jpse245zn\", 7], [\"mmx1u6599454hfykwc52crn3wj2symdjkqsgu9rq0u3wmwteuc4z5jpsr327jw\", 371], [\"mmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry\", 1319], [\"mmx1keg2775ll23shtjh235tw9g7lu3wj5rj50ws62vnwv89p9vd07zqwswcn8\", 10625], [\"mmx1glx7a9c25wns42k936r3qczu0egjtlshkaxgv5atxpyyj2dkd6rqklrnhh\", 253], [\"mmx1pqayqpvzg3txl8q9cl3ul0zrt3v8zdn7u6j9vzw9gn3jlj3cfxrsgskgts\", 10], [\"mmx1355xdy9zhgzd8k3grndkwdff9qr8qk8raucr93praws40s27fkrsjlz07p\", 723], [\"mmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s\", 3279], [\"mmx1gkwel33sdr4tgyfq55az5t5n8fzy3thum3v03jmw3q730ee6ajrs22jkde\", 992], [\"mmx1x40j0p3ss44jghrx2t0yqr9gqcr36xx9pjss4vvxwj60gkfvg2yqauewfw\", 699], [\"mmx18tt3u9d47tc2frcp4z20yzt2yw9fpe0kn4hsnardnlzdsj9eewyqkhaxr9\", 316], [\"mmx1xm27rmtx3l7a00laujl97484grv5xqhrled5q7e3awlerfhe32yscwur2z\", 3286], [\"mmx19ud3ev0q0tcrpsmh05tggwt4n2nkwrzrrtuwtyv0pl2t3t9w52ysy954ch\", 220], [\"mmx1su0cegxxdg73yhm3xu226uj74309x9ll5ycd5m8eh04n9as7mjyspr0w7m\", 544], [\"mmx1ahckwehmp72cr9rkuk3sek6zv6ay0c28tt7fkrhy5qgdpe06t79qvrjsns\", 200], [\"mmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr\", 1596], [\"mmx1qn07jmdsetg4k8gqvn3wmv9kqkrhrsvrmlc547zslku4grlunw9qqllens\", 1646], [\"mmx1h7fr39agpsasxptf6tflwaqscczaes5ep99v0qqe84sntdh0ew9sumnljk\", 83], [\"mmx1p27mt7n0as5pmzllk5342na0zjemu7xcylp3shlucvtdhjpeqxxqvgcnx5\", 1052], [\"mmx14sfukr8xrxq5rlpu0dfvvtkzdzpqyxqyygzdjg6qn5ew34ynrkxq7pxlm6\", 1251], [\"mmx1u802gcgzhfkkggcq5l7388xz2fn9hswy7zvh74t5c7yvu9x3r7xq4d9r05\", 78], [\"mmx1lnwzzc8kdm0lnfezlapkh66tl59ruhn053rtsgtnd0j6qglr97xqt865yj\", 389], [\"mmx1g5q667lmyzaclvskxhs3dp533pv5g3uvqu60v8n9ckdcgjm4e7xqe694xs\", 67], [\"mmx1499ujt570lt5yjmvrm7j6xqpvhlgw7kuye4lrzhfz8p724fp4zxsx66pgz\", 279], [\"mmx1qh002xzjsedzpuzqq4cz6spv4qayuwhyt84j7pd8zeylqwl0k2xsnhg9y3\", 534], [\"mmx1jpfmyh0ndxwz47t3d6xrdlkd0mq3nckuasn8elvjfa65xtzm2j8qamxfuw\", 9410], [\"mmx1w7dfqwgrq4v8uyg2kpcda5ec44hnvdeww48zysxue2mttd04tz8qdpt88v\", 67450], [\"mmx1fglt4y8vdcq2errqju4qulnmcfl3he9nr09vxqke9hl805tcnw8s2039u6\", 349], [\"mmx17jurkuy7tns92g07uf826te4azhu3qnydcs7d7snvez9xy3dh7gqa8h2hy\", 1], [\"mmx165nssm0dfafy22f5fgr8ln543g7gjgwrmxmdj5w5arjwma2k6kgq700fu7\", 141], [\"mmx1eavt4k3qfgc30z5wqtk99f93fq8xhtr82f47v6r9xd266njaqwgs56207d\", 43658], [\"mmx16pnkxxv9mu42n7t4pte95ftduqz9ntrdd6u5epqnj5mkdn249wgsmkm77g\", 2145], [\"mmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap\", 6686], [\"mmx1urhh0ud9hrdzf2x4883wg7mgqe2fztfcnjehxz6kqujve3hn37gsn3f8qr\", 5802], [\"mmx1wnkyn2ma6l2nnk80y44nrsqf9fdh27gtx60v3sdxvd9uzheruwfs5kf23g\", 968], [\"mmx1trjmkvfv40ngnfmvc5uw926gw8fndanpnp7mphq2tgqwt4xdw62qmrvn3a\", 6], [\"mmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn\", 7089], [\"mmx1ftt6434d6y9ekacacs5hf3cxg7a3s3uqm9vjm5l893fy5epjyxtquz8hka\", 1], [\"mmx1qxr2rcnvgcwvs3304d8rlm8kzcg3cdrfdnrp0vq3t6eku4g55xtqw8kd9w\", 105], [\"mmx1athk4etg0d9t8q9yy6s68vuruchxsa0pz37pdgqfsc83nckdmwtqlfdk4a\", 1881], [\"mmx1yht9eg80753876sq3qjljn7nwxl300g70rauqran8qkvdtrtqzvqxkdxq0\", 110], [\"mmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05\", 1458], [\"mmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg\", 3285], [\"mmx15n95rxf5c58taud2x06sgpldy3mazdyf2lf8cemmezp83hc5nzvqp3l3vr\", 3149], [\"mmx1vpg8kftakr3pammp86a8hxyar9s0m54w9j4m29d9d6rlk9ztf2vsl7ck38\", 915], [\"mmx10c7skd5pzvrclcqfemg2nwk0pnpeh6p95aucnt04z3tjhpl3f2vsq6wzpg\", 848], [\"mmx1l6yphrjzvuc0tefqug5zs9eh3gu4fupq6e8ncgsr6mrek2xvvwvsf72r4d\", 15], [\"mmx1mylh2r9352klltxhjqpfj5jnfll6uqfeqp7xunarlg9cqufrhjvs28jrt3\", 1553], [\"mmx175u4freddynpqmqp4c057dwf9ej62pv0hxh4ew6dwlyf37y5ekvs7djgrs\", 2], [\"mmx1hvdake6jsnu5qa92un6ucw70jsa89athx8egx7507eqjk3s9ujvsmzmgd4\", 1080], [\"mmx1k5zj5jew2s2rs5w7dqfzmm2uwv3xavastvkdd06f2fd2x3e676vs8v8rwt\", 62], [\"mmx10lrzsfeam8m8lmrxnhzd2zn4kahtkmnthd0nhytstw52s92d0wdq7x0824\", 9585], [\"mmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch\", 150], [\"mmx1ujuywt50nv9jgt4tsu32mcgurtlu9zfvjutuvjk00d5k8peagwwq44fmqv\", 46], [\"mmx1mq9w9vnuae4fdmn27ceh3h9wzaygmhf0c3sqa7xufy7x0l87zwwsdfm80k\", 44], [\"mmx1jxl5gaxtd8wnc6r9nxmf5s748ct827cpjafdefw8rgen75lyxxws4u8a45\", 160], [\"mmx18ee0whkd2pk6xymy9sz7a9y6mmcujphzqcyl659fxz2cdr5ln20qkd3wav\", 371], [\"mmx1lhqhhwzvn5y7kmgeenjx9k76pq4nnmqg4hffvar8tkns7qpu6z0qwatcyn\", 74], [\"mmx1wut7pf5v32hpylz6rxmrsztxfhskgxp34cgt8vawu3xqg6y8pj0szay6tj\", 317], [\"mmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s\", 1324], [\"mmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn\", 136], [\"mmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp\", 1976], [\"mmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map\", 3010], [\"mmx1cg9kaawjp23h0kxj2ggx5s90c244wy0lsyxp0ltygwgfkzpjnxsqaevyre\", 9], [\"mmx1t797wa3smaufhnhxqpql52tpkm80t66ensrsrdf99ar4h265xjssjsucdx\", 1021], [\"mmx1wepa6m7j62en6tzc75h446sle2s9zpvllv3557t47q9zyr9y52ssu7j49x\", 41], [\"mmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp\", 4701], [\"mmx16qstch29gdwqtfadwwta8fd20zrhqy7pgkaud2h3ceeafwjcmz3q2ezr8g\", 435], [\"mmx1qpyq03vzht2uwf9pzadx3rpa8w8y7pul2he0r5y3497j29ul7x3q7ac26j\", 10971], [\"mmx1d48fsux0kj7empe0c6a68y8gh6f494hv6wgl7skc42ckf2932x3swcfen0\", 947], [\"mmx13ech6m45gf3ludnt3e3az7jf68qntxg2htk492zuewh40q3yqwjqv6jsej\", 24], [\"mmx1kezjxhxk8hxk0877hsfzr93p297xqp6ga2jrgptw52fa386gy7jqs6pz57\", 7626], [\"mmx1q8d78sjm37uz4pps54q0mn4w3yjesr9jg2pprgww6mmput9rg2jqudrwzl\", 3922], [\"mmx18nu9safwcwcfmx9vzaxgx5w8vd8phra0yf2mzjxym9ewh5t5swjquvv970\", 2], [\"mmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm\", 631], [\"mmx1pdlh0rj93akpwww8apmpfj5awd08ew8c7c8ce4lk2cfehypgj6js7a2eeh\", 3258], [\"mmx1chmqhg48plemff47t5hrc50p7sk809q337uvwn6385cdl8y8a2jskzzcwc\", 113], [\"mmx1v2c3pk23x788qwmhh8dexn6mc94an2l3tgj4kp9th0ygz46997nq6xalyy\", 1296], [\"mmx1kdz775nc0jd7uqjrlgd3a7pk6w6qm75w9hw26wa6q8mr3u4m42nqrj38hn\", 339], [\"mmx18jk3gsj6r4y3esc22r0qvxru79ues6z7keha33ahn5tgahxzcknq48ler4\", 154], [\"mmx15sme6pzzgltj9hn9s5u4xjtmyud4qx8pd2kgvj8hsymp6amx0wnsgw9u27\", 819], [\"mmx1x225z4p73e847du0g5k63tgfj3c3zn03z2rr2zqnm6fs72n03k5qrafd09\", 67], [\"mmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80\", 406], [\"mmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t\", 580], [\"mmx1tuw784a8wp38c6q3fw6jfeqy3pvd8ggh0gj9h0xqvez00q9sew5sg0j06z\", 943], [\"mmx1u9xsdvqzayfla2rutaxkespha2xrhn9m6wn7v8z8rhj277v9k24q44rft2\", 316], [\"mmx12h72n35qjgx2qjps70hqal8zuvw26v46rc3auczg4se68878ek4q8xs9xe\", 1], [\"mmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3\", 2272], [\"mmx1rz67uawsu0vhh8zx7ezvpy4d8jhtyjt4g4au39sf4qft4sguwx4sl7kjfx\", 100], [\"mmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf\", 13135], [\"mmx1fgylxyf2ef9p5zj0d6hnz6wr7wmkgukq6zt398uk3j78nhxfu2kq05qm4a\", 172], [\"mmx1pq2x5zfqa45sq6s3zmuuy6pen0t7ezrhmdg5q9q02re4x84rakkqlj5m99\", 6], [\"mmx1dxxgygp75dh3p0yh6kmezeeyftncphy0q2fjws48wzxdrktsy7kscjdmd6\", 314], [\"mmx1la845mwntk5rqty7x33yw2t04e7njxyl3uflmfvea7lxzcwvc6ksmr3war\", 575], [\"mmx1n833p7z44rd62g0yvhlua8sv3d8wmyvrt720utk7x4vxwc3j72hqst6yh4\", 11120], [\"mmx1923m2hlyu8p6vwt2wvcvda97nf0cqnwm6qf6axlt6zw44gkdgwhsz90j8a\", 1552], [\"mmx1q5dh2ghd660523gstn5vmc2hf4w26azr3s3nedjp2wu3ae2d27hst49hpg\", 1], [\"mmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w\", 349], [\"mmx1yknhrstjc5uslrg7zequ278dk3j42s7ylfw5frvgjdsjzm3jxwcqu768zc\", 133], [\"mmx1cv94kw4ttqwzyluzql2cc4trx5mze52qx8ys2pkd7jqg2yp6wzcq0lxaef\", 14602], [\"mmx1apz53l6jeqzdtwxry627f2rpagmjwsj42d93ca8jtwcdtht037cq9fsqhm\", 3269], [\"mmx12rg768ddyzng9npvlvd6qk4pnu8xy9tjjky6udnvwhv378v0ljcq44me5a\", 13], [\"mmx1krwuwd0xfqxq59rhnglkkduxw8wzq39axh99vtqsy0k6tnac0zcsw7fhj4\", 1162], [\"mmx1elqhr769rul729fampn6u3ylcxfprr6zgvvndppkzkzzmaefk6csr0s5e2\", 262], [\"mmx19zerahkctf5hxcrtdh2j5xjynl398ge4avn9nl4zsqw2hs9qe7csjqevda\", 7336], [\"mmx18h89t0y9m8cy8trcveul508ju6v3tnajz2hrhvcs8rm8pn23djesml7auc\", 2887], [\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\", 551], [\"mmx14tkxv7wnyfjm45lr03j8r2qac5hsa9mk75emunjg78qngwgw66essvzga7\", 895], [\"mmx1jmkx9m05exvtuk5swve9x9qe2u6udxx5h8p4w2drlu92523pjj6qsq8epg\", 504], [\"mmx1ksduhw2jnwayh3a62cnhmxf7vax5lult55kj09ejvqgrr7gy726qkp57w7\", 150], [\"mmx1sg74tyha62nx9ttjuk53vhk00248ts77s2ee55ryrcskrmuf0k6svhdwxy\", 456], [\"mmx12ajhpfkhaxqzcgh0lm2zt03qm635e0wazc0u2xlhwp4vflneq2mqupf8uz\", 9], [\"mmx155480tuk2thf5sqkkgft54hmuafu0mj48gql8fdxdvl08guut6mqvy5sc7\", 1675], [\"mmx1p38leegjxpafuxqcjqw5ddd2ny39ajs4hyy93l5hsr42hxhsdjmq67xl7x\", 401], [\"mmx1hsxpdkzeynjv6dswp89klcu6qc8gn0vghz54gcpa95z0m5m5p6ms64gd99\", 10], [\"mmx14nru8xmclg23hcdvanrn72rjre93wyew7vgv7hrwtexlkx2m42mss8d782\", 477], [\"mmx1x7py0zl3zdvtlrz978thjuzyqw7azyfu5264u4l8a9e287rc5juqekjvf2\", 36], [\"mmx1uq6ytg6v53lsy525m6352hznumufehsecaugpmyq36vezznyvzusmfpxm2\", 753], [\"mmx1xc27x4s9qzcsqucjcxqzdqszlp4fjtxpuz56c2770l5yaf5e5jus84sg5f\", 3], [\"mmx1mvlerkhjtrg0qapvxgduxnw0ucm33pjcv6jutkhf82ampzhaewaq7ym4vt\", 140], [\"mmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4\", 32], [\"mmx1ml4nf4gxrz7yc2uymnu6xdx2ssev2q6696ar90pyz72fgp8vxj7s472hym\", 1456], [\"mmx17g6gp5v6070kcjcq0tx0u6ahgqyth4gq9fha3sgsvdwe8xn0fj7sslsft8\", 555], [\"mmx1q65hf2l3zdkl5hgvl38syuul0q0nlnt0pn69nqf7euqmxqelqwlq8eskrq\", 1837], [\"mmx1fgxwy76pzglmqdqxuvv3l258233900kkke3p0mf0gaztjwmxq2lslppuqh\", 259], [\"mmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw\", 2779], [\"mmx1e83q59e5gy528v9j68ewnhpgkwkdpt47y03ev9a3y5ma5plsyrqqru2dw4\", 482], [\"mmx10px4lhql09zw5nlgn8m062d8zw0j6f75acpf000grqxsma5sg0qqj2d7ns\", 2605], [\"mmx1argmcrg9rau7m7xy8k4e0s3xw9j95w7upuvpt9hlpz6epj6jhrqqkrytm8\", 8], [\"mmx13r385uxl5qm5dgt029l3crxsglz6g5t3sd3yy2metys0efjlzmqsl8aevk\", 1185], [\"mmx1nuvnyj4t3ryqzkw86grzzlx2zzvc9plmy8u8zllvey79q7c5r8qsvz234v\", 10], [\"mmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu\", 798], [\"mmx1tsgysdg9v234m6nftjx4fse4a9f6c55ck2vstd5hau6kkrzzfhpqc9wkha\", 57], [\"mmx17dhvxq6fekkfqtvjwle2pwcyr6f76uhz3vsq6ldkc9r0uzs7nrpqvzh7zs\", 65988], [\"mmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99\", 703], [\"mmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0\", 26833], [\"mmx1ln8cwt5hwwd5l79uar8gt20njcl3vzud6m00lxtzc0uecq7zvmzql5mhez\", 306], [\"mmx128j2zgejfdmut0z3559gzw0vntm6rz2fcmhvppcgkyn9kvuekmzqkhk8hh\", 273], [\"mmx14hgwpw5x8zdapw4j35qclc05ajf6xxuqnwxyffszupmtvjl8wtzsp8dgza\", 1], [\"mmx1qymn8rdkm8gak0vst498qpkqvc7gh3l4qxt47m6plhdjlqnv5tzs8ncyy8\", 1309], [\"mmx1l4nf9stg5qzuecmrfvls5wgtd8l3mdgwedcwvu5eqfa3n3pektzs2l5gvk\", 455], [\"mmx1l8ht54p69ynxxf0lxzrvm20956dcpk4lj22rv0jmdtefk70hurrq8m4j7a\", 612], [\"mmx1tluhal45404w3qcd59uw08lwf28vq3hhmvvd9andxhjgumajl8rqk3jjd9\", 6], [\"mmx1rd8z3x6ncsk5734u3xjkqskzxq8tlcn00866309kwqc993j4xnyqhs0r3s\", 13], [\"mmx1rs0lu6yh5uhp3pa8tl3dwz5ts392ua52kx5v3p8h5jrd0x68g8yqc6usm5\", 2175], [\"mmx1qm7k9w4qmnqc2gufp59g6hypfx9gcvpnz5e0j25a66e4vhnztmyqn04u69\", 5109], [\"mmx1atwce5d7s6pn27censfqkrc4qtqkh8a8ufzylnqakngeg7elutyqs7yqek\", 120], [\"mmx15wphyfczn8lvfmj28gkhsneg8gserwef8ergm9dxm03ngy8adnys2ypvdm\", 3422], [\"mmx1l5hsvt7g2pydzauqhm77g4h8es27ffagmpseuks5tm3tn04n6nyslcafqj\", 134], [\"mmx1m96tljuk8yjc9xwu4q2awulg8hrgpg0jp6d9al5dm7r2hue2u8ysphwe0u\", 2678], [\"mmx18pyq9ckc7wykdz3wmxm5e85wsgwnwyxundkma5wxxmc98543z89q9amqhh\", 290], [\"mmx1xeqvfd5a63j3j7vq287dvrjxyksw628azkn8u53sc6ftd4l8wr9q40v33w\", 2038], [\"mmx1kas9v36hhw4rzac60heh2uy9kf0wx7ed39fvhtlzqwhmr7udkl9qlxwys2\", 2502], [\"mmx1hny6mwxqqlfktwzkwq3u6l0d08gafd5eq6xwsjxnv7sp58zm8h9skzn58w\", 14], [\"mmx1tpyah2lre4lsclru42p8zqanwfukpu9n909p6pyrvlcd4mk0dr9ssahxe8\", 4519], [\"mmx1znmap05s26uhhzzewpz4daz634wcslefnlchrdlh6aptvem6u09s7k75zr\", 373], [\"mmx1d8s9yjjn824xg86x5wwhvn7nnwqe7wnvdn28t64cmtp62avpvtxs9ycy60\", 138], [\"mmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27\", 3451], [\"mmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku\", 1779], [\"mmx1nkd5fyvrnu8zeqgen48aeqcnyggjxnn7dctfddj7m2mz25alrl8s74wqvz\", 634], [\"mmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92\", 4200], [\"mmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6\", 7006], [\"mmx1j07gy44rhsg9xtaf9kt95h8jr8vq8zq40ljf38dqh4mmtkekrtgsul7gud\", 305], [\"mmx1r2su2mtnjuk6t5q33au7609wn2pajsndupzh385r3s5guvpfclfq7m6n5p\", 1017], [\"mmx1r2wcfugp9ugm44z03eed4ad0t5qhvg8ufc3p7pu40r7l5dkjurfquuahjs\", 1767], [\"mmx1essz4a6dexpprz066dfgwslmz3p8uy73czfrlc7thy3s8w782rfsx75has\", 930], [\"mmx1n5w0atjthl70cnj3zll4ku3jl2w7cut8peqdkt04ck9annew2mfss5uu88\", 1237], [\"mmx1n0hnw7qmwehhsz4qf576s0sv5ql6kyq9afgrgmuzzwzfr03ld82q0ta37g\", 1765], [\"mmx1mk6v9wmyju7spyncrggntg4lm62g0ensg76yjgjhdtnmpls3nr2sd9qwqp\", 258], [\"mmx1kq7xc88lghdv0mu62585fck3ppnlmdxn3jwvhqpks73wc8vwc82sqzyhjq\", 2540], [\"mmx1d8h78has80qk0hv5zxfkx5jlpj5689zht8xlqq30xjhx3y9ezhtqcpw8zu\", 20], [\"mmx1rftw5xyjw5hy7hjnurnhx2z5am5fnqxwtkhzltcu3ujxvs9f6rtqmm0kv9\", 34], [\"mmx1ckrmrs93ya5xud2lskwvn3z8t285awqcl4vx5v6zgyphat5eultqs6ds4l\", 162], [\"mmx18vfpqpqwtt7htk5dwgd4lwdnyym659skm9ppf0sadkp5400w50tsxysqv3\", 213], [\"mmx1tq8ewkuuc9sr8a34eml065d45atwfq2fv5r738927rx9cqzv9mvql6x3xy\", 84], [\"mmx1m727l7tyw3u8lhnpqg598yns3tsum2n43da05psyhddgzqcj80vq5u3fhq\", 2059], [\"mmx1uh4qtgqkndrp78xx4qp26dwu4wxmqe8h964n9kte83sq8h7ckrvq45zn3d\", 10398], [\"mmx1wefvja0djemhprqdj73np8mn3v258rx0ffyenpztrnr8tvndrrvsv9aggw\", 34], [\"mmx1e5gsd2weaqmzszdlj4gu975s2cc2gscnrtsa9agufcgjv3zat8vs606ewv\", 402], [\"mmx1md60nlasdkf7uu52lw7gmpvs07jepacq7u6spajhaj5prgn7vnvsecqcfy\", 87], [\"mmx1qnh3zw2utltxdu9mut6atp326nujr6pmxxhtryn7lq089kv360dq64mj2w\", 3036], [\"mmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz\", 21528], [\"mmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9\", 1], [\"mmx1p898m68n456q533nfjd5sa28akadyqy3dvq6tywk3jxgy7chrrwqeh70e3\", 153], [\"mmx1fv4dvhre9mmtldnr2t63qg5hdxa02hzjeh5hu7a3zkmf8a3ql8wqv4txd0\", 8], [\"mmx1rkkaqaqs8c99w2jk7xw5ugfgkcfyhxpnu8xq4g5a5fatxvgggtwsccyp28\", 948], [\"mmx1hm4mvj4dheczz5g7fvpw4pnmrqlm0z9arhkqtvq6yaxza5ckmlws85y7zw\", 396], [\"mmx1d3vplkcw0pjqrpfr3cesjmvslk30p8qxhky5l4gdslclu70tql0qdqp9dn\", 568], [\"mmx1gr44j33n8tsjpcmstcmffup7ap9a85kz3ykyuzd9zueegz37xh0qql5jwm\", 451], [\"mmx10783gzrqc88k0n0ert2nkjz9ams2aj77ux4t0y3lsmyexnue2h0qem44ac\", 295], [\"mmx1w5vuvkweueqvfl2mtncyexuqchje6nx27552zaz50qt7vwhw5tsqjy2s57\", 31], [\"mmx1m7uycpxww03cj05zhdgzjcen70kv3pd7gwsk8grcdtu9ltch6rsq9plyz8\", 520], [\"mmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt\", 1181], [\"mmx1u7me3rp6kmfs57wzytrxjh843sypnl0l27unk0c2pzkuuhjhy03qfwcyqf\", 570], [\"mmx1fxfrkrq80vpzru94heh6vwt52yan8k9znxzvfjtazjk59lpptl3qgnkegx\", 1], [\"mmx15m60pxy8mjp03mmtf9aq8kajmrt8vrzltj8epytnsucts50fh03qhw98ql\", 913], [\"mmx1nh8ca5vlqrtwuuwrk4rm6yc06fuxgxgspdm3cflj9y6anlv3r0jqp8ygza\", 1169], [\"mmx1ll2yar6vrsv84f5qdwfvh8tv80qlmkxdlr4ddqpmpzncqrgjghjs8s573z\", 111], [\"mmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s\", 436], [\"mmx1vlm6nlha47hctqvcqyz8uqfc64j8h5k2sgjmkk92ysm2k9se4hnqqldyu5\", 394], [\"mmx1kklq024f8w5p3963qd3ac3dz4a03l8g5ejnhqwqgqg0eq0p77hnqmzjuut\", 3122], [\"mmx1agcww5z2v6ctey3elyhmc2ehfpde3n9hzcnvh9s3fslrlv004rns02462z\", 11], [\"mmx1re75j8gejzdje5afrkdsl9xknheax4ymznewazk5jqy4msarp05qz7qqsp\", 628], [\"mmx1jz3xqle28yclk7fkk079q990tvya3vqzjrjnrf4phshvt990wt5q30rkay\", 5], [\"mmx1epzfr5tjemywh43kr67esqktf43zl5z42ttzmrkgjwyh0608nm5qdxg5js\", 5], [\"mmx1sp3fn6wkhmsum7jjspvdnj4696wyqc2jx7deaqpxtznus65jr05sg5pmu4\", 5032], [\"mmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl\", 4311], [\"mmx1haurf6xpzc0aj833h7tq0382s3qpp5a698kh9ysu4j99azma9t5seuhzdh\", 93], [\"mmx1drhuec6ts2hz9qf8jjxmpan7zlung5anurrpxnvjkmqy87vvuh5seglsha\", 153], [\"mmx1avctsmwaxyzw23nwat6mmxevcq3f0s3m9j4ll8x8yunszucx9n4srfjh9f\", 8], [\"mmx1x23xelewc3rzca0ad25wgczhvx7m9g9529xp98qp8zd5pgs8dr4sld97r3\", 2], [\"mmx1ccgy2ru9jn5a7d67w09zrgsxgv5hfxrkzdcv56dlpcraa7tkrtkqsrah8a\", 227], [\"mmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a\", 6966], [\"mmx1xn6ynt5j0dwm7yh29pmjs6dy3gytm5nllsanwtzry86czx2j30kst7a798\", 4], [\"mmx1mcxgagq0znvmk0g7dqvfa9ewj2qwjxhysrna634prhn89nmgknksn8ufzx\", 281], [\"mmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\", 7145], [\"mmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05\", 571], [\"mmx18zjss5ccnhyskugrwlxuy935zn3vz7ns6gyqg2cj8f3r99av9mhsck4ne0\", 20359], [\"mmx13txgtfelvrng6mfjyk84sj74lrl3u7v05wn59659sg7ffup5f8hsl4nhzm\", 1381], [\"mmx1nmya0r2ytqy66sqs3kxctpyd6sqcklzdqcyx038d8c2geysdmhhskph2up\", 35], [\"mmx1e3rafs5jhzf03a8wxwp43kcguxr98eq3azy5lvatwayvezqfyrcqeumth7\", 196], [\"mmx1e3rlxd6da547vjhdswqp05z6tzx50afnmytanvjsuulmmd36yhcs4e6pp3\", 2583], [\"mmx13l7yln6mennhvfx9celf99enpdgtfe7qs8dmr4nfr06prcfmz0eqsda2ae\", 127], [\"mmx1kky0cu2dauntftsk8a55rdche6kuhm227qt2ktfsyrhvu7v4yteq8rg4d3\", 255], [\"mmx13xgvpxumznaqj5mkhxc493nzhc2kf9w3ks9z99eaznesjrsln0eqgwclyq\", 4326], [\"mmx1advv0qlzm5l7whwluwdfspmqzwd2k3ra8rgqqvuj0m5hzy5taneqqy7hww\", 16], [\"mmx1n9k3yluqcmnwz5wdk3dclgs6uq7yf4g4tvahh25jl3z4u488ttesnf2kkx\", 596], [\"mmx15deh8dkm0t4arjta6f2z07uzgvh49r3mnltm39hp0aeth0vc4mesdzfdfe\", 1820], [\"mmx1py700x95hshs4cuzccjshmt0eaen0psw2kmhpv0tmy7lag9wdh6q58puuy\", 169], [\"mmx1f2jdndglt2mvq37tc3wp8gtf3l3uql0sn485x80096m59y0ydl6q90ds4p\", 85], [\"mmx1g67zee4q9x4wp2s4lkfde4v2m05e90jgn0m42uxw35r22emk3r6qa8ttan\", 573], [\"mmx1vh4j6v35vxpwt9820f8uk0m3v4u6h78gyc9rr5sqrew29dfvcn6q23qgu9\", 6], [\"mmx1gg6twfxusn0xlnnzzfju53zzwjecm6jkr5r936favpxcjz9d8r6sp3spdn\", 7143], [\"mmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t\", 637], [\"mmx1fxscvs37ax2lac6xs4tz3ygkwv3nh2hnrtrx7r4fej48708xplmqlma5lm\", 1470], [\"mmx1prxda0yejv5m4h6y4pgkzmutaxrd96zsnqss6aq5az6609dzatmq5jnv0e\", 3013], [\"mmx1tfn2vhdwrfuemr5dspc53qrhh2qek4amsq38j5d0a6sj73fdyrmsnvjrqx\", 229], [\"mmx1r0e4s9r8jqvuvznv3vd5k4pfa5ahzgyn6lrgchwu4mpqlzgsx8mselfar7\", 2477], [\"mmx1swf984qntzm6hrtx2695n82fsemv537ekkenwc94se0ahcxzklmsklc42d\", 3], [\"mmx1u9lr65e2v62cht733pjlz5dctk7esxmwaxwjew2xytr7gqgmtnuq3x22cc\", 1347], [\"mmx1ms7f97heq78lkjktgxlhs7pdzes743gafp0huda2usvns9jgv8uqpgg8d3\", 2], [\"mmx18asaxgn4dcswsefcdwx54kldattux7l0yn96fvmndrpqn6adsluq3ffr8x\", 1], [\"mmx1t9g3q5fahh5zpsqw7hnlm37mvmty3vckn77cfepfpt23jw9k4tuq7pqy52\", 300], [\"mmx1j6nsqqj2g4cvdgf3r3y7e5f3wwvgyu6gh0e579xd2jsn0garhruqft7myr\", 3525], [\"mmx1xj8utkqx9a2m3wgt4pe95z4jh54xgsl5gtdfwxqfcg823stkplus3fv5r9\", 88], [\"mmx1lpm0wnvfr4l07wgvfhhgzfgy7ur5jf5g3h024gln5ykml60nr8us9wc7tg\", 17], [\"mmx18pu3yu4a0zatqgkph8t5pz3n4jy7hq2x9f348yhwafvj4wd328usef7aw5\", 501], [\"mmx18gzhlxuaafa5rqxlyrzn8n6ldud65ynm5tujhc0ql87f9myx5musf6wuje\", 9548], [\"mmx1csleu9q374crgsm06k0xq2n0vdcufm34ahz3lww7kmyt7ukj38aq3ta9sv\", 175], [\"mmx164hdypm0mgekpt743z7xu7vtm5w80hysnvgld66zr54gvhcwm8aqrsk22s\", 128], [\"mmx1can6xxmz54lhtrm53udpehkn6k6qspudttf9pdpg9evccj9hmhaqufdqfs\", 38], [\"mmx18dkl69sxx3wz5u69s59lp9d02qj6czg8h6yv3fzzfk7d2f2dqtas9dls85\", 1034], [\"mmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q\", 38], [\"mmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f\", 70], [\"mmx1n36ek4z7vprh7xucnje6p5sr4s9mtr0ml9a3wz6xd2kp5v3hunasjn35t6\", 9091], [\"mmx1gz8zq3caexftrf8f03l9pg694s4zy4t0cacz5mq0h7u7ge86yt7qjlumup\", 110], [\"mmx1c2jrdpa796438jzxxjw3y68tepmlzqv3e4a28d6t52juznprsm7qpwc0fj\", 157], [\"mmx1rfkx4gam8z02m09k5am29u2nyn62wlc22f0fapkqra6ckxspnn7qa0d336\", 201], [\"mmx1edcr8zgueucattajc94rpsfcmyazh0zseqk4pr2vs67d49kjnn7q9en6ev\", 35], [\"mmx13ju5ewkc4v2qgg6p5zj3t33p0eczcyfe9eggmv6ksph27px08h7sfsavr5\", 1], [\"mmx12rc5mctewx0qv33kwemry6vvqmxgcnc6rn84ksqef9rj9z0rer7spuw6dw\", 6], [\"mmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t\", 946], [\"mmx1cdahyf0uv3mfk9qfpjk3q8vwrfqap5xgmg9wckkp5rlt3agn5hlqwhh3px\", 17], [\"mmx1xrydtrhnl89x5dtqpwape59f0t246hhs38tl5d3pzcamfxh65llspr5pvc\", 369], [\"mmx1zm2yrzm79wn8lt7uhvaxjy0mcezkxdjujcru9fwnwczl3y5r4hls79m9l2\", 5657], [\"mmx1xwq2revzzgwlq27emrpfjmskmr60q7znpayenjlhuh08f4vxcrlsm99vzk\", 333], [\"mmx1nhs4hestsaxqu42gmrj94lp8klx286q7ymp6dh2cgf6xg6nd6hlse9z9w5\", 25]]\n\n"
  },
  {
    "path": "data/testnet9/rewards.txt",
    "content": "mmx1w7dfqwgrq4v8uyg2kpcda5ec44hnvdeww48zysxue2mttd04tz8qdpt88v\t67450\t33725\nmmx17dhvxq6fekkfqtvjwle2pwcyr6f76uhz3vsq6ldkc9r0uzs7nrpqvzh7zs\t65988\t32994\nmmx1ddxwuakc6p0mp4yzx3e9rzt6d6xtkvlvfmqnz6nx0umd2y9kc94qsyt8pe\t45426\t22713\nmmx1eavt4k3qfgc30z5wqtk99f93fq8xhtr82f47v6r9xd266njaqwgs56207d\t43658\t21829\nmmx1guzl6jcsz7hkxwvtf8p9nskzg4uefcr6w3qmdg7jyr0urmfsu4uqql3c6v\t42015\t21007.5\nmmx1rlanqjxk03n363dxgqfek0390p6pfdflm4vnf5d25kp8rxd7lg5q3sf3xf\t29628\t14814\nmmx16qquaqrzyks7qpq0wv3mz4j3gdk5c0ltnutnurun8ars8s2jszqsj3wzt4\t27915\t13957.5\nmmx1eklc2eghf2ygvfz2t6wampprupwnkrjlhx23pw5crrwgdxdrsnpsjc7nq0\t26833\t13416.5\nmmx1e6mrj76enqgg6ah092p0u7y47djaxgygne4gffgmtuypfcyqttdsjs5kqz\t21528\t10764\nmmx18zjss5ccnhyskugrwlxuy935zn3vz7ns6gyqg2cj8f3r99av9mhsck4ne0\t20359\t10179.5\nmmx1vc3s0rqlmy7hrw0wr5mjfzgqx70senjwnp289x6syu9r0m58zvmsk2jl6j\t15079\t7539.5\nmmx1cv94kw4ttqwzyluzql2cc4trx5mze52qx8ys2pkd7jqg2yp6wzcq0lxaef\t14602\t7301\nmmx1cdv0s72kyp8y9f3glg22p32zz450f66rl03hzx5uwzrcrysy0qvq6scyfm\t14292\t7146\nmmx199dqhkfs442qerqkzmsaql0tw3jkqkhxd79valmnjcxhdtxu32kqy40gzf\t13135\t6567.5\nmmx1fdscrht596p4daxkpzfunczjmurs66j65u5lc3a4q0l99k7h2ayqdvrfnq\t11466\t5733\nmmx1n833p7z44rd62g0yvhlua8sv3d8wmyvrt720utk7x4vxwc3j72hqst6yh4\t11120\t5560\nmmx1qpyq03vzht2uwf9pzadx3rpa8w8y7pul2he0r5y3497j29ul7x3q7ac26j\t10971\t5485.5\nmmx15cf5205juyar33ugp9qkh4e5ne9n0ylvnyg0uf6uyymd3tgzhc0sm47jfs\t10830\t5415\nmmx1keg2775ll23shtjh235tw9g7lu3wj5rj50ws62vnwv89p9vd07zqwswcn8\t10625\t5312.5\nmmx1uh4qtgqkndrp78xx4qp26dwu4wxmqe8h964n9kte83sq8h7ckrvq45zn3d\t10398\t5199\nmmx10lrzsfeam8m8lmrxnhzd2zn4kahtkmnthd0nhytstw52s92d0wdq7x0824\t9585\t4792.5\nmmx18gzhlxuaafa5rqxlyrzn8n6ldud65ynm5tujhc0ql87f9myx5musf6wuje\t9548\t4774\nmmx1jpfmyh0ndxwz47t3d6xrdlkd0mq3nckuasn8elvjfa65xtzm2j8qamxfuw\t9410\t4705\nmmx1n36ek4z7vprh7xucnje6p5sr4s9mtr0ml9a3wz6xd2kp5v3hunasjn35t6\t9091\t4545.5\nmmx1j7ns20cea2havm328p28vxeyfdcv0yrhndl2h8735slc4u0q3fls6dz77y\t7720\t3860\nmmx1kezjxhxk8hxk0877hsfzr93p297xqp6ga2jrgptw52fa386gy7jqs6pz57\t7626\t3813\nmmx19zerahkctf5hxcrtdh2j5xjynl398ge4avn9nl4zsqw2hs9qe7csjqevda\t7336\t3668\nmmx143n0jquupkdceetyjs8mtnmth0pd9af6dx4hkujwctfwwcqfqpyq6qa4d0\t7250\t3625\nmmx1k4lqe48g7y07vfqjkm2rcc8kxfrqg2utg04065paft9arpjmumksyp8g0z\t7145\t3572.5\nmmx1gg6twfxusn0xlnnzzfju53zzwjecm6jkr5r936favpxcjz9d8r6sp3spdn\t7143\t3571.5\nmmx1lgvyts4tqf69g0m4nukuz89v7tpg892kkukz6v38q4pcmk4vvw2sddm7zn\t7089\t3544.5\nmmx1aruhdl3f980cr8nud8ph2px3huef6edlv8l8gdua5sgw7cz2p0gs0872r6\t7006\t3503\nmmx1f80jc8h54emsrld03wdyxjxd9hlqd2lvtxyt0t24d5jygf6mv8kqpas92a\t6966\t3483\nmmx1a2ytmujh3evrw2r8ljq6alul6drzqlrpa64ae9f5xp38kecen3hqcruxkg\t6797\t3398.5\nmmx1jwu2hr9wvxyq9v0eqktfszrla2lr9drecucvlxwc2t0q78a897gs2ufnap\t6686\t3343\nmmx1shw36ys05ppa2jn68qy5s7jl5kzy050rqdk4pz8catr2wadnadmqh275ry\t6467\t3233.5\nmmx1dwr96cxjzyc6532h2gjagegkm58ns4fdrwj6muhccgxn5ysuqg5qn9mzn6\t6394\t3197\nmmx1pstmxwmdgkyzqqll6sdu5vdxpkm82ya4tz78w8n2yq4pdcdz39eq3uwvw5\t6354\t3177\nmmx1afht99ekwmgh9s9h043aygvtl8tmytx7ymgavn6lkdxxczrgjsmsqcx3je\t6335\t3167.5\nmmx1l3p8ljlzzs2kzr2d992wmj6ru5t95azef4cfnp289zgezfppg34ss5pch4\t6222\t3111\nmmx1j3p8gtyajzh07ag8cv2y776h7axrwhvppckxxtltelz08dsaxfxqg6vlwr\t5889\t2944.5\nmmx1rw4n2d4a3mrve8kfwuc8gvqnszd9m68lkqsum0dzk4j4ztlq2jpqrtcpy9\t5826\t2913\nmmx1urhh0ud9hrdzf2x4883wg7mgqe2fztfcnjehxz6kqujve3hn37gsn3f8qr\t5802\t2901\nmmx1ywen6qnhge46fhjqwxtnyapckkakzv5m7gz8339j0kzkvzeev4fsex4z9j\t5690\t2845\nmmx1zm2yrzm79wn8lt7uhvaxjy0mcezkxdjujcru9fwnwczl3y5r4hls79m9l2\t5657\t2828.5\nmmx10ew79lhecezg2ewrj8l8egjtwmkffvs2jfl8rdgxy32arecyp5xqdryl8y\t5644\t2822\nmmx1kvyj70vfnwjwg6je8tf3dunrwrafy9mlm2wtgqx95vwgnz2mrfcskpydtk\t5425\t2712.5\nmmx17qkmawx7lmur02c8ruql43x7dvttg3n37890znkczyyctmh3cc2qxf9fyq\t5196\t2598\nmmx1qm7k9w4qmnqc2gufp59g6hypfx9gcvpnz5e0j25a66e4vhnztmyqn04u69\t5109\t2554.5\nmmx1sp3fn6wkhmsum7jjspvdnj4696wyqc2jx7deaqpxtznus65jr05sg5pmu4\t5032\t2516\nmmx17gtsl3areyr6g7xscq67jl2xcnz56ekkk9stxvx3qev7hhez3ccs3juqvl\t4728\t2364\nmmx1ghrrjcqpkwgj9z8e35eqytswrtrwzrtwnrs5sxnwtvezrtwk3k3qrjhlfp\t4701\t2350.5\nmmx1veepntjet7j6lw2sfx4p9e05day63l65wj2pa7g7cu6rusyzru2qktg3rn\t4645\t2322.5\nmmx15tfvs7twvmtvpp4zvgpedz4suysu4fa88zuzjyj2yjrkpscme9msaye6tc\t4643\t2321.5\nmmx1tpyah2lre4lsclru42p8zqanwfukpu9n909p6pyrvlcd4mk0dr9ssahxe8\t4519\t2259.5\nmmx1pt6gzm2amdd63w7juuy8y7wjgzu7v6mc54u2687dy6nnjav2t58spwyffq\t4367\t2183.5\nmmx13xgvpxumznaqj5mkhxc493nzhc2kf9w3ks9z99eaznesjrsln0eqgwclyq\t4326\t2163\nmmx14kjzcwkmkl3ttuvd8e5flk25ulm32hk9xe4xfp0vnfzfe8pe985s76j3hl\t4311\t2155.5\nmmx1fmjnl0utvqxfmxpvz9snepkqshj89ylhca3awchtc02f7cjpqlgqerkn92\t4200\t2100\nmmx1a9n583hscjyjvu29ulafuxhgfcrtv4j02z0t8lnvzvlhxcvxgf8qxsxysy\t4158\t2079\nmmx183ajctzcp95lcx2zztjk58gytyzmrlsdljna6lhedqj7h3jn04aqu3snsd\t4056\t2028\nmmx1q8d78sjm37uz4pps54q0mn4w3yjesr9jg2pprgww6mmput9rg2jqudrwzl\t3922\t1961\nmmx10t8nj6dkqmkat9tkatch273fj0lu4yj6xsz4jpsw50ur5rsnjvuspelwru\t3867\t1933.5\nmmx1w7jnglje4j85z4dv4z6gpmwagqfcgpg7nq7dh6wu98qq7ckd7umsdq9hn8\t3845\t1922.5\nmmx133vuztyunrfyrds4nxxyjyx9fq3ssy934pyjeh8atm9emesy5sqsua5jyx\t3825\t1912.5\nmmx1478snw4amjfq0hnhpwl8de8yup2thh5f5uzmyu5g907az5sv6fpsuwfrma\t3727\t1863.5\nmmx15098ny3pc66kn6sgr6t8jehvwf2yzcxm6lxljvr7dfxs3g4u5plssgudwl\t3689\t1844.5\nmmx1j6nsqqj2g4cvdgf3r3y7e5f3wwvgyu6gh0e579xd2jsn0garhruqft7myr\t3525\t1762.5\nmmx1f4g8tdak9nw2waf5v4g8skt6gqqpnnlvxhx0y5vjkm0myv97svhstqzhm5\t3501\t1750.5\nmmx14xms6j4un330ca6y09r8ffag0d9gsw6dgka97c82k32d0qtkuu0svjvmgs\t3496\t1748\nmmx1wpvwth47waanc4hmp4e56trdt4eefn4gfk5k0plmecc3cfn5rh8qu8ug27\t3451\t1725.5\nmmx1q3eh75hak0v9f9psa365zjypz62q8d0cwv2qrpwpj2hayfn6xfvq747gj4\t3428\t1714\nmmx15wphyfczn8lvfmj28gkhsneg8gserwef8ergm9dxm03ngy8adnys2ypvdm\t3422\t1711\nmmx1hl8lnr4ddyyqynx5qj5psv63ah7atfrt67s9eszlck5dy5yy9aysylv93p\t3419\t1709.5\nmmx1gca9vvksmtl5ud5lxarqrts9cg72x84gxtcg9h2e085g6eth4cfqtg8j9n\t3405\t1702.5\nmmx1as0ezwhva4ch25cssuzrv8hr2vk4fyt8ycefdtx7dnwt5rgadcps7ezzc4\t3379\t1689.5\nmmx109nvzs3vhyjqm3l7g72fqdxyh465fedk4xjvy2rnhfmgrw5l8c4sex2mej\t3302\t1651\nmmx1xm27rmtx3l7a00laujl97484grv5xqhrled5q7e3awlerfhe32yscwur2z\t3286\t1643\nmmx1dv9nwp48cr9qwn3h2z8d0ufy4gf7j4hfw2j7lmrf2mk6jxlzy2vqaphdfg\t3285\t1642.5\nmmx1dlc90a4x967re90nh8wzkup7j0rhwwdkp6x6sv0kz8uk7x4suzrs8gav7s\t3279\t1639.5\nmmx1apz53l6jeqzdtwxry627f2rpagmjwsj42d93ca8jtwcdtht037cq9fsqhm\t3269\t1634.5\nmmx1pdlh0rj93akpwww8apmpfj5awd08ew8c7c8ce4lk2cfehypgj6js7a2eeh\t3258\t1629\nmmx15n95rxf5c58taud2x06sgpldy3mazdyf2lf8cemmezp83hc5nzvqp3l3vr\t3149\t1574.5\nmmx1kklq024f8w5p3963qd3ac3dz4a03l8g5ejnhqwqgqg0eq0p77hnqmzjuut\t3122\t1561\nmmx129hgzhuh484dtlgz7y2r4dmc64hqzn4680z4dg8qq2gtwymfm3ksl283x6\t3111\t1555.5\nmmx1f3ecr58txvmxjrlhnx3nw0wg7y7zdef73gcgjfrvcf8lgrdu3czsn4yx6z\t3066\t1533\nmmx1z66g30cq7j7apzf29zmdsu28m5vrqw9x8m9jh2a3vddrxz7fsqcsh4gv0w\t3061\t1530.5\nmmx1qnh3zw2utltxdu9mut6atp326nujr6pmxxhtryn7lq089kv360dq64mj2w\t3036\t1518\nmmx1guajyf4849dkedxpj2aqevkuc9a3u37fmg4hyqzmk4l02n37tfrsygnc5y\t3036\t1518\nmmx13kmejc28rs4q53wnrhjw2xhyp2jqjzg78uhswqzy8fzv3reqtf8qvykjwr\t3031\t1515.5\nmmx1prxda0yejv5m4h6y4pgkzmutaxrd96zsnqss6aq5az6609dzatmq5jnv0e\t3013\t1506.5\nmmx1935m33z20776s8cdrw6wxteazyc7qtcf4smm3mcfsf2xzmlex7sqfz5map\t3010\t1505\nmmx1nh05jetwxuhj79j9k4wx6ujsamseykk84383jtmfcpzu2f2hz4wqj4e25c\t2915\t1457.5\nmmx18h89t0y9m8cy8trcveul508ju6v3tnajz2hrhvcs8rm8pn23djesml7auc\t2887\t1443.5\nmmx1gs3hunc5t3emm68pfgfduqyu5q47rmdpzexjgam2m7zppmlwmqvq265zc9\t2884\t1442\nmmx1jq306xnr67j6m6dksg2fle285vxga5shrtqffjxc0d84ghnqtklsx0wzmw\t2779\t1389.5\nmmx1036ucmxlqgrwmcuuheau33k0h93u0wurkxznvsl7zqgej2x2rauqaktwxw\t2760\t1380\nmmx1lsgrc4ea32dg8zm35yg49a9xzanjav88wdvtvfgu28s92alec5sscmwzm0\t2731\t1365.5\nmmx1cl8r0pfpp2q8fmg2jjk52q8dvhnmf26vx0wwms00ty8xl4snhf3sg65sm2\t2718\t1359\nmmx136s9temfus3xkgz3ftwqkrg3kpw3nr67088u2ckhkfvazqknycdqe09z9d\t2706\t1353\nmmx1aa7hmgy7dhsmkhsscp8vlk4y48jyntq0zndsd4lvn4ht0nrjk3vqrtn5mx\t2693\t1346.5\nmmx1m96tljuk8yjc9xwu4q2awulg8hrgpg0jp6d9al5dm7r2hue2u8ysphwe0u\t2678\t1339\nmmx1u0rvu8gxz4e0jty0klhmagtva5vh95tvwv9r7pr88957janjzetsppkfvn\t2630\t1315\nmmx10px4lhql09zw5nlgn8m062d8zw0j6f75acpf000grqxsma5sg0qqj2d7ns\t2605\t1302.5\nmmx1e3rlxd6da547vjhdswqp05z6tzx50afnmytanvjsuulmmd36yhcs4e6pp3\t2583\t1291.5\nmmx1kq7xc88lghdv0mu62585fck3ppnlmdxn3jwvhqpks73wc8vwc82sqzyhjq\t2540\t1270\nmmx1dm7la9qquehldy67xsfynp76p39dxa5xn4veegz88m7amspgpgcshv7dfg\t2526\t1263\nmmx1kas9v36hhw4rzac60heh2uy9kf0wx7ed39fvhtlzqwhmr7udkl9qlxwys2\t2502\t1251\nmmx1r0e4s9r8jqvuvznv3vd5k4pfa5ahzgyn6lrgchwu4mpqlzgsx8mselfar7\t2477\t1238.5\nmmx1cd3cxagh276743g404ga5u3ksjfz3frghh3ve8nt8a07d7cfvswsq2v7kj\t2427\t1213.5\nmmx19jlhmuspu5xz706c63vheckjl6z7qx9ne5rg9r7c2tq4vj8rt9aqj60yvy\t2396\t1198\nmmx1uskav6veu3nxfxr4zs6efdk8yth3tuz55zptp56rf62t0ftwy4nqpvarja\t2379\t1189.5\nmmx1rq2lygf5p4hs7a3ftmc8u24v7f2q9gapsskf0kgh8wjzzxsddumqjz5fsh\t2328\t1164\nmmx1r5yfa4n6neaym6mszkpaw0gpr27sv99ge9ketvn0rhl9a9z88kpsslxvwv\t2323\t1161.5\nmmx1ft660k7cfrsmh5l4twq3xxwqzauhm2cuz0cygd087pvl3u7p33sqthpl7w\t2320\t1160\nmmx1uae6fch5rlzfg4ctnra6q2hqhw59ztsn5ghde574lvqcpecvzs7qz7q88l\t2310\t1155\nmmx1wkcf225wca3efgurwphhsw4z0wqss0e0lwsenk8r06yvymp4dacsm2gzwy\t2305\t1152.5\nmmx1xr8hes0tgn95zf7y9zx6x649t84t5c4zas0cyf048rve723u9gaskvfmvc\t2298\t1149\nmmx1c8s4ve5fznca52l7w3rgyqjuh4sd55hnfrtp0tys77acmmtxdcksjnawr0\t2282\t1141\nmmx1hem4nza3a4935vjx6cu0ukft9y4cjyv6duddclqj2jsf9pgnf74sqevle3\t2272\t1136\nmmx17l3xstvyx5rqxzqvswwvf27zz38ckt5q2030selhwe4elqzwe4hscxf06z\t2257\t1128.5\nmmx1a970ajt3yvqs24e29wpfazvh9fhd0afrmhezd0yxemqntrmtnapqtphgz3\t2248\t1124\nmmx1v93pkhwdq6uq4ujmw3625zkxegf9q6uzv2fepyalydg6tandy92qnxwsnp\t2227\t1113.5\nmmx1ptxl932ypfp3cl7fz506efjpw5wwkyfntvdfcvqa88v7849t64ssp2m4ym\t2221\t1110.5\nmmx1q2l8pzuzenlq6quglrsy2879ettj2rkht2rt8hjfg37dg4zeqpjs65g66t\t2217\t1108.5\nmmx1rs0lu6yh5uhp3pa8tl3dwz5ts392ua52kx5v3p8h5jrd0x68g8yqc6usm5\t2175\t1087.5\nmmx16pnkxxv9mu42n7t4pte95ftduqz9ntrdd6u5epqnj5mkdn249wgsmkm77g\t2145\t1072.5\nmmx15spum2ccvkzj5zg32v0qzy9xhhafsa278ujyq20m2yhwq5lpxstq8ghswd\t2138\t1069\nmmx1nc9xdtq7vm8q6du2y7ckk58awmphz66jwa86wa3u3e8ru2q8pazqj6fukn\t2068\t1034\nmmx1m727l7tyw3u8lhnpqg598yns3tsum2n43da05psyhddgzqcj80vq5u3fhq\t2059\t1029.5\nmmx1xeqvfd5a63j3j7vq287dvrjxyksw628azkn8u53sc6ftd4l8wr9q40v33w\t2038\t1019\nmmx1ca49tk9sh9sdhz3fqcuax7qds4cl8xp4nmfudwz4zpyh70wgef5sz430c3\t2016\t1008\nmmx1gpscz23fjv9fw32s3k2g4enc8k0arasszygjz929kmkp96a2c4us8hqqny\t1999\t999.5\nmmx1g7jahlldnp96n8dkaz3dygg56kef64q5m6lfjpgktutycdlgyksqdy7xxp\t1976\t988\nmmx1fp4266lrf7weqrkc3vdm2d29wnc0f32q33sksnfnhagcshq6ka4sav8d2y\t1971\t985.5\nmmx1cqgrreu8yptcvyufdussnfqxnwv05z3dqaqu0n5qtfq82n4amajsprkzal\t1919\t959.5\nmmx1uj0qhzeguf0zayyg2m9z794nrdlk7y7pnprt4w798s5yezgxgvuslzd94k\t1910\t955\nmmx1athk4etg0d9t8q9yy6s68vuruchxsa0pz37pdgqfsc83nckdmwtqlfdk4a\t1881\t940.5\nmmx1lgktvy0vqjnukfkhrm4vthrv86vwhunpwpkquklcavjexsxjgysqmf58sn\t1869\t934.5\nmmx1pj0uu0lna9r8rgw8ccn4nj4kudgwxchv4l0tjqpw2x97035a2v4qdye8a5\t1844\t922\nmmx1q65hf2l3zdkl5hgvl38syuul0q0nlnt0pn69nqf7euqmxqelqwlq8eskrq\t1837\t918.5\nmmx15deh8dkm0t4arjta6f2z07uzgvh49r3mnltm39hp0aeth0vc4mesdzfdfe\t1820\t910\nmmx18tcgc6fe94f4qz9007v53k9mvv29rvtp7mef0wvqh0vmmnadhv2q894jq4\t1794\t897\nmmx1qhj8xesct7vnc9zrqxj4f2rqrjtt056769mxtugz4h5f6pca8n8q8ghuku\t1779\t889.5\nmmx17h0euyts7h8ezaj053q5n9khurkay43s2tqfg3jf8sxrejuyj9cq4vtj60\t1771\t885.5\nmmx1r2wcfugp9ugm44z03eed4ad0t5qhvg8ufc3p7pu40r7l5dkjurfquuahjs\t1767\t883.5\nmmx1n0hnw7qmwehhsz4qf576s0sv5ql6kyq9afgrgmuzzwzfr03ld82q0ta37g\t1765\t882.5\nmmx1n0shgnl0qx006fz825pm7e9uhku7z7c4q9e4kze599ly276khgnqyxh4kf\t1758\t879\nmmx1s4pkkycenn7e0g0y4c3sz2yrkld7m98mlm8mc67y7lj4trw5se2qy4eq5z\t1715\t857.5\nmmx1xcalpv2gy0k955p6pl97ayzrycmvrplu9cufx6dfctwrwd9uvpaqypgjxf\t1709\t854.5\nmmx1l5dwydjks9s84n3rr52nwggsxfnrf65me7tjnwerse7xxn868ulqfmwwyg\t1707\t853.5\nmmx1xr5534k53fk455wylucnrh5ap09da09jcghz7g9jg2jaarss7gesrjhu9j\t1680\t840\nmmx155480tuk2thf5sqkkgft54hmuafu0mj48gql8fdxdvl08guut6mqvy5sc7\t1675\t837.5\nmmx1qn07jmdsetg4k8gqvn3wmv9kqkrhrsvrmlc547zslku4grlunw9qqllens\t1646\t823\nmmx1kgrc0207hk490v9uywllk02vxfx4skq2xn5h7qxuzqs7cxy5z3csuzpjpj\t1644\t822\nmmx16d3ry985fdkgpvj93xygv0tn2wc9ylpex6t08qz0x6lat9km6dmstdhdhh\t1621\t810.5\nmmx1va39vjz042a7czjkc84uyuej9zm06ns9xs0tv5uk3t87xpkssw9qfagvxr\t1596\t798\nmmx1fxxkthhcqf9ryfljy8xr9dcw4nq9q6mfetxx0dyqwq7qkv4vf4lql4qzgx\t1571\t785.5\nmmx1zyldvfw2ek8a2fv5zm4azulmkth7xntmvxspud576v7awhf7tgls50qg4l\t1563\t781.5\nmmx1mylh2r9352klltxhjqpfj5jnfll6uqfeqp7xunarlg9cqufrhjvs28jrt3\t1553\t776.5\nmmx1923m2hlyu8p6vwt2wvcvda97nf0cqnwm6qf6axlt6zw44gkdgwhsz90j8a\t1552\t776\nmmx1kcrktqlr88979xu79dxq5slh3xkvx727j8unxhev9frl8rhw09cqqnl6r3\t1549\t774.5\nmmx1d39vgf387ct682mq7ua9vlxpjs8w47ennw69wp05atf65stht9wq5hkxpd\t1533\t766.5\nmmx18a9m6za5h5j0t6qgs55fhtucpmzse94aq8z9xjj8lpxhyuemsygqhstwmm\t1531\t765.5\nmmx1jvtkeetw6w09f6ru7sqp6e2kmfhhcza38ja275cr3w3nsq9w8wpsuvx3y3\t1494\t747\nmmx1ed9e542ggt95rk3ygc3xt29apzs2fsx384mwhqqwy30qs4wdhqgs9qh33j\t1488\t744\nmmx1fxscvs37ax2lac6xs4tz3ygkwv3nh2hnrtrx7r4fej48708xplmqlma5lm\t1470\t735\nmmx14ljztszex2rvwpnljuj5zuw4rv9pmdckfgq4n7xj3d6ek9flsqhq6nvu82\t1467\t733.5\nmmx1awrkcsjegqwa5wgghvcq0kanf24rw4dhmdvfxvgjnlvkkpugp2vqxsdv05\t1458\t729\nmmx1ml4nf4gxrz7yc2uymnu6xdx2ssev2q6696ar90pyz72fgp8vxj7s472hym\t1456\t728\nmmx1vpva7nkvq3s3auz70l0pfj28e65tqlkajydw9j0f7cmsapmjgfls9u77yc\t1419\t709.5\nmmx15qq0sdefrea28hhlhe5er0vur347vztfsezj76fapg4wf2nxaekqqxsy66\t1414\t707\nmmx18yu63mp0j5nrxgxmt6md2y77v4n9ltyv6knvtmwjqqzty37swagq9df8mn\t1398\t699\nmmx13txgtfelvrng6mfjyk84sj74lrl3u7v05wn59659sg7ffup5f8hsl4nhzm\t1381\t690.5\nmmx1u9lr65e2v62cht733pjlz5dctk7esxmwaxwjew2xytr7gqgmtnuq3x22cc\t1347\t673.5\nmmx1nx2pts6xk2dqlv3xgyad8t9ektausx3qmt3jvl2myg86wz9jxgpsqyevjl\t1336\t668\nmmx1ud485p4l6ctm6gf06tnlysev78r0rcd8xa2a42ys95x0xyztkz0st9cn6s\t1324\t662\nmmx109dcdg3eranmnkkj0x9gtrg3ak4y5s70nkmyp3y269ux5nc5p2zqsuzkry\t1319\t659.5\nmmx1qymn8rdkm8gak0vst498qpkqvc7gh3l4qxt47m6plhdjlqnv5tzs8ncyy8\t1309\t654.5\nmmx1v2c3pk23x788qwmhh8dexn6mc94an2l3tgj4kp9th0ygz46997nq6xalyy\t1296\t648\nmmx1qqjqmgyqws0jk04frzf4e98ydd3pkcsfyv65g2t3lgnp9t8z4afq0kqpst\t1266\t633\nmmx1da455czfvskaeewg4prqrcysxuzm0x5kgsge3fxafz3e6ddmvppqpyg796\t1252\t626\nmmx14sfukr8xrxq5rlpu0dfvvtkzdzpqyxqyygzdjg6qn5ew34ynrkxq7pxlm6\t1251\t625.5\nmmx1u4m0jmxu7avg5am34pjw3g9lwqys7vcfp6ah53w60626rywvrs4sjzl660\t1240\t620\nmmx1v35z3r8m5aenzfv9gjx0wcuk9zj5qu98asrr9qa868zrq7qncssq0lsclj\t1239\t619.5\nmmx1n5w0atjthl70cnj3zll4ku3jl2w7cut8peqdkt04ck9annew2mfss5uu88\t1237\t618.5\nmmx12uthvnq3g2af96lc3un900pd2tyy8apf0fsqag68d7fxene639tsacu4zm\t1235\t617.5\nmmx173nnyxacrsmasx2v80gxpejk6ypyvt52pcgejrd6jtv7yq6rtslq6pw76w\t1230\t615\nmmx1c5txaqqwf9ayjvyehy9u06cawxfwtctzk70e3eh6pm0m3aqcrqlsjr54jc\t1218\t609\nmmx1g73caa3h93ah6w09g4726rru8xa2nc8vzgsgwzk7pys92jg7p38qz88vlj\t1218\t609\nmmx1j49546jumejnzwpq4ptdal0acmje45de4y9c99pjg5kglmazrazqxex7qz\t1215\t607.5\nmmx1laf0fn2zjzf0en79t8qu7ecqrdqtxrcswenj4533y2s4hqq37gpqd5jjyt\t1188\t594\nmmx13r385uxl5qm5dgt029l3crxsglz6g5t3sd3yy2metys0efjlzmqsl8aevk\t1185\t592.5\nmmx15vny85stuphrkemr4qj4asxyv57q5qhzzc0xyfycd3c59wdx30ssywkqqt\t1181\t590.5\nmmx1usc52whlhctpx08phhjzge03jy0wf2ft0y9dngzgxxs2ev0y23fsgjk7kx\t1178\t589\nmmx1nh8ca5vlqrtwuuwrk4rm6yc06fuxgxgspdm3cflj9y6anlv3r0jqp8ygza\t1169\t584.5\nmmx1krwuwd0xfqxq59rhnglkkduxw8wzq39axh99vtqsy0k6tnac0zcsw7fhj4\t1162\t581\nmmx1gntkqf266vrn7swllylnxpaayt7n06yqxhxjsaglkk8fzds4xuts4gwjsw\t1138\t569\nmmx1rcyj0tmkrgejq5mvfjp7en6dajqh877960vdnrc9m5ujhps0df6sfsnhl3\t1092\t546\nmmx1hvdake6jsnu5qa92un6ucw70jsa89athx8egx7507eqjk3s9ujvsmzmgd4\t1080\t540\nmmx19zr02kj3reljd7fz6lrpwdqep9s2rah2nkcwtm77yxl3ja4sqvcqdxt8gf\t1067\t533.5\nmmx1p76tw7re288zm3avlruq0v2h38feqe2usscg6cdcfwn3f8cs5ejsjkev6x\t1060\t530\nmmx1p27mt7n0as5pmzllk5342na0zjemu7xcylp3shlucvtdhjpeqxxqvgcnx5\t1052\t526\nmmx18gm4fpvhyu80m262mptx9y4l6apdlwrsecfye70n6rslzuwmqqwspsnw0w\t1037\t518.5\nmmx18dkl69sxx3wz5u69s59lp9d02qj6czg8h6yv3fzzfk7d2f2dqtas9dls85\t1034\t517\nmmx12amu3muxtrrr54qkd6wr7xtawh2lare2aqptywufhl24rex2u94qzl4tgl\t1023\t511.5\nmmx1t797wa3smaufhnhxqpql52tpkm80t66ensrsrdf99ar4h265xjssjsucdx\t1021\t510.5\nmmx1cnd5cv200efsm7q85dxl2368q9ymcyq4ry5akgrmn282jgdncg0s8lrgsv\t1019\t509.5\nmmx1r2su2mtnjuk6t5q33au7609wn2pajsndupzh385r3s5guvpfclfq7m6n5p\t1017\t508.5\nmmx176s94clt8j3rs0t52r7g906glc53gx8zukhet5ewzp3czz0fsgwqzjtz6c\t996\t498\nmmx1gkwel33sdr4tgyfq55az5t5n8fzy3thum3v03jmw3q730ee6ajrs22jkde\t992\t496\nmmx1t00welhtn9k0hg075ttg2laa7dj7d26jprf2as70xrx2fuhjyy6sjjp3e8\t991\t495.5\nmmx1xdrf8vw7nl5e94grks7u3h7uxaamgeuv3s30h3mfr560td6rqdlqj2svmq\t990\t495\nmmx1f9pa0dtcrg0rrsnk8c05dvvm3k2wc0mr2m7tyz4htyzfdjj5ufms4vy94g\t976\t488\nmmx1wnkyn2ma6l2nnk80y44nrsqf9fdh27gtx60v3sdxvd9uzheruwfs5kf23g\t968\t484\nmmx1n56f04jwuzpa2zkl46ggs3zv989fz4yx7yyrcx6nzn9ecvpwjucsudlers\t967\t483.5\nmmx1qm77f6cv9z9ufkavnt5nll7qq55rvjx3hru8kafx4guk3chpuawqcmd098\t967\t483.5\nmmx18plakxe6gzc7frl7mke9gfhaz30cgr40eyahtjexsm34kexk0dhs4cdedg\t950\t475\nmmx1rkkaqaqs8c99w2jk7xw5ugfgkcfyhxpnu8xq4g5a5fatxvgggtwsccyp28\t948\t474\nmmx1d48fsux0kj7empe0c6a68y8gh6f494hv6wgl7skc42ckf2932x3swcfen0\t947\t473.5\nmmx1gqvmjyu2jg6d68f3zytk294re7wv47q98aacrkfx8kuq6f0hsmlqxyfm0t\t946\t473\nmmx1tuw784a8wp38c6q3fw6jfeqy3pvd8ggh0gj9h0xqvez00q9sew5sg0j06z\t943\t471.5\nmmx1essz4a6dexpprz066dfgwslmz3p8uy73czfrlc7thy3s8w782rfsx75has\t930\t465\nmmx1k4sqj4vufu22zxtahymvhtwmjp4c633herv8h0l2z9nm2xn7uqlsjje4hn\t921\t460.5\nmmx1vpg8kftakr3pammp86a8hxyar9s0m54w9j4m29d9d6rlk9ztf2vsl7ck38\t915\t457.5\nmmx15m60pxy8mjp03mmtf9aq8kajmrt8vrzltj8epytnsucts50fh03qhw98ql\t913\t456.5\nmmx19awzztq8wmypthv24e60xmvxzymw82l86y0sdyw5cl5ehnr4ry9smhvg4s\t906\t453\nmmx14tkxv7wnyfjm45lr03j8r2qac5hsa9mk75emunjg78qngwgw66essvzga7\t895\t447.5\nmmx1h9l7sgtnyagj2zctlj0xmmn7275uqpss2dn8funllmgd7aj3auvqv0fy7q\t894\t447\nmmx1tqmjtpyuvj7ze5ke5qwpclm8zlt233n8japxhxa8jhg94m9gya9qsqxf7c\t887\t443.5\nmmx187llktd264wz7f33nqexhh8frcykztdg0emw5t26cvmzfng8dquqzl8qwe\t882\t441\nmmx1hkmks5m9u9le0k2zmx5djjxr6eh34nyzldlnty3mzk6yhzvcevks4z2n29\t876\t438\nmmx1ye76l4yxct7a2842mqa8vcf4q3jqryksu3s6xqvj3qdlaq47es6s2nt552\t873\t436.5\nmmx10c7skd5pzvrclcqfemg2nwk0pnpeh6p95aucnt04z3tjhpl3f2vsq6wzpg\t848\t424\nmmx10nfcaxrj93rjxxx3us3mwzajznj8qpcd5vg459yfkk8lg90jqq9qxry935\t839\t419.5\nmmx1m2nxpzuhfj4awyc2wnu37nhkhsy0q8spg9egnkzf3geq2kax3g7q54emhl\t827\t413.5\nmmx1rd8n5srxsgys0l27d3ym8wmcw0lr4jqf7temzz7pqqjx3knnksesgace7w\t827\t413.5\nmmx15sme6pzzgltj9hn9s5u4xjtmyud4qx8pd2kgvj8hsymp6amx0wnsgw9u27\t819\t409.5\nmmx1ff4lyf7ulfrwt0wfnr6dtpuk6tv0w522ef3pkm5ax8e9wv8crd3qe0a7re\t802\t401\nmmx12gqel8celwz6wxq32usd6ut8gejtl5nw705y5pecp0tpyszn80qsgzmptu\t798\t399\nmmx1sgquqfayd4n86899hjxr4xg5z066jfljxj6mjysns890vpckj5jqt2h9t3\t791\t395.5\nmmx1kt5wvvt7k9h6e5muyx3e9pcvpnakawpr7g940gggfgrktsd3pf6s0qnpuu\t782\t391\nmmx1vkya64sext8u0kcj2fsrezryfvxyprez6xdxapkzpcywakxh7v0qu63esv\t767\t383.5\nmmx1gy8npau5h8fas5er5mwtl4sqe2glvwrkr56dj9679h633mgq3eyqpvz0cg\t755\t377.5\nmmx1uq6ytg6v53lsy525m6352hznumufehsecaugpmyq36vezznyvzusmfpxm2\t753\t376.5\nmmx16f75q09hg545zuftzhkq9cx5sj3twpp2psj7uf5z2nh0vhuf3qxquss7h0\t752\t376\nmmx1aa6383rdchx47qugjavpkcyxnpjvj6v0trml9h3ez5wlcusv0vmq0gkj65\t738\t369\nmmx1355xdy9zhgzd8k3grndkwdff9qr8qk8raucr93praws40s27fkrsjlz07p\t723\t361.5\nmmx1zx4nmhzryn2j999yucpqttkmp4rm49gcmdzz5ze90wddg4459s8qf9clz5\t719\t359.5\nmmx1r2s7q00hau24y49gdglqx9luqlgjug46del32hmfmujmq87fhqksw7emhl\t719\t359.5\nmmx1zeqjj69mt8a5pcgdzrukt47cpgg6nwdas6m5j6aqefxapq7klcxss8tcha\t718\t359\nmmx1sy48eekchg24ywy0rp76avyhfd9hh7f8659tsrljz5tujekwm8pqhues99\t703\t351.5\nmmx1x40j0p3ss44jghrx2t0yqr9gqcr36xx9pjss4vvxwj60gkfvg2yqauewfw\t699\t349.5\nmmx1mlurm4px73xghkdn02u60qff4f795nnmt04e4as595tf4luvasmsggxmfk\t694\t347\nmmx1hwq6ezh6zgc6pvadxh343nnhvenc5zw0lalx4la9777ucv8lp3fqnjpwx2\t692\t346\nmmx17gjhpuwmfcdlymhaz9qwat2frpptev3pz2qmuq3zycj76qwnr54q40t5l0\t691\t345.5\nmmx1els3e8hj2jvteh7y2xgwwxwq2uknurtkp63ca74gcuhrcajpzc2skqmh40\t680\t340\nmmx1jw4zf9sepfvnnnanj79mqd53pgx683trcms5hfny2nx2dtv9rvkqwhl0f0\t674\t337\nmmx1fd7vl03g6xpj6r6c3w4kae4ht7zke6hk3ar0nzhzvjym9yc3v5ksr9knqs\t667\t333.5\nmmx1v5u67yws0zlnutd4lw0gqk8dk75xnjj3k87rnzjqurx3lpz7aflq863r48\t663\t331.5\nmmx18csvx9uspv3mp45autfk4dj0t4yzvzyce63gv66nahaq9pct73ys70ezu4\t651\t325.5\nmmx1tsp5d79u8chvaa2agx55d0mrj69adu2d8ksensvrlwucas0gj86saafr3t\t637\t318.5\nmmx1nkd5fyvrnu8zeqgen48aeqcnyggjxnn7dctfddj7m2mz25alrl8s74wqvz\t634\t317\nmmx1v607ksqyympga4xdpy0pjezyv2gayta3d3vym23jwx30e3ynl6jqwj3jqm\t631\t315.5\nmmx1re75j8gejzdje5afrkdsl9xknheax4ymznewazk5jqy4msarp05qz7qqsp\t628\t314\nmmx1ktyudrg32h95gwzg0hfl87lf6wruuunp6w888typfdw9f52g4axqcsltyu\t627\t313.5\nmmx1l8ht54p69ynxxf0lxzrvm20956dcpk4lj22rv0jmdtefk70hurrq8m4j7a\t612\t306\nmmx1990jyjqxpaphcr9fqmz6fdm9v4kzymtt8kkmnzz2hrdpk8n8ca2qygudv5\t604\t302\nmmx139j94tjwh6m9mnxdej2j2nkl8xc5ghzvt7fvz9pah7jvfxnhdassm4z56g\t598\t299\nmmx1n9k3yluqcmnwz5wdk3dclgs6uq7yf4g4tvahh25jl3z4u488ttesnf2kkx\t596\t298\nmmx1qvemldmglge8tr2dcwnr4gqam6vkal5dkc2jwsz2jyyy8rhry4hs58hvrc\t592\t296\nmmx1csufldu5u90h3f5cr254agcn6cc982q9l2e6jjfdftykrfhl65psxfh0al\t590\t295\nmmx1q33rhh00r0dh7fx79lp9wrmv3t5mgpx6m3wtpajmmenuux0lzvlqruqgnp\t587\t293.5\nmmx1544prt4r26fm2f6ytlvdfe3j6mwrs5p479kp3lcrz5n58kp8ugpssn2z2u\t585\t292.5\nmmx13vvj20fm6lwmjd3anw9cy9hxeq0pexln9h2n5qmmva4ts3q7sqhs39f7dl\t583\t291.5\nmmx1yw9yfrq7m2nf3lztur5qqwp255mqrxyfctcu5vqve9he7dme0x5sjr3c9t\t580\t290\nmmx1la845mwntk5rqty7x33yw2t04e7njxyl3uflmfvea7lxzcwvc6ksmr3war\t575\t287.5\nmmx1g67zee4q9x4wp2s4lkfde4v2m05e90jgn0m42uxw35r22emk3r6qa8ttan\t573\t286.5\nmmx1kapvcp4xpfzu2ftekrkzwwdz4qtayu0zl7krddrrg6a43sngsnhqq6dl05\t571\t285.5\nmmx1u7me3rp6kmfs57wzytrxjh843sypnl0l27unk0c2pzkuuhjhy03qfwcyqf\t570\t285\nmmx1qwcxn8k9nxdu43ytsw0ew7wk7mmptr3ykvtenms3fsyqexg9p36sp9slcv\t568\t284\nmmx1d3vplkcw0pjqrpfr3cesjmvslk30p8qxhky5l4gdslclu70tql0qdqp9dn\t568\t284\nmmx1f8yps5v4rqakx3gyws5hhlrmapcjzzf5j80dm655ehcrf6qgz36qandk5l\t565\t282.5\nmmx1n4n4k7wa79l83ch35r68eavnh0lkwcs3h52jt2xjl6j0969lqvhqsew3wl\t564\t282\nmmx17g6gp5v6070kcjcq0tx0u6ahgqyth4gq9fha3sgsvdwe8xn0fj7sslsft8\t555\t277.5\nmmx17gfe96qhqt3ylhxxqj7x6qxjzvt8cen7s4ks6e0mt642dplug4vq652g57\t554\t277\nmmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\t551\t275.5\nmmx1kxasqu6r7dsuqtzd4drllld6e6l55dxj54s3pgaxz23mdpvcqymqx84dvu\t549\t274.5\nmmx1nlwcd5rv3djk4fh7szmghv4dezccyfd0cs3wm5h0mltx2jf8xplsj3agaq\t548\t274\nmmx1su0cegxxdg73yhm3xu226uj74309x9ll5ycd5m8eh04n9as7mjyspr0w7m\t544\t272\nmmx1652t20n0jwl4mn8xe6k3j3zalgpuw38u23e6cf5249n3h278033q3kcq00\t542\t271\nmmx1tgppefepecrczwwad3zlvcwhuujsyr63gh8mv92el5yy8egzk97sdqpjp8\t540\t270\nmmx1n50ufuaae6aqhxcjlw0fydmhpt4h049rfzjqtgke57sn49p34sasdhzm0c\t536\t268\nmmx1qh002xzjsedzpuzqq4cz6spv4qayuwhyt84j7pd8zeylqwl0k2xsnhg9y3\t534\t267\nmmx1tms3d3n23j28f9agpm0jrdqnh634f3q9rgcnwsgq64yhcshps4fqd0fv6k\t533\t266.5\nmmx10a32q2xtl4pvm2trnjf8cgyswuyywg4allvc7j5pakau4adcdcnsvmsr0u\t521\t260.5\nmmx1m7uycpxww03cj05zhdgzjcen70kv3pd7gwsk8grcdtu9ltch6rsq9plyz8\t520\t260\nmmx12hpmx28f6hf0hzx5j6z9ep8vjmpcgq5kwmaxkpagkqdfksunkgssmk59vn\t514\t257\nmmx1hz0h2af4zmvnczp0twyzt8uts262pn9h93awamhc2sakdlvxvgcs8llaeh\t510\t255\nmmx1jmkx9m05exvtuk5swve9x9qe2u6udxx5h8p4w2drlu92523pjj6qsq8epg\t504\t252\nmmx14fz0p5ff557c6sh6xx3ssztc8sv8a023cqugskep0vm4j85rna0s7fu03g\t503\t251.5\nmmx18pu3yu4a0zatqgkph8t5pz3n4jy7hq2x9f348yhwafvj4wd328usef7aw5\t501\t250.5\nmmx134t4wf6h2ppxnxm02ejutn0va4sj6fm0qkyn0hsfx5r4a89x25lqznt9py\t493\t246.5\nmmx1vkmzqsggqcqtzy9ea8rd56zx20uln52ug5q76y5u7hzjl8jaxfeqe3f49d\t492\t246\nmmx1e83q59e5gy528v9j68ewnhpgkwkdpt47y03ev9a3y5ma5plsyrqqru2dw4\t482\t241\nmmx142lrptfxxp77w97ev74rev8qmrkykjf9cchghvhh8nr6dkt9zd8s2e55x6\t479\t239.5\nmmx14nru8xmclg23hcdvanrn72rjre93wyew7vgv7hrwtexlkx2m42mss8d782\t477\t238.5\nmmx143pxg8tpjx889uqxmczg7f7wtee3qdl6ya50dnrk7qm84h82s6qqz7dktz\t468\t234\nmmx1n04te3zvrvfsgmvzl3dzegpntqeqevwmd2ycwwwhng0hwslxkyfqpq2ng5\t465\t232.5\nmmx1axrdzlwdpczy66khlgcx6zffrury8z6jxxapeygehz5djt5cpyts2mqw7f\t465\t232.5\nmmx14ntt0scarmrahc8dq3xfdwqqpuxddh6ez2qaq4dcdyyw0acwuevsumdgvh\t460\t230\nmmx1sg74tyha62nx9ttjuk53vhk00248ts77s2ee55ryrcskrmuf0k6svhdwxy\t456\t228\nmmx1l4nf9stg5qzuecmrfvls5wgtd8l3mdgwedcwvu5eqfa3n3pektzs2l5gvk\t455\t227.5\nmmx14tmfx4twa5spah6u7he78hg5nk7tp42zdjsq8a25fyenxz64yfqsqdzlh6\t455\t227.5\nmmx1gr44j33n8tsjpcmstcmffup7ap9a85kz3ykyuzd9zueegz37xh0qql5jwm\t451\t225.5\nmmx1xn5hqxpphvuapka2kmg6xhsserajjzd48v7fknldems5amkf2a4qf0g2j2\t448\t224\nmmx1nqkt86wlfpkvjylyqdsy4pa2e024cjpfnczt667tshtsv7uh6g7qd8dnel\t447\t223.5\nmmx1dlakd49hcv20y9mylc2af37gttz089yvkrr6rn3jcyj2elpsygksmuynv0\t447\t223.5\nmmx1lka3j0475gzy9yk0c3lt4f9d0p8zhlcujhsfsl3f035z6fuytpesppfrq9\t446\t223\nmmx15qd64czwphlu49mlj6kmxru6wdcrjny326mp5d5p0hpzhuhw65sslkng8e\t445\t222.5\nmmx15hfmkxyxttvpt36w04e0h3sdgr5r25869jpxehj4h6mrt66kppvqp9npnm\t438\t219\nmmx1g92fj7rug3g8430z3uz8w9ntlsssknz7vnmw2xwtwy7g0yu3c8js2ucv9s\t436\t218\nmmx16qstch29gdwqtfadwwta8fd20zrhqy7pgkaud2h3ceeafwjcmz3q2ezr8g\t435\t217.5\nmmx1vp6lfvs36vdft6ljgmvpe7049dygsl4nqy6pvyd090huaq5m44js02y3zw\t419\t209.5\nmmx107aackvhak3d2lapgz6qprp9785qfudzrclptqzvgkpzly2ppqtsypk9kk\t415\t207.5\nmmx1f69lleyu3cznmnxlp9xznjnr84xrzutmjjcl4nlsfv2359fjze5sz787ay\t411\t205.5\nmmx1r4cxz87hzamu4msexedead90rwpggzf6ktfuef8sugf7qqf8cz5qx3pf80\t406\t203\nmmx1e5gsd2weaqmzszdlj4gu975s2cc2gscnrtsa9agufcgjv3zat8vs606ewv\t402\t201\nmmx1av5ws5dp8xkwp08g3ge4fsmr5r80c7y88p8yru7rcv3gsvnkcahss2pygm\t402\t201\nmmx1p38leegjxpafuxqcjqw5ddd2ny39ajs4hyy93l5hsr42hxhsdjmq67xl7x\t401\t200.5\nmmx1uf668t2krsyfde2v7cwtwk3traj7gwrfcdcx0j72rjr84nnz2fqs83fpcs\t399\t199.5\nmmx1m6dwm8wvtthgngztjnw7r0g4z9s8797xa7hdzrj2zyajctgrpc5qx2zqg7\t399\t199.5\nmmx1hm4mvj4dheczz5g7fvpw4pnmrqlm0z9arhkqtvq6yaxza5ckmlws85y7zw\t396\t198\nmmx1vlm6nlha47hctqvcqyz8uqfc64j8h5k2sgjmkk92ysm2k9se4hnqqldyu5\t394\t197\nmmx1ezvssk3jgn6wr4t03ng5at3mccxyf6868z2kzmapnfqhuyyu2yrsa4vlkw\t392\t196\nmmx1n39lrqg4kq5ey2tnk3wlqxylcuflevkkt9wffj9x2fsygma8m9hqntpsry\t392\t196\nmmx1ks9t2rksthddy00395l48vaqc9rmjuznw0gyuta0jxpkzsce44qs3at8x4\t390\t195\nmmx1lnwzzc8kdm0lnfezlapkh66tl59ruhn053rtsgtnd0j6qglr97xqt865yj\t389\t194.5\nmmx1znmap05s26uhhzzewpz4daz634wcslefnlchrdlh6aptvem6u09s7k75zr\t373\t186.5\nmmx15v9jzpzxjwdtn8ggkzu7s5suv7kqhuw9yer4w7ngvenlgg660vlq8zgk88\t372\t186\nmmx18ee0whkd2pk6xymy9sz7a9y6mmcujphzqcyl659fxz2cdr5ln20qkd3wav\t371\t185.5\nmmx1u6599454hfykwc52crn3wj2symdjkqsgu9rq0u3wmwteuc4z5jpsr327jw\t371\t185.5\nmmx18evqre2xyqqzgspaam0sps0avu9xt7llz7t3r9wexelpy8jnws3s0u7sev\t370\t185\nmmx1xrydtrhnl89x5dtqpwape59f0t246hhs38tl5d3pzcamfxh65llspr5pvc\t369\t184.5\nmmx1cta37dl4czqsz7jaz5awly9kxy6v3v3nqes56vugfrg4h263fdzs99rgzf\t369\t184.5\nmmx12j2e0ja3z0up7t0csl2fmm52jd9mrc29pavccn67uhadrls4457qpv7qls\t363\t181.5\nmmx1gx8an96g7ky87eur85puyex8r24qswx5wn86r2849njg8q2hkeys8zqlvp\t362\t181\nmmx1ryur5srud4qgamfq2pmfggw780m3z2mlja4665v7f7mfp5dejyfslp6smy\t352\t176\nmmx1nra9jrj79xztttq6hnnenveezkk9pq4w5whvlmr2nhj4s56f43wqx0paqn\t349\t174.5\nmmx1x5f9slcglmm2x3z9h2jk5ynylf4k4y4e5l4rmge6nl6dqk28xxcq0qcj3w\t349\t174.5\nmmx1fglt4y8vdcq2errqju4qulnmcfl3he9nr09vxqke9hl805tcnw8s2039u6\t349\t174.5\nmmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\t344\t172\nmmx1kdz775nc0jd7uqjrlgd3a7pk6w6qm75w9hw26wa6q8mr3u4m42nqrj38hn\t339\t169.5\nmmx1h8thwkuhp0jnlr99ntwllhwhvp773yxufrcuwsh9q52vkrfcdy2q934mmu\t335\t167.5\nmmx1xwq2revzzgwlq27emrpfjmskmr60q7znpayenjlhuh08f4vxcrlsm99vzk\t333\t166.5\nmmx1fk0jqxyz6eh35qnlu70gx58v6ahgng29e4k6zjf6tqxa96y7p3gqu8w8qq\t331\t165.5\nmmx1nnrl7rh9r8d7xtxr29tgq7evywy8nvkh45w66f7p7u7tesct8ypq063ctl\t330\t165\nmmx1fm0j6pkfxsjeufdcglg58v3veay6mn2x8qp45tevkxfny696kewsv42zg5\t329\t164.5\nmmx183l5kulcdjh8hlut6aazut2fk246dr2agqlcm8lmkv3v3dn55avswxzcl0\t322\t161\nmmx1ghyal08f7r0p3ft8gywyr24p58jhe9fsy0xmu6wwfjuq4z079q3s36cu8q\t318\t159\nmmx1wut7pf5v32hpylz6rxmrsztxfhskgxp34cgt8vawu3xqg6y8pj0szay6tj\t317\t158.5\nmmx1u9xsdvqzayfla2rutaxkespha2xrhn9m6wn7v8z8rhj277v9k24q44rft2\t316\t158\nmmx18tt3u9d47tc2frcp4z20yzt2yw9fpe0kn4hsnardnlzdsj9eewyqkhaxr9\t316\t158\nmmx1dxxgygp75dh3p0yh6kmezeeyftncphy0q2fjws48wzxdrktsy7kscjdmd6\t314\t157\nmmx1vcfhtrfqn509vtgug5yjdgx3v7u6pa858swvwgnp84nez9n03v7shktem2\t310\t155\nmmx1ln8cwt5hwwd5l79uar8gt20njcl3vzud6m00lxtzc0uecq7zvmzql5mhez\t306\t153\nmmx1j07gy44rhsg9xtaf9kt95h8jr8vq8zq40ljf38dqh4mmtkekrtgsul7gud\t305\t152.5\nmmx10luguxfgx4rfd4nft0ee6ydk9dcedc4gvvwhknp0n9ux9nck45qs5m6cz8\t305\t152.5\nmmx19j0tzeawmjma763dj027q6c0up4a8z6leypc7htgpxwnk6wr6d7s8est7d\t305\t152.5\nmmx19nnl9lw7td20z9l22v8wk558mxfrdeud8ky3229utv6e50cqyazs8jhq5e\t304\t152\nmmx1j40vufa4cx0xgfns498sm03he60ff0r922treh5qecfuwpsak4vqjtpdu9\t301\t150.5\nmmx1t9g3q5fahh5zpsqw7hnlm37mvmty3vckn77cfepfpt23jw9k4tuq7pqy52\t300\t150\nmmx10783gzrqc88k0n0ert2nkjz9ams2aj77ux4t0y3lsmyexnue2h0qem44ac\t295\t147.5\nmmx1f4msx52tgjn7wwetqyx9e7jr63krs2ut8fx0n5ufqvp6fncfl5vswzueae\t295\t147.5\nmmx1a6fnk3zev3ty79lwka7j5l955chv5gxzffkn92280nx0jrfqachqxhdsdn\t291\t145.5\nmmx1mhp72cd0lfnlfpfuclh9p6uqcuu6y0cr4cx7qnk266hleawuyuxscha8vw\t291\t145.5\nmmx18pyq9ckc7wykdz3wmxm5e85wsgwnwyxundkma5wxxmc98543z89q9amqhh\t290\t145\nmmx1j2awdr9j4gun67tr7e02h6dq5522u7lkcu5ftvl90ajgf9kvhqusdze086\t287\t143.5\nmmx1k9lslhl4wmhs7ray9lfh47cxkz0j5vr827vypyaltsq80697xyqss2gn93\t282\t141\nmmx1ffrdjd4ccl6ga736hz3ran0xl8k9af5xf9ae28hqjg2fhugfdf5s4q8qr7\t282\t141\nmmx1mcxgagq0znvmk0g7dqvfa9ewj2qwjxhysrna634prhn89nmgknksn8ufzx\t281\t140.5\nmmx1499ujt570lt5yjmvrm7j6xqpvhlgw7kuye4lrzhfz8p724fp4zxsx66pgz\t279\t139.5\nmmx17vr7dm99pccp240q7kr4ynw0tln4r6h9n34vc9dcdk7gch3dcqgscgaw0w\t278\t139\nmmx1tpu0645t2k88g5zpjyum5zdus8luwpgwl00jr8v7074h2nmen5nqalkdaj\t277\t138.5\nmmx128j2zgejfdmut0z3559gzw0vntm6rz2fcmhvppcgkyn9kvuekmzqkhk8hh\t273\t136.5\nmmx1ay2su27wuxjye9f9njdj0e7jjgxs4gah9p53upmrt4rwtv6afuhsw6awcq\t269\t134.5\nmmx1evudswfffa6pru342f5hkduqhmmalx3c94clvyed63ht0dkn2edq3shffh\t268\t134\nmmx1elqhr769rul729fampn6u3ylcxfprr6zgvvndppkzkzzmaefk6csr0s5e2\t262\t131\nmmx1fgxwy76pzglmqdqxuvv3l258233900kkke3p0mf0gaztjwmxq2lslppuqh\t259\t129.5\nmmx1mk6v9wmyju7spyncrggntg4lm62g0ensg76yjgjhdtnmpls3nr2sd9qwqp\t258\t129\nmmx1d4580utep9epx933mp6666886cect39qt9dl30qwxj767fkxpfgq9h6y3l\t255\t127.5\nmmx1kky0cu2dauntftsk8a55rdche6kuhm227qt2ktfsyrhvu7v4yteq8rg4d3\t255\t127.5\nmmx1kvczf9d27064yfd7kpha95ehrvem875khnq3zadd3zjyxu78ly6s2vwwp2\t254\t127\nmmx1glx7a9c25wns42k936r3qczu0egjtlshkaxgv5atxpyyj2dkd6rqklrnhh\t253\t126.5\nmmx1h9p0lv7at2ahtulugvg9vdh5nkjph2uvg93uz5azp8hmmuyaj50s8ky6v6\t253\t126.5\nmmx19398nqhvlk3t79afq0csx9lyg6j0utftw3862295ue4h4tjgzvvsjt3pcs\t246\t123\nmmx1tagjkz3avdgz8a5kn8kkhs3lr9lur0fmdt9zuz49h9j9vcg80v9scl8fpc\t232\t116\nmmx1tfn2vhdwrfuemr5dspc53qrhh2qek4amsq38j5d0a6sj73fdyrmsnvjrqx\t229\t114.5\nmmx1ccgy2ru9jn5a7d67w09zrgsxgv5hfxrkzdcv56dlpcraa7tkrtkqsrah8a\t227\t113.5\nmmx1lauskl8kzuwevqyx2ky8ale95esy87swemetk0zhc73ctrdm5c0sxy3exa\t223\t111.5\nmmx19ud3ev0q0tcrpsmh05tggwt4n2nkwrzrrtuwtyv0pl2t3t9w52ysy954ch\t220\t110\nmmx1ynae9xlz4m0ec99702l48stft3m4kvwwz5zx60zwexhnpyhp8srsxam40c\t219\t109.5\nmmx122x5elltrsykqwy27q4jpe405m5d6aaxtfte87mjl6zty5e5ju2q9ucfz8\t216\t108\nmmx1arwca695tyd8rsgxx8r707xpe3laawcv3lq593hs4qz9zehlngvsz68wh7\t214\t107\nmmx1r5e7qrk323nmr3jhazwr3adu4v8n8dfrh3wvmx38ptmhv7wq23cstwl09v\t214\t107\nmmx18vfpqpqwtt7htk5dwgd4lwdnyym659skm9ppf0sadkp5400w50tsxysqv3\t213\t106.5\nmmx1hd5c7v7542hzr9j3ac3zx29d4eglxyq8c38nrqvuzdsjn206837qehjl0m\t210\t105\nmmx12n7hafkn4tfwk8jta677lw48092lezrx8vgwn4t7ulsweeg6xftse7e5s9\t207\t103.5\nmmx1gw4n8htnqwhunjyypmcheushazv597xama2tx9pjf8zrsdq943wq8luz82\t206\t103\nmmx1cgx3ck3dmznw8xg78jc9xfcf7rws0yrkhpj5tymnc25dteduu35sd6p92j\t205\t102.5\nmmx1fr77kwzjzcv3xmrhczs5wwsmxlufp9kkvndch9d78fr3m09mqgysc6lnaa\t205\t102.5\nmmx1l52feg8wshacztsyf6f77ndq44qp87tdwns9wdlxv3t4uej08fssuuwng7\t204\t102\nmmx1lntqvyetpdaqzkw4f9hqhuh8kkf3f7u3rl96gxz3lgztfptfaevqk8elws\t204\t102\nmmx1re7sxpa7fmpseg8phu4pqamqmg72qmm3e7fzx880lz79dnyltpgsga39eg\t202\t101\nmmx1rfkx4gam8z02m09k5am29u2nyn62wlc22f0fapkqra6ckxspnn7qa0d336\t201\t100.5\nmmx1ahckwehmp72cr9rkuk3sek6zv6ay0c28tt7fkrhy5qgdpe06t79qvrjsns\t200\t100\nmmx1qj5zysw5wc0qhwljrkgkvskmfsempcr8hf9zd2m9xw5dkger59eqf75dpg\t197\t98.5\nmmx1e3rafs5jhzf03a8wxwp43kcguxr98eq3azy5lvatwayvezqfyrcqeumth7\t196\t98\nmmx1u59mc3s94cezun5apvw35vj2vnzfanjv45svwfdat84wpuefcs7qzns66s\t195\t97.5\nmmx1r8mm9d0q88dr7dw0v94yl0cthpr560r30x90zxcutltxcck6xq2sm3yx2k\t188\t94\nmmx1m2qrqthgwr3x7cyhf7fc97t00yszfvet9jy6x0chtqq65ycyxkqs4pmxfm\t187\t93.5\nmmx1tgde3wpspejv0gq70lqe54l93n4mrdmrp3xt3ts4q96keddyrfjqe0e0t2\t184\t92\nmmx1rn0p87m57fzv5je8wu97aegkhejf7r5gz3clr4ajs0k42p4g57pqwh85wl\t178\t89\nmmx1yqycann5zs9eupjsea76ahp5h2h0d52n6hqxvd0v3whezr0wre4s3zku4g\t176\t88\nmmx1vprl39d98qzd3u5nk95qnhus9vjp4sen2w7y59yu0m5udqll6szquzr6y5\t176\t88\nmmx1csleu9q374crgsm06k0xq2n0vdcufm34ahz3lww7kmyt7ukj38aq3ta9sv\t175\t87.5\nmmx1zp7rs0q0dqthcwdfvpaugv6px5qylq9uvwltvq4gpepdqyk9299qhvd3tr\t173\t86.5\nmmx1lan9judvg8w56k94gequv9k6rmzr8kwmq0fk0vh2k69muzjpauhsszypcq\t172\t86\nmmx1fgylxyf2ef9p5zj0d6hnz6wr7wmkgukq6zt398uk3j78nhxfu2kq05qm4a\t172\t86\nmmx1py700x95hshs4cuzccjshmt0eaen0psw2kmhpv0tmy7lag9wdh6q58puuy\t169\t84.5\nmmx1sg8mgch2566d2uncn3lew5wwwacp2femp63y4gshj0qpy9fehjqsysa3ng\t167\t83.5\nmmx1ckrmrs93ya5xud2lskwvn3z8t285awqcl4vx5v6zgyphat5eultqs6ds4l\t162\t81\nmmx13j75773f8tfepkdjtcrpmv3djm4y7htcl2waq6spxkgtxs4yss3qfukrk6\t160\t80\nmmx1c4sffu66s9eepqph3kfjarh4fp5h5dhl3u0r8jvrqlq4jkdp3sgq4dcav7\t160\t80\nmmx1jxl5gaxtd8wnc6r9nxmf5s748ct827cpjafdefw8rgen75lyxxws4u8a45\t160\t80\nmmx1a7mtekvyzh5f0uswz0pzqq6lys66ta9eavjyk66w4kgrseej6p7q5savlp\t159\t79.5\nmmx1c2jrdpa796438jzxxjw3y68tepmlzqv3e4a28d6t52juznprsm7qpwc0fj\t157\t78.5\nmmx18jk3gsj6r4y3esc22r0qvxru79ues6z7keha33ahn5tgahxzcknq48ler4\t154\t77\nmmx1uth7wfnyvzfy8nf56u6t5xhf085l870ytdjazm4g6ja7qmn6w9vqljj34x\t154\t77\nmmx1drhuec6ts2hz9qf8jjxmpan7zlung5anurrpxnvjkmqy87vvuh5seglsha\t153\t76.5\nmmx1p898m68n456q533nfjd5sa28akadyqy3dvq6tywk3jxgy7chrrwqeh70e3\t153\t76.5\nmmx1p22ucfvur2su5mg5l3h0n62saywradp6fv8q3lecajpxkuxxz2wqyjxvch\t150\t75\nmmx1ksduhw2jnwayh3a62cnhmxf7vax5lult55kj09ejvqgrr7gy726qkp57w7\t150\t75\nmmx165nssm0dfafy22f5fgr8ln543g7gjgwrmxmdj5w5arjwma2k6kgq700fu7\t141\t70.5\nmmx1mvlerkhjtrg0qapvxgduxnw0ucm33pjcv6jutkhf82ampzhaewaq7ym4vt\t140\t70\nmmx1qg6du0mef5nz96gz7wa6f0ndmdhqnen0knwz3kw5ytf4kl9f89eq2kmrsw\t139\t69.5\nmmx1d8s9yjjn824xg86x5wwhvn7nnwqe7wnvdn28t64cmtp62avpvtxs9ycy60\t138\t69\nmmx1uw2mjnw6zt8t0r2w0afqu3zw7jkjl80xjwnfgk6cx7m2c9u5052q6m24l3\t137\t68.5\nmmx1hsgvhawn7nz3xz6dqeu852yrnpdygf3hhahq0hydnxw25g8057qsp76xwk\t137\t68.5\nmmx1g6t97kcskgvun5lzk53laaahzr6tahuzgg22uyukfda5wupemz0sv5vejn\t136\t68\nmmx1l5hsvt7g2pydzauqhm77g4h8es27ffagmpseuks5tm3tn04n6nyslcafqj\t134\t67\nmmx1yknhrstjc5uslrg7zequ278dk3j42s7ylfw5frvgjdsjzm3jxwcqu768zc\t133\t66.5\nmmx164hdypm0mgekpt743z7xu7vtm5w80hysnvgld66zr54gvhcwm8aqrsk22s\t128\t64\nmmx13l7yln6mennhvfx9celf99enpdgtfe7qs8dmr4nfr06prcfmz0eqsda2ae\t127\t63.5\nmmx1hfhn035wpjnm6yhl223rh55e85a23ksp679ku6kpk2n7klxxaecq4xw57p\t127\t63.5\nmmx1gxz9mgd2z0v6sr4luvnhw2u5qandh7yvl7rpxcz0d06rdfa7s9js6w6p73\t121\t60.5\nmmx1atwce5d7s6pn27censfqkrc4qtqkh8a8ufzylnqakngeg7elutyqs7yqek\t120\t60\nmmx1mrmnxtc9vwjkgfst6z999x42wfuwl0ywnwn0rgyvypj6660l093s6htasn\t119\t59.5\nmmx1er9czf5xeu2wnpjeg69hhttxppwkpt0hmazpclhgjha0nad6kyvqeus2pv\t118\t59\nmmx1n0a3t40vv5kdgfnduj82kzw9ewy3tu5utszgxhkztdvqlu8xgdks8nyh2h\t116\t58\nmmx1zx8z2zkc0hvn9cpnjctcc8akqxf0e2au70dd3uln96hz6uxw7c6s6s7s88\t115\t57.5\nmmx1n39pyuyq8slux6rcrvpyfqr554tcytn7nfrmwjetkkryeww59fxsf8qvm3\t115\t57.5\nmmx1chmqhg48plemff47t5hrc50p7sk809q337uvwn6385cdl8y8a2jskzzcwc\t113\t56.5\nmmx1au96n6nrcskxc7wqedekzfmef69jrx8vlws79ypnnhuhc9hgk4hs96y2s4\t112\t56\nmmx1ll2yar6vrsv84f5qdwfvh8tv80qlmkxdlr4ddqpmpzncqrgjghjs8s573z\t111\t55.5\nmmx1yht9eg80753876sq3qjljn7nwxl300g70rauqran8qkvdtrtqzvqxkdxq0\t110\t55\nmmx1gz8zq3caexftrf8f03l9pg694s4zy4t0cacz5mq0h7u7ge86yt7qjlumup\t110\t55\nmmx10qnnual5h4rxxcmjh8ts39l28azqwjqlfz0u0gjeruntvs0zpqus0fl0u9\t108\t54\nmmx1tcwemyrrzd62wrh8ff3kn4z3hr0dts2waxpxwfpwg2jau2tz0d5s0e3kme\t106\t53\nmmx1qxr2rcnvgcwvs3304d8rlm8kzcg3cdrfdnrp0vq3t6eku4g55xtqw8kd9w\t105\t52.5\nmmx15w4ytftzunx9ues8qhk3z8wmrmtgcg5n88axzk3c8qwtzr3n8cts3hnhj2\t102\t51\nmmx1g4f72rl89zhnxw5qg5fkc64slmmrd8cfakpa4w3xlxpt62s3gdeqhs05d5\t101\t50.5\nmmx1rz67uawsu0vhh8zx7ezvpy4d8jhtyjt4g4au39sf4qft4sguwx4sl7kjfx\t100\t50\nmmx1q5kdfkldkc735p5e7aj6y5y0szvhml9nchux98cfqfun4wa74vxsm3zr8c\t99\t49.5\nmmx139le573u5rq3g7a4adydjznp86en3u5wznrlywq5k0jy0s49fvwspq0w5k\t95\t47.5\nmmx1haurf6xpzc0aj833h7tq0382s3qpp5a698kh9ysu4j99azma9t5seuhzdh\t93\t46.5\nmmx1xj8utkqx9a2m3wgt4pe95z4jh54xgsl5gtdfwxqfcg823stkplus3fv5r9\t88\t44\nmmx1q8uqnnncy4jylne7m098x4lnwrf34f400cn63px5jayj5eddhcqs3nuyd8\t88\t44\nmmx1md60nlasdkf7uu52lw7gmpvs07jepacq7u6spajhaj5prgn7vnvsecqcfy\t87\t43.5\nmmx1f2jdndglt2mvq37tc3wp8gtf3l3uql0sn485x80096m59y0ydl6q90ds4p\t85\t42.5\nmmx1tq8ewkuuc9sr8a34eml065d45atwfq2fv5r738927rx9cqzv9mvql6x3xy\t84\t42\nmmx1h7fr39agpsasxptf6tflwaqscczaes5ep99v0qqe84sntdh0ew9sumnljk\t83\t41.5\nmmx1u802gcgzhfkkggcq5l7388xz2fn9hswy7zvh74t5c7yvu9x3r7xq4d9r05\t78\t39\nmmx1edsqjgugd0hqynwa9h0gm05vsmqpse9yhwr85eftrxyu6ww0la3qf9hspx\t77\t38.5\nmmx1qdsec387taxe2aw5j50sjp8qh2eq85deqxa84wmhkvywncvuvkqsygpay7\t77\t38.5\nmmx1swqkluvn7gggzn48wa4k22c8edp8wdnrhnhv0c52jk569m5chprq6nefvu\t77\t38.5\nmmx1kn0k496puu64hyutyn6augc2cj52rc4p0vmmfcceqezp2y5kfv0s6ddymx\t77\t38.5\nmmx1zqrr5qw2akhgvvxnfvl3epw5zxjy8j3930fed2agnexxjelrhy9qdrrh37\t76\t38\nmmx18gszx83xlhzj3s533m62pazj3c7v08rgu4t8sh0vs9c2leg3ldcsfgkc3y\t76\t38\nmmx1lhqhhwzvn5y7kmgeenjx9k76pq4nnmqg4hffvar8tkns7qpu6z0qwatcyn\t74\t37\nmmx1u2v2uf8seke36nxtxh90hpgh43dy5py836ygkvqwaqx5jhck95ysjepx8g\t73\t36.5\nmmx1lnh2du3xrhsjlu2dst8z78x285m5zct9p3c959uldvqpv6km8dusz05n7t\t71\t35.5\nmmx155as8zcs0l2lxqkehgq84lk9utwh8k7xalx7khmh0lt9yvszkrasrgyt0f\t70\t35\nmmx1j7njmgtzmqr49n9lyacawww0uv2sjgxs7d04xu2ns6k62hfqycqsh33u92\t69\t34.5\nmmx1g5q667lmyzaclvskxhs3dp533pv5g3uvqu60v8n9ckdcgjm4e7xqe694xs\t67\t33.5\nmmx1255zy749m3fss4azm0ggj304y6l5uswd2d0rm0hgdgwts9dlfygsgnzfds\t67\t33.5\nmmx1x225z4p73e847du0g5k63tgfj3c3zn03z2rr2zqnm6fs72n03k5qrafd09\t67\t33.5\nmmx1kevvjxgq5hn9kzlds67gt773fsytmpv9vc4cmqnxlcqnv3ftm4zqm9y9rs\t66\t33\nmmx19fmsw5j977kh3nexv48lr0neeyese2pl0g8vgjp429d8hfurtf3s3k5ps2\t66\t33\nmmx1l0a7tg0ux27g2lgwq5vyj0dlsuzcxgl7z7vrxeed59glajvd8f3sk5nvhg\t63\t31.5\nmmx1humz3m6yfc5rrf9zczyjkptr7snre4e9slypuwhhgsn9eh952yds80u466\t62\t31\nmmx1k5zj5jew2s2rs5w7dqfzmm2uwv3xavastvkdd06f2fd2x3e676vs8v8rwt\t62\t31\nmmx1rx03nd8ttf02y3qz69s9xlxqhrhxtk3a5x8lnkxl3s02au2nkqes8dv836\t61\t30.5\nmmx1jj4r3za249xxcyp30jjyen8nz6kmtldqpypwuqhukzrp6trme30qsvdfxk\t60\t30\nmmx1x6j2m793ten9em7pu09q8qca794vrvrdc3jcw4yzc8zup0zrh45q8d2lqx\t59\t29.5\nmmx1rsjam2cenutaew3r3ssfc8zfh2uy2y3ycawafk0y4hq49djayemqnelh4z\t59\t29.5\nmmx1pfyewvtg6l24q40kx74cm2t9epm9wqwx27rph2l8uehnpzhrlqqqupy35q\t58\t29\nmmx1e8xldlayy2j5ptk9grrze76e5jyc8p0uq0zuslawyhqeu7xme5rsh06fw0\t58\t29\nmmx105ezm538jqpj859u3ygggr9umm9nrfxrgjd20mp8j3g22yvev4tqcljpj9\t57\t28.5\nmmx1kn9t8m4uxn7xpqpdy34xhxrdkuzs5tuhjqyc8qxw69decxqgtcns9yq940\t57\t28.5\nmmx1z8wnphkp2d50k2kk3f30eyxtp8h69e3pazzawvwtseuuerld339q904jsc\t57\t28.5\nmmx1tsgysdg9v234m6nftjx4fse4a9f6c55ck2vstd5hau6kkrzzfhpqc9wkha\t57\t28.5\nmmx1t4q59k0tu50ldpdklks90yrmtdyacw0v826aql4n4dkdvxzprets9vvt2m\t47\t23.5\nmmx130vvjzlqpd3dx33j5dvvcwxd2ry8vtx2xstahwpmshpwekq953kqh5r9rv\t47\t23.5\nmmx1eghncmcx5lurhs30meac277fx0qrkeugexm75ku3jwfeejhcpajsyx5wqu\t47\t23.5\nmmx1ujuywt50nv9jgt4tsu32mcgurtlu9zfvjutuvjk00d5k8peagwwq44fmqv\t46\t23\nmmx1vsav2xvgz8p56c0tj2lel0jew2u5v7r8mun2nm4tgu445w50vg8qx6p8yg\t46\t23\nmmx1mcsgnk9wd5wgausw8se9d50gv2m0dk0x8gg658xy76cnuegl850sklk8p9\t45\t22.5\nmmx1c68tgygju8yrhf4samf9mdc9rstzqe34kcz2zqnyqjxcraejlgpsq6jutc\t45\t22.5\nmmx1mq9w9vnuae4fdmn27ceh3h9wzaygmhf0c3sqa7xufy7x0l87zwwsdfm80k\t44\t22\nmmx1gqsyr45tlv0t2ct76wqpxtd0asjjq5df8etlhdva8wfvt8facy7stqeq6c\t42\t21\nmmx1wepa6m7j62en6tzc75h446sle2s9zpvllv3557t47q9zyr9y52ssu7j49x\t41\t20.5\nmmx189rrmskkykntwceazrltap8a2at40wdhv4wvjtqc2xk8d85ttdqsu5l54m\t41\t20.5\nmmx1r74wdy7kzh2dfdcumhc85tuherczlt8c4dsqdl03ufyg2lfa4frs2qmwlp\t40\t20\nmmx1m3tug5239zp7zst4qu7c7cns8f8dvel9lnjek23v2zd3ed9mmf2qzgpa9f\t40\t20\nmmx1can6xxmz54lhtrm53udpehkn6k6qspudttf9pdpg9evccj9hmhaqufdqfs\t38\t19\nmmx1jua0qs5fjp8xmz54xv2wxxlzg9ywxzmzvwn5w3r30eyg89dwjnashzjy8q\t38\t19\nmmx1pangjagnfffhfwpk265ry6a3zch4rs2kgp2rup7pwtuphgmsls5sj55j2h\t36\t18\nmmx1450fn44pv09yuetx3yp9vtvx5k3amv89vycq0f0dvugcvp6zedlqsw05p7\t36\t18\nmmx1x7py0zl3zdvtlrz978thjuzyqw7azyfu5264u4l8a9e287rc5juqekjvf2\t36\t18\nmmx1ze8ugap6cs90ec5tguyd9hg9g2xv7fyrz6s78ewzlsk7uwn3pvas3dnmt3\t35\t17.5\nmmx1nmya0r2ytqy66sqs3kxctpyd6sqcklzdqcyx038d8c2geysdmhhskph2up\t35\t17.5\nmmx1edcr8zgueucattajc94rpsfcmyazh0zseqk4pr2vs67d49kjnn7q9en6ev\t35\t17.5\nmmx1wefvja0djemhprqdj73np8mn3v258rx0ffyenpztrnr8tvndrrvsv9aggw\t34\t17\nmmx10ah956exf9phe4hw9xwkn3a7m3fwxa7pmhr9cyvlq5p84f8yy4fqwkygu8\t34\t17\nmmx1rftw5xyjw5hy7hjnurnhx2z5am5fnqxwtkhzltcu3ujxvs9f6rtqmm0kv9\t34\t17\nmmx1nu2e8qz86kfx5yfnedyrv559d57makxk3jw57lgwsuet0v8dkp3qkmdh9p\t32\t16\nmmx1arv4t6xudjsjpz767dlxhe6n3eyj8r808ehk6gjxftkh8r6zr77sdx5vy4\t32\t16\nmmx1f6khu080cft3c9g5l8qwqh2wlza8473382h4gwursgl0txhdadjqn2kzv7\t32\t16\nmmx1w5vuvkweueqvfl2mtncyexuqchje6nx27552zaz50qt7vwhw5tsqjy2s57\t31\t15.5\nmmx12wfqpxsx0gxlrufeptynuvwt4fn9wqflp356l2sxhveshsrkrqwst4uwh3\t30\t15\nmmx19f4u3dsn5eyrsp24r0vnun6zadmnlsqpldf5cvl9w6dtqdvenvkq4qclt2\t29\t14.5\nmmx1c3jpfa9prd34jup0ny2yjc0n7adcwumfukjt90dfsj2262s3h5ds4fuwdh\t29\t14.5\nmmx1zrhw7537pgw66vt6df5xxxh23f35gt85ml6s6fvc6vr2qshmdeusuufxxp\t26\t13\nmmx1nhs4hestsaxqu42gmrj94lp8klx286q7ymp6dh2cgf6xg6nd6hlse9z9w5\t25\t12.5\nmmx13ech6m45gf3ludnt3e3az7jf68qntxg2htk492zuewh40q3yqwjqv6jsej\t24\t12\nmmx1kx9uarw6ld7w9nmxytejkzs8q6r5376cqmtlxcd78pf889fwfqwqn6pk5f\t22\t11\nmmx1q24h2qhg6ju6cn8r26fh85cv36mmen8ztn2ans7w9aln36p6d5kqegu4na\t22\t11\nmmx1qneuv0d6qzv8zgchxzzcmx2w5k42j4wah6k8psw5fcgw48707drsf6nvxm\t22\t11\nmmx1de0udjakexj8n4548lm5vy8p69geex988ch6gqjpfvmdds5mquss2xt7jy\t21\t10.5\nmmx1d8h78has80qk0hv5zxfkx5jlpj5689zht8xlqq30xjhx3y9ezhtqcpw8zu\t20\t10\nmmx1a2ak375lfskc6xrf6mmmc89eu3s46ywap2j7d4aj5eyeelctqy6ssshgzj\t19\t9.5\nmmx1lpm0wnvfr4l07wgvfhhgzfgy7ur5jf5g3h024gln5ykml60nr8us9wc7tg\t17\t8.5\nmmx1gcrf27d3pmwese0hl4ewnm7xjcwfqm9e789mrax8lyqq86xtz5tqrql96z\t17\t8.5\nmmx1cdahyf0uv3mfk9qfpjk3q8vwrfqap5xgmg9wckkp5rlt3agn5hlqwhh3px\t17\t8.5\nmmx1l74cdd9j6jelh0pw9l96t6vm43zyqp8tdeelcywg09ezac7uwdhsmvnq4y\t16\t8\nmmx1advv0qlzm5l7whwluwdfspmqzwd2k3ra8rgqqvuj0m5hzy5taneqqy7hww\t16\t8\nmmx1xcfx8dstn3hg0wwfdh7lcmnm2gu6x95m849jay7ruzpyw593jpzs800vee\t16\t8\nmmx1l6yphrjzvuc0tefqug5zs9eh3gu4fupq6e8ncgsr6mrek2xvvwvsf72r4d\t15\t7.5\nmmx1wsnset02rd5ksettxhpf2uzw02jszrgtc5960v002c3cwdg254nqekqjen\t14\t7\nmmx1hny6mwxqqlfktwzkwq3u6l0d08gafd5eq6xwsjxnv7sp58zm8h9skzn58w\t14\t7\nmmx12rg768ddyzng9npvlvd6qk4pnu8xy9tjjky6udnvwhv378v0ljcq44me5a\t13\t6.5\nmmx1rd8z3x6ncsk5734u3xjkqskzxq8tlcn00866309kwqc993j4xnyqhs0r3s\t13\t6.5\nmmx19wqxw4stpk67hge9epj0wmgt59r7w5fepxwxegf6tqrj4adk8emsz9zdlq\t13\t6.5\nmmx16vc774xgs3d0ce37fsc6ykjd9elnxxq8gaep2jtcwn6endwck4csz6fz0z\t12\t6\nmmx1kzfexe6m93ggzewpf7xtd6jx9g9n2k3p9n0em8zhug623tx22d2qdzqnq6\t11\t5.5\nmmx1cjqcmqm597re656z5w5jq99f7fvyth7wvhz3v4u9xvyxxyjyv5esl8yqfh\t11\t5.5\nmmx1agcww5z2v6ctey3elyhmc2ehfpde3n9hzcnvh9s3fslrlv004rns02462z\t11\t5.5\nmmx19cxxrr2c4a39pyqda7zqt0dxga6ey7gc67rvlum7ecpzpagtrp2qcakr0j\t11\t5.5\nmmx1pqayqpvzg3txl8q9cl3ul0zrt3v8zdn7u6j9vzw9gn3jlj3cfxrsgskgts\t10\t5\nmmx10pxshsy5ajaf90jqgfz98xms2gfwmr8qh336yg8859khq47rjp0sm99hfn\t10\t5\nmmx1nuvnyj4t3ryqzkw86grzzlx2zzvc9plmy8u8zllvey79q7c5r8qsvz234v\t10\t5\nmmx1hsxpdkzeynjv6dswp89klcu6qc8gn0vghz54gcpa95z0m5m5p6ms64gd99\t10\t5\nmmx1cg9kaawjp23h0kxj2ggx5s90c244wy0lsyxp0ltygwgfkzpjnxsqaevyre\t9\t4.5\nmmx12ajhpfkhaxqzcgh0lm2zt03qm635e0wazc0u2xlhwp4vflneq2mqupf8uz\t9\t4.5\nmmx10k4auqde486w5wyfajnmpl4ds6tv9x7tzdus85wfxk3r496cgawse6vruy\t9\t4.5\nmmx1avctsmwaxyzw23nwat6mmxevcq3f0s3m9j4ll8x8yunszucx9n4srfjh9f\t8\t4\nmmx14p5y3gn5fl8t5jt0twe0l68jwe9n895djrg8lkk55t5rdupggf0s8l0kd9\t8\t4\nmmx1fv4dvhre9mmtldnr2t63qg5hdxa02hzjeh5hu7a3zkmf8a3ql8wqv4txd0\t8\t4\nmmx1argmcrg9rau7m7xy8k4e0s3xw9j95w7upuvpt9hlpz6epj6jhrqqkrytm8\t8\t4\nmmx1j2ej2wxexc247mxf5k90lmjcevp4r5cuuaa3ukl7ywvfq488detsgxj7jl\t7\t3.5\nmmx1ttds5ut3j7xx72wxg8c6226ewqeyrvzydml7duym8esjwxcg3jpse245zn\t7\t3.5\nmmx1pq2x5zfqa45sq6s3zmuuy6pen0t7ezrhmdg5q9q02re4x84rakkqlj5m99\t6\t3\nmmx1np4pfzqpl26td6khzcfdywcsz0tz4xmyua2havtlpp452vc99yyse4wkmj\t6\t3\nmmx1mtug0wju96l4p08r2452lnllej28stdrlpz9p7qc3vlfmj888uvq0zrzhl\t6\t3\nmmx1trjmkvfv40ngnfmvc5uw926gw8fndanpnp7mphq2tgqwt4xdw62qmrvn3a\t6\t3\nmmx12rc5mctewx0qv33kwemry6vvqmxgcnc6rn84ksqef9rj9z0rer7spuw6dw\t6\t3\nmmx1vh4j6v35vxpwt9820f8uk0m3v4u6h78gyc9rr5sqrew29dfvcn6q23qgu9\t6\t3\nmmx1tluhal45404w3qcd59uw08lwf28vq3hhmvvd9andxhjgumajl8rqk3jjd9\t6\t3\nmmx1hmqyn4euv2pjwpp2nf3ayq9ktr77dajwuq967uet2r0xqnhj0saqqexshe\t5\t2.5\nmmx1jz3xqle28yclk7fkk079q990tvya3vqzjrjnrf4phshvt990wt5q30rkay\t5\t2.5\nmmx1epzfr5tjemywh43kr67esqktf43zl5z42ttzmrkgjwyh0608nm5qdxg5js\t5\t2.5\nmmx1tytgkzrx6njx5t6j9gxms2gjv832mzzn2q67kumcft57cyj765csr34n3c\t4\t2\nmmx12wphs5wk5nq55363secf3glve6rzkzmgqfytyq3mgk0lsun99y5s3kk77r\t4\t2\nmmx1xn6ynt5j0dwm7yh29pmjs6dy3gytm5nllsanwtzry86czx2j30kst7a798\t4\t2\nmmx1swf984qntzm6hrtx2695n82fsemv537ekkenwc94se0ahcxzklmsklc42d\t3\t1.5\nmmx1egfrdtt2khy7hv77kczkxmr8xml7zg4hqlc460527ka0am669q8s2asllj\t3\t1.5\nmmx1xc27x4s9qzcsqucjcxqzdqszlp4fjtxpuz56c2770l5yaf5e5jus84sg5f\t3\t1.5\nmmx1vmxgy2uzfh8z0t99p0yqgrea3f97grmh33shc28vtvg2lkzcpygq0ls0np\t2\t1\nmmx12gjuxcdsh7ppxmc0632zwlegm9wldzy9zp4v2skf60c9s705k35qy04laa\t2\t1\nmmx1q9wzqs7kq8tzw2yhnq05ljar5urwratlsr2wvuwfgw40ff3vmcjqhy8rd8\t2\t1\nmmx1ms7f97heq78lkjktgxlhs7pdzes743gafp0huda2usvns9jgv8uqpgg8d3\t2\t1\nmmx18nu9safwcwcfmx9vzaxgx5w8vd8phra0yf2mzjxym9ewh5t5swjquvv970\t2\t1\nmmx19xgatr5wuucmh45623z25w42h49zxyn6gcp94dkyr2zrwrm0xycs74mzx6\t2\t1\nmmx175u4freddynpqmqp4c057dwf9ej62pv0hxh4ew6dwlyf37y5ekvs7djgrs\t2\t1\nmmx19j967tm7fjn73tuwr03w9k6rat4j409295l5j6xrs7w65gl0v49s93mmjs\t2\t1\nmmx1s8vpfq0d6unp2v8f4nzgxkj0zaru70ps6vael7a20w85rwljlemqmjrqlp\t2\t1\nmmx1x23xelewc3rzca0ad25wgczhvx7m9g9529xp98qp8zd5pgs8dr4sld97r3\t2\t1\nmmx14hgwpw5x8zdapw4j35qclc05ajf6xxuqnwxyffszupmtvjl8wtzsp8dgza\t1\t0.5\nmmx12h72n35qjgx2qjps70hqal8zuvw26v46rc3auczg4se68878ek4q8xs9xe\t1\t0.5\nmmx14v3lzf453lx676rj0uhvp7sph98g7hqzkr0f5g42mtkzppzf2dhqw5f8a2\t1\t0.5\nmmx1fxfrkrq80vpzru94heh6vwt52yan8k9znxzvfjtazjk59lpptl3qgnkegx\t1\t0.5\nmmx1d8ltq7247n2yeqlyn8yme9vck3566anrzz666d9hctughxj8j8dswjgjw9\t1\t0.5\nmmx1d9gx5anuvxgg906tzj0rdkhyypjtrfc09ufdc7yykhp9h46mxecs2qe2r2\t1\t0.5\nmmx13ju5ewkc4v2qgg6p5zj3t33p0eczcyfe9eggmv6ksph27px08h7sfsavr5\t1\t0.5\nmmx1akhqtjzm3kkr9wlj8nh9kwuza6r7vm4g2nz3pcggmq9dayz7q92qncwv0a\t1\t0.5\nmmx17jurkuy7tns92g07uf826te4azhu3qnydcs7d7snvez9xy3dh7gqa8h2hy\t1\t0.5\nmmx1ftt6434d6y9ekacacs5hf3cxg7a3s3uqm9vjm5l893fy5epjyxtquz8hka\t1\t0.5\nmmx1jpyqylp9zekjz9xcccz8h6gaw9f796tp9syvm43x03pxa8zf6ses6lslat\t1\t0.5\nmmx1q5dh2ghd660523gstn5vmc2hf4w26azr3s3nedjp2wu3ae2d27hst49hpg\t1\t0.5\nmmx18asaxgn4dcswsefcdwx54kldattux7l0yn96fvmndrpqn6adsluq3ffr8x\t1\t0.5\n\n"
  },
  {
    "path": "docker-entrypoint.sh",
    "content": "#!/bin/bash\n\nif [ \"${MMX_NETWORK_OVERRIDE}\" ]; then\n  echo \"${MMX_NETWORK_OVERRIDE}\" > \"${MMX_HOME}NETWORK\"\nfi\n\nsource ./activate.sh\n\nconfig_path=\"${MMX_HOME}config/local/\"\n\nif [[ \"${MMX_ALLOW_REMOTE}\" == \"true\" ]]; then\n  echo true > \"${config_path}allow_remote\" && echo \"*** Remote Access Enabled ***\"\nelif [[ \"${MMX_ALLOW_REMOTE}\" == \"false\" ]]; then\n  echo false > \"${config_path}allow_remote\" && echo \"*** Remote Access Disabled ***\"\nfi\n\nif [[ \"${MMX_HARVESTER_ENABLED}\" == \"true\" ]]; then\n  echo true > \"${config_path}harvester\" && echo \"*** Harvester Enabled ***\"\nelif [[ \"${MMX_HARVESTER_ENABLED}\" == \"false\" ]]; then\n  echo false > \"${config_path}harvester\" && echo \"*** Harvester Disabled ***\"\nfi\n\nif [[ \"${MMX_FARMER_ENABLED}\" == \"true\" ]]; then\n  echo true > \"${config_path}farmer\" && echo \"*** Farmer Enabled ***\"\nelif [[ \"${MMX_FARMER_ENABLED}\" == \"false\" ]]; then\n  echo false > \"${config_path}farmer\" && echo \"*** Farmer Disabled ***\"\nfi\n\nexec \"$@\"\n"
  },
  {
    "path": "docs/README.md",
    "content": "# Contributing to MMX Documentation\n\nIf you would like to contribute to MMX Documentation, you can do so by following these steps:\n1. Fork the repository\n2. Clone *your fork* repository and cd into it\n3. Create a new branch\n4. Make your changes:\n    - First cd into the `docs` directory\n    - Run `npm install` to install dependencies (requires Node.js/npm)\n    - Run `npm run dev` to start the local server\n    - Make your changes in your favorite code editor\n5. Commit your changes\n6. Push to your fork\n7. Create a pull request\n\n\nClicking the `Edit page` button at the bottom of docs pages will take you to the source file for that page and prompt you to create or add to your fork of mmx-node to submit a pull request. If you want to add a new page, you can do so by creating a new `.md` or `.mdx` file in the appropriate subdirectory for the category desired. View existing files for formatting examples. Creating a new category for the sidebar can be done by creating a new directory in `src/content/docs/` and then adding that directory to the `sidebar` array in `astro.config.mjs`.\n\n\nSee below for the basic structure of the docs, npm commands, and links to the full starlight and astro documentation.\n\n## 🚀 Project Structure\n\nInside of your Astro + Starlight project, you'll see the following folders and files:\n\n```\n.\n├── public/\n├── src/\n│   ├── assets/\n│   ├── content/\n│   │   ├── docs/\n│   └── content.config.ts\n├── astro.config.mjs\n├── package.json\n└── tsconfig.json\n```\n\nStarlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name.\n\nImages can be added to `src/assets/` and embedded in Markdown with a relative link.\n\nStatic assets, like favicons, can be placed in the `public/` directory.\n\n## 🧞 Commands\n\nAll commands are run from the root of the project, from a terminal:\n\n| Command                   | Action                                           |\n| :------------------------ | :----------------------------------------------- |\n| `npm install`             | Installs dependencies                            |\n| `npm run dev`             | Starts local dev server at `localhost:4321`      |\n| `npm run build`           | Build your production site to `./dist/`          |\n| `npm run preview`         | Preview your build locally, before deploying     |\n| `npm run astro ...`       | Run CLI commands like `astro add`, `astro check` |\n| `npm run astro -- --help` | Get help using the Astro CLI                     |\n\n## 👀 Want to learn more?\n\nCheck out [Starlight’s docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat).\n"
  },
  {
    "path": "docs/TODO.txt",
    "content": "- Multisig wallet support\n- GUI settings tabs\n- Swap warning for one-sided pool\n- unsafe_add() / unsafe_sub() / unsafe_mul()\n- WebAPI refactor param iterators (use get_param() + Variant::empty())\n- RPC servers auto-restart with pm2\n- Wallet contacts\n- Log file deletion\n- Show Gold + MMX price in GUI\n- Token icons in GUI\n- Hardware wallet support\n- Web Wallet\n- Market + Swap + TX Explorer balance formatting\n- Remote compute support\n- WAPI wallet/deposit\n- Verify proof first, then VDF, while limiting max VDF verify count\n- Hardfork2 with challenge chain hash infusion + forced infusion at certain length\n- WebAPI to serve WebData from chain\n- Add NonKYC price input\n- Compiler support for break + continue\n"
  },
  {
    "path": "docs/astro.config.mjs",
    "content": "// @ts-check\nimport { defineConfig } from 'astro/config';\nimport starlight from '@astrojs/starlight';\nimport rehypeSlug from 'rehype-slug';\nimport rehypeAutolinkHeadings from 'rehype-autolink-headings';\nimport starlightSidebarTopics from 'starlight-sidebar-topics';\n\n// https://astro.build/config\nexport default defineConfig({\n\tsite: 'https://docs.mmx.network',\n\tintegrations: [\n\t\tstarlight({\n\t\t\ttitle: 'Docs',\n\t\t\tfavicon: '/favicon.ico',\n\t\t\tlogo: {\n\t\t\t\tsrc: './src/assets/logo_text_color_cx256x156_rectangle.png',\n\t\t\t},\n\t\t\tcomponents: {\n\t\t\t\tMarkdownContent: './src/components/MarkdownContent.astro',\n\t\t\t\tSocialIcons: './src/components/SocialIcons.astro',\n\t\t\t},\n\t\t\tsocial: [\n\t\t\t\t{ icon: 'discord', label: 'Discord', href: 'https://discord.gg/BswFhNkMzY' },\n\t\t\t\t{ icon: 'github', label: 'GitHub', href: 'https://github.com/madMAx43v3r/mmx-node' },\n\t\t\t\t{ icon: 'x.com', label: 'X', href: 'https://x.com/MMX_Network_' },\n\t\t\t],\n\t\t\tcustomCss: [\n\t\t\t\t'./src/styles/style.css',\n\t\t\t],\n\t\t\tlastUpdated: true,\n\t\t\teditLink: {\n\t\t\t\tbaseUrl: 'https://github.com/madMAx43v3r/mmx-node/edit/master/docs',\n\t\t\t},\n\t\t\tplugins: [\n\t\t\t\tstarlightSidebarTopics([\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Documentation',\n\t\t\t\t\t\tlink: '/guides/getting-started',\n\t\t\t\t\t\ticon: 'open-book',\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'Guides',\n\t\t\t\t\t\t\t\tautogenerate: { directory: 'guides' },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'Software Reference',\n\t\t\t\t\t\t\t\tautogenerate: { directory: 'software' },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'Technical Reference',\n\t\t\t\t\t\t\t\tautogenerate: { directory: 'reference' },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'FAQ',\n\t\t\t\t\t\t\t\tautogenerate: { directory: 'faq' },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'Tools',\n\t\t\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tlabel: 'Time Calculator',\n\t\t\t\t\t\t\t\t\t\tlink: 'tools/time-calculator/',\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tlabel: 'Articles',\n\t\t\t\t\t\tlink: '/articles/general/mmx-whitepaper',\n\t\t\t\t\t\ticon: 'document',\n\t\t\t\t\t\titems: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'General',\n\t\t\t\t\t\t\t\tautogenerate: { directory: 'articles/general' },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'Plotting',\n\t\t\t\t\t\t\t\tautogenerate: { directory: 'articles/plotting' },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'TimeLord',\n\t\t\t\t\t\t\t\tautogenerate: { directory: 'articles/timelord' },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tlabel: 'Wallets',\n\t\t\t\t\t\t\t\tautogenerate: { directory: 'articles/wallets' },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t\t],\n\t\t}),\n\t],\n\tmarkdown: {\n\t\trehypePlugins: [\n\t\t\trehypeSlug,\n\t\t\t[rehypeAutolinkHeadings, { behavior: 'wrap' }]\n\t\t],\n\t},\n});\n"
  },
  {
    "path": "docs/package.json",
    "content": "{\n  \"name\": \"mmx\",\n  \"type\": \"module\",\n  \"version\": \"0.0.1\",\n  \"scripts\": {\n    \"dev\": \"astro dev\",\n    \"start\": \"astro dev\",\n    \"build\": \"astro build\",\n    \"preview\": \"astro preview\",\n    \"astro\": \"astro\"\n  },\n  \"dependencies\": {\n    \"@astrojs/starlight\": \"^0.34.3\",\n    \"astro\": \"^5.7.13\",\n    \"rehype-autolink-headings\": \"^7.1.0\",\n    \"rehype-slug\": \"^6.0.0\",\n    \"sharp\": \"^0.34.1\",\n    \"starlight-sidebar-topics\": \"^0.6.0\"\n  }\n}\n"
  },
  {
    "path": "docs/public/resources/code/timelord/architecture/Intel_15th-gen_E-core/sha256_ni_rec.cpp",
    "content": "/*\n * sha256_ni_rec.cpp\n *\n *  Created on: Jan 29, 2025\n *      Author: mad, voidxno\n *\n *  NOTE: Non-official architecture edition for Intel 15th-gen E-core (for TimeLord, VDF-verify _2x still identical).\n */\n\n// prerequisite: length is 32 bytes (recursive sha256)\n// prerequisite: length is 64 bytes, 2x 32bytes (_x2)\n// optimization: https://github.com/voidxno/fast-recursive-sha256\n\n#include <sha256_ni.h>\n\n#include <cstring>\n#include <stdexcept>\n\n#if defined(__SHA__) || defined(_WIN32)\n\n#include <immintrin.h>\n\n#ifdef _WIN32\n#include <intrin.h>\n#endif\n\nvoid recursive_sha256_ni(uint8_t* hash, const uint64_t num_iters)\n{\n\tif(num_iters <= 0) {\n\t\treturn;\n\t}\n\n\talignas(64)\n\tstatic const uint32_t K64[64] = {\n\t\t0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,\n\t\t0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n\t\t0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,\n\t\t0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n\t\t0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,\n\t\t0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n\t\t0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,\n\t\t0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n\t\t0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,\n\t\t0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n\t\t0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,\n\t\t0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n\t\t0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,\n\t\t0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n\t\t0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,\n\t\t0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2\n\t};\n\n\t// shuffle mask\n\tconst __m128i SHUF_MASK = _mm_set_epi64x(0x0c0d0e0f08090a0b,0x0405060700010203);\n\n\t// init values\n\tconst __m128i ABEF_INIT = _mm_set_epi64x(0x6a09e667bb67ae85,0x510e527f9b05688c);\n\tconst __m128i CDGH_INIT = _mm_set_epi64x(0x3c6ef372a54ff53a,0x1f83d9ab5be0cd19);\n\n\t// pre-calc/cache padding\n\tconst __m128i HPAD0_CACHE = _mm_set_epi64x(0x0000000000000000,0x0000000080000000);\n\tconst __m128i HPAD1_CACHE = _mm_set_epi64x(0x0000010000000000,0x0000000000000000);\n\n\t//-- pre-calc/static values\n\tconst __m128i MORE0_CACHE = _mm_set_epi64x(0x5807AA985807AA98,0x550C7DC3243185BE);\n\tconst __m128i MORE1_CACHE = _mm_set_epi64x(0x0000000000000000,0x0000000000000000);\n\n\t__m128i STATE0;\n\t__m128i STATE1;\n\t__m128i MSG;\n\t__m128i MSGTMP0;\n\t__m128i MSGTMP1;\n\t__m128i MSGTMP2;\n\t__m128i MSGTMP3;\n\n\t// init/shuffle hash\n\t__m128i HASH0_SAVE = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[0]));\n\t__m128i HASH1_SAVE = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[16]));\n\tHASH0_SAVE = _mm_shuffle_epi8(HASH0_SAVE,SHUF_MASK);\n\tHASH1_SAVE = _mm_shuffle_epi8(HASH1_SAVE,SHUF_MASK);\n\n\tfor(uint64_t i = 0; i < num_iters; ++i) {\n\n\t\t// init state\n\t\tSTATE0 = ABEF_INIT;\n\t\tSTATE1 = CDGH_INIT;\n\n\t\t// rounds 0-3\n\t\tMSG = HASH0_SAVE;\n\t\tMSGTMP0 = MSG;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[0])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\n\t\t// rounds 4-7\n\t\tMSG = HASH1_SAVE;\n\t\tMSGTMP1 = MSG;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[4])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\t\tMSGTMP0 = _mm_sha256msg1_epu32(MSGTMP0,MSGTMP1);\n\n\t\t// rounds 8-11\n\t\tMSG = HPAD0_CACHE;\n\t\tMSGTMP2 = MSG;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[8])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MORE0_CACHE);\n\t\tMSGTMP1 = _mm_sha256msg1_epu32(MSGTMP1,MSGTMP2);\n\n\t\t// rounds 12-15\n\t\tMSG = HPAD1_CACHE;\n\t\tMSGTMP3 = MSG;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[12])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSGTMP0 = _mm_add_epi32(MSGTMP0,MORE1_CACHE);\n\t\tMSGTMP0 = _mm_sha256msg2_epu32(MSGTMP0,MSGTMP3);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\t\tMSGTMP2 = _mm_sha256msg1_epu32(MSGTMP2,MSGTMP3);\n\n#define SHA256ROUND( \\\nmsg, msgtmp0, msgtmp1, msgtmp2, msgtmp3, state0, state1, kvalue) \\\n\tmsg = msgtmp0; \\\n\tmsg = _mm_add_epi32(msg,_mm_load_si128(reinterpret_cast<const __m128i*>(kvalue))); \\\n\tstate1 = _mm_sha256rnds2_epu32(state1,state0,msg); \\\n\tmsgtmp1 = _mm_add_epi32(msgtmp1,_mm_alignr_epi8(msgtmp0,msgtmp3,4)); \\\n\tmsgtmp1 = _mm_sha256msg2_epu32(msgtmp1,msgtmp0); \\\n\tmsg = _mm_shuffle_epi32(msg,0x0E); \\\n\tstate0 = _mm_sha256rnds2_epu32(state0,state1,msg); \\\n\tmsgtmp3 = _mm_sha256msg1_epu32(msgtmp3,msgtmp0);\n\n\t\t//-- rounds 16-19, 20-23, 24-27, 28-31\n\t\tSHA256ROUND(MSG,MSGTMP0,MSGTMP1,MSGTMP2,MSGTMP3,STATE0,STATE1,&K64[16]);\n\t\tSHA256ROUND(MSG,MSGTMP1,MSGTMP2,MSGTMP3,MSGTMP0,STATE0,STATE1,&K64[20]);\n\t\tSHA256ROUND(MSG,MSGTMP2,MSGTMP3,MSGTMP0,MSGTMP1,STATE0,STATE1,&K64[24]);\n\t\tSHA256ROUND(MSG,MSGTMP3,MSGTMP0,MSGTMP1,MSGTMP2,STATE0,STATE1,&K64[28]);\n\n\t\t//-- rounds 32-35, 36-39, 40-43, 44-47\n\t\tSHA256ROUND(MSG,MSGTMP0,MSGTMP1,MSGTMP2,MSGTMP3,STATE0,STATE1,&K64[32]);\n\t\tSHA256ROUND(MSG,MSGTMP1,MSGTMP2,MSGTMP3,MSGTMP0,STATE0,STATE1,&K64[36]);\n\t\tSHA256ROUND(MSG,MSGTMP2,MSGTMP3,MSGTMP0,MSGTMP1,STATE0,STATE1,&K64[40]);\n\t\tSHA256ROUND(MSG,MSGTMP3,MSGTMP0,MSGTMP1,MSGTMP2,STATE0,STATE1,&K64[44]);\n\n\t\t//-- rounds 48-51\n\t\tSHA256ROUND(MSG,MSGTMP0,MSGTMP1,MSGTMP2,MSGTMP3,STATE0,STATE1,&K64[48]);\n\n\t\t// rounds 52-55\n\t\tMSG = MSGTMP1;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[52])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSGTMP2 = _mm_add_epi32(MSGTMP2,_mm_alignr_epi8(MSGTMP1,MSGTMP0,4));\n\t\tMSGTMP2 = _mm_sha256msg2_epu32(MSGTMP2,MSGTMP1);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\n\t\t// rounds 56-59\n\t\tMSG = MSGTMP2;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[56])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSGTMP3 = _mm_add_epi32(MSGTMP3,_mm_alignr_epi8(MSGTMP2,MSGTMP1,4));\n\t\tMSGTMP3 = _mm_sha256msg2_epu32(MSGTMP3,MSGTMP2);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\n\t\t// rounds 60-63\n\t\tMSG = MSGTMP3;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[60])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\n\t\t// add to state\n\t\tSTATE0 = _mm_add_epi32(STATE0,ABEF_INIT);\n\t\tSTATE1 = _mm_add_epi32(STATE1,CDGH_INIT);\n\n\t\t// reorder hash\n\t\tSTATE0 = _mm_shuffle_epi32(STATE0,0x1B); // FEBA\n\t\tSTATE1 = _mm_shuffle_epi32(STATE1,0xB1); // DCHG\n\t\tHASH0_SAVE = _mm_blend_epi16(STATE0,STATE1,0xF0); // DCBA\n\t\tHASH1_SAVE = _mm_alignr_epi8(STATE1,STATE0,8); // HGFE\n\t}\n\n\t// shuffle/return hash\n\tHASH0_SAVE = _mm_shuffle_epi8(HASH0_SAVE,SHUF_MASK);\n\tHASH1_SAVE = _mm_shuffle_epi8(HASH1_SAVE,SHUF_MASK);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[0]),HASH0_SAVE);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[16]),HASH1_SAVE);\n}\n\nvoid recursive_sha256_ni_x2(uint8_t* hash, const uint64_t num_iters)\n{\n\tif(num_iters <= 0) {\n\t\treturn;\n\t}\n\n\talignas(64)\n\tstatic const uint32_t K64[64] = {\n\t\t0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,\n\t\t0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n\t\t0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,\n\t\t0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n\t\t0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,\n\t\t0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n\t\t0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,\n\t\t0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n\t\t0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,\n\t\t0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n\t\t0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,\n\t\t0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n\t\t0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,\n\t\t0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n\t\t0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,\n\t\t0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2\n\t};\n\n\t// shuffle mask\n\tconst __m128i SHUF_MASK = _mm_set_epi64x(0x0c0d0e0f08090a0b,0x0405060700010203);\n\n\t// init values\n\tconst __m128i ABEF_INIT = _mm_set_epi64x(0x6a09e667bb67ae85,0x510e527f9b05688c);\n\tconst __m128i CDGH_INIT = _mm_set_epi64x(0x3c6ef372a54ff53a,0x1f83d9ab5be0cd19);\n\n\t// pre-calc/cache padding\n\tconst __m128i HPAD0_CACHE = _mm_set_epi64x(0x0000000000000000,0x0000000080000000);\n\tconst __m128i HPAD1_CACHE = _mm_set_epi64x(0x0000010000000000,0x0000000000000000);\n\n\t__m128i STATE0_P1;\n\t__m128i STATE1_P1;\n\t__m128i MSG_P1;\n\t__m128i MSGTMP0_P1;\n\t__m128i MSGTMP1_P1;\n\t__m128i MSGTMP2_P1;\n\t__m128i MSGTMP3_P1;\n\t__m128i STATE0_P2;\n\t__m128i STATE1_P2;\n\t__m128i MSG_P2;\n\t__m128i MSGTMP0_P2;\n\t__m128i MSGTMP1_P2;\n\t__m128i MSGTMP2_P2;\n\t__m128i MSGTMP3_P2;\n\n\t// init/shuffle hash\n\t__m128i HASH0_SAVE_P1 = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[0]));\n\t__m128i HASH1_SAVE_P1 = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[16]));\n\t__m128i HASH0_SAVE_P2 = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[32]));\n\t__m128i HASH1_SAVE_P2 = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[48]));\n\tHASH0_SAVE_P1 = _mm_shuffle_epi8(HASH0_SAVE_P1,SHUF_MASK);\n\tHASH1_SAVE_P1 = _mm_shuffle_epi8(HASH1_SAVE_P1,SHUF_MASK);\n\tHASH0_SAVE_P2 = _mm_shuffle_epi8(HASH0_SAVE_P2,SHUF_MASK);\n\tHASH1_SAVE_P2 = _mm_shuffle_epi8(HASH1_SAVE_P2,SHUF_MASK);\n\n\tfor(uint64_t i = 0; i < num_iters; ++i) {\n\n\t\t// init state\n\t\tSTATE0_P1 = ABEF_INIT;\n\t\tSTATE1_P1 = CDGH_INIT;\n\t\tSTATE0_P2 = ABEF_INIT;\n\t\tSTATE1_P2 = CDGH_INIT;\n\n\t\t// rounds 0-3\n\t\tMSG_P1 = HASH0_SAVE_P1;\n\t\tMSG_P2 = HASH0_SAVE_P2;\n\t\tMSGTMP0_P1 = MSG_P1;\n\t\tMSGTMP0_P2 = MSG_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[0])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[0])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\n\t\t// rounds 4-7\n\t\tMSG_P1 = HASH1_SAVE_P1;\n\t\tMSG_P2 = HASH1_SAVE_P2;\n\t\tMSGTMP1_P1 = MSG_P1;\n\t\tMSGTMP1_P2 = MSG_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[4])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[4])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\t\tMSGTMP0_P1 = _mm_sha256msg1_epu32(MSGTMP0_P1,MSGTMP1_P1);\n\t\tMSGTMP0_P2 = _mm_sha256msg1_epu32(MSGTMP0_P2,MSGTMP1_P2);\n\n\t\t// rounds 8-11\n\t\tMSG_P1 = HPAD0_CACHE;\n\t\tMSG_P2 = HPAD0_CACHE;\n\t\tMSGTMP2_P1 = MSG_P1;\n\t\tMSGTMP2_P2 = MSG_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[8])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[8])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\t\tMSGTMP1_P1 = _mm_sha256msg1_epu32(MSGTMP1_P1,MSGTMP2_P1);\n\t\tMSGTMP1_P2 = _mm_sha256msg1_epu32(MSGTMP1_P2,MSGTMP2_P2);\n\n\t\t// rounds 12-15\n\t\tMSG_P1 = HPAD1_CACHE;\n\t\tMSG_P2 = HPAD1_CACHE;\n\t\tMSGTMP3_P1 = MSG_P1;\n\t\tMSGTMP3_P2 = MSG_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[12])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[12])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSGTMP0_P1 = _mm_add_epi32(MSGTMP0_P1,_mm_alignr_epi8(MSGTMP3_P1,MSGTMP2_P1,4));\n\t\tMSGTMP0_P2 = _mm_add_epi32(MSGTMP0_P2,_mm_alignr_epi8(MSGTMP3_P2,MSGTMP2_P2,4));\n\t\tMSGTMP0_P1 = _mm_sha256msg2_epu32(MSGTMP0_P1,MSGTMP3_P1);\n\t\tMSGTMP0_P2 = _mm_sha256msg2_epu32(MSGTMP0_P2,MSGTMP3_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\t\tMSGTMP2_P1 = _mm_sha256msg1_epu32(MSGTMP2_P1,MSGTMP3_P1);\n\t\tMSGTMP2_P2 = _mm_sha256msg1_epu32(MSGTMP2_P2,MSGTMP3_P2);\n\n#define SHA256ROUND_X2( \\\nmsg_p1, msgtmp0_p1, msgtmp1_p1, msgtmp2_p1, msgtmp3_p1, state0_p1, state1_p1, \\\nmsg_p2, msgtmp0_p2, msgtmp1_p2, msgtmp2_p2, msgtmp3_p2, state0_p2, state1_p2, kvalue) \\\n\tmsg_p1 = msgtmp0_p1; \\\n\tmsg_p2 = msgtmp0_p2; \\\n\tmsg_p1 = _mm_add_epi32(msg_p1,_mm_load_si128(reinterpret_cast<const __m128i*>(kvalue))); \\\n\tmsg_p2 = _mm_add_epi32(msg_p2,_mm_load_si128(reinterpret_cast<const __m128i*>(kvalue))); \\\n\tstate1_p1 = _mm_sha256rnds2_epu32(state1_p1,state0_p1,msg_p1); \\\n\tstate1_p2 = _mm_sha256rnds2_epu32(state1_p2,state0_p2,msg_p2); \\\n\tmsgtmp1_p1 = _mm_add_epi32(msgtmp1_p1,_mm_alignr_epi8(msgtmp0_p1,msgtmp3_p1,4)); \\\n\tmsgtmp1_p2 = _mm_add_epi32(msgtmp1_p2,_mm_alignr_epi8(msgtmp0_p2,msgtmp3_p2,4)); \\\n\tmsgtmp1_p1 = _mm_sha256msg2_epu32(msgtmp1_p1,msgtmp0_p1); \\\n\tmsgtmp1_p2 = _mm_sha256msg2_epu32(msgtmp1_p2,msgtmp0_p2); \\\n\tmsg_p1 = _mm_shuffle_epi32(msg_p1,0x0E); \\\n\tmsg_p2 = _mm_shuffle_epi32(msg_p2,0x0E); \\\n\tstate0_p1 = _mm_sha256rnds2_epu32(state0_p1,state1_p1,msg_p1); \\\n\tstate0_p2 = _mm_sha256rnds2_epu32(state0_p2,state1_p2,msg_p2); \\\n\tmsgtmp3_p1 = _mm_sha256msg1_epu32(msgtmp3_p1,msgtmp0_p1); \\\n\tmsgtmp3_p2 = _mm_sha256msg1_epu32(msgtmp3_p2,msgtmp0_p2);\n\n\t\t//-- rounds 16-19, 20-23, 24-27, 28-31\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,STATE0_P2,STATE1_P2,&K64[16]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,STATE0_P2,STATE1_P2,&K64[20]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,STATE0_P2,STATE1_P2,&K64[24]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,STATE0_P2,STATE1_P2,&K64[28]);\n\n\t\t//-- rounds 32-35, 36-39, 40-43, 44-47\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,STATE0_P2,STATE1_P2,&K64[32]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,STATE0_P2,STATE1_P2,&K64[36]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,STATE0_P2,STATE1_P2,&K64[40]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,STATE0_P2,STATE1_P2,&K64[44]);\n\n\t\t//-- rounds 48-51\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,STATE0_P2,STATE1_P2,&K64[48]);\n\n\t\t// rounds 52-55\n\t\tMSG_P1 = MSGTMP1_P1;\n\t\tMSG_P2 = MSGTMP1_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[52])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[52])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSGTMP2_P1 = _mm_add_epi32(MSGTMP2_P1,_mm_alignr_epi8(MSGTMP1_P1,MSGTMP0_P1,4));\n\t\tMSGTMP2_P2 = _mm_add_epi32(MSGTMP2_P2,_mm_alignr_epi8(MSGTMP1_P2,MSGTMP0_P2,4));\n\t\tMSGTMP2_P1 = _mm_sha256msg2_epu32(MSGTMP2_P1,MSGTMP1_P1);\n\t\tMSGTMP2_P2 = _mm_sha256msg2_epu32(MSGTMP2_P2,MSGTMP1_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\n\t\t// rounds 56-59\n\t\tMSG_P1 = MSGTMP2_P1;\n\t\tMSG_P2 = MSGTMP2_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[56])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[56])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSGTMP3_P1 = _mm_add_epi32(MSGTMP3_P1,_mm_alignr_epi8(MSGTMP2_P1,MSGTMP1_P1,4));\n\t\tMSGTMP3_P2 = _mm_add_epi32(MSGTMP3_P2,_mm_alignr_epi8(MSGTMP2_P2,MSGTMP1_P2,4));\n\t\tMSGTMP3_P1 = _mm_sha256msg2_epu32(MSGTMP3_P1,MSGTMP2_P1);\n\t\tMSGTMP3_P2 = _mm_sha256msg2_epu32(MSGTMP3_P2,MSGTMP2_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\n\t\t// rounds 60-63\n\t\tMSG_P1 = MSGTMP3_P1;\n\t\tMSG_P2 = MSGTMP3_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[60])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[60])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\n\t\t// add to state\n\t\tSTATE0_P1 = _mm_add_epi32(STATE0_P1,ABEF_INIT);\n\t\tSTATE0_P2 = _mm_add_epi32(STATE0_P2,ABEF_INIT);\n\t\tSTATE1_P1 = _mm_add_epi32(STATE1_P1,CDGH_INIT);\n\t\tSTATE1_P2 = _mm_add_epi32(STATE1_P2,CDGH_INIT);\n\n\t\t// reorder hash\n\t\tSTATE0_P1 = _mm_shuffle_epi32(STATE0_P1,0x1B); // FEBA\n\t\tSTATE1_P1 = _mm_shuffle_epi32(STATE1_P1,0xB1); // DCHG\n\t\tSTATE0_P2 = _mm_shuffle_epi32(STATE0_P2,0x1B); // FEBA\n\t\tSTATE1_P2 = _mm_shuffle_epi32(STATE1_P2,0xB1); // DCHG\n\t\tHASH0_SAVE_P1 = _mm_blend_epi16(STATE0_P1,STATE1_P1,0xF0); // DCBA\n\t\tHASH1_SAVE_P1 = _mm_alignr_epi8(STATE1_P1,STATE0_P1,8); // HGFE\n\t\tHASH0_SAVE_P2 = _mm_blend_epi16(STATE0_P2,STATE1_P2,0xF0); // DCBA\n\t\tHASH1_SAVE_P2 = _mm_alignr_epi8(STATE1_P2,STATE0_P2,8); // HGFE\n\t}\n\n\t// shuffle/return hash\n\tHASH0_SAVE_P1 = _mm_shuffle_epi8(HASH0_SAVE_P1,SHUF_MASK);\n\tHASH1_SAVE_P1 = _mm_shuffle_epi8(HASH1_SAVE_P1,SHUF_MASK);\n\tHASH0_SAVE_P2 = _mm_shuffle_epi8(HASH0_SAVE_P2,SHUF_MASK);\n\tHASH1_SAVE_P2 = _mm_shuffle_epi8(HASH1_SAVE_P2,SHUF_MASK);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[0]),HASH0_SAVE_P1);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[16]),HASH1_SAVE_P1);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[32]),HASH0_SAVE_P2);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[48]),HASH1_SAVE_P2);\n}\n\n#else // __SHA__\n\nvoid recursive_sha256_ni(uint8_t* hash, const uint64_t num_iters) {\n\tthrow std::logic_error(\"recursive_sha256_ni() not available\");\n}\n\nvoid recursive_sha256_ni_x2(uint8_t* hash, const uint64_t num_iters) {\n\tthrow std::logic_error(\"recursive_sha256_ni_x2() not available\");\n}\n\n#endif // __SHA__\n\n"
  },
  {
    "path": "docs/public/resources/code/timelord/optimize/sample/sha256_ni_rec_sample.cpp",
    "content": "/*\n * sha256_ni_rec_sample.cpp\n *\n *  Created on: Feb 17, 2025\n *      Author: mad, voidxno\n *\n *  NOTE: Educational sample elements of static nature that can be done. Not whole file.\n */\n\n// <cut-start>\n\n //...\n\n\talignas(64)\n\tstatic const uint32_t K64[64] = {\n\t\t0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,\n\t\t0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n\t\t0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,\n\t\t0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n\t\t0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,\n\t\t0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n\t\t0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,\n\t\t0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n\t\t0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,\n\t\t0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n\t\t0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,\n\t\t0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n\t\t0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,\n\t\t0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n\t\t0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,\n\t\t0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2\n\t};\n\n\t// shuffle mask\n\tconst __m128i SHUF_MASK = _mm_set_epi64x(0x0c0d0e0f08090a0b,0x0405060700010203);\n\n\t// init values\n\tconst __m128i ABEF_INIT = _mm_set_epi64x(0x6a09e667bb67ae85,0x510e527f9b05688c);\n\tconst __m128i CDGH_INIT = _mm_set_epi64x(0x3c6ef372a54ff53a,0x1f83d9ab5be0cd19);\n\n\t// pre-calc/cache padding\n\tconst __m128i HPAD0_CACHE = _mm_set_epi64x(0x0000000000000000,0x0000000080000000);\n\tconst __m128i HPAD1_CACHE = _mm_set_epi64x(0x0000010000000000,0x0000000000000000);\n\n\t//-- pre-calc/static values\n\tconst __m128i MORE0_CACHE = _mm_set_epi64x(0x5807AA985807AA98,0x550C7DC3243185BE);\n\tconst __m128i MORE1_CACHE = _mm_set_epi64x(0x0000000000000000,0x0000000000000000);\n\tconst __m128i MORE2_CACHE = _mm_set_epi64x(0x550C7DC3243185BE,0x12835B015807AA98);\n\tconst __m128i MORE3_CACHE = _mm_set_epi64x(0xC19BF2749BDC06A7,0x80DEB1FE72BE5D74);\n\n\t__m128i STATE0;\n\t__m128i STATE1;\n\t__m128i MSG;\n\t__m128i MSGTMP0;\n\t__m128i MSGTMP1;\n\t__m128i MSGTMP2;\n\t__m128i MSGTMP3;\n\n\t// init/shuffle hash\n\t__m128i HASH0_SAVE = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[0]));\n\t__m128i HASH1_SAVE = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[16]));\n\tHASH0_SAVE = _mm_shuffle_epi8(HASH0_SAVE,SHUF_MASK);\n\tHASH1_SAVE = _mm_shuffle_epi8(HASH1_SAVE,SHUF_MASK);\n\n\tfor(uint64_t i = 0; i < num_iters; ++i) {\n\n\t\t// init state\n\t\tSTATE0 = ABEF_INIT;\n\t\tSTATE1 = CDGH_INIT;\n\n\t\t// rounds 0-3\n\t\tMSG = HASH0_SAVE;\n\t\tMSGTMP0 = MSG;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[0])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\n\t\t// rounds 4-7\n\t\tMSG = HASH1_SAVE;\n\t\tMSGTMP1 = MSG;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[4])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\t\tMSGTMP0 = _mm_sha256msg1_epu32(MSGTMP0,MSGTMP1);\n\n\t\t// rounds 8-11\n\t\tMSG = HPAD0_CACHE;\n\t\tMSGTMP2 = MSG;\n\t\t/* (SAMPLE01) */ // MSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[8])));\n\t\t/* (SAMPLE01) */ // MSG = _mm_add_epi32(HPAD0_CACHE,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[8])));\n\t\t/* (SAMPLE01) */ MSG = MORE2_CACHE;\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\t/* (SAMPLE02) */ // MSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\t/* (SAMPLE02) */ // MSG = _mm_shuffle_epi32(MORE2_CACHE,0x0E);\n\t\t/* (SAMPLE02) */ MSG = MORE0_CACHE;\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\t\tMSGTMP1 = _mm_sha256msg1_epu32(MSGTMP1,MSGTMP2);\n\n\t\t// rounds 12-15\n\t\tMSG = HPAD1_CACHE;\n\t\tMSGTMP3 = MSG;\n\t\t/* (SAMPLE03) */ // MSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[12])));\n\t\t/* (SAMPLE03) */ // MSG = _mm_add_epi32(HPAD1_CACHE,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[12])));\n\t\t/* (SAMPLE03) */ MSG = MORE3_CACHE;\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\t/* (SAMPLE04) */ // MSGTMP0 = _mm_add_epi32(MSGTMP0,_mm_alignr_epi8(MSGTMP3,MSGTMP2,4));\n\t\t/* (SAMPLE04) */ // MSGTMP0 = _mm_add_epi32(MSGTMP0,_mm_alignr_epi8(HPAD1_CACHE,HPAD0_CACHE,4));\n\t\t/* (SAMPLE04) */ MSGTMP0 = _mm_add_epi32(MSGTMP0,MORE1_CACHE);\n\t\tMSGTMP0 = _mm_sha256msg2_epu32(MSGTMP0,MSGTMP3);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\t\t/* (SAMPLE05) */ // MSGTMP2 = _mm_sha256msg1_epu32(MSGTMP2,MSGTMP3);\n\t\t/* (SAMPLE05) */ // MSGTMP2 = _mm_sha256msg1_epu32(HPAD0_CACHE,HPAD1_CACHE);\n\t\t/* (SAMPLE05) */ MSGTMP2 = HPAD0_CACHE;\n\n //...\n\n// <cut-end>\n"
  },
  {
    "path": "docs/public/robots.txt",
    "content": "# Allow crawling of all content\nUser-agent: *\nDisallow: \nSitemap: https://docs.mmx.network/sitemap-index.xml\n"
  },
  {
    "path": "docs/security/checklist.txt",
    "content": "\nall fields are hashed, except signatures\nnull pointers are handled everywhere\nfile permissions on sensitive files are owner access only\nmaximum size of all data structures is limited\ncross origin requests\ninteger overflows on addition (amount, fee, tx cost, etc)\nnot hashing solutions for message relay / map storage\nallocating too much memory during deserialize\nrecursion limit for deserialize\n"
  },
  {
    "path": "docs/src/components/MMXCardGrid.astro",
    "content": "---\ninterface Props {\n\tstagger?: boolean;\n}\n\nconst { stagger = false } = Astro.props;\n---\n\n<div class:list={['mmx-card-grid', { stagger }]}><slot /></div>\n<style>\n\t.mmx-card-grid {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 100%;\n\t\tgap: 1rem;\n\t\tpadding: 0% 10%;\n\t}\n\t.mmx-card-grid > :global(*) {\n\t\tmargin-top: 0 !important;\n\t}\n\t@media (min-width: 50rem) {\n\t\t.mmx-card-grid {\n\t\t\tgrid-template-columns: 1fr 1fr;\n\t\t\tgap: 1.5rem;\n\t\t}\n\t\t.stagger {\n\t\t\t--stagger-height: 5rem;\n\t\t\tpadding-bottom: var(--stagger-height);\n\t\t}\n\t\t.stagger > :global(*):nth-child(2n) {\n\t\t\ttransform: translateY(var(--stagger-height));\n\t\t}\n\t}\n</style>\n"
  },
  {
    "path": "docs/src/components/MMXLEDBars.astro",
    "content": "<div>\n  <div class=\"mmxledbars-bg\">\n    <div class=\"mmxledbars\" id=\"mmxledbars\"></div>\n  </div>\n</div>\n\n<style>\n:root {\n  --mmx-color-ledbars-0: hsl(267, 60%, 30%);\n  --mmx-color-ledbars-1: hsl(267, 60%, 23%);\n  --mmx-color-ledbars-2: hsl(267, 60%, 19%);\n  --mmx-color-ledbars-3: hsl(267, 60%, 15%);\n}\n:root[data-theme='light'] {\n  --mmx-color-ledbars-0: hsl(267, 60%, 75%);\n  --mmx-color-ledbars-1: hsl(267, 60%, 82%);\n  --mmx-color-ledbars-2: hsl(267, 60%, 86%);\n  --mmx-color-ledbars-3: hsl(267, 60%, 90%);\n}\n.mmxledbars-bg {\n  position: fixed;\n  display: flex;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 400px;\n  justify-content: center;\n  overflow: hidden;\n}\n.mmxledbars {\n  width: var(--sl-content-width);\n  min-width: var(--sl-content-width);\n}\n</style>\n\n<script>\n\nconst minledcols = 40;\nconst minledrows = 15;\n\nwindow.addEventListener(\"load\", function (){ initledbars(); } );\n\nfunction initledbars()\n{\n const container = document.getElementById(\"mmxledbars\");\n const cwidth = container.offsetWidth;\n const cheight = container.offsetHeight;\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"width\", cwidth + \"px\");\n svg.setAttribute(\"height\", cheight + \"px\");\n\n const ledsize = 12;\n const ledgap = 8;\n const ledcols = Math.floor(cwidth / (ledsize + ledgap));\n const ledrows = Math.floor(cheight / (ledsize + ledgap));\n const ledstartx = ledsize / 2 + (cwidth - ledcols * (ledsize + ledgap) + ledgap) / 2;\n const ledstarty = cheight - 1;\n const ledpalc = 4;\n const ledpalvar = \"--mmx-color-ledbars-\";\n\n if(ledcols < minledcols || ledrows < minledrows) return;\n\n const ledcolscy = generateledpoints(ledcols, ledrows);\n\n for(let col = 0; col < ledcols; ++col){\n   let nextp = Math.floor(Math.random() * ledpalc);\n   let zerop = nextp;\n\n   for(let row = 0; row < ledcolscy[col]; ++row){\n     if(row === ledcolscy[col] - 1 && zerop === 0 && nextp === 0)\n       nextp = Math.floor(Math.random() * (ledpalc - 1)) + 1;\n\n     const circle = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n     circle.setAttribute(\"cx\", ledstartx + col * (ledsize + ledgap));\n     circle.setAttribute(\"cy\", ledstarty - row * (ledsize + ledgap));\n     circle.setAttribute(\"r\", ledsize / 2);\n     circle.setAttribute(\"fill\", \"var(\" + ledpalvar + \"\" + nextp + \")\");\n     svg.appendChild(circle);\n\n     if(nextp === 0)\n       ++nextp;\n     else{\n       nextp += Math.floor(Math.random() * 3) - 1;\n       if(nextp < 0 || nextp >= ledpalc) nextp = (nextp < 0) ? 0 : ledpalc - 1;\n       }\n     }\n   }\n\n container.appendChild(svg);\n}\n\nfunction generateledpoints(numcols = minledcols, numrows = minledrows)\n{\n if(numcols < minledcols) numcols = minledcols;\n if(numrows < minledrows) numrows = minledrows;\n\n const maxempty = Math.floor((numrows - 1) / 2);\n const inoutc = Math.floor(numcols / 10);\n const points = [];\n\n for(let x = 0, lastval = -1; x < numcols; ++x){\n   let ledfloor = numrows - maxempty;\n   if(x < inoutc || x >= (numcols - inoutc)){\n     ledfloor = (Math.floor(ledfloor / inoutc) <= 0) ? 1 : Math.floor(ledfloor / inoutc);\n     ledfloor = ledfloor * ((x < inoutc) ? (x + 1) : (numcols - x));\n     }\n\n   let nextval = ledfloor + Math.floor(Math.random() * (maxempty + 1));\n   if(nextval === lastval) nextval += (nextval === ledfloor) ? 1 : -1;\n\n   points.push(nextval);\n   lastval = nextval;\n   }\n\n return points;\n}\n\n</script>\n"
  },
  {
    "path": "docs/src/components/MMXLinkCard.astro",
    "content": "---\r\nimport { Icon } from '@astrojs/starlight/components';\r\nimport { type StarlightIcon } from '@astrojs/starlight/types';\r\n\r\ninterface Props {\r\n\ticon: StarlightIcon;\r\n\ttitle: string;\r\n\turl: string;\r\n}\r\n\r\nconst { icon, title, url } = Astro.props;\r\nconst isHomeIcon = icon.localeCompare(\"home\") ? false : true;\r\n---\r\n\r\n<a href={url} class=\"mmx-link-card\">\r\n\t<span class=\"mmx-card sl-flex\">\r\n\t\t<p class=\"mmx-title sl-flex\">\r\n\t\t\t{ isHomeIcon ? (\r\n\t\t\t\t<svg aria-hidden=\"true\" class=\"mainicon\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"font-size: 1.333em; width: 1em; height: 1em;\">\r\n\t\t\t\t\t<path d=\"M8.5 14a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v5.5H19V9.621L12 4.38 5 9.623V19.5h3.5zM12 2.43c.496 0 .962.172 1.368.474l6.512 4.879C20.586 8.305 21 8.939 21 9.62V19.5a2 2 0 0 1-2 2h-4.5a1 1 0 0 1-1-1V15h-3v5.5a1 1 0 0 1-1 1H5a2 2 0 0 1-2-2V9.621c0-.682.414-1.316 1.12-1.838l6.512-4.879A2.28 2.28 0 0 1 12 2.43\"></path>\r\n\t\t\t\t</svg>\r\n\t\t\t) : (\r\n\t\t\t\t<Icon name={icon} class=\"mainicon\" size=\"1.333em\" />\r\n\t\t\t) }\r\n\t\t\t<span set:html={title} />\r\n\t\t</p>\r\n\t\t<div class=\"body desc\"><slot /></div>\r\n\t</span>\r\n\t<Icon name=\"right-arrow\" size=\"1.333em\" class=\"arrowicon rtl:flip\" />\r\n</a>\r\n<style>\r\n\t.mmx-link-card {\r\n\t\t--mmx-card-border: var(--sl-color-purple);\r\n\t\t--mmx-card-bg: var(--sl-color-purple-low);\r\n\t\tborder: 2px solid var(--sl-color-gray-5);\r\n\t\tborder-radius: 0.5rem;\r\n\t\tbackground-color: var(--sl-color-black);\r\n\t\tpadding: clamp(1rem, calc(0.125rem + 3vw), 2rem);\r\n\t\tposition: relative;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row;\r\n\t\talign-items: center;\r\n\t}\r\n\t.mmx-link-card .arrowicon {\r\n\t\tfont-size: 1.5rem;\r\n\t\tmargin-left: auto;\r\n\t\tcolor: var(--sl-color-gray-2);\r\n\t\tflex: 0 0 1em;\r\n\t}\r\n\t.mmx-link-card:hover {\r\n\t\tbackground: var(--sl-color-gray-7, var(--sl-color-gray-6));\r\n\t\tborder-color: var(--sl-color-gray-2);\r\n\t}\r\n\t.mmx-link-card:hover .mainicon {\r\n\t\tcolor: var(--sl-color-white);\r\n\t}\r\n\t.mmx-link-card:nth-child(6n + 1) {\r\n\t\t--mmx-card-border: var(--sl-color-blue);\r\n\t\t--mmx-card-bg: var(--sl-color-blue-low);\r\n\t}\r\n\t.mmx-link-card:nth-child(6n + 2) {\r\n\t\t--mmx-card-border: var(--sl-color-purple);\r\n\t\t--mmx-card-bg: var(--sl-color-purple-low);\r\n\t}\r\n\t.mmx-link-card:nth-child(6n + 3) {\r\n\t\t--mmx-card-border: var(--sl-color-orange);\r\n\t\t--mmx-card-bg: var(--sl-color-orange-low);\r\n\t}\r\n\t.mmx-link-card:nth-child(6n + 4) {\r\n\t\t--mmx-card-border: var(--sl-color-purple);\r\n\t\t--mmx-card-bg: var(--sl-color-purple-low);\r\n\t}\r\n\t.mmx-link-card:nth-child(6n + 5) {\r\n\t\t--mmx-card-border: var(--sl-color-green);\r\n\t\t--mmx-card-bg: var(--sl-color-green-low);\r\n\t}\r\n\t.mmx-link-card:nth-child(6n + 6) {\r\n\t\t--mmx-card-border: var(--sl-color-red);\r\n\t\t--mmx-card-bg: var(--sl-color-red-low);\r\n\t}\r\n\t.mmx-card {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t}\r\n\t.mmx-card .mainicon {\r\n\t\tborder: 2px solid var(--mmx-card-border);\r\n\t\tbackground-color: var(--mmx-card-bg);\r\n\t\tpadding: 0.2em;\r\n\t\tborder-radius: 0.25rem;\r\n\t\tbox-sizing: content-box;\r\n\t\tflex: 0 0 1em;\r\n\t}\r\n\t.mmx-card .body {\r\n\t\tmargin: 0;\r\n\t\tfont-size: clamp(0.875rem, calc(0.5rem + 1vw), 1rem);\r\n\t}\r\n\t.mmx-title {\r\n\t\tdisplay: flex;\r\n\t\tfont-weight: 600;\r\n\t\tfont-size: 1.25rem;\r\n\t\tcolor: var(--sl-color-white);\r\n\t\tline-height: 1.2;\r\n\t\tgap: 1rem;\r\n\t\talign-items: center;\r\n\t\tmargin-top: 0;\r\n\t\tmargin-block-end: 1em;\r\n\t}\r\n\ta.mmx-link-card {\r\n\t\ttext-decoration: none;\r\n\t\tline-height: 1.2;\r\n\t}\r\n\ta.mmx-link-card::before {\r\n\t\tcontent: '';\r\n\t\tposition: relative;\r\n\t\tinset: 0;\r\n\t}\r\n\t@media (max-height: 720px) {\r\n\t\t.mmx-card .desc { display: none; }\r\n\t\t.mmx-title { margin-bottom: 0; }\r\n\t\t.mmx-title { margin-block-end: 0em; }\r\n\t}\r\n\t@media (max-width: 800px) and (max-height: 1072px) {\r\n\t\t.mmx-card .desc { display: none; }\r\n\t\t.mmx-title { margin-bottom: 0; }\r\n\t\t.mmx-title { margin-block-end: 0em; }\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "docs/src/components/MMXLinkCardT.astro",
    "content": "---\r\nimport { Icon } from '@astrojs/starlight/components';\r\nimport { type StarlightIcon } from '@astrojs/starlight/types';\r\n\r\ninterface Props {\r\n\ticon: StarlightIcon;\r\n\ttitle: string;\r\n\turl: string;\r\n}\r\n\r\nconst { icon, title, url } = Astro.props;\r\n---\r\n\r\n<a href={url} class=\"mmx-link-card-t\">\r\n\t<span class=\"mmx-card-t sl-flex\">\r\n\t\t<p class=\"mmx-title-t sl-flex\">\r\n\t\t\t<Icon name={icon} class=\"mainicon\" size=\"1.333em\" />\r\n\t\t\t<span set:html={title} />\r\n\t\t</p>\r\n\t</span>\r\n\t<Icon name=\"right-arrow\" size=\"1.333em\" class=\"arrowicon rtl:flip\" />\r\n</a>\r\n<style>\r\n\t.mmx-link-card-t {\r\n\t\tborder: 2px solid var(--sl-color-gray-5);\r\n\t\tborder-radius: 0.5rem;\r\n\t\tbackground-color: var(--sl-color-black);\r\n\t\tpadding: 1rem clamp(1rem, calc(0.125rem + 3vw), 2rem);\r\n\t\tposition: relative;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: row;\r\n\t\talign-items: center;\r\n\t}\r\n\t.mmx-link-card-t .arrowicon {\r\n\t\tfont-size: 1.5rem;\r\n\t\tmargin-left: auto;\r\n\t\tcolor: var(--sl-color-gray-2);\r\n\t\tflex: 0 0 1em;\r\n\t}\r\n\t.mmx-link-card-t:hover {\r\n\t\tbackground: var(--sl-color-gray-7, var(--sl-color-gray-6));\r\n\t\tborder-color: var(--sl-color-gray-2);\r\n\t}\r\n\t.mmx-link-card-t:hover .mainicon {\r\n\t\tcolor: var(--sl-color-white);\r\n\t}\r\n\t.mmx-card-t {\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t}\r\n\t.mmx-card-t .mainicon {\r\n\t\tborder: 2px solid transparent;\r\n\t\tpadding: 0.2em;\r\n\t\tborder-radius: 0.25rem;\r\n\t\tbox-sizing: content-box;\r\n\t\tflex: 0 0 1em;\r\n\t}\r\n\t.mmx-title-t {\r\n\t\tdisplay: flex;\r\n\t\tfont-weight: 600;\r\n\t\tfont-size: 1.25rem;\r\n\t\tcolor: var(--sl-color-white);\r\n\t\tline-height: 1.2;\r\n\t\tgap: 1rem;\r\n\t\talign-items: center;\r\n\t\tmargin-top: 0;\r\n\t\tmargin-bottom: 0;\r\n\t\tmargin-block-end: 0em;\r\n\t}\r\n\ta.mmx-link-card-t {\r\n\t\ttext-decoration: none;\r\n\t\tline-height: 1.2;\r\n\t}\r\n\ta.mmx-link-card-t::before {\r\n\t\tcontent: '';\r\n\t\tposition: relative;\r\n\t\tinset: 0;\r\n\t}\r\n</style>\r\n"
  },
  {
    "path": "docs/src/components/MarkdownContent.astro",
    "content": "---\nimport Default from '@astrojs/starlight/components/MarkdownContent.astro';\nimport { Image } from 'astro:assets';\n\nconst { id, lang, entry } = Astro.locals.starlightRoute;\n\nconst isArticlePage = id.startsWith(\"articles/\");\n\nconst isPublishDate = entry.data.articlePublished !== undefined;\nconst isUpdateDate = entry.data.articleUpdated !== undefined;\nconst isAuthorName = entry.data.authorName !== undefined;\nconst isAuthorPicture = entry.data.authorPicture !== undefined;\nconst isAuthorURL = entry.data.authorURL !== undefined;\nconst ElementAuthorURL = isAuthorURL ? 'a' : 'div';\n\nvar checkEnoughDate = false;\nif(isPublishDate) checkEnoughDate = true;\nif(isUpdateDate) checkEnoughDate = true;\nconst isEnoughDate = checkEnoughDate;\n\nvar checkEnoughAuthor = false;\nif(isPublishDate) checkEnoughAuthor = true;\nif(isAuthorName) checkEnoughAuthor = true;\nconst isEnoughAuthor = checkEnoughAuthor;\n\nvar checkEnoughData = false;\nif(isEnoughDate) checkEnoughData = true;\nif(isEnoughAuthor) checkEnoughData = true;\nconst isEnoughData = checkEnoughData;\n---\n\n{ isArticlePage ? (\n\t<Default>\n\t\t{ isEnoughData ? (\n\t\t\t<div class=\"articlemeta not-content\">\n\t\t\t\t{ isEnoughDate ? (\n\t\t\t\t\t<div class=\"datewrap sl-flex\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{ isPublishDate ? (\n\t\t\t\t\t\t\t\t<time datetime={ entry.data.articlePublished.toISOString() }>\n\t\t\t\t\t\t\t\t\t{ entry.data.articlePublished.toLocaleDateString(lang, { dateStyle: 'medium', timeZone: 'UTC' }) }\n\t\t\t\t\t\t\t\t</time>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{ isUpdateDate ? (\n\t\t\t\t\t\t\t\t<span>Updated:</span>\n\t\t\t\t\t\t\t\t<time datetime={ entry.data.articleUpdated.toISOString() }>\n\t\t\t\t\t\t\t\t\t{ entry.data.articleUpdated.toLocaleDateString(lang, { dateStyle: 'medium', timeZone: 'UTC' }) }\n\t\t\t\t\t\t\t\t</time>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t) : null }\n\t\t\t\t{ isAuthorName ? (\n\t\t\t\t\t<div class=\"authorwrap\">\n\t\t\t\t\t\t<ElementAuthorURL href={ isAuthorURL ? entry.data.authorURL : undefined } class=\"author\">\n\t\t\t\t\t\t\t{ isAuthorPicture && <Image alt={ entry.data.authorName } loading=\"eager\" src={ entry.data.authorPicture } height={40} width={40} /> }\n\t\t\t\t\t\t\t<div class=\"textwrap\">\n\t\t\t\t\t\t\t\t<div class=\"authorname\">{ entry.data.authorName }</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</ElementAuthorURL>\n\t\t\t\t\t</div>\n\t\t\t\t) : null }\n\t\t\t</div>\n\t\t\t<style>\n\t\t\t\t.articlemeta {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex-direction: column;\n\t\t\t\t\tgap: 0.75rem;\n\t\t\t\t}\n\t\t\t\t.datewrap {\n\t\t\t\t\tgap: 0.75rem 3rem;\n\t\t\t\t\tjustify-content: space-between;\n\t\t\t\t\tflex-wrap: wrap;\n\t\t\t\t\tfont-size: var(--sl-text-sm);\n\t\t\t\t\tcolor: var(--sl-color-gray-3);\n\t\t\t\t}\n\t\t\t\t.authorwrap {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex-wrap: wrap;\n\t\t\t\t\tgap: 0.75rem 1rem;\n\t\t\t\t}\n\t\t\t\t.author {\n\t\t\t\t\talign-items: center;\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tgap: 0.5rem;\n\t\t\t\t\tline-height: var(--sl-line-height-headings);\n\t\t\t\t\ttext-decoration: none;\n\t\t\t\t\tcolor: var(--sl-color-text-accent);\n\t\t\t\t}\n\t\t\t\t.author img  {\n\t\t\t\t\tborder: 1px solid var(--sl-color-gray-2);\n\t\t\t\t\tborder-radius: 9999px;\n\t\t\t\t\theight: 2.5rem;\n\t\t\t\t\twidth: 2.5rem;\n\t\t\t\t}\n\t\t\t\t.author[href]:hover {\n\t\t\t\t\tcolor: var(--sl-color-text);\n\t\t\t\t}\n\t\t\t\t.textwrap {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\tflex-direction: column;\n\t\t\t\t}\n\t\t\t\t.authorname {\n\t\t\t\t\tfont-size: var(--sl-text-base);\n\t\t\t\t\tfont-weight: 600;\n\t\t\t\t}\n\t\t\t</style>\n\t\t) : null }\n\t\t<slot />\n\t</Default>\n) : (\n\t<Default>\n\t\t<slot />\n\t</Default>\n) }\n"
  },
  {
    "path": "docs/src/components/SocialIcons.astro",
    "content": "---\nimport Default from '@astrojs/starlight/components/SocialIcons.astro';\n---\n\n<a href=\"https://mmx.network/\" rel=\"me\" class=\"sl-flex\">\n\t<span class=\"sr-only\">Homepage</span>\n\t<svg aria-hidden=\"true\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\" style=\"--sl-icon-size: 1em;\">\n\t\t<path d=\"M8.5 14a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v5.5H19V9.621L12 4.38 5 9.623V19.5h3.5zM12 2.43c.496 0 .962.172 1.368.474l6.512 4.879C20.586 8.305 21 8.939 21 9.62V19.5a2 2 0 0 1-2 2h-4.5a1 1 0 0 1-1-1V15h-3v5.5a1 1 0 0 1-1 1H5a2 2 0 0 1-2-2V9.621c0-.682.414-1.316 1.12-1.838l6.512-4.879A2.28 2.28 0 0 1 12 2.43\"></path>\n\t</svg>\n</a>\n\n<Default>\n\t<slot />\n</Default>\n"
  },
  {
    "path": "docs/src/content/docs/articles/general/mmx-tldr.md",
    "content": "---\ntitle: MMX TLDR;\ndescription: What is the MMX blockchain ?\nprev: false\nnext: false\n\narticlePublished: 2025-03-14\narticleUpdated: 2025-04-19\n\nauthorName: voidxno\nauthorPicture: https://avatars.githubusercontent.com/u/53347890?s=200\nauthorURL: https://github.com/voidxno\n---\n\nWhat is the [MMX blockchain](https://mmx.network/) ?\n\n_&#8220;&nbsp;MMX &ndash; fast, low cost, feature rich, decentralized &ndash; with tokenomics of an actual currency&nbsp;&#8221;_\n\n:::note[Note]\nIn-depth technical, read [whitepaper](../../../articles/general/mmx-whitepaper/). Technical breakdown, read [reference](../../../reference/blockchain/).\n:::\n\n## TLDR;\n\n- A **native L1 blockchain**, truly independent and decentralized\n  - Mainnet **launched** 17jan2025\n  - Designed as a real stable currency, cryptos original goal\n- **500 TPS**, 10 sec block time, consistent\n  - **Written from scratch** by [Max](https://github.com/madMAx43v3r), in high performance C++ code\n  - Easily handle 1000 TPS in future\n  - Nodes on regular home hardware and internet connections\n- Security by **Proof of Space and Time** (**PoST**)\n  - **More energy efficient** than Proof of Work (PoW)\n  - **More decentralized** than Proof of Stake (PoS)\n  - High-power once, low-power decentralized thereafter\n- **Feature rich** compatible **L1 on-chain logic**\n  - Enhancing proven logic, and creating new\n  - High-level VM for Smart Contracts\n  - Smart Contract offer trading, fixed price, OTC\n  - Liquidity pool swap trading, AMM, multi-fee tiers\n  - Native token support, MMX one of them\n  - Account model ECDSA signatures, seamless integration\n- **Feature rich** node:\n  - Built-in Block Explorer, Wallet, Market, Swap, RPC, and more\n\n## Compare\n\nNative L1 blockchain logic, without any L2 scaling.\n\n| | MMX | Bitcoin | Ethereum | Chia |\n| :--- | :--- | :--- | :--- | :--- |\n| Consensus | [PoST](## \"Proof of Space and Time\") | [PoW](## \"Proof of Work\") | [PoS](## \"Proof of Stake\") | [PoST](## \"Proof of Space and Time\") |\n| [TPS](## \"Transactions per Second, real simplest-TX capacity, ignoring TX-fees\") (capacity) _<sup>[1]</sup>_ | 500 _<sup>[(i)](## \"250M cost limit / 50K cost simplest-TX / blocktime = ~500\")</sup>_ | 12 _<sup>[(i)](## \"1 MB / 140 bytes SegWit-TX / blocktime = ~12\")</sup>_ | 119 _<sup>[(i)](## \"30M gas limit / 21K gas simplest-TX / blocktime = ~119\")</sup>_ | 35 _<sup>[(i)](## \"Documented as 20-40 TPS, real-life stress tests at 35 = ~35\")</sup>_ |\n| [Blocktime/TX](## \"Average time it takes to create a new block with TX-es\") (average) _<sup>[1]</sup>_ | ~10 sec _<sup>[(i)](## \"Blocktime 10 sec, ~2% non-TX blocks, average TX blocktime = ~10 sec\")</sup>_ | ~600 sec _<sup>[(i)](## \"Average blocktime statistics = ~600 sec (~10 min)\")</sup>_ | ~12 sec _<sup>[(i)](## \"Average blocktime statistics = ~12 sec\")</sup>_ | ~56 sec _<sup>[(i)](## \"Blocktime 18.75 sec, 2/3 non-TX blocks, average TX blocktime = ~56 sec\")</sup>_ |\n| Smart Contracts (VM) | Yes | No | Yes | Yes |\n| Feature Rich (L1) | Yes | No | Basic | Yes |\n\n_<sup>[1]</sup> Look [footnotes](#footnotes) for more details._\n\nDecentralization, or not:\n\n- **Ethereum**: Less decentralized. Staking concentrated, staking requirement for validators.\n- **XRP**: Not truly decentralized. Centralized approved validators, token distribution.\n- **Solana**: Not truly decentralized. Staking concentrated, token distribution, validator requirements.\n\nIf needed, **MMX** is a solid foundation for any L2 solution.\n\n## History\n\n- **Jan2025**: Mainnet live 17jan2025, **MMX**\n- **Oct2022**: Testnets 8-12, first incentivized\n- **Nov2021**: Testnets 1-7, development [started](https://github.com/madMAx43v3r/mmx-node/commits/master/?since=2021-11-25&until=2021-11-25), **by** [**Max**](https://github.com/madMAx43v3r)\n\n## Tokenomics\n\n- Detailed info in [whitepaper](../../../articles/general/mmx-whitepaper/)\n- No pre-mine, no pre-farm, public incentivized testnets\n- Transparently written on mainnet genesis, [records](https://github.com/madMAx43v3r/mmx-node/tree/master/data) on GitHub\n- Majority to farmers, +99%, not developers, with &lt;1% of netspace\n\n## Resources\n\n- [Homepage](https://mmx.network/)\n- [Documentation](https://docs.mmx.network/)\n- [GitHub](https://github.com/madMAx43v3r/mmx-node)\n- [Explorer](https://explore.mmx.network/)\n- [X Feed](https://x.com/MMX_Network_)\n- [Discord](https://discord.gg/BswFhNkMzY)\n- [MMXplorer](https://mmxplorer.com/)\n\n## Footnotes\n\n<details><summary><b>TPS (capacity)</b></summary>\n\n\\\n**Premise**: Capacity of blockchain in Transactions per Second, with real simplest-TX size, ignoring TX-fees.\n\n- **MMX**: `250M cost limit / 50K cost simplest-TX / blocktime` = `~500`\\\nNode coded extremely performant in C++ to handle all aspects of blockchain logic on regular home hardware. Real-life stress tests, on regular user nodes, have handled 2000 TX-es (200 TPS) per block without problems. Block parameters at that time limited it to 2000 TX-es. Now set to potentially 5000 TX-es (500 TPS). Locally node will be able to handle it, and can easily scale to 10000 TX-es (1000 TPS) in future.\\\nBottleneck is bandwidth of home internet connections, and latency of internet in general. A limitation MMX works the most out of, while still being truly decentralized. We know 200 TPS works, with 500 TPS potential. Future home internet improvements could raise that number (1000 TPS). All on-chain L1, before any L2 scaling.\n\n- **Bitcoin**: `1 MB / 140 bytes SegWit-TX / blocktime` = `~12`\\\nBitcoin is usually referenced with a maximum TPS around 7. Could increase if community had agreed on several design improvements. As of now, with current SegWit-TX structure. Potentially 12 TPS with only SegWit-TX in block.\n\n- **Ethereum**: `30M gas limit / 21K gas simplest-TX / blocktime` = `~119`\\\nEthereum is usually listed with anything from 15-50 maximum TPS. Real-life statistics have it working at an average of 15 TPS, with variable complexity of TX-es. The calculation of 119 TPS might not look very realistic. But we are talking capacity potential, ignoring TX-fees. Filling a block with about 1428 simplest-TX, results in a potential TPS of 119. If the blockchain logic and nodes are optimized enough to handle such a scenario, unknown.\n\n- **Chia**: `Documented as 20-40 TPS, real-life stress tests at 35` = `~35`\\\nNot easy to get hard numbers to calculate Chia's maximum TPS potential. It is documented to be in the 20-40 range. A real-life stress test, with simplest-TX-es, have given about 35 TPS.\n\n:::note[Note]\nAn 100% apples to apples comparison is not possible without overly complicating it. Each blockchain has unique properties, real-life behavior, and limitations. This is an attempt to estimate a realistic capacity potential. As fair as possible, in a simple table.\n:::\n\n</details>\n\n<details><summary><b>Blocktime/TX (average)</b></summary>\n\n\\\n**Premise**: Average time it takes to create a new block with TX-es, given frequency of non-TX blocks.\n\n- **MMX**: `Blocktime 10 sec, ~2% non-TX blocks, average TX blocktime` = `~10 sec`\n- **Bitcoin**: `Average blocktime statistics` = `~600 sec` (`~10 min`)\n- **Ethereum**: `Average blocktime statistics` = `~12 sec`\n- **Chia**: `Blocktime 18.75 sec, 2/3 non-TX blocks, average TX blocktime` = `~56 sec`\n\n</details>\n"
  },
  {
    "path": "docs/src/content/docs/articles/general/mmx-whitepaper.mdx",
    "content": "---\ntitle: Whitepaper, MMX\ndescription: Whitepaper for the MMX Blockchain & Currency\nprev: false\nnext: false\n\narticlePublished: 2025-01-11\narticleUpdated: 2025-01-29\n\nauthorName: madMAx43v3r\nauthorPicture: https://avatars.githubusercontent.com/u/951738?s=200\nauthorURL: https://github.com/madMAx43v3r\n---\n\nimport { LinkButton } from '@astrojs/starlight/components';\n\nWhitepaper for the MMX Blockchain & Currency.\n\n<LinkButton href=\"/MMX_Whitepaper_290125.pdf\" icon=\"download\" iconPlacement=\"start\">\n  Download PDF\n</LinkButton>\n\n:::note[Note]\nTechnical breakdown, read [reference](../../../reference/blockchain/). Light introduction, read [article](../../../articles/general/mmx-tldr/).\n:::\n\n<br/>\n<embed type=\"application/pdf\" src=\"/MMX_Whitepaper_290125.pdf\"  width=\"100%\" height=\"992px\"></embed>\n"
  },
  {
    "path": "docs/src/content/docs/articles/plotting/plot-format.md",
    "content": "---\ntitle: Plot format\ndescription: Plot format for MMX (mainnet), introduced with testnet11\nprev: false\nnext: false\n\narticlePublished: 2024-04-06\narticleUpdated: 2025-01-30\n\nauthorName: voidxno\nauthorPicture: https://avatars.githubusercontent.com/u/53347890?s=200\nauthorURL: https://github.com/voidxno\n---\n\nPlot format, MMX.\n\n:::note[Important]\nMy own understanding, reading comments when mainnet plot format was rolled out with testnet11. Still relevant info, as an introduction. Reference official information if unsure.\n:::\n\n## TLDR;\n\n- Plot format for MMX (mainnet), introduced with testnet11\n- **Resistant against compression**\n- Two types, HDD and SSD-plots (min k29, max k32, [plot size](../../../articles/plotting/plot-size/)):\n  | | `k29` | `k30` | `k31` | `k32` |\n  | :--- | :--- | :--- | :--- | :--- |\n  | `hdd` | 36.4 GiB | 75.2 GiB | 155.3 GiB | 320.4 GiB |\n  | `sdd` | 14.7 GiB | 30.3 GiB |  62.3 GiB | 128.4 GiB |\n- SSD-plots have missing data, smaller, but require high disk IOPS\n- Plotting: GPU required, full RAM, partial RAM, disk mode\n- Plotting: Any old 4GB VRAM (Pascal), `k32` needs 6GB VRAM\n- Farming: CPU only (plots), GPU not supported (not worth it)\n- Farming: Still iGPU/GPU recommended for VDF-verify (CPU possible)\n- Compression: Still supported, practically not worth it (1-4%, C1-C15)\n- Bonus: Open source mmx-node builds (GPU plotter too)\n\n## Compression\n\n### Previously\n\nPlot compression is not really traditional compression. It is information left out of plot file, reducing its size. Reconstructed on-the-fly when farming.\n\nData in plot files are several nested tables that takes a certain amount of time to create (plotting). If passing plot filter, this data is used to create potential proofs. That again could be the winning proof for a block.\n\nPreviously plot files where cleverly reworked to smaller sizes, with missing information. When farming, that information was reconstructed on-the-fly when needed. Branded as plot compression.\n\n### Today\n\nTestnet11 introduced a new plot format that are orders of magnitude more resistant to these kind of compression techniques. Reworked by Max to make it practically worthless. Not possible to be 100% compression resistant. It's math. But reworked algorithms, required proof time, limits it greatly.\n\nAs a principle, compression is still an option. The higher compression chosen (C1-C15), longer plot times, more CPU compute when farming. Gaining **only 1-4% compression, compared to +200% with other Proof of Space**.\n\nHDD-plots have C0-C4 as recommended compression (1%). Still easily processed by CPU when farming. Going further up, too much load/time on CPU.\n\n## SSD-plots\n\nSSD-plots are a type of pre-compressed plots, missing hashes. Reconstructed on-the-fly when farming, but requires very high disk IOPS. Storing them on HDD will not work, not enough IOPS on spinning platters. Goal is to balance cost/reward potential between SSD and HDD storage (2.5x SSD advantage, but more expensive media).\n\nBasically: Given **identical k-size, SSD-plots has same effective space on network as HDD-plots**. Takes less space to store (**2.5x advantage**), but more expensive media (SSD).\n\nGiven the high IOPS for SSD-plots, recommended to use C0 for compression (0%).\n\n## Plotting\n\n**RAM requirements** for plotter, in [memory GB](https://en.wikipedia.org/wiki/Byte#Multiple-byte_units \"Memory GB units, 1024^3\") (similar for HDD and SSD-plots):\n| | full RAM | partial RAM | disk mode |\n| :--- | :--- | :--- | :--- |\n| `hdd`/`sdd-k29` | 60 GB | 32 GB | 8 GB |\n| `hdd`/`sdd-k30` | 110 GB | 64 GB | 8 GB |\n| `hdd`/`sdd-k31` | 216 GB | 120 GB | 8 GB |\n| `hdd`/`sdd-k32` | 410 GB | 232 GB | 8 GB |\n\n:::note[Note]\nDisk mode usually less than 8 GB, depends on `-S` streams option.\\\nIf close to 32 GB, 32 GB system RAM not enough. 48/64 GB needed.\n:::\n\n**Temp disk space** needed when plotting (similar for HDD and SSD-plots):\n| | full RAM | partial RAM | disk mode |\n| :--- | :--- | :--- | :--- |\n| `hdd`/`sdd-k29` | 0.0 GiB | 24 GiB | 51 GiB |\n| `hdd`/`sdd-k30` | 0.0 GiB | 48 GiB | 101 GiB |\n| `hdd`/`sdd-k31` | 0.0 GiB | 100 GiB | 202 GiB |\n| `hdd`/`sdd-k32` | 0.0 GiB | 200 GiB | 404 GiB |\n\n**Total disk writes** when plotting, in [TiB](https://en.wikipedia.org/wiki/Byte#Multiple-byte_units \"TebiByte units, 1024^4\") written:\n| | full RAM | partial RAM | disk mode |\n| :--- | :--- | :--- | :--- |\n| `hdd`/`sdd-k29` | 0.04 / 0.02 TiBW | 0.08 / 0.06 TiBW | 0.33 / 0.28 TiBW |\n| `hdd`/`sdd-k30` | 0.08 / 0.03 TiBW | 0.16 / 0.12 TiBW | 0.68 / 0.57 TiBW |\n| `hdd`/`sdd-k31` | 0.16 / 0.06 TiBW | 0.33 / 0.25 TiBW | 1.40 / 1.14 TiBW |\n| `hdd`/`sdd-k32` | 0.32 / 0.13 TiBW | 0.67 / 0.50 TiBW | 2.88 / 2.27 TiBW |\n\n:::note[Note]\nTestnet11 introduced a new farmer key, 33 bytes ECDSA vs old 48 BLS (`-f`, 66 chars vs old 96).\n:::\n\nFollow [`#mmx-general`](https://discord.com/channels/852982773963161650/925017012235817042) on Discord.\n\n## Farming\n\n**Disk seeks** per plot (independent of k-size or C-compression):\n| | pass filter | full proof\n| :--- | :--- | :--- |\n| `hdd` | ~2 | ~256 |\n| `ssd` | ~4096 | 0 |\n\nFollow [`#mmx-farming`](https://discord.com/channels/852982773963161650/853417165980827657) on Discord.\n"
  },
  {
    "path": "docs/src/content/docs/articles/plotting/plot-size.mdx",
    "content": "---\ntitle: Plot size\ndescription: Plot sizes for MMX\nprev: false\nnext: false\n\narticlePublished: 2026-03-04\narticleUpdated: 2026-03-20\n\nauthorName: voidxno\nauthorPicture: https://avatars.githubusercontent.com/u/53347890?s=200\nauthorURL: https://github.com/voidxno\n---\n\nAn attempt to quantify real-life MMX plot size patterns into charts, tables and formulas. Created by plotting lots of different k-sizes and C-levels. Both to find patterns, and make sure of them. Goal is an easy overview of plot size behavior, with solid numbers as a bonus.\n\n## TLDR;\n\n- [Compression resistant](../../../articles/plotting/plot-format/) plot format\n- Given a specific k-size/C-level, following is true:\n  - Plot size is random, within a small bell curved range\n  - Plot size will average out, given enough plots\n  - Varying size equals **less or more proofs, not better compression**\n- Given specific k-size, following is true:\n  - Delta size between C-levels is identical, linear\n  - Delta size of distribution bell curve is identical for all C-levels\n- Evaluate yourself [what C-compression](../../../faq/plotting/#what-k-size-and-c-compression-should-i-plot) level is worth it\n- A few thoughts about [filling a disk](#filling-a-disk) further down\n- Own section below with data for [SSD-plots](#ssd-plots)\n\n## Charts\n\nFirst chart is an overall overview using formulas created. Followed by two charts using real-life hdd-k29 plotting data to illustrate patterns. Those patterns repeat in other k-sizes. Decimal GiB numbers in overview chart have been rounded up. Less chance of underestimating combined size of plots.\n\n<details open=\"true\">\n  <summary>Overview</summary>\n    <p>\n      <a href=\"/images/plot-size/plotsize.png\"><img class=\"dark:sl-hidden\" src=\"/images/plot-size/plotsize.png\" /></a>\n      <a href=\"/images/plot-size/plotsize_dark.png\"><img class=\"light:sl-hidden\" src=\"/images/plot-size/plotsize_dark.png\" /></a>\n    </p>\n</details>\n\n<details>\n  <summary>Distribution (hdd-k29, C0)</summary>\n    <p>\n      <a href=\"/images/plot-size/distribution_c0.png\"><img class=\"dark:sl-hidden\" src=\"/images/plot-size/distribution_c0.png\" /></a>\n      <a href=\"/images/plot-size/distribution_c0_dark.png\"><img class=\"light:sl-hidden\" src=\"/images/plot-size/distribution_c0_dark.png\" /></a>\n    </p>\n</details>\n\n<details>\n  <summary>Distribution (hdd-k29, C0-C15)</summary>\n    <p>\n      <a href=\"/images/plot-size/distribution_c0-c15.png\"><img class=\"dark:sl-hidden\" src=\"/images/plot-size/distribution_c0-c15.png\" /></a>\n      <a href=\"/images/plot-size/distribution_c0-c15_dark.png\"><img class=\"light:sl-hidden\" src=\"/images/plot-size/distribution_c0-c15_dark.png\" /></a>\n    </p>\n</details>\n\n## Average\n\n<details open=\"true\">\n  <summary>List</summary>\n\n| | `hdd-k29` | `hdd-k30` | `hdd-k31` | `hdd-k32` |\n| :--- | :--- | :--- | :--- | :--- |\n| `C0` | 36.376 GiB | 75.196 GiB | 155.279 GiB | 320.321 GiB |\n| `C15` | 34.893 GiB | 72.223 GiB | 149.315 GiB | 308.351 GiB |\n| `%` | -4.08 % | -3.95 % | -3.84 % | -3.74 % |\n\n</details>\n\n<details>\n  <summary>Full list</summary>\n\n| | `hdd-k29` | `hdd-k30` | `hdd-k31` | `hdd-k32` |\n| :--- | :--- | :--- | :--- | :--- |\n| `C0` | 36.376 GiB | 75.196 GiB | 155.279 GiB | 320.321 GiB |\n| `C1` | 36.277 GiB | 74.998 GiB | 154.882 GiB | 319.523 GiB |\n| `C2` | 36.178 GiB | 74.800 GiB | 154.484 GiB | 318.725 GiB |\n| `C3` | 36.079 GiB | 74.602 GiB | 154.086 GiB | 317.927 GiB |\n| `C4` | 35.980 GiB | 74.404 GiB | 153.689 GiB | 317.129 GiB |\n| `C5` | 35.882 GiB | 74.205 GiB | 153.291 GiB | 316.331 GiB |\n| `C6` | 35.783 GiB | 74.007 GiB | 152.894 GiB | 315.533 GiB |\n| `C7` | 35.684 GiB | 73.809 GiB | 152.496 GiB | 314.735 GiB |\n| `C8` | 35.585 GiB | 73.611 GiB | 152.098 GiB | 313.937 GiB |\n| `C9` | 35.486 GiB | 73.412 GiB | 151.701 GiB | 313.139 GiB |\n| `C10` | 35.387 GiB | 73.214 GiB | 151.303 GiB | 312.341 GiB |\n| `C11` | 35.288 GiB | 73.016 GiB | 150.905 GiB | 311.543 GiB |\n| `C12` | 35.189 GiB | 72.818 GiB | 150.508 GiB | 310.745 GiB |\n| `C13` | 35.091 GiB | 72.620 GiB | 150.110 GiB | 309.947 GiB |\n| `C14` | 34.992 GiB | 72.421 GiB | 149.713 GiB | 309.149 GiB |\n| `C15` | 34.893 GiB | 72.223 GiB | 149.315 GiB | 308.351 GiB |\n| `%` | -4.08 % | -3.95 % | -3.84 % | -3.74 % |\n\n</details>\n\n<details>\n  <summary>Formula</summary>\n\n- HDD-plot C0 (GiB): `4.98452*k*1.99844^(k-30.99297)+0.00513`\n- HDD-plot C15 (%): `-(1.0871^(34.1291-k)+2.5423)`\n\n</details>\n\n## Distribution\n\nNearly all plots will be within a 99.5% GiB range, with average plot size in middle. Given enough plots there will be a few outliers, but not many. 99.5% is a representative value for a practical range. GiB numbers with one decimal place have been rounded up and down to best fit purpose. Less chance of underestimating average plot sizes and range values.\n\n<details open=\"true\">\n  <summary>List</summary>\n\n| | `hdd-k29` | `hdd-k30` | `hdd-k31` | `hdd-k32` |\n| :--- | :--- | :--- | :--- | :--- |\n| `99.5%` | &plusmn;0.485 GiB | &plusmn;0.729 GiB | &plusmn;1.082 GiB | &plusmn;1.586 GiB |\n| `C0` (average) | 36.4 GiB | 75.2 GiB | 155.3 GiB | 320.4 GiB |\n| `C0` (range) | 35.8 - 36.9 | 74.4 - 76.0 | 154.1 - 156.4 | 318.7 - 322.0 |\n\n\n</details>\n\n<details>\n  <summary>Full list</summary>\n\n| | `hdd-k29` | `hdd-k30` | `hdd-k31` | `hdd-k32` |\n| :--- | :--- | :--- | :--- | :--- |\n| `25%` | &plusmn;0.052 GiB | &plusmn;0.078 GiB | &plusmn;0.116 GiB | &plusmn;0.170 GiB |\n| `50%` | &plusmn;0.113 GiB | &plusmn;0.169 GiB | &plusmn;0.251 GiB | &plusmn;0.369 GiB |\n| `75%` | &plusmn;0.195 GiB | &plusmn;0.293 GiB | &plusmn;0.435 GiB | &plusmn;0.638 GiB |\n| `99.5%` | &plusmn;0.485 GiB | &plusmn;0.729 GiB | &plusmn;1.082 GiB | &plusmn;1.586 GiB |\n| `C0` | 35.8 - 36.9 | 74.4 - 76.0 | 154.1 - 156.4 | 318.7 - 322.0 |\n| `C1` | 35.7 - 36.8 | 74.2 - 75.8 | 153.7 - 156.0 | 317.9 - 321.2 |\n| `C2` | 35.6 - 36.7 | 74.0 - 75.6 | 153.4 - 155.6 | 317.1 - 320.4 |\n| `C3` | 35.5 - 36.6 | 73.8 - 75.4 | 153.0 - 155.2 | 316.3 - 319.6 |\n| `C4` | 35.4 - 36.5 | 73.6 - 75.2 | 152.6 - 154.8 | 315.5 - 318.8 |\n| `C5` | 35.3 - 36.4 | 73.4 - 75.0 | 152.2 - 154.4 | 314.7 - 318.0 |\n| `C6` | 35.2 - 36.3 | 73.2 - 74.8 | 151.8 - 154.0 | 313.9 - 317.2 |\n| `C7` | 35.1 - 36.2 | 73.0 - 74.6 | 151.4 - 153.6 | 313.1 - 316.4 |\n| `C8` | 35.1 - 36.1 | 72.8 - 74.4 | 151.0 - 153.2 | 312.3 - 315.6 |\n| `C9` | 35.0 - 36.0 | 72.6 - 74.2 | 150.6 - 152.8 | 311.5 - 314.8 |\n| `C10` | 34.9 - 35.9 | 72.4 - 74.0 | 150.2 - 152.4 | 310.7 - 314.0 |\n| `C11` | 34.8 - 35.8 | 72.2 - 73.8 | 149.8 - 152.0 | 309.9 - 313.2 |\n| `C12` | 34.7 - 35.7 | 72.0 - 73.6 | 149.4 - 151.6 | 309.1 - 312.4 |\n| `C13` | 34.6 - 35.6 | 71.8 - 73.4 | 149.0 - 151.2 | 308.3 - 311.6 |\n| `C14` | 34.5 - 35.5 | 71.6 - 73.2 | 148.6 - 150.8 | 307.5 - 310.8 |\n| `C15` | 34.4 - 35.4 | 71.4 - 73.0 | 148.2 - 150.4 | 306.7 - 310.0 |\n\n</details>\n\n<details>\n  <summary>Formula</summary>\n\n- HDD-plot k29 (&plusmn;GiB): `0.153*sinh(0.00872*p)-0.0632*ln(100-p)+0.2911`\n- HDD-plot k-size (multiplier): `2.386E-18*k^12.05`\n\n</details>\n\n## Filling a disk\n\nNo perfect way to get 0 bytes free when filling a disk with plots. Random element of plot size complicates some. But plot size has a predictable range, and averages out. As shown in charts and tables above.\n\nAlso remember. Smaller or larger plot size within same k-size/C-level is not better compression. Just less or more proofs.\n\nLet's say you are able to plot k31 in RAM, going for that k-size. You feel confident with a C-level up to C4 on farming load ([individual choice](../../../faq/plotting/#what-k-size-and-c-compression-should-i-plot)).\n\nTake an 18TB disk. Convert capacity to GiB, with 2 GiB filesystem overhead:\n```\n18TB capacity:     (18E12 / 1024^3) - 2.0 = 16761.8 GiB\nhdd-k31 C4 (low):  16761.8 GiB / 152.6 = 109(.84) plots [free: 128.4 GiB]\nhdd-k31 C4 (avg):  16761.8 GiB / 153.7 = 109(.06) plots [free:   8.5 GiB]\nhdd-k31 C4 (high): 16761.8 GiB / 154.8 = 108(.28) plots [free:  43.4 GiB]\n```\n\nWhat is not realistic here is getting a run of only lowest possible C4, or highest. More probable is a 109 plot run averaging out closer to average C4 size. Because of low sample size (number of plots), statistics will have it somewhat under or over.\n\nWhat to do?\n- Keep it simple. Find your wanted k-size/C-level. Plot and fill disks, not thinking about left over free space.\n- Optionally go through disks afterwards, see if a few lower k-size/C-level plots could fill up left over free space.\n\nOther strategies are possible. Filtering a 'cache' (if you have space) of plots weighted against certain sizes. Then have a strategy to fill up disks. That will cost time and complicate plotting process. Often the simplest is best.\n\nJust go to Discord and ask for advice, links in [feedback](#feedback) section below.\n\n\n## SSD-plots\n\nQuick intro about SSD-plots [here](../../../articles/plotting/plot-format/#ssd-plots). They are ready for use, though majority of netspace is HDD-plots.\n\nListing identical tables as HDD-plots above, but without charts. Patterns for SSD-plots are identical, just different numbers. Except, be careful with compression. Recommended to use C0 given the high IOPS for SSD-plots.\n\n<details>\n  <summary>Average - List</summary>\n\n| | `ssd-k29` | `ssd-k30` | `ssd-k31` | `ssd-k32` |\n| :--- | :--- | :--- | :--- | :--- |\n| `C0` | 14.633 GiB | 30.205 GiB | 62.285 GiB | 128.307 GiB |\n| `C15` | 13.139 GiB | 27.218 GiB | 56.312 GiB | 116.365 GiB |\n| `%` | -10.21 | -9.89 | -9.59 | -9.31 |\n\n</details>\n\n<details>\n  <summary>Average - Full List</summary>\n\n| | `ssd-k29` | `ssd-k30` | `ssd-k31` | `ssd-k32` |\n| :--- | :--- | :--- | :--- | :--- |\n| `C0` | 14.633 GiB | 30.205 GiB | 62.285 GiB | 128.307 GiB |\n| `C1` | 14.534 GiB | 30.006 GiB | 61.887 GiB | 127.511 GiB |\n| `C2` | 14.434 GiB | 29.807 GiB | 61.489 GiB | 126.715 GiB |\n| `C3` | 14.334 GiB | 29.608 GiB | 61.091 GiB | 125.919 GiB |\n| `C4` | 14.235 GiB | 29.409 GiB | 60.692 GiB | 125.122 GiB |\n| `C5` | 14.135 GiB | 29.210 GiB | 60.294 GiB | 124.326 GiB |\n| `C6` | 14.036 GiB | 29.010 GiB | 59.896 GiB | 123.530 GiB |\n| `C7` | 13.936 GiB | 28.811 GiB | 59.498 GiB | 122.734 GiB |\n| `C8` | 13.836 GiB | 28.612 GiB | 59.099 GiB | 121.938 GiB |\n| `C9` | 13.737 GiB | 28.413 GiB | 58.701 GiB | 121.142 GiB |\n| `C10` | 13.637 GiB | 28.214 GiB | 58.303 GiB | 120.346 GiB |\n| `C11` | 13.537 GiB | 28.015 GiB | 57.905 GiB | 119.549 GiB |\n| `C12` | 13.438 GiB | 27.815 GiB | 57.507 GiB | 118.753 GiB |\n| `C13` | 13.338 GiB | 27.616 GiB | 57.108 GiB | 117.957 GiB |\n| `C14` | 13.239 GiB | 27.417 GiB | 56.710 GiB | 117.161 GiB |\n| `C15` | 13.139 GiB | 27.218 GiB | 56.312 GiB | 116.365 GiB |\n| `%` | -10.21 | -9.89 | -9.59 | -9.31 |\n\n</details>\n\n<details>\n  <summary>Average - Formula</summary>\n\n- SSD-plot C0 (GiB): `1.97585*k*1.99570^(k-30.97589)+0.00479`\n- SSD-plot C15 (%): `-(1.0649^(55.3836-k)+4.9567)`\n\n</details>\n\n<details>\n  <summary>Distribution - List</summary>\n\n| | `ssd-k29` | `ssd-k30` | `ssd-k31` | `ssd-k32` |\n| :--- | :--- | :--- | :--- | :--- |\n| `99.5%` | &plusmn;0.083 GiB | &plusmn;0.124 GiB | &plusmn;0.185 GiB | &plusmn;0.271 GiB |\n| `C0` (average) | 14.7 GiB | 30.3 GiB | 62.3 GiB | 128.4 GiB |\n| `C0` (range) | 14.5 - 14.8 | 30.0 - 30.4 | 62.1 - 62.5 | 128.0 - 128.6 |\n\n</details>\n\n<details>\n  <summary>Distribution - Full List</summary>\n\n| | `ssd-k29` | `ssd-k30` | `ssd-k31` | `ssd-k32` |\n| :--- | :--- | :--- | :--- | :--- |\n| `25%` | &plusmn;0.009 GiB | &plusmn;0.014 GiB | &plusmn;0.021 GiB | &plusmn;0.031 GiB |\n| `50%` | &plusmn;0.020 GiB | &plusmn;0.030 GiB | &plusmn;0.045 GiB | &plusmn;0.065 GiB |\n| `75%` | &plusmn;0.034 GiB | &plusmn;0.051 GiB | &plusmn;0.076 GiB | &plusmn;0.111 GiB |\n| `99.5%` | &plusmn;0.083 GiB | &plusmn;0.124 GiB | &plusmn;0.185 GiB | &plusmn;0.271 GiB |\n| `C0` | 14.5 - 14.8 | 30.0 - 30.4 | 62.1 - 62.5 | 128.0 - 128.6 |\n| `C1` | 14.4 - 14.7 | 29.8 - 30.2 | 61.7 - 62.1 | 127.2 - 127.8 |\n| `C2` | 14.3 - 14.6 | 29.6 - 30.0 | 61.3 - 61.7 | 126.4 - 127.0 |\n| `C3` | 14.2 - 14.5 | 29.4 - 29.8 | 60.9 - 61.3 | 125.6 - 126.2 |\n| `C4` | 14.1 - 14.4 | 29.2 - 29.6 | 60.5 - 60.9 | 124.8 - 125.4 |\n| `C5` | 14.0 - 14.3 | 29.0 - 29.4 | 60.1 - 60.5 | 124.0 - 124.6 |\n| `C6` | 13.9 - 14.2 | 28.8 - 29.2 | 59.7 - 60.1 | 123.2 - 123.9 |\n| `C7` | 13.8 - 14.1 | 28.6 - 29.0 | 59.3 - 59.7 | 122.4 - 123.1 |\n| `C8` | 13.7 - 14.0 | 28.4 - 28.8 | 58.9 - 59.3 | 121.6 - 122.3 |\n| `C9` | 13.6 - 13.9 | 28.2 - 28.6 | 58.5 - 58.9 | 120.8 - 121.5 |\n| `C10` | 13.5 - 13.8 | 28.0 - 28.4 | 58.1 - 58.5 | 120.0 - 120.7 |\n| `C11` | 13.4 - 13.7 | 27.8 - 28.2 | 57.7 - 58.1 | 119.2 - 119.9 |\n| `C12` | 13.3 - 13.6 | 27.6 - 28.0 | 57.3 - 57.7 | 118.4 - 119.1 |\n| `C13` | 13.2 - 13.5 | 27.4 - 27.8 | 56.9 - 57.3 | 117.6 - 118.3 |\n| `C14` | 13.1 - 13.4 | 27.2 - 27.6 | 56.5 - 56.9 | 116.8 - 117.5 |\n| `C15` | 13.0 - 13.3 | 27.0 - 27.4 | 56.1 - 56.5 | 116.0 - 116.7 |\n\n</details>\n\n<details>\n  <summary>Distribution - Formula</summary>\n\n- SSD-plot k29 (&plusmn;GiB): `0.088*sinh(0.00282*p)-0.0109*ln(100-p)+0.0502`\n- SSD-plot k-size (multiplier): `2.386E-18*k^12.05`\n\n</details>\n\n## References\n\n<details>\n  <summary>Basic data</summary>\n\nIf useful to anyone. Link to [plot-size_csv.zip](/resources/data/plot-size/plot-size_csv.zip) with raw CSV data used to create formulas. Would even more data be preferable? Always. But was enough to see patterns, and estimate good values for formulas.\n\n:::note[Note]\n\nImportant that such data is as-is, without any pre-filtering of plots that are larger or smaller.\n\nThere are a few entries in k26 and k29 that are identical. Not wrong, just higher probability on lower k-sizes.\n\nTogether with k29-k32, k26 was included. Not valid in mainnet, so not shown in charts and tables above. But formulas work for k26.\n\nSome signs in data that &plusmn; distribution might have a small difference. Not enough to warrant asymmetrical formulas.\n\nFor reference. A lot of plots created, recorded, deleted. Hardware was Nvidia RTX A4500, Intel DC P4610 6.4TB SDD, and 128GB RAM. A combination of full RAM, partial RAM, and disk mode. Together with some plots already done on my farm.\n\n:::\n\n</details>\n\n<details>\n  <summary>Formula creation</summary>\n\nFormulas above are not perfect, but close enough. Transforming real source code logic into perfect formulas would be too complex. Better with a good approximation that matches real-life behavior.\n\nStrategy used:\n- Map all real-life plot data into spreadsheets\n- Transform numbers in different ways, find patterns\n- Create points for each k-size on a graph\n- Find basic curve formula that matches points on graph\n- Brute force iterate numbers in formula\n- Find numbers with least difference across all k-sizes\n\nWithout required plot file metadata, formula looks to be:\n- HDD-plot C0 (GiB): `5*k*2^(k-31)` (ideal, not real-life)\n- SSD-plot C0 (GiB): `2*k*2^(k-31)` (ideal, not real-life)\n\n</details>\n\n## Feedback\n\nQuestions, or wrong info above. Use [`#mmx-general`](https://discord.com/channels/852982773963161650/925017012235817042) or [`#mmx-farming`](https://discord.com/channels/852982773963161650/853417165980827657) channels on Discord.\n"
  },
  {
    "path": "docs/src/content/docs/articles/timelord/timelord-optimizations.md",
    "content": "---\ntitle: TimeLord Optimizations\ndescription: How to optimize MMX timelord speed\nprev: false\nnext: false\n\narticlePublished: 2023-07-11\narticleUpdated: 2025-03-17\n\nauthorName: voidxno\nauthorPicture: https://avatars.githubusercontent.com/u/53347890?s=200\nauthorURL: https://github.com/voidxno\n---\n\nRunning an MMX TimeLord is optional (default is disabled). Not needed to run a fully functional node.\n\nBlockchain, as a whole, only need one active timelord to move forward. A few more, spread around, is preferred for redundancy and security. Do not need to be fastest.\n\nIf you want to contribute by running one, check [requirements](#requirements) below. Enable timelord in WebGUI, or set `true` in `config/local/timelord` file. Check that running, and speed, in NODE / LOG / TIMELORD tab in WebGUI. Probably lower than NODE / VDF Speed, unless you are the fastest timelord.\n\nNo more is needed. Standard Linux compile and Windows binaries gives good performance for a timelord. Unless you want to optimize for fastest timelord, or the fun of it.\n\n:::caution[Important]\nTrying to be fastest TimeLord is not easy. _YOU_ need to decide if worth it. **Overclock at your own risk, CPU can degrade**. Information shared here, is to **best of my knowledge as of Mar2025**.\n:::\n\n## TLDR;\n\nI want to run [fastest timelord](../../../articles/timelord/timelord-predictions/):\n* Intel Ultra 200S series, E-core (15th-gen, Arrow Lake)\n* Use [Linux](#linux-or-windows) and [GCC](#optimize-compiler)\n* Compile with [AVX](#optimize-compiler-options-avx-vs-sse42)\n* Compile with [15th-gen E-core optimized code](#optimize-source-code-architecture)\n* [Isolate](#optimize-isolate-thread) 1x CPU core to timelord process thread\n* Have a GPU/iGPU verify VDF\n* [Clock 1x CPU core](#optimize-cpu-speed) as high as possible\n\n:::note[Note]\nOptimize and **overclock at your own risk**.\n:::\n\n## Logic\n\nA timelord performs a very simple mathematical operation (SHA256, Secure Hash Algorithm). It is performed recursively and cannot be parallelized. Previous result is needed, before repeating, as fast as possible. Like a very specific mathematical single-threaded benchmark.\n\nTimelord runs 1x of these operations, creating a VDF (verifiable delay function) stream.\n\nOnly fastest timelord, at any time, produces VDF for block being created. A reward of 0.2 MMX is given every 20 blocks to fastest timelord. Potentially 86.4 MMX per day. Be aware of [overtaking caveat](#fastest-timelord) for fastest timelord.\n\n## Requirements\n\n**CPU:** Intel or AMD (w/ SHA extensions).<br>\n**Model:** Intel 11th-gen (Rocket Lake), AMD Zen, or later (a few exceptions).<br>\n**GPU/iGPU:** Any compatible (offload verify VDF).\n\n**Linux:** `grep -o 'sha_ni' /proc/cpuinfo`, empty if not available.<br>\n**Windows:** CPU-Z (Instructions) or HWiNFO64 (Features), look for `SHA`.\n\nYou can run timelord on a CPU without SHA extensions. Will fallback to AVX2. In reality SHA extensions are needed. SHA256 calculations are ~5-10x faster with SHA vs AVX2.\n\n## Why not GPU/FPGA/ASIC\n\nTimelord logic will only use CPU, not GPU.\n\nGPU is great for parallel SHA256 calculations, beating CPU in both speed and efficiency. GPU is used for verify VDF operation on a node, if available.\n\nFor a single SHA256 calculation, CPU's SHA extensions will beat GPU on speed. As timelord SHA256 workload is not parallelizable, CPU wins the serial SHA256 race.\n\nFeedback welcome on other contenders. As of now, nothing observed beating a high-GHz CPU with SHA extensions (optimized silicon circuits inside CPU). Too low speed (GHz) on FPGA, work not parallelizable. Prohibitive cost to produce a high-GHz ASIC that beats Intel/AMD optimized silicon.\n\n## Optimize TimeLord\n\nStandard Linux compile and Windows binaries gives good performance for a timelord. Still important to tune surrounding environment. Either aiming for fastest timelord rewards, or just the challenge.\n\nInformation and numbers in this article might be superseded. Sections below are known info at date of publish. To help get started or give ideas. Not the absolute answer. Probably angles not discovered yet, and other ways to go about it.\n\nYou do not need to complicate it like below. Try to run a timelord. Measure speed. Try out a tip. Measure if faster.\n\nDiscuss and share in [`#mmx-timelord`](https://discord.com/channels/852982773963161650/1026219599311675493) channel on Discord. No requirement to divulge all your secrets. But a good place to get tips, or kickstart new ideas.\n\n:::note[Note]\nOptimize and **overclock at your own risk**.\n:::\n\n### Test Environment\n\n**CPU:** Intel Ultra 200S series, 265K (15th-gen, Arrow Lake)<br>\n**GPU:** Nvidia RTX 4060 Ti 8GB (AD106)<br>\n**OS:** Ubuntu 24.10 (Oracular Oriole)<br>\n**OS:** Windows 10 (22H2)<br>\n**mmx-node:** v1.1.7 (+ [AVX](#optimize-compiler-options-avx-vs-sse42), + [optimized code](#optimize-source-code-architecture))\n\nMost instructions below are transferable to AMD.\n\n### Measuring Speed\n\nTimelord speed is measured in MH/s (million hashes per second).\n\nCurrent blockchain network speed, fastest timelord, is found in NODE / VDF Speed in WebGUI. Your own timelord speed is found under NODE / LOG / TIMELORD tab in WebGUI.\n\nTo make it easier to measure own improvements, baseline numbers, compare with others. It is recommended to measure MH/s speed per 0.1 GHz (**MH/s/0.1GHz**). Yes, absolute speed is the end goal. But timelord speed, at least observed for now, is linear given CPU GHz. A 2-step process is recommended:\n1. Optimize for best possible MH/s/0.1GHz\n2. Clock 1x CPU core as high as possible\n\nIn this case the Intel 15th-gen has had an E-core locked to 3.3 GHz (could be lower/higher, not important). We already know from [TimeLord Predictions](../../../articles/timelord/timelord-predictions/) that E-core is the best option. Not always been so. Previous generations had P-core as best, with hyperthreading and E-cores disabled (more on that [later](#optimize-cpu-speed)). Goal is to make optimization measurements easier and controlled.\n\nIntel 15th-gen (v1.1.7, + [AVX](#optimize-compiler-options-avx-vs-sse42), + [optimized code](#optimize-source-code-architecture)):\n\n| Environment | Measured | Locked Speed | Measured Per Unit |\n| :--- | :--- | :--- | :--- |\n| Ubuntu/gcc14 | 44.60 MH/s | /33 (3.3 GHz) | **1.351** MH/s/0.1GHz |\n| Ubuntu/Clang19 | 44.28 MH/s | /33 (3.3 GHz) | **1.342** MH/s/0.1GHz |\n| Windows/VC++ | 41.49 MH/s | /33 (3.3 GHz) | **1.257** MH/s/0.1GHz |\n\nThese numbers represent absolute speed per 0.1 GHz, given the environment and tuning. Easy to compare against yourself or others. Top speed after that is dependent on how high you can clock 1x CPU core (more on that [later](#optimize-cpu-speed)). In this case, 1x E-core stable at **4.6** GHz, would give a timelord speed of ~**62.2** MH/s.\n\nAs a sidenote. P-core numbers for 12/13/14th-gen Intel gives exact same performance per 0.1 GHz. Basically, no IPC (instructions per clock) uplift for SHA extensions between them (for this specific use-case). But 14th-gen have potential to clock highest.\n\nTesting of AMD Zen4-core (7000-series), and Zen5-core (9000-series) gives **0.755** and **0.715** MH/s/0.1GHz. Yes, a degradation in efficiency. Probably an architectural decision.\n\nIntel's 15th-gen E-cores efficiency increase was a surprise (1.352, vs 0.975 before). Making it the best known choice for now. Previous generations had Intel/AMD much closer (for this specific use-case). In the end, an overclocking race.\n\nFastest timelord speeds observed on testnets (as of **Mar2025**):\n\n| Continuous | Peak |\n| :--- | :--- |\n| ~**74.5** MH/s | ~**75.2** MH/s |\n\n### Linux or Windows\n\nNumbers above, in previous releases and CPU generations, have switched between Linux or Windows binary being fastest. With current source code, Linux (gcc14) looks to have the edge.\n\nInstructions shown in sections below are done on Linux. But most aspects are applicable to Windows too.\n\nLinux distribution and kernel often have an effect on different types of workloads. When it comes to timelord logic, not much observed. Logic for creation of a VDF stream is very small. A few instructions repeated in a CPU core.\n\n### Optimize: Establish defaults\n\nFollow [mmx-node](../../../guides/installation/#building-from-source) build from source installation for Linux (in this case Ubuntu, with default compiler gcc14). Get mmx-node up and running. Enable timelord in WebGUI, or set `true` in `config/local/timelord` file. Find and [lock timelord process thread](#optimize-isolate-thread) to an E-core (`taskset`).\n\nLet it run for a while. Check average speed in NODE / LOG / TIMELORD tab in WebGUI. With this setup:\n\n| Environment | Measured | Locked Speed | Measured Per Unit |\n| :--- | :--- | :--- | :--- |\n| Ubuntu/gcc14 | 43.16 MH/s | /33 (3.3 GHz) | **1.308** MH/s/0.1GHz |\n\n### Optimize: Compiler\n\nCompiler has an effect on how good source code is translated to binary objects. Default for Ubuntu 24.10 is GCC (GNU Compiler Collection), or gcc14. An alternative is Clang (LLVM), or Clang19. There are others. Has varied if Clang or gcc do a better job.\n\nOne way to install, enable and compile with Clang19:\n\n```bash frame=\"none\"\nsudo apt install clang lld libomp-dev\n```\n```bash frame=\"none\"\nexport CC=/usr/bin/clang-19\nexport CPP=/usr/bin/clang-cpp-19\nexport CXX=/usr/bin/clang++-19\nexport LD=/usr/bin/ld.lld-19\n```\n```bash frame=\"none\"\n./clean_all.sh\n./make_devel.sh\n```\n\n:::note[Note]\nYou need to perform `export` statements in terminal environment before compile, or gcc14 will be used.\\\nWhen you switch compiler, or compiler options. Always do `./clean_all.sh` before new compile.\\\nYou will get a lot of unused `-fmax-errors=1` warnings. Just ignore, or remove from compiler options.\n:::\n\nDefault Clang19 compile (`./make_devel.sh`):\n\n| Environment | Measured | Locked Speed | Measured Per Unit |\n| :--- | :--- | :--- | :--- |\n| Ubuntu/Clang19 | 42.95 MH/s | /33 (3.3 GHz) | **1.301** MH/s/0.1GHz |\n\nSmall, but noticeable degrade from gcc14's **1.308** MH/s/0.1GHz. We'll switch back to gcc14 going forward.\n\n### Optimize: Compiler options\n\nCompiler options can have a big effect on how source code is transformed to a binary object. Often focus is on speed vs size. Several options have an effect on timelord logic. Much have been tried with both gcc and Clang.\n\nFor now, gcc14 with default options in `./make_devel.sh` gives best performance.\n\nSome elements to experiment with (`./make_devel.sh`):\n* Switch between `Release` and `RelWithDebInfo` (`-DCMAKE_BUILD_TYPE`)\n* Remove `-fno-omit-frame-pointer` (`-DCMAKE_CXX_FLAGS`)\n* Add `-march=native` (`-DCMAKE_CXX_FLAGS`)\n* Variants of `-O` optimization option (`-DCMAKE_CXX_FLAGS`)\n\nThere are others. Look up optimization in relevant compiler documentation.\n\n:::note[Note]\nWhen you switch compiler, or compiler options. Always do `./clean_all.sh` before new compile.\n:::\n\n### Optimize: Compiler options (AVX vs SSE4.2)\n\nCurrent default compile combines the usage of SHA extensions and SSE4.2 instructions. Raising the SSE4.2 baseline to AVX instructions gives about ~1% boost on 15th-gen Intel. Has to do with compiler using identical AVX versions of certain SSE4.2 instructions. Though, on 11th-gen Intel this looks to degrade performance (better with SSE4.2).\n\nTo implement AVX vs SSE4.2 baseline (`./CMakeLists.txt`):\n\nChange `-msse4.2` to `-mavx` on two lines (Linux compile part):\n```cmake\nset_source_files_properties(src/sha256_ni.cpp PROPERTIES COMPILE_FLAGS \"-mavx -msha\")\nset_source_files_properties(src/sha256_ni_rec.cpp PROPERTIES COMPILE_FLAGS \"-mavx -msha\")\n```\n\nAdd two lines (Windows compile part):\n```cmake\nset_source_files_properties(src/sha256_ni.cpp PROPERTIES COMPILE_FLAGS \"/arch:AVX\")\nset_source_files_properties(src/sha256_ni_rec.cpp PROPERTIES COMPILE_FLAGS \"/arch:AVX\")\n```\n\nEasier to see location in closed [PR#210](https://github.com/madMAx43v3r/mmx-node/pull/210/files) request.\n\nSmall, but real jump from gcc14's **1.308** MH/s/0.1GHz:\n\n| Environment | Measured | Locked Speed | Measured Per Unit |\n| :--- | :--- | :--- | :--- |\n| Ubuntu/gcc14 | 43.58 MH/s | /33 (3.3 GHz) | **1.320** MH/s/0.1GHz |\n\n:::note[Note]\nFor now, official releases will keep having SSE4.2 as baseline.\n:::\n\n### Optimize: Source code\n\nOne thing to be aware of is that we want to optimize a tiny part of whole mmx-node. Even a tiny subset of whole timelord logic. The calculation of a VDF stream. Performed through `hash_t TimeLord::compute(...)` (`/src/TimeLord.cpp`) calling `recursive_sha256_ni(...)` (`/src/sha256_ni_rec.cpp`). We do not care about the rest. As long as this part goes as fast as possible. Unless surrounding elements has an effect. Not observed for now.\n\nThat part of source code is already written to be fast when translated to binary objects by compiler (inline, intrinsics, asm).\n\nSeveral iterations were made for it to [end up like that](https://github.com/voidxno/fast-recursive-sha256/blob/main/OPTIMIZE.md). Still, this is the place to adjust source code if you think there is a way to optimize it even more.\n\nTo illustrate, the following file [sha256_ni_rec_sample.cpp](/resources/code/timelord/optimize/sample/sha256_ni_rec_sample.cpp) contains 5x optimization samples related to static 32 bytes nature of implementation. Intel 15th-gen E-core architecture edition below implements `SAMPLE02` and `SAMPLE04`. If all 5x had been used, reduced effect. Though, would then be possible to remove data for index `8-15` in `K64` array. Independent of that, possible to remove, rearrange variables and order of lines. While still maintaining algorithm.\n\nEnd result is what counts. However you would like the code to look, and what you think works. You are a slave to compiler optimizing code presented. Unless you really want to dig into source code, use architecture edition below.\n\n### Optimize: Source code (architecture)\n\nAlthough current [sha256_ni_rec.cpp](https://raw.githubusercontent.com/madMAx43v3r/mmx-node/refs/heads/master/src/sha256_ni_rec.cpp) is very fast. Not impossible certain CPU architectures could be faster with code organized other ways. Found that out for Intel 15th-gen E-core. Such specific code will not be implemented directly in mmx-node. Making it public here for others to use.\n\n| Architecture | File |\n| :--- | :--- |\n| Intel 15th-gen E-core | [sha256_ni_rec.cpp](/resources/code/timelord/architecture/Intel_15th-gen_E-core/sha256_ni_rec.cpp) |\n\nDownload 15th-gen E-core file, overwrite current in mmx-node installation. Update file timestamp, and compile:\n\n```bash frame=\"none\"\ntouch ./src/sha256_ni_rec.cpp\n./make_devel.sh\n```\n\nReal jump from standard optimized **1.320** MH/s/0.1GHz:\n\n| Environment | Measured | Locked Speed | Measured Per Unit |\n| :--- | :--- | :--- | :--- |\n| Ubuntu/gcc14 | 44.60 MH/s | /33 (3.3 GHz) | **1.351** MH/s/0.1GHz |\n\n### Optimize: Isolate thread\n\nTimelord logic has 1x process thread. It wants 100% of 1x CPU core to calculate VDF stream. Goal is to create an environment that makes this 1x process thread run with high GHz continuously.\n\nOne way, and valid strategy, is to let the OS process scheduler do its job (Linux or Windows). Distribute and use resources as best possible, depending on requirements and state of system. Maybe tune some aspects of OS, together with BIOS adjustments to clock CPU as high as possible. Gives great results. All modern CPUs have logic to boost individual CPU cores in combination with OS scheduler, power management and other logic.\n\nAnother, more manual way, is to dedicate a specific CPU core to the 1x timelord process thread. Locking OS and other processes away from it. In this case an Intel CPU with 8x P-cores, numbered 0 to 7. With E-cores following after that. Going to dedicate E-core 8 to timelord process thread. One way to achieve it (Linux, Ubuntu):\n\n* Force OS process scheduler to not use core 8. Add `isolcpus=8` to `GRUB_CMDLINE_LINUX` (`/etc/default/grub`). Easily observed through `htop` and CPU core utilization.\n* When timelord is up and running, you should have 1x process thread at 99/100% with command name of 'TimeLord':<br>\n`ps -A -T -o tid,comm,pcpu | grep 'TimeLord'`<br>\nYou'll get two entries. Last one is the 99/100% creating VDF stream. Can also find it with `htop`. Let's say it have pid(tid) 5122. Assign it to the isolated CPU core:<br>\n`taskset -cp 8 5122`<br>\nCheck result through `htop`. Should have core 8 at 100% all the time through creation of VDF stream.\n\nAlso possible to isolate several E-cores and assign the process to all of them. Let's say we want a whole E-core cluster, 4x E-cores.\nSyntax becomes `isolcpus=8,9,10,11` and `taskset -cp 8-11 5122`. How OS process scheduler moves, or not, the process around those E-cores. Not sure. Need to experiment yourself.\n\n### Optimize: CPU speed\n\nAt this stage we know what to expect for each 0.1 GHz, **1.351** MH/s. All testing we have observed have given linear increase, given CPU GHz. Now it is time to clock CPU core as high as possible.\n\n:::note[Note]\nOptimize and **overclock at your own risk**.\n:::\n\nFirst a boring observation. Many elements surrounding raw GHz of CPU core have been tested:\n\n* RAM type/speed/latency/bandwidth\n* HyperThreading on/off\n* Virtualization (VT-d)\n* Mitigations (Spectre/Meltdown)\n* CPU cache/ring ratio\n* CPU L1/L2/L3 cache size\n* CPU core-to-core latency\n\nNothing looks to affect timelord speed, except CPU core clock (GHz). Remember, timelord logic for creation of VDF stream is very small. Not much outside a few instructions repeated in a CPU core.\n\nIn previous CPU generations we disabled P-core hyperthreading and the E-cores themselves. Was no penalty observed on timelord speed. Less complications, more overclocking potential. In this case, if motherboard supports it. Manually clock P-cores lower (GHz), and as high as possible for E-core(s).\n\nNow it is a game of getting highest possible GHz, while keeping CPU cool and stable.\n\n### Optimize: CPU speed (Intel 15th-gen)\n\nCurrently it looks like E-cores on Intel's 15th-gen are able to overlock to between 5.3 to 5.5 GHz. Depending on luck of draw of CPU quality. Tough, are **strong indications of rapid silicon degradation** at those speeds.\n\nYOU need to decide if worth it. **Overclock at your own risk, CPU can degrade**.\n\n## Fastest TimeLord\n\nOn-chain timelord rewards was introduced with testnet10, and further refined with mainnet-rc (release candidate). Now part of blockchain logic. Before that, a temporary centralized solution existed.\n\nHow do you know if you are fastest timelord. Ultimate indicator is very easy. You have a wallet address set up as 'TimeLord Reward Address' in SETTINGS in WebGUI. Timelord rewards will show up as `0.2 MMX` of type `VDF_REWARD`, every 20th block (...00,20,40,60,80).\n\nOvertaking as fastest timelord is not instant. Unless current fastest timelord outright stops, crashes, or new one is faster by a good margin. Your timelord starts behind because of network and verify VDF latency. Not easy to quantify given internet itself, other nodes and decentralized logic. Will help having a fast VDF verify (GPU). Is where your timelord starts calculating its VDF stream from.\n\nStill early days. We do not know yet how people will evaluate risk, cost and rewards for running fastest timelord. Run fast, crash often and degrade CPU. Or at the edge, still stable, taking over when fastest crash.  Will pattern stabilize, or be random.\n\n### Optimize: VDF verify (GPU)\n\nThis article is mostly about optimizing your local timelord speed, VDF create on CPU. From whitepaper (quote):\n> _In the best case, the latency to receive a block is around 100 ms. While the fastest VDF verification is currently around 200 ms, using 40 series NVIDIA GPUs with high clocks. That means a timelord trying to gain the lead would have to be around 3% faster._\n\nAs told, many variables in play. Network latency, node reputation, so on. **Another aspect you can optimize locally** is **latency of VDF verify**. Get it as low as possible. For a reference, my RTX 4060 Ti, with fastest timelord at ~72.5 MH/s. Have ~0.257 sec VDF verify.\n\n## Feedback\n\nPlease contradict findings above, or tell of new ones. Use [`#mmx-timelord`](https://discord.com/channels/852982773963161650/1026219599311675493) channel on Discord.\n"
  },
  {
    "path": "docs/src/content/docs/articles/timelord/timelord-predictions.md",
    "content": "---\ntitle: TimeLord Predictions\ndescription: State and predictions of MMX timelord speeds\nprev: false\nnext: false\n\narticlePublished: 2023-10-05\narticleUpdated: 2025-03-17\n\nauthorName: voidxno\nauthorPicture: https://avatars.githubusercontent.com/u/53347890?s=200\nauthorURL: https://github.com/voidxno\n---\n\nCurrent state and predictions of MMX TimeLord speeds. Fun reading the future, and [failing](https://discord.com/channels/852982773963161650/1026219599311675493/1307377841070932009) spectacularly.\n\nIf needed, read [TimeLord Optimizations](../../../articles/timelord/timelord-optimizations/) for technical background and elements of [timelord logic](../../../articles/timelord/timelord-optimizations/#logic).\n\nRunning a timelord is optional (default is disabled). Not needed to run a fully functional node. Blockchain, as a whole, only need one active timelord to move forward. A few more, spread around, is preferred for redundancy and security. Do not need to be fastest.\n\n## TLDR;\n\nFastest timelord predictions (as of **Mar2025**):\n\n- Contenders: Intel/AMD CPUs with SHA extensions\n- Observed: ~**74.5** MH/s (continuous)\n- Observed: ~**75.2** MH/s (peak)\n- Future: ~**71-77** MH/s (2025)\n\n## Contenders\n\nCurrent contenders for fastest timelord are Intel/AMD CPUs with SHA extensions. Why not GPU/FPGA/ASIC, [read here](../../../articles/timelord/timelord-optimizations/#why-not-gpufpgaasic). Always a possibility of something hidden out there, not observed yet.\n\nTwo elements decide speed of timelord:\n- CPU core efficiency (MH/s per 0.1 GHz)\n- CPU core clock speed (running GHz)\n\nLeaves us with newest Intel/AMD CPUs that can clock 1x core the highest:\n- Intel Ultra 200S series (15th-gen, Arrow Lake)\n- AMD Ryzen 7000/9000 series (Zen 4/5)\n\n:::note[Note]\n[eBACS](https://bench.cr.yp.to) have [SHA256 efficiency benchmarks](https://bench.cr.yp.to/impl-hashblocks/sha256.html) for different CPU architectures with SHA extensions (dolbeau/amd64-sha).\n:::\n\n## Today (Mar2025)\n\nTo illustrate, ignoring overclocking, using max single-core boost from specifications.\n\nIntel (E-core):\n| | MH/s/0.1GHz | Max boost | TimeLord | Release |\n| :--- | :--- | :--- | :--- | :--- |\n| 12900KS (E-core) | ~**0.975** | 4.0 GHz | **39.0** MH/s | Nov2021 |\n| 13900KS (E-core) | ~**0.975** | 4.3 GHz | **41.9** MH/s | Sep2022 |\n| 14900KS (E-core) | ~**0.975** | 4.5 GHz | **43.9** MH/s | Oct2023 |\n| 285K (E-core) | ~**1.350** | 4.6 GHz | **62.1** MH/s | Oct2024 |\n\nIntel (P-core):\n| | MH/s/0.1GHz | Max boost | TimeLord | Release |\n| :--- | :--- | :--- | :--- | :--- |\n| 12900KS (P-core) | ~**0.705** | 5.5 GHz | **38.8** MH/s | Nov2021 |\n| 13900KS (P-core) | ~**0.705** | 6.0 GHz | **42.3** MH/s | Sep2022 |\n| 14900KS (P-core) | ~**0.705** | 6.2 GHz | **43.7** MH/s | Oct2023 |\n| 285K (P-core) | ~**0.905** | 5.7 GHz | **51.5** MH/s | Oct2024 |\n\nAMD (Zen4, Zen5):\n| | MH/s/0.1GHz | Max boost | TimeLord | Release |\n| :--- | :--- | :--- | :--- | :--- |\n| 5950X (Zen4-core) | ~**0.755** | 4.9 GHz | **37.0** MH/s | Nov2020 |\n| 7950X (Zen4-core) | ~**0.755** | 5.7 GHz | **43.0** MH/s | Sep2022 |\n| 9950X (Zen5-core) | ~**0.715** | 5.7 GHz | **40.8** MH/s | Aug2024 |\n\nIn reality, will need to clock 1x core as high as possible (GHz). Keep it there, stable, cool it, 100% load, 24/7.\n\nA lot is up to cooling commitment, together with luck of draw on CPU silicon quality. With segmentation and binning done directly by Intel/AMD these days (product SKUs). Top-end SKUs, like Intel KS editions, do not give much headroom. Except if exotic cooling, like LN2 (liquid nitrogen).\n\nObserved: ~**74.5** MH/s (continuous)\n\n## Future (2025)\n\nNext interesting CPU architecture and node developments:\n- Intel: Nova Lake (_tbd_, Desktop)\n- AMD: Zen 6 (_tbd_, Desktop)\n\nBoth Intel and AMD are cagey about real information on future CPU generations, up-to and including release.\n\nMost relevant for timelord:\n- CPU core efficiency (MH/s per 0.1 GHz)\n- CPU core clock speed (running GHz)\n\nPrevious changes in CPU architecture have shown that efficiency for SHA extensions usually change for the better (SHA256 calculations per 0.1 GHz). Intel's 285K E-core (1.350) efficiency increase compared to 14900KS E-core (0.975) was a [surprise](https://discord.com/channels/852982773963161650/1026219599311675493/1307377841070932009). Existing E-core efficiency (0.975) vs P-cores (0.705) was already best in class.\n\nIncrease is not a given though. Measurements of Zen5-core (0.715) SHA extensions efficiency are lower than Zen4-core (0.755). Probably an architectural decision.\n\nDigital circuits have physical limits with trade-offs between CPU cycles needed and max clock frequency. There is a reason why P-cores have higher boost clock (5.7 GHz) than E-cores (4.6 GHz). But at the same time SHA extensions efficiency are lower for P-cores (0.905) vs E-cores (1.350).\n\nNew desktop CPU architectures are not planned for release by Intel or AMD in 2025. Might get refreshes with somewhat higher clocks, but standstill on IPC and SHA extensions efficiency.\n\nEven when we get new desktop CPU architectures in future (Nova Lake, Zen 6). Efficiency will be a question of physical limits depending on architecture and node. After that, what CPU clock speed is possible.\n\nWith a starting point of ~62 MH/s for Intel 285K (E-core, 4.6 GHz). Possible CPU refreshes and overclock cooling. Up to 20% on top of starting point through 2025.\n\nPrediction: ~**71-77** MH/s (continuous)\n\n## Uncertainties (peaks)\n\nIt is possible we will get short peaks of someone running a timelord with exotic cooling. Trying to make a record timelord speed until CPU crashes, or empty of LN2 (liquid nitrogen).\n\nOne way to guestimate is to browse [HWBOT](https://hwbot.org/hardware/processors) Geekbench6 [single](https://hwbot.org/benchmark/geekbench6_-_single_core/) and [multi-core](https://hwbot.org/benchmark/geekbench6_-_multi_core/) records.\n\nProblem is getting E-core only overclocks for Intel 285K. We have P-core at about 7.0 GHz (single). A few internet mentions looks to have E-core overclock limit/wall around 5.5 GHz. These are usually records done with LN2 cooling. Just enough to run the benchmark.\n\nFor some reason Intel looks to have left more overclock headroom on E-cores than usual. Observed timelords have probably reached 5.5 GHz. With the benefit of doubt, say someone manages to run **Intel 285K P-cores at 7.0 GHz** or **E-cores at 5.7 GHz**. Results: **63.3** and **77.0** MH/s.\n\nMore probable with continuous timelord speeds mentioned above.\n\n## Feedback\n\nOther angles on topic above. Share on [`#mmx-timelord`](https://discord.com/channels/852982773963161650/1026219599311675493) or [`#mmx-farming`](https://discord.com/channels/852982773963161650/853417165980827657) channels on Discord.\n"
  },
  {
    "path": "docs/src/content/docs/articles/wallets/wallets-mnemonic-passphrase.md",
    "content": "---\ntitle: Wallets, mnemonic and passphrase\ndescription: A look at MMX wallets, mnemonic and passphrase\nprev: false\nnext: false\n\narticlePublished: 2024-07-08\narticleUpdated: 2025-01-30\n\nauthorName: voidxno\nauthorPicture: https://avatars.githubusercontent.com/u/53347890?s=200\nauthorURL: https://github.com/voidxno\n---\n\nA look at MMX wallets, mnemonic and passphrase.\n\n:::note[Important]\nMy own understanding, using mmx-node. I take no responsibility for content. When it comes to crypto and wallets, _YOU_ need to educate yourself. As always, _NEVER_ share your mnemonic or passphrase with others.\n:::\n\n## TLDR;\n\n- **BACKUP** (securely) both **24-words mnemonic** AND **passphrase** (if used)\n- **NEVER share** your **mnemonic** or **passphrase** with others\n- Passphrase is not a global lock password for all your wallets\n- Passphrase is local to, and part of the wallet you created\n- Passphrase is optional, works like the 25th word of mnemonic\n- Identical 24-words mnemonic, with/without passphrase, are different wallets\n- **Take security seriously** (look [Security](#security))\n- Public farmer key is not affected by passphrase (look [Farming](#farming))\n- Evaluate what farmer reward address is set to (look [Farming](#farming))\n- If using other addresses than main one for wallet (look [Addresses](#addresses))\n\nWallet is [ECDSA](https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm) based, with [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) functionality. Built with tried and tested elements from Bitcoin wallet.\n\n## Backup\n\nAs long as you **backup** (securely), in some way, the **24-words mnemonic** and **passphrase** (if used). You will always be able to recreate wallet. Only information needed.\n\nAlso recommended to **note** the **finger\\_print** and main **address** of wallet (Index[0]). Easy indicators to make sure you recreated the correct wallet with backup information.\n\n:::caution[Important]\nPerform the two steps above, and you will always be able to recreate and verify wallet.\n:::\n\n## HowTo\n\nLook [Find elements](#find-elements) on how to find information above.\n\nYou can also backup (securely), the `.dat` file, that represents the wallet. Not really needed. The 24-words mnemonic and passphrase (if used), are enough to recreate wallet. Also, if wallet was created with a passphrase. You still need passphrase to access wallet, in addition to `.dat` file.\n\n:::tip[Tip]\nTopics in this article can be tricky to get a grip on. Try asking an LLM chatbot about _\"BIP39 wallet standard\"_, _\"mnemonic\"_ and _\"passphrase\"_. Converse, and you might get answers with angles that works better for you.\n:::\n\n## Mnemonic\n\n:::note[Note]\nIgnoring optional passphrase for now (25th word), that is next section.\n:::\n\nThe 24-words mnemonic is a user friendly way to represent the raw binary hexadecimals seed value for wallet ([BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)).\n\nAnother angle: It is the absolute secret that both creates and gives full access to wallet.\n\nWhen you create a wallet, you have two options:\n- Specify existing 24-words mnemonic, and recreate an existing wallet.\n- Don't specify 24-words mnemonic, get a new wallet created, with new random generated 24-words mnemonic.\n\n## Passphrase\n\nThis element causes some confusion. It is just MMX utilizing the [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) standard in the way it is defined. Nothing more, nothing less.\n\nBut the simple logic behind BIP39 gives a few use-cases. Depending on your creativity.\n\nTechnically, not complicated:\n- Wallet (no passphrase): mnemonic = secret seed (and a unique wallet)\n- Wallet (with passphrase): mnemonic + passphrase = secret seed (and a unique wallet)\n\nTwo 100% unique wallets above, even if identical 24-words mnemonic. Seed will be different, finger\\_print will be different, main address (Index[0]) will be different.\n\nLook at passphrase as the optional 25th word, that you need to type in each time you want to perform actions with wallet.\n\nMost important. If you use a passphrase on one of your wallets. You MUST backup that passphrase, in addition to the 24-words mnemonic. Without you will not be able to recreate that wallet. MMX is not storing that passphrase anywhere. Only thing stored in wallet `.dat` file is the 24-words mnemonic. Which is why passphrase is kind of looked at as password for wallet.\n\nTwo consequences of BIP39 simplicity:\n- Not possible: Add a passphrase to an existing wallet without passphrase.\n- Not possible: Change passphrase of an existing wallet with passphrase.\n- Why: Passphrase (25th word) is a static part of wallet secret.\n- Solution (both cases): Create a new wallet with existing 24-words mnemonic and new passphrase. This will be a 100% new unique wallet. Then transfer your funds from old to new wallet. Which are two totally independent wallets. Just sharing the same 24-words mnemonic.\n\nSome use-cases:\n- Enhancing security with extra layer on top of 24-words mnemonic.\n- Have different wallets with same mnemonic, but different passphrases.\n- Separate funds, hidden wallets, threat scenario, different passphrases.\n\n## Security\n\nYOUR responsibility. Too broad of a topic. A few facts:\n- 24-words mnemonic: Stored in wallet `.dat` file on disk (file itself not encrypted)\n- Passphrase: Never stored anywhere on disk (only temporary in memory, when used)\n\nFull access to a wallet:\n- Wallet (no passphrase): Only need 24-words mnemonic (i.e., `.dat` file)\n- Wallet (with passphrase): Need both 24-words mnemonic and passphrase\n\nConsider:\n- Evaluate using passphrase for better security.\n- Risk of unauthorized access to wallet `.dat` files.\n- Use of cold wallets, not all wallets have to be active.\n- Send rewards or other funds to cold wallet addresses.\n\nUltimately. Your responsibility how you store, use, and arrange wallets.\n\n## Farming\n\n### Farmer Public Key\n\nYou create plots with a `farmer_public_key` (66 chars) from a wallet. This wallet needs to be present on mmx-node to farm those plots.\n\nIn relation to wallets, `farmer_public_key` can create some confusion. Both statements are true:\n- Identical 24-words mnemonic, with/without passphrase, gives **identical** `farmer_public_key`\n- Identical 24-words mnemonic, with/without passphrase, are **different wallets**\n\nLogic:\n- `farmer_public_key` is created from 24-words mnemonic + a fixed passphrase (\"`MMX/farmer_keys`\").\n- Independent of wallet having a passphrase, or not.\n\nDone this way on purpose. No compromise on security. Makes it possible for mmx-node to start farming, even if wallet has passphrase. No waiting for user input of passphrase on startup. Pragmatic choice to make farming as seamless as possible.\n\nYou will never generate identical 24-words mnemonic as another user. Primary purpose of passphrase is extra security, not better randomness.\n\n### Farmer Reward Address\n\nCan argue a farming wallet created without passphrase and getting rewards, is an issue. The `.dat` file of that wallet is enough to access reward funds. Still need access to file though. An operational choice, totally avoidable. If wanted.\n\nFarmer Reward Address (SETTINGS), can be set to any wallet address. Until set, mmx-node defaults to main address (Index[0]) of first wallet created. Which often is your farming wallet, usually without a passphrase.\n\nMake it a non-issue:\n- Create a new farming wallet, same 24-words mnemonic, now with a passphrase:\n  - This becomes a new unique wallet, with a new main address.\n  - Send rewards to new main address, that you need passphrase to access.\n  - Plots still farming, because of `farmer_public_key` logic above.\n- Or, set reward address yourself to another cold wallet (best practice).\n\nMost important. Double-check that Farmer Reward Address (SETTINGS) is set to what you want and expect. Security and access to wallet controlling that address is up to you.\n\n## Addresses\n\nOne wallet can have more than one address. When creating a wallet, default is 1 for Number of Addresses. Was 100 in earlier mmx-node releases. You can still set it to 100, or another number. Totally ok, no problem.\n\nRationale:\n- Easier for most users to operate with one wallet equals one address.\n- Memo functionality can eliminate need of multiple addresses in most cases.\n\nWhen you recreate a wallet, addresses will be identical to first time you create it. They are unique for your wallet, ordered identically. Independent of how many you choose to be shown.\n\nBe aware of ('missing' funds):\n- No problem sending funds to other index addresses than main one (Index[0]).\n- If wallet recreated with 1 as number of addresses, will not see those funds.\n\nYour wallet is still key to control all those Index[x] addresses. But wallet will only enumerate number of addresses it was specified with.\n\nSo, if missing funds on a wallet. Make sure it is not issue above, by recreating wallet with at least number of addresses that have seen activity.\n\n## Account Index\n\n:::note[Note]\nOnly an explanation that accounts within a wallet technically exists. Not needed in normal usage.\n:::\n\nThe 'Account' word can mislead in this context. Each wallet listed in WebGUI are also 'Accounts'. What we are talking about here is 'Account Index' **within a wallet**.\n\nNot to be confused with the `account` index number assigned to a wallet starting at `Wallet #100` (or `#0` if `wallet.dat`). That is just a counter with no significance. Only for mmx-node itself to number the wallets it finds in `Wallet.json`.\n\nAccount Index here is the `index` property assigned to `0` (default), on each wallet created by mmx-node. Written as `\"index\": 0,` on each wallet entry in `Wallet.json`. That property has an effect of generating a unique set of addresses for that wallet. Or more specifically, that wallets account index.\n\nUnless you have a very specific need of this logic. Ignore it, let it stay at `0` (default).\n\n## .dat files\n\nWallet `.dat` files are stored at following locations:\n- Linux: `/mmx-node/` `wallet_<fingerprint>.dat`\n- Windows: `C:\\Users\\<user>\\.mmx\\` `wallet_<fingerprint>.dat`\n\nContains the binary version of 24-words mnemonic for each wallet.\n\nCan be named only `wallet.dat` if created through CLI interface, or older version of mmx-node. Will be `Wallet #0`, vs others who starts at `#100`. Used as any other wallet.\n\nIt does not hurt to backup them, but you still need passphrase in addition (if used). Look [Backup](#backup) and [HowTo](#howto).\n\nThere is also `info_<fingerprint>.dat` files. Cached non-sensitive information about passphrased wallets:\n- Linux: `/mmx-node/testnet12/wallet/` `info_<fingerprint>.dat`\n- Windows: `C:\\Users\\<user>\\.mmx\\testnet12\\wallet\\` `info_<fingerprint>.dat`\n\nGenerated for wallets with passphrase on first unlock. Used by mmx-node to get addresses for a wallet with passphrase. Without unlocking it.\n\nCan check contents of file yourself (Linux):\n- `vnxread -f /mmx-node/testnet12/wallet/info_<fingerprint>.dat`\n\n## Find elements\n\nHow to find key wallet elements above using WebGUI.\n\n### &#x1F50D; Wallets\n\nListed under main WALLET tab. No global master wallet logic. A flat list of independent wallets:\n- Wallet #xxx: Just a counter, nothing of significance.\n- Address of wallet: Main address of wallet (Index[0]).\n- Account Name of wallet: If named when created.\n\nEach wallet has tabs for info and operations. Most important here (to the right):\n- INFO\n- Settings (option wheel symbol)\n\n### &#x1F50D; Mnemonic (24-words)\n\nNavigate to the Settings (option wheel symbol) tab for wallet in question:\n- Press SHOW SEED button\n\nCopy/paste or write down the 24-words mnemonic. Remember to get the order of words correct.\n\nLook [Mnemonic](#mnemonic) section for information about what it represents.\n\n### &#x1F50D; Passphrase\n\nNot stored anywhere by mmx-node. Important information you must remember yourself, or store securely.\n\nLook [Passphrase](#passphrase) section for information about what it represents.\n\n### &#x1F50D; finger_print & address\n\nNavigate to the INFO tab for wallet in question:\n- address: Main address of wallet (Index[0])\n- finger_print: Unique 32-bit fingerprint value for wallet\n\nEither one is a good indicator to know if you have recreated correct wallet.\n\nLook [Backup](#backup) section for why you should also save this information.\n\n## Feedback\n\nMore questions, or wrong info above. Use [`#mmx-general`](https://discord.com/channels/852982773963161650/925017012235817042) or [`#mmx-support`](https://discord.com/channels/852982773963161650/853021000135475270) channel on Discord.\n"
  },
  {
    "path": "docs/src/content/docs/faq/general.md",
    "content": "---\ntitle: General FAQ\ndescription: Frequently asked questions about MMX blockchain.\n---\n\n### What is the MMX blockchain?\n\nIn-depth technical, read [whitepaper](../../../articles/general/mmx-whitepaper/).\\\nTechnical breakdown, read [reference](../../../reference/blockchain/).\\\nLight introduction, read [article](../../../articles/general/mmx-tldr/).\n\n### How much MMX per block reward?\n\nUsually around 0.5 MMX + transaction fees.\n\nTo get the full picture. Read about Dynamic Supply, Reward Control Loop and Minimum Block Reward in [whitepaper](../../../articles/general/mmx-whitepaper/).\n\n### How much MMX for a given TB farm?\n\nFormula (simplified):\\\n`(farmTB / netspacePB) * 4.32` = MMX (per day)\n\nExample (250TB farm, Netspace 170PB):\\\n`(250 / 170) * 4.32` = ~6.35 MMX (per day)\n\nFormula (expanded):\\\n`(farmTB / (netspacePB * 1000)) * (8640 blocks per day * 0.5 MMX)`\n\n:::note[Note]\nFind current Netspace in [MMXplorer](https://mmxplorer.com/dashboard). Calculations above gives average blocks won per day, multiplied by 0.5 MMX. That [block reward](#how-much-mmx-per-block-reward) can vary.\n:::\n\n### Is MMX a fork of Chia?\n\nNo.\n\nMore info in light [article](../../../articles/general/mmx-tldr/), technical [reference](../../../reference/blockchain/), or [whitepaper](../../../articles/general/mmx-whitepaper/). Most Chia forks copies nearly 100% of its codebase, with a few edits. In contrast, MMX is written from scratch by Max in C++ code.\n\nBoth are Proof of Space blockchains. And yes, MMX reuse and enhance some core logic from Chia. Everything else is programming and design choices by Max to create MMX as the most performant and feature rich Proof of Space blockchain.\n\n### Can I farm MMX with Chia plots?\n\nNo.\n\nMMX was written from scratch by Max. He also reworked plot format to make it orders of magnitude more resistant to compression techniques that hit Chia.\n\nFor an introduction to MMX plot format, read this [article](../../../articles/plotting/plot-format/).\n\n### Will Chia's new plot format affect MMX?\n\nNo.\n\nChia is planning a future hard fork with a new plot format. Making current Chia plots incompatible over time, forcing a replot.\n\nWill not affect MMX plots. MMX already made a similar move with a [new plot format](../../../articles/plotting/plot-format/) in testnet11. Every plot created after that is compatible with current mainnet. MMX plots have their own design, unaffected by changes in Chia.\n\n### Is there a pre-farm?\n\nNo pre-farm, no pre-mine, no VC funded development.\n\nWhat was were 100% open and communicated incentivized testnets. Starting with testnet8, to reward community providing a realistic environment through initial development.\n\nList of incentivized testnets rewards are all public on GitHub ([testnet8/rewards.txt](https://github.com/madMAx43v3r/mmx-node/blob/master/data/testnet8/rewards.txt), [data](https://github.com/madMAx43v3r/mmx-node/blob/master/data)). Used to create mainnet genesis. No hidden pre-mine written into it, only community incentivized rewards.\n\nAs a sidenote, developers had less than 1% of netspace through testnets. All covered in [whitepaper](../../../articles/general/mmx-whitepaper/). Including testnet rewards, written into mainnet genesis. Over 99% of it to community farmers.\n\n:::note[Note]\nDefinition of pre-farm will always be contentious. If comparing or arguing facts above. Also include context, volume, spread, who owns/controls. It should all be scaled and weighted, to get a fair picture.\n:::\n\n### Is there a dev fee?\n\nThere is a project funding fee.\n\nIt is a 1% fee on *transaction fees*, <ins>not block reward</ins>. To fund continued development of MMX. More nuances to how it works, read Project Funding section of [whitepaper](../../../articles/general/mmx-whitepaper/).\n\n### Can I help by donating to MMX?\n\nYes. Separate from the project funding fee, Max has set up a donation address ([news post](https://discord.com/channels/852982773963161650/926566475249106974/1349043326032150538)):\\\n`mmx12wa6h5j7nh9djc0hjqva8ke4m5zgfxjy3dvsj7n9kcrj3luhpyhqx93uud` ([view](https://explore.mmx.network/#/explore/address/mmx12wa6h5j7nh9djc0hjqva8ke4m5zgfxjy3dvsj7n9kcrj3luhpyhqx93uud))\n\n- To help with exchange listings, marketing, bug bounty, etc\n\nDonated funds will not be sold now. But rather used as liquidity, bug bounty rewards, or sold later at higher price.\n\n### What is the burn address of MMX?\n\nBurn address of MMX:\\\n`mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev`\n\nThis is the zero/null address that no one controls, and no private key exists. Any MMX or other assets sent to this address are not retrievable, gone forever. Or 'burned' as it is often referenced.\n\n### Where can I find MMX branding assets?\n\nGo to [mmx-assets](https://github.com/madMAx43v3r/mmx-assets) repository. Basic info, logo and assets folders:\n- [`/logo/artwork/`](https://github.com/madMAx43v3r/mmx-assets/tree/master/logo/artwork/) _(artwork)_\n- [`/logo/assets/`](https://github.com/madMAx43v3r/mmx-assets/tree/master/logo/assets/) _(misc)_\n- [`/logo/raster/`](https://github.com/madMAx43v3r/mmx-assets/tree/master/logo/raster/) _(.png)_\n- [`/logo/vector/`](https://github.com/madMAx43v3r/mmx-assets/tree/master/logo/vector/) _(.svg)_\n"
  },
  {
    "path": "docs/src/content/docs/faq/node.md",
    "content": "---\ntitle: Node FAQ\ndescription: Frequently asked questions about MMX node.\n---\n\n### How do I get started with a node\n\n[Download and install](../../../guides/installation/), then [get started](../../../guides/getting-started/).\n\n### \"Faulting module\" in Windows\n\nMake sure you have latest Microsoft Visual C++ Redist installed:\n- [Microsoft Visual C++ Redistributable](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist)\n- [Microsoft Visual C++ Redistributable for Visual Studio](https://visualstudio.microsoft.com/downloads/)\n\n### High CPU usage, even synced\n\nI'm getting high CPU usage, even when my node is synced to latest blockchain height.\n\nMake sure you are performing VDF verification [with GPU/iGPU](../../../guides/optimize-vdf/) (more info in [VDF FAQ](../../../faq/vdf/)).\n\nOn Linux make sure user has access to GPU/iGPU through  the `video` and or `render` groups:\n```bash frame=\"none\"\nsudo adduser $USER video\nsudo adduser $USER render\n```\n\nCheck if [timelord](#how-do-i-disable-timelord) has been enabled by accident.\n\n### How do I disable timelord?\n\nTimelord should be [disabled by default](../../../faq/timelord/). You can check if it is enabled by looking under SETTINGS in WebGUI. Or check the `config/local/timelord` file.\n\n### What is VDF height?\n\nI see two different heights for blocks, both in logs and block explorer. Which is right?\n\nBoth. Each block in MMX has two heights:\n- Block `Height` (always the lower value, Network Height)\n- `VDF Height` (always the higher value)\n\nIn nearly all cases, block height is what is relevant for normal usage.\n\nA block is prepared by timelord every 10 sec, and given an VDF height.\n\nAbout 2% of the time a non-TX block is the result, because of no winning proof. In that case VDF height still increases, but block height stands still. Chain will still adjust itself to 8640 blocks each day, with ~10 sec block interval.\n\nCan look at block height as the 'public facing' height, while VDF height is an 'internal clock' height.\n\nOne example of VDF height usage is FARMER / PROOF tab. You submit proofs that passed plot filter to an VDF height. Block height is unknown at this point. It will depend on potential non-TX blocks before it becomes a block in chain. If your proof [was best](../../../faq/node/#a-plot-with-lower-score-won-the-block), it will be listed with block height under FARMER / BLOCKS tab. Can be tricky to correlate at times.\n\n[Time Calculator](../../../tools/time-calculator/) can help show the relation, and lookup or estimate time and date for heights.\n\n### Warning when using mmx CLI command\n\nI'm getting a warning when trying one of the `mmx ...` commands:\\\n`[Proxy] WARN: connect() failed with: xxx (localhost:1133x)`\n\nMake sure node is running. Except `mmx wallet create`, all other commands require node running.\n\nIn Windows, start the MMX CMD shortcut from Start Menu.\\\nIf Linux binary package, enough to open a terminal.\n\nIf compiled from source on Linux (before using CLI commands):\n```bash frame=\"none\"\ncd mmx-node\nsource ./activate.sh\n```\n\n### List of mmx CLI commands\n\nOverview of [CLI commands](../../../software/cli-commands/).\n\n### How is network difficulty calculated?\n\nLook Blockhain and Challenge Generation sections of [whitepaper](../../../articles/general/mmx-whitepaper/).\n\n### How do I start farming plots created?\n\nI've just created some plots. How do I start farming them?\n\nThrough SETTINGS in WebGUI, you have a Plot Directory input field below the Harvester section. Input the directory with the plots you have created, press ADD DIRECTORY button.\n\nAlternatively you can edit the `config/local/Harvester.json` file:\n```json\n{\n  \"num_threads\": 32,\n  \"recursive_search\": true,\n  \"reload_interval\": 3600,\n  \"plot_dirs\": [\n    \"E:/MMXplots/\",\n    \"F:/MMXplots/\",\n    \"/mnt/Harddisk123/MMXplots/\",\n    \"/mnt/Harddisk456/MMXplots/\"\n  ]\n}\n```\n\nOnly use forward slash `/`, even if Windows. Last entry is not followed by a comma `,`.\n\n### A plot with lower score won the block?\n\nScore indicates how close your plot has proofs for the challenge. The lower the score, the better the proof.\n\n### Do I need to open ports to communicate?\n\nNot really. But you will help the network by allowing incoming connection. If possible, enable port forwarding on `11337` (TCP).\n\nPer-default, automatic UPnP port forwarding is enabled. You can disable it through SETTINGS in WebGUI. Or set `\"open_port\": false,` in `config/local/Router.json` file.\n\n### How do I set up remote harvesters?\n\nI've got several computers. Full node on one, and a few remote harvesters. How do I set them up?\n\nLook [Remote Services](../../../guides/remote-services/) guide.\n\n### My node says it has forked from network\n\nShould rarely happen with mainnet. If forked, and not automatically getting back to synced. You can try to revert DB to a height about 1000 blocks before node got stuck.\n\nThrough SETTINGS in WebGUI, try the `Revert DB to height` option.\\\nIf using CLI, try the `mmx node revert <height>` command.\n\n### I suspect my DB is corrupted\n\n:::note[Note]\nMake sure you really want to try syncing from scratch. Will take some time\n:::\n\n:::danger[Warning]\nMake sure you only delete the DB directory. Not directories with important information like wallets, which you already should have [secure backups](../../../articles/wallets/wallets-mnemonic-passphrase/#backup) of.\n:::\n\nTo force a 100% sync from scratch. Stop the node, delete following directory:\n- Windows: `C:\\Users\\<user>\\.mmx\\mainnet\\db\\`\n- Linux: `~/.mmx/mainnet/db/`\n- Linux: `~/mmx-node/mainnet/db/`\n\nStart the node again. A clean sync will start from height 0.\n\n### \"Warning! UnhandledException\" in Windows\n\nIf starting MMX Node fails with a `Warning! UnhandledException` dialog box, containing `user.config`, `value 0x00`, `invalid character`, `Line 9`, `position 1`. Try the following:\n- Restart Windows, to make sure no hanging MMX Node processes\n- Navigate to: `C:\\Users\\<user>\\AppData\\Local\\madMAx43v3r\\MmxGui.exe_Url_xxx\\0.0.0.0\\`\n- Rename `user.config` file to `_backup01_user.config` (just in case)\n- Start MMX Node, new `user.config` created\n\nFile only contains Windows GUI app specific configuration. If fixed, go through Windows specific options in MMX Node and check that ok. Probable cause for this looks to be unclean shutdown of MMX Node, corrupting file. Maybe a Windows bluescreen.\n\n### \"CUDA failed\" messages\n\nIf you get `CUDA failed` in logs, maybe with `Proof verification failed`. MMX Node has problems interfacing with the Nvidia CUDA library on your OS.\n\nMMX Node will try to use CUDA (Nvidia GPU) for farming and proof verify, if present. For VDF verify it tries to use OpenCL (NVidia/AMD/Intel GPU). Both will fallback to CPU if not present.\n\nIf problems with CUDA, try to disable it under SETTINGS in WebGUI (CUDA / Enable CUDA compute). Or set `\"enable\": false,` in `config/local/cuda.json` file.\n\nYou can also try to update or match other versions of CUDA platform on your OS. The interface between compiled programs and CUDA versions are fickle.\n\nIn most cases farming and proof verify is light work for a CPU. Unless you have a very large farm, or too high compression on your plots.\n"
  },
  {
    "path": "docs/src/content/docs/faq/plotting.md",
    "content": "---\ntitle: Plotting FAQ\ndescription: Frequently asked questions about MMX plotting.\n---\n\n### What plot sizes are supported?\n\nFrom k29 to k32. Average sizes below, with C0 compression (0%).\n\n| | `k29` | `k30` | `k31` | `k32` |\n| :--- | :--- | :--- | :--- | :--- |\n| `hdd` | 36.4 GiB | 75.2 GiB | 155.3 GiB | 320.4 GiB |\n| `sdd` | 14.7 GiB | 30.3 GiB |  62.3 GiB | 128.4 GiB |\n\nArticles with intro on MMX [plot format](../../../articles/plotting/plot-format/), and details on [plot size](../../../articles/plotting/plot-size/).\n\n### Difference between HDD and SSD-plots?\n\nBoth are just `.plot` files you store somewhere and farm. Per-default named:\n```bash frame=\"none\"\nplot-mmx-hdd-kxx-cx-<plotid>.plot\nplot-mmx-ssd-kxx-cx-<plotid>.plot\n```\n\nDifference is that SSD-plots are a type of pre-compressed plots, missing hashes. Reconstructed on-the-fly when farming, but requires very high disk IOPS. Storing them on regular spinning HDD will not work. It balances cost/reward potential between SSD and HDD storage (2.5x SSD advantage, but more expensive media).\n\nGiven identical k-size, SSD-plots has same effective space on network as HDD-plots.\n\nRecommended to use C0 for compression (0%) on SSD-plots, because of the high IOPS.\n\n### What k-size and C-compression should I plot?\n\nThat depends on your hardware. Minimum k-size of k29 requires 64GB to plot all in RAM. If you only have 32GB RAM and large/fast NVMe, you can try plotting with partial RAM. Or you can disk plot k32. If you have 128GB or 256GB RAM, you should try to plot the largest k-size possible (k30, k31, all in RAM).\n\nWith maximum supported compression level C15, there is about 4% difference between C0 non-compressed and C15. You will have to evaluate yourself if those few extra GB are worth the extra farming compute. Those 1-4% are a long way from the +200% with other Proof of Space. Some think C1-C5 is where it matters. Others use C0 as a principle, or peace of mind. Your harvesting CPU power and farm size can also be a guide. Maybe ~C3 with low-power CPU, and ~try C5/C6 with high-power CPU.\n\nYou can run the [benchmark](../../../guides/mmx-plotter/#benchmark) tool to see what compression level your hardware can handle or read the full [Plotting Guide](../../../guides/mmx-plotter/).\n\n### Can I create plots for pooling?\n\nYes, you can create poolable plots using a PlotNFT contract. You first have to create the PlotNFT contract, which requires about 0.1 MMX. If you do not have 0.1 MMX currently, ask in Discord. Somebody will probably be nice. You then use the PlotNFT contract address when creating the plots with the `-c <contract address>` option. By default the PlotNFT will be set to solo.\n\nRead more about pooling under [Creating Plots](../../../guides/mmx-plotter/#creating-plots) in Plotting Guide, and [Pooling](../../../software/cli-commands/#pooling) in CLI Commands.\n\n### Plot speed, temp space and other stats?\n\nHere are a few resources for some stats.\n\n**Final plot sizes for k29/k32 and C0/C15:**\\\nTopic of [this article](../../../articles/plotting/plot-size/).\\\nMiscellaneous tab of [this Google spreadsheet](https://docs.google.com/spreadsheets/d/1EROCHCRJczwlohun0Wx0d2mzCzDrOMoMm-OEB-3voFE/).\n\n**Temp space and disk writes needed for plotting:**\\\nPlotting section of [this article](../../../articles/plotting/plot-format/#plotting).\\\nMiscellaneous tab of [this Google spreadsheet](https://docs.google.com/spreadsheets/d/1EROCHCRJczwlohun0Wx0d2mzCzDrOMoMm-OEB-3voFE/).\n\n**How fast are others plotting:**\\\nLook in tabs of [this Google spreadsheet](https://docs.google.com/spreadsheets/d/1EROCHCRJczwlohun0Wx0d2mzCzDrOMoMm-OEB-3voFE/).\n\n### Benefits of plotting and farming higher k-size?\n\nA single k31 plot has roughly the size of two k30 plots. It is also twice as likely to find a proof. However, as seen above, plotting a higher k-size also requires higher allocation of resources, and longer plotting time. For a small farm with a total number of plots less than 10000, plotting k30 is fine. For a large farm, it is better to plot higher k-size plots to minimize the lookup time for finding proofs at every block height.\n\nLookup times of < 1 sec is considered good, < 3 sec is acceptable, whereas higher than 5 sec risks losing block rewards.\n\n### Plotting stuck in Phase 1, [P1] Table 1?\n\nMaybe not, be patient. Phase 1, table 1 is very compute heavy and takes more than 50% of plot time (if full RAM plotting). In most cases you are limited by the compute capabilities of your GPU. If no error returned, wait at least 5 minutes before assuming it is stuck.\n\n### Can I use RAMdisk to make plots?\n\nPlotter uses the RAM directly, no need to involve a RAMdisk.\n\n### How much temp space is needed?\n\n| | Size | Full RAM | Partial RAM | Disk/Partial RAM |\n| :--- | :--- | :--- | :--- | :--- |\n| k29 | 36 GiB | 61 GiB | 39 GiB | 22 GiB |\n| k30 | 75 GiB | 116 GiB | 68 GiB | 46 GiB |\n| k31 | 155 GiB | 226 GiB | 126 GiB | 88 GiB |\n| k32 | 320 GiB | 446 GiB | 246 GiB | 177 GiB |\n\n:::note[Note]\nNumbers above are just an approximation.\n:::\n\n### How to make plotter log each plot created?\n\nAt the end of the command, add:\\\n `2>&1 | tee /home/user/desired_path/filename.log`\n\nExample (Linux):\n```bash frame=\"none\"\n./mmx_cuda_plot <options> 2>&1 | tee /home/user/desired_path/filename.log\n```\n"
  },
  {
    "path": "docs/src/content/docs/faq/timelord.md",
    "content": "---\ntitle: TimeLord FAQ\ndescription: Frequently asked questions about MMX timelord.\n---\n\n### Do I need to run a timelord?\n\nNo. Running a timelord is optional (default is disabled).\n\nNot needed to run a fully functional node. Blockchain, as a whole, only need one active timelord to move forward. A few more, spread around, is preferred for redundancy and security.\n\nYou will not get any more or less block rewards by running a timelord on your farming node.\n\nIf you want to contribute by running one, check [requirements](../../articles/timelord/timelord-optimizations/#requirements) in this [article](../../articles/timelord/timelord-optimizations/). Enable timelord in WebGUI, or set `true` in `config/local/timelord` file. Check that running, and speed, in NODE / LOG / TIMELORD tab in WebGUI. Probably lower than NODE / VDF Speed, unless you are the fastest timelord.\n\n### Rewards for running a timelord?\n\nYes, if you are the fastest.\n\nOnly fastest timelord, at any time, produces VDF for block being created. An on-chain reward of 0.2 MMX is given every 20 blocks to fastest timelord. Potentially 86.4 MMX per day.\n\nMore info about [logic](../../articles/timelord/timelord-optimizations/#logic) and how to know you are [fastest timelord](../../articles/timelord/timelord-optimizations/#fastest-timelord) in this [article](../../articles/timelord/timelord-optimizations/).\n\n### I want to be the fastest timelord\n\nRead following articles, [TimeLord Optimizations](../../articles/timelord/timelord-optimizations/) and [TimeLord Predictions](../../articles/timelord/timelord-predictions/).\n\nJoin the [`#mmx-timelord`](https://discord.com/channels/852982773963161650/1026219599311675493) channel on Discord.\n\n### Why not a GPU/FPGA/ASIC timelord?\n\nTimelord logic will only use CPU, not GPU.\n\nGPU is great for parallel SHA256 calculations, beating CPU in both speed and efficiency. GPU is used for verify VDF operation on a node, if available.\n\nFor a single SHA256 calculation, CPU's SHA extensions will beat GPU on speed. As timelord SHA256 workload is not parallelizable, CPU wins the serial SHA256 race.\n\nFeedback welcome on other contenders. As of now, nothing observed beating a high-GHz CPU with SHA extensions (optimized silicon circuits inside CPU). Too low speed (GHz) on FPGA, work not parallelizable. Prohibitive cost to produce a high-GHz ASIC that beats Intel/AMD optimized silicon.\n"
  },
  {
    "path": "docs/src/content/docs/faq/vdf.md",
    "content": "---\ntitle: VDF FAQ\ndescription: Frequently asked questions about MMX verified delay function (VDF).\n---\n\n### Why do I need to verify VDF as a farmer?\n\nA Verifiable Delay Function (VDF), is the Time part of Proof of Space (and Time). Time is proved through a sequential function executed a number of times.\n- Verifiable: Verifier can verify the proof in a shorter amount of time than it took to generate.\n- Delay: It proves that a certain amount of real time has elapsed.\n- Function: It is deterministic, computing input x always yields the same result y.\n\nVDF verify requires either a modern multi-core CPU, or a decent GPU/iGPU.\n\n### What GPU/CPU do I need to verify VDF?\n\nYou want your VDF verify below 5 sec. It is directly related to current speed of [fastest timelord](../../../articles/timelord/timelord-predictions/#tldr). Nvidia's GT1030 is affordable, power efficient and does VDF verifications in < 3 seconds, while GTX1650 in < 1 second.\n\nFor best results, devices which support >= OpenCL 1.2 are recommended. It has been shown that OpenCL 1.1 devices can verify VDFs, but performance is significantly lower. Additional requirement of installing specific drivers to support the older cards can be challenging.\n\nAlso possible to use iGPU (integrated graphics). If the iGPU is powerful enough.\n\nMany newer CPUs with SHA extensions are capable of verifying VDF. Not as power efficient as GPU, but possible.\n\nFor a list of supported GPUs, look [this Google spreadsheet](https://docs.google.com/spreadsheets/d/1LqyZut0JBwQpbCBnh73fPXkT-1WbCYoXVnIbf6jeyac/).\\\nFor a list of GPU/CPU VDF times, look [this Google spreadsheet](https://docs.google.com/spreadsheets/d/1NlK-dq7vCbX4NHzrOloyy4ylLW-fdXjuT8468__SF64/).\n\n:::note[Note]\nVDF verify logic was reduced to 1 stream with mainnet, vs. 2 or 3 in testnets. Numbers for testnets are probably too pessimistic.\n:::\n\n### My node is warning of VDF verification times\n\nIf you get any of these two warnings, you need to check why your VDF verify times are so high:\\\n`VDF verification took longer than recommended ...`\\\n`VDF verification took longer than block interval ...`\n\nVerification times below 3 sec are good, whereas anything > 5 seconds is bad. If you are above 5 sec, you will get warning messages.\n\n[Check](#what-gpucpu-do-i-need-to-verify-vdf) that your GPU/CPU is powerful enough to verify VDF. If using GPU, [check](#how-do-i-know-if-node-is-using-gpu-for-vdf) that verification really is performed on it (and not CPU).\n\n### How do I know if node is using GPU for VDF?\n\nTo be absolutely sure node is using GPU for VDF verify. Start node, and check:\n```\n[Node] INFO: Found OpenCL GPU device 'NVIDIA GeForce GT 1030' [0] (NVIDIA CUDA)\n[Node] INFO: Using OpenCL GPU device 'NVIDIA GeForce GT 1030' [0] (NVIDIA CUDA)\n```\n\nFirst one means the node found OpenCL device. Second one `Using OpenCL GPU` indicates node is actually using the device. If multiple GPU devices, can configure which one under SETTINGS in WebGUI.\n\n### How to make sure OpenCL is setup correctly?\n\nGo through the [OpenCL Setup](../../../guides/optimize-vdf/) guide. Then check that OpenCL platform and device drivers really are installed and active.\n\nOn Linux, check output of `clinfo -l` command:\n```\nPlatform #0: NVIDIA CUDA\n `-- Device #0: NVIDIA GeForce GT 1030\n```\n\nOn Windows (evaluate yourself if this 3rd-party utility is ok for you):\\\n[OpenCL Hardware Capability Viewer](https://opencl.gpuinfo.org/download.php)\n\n### Node and OpenCL is configured, only CPU used?\n\nMight not be a problem.\n\nWhen node is performing initial sync of blockchain DB, only CPU will be used. Any OpenCL GPU device will not be used for VDF verify until node is in sync with network.\n\nVDF verify is only performed every 10 sec (blocktime). If your GPU is somewhat powerful, that compute of VDF verify is a 'blip' of less than 1 sec.\n"
  },
  {
    "path": "docs/src/content/docs/faq/wallet.md",
    "content": "---\ntitle: Wallet FAQ\ndescription: Frequently asked questions about MMX wallet.\n---\n\n### Warning of \"no wallet available\"\n\nI'm getting a warning line in WebGUI and/or log file:\\\n`Failed to get reward address from wallet: no wallet available`\n\nFarmer needs a wallet address to send potential rewards to. It is a warning that no farmer reward address has been set, and there are no wallets created that farmer can default its rewards to.\n\nIf you really are farming with plots, make sure farmer is sending rewards to correct address. You can get information about creating wallets and setting farmer reward address in the [Getting Started](../../guides/getting-started/) guide.\n"
  },
  {
    "path": "docs/src/content/docs/faq/webgui.md",
    "content": "---\ntitle: WebGUI FAQ\ndescription: Frequently asked questions about MMX web interface (WebGUI).\n---\n\n### How do I access the WebGUI?\n\nIf running Windows install or desktop Linux binary package. You already have access to WebGUI, wrapped as UI inside the application window.\n\nIf running mmx-node in the background on Linux, or just want to access the WebGUI through a browser. It is available locally on machine: http://localhost:11380/gui/\n\nWhen accessed through a browser, you need to give a password. It is a randomly generated one, usually located here:\n- Windows: `C:\\Users\\<user>\\.mmx\\PASSWD`\n- Linux: `~/.mmx/PASSWD`\n- Linux: `~/mmx-node/PASSWD`\n\nIn all cases MMX Node needs to be started, or mmx-node running in background.\n\n### How do I access the WebGUI remotely?\n\nPer-default, WebGUI is only exposed on localhost. You need to browse to it on machine it is running on. Through an unsecured `http` connection.\n\nIt is possible to access it remotely. Either through an SSH tunnel (recommended), or opening up for external connections (not recommended).\n\n:::danger[Warning]\nMake sure you understand the security risks, consequences, and measures needed if performing any of the steps below. The connection is unsecured `http`, and need to go over a 100% trusted network. Where no one can capture your network traffic to get access to sensitive information like passwords or wallets.\n:::\n\nRecommended way is to tunnel port `11380` through an SSH connection, from remote WebGUI machine. Making you able to browse and login locally on machine you have SSH'ed from. The security of the SSH connection will protect the unsecured `http` traffic. You can get some tips in [Remote Services](../../../guides/remote-services/#remote-connections-over-public-networks) guide.\n\n<ins>Not</ins> recommended way is to configure mmx-node's internal `HttpServer` to answer external connection requests. Edit `config/local/HttpServer.json` file to `\"host\": \"0.0.0.0\",` (default: `\"host\": \"localhost\",`). Now, after a restart, it will answer to external connection requests. Need to also check if OS firewall is blocking incoming requests on port `11380`. If machine with WebGUI has IP `192.168.1.10`, and reachable from your machine: http://192.168.1.10:11380/gui/\n"
  },
  {
    "path": "docs/src/content/docs/guides/docker.md",
    "content": "---\ntitle: Docker Usage\ndescription: Examples for using pre-built docker images\n---\n\n## Node Containers\n\nDocker images are available via `ghcr.io/madmax43v3r/mmx-node` in 2 build flavours:\n- `latest`: Built from the most recent release version\n- `edge`: Built from the most recent commit to the master branch\n\nThe following tag suffixes are also available for GPU vendor specific builds:\n - `-amd`\n - `-intel`\n - `-nvidia`\n\nAdditionally, each semver tag produces tagged images:\n - `<major>.<minor>.<patch>`\n - `<major>.<minor>`\n - `<major>`\n - each with their respective suffix (eg. `1.1.9-amd`)\n\nEach image provides a volume for `/data` which you can override with your own volume or a mapped path to customize the storage location of the node data.\n\n### CPU only\n\nA `compose.yml` for the cpu only node can look like this:\n```yml\nservices:\n  node:\n    image: ghcr.io/madmax43v3r/mmx-node:latest\n    restart: unless-stopped\n    volumes:\n      - /some/path/to/mmx-node:/data\n    ports:\n      - \"11337:11337\"  # Node p2p port. Forward your router to this port for peers to be able to connect\n      - \"127.0.0.1:11380:11380\"  # API port. Set host to 0.0.0.0 in /data/config/local/HttpServer.json for webUI/API access\n      #- \"11333:11333\"  # Harvester port. Uncomment to allow remote harvesters to connect to the farmer\n      #- \"11330:11330\"  # Farmer port. Uncomment to allow remote farmers to connect to the node\n    environment:\n      MMX_ALLOW_REMOTE: 'false'  # Set to true to allow connections from remote harvesters/farmers\n      MMX_HARVESTER_ENABLED: 'true'  # Set to false to disable local harvester\n      MMX_FARMER_ENABLED: 'true'  # Set to false to disable local farmer\n```\n\n### AMD GPU\n\nFor amd gpu support please see the following `compose.yml`:\n```yml\nservices:\n  node:\n    image: ghcr.io/madmax43v3r/mmx-node:latest-amd\n    restart: unless-stopped\n    devices:\n      - /dev/dri:/dev/dri\n      - /dev/kfd:/dev/kfd\n    volumes:\n      - /some/path/to/mmx-node:/data\n    ports:\n      - \"11337:11337\"  # Node p2p port. Forward your router to this port for peers to be able to connect\n      - \"127.0.0.1:11380:11380\"  # API port. Set host to 0.0.0.0 in /data/config/local/HttpServer.json for webUI/API access\n      #- \"11333:11333\"  # Harvester port. Uncomment to allow remote harvesters to connect to the farmer\n      #- \"11330:11330\"  # Farmer port. Uncomment to allow remote farmers to connect to the node\n    environment:\n      MMX_ALLOW_REMOTE: 'false'  # Set to true to allow connections from remote harvesters/farmers\n      MMX_HARVESTER_ENABLED: 'true'  # Set to false to disable local harvester\n      MMX_FARMER_ENABLED: 'true'  # Set to false to disable local farmer\n```\n\n### Intel GPU\n\nFor intel gpu support please see the following `compose.yml`:\n```yml\nservices:\n  node:\n    image: ghcr.io/madmax43v3r/mmx-node:latest-intel\n    restart: unless-stopped\n    devices:\n      - /dev/dri/renderD128:/dev/dri/renderD128\n    volumes:\n      - /some/path/to/mmx-node:/data\n    ports:\n      - \"11337:11337\"  # Node p2p port. Forward your router to this port for peers to be able to connect\n      - \"127.0.0.1:11380:11380\"  # API port. Set host to 0.0.0.0 in /data/config/local/HttpServer.json for webUI/API access\n      #- \"11333:11333\"  # Harvester port. Uncomment to allow remote harvesters to connect to the farmer\n      #- \"11330:11330\"  # Farmer port. Uncomment to allow remote farmers to connect to the node\n    environment:\n      MMX_ALLOW_REMOTE: 'false'  # Set to true to allow connections from remote harvesters/farmers\n      MMX_HARVESTER_ENABLED: 'true'  # Set to false to disable local harvester\n      MMX_FARMER_ENABLED: 'true'  # Set to false to disable local farmer\n```\n\n:::note[Note]\nIntel ARC support requires a host system running Linux Kernel 6.3 or above.\n:::\n\n### NVIDIA GPU\n\nFor Nvidia gpu support please see the following `compose.yml`:\n```yml\nservices:\n  node:\n    image: ghcr.io/madmax43v3r/mmx-node:latest-nvidia\n    restart: unless-stopped\n    runtime: nvidia\n    volumes:\n      - /some/path/to/mmx-node:/data\n    ports:\n      - \"11337:11337\"  # Node p2p port. Forward your router to this port for peers to be able to connect\n      - \"127.0.0.1:11380:11380\"  # API port. Set host to 0.0.0.0 in /data/config/local/HttpServer.json for webUI/API access\n      #- \"11333:11333\"  # Harvester port. Uncomment to allow remote harvesters to connect to the farmer\n      #- \"11330:11330\"  # Farmer port. Uncomment to allow remote farmers to connect to the node\n    environment:\n      MMX_ALLOW_REMOTE: 'false'  # Set to true to allow connections from remote harvesters/farmers\n      MMX_HARVESTER_ENABLED: 'true'  # Set to false to disable local harvester\n      MMX_FARMER_ENABLED: 'true'  # Set to false to disable local farmer\n```\n\n:::note[Note]\nFor Nvidia you also need the `NVIDIA Container Toolkit` installed on the host, for more info please see: [Installing the NVIDIA Container Toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html).\n:::\n\n## Remote Services\n\nRunning a remote harvester or farmer can be done by overwriting the `CMD` of the Dockerfile, for example like this:\n\n### Remote Harvester\n\n - Set `MMX_ALLOW_REMOTE` to `true` in the node or farmer compose.yml\n - Make sure port 11333 is uncommented/exposed in the node or farmer compose.yml\n - Edit the following example with the node or farmers ip address and correct paths\n\n```yml\nservices:\n  harvester:\n    image: ghcr.io/madmax43v3r/mmx-node:latest\n    restart: unless-stopped\n    command: './run_harvester.sh -n <some ip or hostname here>'\n    volumes:\n      - /some/path/to/mmx-node:/data\n      - /some/path/to/disks:/disks\n```\n\n### Remote Farmer\n\n - Set `MMX_ALLOW_REMOTE` to `true` in the node compose.yml\n - To allow remote harvesters to connect to this farmer set `MMX_ALLOW_REMOTE` to `true` in the example below\n - Make sure port 11330 is uncommented/exposed in the node compose.yml\n - Edit the following example with the node ip address and correct data path\n\n```yml\nservices:\n  farmer:\n    image: ghcr.io/madmax43v3r/mmx-node:latest\n    restart: unless-stopped\n    command: './run_farmer.sh -n <some ip or hostname here>'\n    volumes:\n      - /some/path/to/mmx-node:/data\n    ports:\n      - \"11333:11333\"  # Farmer listens on this port for remote harvester connections\n    environment:\n      MMX_ALLOW_REMOTE: 'false'  # Set to true to allow connections from remote harvesters\n      MMX_HARVESTER_ENABLED: 'true'  # Set to false to disable local harvester\n```\n"
  },
  {
    "path": "docs/src/content/docs/guides/getting-started.md",
    "content": "---\ntitle: Getting Started\ndescription: Getting started with MMX.\n---\n\n**[Install](../installation/) MMX-Node.**\n\n## GUI\n\nThe native GUI can be opened by searching for `MMX Node` (when installed via binary package).\n\nIn case of compiling from source:\n```bash frame=\"none\"\n./run_node.sh --gui      # includes wallet and farmer\n./run_wallet.sh --gui    # remote wallet (connect to another node)\n```\n\n### WebGUI\n\nThe WebGUI is available at: http://localhost:11380/gui/\n\nSee `$MMX_HOME/PASSWD` or `mmx-node/PASSWD` for the login password, it is auto generated at compile time.\n\nIn case of a binary package install, the password will be in `~/.mmx/PASSWD`. By default, the GUI is only available on localhost.\n\n## CLI\n\nWhen compiled from source:\n```bash frame=\"none\"\ncd mmx-node\nsource ./activate.sh\n```\nWith a binary package install, just open a new terminal. On Windows search for `MMX CMD`.\n\n:::note[Note]\nA new wallet can also be created in the GUI.\n:::\n\n### Creating a Wallet (offline)\n\n```bash frame=\"none\"\nmmx wallet create [-f filename] [--with-passphrase]\n```\n\nThe file name argument is optional. By default it is `wallet.dat`, which will be loaded automatically.\n\nAdditional wallets need to be added to `key_files` array in `config/local/Wallet.json`.\n\nTo use a passphrase, specify `--with-passphrase` without the actual passphrase:\n```bash frame=\"none\"\nmmx wallet create --with-passphrase\nPassphrase: <type here>\n```\n\nTo create a wallet with a known mnemonic seed, specify `--with-mnemonic` without the actual words:\n```bash frame=\"none\"\nmmx wallet create --with-mnemonic\nMnemonic: word1 word2 ... <enter>\n```\n\nTo get the mnemonic seed from a wallet (with Node / Wallet already running):\n```bash frame=\"none\"\nmmx wallet get seed [-j index]\n```\n\n:::note[Note]\nA Node / Wallet restart is needed to pick up a new wallet.\n:::\n\n### Creating a Wallet (online)\n\nWith a running Node / Wallet:\n```bash frame=\"none\"\nmmx wallet new [name] [--with-mnemonic] [--with-passphrase] [-N <num_addresses>]\n```\nAll parameters are optional. The new wallet can be seen with `mmx wallet accounts` (last entry).\n\nTo use a known mnemonic seed, specify `--with-mnemonic` without the actual words. Then input the words when promted, with a space inbetween them.\n\nTo use a passphrase, specify `--with-passphrase` without the actual passphrase. Then input the passphrase when promted.\n\n### Running a Node\n\nFirst perform the installation and setup steps, then:\n\n```bash frame=\"none\"\n./run_node.sh\n```\nYou can enable port forwarding on TCP port 11337, if you want to help out the network and accept incoming connections.\n\n### Configuration\n\n:::note[Note]\nCapitalization of configuration files names matters.\\\nAny config changes require a node restart to become effective.\n:::\n\n#### Custom Farmer Reward Address\n\nCreate / Edit file `config/local/Farmer.json`:\n```json\n{\n  \"reward_addr\": \"mmx1...\"\n}\n```\nBy default the first address of the first wallet is used.\n\n#### Custom Timelord Reward Address\n\nCreate / Edit file `config/local/TimeLord.json`:\n```json\n{\n  \"reward_addr\": \"mmx1...\"\n}\n```\n\n#### Fixed Node Peers\n\nCreate / Edit file `config/local/Router.json`:\n```json\n{\n  \"fixed_peers\": [\"192.168.0.123\", \"more\"]\n}\n```\n\n#### Enable Timelord\n\n```bash frame=\"none\"\necho true > config/local/timelord\n```\n\n#### CUDA Settings\n\nCreate / Edit `config/local/cuda.json`:\n```json\n{\n  \"enable\": true,\n  \"devices\": [0, 1, ...]\n}\n```\nEmpty device list = use all devices. Device indices start at 0. CUDA is enabled by default for all devices.\n\n#### Custom home directory\n\nTo set a custom storage path for the blockchain DB, wallet files, etc:\n```bash frame=\"none\"\nexport MMX_HOME=/your/path/\n```\nWallet files will end up in `MMX_HOME`, everything else in `mainnet` subfolder.\nWhen compiling from source, `MMX_HOME` is not set, so it defaults to the current directory.\nWhen installing a binary package `MMX_HOME` defaults to `~/.mmx/`.\n\n:::note[Note]\nA trailing `/` in the path is required.\n:::\n\n#### Custom data directory\n\nTo store the DB in a custom directory you can set environment variable `MMX_DATA` (for example):\n```bash frame=\"none\"\nexport MMX_DATA=/mnt/mmx_data/\n```\nA node restart is required. Optionally the `mainnet` folder can be copied to the new `MMX_DATA` path (after stopping the node), to avoid having to sync from scratch again.\n\n:::note[Note]\nA trailing `/` in the path is required.\n:::\n\n#### Reducing network traffic\n\nIf you have a slow internet connection or want to reduce traffic in general you can lower the number of connections in `config/local/Router.json`.\nFor example to run at the bare recommended minimum:\n```json\n{\n  \"num_peers_out\": 4,\n  \"max_connections\": 4\n}\n```\n`num_peers_out` is the maximum number of outgoing connections to synced peers. `max_connections` is the maximum total number of connections.\nKeep in mind this will increase your chances of losing sync.\n\nAnother more drastic measure is to disable relaying messages to other nodes, by setting `do_relay` to `false` in `config/local/Router.json`.\nHowever this will hurt the network, so please only disable it if absolutely necessary.\n\n### Running in background\n\nTo run a node in the background you can enter a `screen` session:\n```bash frame=\"none\"\nscreen -S node    # start node as above\n# <Ctrl+A> + D    # to detach\nscreen -r node    # to attach again\n```\n\n### Recover from forking\n\nTo re-sync starting from a specific height: `mmx node revert <height>`.\nThis is needed if for some reason the node forked from the network. Just subtract 1000 blocks or more from the current height you are stuck at.\n\n## Plotting\n\n**For an in depth guide on plotting, see** [Plotting Guide](../mmx-plotter/).\n\nTo get the farmer key for plotting:\n```bash frame=\"none\"\nmmx wallet keys [-j index]\n```\nThe node needs to be running for this command to work. (`-j` to specify the index of a non-default wallet)\n\nVia GUI the farmer key can be found in Wallet > Info section, see `farmer_public_key`:\n\n![image](https://github.com/madMAx43v3r/mmx-node/assets/951738/7ebc8eaa-d0f9-43fd-bb87-0788a59b138a)\n\n:::note[Note]\nDuring plotting, the node does not need to be running (the plotter doesn't even need internet connection).\n:::\n\nDownload CUDA plotter here: [mmx-binaries/mmx-cuda-plotter](https://github.com/madMAx43v3r/mmx-binaries/tree/master/mmx-cuda-plotter)\n\nThere is no CPU plotter anymore for the new format, because it would be too inefficient. Any old Nvidia GPU will do, Maxwell or newer.\n\n```bash frame=\"none\"\n# Example Full RAM:\n./mmx_cuda_plot_k30 -C 5 -n -1 -t /mnt/tmp_ssd/ -d <dst> -f <farmer_key>\n# Example Partial RAM:\n./mmx_cuda_plot_k30 -C 5 -n -1 -2 /mnt/tmp_ssd/ -d <dst> -f <farmer_key>\n# Example Disk Mode:\n./mmx_cuda_plot_k30 -C 5 -n -1 -3 /mnt/tmp_ssd/ -d <dst> -f <farmer_key>\n```\n\nIf you would like to use compressed plots, it is recommended that you run the mmx_posbench tool to benchmark your hardware.\n\nTo create SSD plots (for farming on SSDs) add `--ssd` to the command and use `-C 0`. SSD plots are 250% more efficient but cannot be farmed on HDDs. They have higher CPU load to farm, hence it's recommended to plot uncompressed.\n\nThe minimum k-size for mainnet is k29, the maximum k-size is k32.\n\nTo add a plot directory add the path to `plot_dirs` array in `config/local/Harvester.json`, for example:\n```json\n{\n  \"plot_dirs\": [\n    \"/mnt/drive1/plots/\",\n    \"/mnt/drive2/plots/\",\n    \"C:/windows/path/example/\"\n  ]\n}\n```\nDirectories are searched recursively by default. To disable recursive search you can set `recursive_search` to `false` in `Harvester.json`.\n\nFor the above reason, avoid adding a root directory (e.g. `H:\\`), unless your drive only contains plots. Instead, make a folder and place all your plots in there (e.g. `H:\\MMX Plots\\`).\n"
  },
  {
    "path": "docs/src/content/docs/guides/installation.md",
    "content": "---\ntitle: Installation Guide\ndescription: How to install MMX Node.\n---\n\n## Windows\n\nWindows installers are available here: [mmx-node/releases](https://github.com/madMAx43v3r/mmx-node/releases)\n\n:::note[Note]\nYou might need to install or update [Microsoft Visual C++ Redistributable for Visual Studio 2022](https://visualstudio.microsoft.com/downloads/). Scroll down to \"Other Tools\".\n:::\n\n## Linux\n\nLinux binary packages are available here: [mmx-node/releases](https://github.com/madMAx43v3r/mmx-node/releases)\n\nTo install a binary package:\n```bash frame=\"none\"\nsudo apt install ~/Downloads/mmx-node-1.1.7-amd64-ubuntu-20.04.deb\n```\nThis will automatically install dependencies as well.\n\nWhen no matching package is found, continue below to build from source.\n\n### Dependencies\n\nUbuntu Linux:\n```bash frame=\"none\"\nsudo apt update\nsudo apt install git cmake build-essential automake libtool pkg-config curl libminiupnpc-dev libjemalloc-dev libzstd-dev zlib1g-dev ocl-icd-opencl-dev clinfo screen\n# Optional dependencies:\nsudo apt install qtwebengine5-dev  # for native GUI\nsudo apt install nvidia-cuda-toolkit  # for CUDA compute (farming)\n```\n\nArch Linux:\n```bash frame=\"none\"\nsudo pacman -Syu\nsudo pacman -S base-devel git cmake curl miniupnpc jemalloc zstd zlib opencl-headers ocl-icd clinfo screen\n# Optional dependencies:\nsudo pacman -S qt5-webengine  # for native GUI\nsudo pacman -S cuda  # for CUDA compute (farming)\n```\n\nFedora Linux:\n```bash frame=\"none\"\nsudo yum install kernel-devel git cmake automake libtool curl gcc gcc-c++ miniupnpc-devel jemalloc-devel ocl-icd-devel zlib-ng-devel zstd clinfo screen\n# Optional dependencies:\nsudo yum install qt5-qtwebengine-devel  # for native GUI\n```\n\n:::note[Note]\nTo enable CUDA support, CUDA needs to be installed: [CUDA Toolkit Downloads](https://developer.nvidia.com/cuda-downloads).\n:::\n\n### Building from Source\n\n```bash frame=\"none\"\ngit clone https://github.com/madMAx43v3r/mmx-node.git\ncd mmx-node\n./update.sh\n```\n\nTo disable QT GUI: `./update.sh -D DISABLE_QT=1`\\\nTo disable CUDA support: `./update.sh -D DISABLE_CUDA=1`\\\nThese settings are stored, until the next `./clean_all.sh`, so only needs to be specified once. To enable again, set the config to `0`.\n\nTo update to latest version:\n```bash frame=\"none\"\n./update.sh\n```\n\n### Rebuilding\n\nIf the build is broken for some reason:\n```bash frame=\"none\"\n./clean_all.sh\n./update.sh\n```\nThis is needed when updating system packages for example.\n\n## Windows via WSL\n\nTo setup Ubuntu 20.04 in WSL on Windows you can follow the tutorial over here:\\\n[Get started with Windows Subsystem for Linux](https://docs.microsoft.com/en-us/learn/modules/get-started-with-windows-subsystem-for-linux/)\n\nIn steps, make sure to install: [Ubuntu on Windows](https://www.microsoft.com/store/p/ubuntu/9nblggh4msv6)\n\nThen type \"Ubuntu\" in the start menu and start it, you will be asked to setup a user and password.\nAfter that you can follow the normal instructions for Ubuntu 20.04.\n\nTo get OpenCL working in WSL: [OpenCL coming to WSL](https://devblogs.microsoft.com/commandline/oneapi-l0-openvino-and-opencl-coming-to-the-windows-subsystem-for-linux-for-intel-gpus/)\n\n## Custom storage path\n\nTo change the storage path for everything you can set environment variable `MMX_HOME` to `/your/path/` (trailing slash required). By default the current directory is used, ie. `mmx-node`.\n\n## Testnet\n\nTo run a node on testnet: `echo testnet13 > NETWORK` and restart.\\\nTo switch back to mainnet: `rm NETWORK` and restart.\n\nAlternatively, it's possible to run testnet in parallel via docker:\\\n[mmx-node/scripts/docker/mmx-testnet](https://github.com/madMAx43v3r/mmx-node/tree/master/scripts/docker/mmx-testnet)\n"
  },
  {
    "path": "docs/src/content/docs/guides/mmx-plotter.mdx",
    "content": "---\ntitle: Plotting Guide\ndescription: MMX Plotter is a tool for creating plots for the MMX blockchain.\n---\n\nimport { Tabs, TabItem } from '@astrojs/starlight/components';\n\n## MMX Plotting\n\nThe MMX CUDA plotter is available at [mmx-binaries](https://github.com/madMAx43v3r/mmx-binaries).\nThe source code for the plotter can be found at [mmx-cuda-plotter](https://github.com/madMAx43v3r/mmx-cuda-plotter).\nA CUDA GPU is required for plotting due to the compression resistant plot format, since plotting on CPU would take too long.\nThe format is compression resistant, but not incompressible. The current plotter allows for compression of up to C15, which only gives a gain of 4.5% in rewards, but at the cost of significant CPU load.\nC10 can be farmed on most modern CPUs while still giving a gain of 3%. Larger capacity hard drives may struggle to seek quickly enough when full of k29 plots. Hence for drives over 16TB k30 is the minimum recommended size.\n\n### Available k-sizes with plotting requirements\n\n| k-size | HDD-size | SSD-size | Full RAM | Partial RAM | Disk/Partial RAM |\n| :--- | :--- | :--- | :--- | :--- | :--- |\n| `k29` | 36 GiB | 15 GiB | 61 GiB | 39 GiB | 22 GiB |\n| `k30` | 75 GiB | 30 GiB | 116 GiB | 68 GiB | 46 GiB |\n| `k31` | 155 GiB | 62 GiB | 226 GiB | 126 GiB | 88 GiB |\n| `k32` | 320 GiB | 128 GiB | 446 GiB | 246 GiB | 177 GiB |\n\n:::note[Note]\nAll values are for C0 compression and are approximate based on observations while plotting. Due to differences in the tables, final plot sizes may vary. For k32 a difference of ~3 GiB between largest to smallest plot files have been observed.\n\nMore in depth look at plot sizes in [this article](../../../articles/plotting/plot-size/).\n:::\n\n:::note[Note]\nFull RAM, and Partial RAM refer to plotting modes. Disk space is what is needed by `-2` with partial RAM plotting. When using full disk mode plotting, temp space required for `-3` is the same as Partial RAM requirements. If `-3` and `-2` are the same drive, use the Full RAM space as a reference.\n:::\n\n:::caution[Caution]\nThe RAM Requirements above were tested to work on linux. Due to quirks of memory usage on Windows OS, it may not be possible to plot k31 in partial ram on a system with 128GB of RAM.\n:::\n\n## Compression\n\nThe MMX CUDA Plotter supports compression levels C0 to C15. Farming compressed plots is currently only supported on CPU.\nHowever recomputing a full proof on HDD plots is only required when a good enough quality has been found, either to make a block or to make a partial.\nGPU recompute would only add a few extra percent of gains, at the cost of needing a (big) GPU to sit idle most of the time (in case of HDD plots).\nGPU recompute for farming lots of (uncompressed) SSD plots is planned, as this is the only use case where it makes sense.\nSince SSD plots always need to recompute the proof output hash (quality), meaning the compute load is proportional to number of plots.\n\n### HDD Plots\n\nC15 is _possible_ to farm on CPU, but only with ~64 cores or more. It is not recommended to use C15 as the gain over C10 is minimal (1.5%).\nC10-C12 can be handled by most modern CPUs. C5 can be farmed on almost any CPU, with minimal power draw.\nWhen making NFT plots, it is recommended to use a lower C level (3-5 levels lower) since more proofs need to be computed when pooling (one for each partial).\nThe compute load when farming HDD plots is independent of the number of plots. The challenge is computing a full proof fast enough to make a block or partial in time.\n\n### SSD Plots\n\nSSD plots are 2.5x smaller than HDD plots. They cannot be farmed on HDDs (even in a RAID array) due to the high IOPS required to farm them (proportional to plot count).\nThe CPU load to farm SSD plots is already quite high with C0, as such C0 is recommended when making SSD plots. Higher k-size reduces CPU and IOPS load.\nAs such the most efficient SSD plots are k32 C0, with k29 having 8x higher CPU and IOPS load. k32 C3 is equal to k29 C0 in terms of CPU load.\nFarming 1024 uncompressed SSD plots is the same compute load as computing a single C10 full proof.\n\n### Benchmark\n\nBefore plotting with compression a benchmark should be performed to check if your system can handle it:\n```bash frame=\"none\"\nmmx_posbench -k 31 -C 10                  # to benchmark k31 C10\nmmx_posbench --cuda 0 -k 31 -C 10         # to benchmark on CPU\nmmx_posbench --devices 1 2 -k 31 -C 10    # to select specific CUDA devices (starting at 0)\n```\n\n## Creating Plots\n\nTo create plots you will need a Farmer Public Key, and optionally a PlotNFT contract address (for NFT plots). To get the Farmer Public Key, see `mmx wallet keys` or go to the `Info` tab under the wallet in the GUI.\nFor PlotNFT contract address, see [Pooling](../../software/cli-commands/#pooling).\n\n### Command Line Reference\n\nTo use the plotter via command line, navigate to the directory containing the plotter binaries and run the following command (replace `mmx_cuda_plot_k30` with the appropriate binary for your desired k-size):\n<Tabs>\n    <TabItem label=\"Full RAM\">\n        For full Ram plotting, `-t` is used to temporarily store the the finished plot before moving it to the destination `-d`, RAM is used for the entire plotting process.\n        ```bash frame=\"none\"\n        ./mmx_cuda_plot_k30 -C 5 -n -1 -t /mnt/tmp_ssd/ -d /mnt/farmdrive/ -f <farmer_key>\n        ```\n    </TabItem>\n    <TabItem label=\"Partial RAM\">\n        For partial RAM plotting, `-2` is used to store temporary working files before moving the finished plot to `-t` and then to `-d`. RAM is used for the most write intensive parts of the plotting process. If `-t` is not specified, the plotter will set the `-t` argument to the same value as `-2`.\n        ```bash frame=\"none\"\n        ./mmx_cuda_plot_k30 -C 5 -n -1 -t /mnt/tmp_ssd/ -2 /mnt/tmp_ssd/ -d /mnt/farmdrive/ -f <farmer_key>\n        ```\n    </TabItem>\n    <TabItem label=\"Disk Mode\">\n        For disk mode plotting, `-3` takes the place of RAM and is used for write intensive temporary files. You can use a different drive for `-2` if desired, the faster of the two drives should be used for `-3`. If `-2` or `-t` are not specified, the plotter will set the value of both to the same value as `-3`.\n        ```bash frame=\"none\"\n        ./mmx_cuda_plot_k30 -C 5 -n -1 -t /mnt/tmp_ssd/ -2 /mnt/tmp_ssd/ -3 /mnt/tmp_ssd/ -d /mnt/farmdrive/ -f <farmer_key>\n        ```\n    </TabItem>\n</Tabs>\nTo send finished plots to multiple destinations, use the `-d` argument multiple times. For example:\n```bash frame=\"none\"\n./mmx_cuda_plot_k30 -C 5 -n -1 -t /mnt/tmp_ssd/ -d /mnt/farmdrive1/ -d /mnt/farmdrive2/ -f <farmer_key>\n```\n\n:::note[Note]\nTo simplify sending to multiple destinations over a network, you can use [plot-sink](https://github.com/madMAx43v3r/chia-gigahorse/tree/master/plot-sink).\n:::\n\nFull Command Line Reference options:\n\n```\nUsage:\n  mmx_cuda_plot [OPTION...]\n\n  -C, --level arg      Compression level (0 to 15)\n      --ssd            Make SSD plots\n  -n, --count arg      Number of plots to create (default = 1, unlimited = -1)\n  -g, --device arg     CUDA device (default = 0)\n  -r, --ndevices arg   Number of CUDA devices (default = 1)\n  -t, --tmpdir arg     Temporary directories for plot storage (default = $PWD)\n  -2, --tmpdir2 arg    Temporary directory 2 for partial RAM / disk mode (default = @RAM)\n  -3, --tmpdir3 arg    Temporary directory 3 for disk mode (default = @RAM)\n  -d, --finaldir arg   Final destinations (default = <tmpdir>, remote = @HOST)\n  -z, --dstport arg    Destination port for remote copy (default = 1337)\n  -w, --waitforcopy    Wait for copy to start next plot\n  -c, --contract arg   Pool Contract Address (62 chars)\n  -f, --farmerkey arg  Farmer Public Key (33 bytes)\n  -S, --streams arg    Number of parallel streams (default = 3, must be >= 2)\n  -B, --chunksize arg  Bucket chunk size in MiB (default = 16, 1 to 256)\n  -Q, --maxtmp arg     Max number of plots to cache in tmpdir (default = -1)\n  -A, --copylimit arg  Max number of parallel copies in total (default = -1)\n  -W, --maxcopy arg    Max number of parallel copies to same HDD (default = 1, unlimited = -1)\n  -M, --memory arg     Max shared / pinned memory in GiB (default = unlimited)\n      --version        Print version\n  -h, --help           Print help\n```\n"
  },
  {
    "path": "docs/src/content/docs/guides/optimize-vdf.md",
    "content": "---\ntitle: OpenCL Setup\ndescription: How to improve VDF verification speed.\n---\n\nUsing OpenCL is an optional but highly recommended feature for running MMX.\\\nOffloading the verification of the VDF to a GPU or iGPU can increase both performance and power efficiency.\n\nOnce the blockchain is synced, you will see these lines:\n```\n[Node] INFO: Verified VDF for height 239702, delta = 10.111297 sec, took 0.089002 sec.\n```\nWhich indicates that your node is now verifying the current VDFs as they are received. Your GPU would now be utilized every ~10 seconds.\n\nIf OpenCL is not being utilized for VDF verification, you should see relatively high CPU usage across all cores every ~10 seconds.\n\nIf you are running a Timelord (the default is off), you will see high CPU usage on at least one core in any case, even if your GPU is used for verification.\n\n:::note[Note]\nDuring initial blockchain sync, CPU usage can be high in any case.\n:::\n\nExample Hardware and times [Google spreadsheet](https://docs.google.com/spreadsheets/d/1NlK-dq7vCbX4NHzrOloyy4ylLW-fdXjuT8468__SF64/edit?pli=1&gid=618383284#gid=618383284).\n\n## OpenCL for Intel iGPUs\n\nIntel iGPUs prior to 11th gen are not sufficient for mainnet. Intel's desktop iGPUs have much fewer compute units than their mobile counterparts, so only the mobile SKUs in laptops/mini-PCs will be suitable for OpenCL VDF verify. 11th gen and newer desktop CPUs with the SHA instruction set can get decent performance on the CPU cores without OpenCL.\n\nUbuntu 20.04, 21.04\n```bash frame=\"none\"\nsudo apt install intel-opencl-icd\n```\n\nUbuntu ppa for 18.04, 20.04, 21.04\n```bash frame=\"none\"\nsudo add-apt-repository ppa:intel-opencl/intel-opencl\nsudo apt update\nsudo apt install intel-opencl-icd\n```\n\nIf the above doesn't work, you can try installing the latest drivers: [Intel GPU Ubuntu](https://dgpu-docs.intel.com/installation-guides/ubuntu/ubuntu-focal.html)\n\nMake sure your iGPU is not somehow disabled, like here for example: [Intel Enable iGPU](https://community.hetzner.com/tutorials/howto-enable-igpu)\n\n## OpenCL for AMD GPUs\n\nUbuntu:\n\nDownload installer (with `wget`) from `https://repo.radeon.com/amdgpu-install/latest/ubuntu/`\n\nChange directory to the Download folder and install with `sudo dpkg -i amdgpu-install*.deb`\n\n`sudo apt install rocm-opencl`\n\nFollow on-screen instructions and then run:\n```bash frame=\"none\"\nsudo apt update\nsudo apt upgrade\n```\n\nArch Linux:\n```bash frame=\"none\"\nsudo pacman -S opencl-amd\n```\n\nMesa drivers with opencl drivers do seem to work, but performance is very poor (VDF verification >4x longer).\\\nTo install mesa drivers:\\\nUbuntu:\n```bash frame=\"none\"\nsudo apt install mesa-opencl-icd\n```\nArch:\n```bash frame=\"none\"\nsudo pacman -S mesa mesa-utils opencl-mesa\n```\n\nWindows: [Google search AMD](https://google.com/search?q=amd+graphics+driver+download)\n\n## OpenCL for Nvidia GPUs\n\nDue to the massive generational leap in compute performance, the Maxwell generation (900 series Geforce, M-series and some K-series Quadro) should be the minimum consideration for Nvidia GPUs.\n\nInstall Nvidia drivers:\n\n### Ubuntu\n\n```bash frame=\"none\"\nsudo apt install nvidia-driver-470\nsudo apt install nvidia-driver-565\n```\nVersion 470 still works with older Kepler cards like a Quadro K2000.\nUse latest version for newer GPUs.\n\n### Arch Linux\n\n```bash frame=\"none\"\nsudo pacman -S nvidia nvidia-utils opencl-nvidia\n```\nFor older GPUs, use drivers from the AUR:\n```bash frame=\"none\"\n# Kepler series newest driver: 470xx\nyay -S nvidia-470xx-dkms nvidia-470xx-utils opencl-nvidia-470xx\n\n# Fermi series newest driver: 390xx\nyay -S nvidia-390xx-dkms nvidia-390xx-utils opencl-nvidia-390xx\n```\n\n## AVX2 Optimizations\n\nVDF verification is now optimized for CPUs that support AVX2 and acceleration is done automatically when starting a node.\n\nTo disable VDF verification done on GPU with OpenCL and force the CPU to do it, run `./run_node.sh --Node.opencl_device -1` when running your node.\n\nOr for a more permanent solution, edit `config/local/Node.json` and set `opencl_device` value to -1.\n"
  },
  {
    "path": "docs/src/content/docs/guides/remote-services.md",
    "content": "---\ntitle: Remote Services\ndescription: How to setup and use remote mmx services.\n---\n\nThe following steps are provided for running multiple harvesters with a single node, or for separate node / farmer / wallet setups.\n\nTo enable remote access to a Node or Farmer:\n```bash frame=\"none\"\necho true > config/local/allow_remote\n```\nAlternatively, see \"Allow remote service access\" in GUI Settings.\n\nRemote harvesters need access to port `11333`, while remote farmer, timelord and wallet need port `11330`.\n\n### Remote Harvester\n\nTo run a remote harvester:\n```bash frame=\"none\"\n./run_harvester.sh -n node.ip\n```\nAlternatively to set the node address permanently: `echo node.ip > config/local/node`\n\n:::note[Note]\nTo connect to a remote farmer, replace `node.ip` with the farmer IP.\n:::\n\nTo disable the built-in harvester in the node: `echo false > config/local/harvester`\n\n### Remote Farmer\n\nTo run a remote farmer with it's own wallet and harvester:\n```bash frame=\"none\"\n./run_farmer.sh -n node.ip\n```\nAlternatively to set the node address permanently: `echo node.ip > config/local/node`\n\nTo disable the built-in farmer in the node: `echo false > config/local/farmer`\\\nTo disable the built-in wallet in the node or farmer: `echo false > config/local/wallet`\\\nTo disable the built-in harvester in the farmer: `echo false > config/local/harvester`\n\n### Remote Timelord\n\nTo run a remote timelord:\n```bash frame=\"none\"\n./run_timelord.sh -n node.ip\n```\nAlternatively to set the node address permanently: `echo node.ip > config/local/node`\n\nTo disable the built-in timelord in the node: `echo false > config/local/timelord`\n\n### Remote Wallet\n\nTo run a remote wallet:\n```bash frame=\"none\"\n./run_wallet.sh -n node.ip\n```\nAlternatively to set the node address permanently: `echo node.ip > config/local/node`\n\nTo disable the built-in wallet in the node: `echo false > config/local/wallet`\n\n### Remote connections over public networks\n\nTo use the remote services over a public network such the internet you should use an SSH tunnel, instead of opening port `11330` or `11333` to the world (which would hurt security).\n\nTo run an SSH tunnel to connect to a node from another machine (such as from a remote farmer):\n```bash frame=\"none\"\nssh -N -L 11330:localhost:11330 user@node.ip\n```\nThis will forward local port `11330` to port `11330` on the node's machine.\n"
  },
  {
    "path": "docs/src/content/docs/index.mdx",
    "content": "---\ntitle: MMX Docs\ndescription: Learn about MMX.\ntemplate: splash\nprev: false\nnext: false\neditUrl: false\nlastUpdated: false\nhead:\n  - tag: title\n    content: MMX Docs\n  - tag: style\n    content: \"\n        :root {\n          .content-panel:has(h1#_top) { display: none; }\n          .content-panel:has(footer) { border-top: 0px; }\n          main { padding-bottom: 0%; }\n          footer { display: none; }\n          .main-pane {\n            position: absolute;\n            align-content: center;\n            justify-content: center;\n            height: calc(100% - var(--sl-nav-height));\n            width: 100%;\n            padding-bottom: 25%;\n          }\n          @media (min-width: 50rem) {\n            .header { grid-template-columns: minmax(calc(max(0rem, calc(((100% - var(--sl-content-width)) / 2) - var(--sl-nav-gap) + 6.75rem ))), auto) 1fr auto; }\n          }\n        }\n    \"\n---\n\nimport MMXLEDBars from '../../components/MMXLEDBars.astro';\nimport MMXCardGrid from '../../components/MMXCardGrid.astro';\nimport MMXLinkCardT from '../../components/MMXLinkCardT.astro';\nimport MMXLinkCard from '../../components/MMXLinkCard.astro';\n\n<MMXLEDBars />\n<MMXCardGrid>\n\t<MMXLinkCardT title=\"Documentation\" icon=\"open-book\" url=\"guides/getting-started/\" />\n\t<MMXLinkCardT title=\"Articles\" icon=\"document\" url=\"articles/general/mmx-whitepaper/\" />\n\t<MMXLinkCard title=\"Guides\" icon=\"pencil\" url=\"guides/getting-started/\">\n\t\tHow to use MMX\n\t</MMXLinkCard>\n\t<MMXLinkCard title=\"Frequently Asked Questions\" icon=\"information\" url=\"faq/general/\">\n\t\tRead the FAQ\n\t</MMXLinkCard>\n\t<MMXLinkCard title=\"Software Reference\" icon=\"laptop\" url=\"software/cli-commands/\">\n\t\tCLI \\/ API \\/ Script reference\n\t</MMXLinkCard>\n\t<MMXLinkCard title=\"Technical Reference\" icon=\"open-book\" url=\"reference/blockchain/\">\n\t\tLearn about key concepts\n\t</MMXLinkCard>\n\t<MMXLinkCard title=\"Whitepaper\" icon=\"document\" url=\"articles/general/mmx-whitepaper/\">\n\t\tLearn about MMX\n\t</MMXLinkCard>\n\t<MMXLinkCard title=\"MMX Website\" icon=\"home\" url=\"https://mmx.network/\">\n\t\tmmx<span>.</span>network\n\t</MMXLinkCard>\n</MMXCardGrid>\n"
  },
  {
    "path": "docs/src/content/docs/reference/MMX_wallet.md",
    "content": "---\ntitle: MMX Wallet\ndescription: Important information for developing a wallet for MMX.\n---\n\n## MMX Wallet / Address Format\n\nNotes for 3rd party development:\n- When converting mnemonic words to a wallet seed, the byte order needs to be reversed, compared to BIP-39.\n- The key derivation function for the passphrase is non-standard:\n  - There is no chain XORing (not needed for sha512)\n  - There is no index being hashed in the first iteration\n- The byte order for bech32 addresses is reversed:\n  - When converting a public key to bech32, first the sha256 hash is computed, then the byte order is reversed and converted with standard Bech32m.\n  - When converting a bech32 address to a hash, the bytes from the resulting standard Bech32m decode need to be reversed.\n"
  },
  {
    "path": "docs/src/content/docs/reference/NFT_standard.md",
    "content": "---\ntitle: NFT Standard\n---\n\nNFTs on MMX are instances of the [nft.js](https://github.com/madMAx43v3r/mmx-node/blob/master/src/contract/nft.js) contract with binary `mmx1hzz9tgs2dz9366t3p4ep8trmaejx7tk9al9ah3md2u37pkesa3qqfyepyw`.\n\nEvery contract inherits from [TokenBase](https://github.com/madMAx43v3r/mmx-node/blob/master/interface/contract/TokenBase.vni), as such each NFT already has the following (read-only) fields:\n- `name`: String, max length 64\n- `meta_data`: Object\n\nThe standard for `meta_data` is as follows:\n- `description`: A human-readable description of the item. Markdown is supported.\n- `image`: Image URL. Use `mmx://mmx1...` for on-chain data.\n- `external_url`: Link to external site to view NFT.\n- `attributes`: Object of custom attributes (not standardized).\n"
  },
  {
    "path": "docs/src/content/docs/reference/Token_standard.md",
    "content": "---\ntitle: Token Standard\n---\n\nEvery smart contract has the following hard coded fields:\n- `name`: Full name (with whitespace)\n- `symbol`: Maximum of 6 characters (no whitespace)\n- `decimals`: How many decimals for display\n- `meta_data`: Generic variable with extra info\n\nBy convention, `meta_data` is an Object with the following fields:\n- `is_token`: Boolean to indiciate a standard token\n- `icon_url`: Currency icon (shown next to balance)\n- `logo_url`: Bigger logo image (shown on details page)\n- `website_url`: Website link\n- `description`: Longer text block with newlines, etc\n\nThe format to specify on-chain `WebData` resources per url is: `mmx://mmx1...`\n"
  },
  {
    "path": "docs/src/content/docs/reference/blockchain.md",
    "content": "---\ntitle: Blockchain\ndescription: Introduction to the MMX Blockchain.\n---\n\nA blockchain written from scratch, doing most things differently.\n1. MMX is designed to be a blockchain that can be used as an actual currency\n2. Variable supply will stabilize the price, key property of any currency\n3. Efficient implementation provides low transaction fees, at high throughput\n\n:::note[Note]\nIn-depth technical, read [whitepaper](../../../articles/general/mmx-whitepaper/). Light introduction, read [article](../../../articles/general/mmx-tldr/).\n:::\n\nDesign\n- Variable token supply governed by consensus (1 block = 1 vote)\n- High throughput L1 with consistent block interval (500 TPS, 10 sec)\n- Novel Smart Contract VM for ease of development and high performance\n- Energy efficient Proof of Space\n- Block reward is adjusted to stabilize price, a key property of any currency\n- Minimum transaction fee to allow large block size without spam\n- Limited external library usage to keep codebase clean and secure\n- No pre-mine, no ICO, no investors\n- Account based model\n\nElements\n- High performance C++ code (can handle over 1000 TPS easily)\n  - Transactions are executed in parallel when possible\n- Custom high-level VM for Smart Contracts\n  - Native support for variants, arrays, maps, and objects\n  - Unified memory with automatic persistence and state updates\n  - A restricted subset of JavaScript is compiled into bytecode\n  - Average of two machine instructions per line of code\n- Native token support (no \"approvals\" needed, NFT = 1 mojo)\n- Smart contract offer based trading (fixed price, OTC)\n- Liquidity pool swap based trading (AMM, multi-fee tiers, similar to Uniswap v3)\n- ECDSA signatures for seamless integration (same as Bitcoin)\n- Custom blockchain database engine (much faster than RocksDB or LevelDB overall)\n- Adaptive SHA256 VDF to govern block interval\n- Feature rich Node with built-in Block Explorer, Wallet, Market, Swap, RPC, etc\n\nMainnet started on 17th Jan 2025.\n\nSee [`#mmx-news`](https://discord.com/channels/852982773963161650/926566475249106974) and [`#mmx-general`](https://discord.com/channels/852982773963161650/925017012235817042) on [Discord](https://discord.gg/BswFhNkMzY).\n"
  },
  {
    "path": "docs/src/content/docs/reference/pooling_protocol.md",
    "content": "---\ntitle: Pooling Protocol\ndescription: MMX Pooling Protocol reference.\n---\n\n## Notes\n- MMX addresses are encoded via bech32 string\n- Hashes and signatures are encoded via little-endian upper-case hex string, without `0x` prefix\n- Account address = Payout address\n\n## Pool Server API\n\n### POST /partial\n\nEndpoint to post a partial.\n\nContent-Type: `application/json`\n\nPayload: Object\n- `height`: Block height the proof is for\n- `hash`: Message hash for signature (see below)\n- `contract`: Plot NFT address\n- `account`: Payout address (can be multiple per NFT, first partial creates account)\n- `pool_url`: The base URL used to make this request\n- `harvester`: Harvester name, usually hostname\n- `lookup_time_ms`: Harvester lookup time (ms)\n- `proof`: Proof, can be Proof of Space or Proof of Stake (see below)\n- `farmer_sig`: Farmer signature based on `hash` and `proof.farmer_key`\n- `__type`: `mmx.Partial`\n\nThe `proof` is an object as follows:\n- `__type`: Proof type (always `mmx.ProofOfSpaceNFT`)\n- `score`: Proof score\n- `plot_id`: Plot ID\n- `challenge`: challenge hash for this height and fork\n- `difficulty`: Partial difficulty used when performing lookup (might be different than current setting)\n- `farmer_key`: Farmer Public Key\n\nFor `proof.__type` == `mmx.ProofOfSpaceNFT` the following additional fields will be present:\n- `ksize`: Plot k-size\n- `seed`: Plot random seed\n- `proof_xs`: List of proof X values (256)\n- `contract`: Plot NFT contract address\n\nReturns status 200 with `application/json` object as follows:\n- `error_code`: Integer error code (see below)\n- `error_message`: Message string\n\n#### Example partial\n\nTODO: update\n```\n{\n  __type: 'mmx.Partial',\n  account: 'mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z',\n  challenge: 'CA98DB6504B2C85D876BEC1881F41E805D49FDE33DFE548A26C3277CFAE7EFF9',\n  contract: 'mmx19hxc7mfkdalx0khe5nr4r50t338z8sg4avn7vqu7ts4mpkxeg0lqhesvzl',\n  farmer_sig: '3CDCD57B151254835100F47F16834F91ED87838F5C68E113F236FD88169133643D06A4D50B6FB96859BECB73A73CE0E449262717B9907E70F05659F487C14F4B',\n  harvester: 'prime',\n  hash: 'B7269935091572E1004B48C327EEF2070DA0176A94AE2129AD8E68A9059FD95F',\n  height: 845490,\n  lookup_time_ms: 82,\n  difficulty: 1,\n  pool_url: 'http://localhost:8080',\n  proof: {\n    __type: 'mmx.ProofOfSpaceNFT',\n    contract: 'mmx19hxc7mfkdalx0khe5nr4r50t338z8sg4avn7vqu7ts4mpkxeg0lqhesvzl',\n    farmer_key: '027D7562FB5A8967E57A22F876302F75BA3AE3980607FB32E4439681F820AE398F',\n    ksize: 26,\n    plot_id: '22F0CA184633E07F32C5289B0ACF39597637CD6685D3CD4E7CD87CD56FAF8761',\n    proof_xs: [\n      61796699, 13346431, 24374059, 22439072, 65129000, 58802027,\n      ... 250 more items\n    ],\n    score: 25993,\n    seed: '091B11F9A066A9120AAD4BF8D30D933E4CED2EB3BF2CCA1DA72D8BA8E68BDA96'\n  }\n}\n```\n\n### GET /difficulty\n\nReturns current partial difficulty.\nIf farmer account does not exist yet, it should return a default starting difficulty.\n\nWill be polled by farmers every 300 sec by default.\n\nQuery parameters:\n- `id`: Farmer account address (payout address)\n\nAlways returns status 200 with `application/json` object as follows:\n- `difficulty`: Integer value\n\n### POST /set_difficulty\n\nEndpoint for custom partial difficulty settings. Support for this is optional.\n\nPartial difficulty is set per account (ie. payout address), not per plot NFT.\n\nContent-Type: `application/json`\n\nPayload: Object\n- `account`: Account address\n- `type`: `static` or `dynamic`\n- `value`: Static difficulty value, or partials per hour (integer) in case of dynamic\n- `time`: POSIX timestamp in seconds\n- `public_key`: Public key for account address\n- `signature`: Signature for message and `public_key`\n\nReturns status 200 with `application/json` object as follows:\n- `error_code`: Integer error code (see below)\n- `error_message`: Message string\n\n### GET /pool/info\n\nReturns pool information as `application/json` object:\n- `name`\n- `description`\n- `fee`: Pool fee (0 to 1, 1 = 100%)\n- `logo_path`: Relative path for logo image, starting with `/`.\n- `protocol_version`: `1`\n- `pool_target`: Plot NFT target address\n- `min_difficulty`: Lowest partial difficulty that is supported\n\n### GET /pool/stats\n\nReturns pool statistics as `application/json` object:\n- `estimated_space`: Estimated pool size in TB\n- `partial_rate`: Partials / hour\n- `farmers`: Number of active farmers\n\n### GET /account/info\n\nQuery parameters:\n- `id`: Farmer account address (payout address)\n\nReturns account info as `application/json` object:\n- `balance`: Current unpaid balance [MMX]\n- `total_paid`: Total amount paid out so far [MMX]\n- `difficulty`: Partial difficulty\n- `pool_share`: Relative farm size to pool (0 to 1)\n- `partial_rate`: Partials / hour\n- `blocks_found`: Number of blocks farmed\n- `estimated_space`: Estimated farm size in TB\n\n## Node API\n\n### POST /wapi/node/verify_partial\n\nEndpoint to verify a partial, optionally with plot NFT verification.\n\n:::note[Note]\nPartials should be verfied after a certain delay, for example once the height of the partial has been reached on-chain.\nPartials are computed 6 blocks in advance, so waiting until the partial's height has been reached will give 6 blocks security.\nEven in case of a re-org larger than 6 blocks, the chance a partial won't be valid anymore is only ~5%.\n:::\n\nContent-Type: `application/json`\n\nPayload: Object\n- `partial`: The same object as was received by the pool via POST `/partial`.\n- `pool_target`: Expected plot NFT target address (optional)\n  - When specified will verify plot NFT is locked to given target address at current blockchain height.\n\nReturns status 200 with `application/json` object as follows:\n- `error_code`: Integer error code (see below)\n- `error_message`: Message string\n\nWhen the node is not synced will return status 500 with error text.\n\n### POST /wapi/node/verify_plot_nft_target\n\nEndpoint to verify that a plot NFT is locked and pointed to the given target address at the current blockchain height.\n\nContent-Type: `application/json`\n\nPayload: Object\n- `address`: Plot NFT address\n- `pool_target`: Expected plot NFT target address\n\nReturns status 200 with `application/json` object as follows:\n- `error_code`: Integer error code (see below)\n- `error_message`: Message string\n\nWhen the node is not synced will return status 500 with error text.\n\n## Message hash algorithm\n\nA string is generated for JSON objects as follows:\n\n- First the `__type` field is added, followed with `/`\n- Then for each field in the specified order:\n  - The field name is added, followed with a `:`\n  - The field value is added (floating point values are floored first)\n- For any nested objects, the same scheme is followed.\n\nThe final string is hashed via `SHA2-256`.\n\n## Error Codes\n\nError codes are transferred as strings in JSON:\n- `NONE`: No error\n- `INVALID_PARTIAL`\n- `DUPLICATE_PARTIAL`\n- `PARTIAL_TOO_LATE`\n- `PARTIAL_NOT_GOOD_ENOUGH`\n- `CHALLENGE_REVERTED`\n- `CHALLENGE_NOT_FOUND`\n- `INVALID_PROOF`\n- `INVALID_DIFFICULTY`\n- `INVALID_SIGNATURE`\n- `INVALID_CONTRACT`\n- `INVALID_AUTH_KEY`\n- `INVALID_ACCOUNT`\n- `INVALID_TIMESTAMP`\n- `POOL_LOST_SYNC`\n- `SERVER_ERROR`\n"
  },
  {
    "path": "docs/src/content/docs/software/MMX_script.md",
    "content": "---\ntitle: MMX Script\ndescription: MMX Script smart contract language reference.\n---\n\nThe MMX smart contract language is a restricted subset of JavaScript with some additional features.\n\n## Types\n\n- Null (`null`)\n- Boolean (`true` / `false`)\n- Integer (256-bit unsigned)\n- Binary (aka. \"binary string\", same as `ArrayBuffer` in JS)\n- String (UTF-8 encoded)\n- Array\n- Map\n\n:::note[Note]\nObjects are maps with string keys.\n:::\n\n## Deviations from JavaScript\n\n- `var` has local scope (behaves like `let`)\n- Integer overflows / underflows will fail execution (except for `unsafe_*(...)`)\n- Reading un-initialized variables will fail execution (instead of returning `undefined`)\n- Reading non-existent map values will return `null` (instead of `undefined`)\n- Out of bounds array access will return `null` by default (instead of `undefined`)\n- `==` comparison is strict (ie. same as `===` in JS)\n- `+` only supports integer addition (need to use `concat()` for strings)\n- `$` is not supported in variable / function names\n- `delete` is a function (not an operator) and only works on variables directly\n\n## Not supported from JavaScript\n\n- Classes (KISS)\n- Signed integers / negative values\n- Floating point values / arithmetic\n- Function variables (all functions are global like in `C`)\n- `let` (because `var` is already like `let`)\n- `undefined` (you'll get `null` or execution failure instead)\n- `for(... of ...)` loops over maps or objects (supported only for arrays)\n- `for(... in ...)` style loops\n- `===` operator (because `==` is strict already)\n- `**`, `?.`, `??` operators\n- `(condition ? ifTrue : ifFalse)`\n- `switch()`\n- `function*`\n- `void`, `new`, `class`, `typeof`, `await`, `async`, `with`, `super`\n- `export`, `throw`, `try`, `catch`, `instanceof`, `yield`\n- Template strings\n- Multiple assignment: `[a, b] = arr, {a, b} = obj`\n- Spread syntax `(...)`\n- Any built-in classes like:\n  - `Array`, `Map`, `Set`, `Time`, `Date`, `Number`, `Math`\n  - `Error`, `Object`, `Function`, `Boolean`, `Symbol`\n  - `String`, `RegExp`, `Promise`, `Iterator`, `Proxy`\n- Any built-in functions like:\n  - `eval()`, `escape()`, `unescape()`\n\n## Additional features\n\n- `const` function modifier\n  - `function get_price() const {}`\n  - `const` functions cannot modify contract state\n- `static` function modifier\n  - `function init_ex(...) static {}`\n  - Denotes that function is a constructor (executes static init first)\n  - Any `init()` function is implicitly static\n- `public` function modifier\n  - `function payout() public {}`\n  - Only public functions can be executed via transactions.\n- `payable` function modifier\n  - `function trade(...) public payable {}`\n  - Required to support deposits with function call.\n  - A `deposit()` function is always `payable`.\n\n- Special `this` object to access built-in variables:\n  - `txid`: The transaction ID (Type: 32-bytes or `null`)\n  - `height`: The block height at which the code is executed (Type: 256-bit unsigned int)\n  - `balance`: Map of contract balances (Type: Map[32-bytes] = 256-bit unsigned int)\n    - Returns `0` in case of missing balance entry (instead of `null`).\n  - `address`: Contract address (Type: 32-bytes)\n  - `user`: A user address can be specified when executing a contract function,\n    which is verified via a signature before executution, same as `msg.sender` in EVM.\n    In case of a remote call this is the address of the caller's contract.\n    (Type: 32-bytes or `null`)\n  - `deposit`: Object to check for deposited currency and amount (for `payable` functions):\n    - `currency`: Currency address (Type: 32-bytes)\n    - `amount`: Amount deposited (Type: 256-bit unsinged int)\n\n## Operators (sorted by rank)\n\n- `.`: field access (objects / maps only)\n- `++`: pre or post increment (integers only)\n- `--`: pre or post decrement (integers only)\n- `!`: Logical NOT\n- `~`: Bitwise NOT (integer only)\n- `*`: Multiplication (integers only)\n- `/`: Division (integers only)\n- `%`: Modulo division (integers only)\n- `+`: Addition (integers only, see `concat()` for strings)\n- `-`: Subtraction (integers only)\n- `>>`: Right shift (integers only)\n- `<<`: Left shift (integers only)\n- `<`: Less than (fails if not same type)\n- `>`: Greater than (fails if not same type)\n- `<=`: Less than or equal (fails if not same type)\n- `>=`: Greater than or equal (fails if not same type)\n- `!=`: Not equal (any types)\n- `==`: Equals (any types, strict, no implicit conversions)\n- `&`: Bitwise AND (integers only)\n- `&&`: Logical AND\n- `^`: Bitwise XOR (integers only)\n- `^^`: Logical XOR\n- `|`: Bitwise OR (integers only)\n- `||`: Logical OR\n- `=`: Right to left assignment\n- `+=`: Inplace addition (integers only)\n- `-=`: Inplace subtraction (integers only)\n- `*=`: Inplace multiplication (integers only)\n- `/=`: Inplace division (integers only)\n- `>>=`: Inplace right-shift (integers only)\n- `<<=`: Inplace left-shift (integers only)\n\n## Built-in functions\n\n- `size(array)`: Returns the size of an array, string or binary\n- `push(array, value)`: Pushes a value onto the end of an array\n- `pop(array)`: Pops a value off the back of an array\n- `set(map, key, value):`: Same as `map[key] = value` or `array[key] = value` (with integer key)\n- `get(map, key)`: Same as `map[key]` or `array[key]` (with integer key)\n- `erase(map, key)`: Same as `map[key] = null`\n- `delete(v)`: Deletes a variable (read after delete will fail, re-assign is possible)\n- `min(a, b)`: Returns smaller value (integers only)\n- `max(a, b)`: Returns larger value (integers only)\n- `clone(v)`: Makes a (deep) copy and returns reference\n- `deref(v)`: Returns a (deep) copy (without reference) of the value given by a reference\n- `typeof(v)`: Returns an integer to denote a variable's type:\n  - 0 = `null`\n  - 1 = `false`\n  - 2 = `true`\n  - 4 = Integer (256-bit unsinged)\n  - 5 = String\n  - 6 = Binary\n  - 7 = Array\n  - 8 = Map\n- `concat(a, b, [...])`: Returns concatenation of two or more (binary) strings (like `a + b + ...` in JS)\n- `memcpy(src, count, [offset])`\n  - Returns a sub-string of `src` with length `count` starting at `offset`\n  - `offset` defaults to `0`\n  - `src` must be a string or binary string\n  - Out of bounds access will fail execution\n- `fail(message, [code])`: Fails execution with string `message` and optional integer `code`\n- `assert(condition, [message], [code])`: Fails execution if `condition` does not evaluate `true`\n  - If `message` is not specified, it will print source code instead.\n- `bech32(addr)`: Parses a bech32 address string and returns 32 bytes.\n  - Returns 32 zero bytes if no argument given, which corresponds to the zero address.\n- `binary(v)`: Converts to a binary\n  - Returns binary for strings (1-to-1 copy)\n  - Returns little endian 32-byte binary for integers\n- `binary_le(v)`: Same as `binary()` except:\n  - Returns big endian 32-byte binary for integers\n- `binary_hex(v)`: Same as `binary()` except:\n  - Parses input string as a hex string, with optional `0x` prefix.\n- `bool(v)`: Converts to boolean\n  - Returns `false` for: `null`, `false`, `0`, empty (binary) string\n  - Otherwise returns `true`\n- `uint(v)`: Converts to 256-bit unsigned integer\n  - `null` => 0, `false` => 0, `true` => 1\n  - `\"123\"` => 123, `\"0b10\"` => 2, `\"0xFf\"` => 255\n  - Binary strings are parsed in big endian: `[00, FF]` => `0x00FF` / `255`\n- `uint_le(v)`: Same as `uint()` except binary strings are parsed in little endian.\n- `uint_hex(v)`: Same as `uint()` except strings are parsed in hex, even without `0x` prefix.\n- `string(v)`: Converts to a string\n  - Integers are converted to decimal\n  - String inputs are returned as-is\n  - Binary strings are converted as-is (like memcpy())\n- `string_hex(v)`: Same as `string()` except:\n  - Converts integers and binary strings to a hex string, without `0x` prefix.\n- `string_bech32(v)`: Same as `string()` except:\n  - Converts binary string to a bech32 address string `mmx1...` (fails if not 32 bytes)\n  - Converts `null` to zero address string `mmx1qqqq...`\n- `is_uint(v)`: Returns `true` if argument is of type integer\n- `is_string(v)`: Returns `true` if argument is of type string\n- `is_binary(v)`: Returns `true` if argument is of type binary\n- `is_array(v)`: Returns `true` if argument is of type array\n- `is_map(v)`: Returns `true` if argument is of type map\n- `balance([currency])`: Returns current balance for given currency (for the contract)\n  - `currency` defaults to MMX if not specified (32-byte binary)\n- `send(address, amount, [currency], [memo])`: Transfer funds from contract to an address\n  - `address` is destination address as 32-byte binary\n  - `amount` is integer amount, fails if larger than 64-bit\n  - `currency` is currency address as 32-byte binary, defaults to MMX (ie. `bech32()`)\n  - `memo` is an optional memo string (fails if longer than 64 chars)\n  - Does nothing if `amount` is zero\n  - Fails if balance is insufficient\n  - Returns `null` (ie. nothing)\n- `mint(address, amount, [memo])`: Mint new tokens of contract and send to address\n  - `address` is destination address as 32-byte binary\n  - `amount` is integer amount, fails if larger than 64-bit\n  - `memo` is an optional memo string (fails if longer than 64 chars)\n  - Does nothing if `amount` is zero\n  - Returns `null` (ie. nothing)\n  - This is the only way to mint tokens on MMX blockchain\n- `sha256(msg)`: Computes SHA-2 256-bit hash for given input message (binary or string)\n  - Returns hash as 32 bytes\n- `ecdsa_verify(msg, pubkey, signature)`: Verifies a ECDSA signature\n  - Returns `true` if valid, otherwise `false`\n  - `msg` must be 32 bytes\n  - `pubkey` must be 33 bytes\n  - `signature` must be 64 bytes\n- `rcall(contract, method, [arg0], [arg1], ...)`: Calls function of another contract and returns value\n  - `contract` is a string idendifier of the contract to call (specified at deploy time)\n  - `method` is the method name as string (without `()`)\n  - Returns value from the function call\n- `read(field, [address])`:\n  - Returns the value of a non-storage contract field (which is constant)\n  - `address` is current contract if not specified\n  - Storage fields cannot be read with this function, need to use `rcall()` instead\n- `log(level, message)`: For debugging / testing only\n  - Logs a string message at integer `level`\n- `event(name, data)`: For debugging / testing only\n  - Logs an event with string `name` and arbitrary `data`\n- `__nop()`: Injects an `OP_NOP` instruction (for debugging)\n- `__copy(dst, src)`: Same as `dst = src` but bypasses compiler const check on `dst` for debugging.\n\n## Fixed-point Arithmetic\n\nBecause floating point values and arithmetic are not supported, one has to use fixed-point arithmetic.\n\nFirst you need to choose how much precision is needed.\nA good choice would be 64-bits or 96-bits, such that a 256-bit overflow is not possible when adding a lot of 128-bit values.\nAccount balances can be up to 128-bit, while amounts (for deposit and sending) are limited to 64-bit.\n\nLet's say we choose 64-bit precision.\nThis means we multiply all constants by 2^64 (or left shift by 64) and right shift by 64 to get a result.\nFor example `123456 * 1.337 = 165060.672`:\n```js\nconst factor = 24663296826549670511;       // 1.337\nconst result = (123456 * factor) >> 64;    // 165060\n```\nFixed point arithmetic always rounds down.\nWhen converting floating point constants, rounding to nearest is best for accuracy.\n\n## Passing function arguments from the outside\n\nFunction argument passing from the outside is limited to what JSON can describe.\nThis means no integer values greater than 64-bit and no binary strings.\n\nIn order to pass an address, pass it as a bech32 encoded string (`mmx1..`) and then decode via `bech32(...)`.\n\nIn order to pass binary strings, encode it as a hex string (`0x...`) and then decode via `binary_hex(...)`.\n\nIn order to pass integers greater than 64-bits you can encode them as a decimal or hex string (`0x...`)\nand then decode via `uint(...)`. Hex encoding is recommended, since decimal decoding is expensive.\n\n## Implicit Type Conversion\n\nBy default MMX script does *not* perform any implicit type conversion except in the following cases:\n- `if(cond)`: `cond` is casted to `bool`, same as `if(bool(cond))`\n- `while(cond)`: `cond` is casted to `bool`, same as `while(bool(cond))`\n- `for(...; cond; ...)`: `cond` is casted to `bool`, same as `for(...; bool(cond); ...)`\n- `!cond`: `cond` is casted to `bool`, same as `!bool(cond)`\n- `A && B`: `A` and `B` are casted to `bool`, same as `bool(A) && bool(B)`\n- `A || B`: `A` and `B` are casted to `bool`, same as `bool(A) || bool(B)`\n- `A ^^ B`: `A` and `B` are casted to `bool`, same as `bool(A) || bool(B)`\n\nFor example the following is valid code:\n```\nif(null) {}\nwhile(1) {}\nfor(; 1;) {}\n!null\n!\"\"\n1 && 2\nnull || \"yes\"\n```\n\nHowever, the following code is invalid:\n```\nnull < 1\nnull + 1\n\"1\" > 0\n\"1\" + 1\n```\n\n## Examples\n\n### Contract Storage\n\nAny global variable will be persisted accross the lifetime of a contract:\n```js\nvar storage = [];\nfunction add(value) public {\n  push(storage, value);\n}\nfunction get() const public {\n  return storage;\n}\n```\n\n### Constructor\n\nAny `static` private function can be a constructor. When deploying a contract you have to specify which function to use.\\\nThe default is to use `init()`:\n```js\nvar foo;\nvar spec;\nfunction init(bar) {\n  foo = bar;\n}\nfunction init_v(bar, v) static {\n  foo = bar;\n  spec = v;\n}\n```\n\n:::note[Note]\n`init()` is always marked as `static`.\\\nGlobal variables are initialized to `null` before constructor is executed.\n:::\n\n### Deposit\n\nDeposits in MMX are made through function calls to a `payable` function:\n```js\nvar currency = bech32();\nvar balances = {};\nfunction deposit(account) public payable {\n  if(this.deposit.currency != currency) {\n    fail(\"invalid currency\");\n  }\n  balances[account] += this.deposit.amount;\n}\n```\n\n:::note[Note]\nIf a function is called \"deposit\" the `payable` modifier can be omitted.\\\n`this.balance` already includes the deposited amount, it always equals the amount that can be spent via `send()`.\n:::\n\nTrying to deposit funds via a non-`payable` function is not possible.\nHowever it's possible to send funds to a contract via normal transfer.\nIn this case no function is called, and the contract needs to handle this case implicitly.\nIt cannot be avoided since it's possible to send to a contract's address before deployment.\n\nFunds that are sent to a contract (via normal transfer) at height `H` will only be visible to the contract at height `H+1`.\n\nAny funds not spent in the transaction that deploys a contract will be credited to the contract's address before the contructor is called.\nThis allows a more efficient way to deploy with funding, compared to executing a deposit function.\n\n### Built-in Contracts\n\n- [offer.js](https://github.com/madMAx43v3r/mmx-node/tree/master/src/contract/offer.js) - Offer\n  - Allows to trade between two currencies at a fixed price (See GUI -> Market)\n  - Takers can trade any fraction of the offer\n  - Maker can cancel / refill at any time\n  - Bids are accumulated in the contract (for lower tx fees)\n  - Manual withdrawal will transfer accumulated bids to maker wallet\n- [swap.js](https://github.com/madMAx43v3r/mmx-node/tree/master/src/contract/swap.js) - Swap\n  - Liquidity pool AMM, similar to UniSwap (see GUI -> Swap)\n  - Has 4 different fee-tiers, each with their own liquidty and price\n  - A trade is divided into multiple chunks / iterations\n  - `trade()` loops over all pools in multiple iterations and picks the best pool to trade with for each chunk (while taking the fee into account)\n  - Supports one-sided liquidity\n  - Liquidity is locked for 24 hours after it's been added / or fee-tier was changed\n  - A single account can only provide liquidity for one fee-tier\n  - Fee payouts are heuristic for better trade efficiency (manual trigger, no automatic compounding)\n- [plot_nft.js](https://github.com/madMAx43v3r/mmx-node/tree/master/src/contract/plot_nft.js) - Plot NFT\n  - Used for pooled farming to control rewards / switch pools\n- [token.js](https://github.com/madMAx43v3r/mmx-node/tree/master/src/contract/token.js) - Simple Token\n  - Token contract with single owner to mint a token (without limits)\n- [nft.js](https://github.com/madMAx43v3r/mmx-node/tree/master/src/contract/nft.js) - NFT\n  - Contract used to mint NFTs\n  - Ensures only a single token is ever minted by a verified creator\n- [time_lock.js](https://github.com/madMAx43v3r/mmx-node/tree/master/src/contract/time_lock.js) - Simple Time Lock\n- [escrow.js](https://github.com/madMAx43v3r/mmx-node/tree/master/src/contract/escrow.js) - Simple Escrow with middle-man\n\n### Minting tokens\n\nMinting tokens is only possible via calling `mint()`, which mints new tokens of the contract.\\\nEvery contract is also a currency, contract address = currency address.\n\nA smart contract inherits from `mmx.contract.TokenBase`, which has the following fields:\n- string `name`\n- string `symbol`\n- int `decimals` = 0\n- vnx.Variant `meta_data`\n\nIf `decimals` is needed inside the code, it can be retrieved via `read(\"decimals\")`, but usually this is not needed.\nThe same goes for `symbol`, etc.\n\n### Deploying a Smart Contract\n\nA smart contract's code is actually a separate \"contract\" of type `mmx.contract.Binary` which needs to be deployed first.\n\nMultiple contracts can share the same binary, this reduces the cost of deploying contracts significantly.\n\nIf the code is not deployed on-chain yet, it needs to be compiled and deployed first:\n```bash frame=\"none\"\nmmx_compile -t -n testnet12 -f example.js -o example.dat\nmmx wallet deploy example.dat\n```\n`mmx_compile` returns the binary address that we need to sepecify when deploying a contract later.\n`-n testnet12` can be omitted for mainnet.\n\nOnce the binary is confirmed on-chain, we can deploy any number of contracts with the same code.\\\nThis can be done via JSON files:\n```json\n{\n  \"__type\": \"mmx.contract.Executable\",\n  \"name\": \"Example\",\n  \"symbol\": \"EXMPL\",\n  \"decimals\": 6,\n  \"binary\": \"mmx1...\",\n  \"init_method\": \"init\",\n  \"init_args\": [...]\n}\n```\nIf the contract does not represent a token, `name`, `symbol` and `decimals` can be omitted.\nIf `init_method` is \"init\", it can be omitted as well since it's the default.\n\nNow deploying a contract from JSON file:\n```bash frame=\"none\"\nmmx wallet deploy example.json\n```\nEvery contract will have a different address since the wallet generates a random 64-bit transaction nonce by default.\n\nThe node keeps track which `sender` deployed a contract, as such you can view all your deployed contracts via:\n```bash frame=\"none\"\nmmx wallet show contracts\n```\n\n### Executing a smart contract function\n\nExecuting a smart contract function can be done via command line:\n```bash frame=\"none\"\nmmx wallet exec <method> [args] -x <contract>\n```\nThis will submit a transaction to the network.\n\nTo make a deposit:\n```bash frame=\"none\"\nmmx wallet deposit <method> [args] -a <amount> -x <currency> -t <contract>\n```\nBe careful not to confuse `-x` and `-t`: `-t` is the destination, while `-x` is the currency to deposit.\n\nBy default `this.user` is set to the wallet's first address (index `0`).\nThis can be overriden with a different address index:\n```bash frame=\"none\"\nmmx wallet exec <method> [args] -k <index>\nmmx wallet exec <method> [args] -k -1  # this will set `user` to `null`\n```\nThe same applies to `mmx wallet deposit`.\n\nSpecific examples:\n```bash frame=\"none\"\nmmx wallet exec test_me 1 2 3 -x mmx1...\nmmx wallet deposit test_me 1 2 3 -x mmx1... -t mmx1...  # `-t` is like `-x` for `exec`\nmmx wallet deposit -x mmx1... -t mmx1...  # this will call `deposit()` without args\n```\n\nTo execute a function just for testing:\n```bash frame=\"none\"\nmmx node call <method> [args] -x <contract>\n```\nThis will not submit any transaction, but rather just simulate a call at the current blockchain `height + 1`.\n\n### Inspecting a Contract\n\nTo view the contract that was deployed:\n```bash frame=\"none\"\nmmx node get contract <address>\n```\n\nTo view a contract's state (global storage variables):\n```bash frame=\"none\"\nmmx node read -x <address>\nmmx node read <field> -x <address>  # `field` can be a variable name or hex address `0x...`\n```\n\nTo dump a contracts's entire storage:\n```bash frame=\"none\"\nmmx node dump -x <address>\n```\n`<0x...>` denotes a reference, `[0x...,size]` denotes an array, `{0x...}` denotes a map / object.\n\nTo dump a contract's binary code:\n```bash frame=\"none\"\nmmx node dump_code -x <address>\n```\n\n#### Address Ranges\n\nMemory is unified in MMX, but there are regions for different usage:\n- `0x0000000` to `0x3FFFFFF`: constant data\n- `0x4000000` to `0x7FFFFFF`: external data (`this.*`)\n- `0x8000000` to `0x47FFFFFF`: stack (`0x8000000` = return value, `0x8000001` = first argument)\n- `0x48000000` to `0xFFFFFFFF`: global variables (stored in DB)\n- `0x100000000` to `0xFFFFFFFFFFFFFFFF`: heap / dynamic storage (stored in DB, if not garbage collected)\n\n## Notes\n\n### References\n\nAs in JavaScript: Arrays, Maps and Objects are reference counted.\n\nThat means \"copying\" by assignment does not make a deep copy, it only copies the reference:\n```js\nconst array = [1, 2, 3];\nconst tmp = array;\npush(tmp, 4);\nreturn array;  // returns [1, 2, 3, 4]\n```\n```js\nconst object = {\"foo\": {}};\nconst foo = object.foo;\nfoo.bar = true;\nreturn object;  // returns {foo: {\"bar\": true}}\n```\nIn order to make a deep-copy you need to use `clone()`.\n\n### clone() from storage\n\nIt's not possible to clone maps / objects from contract storage:\n```js\nvar object = {};\nfunction test() public {\n  return clone(object);  // will fail\n}\n```\n\n### Account balances\n\nBalances and amounts are always stored / specified in \"sats\" aka. \"binks\", meaning no decimals.\nFloating point representation with decimals is always just for display purposes.\n\nContract code can only access the balances of itself,\nnot other contracts or addresses (since that would break parallel execution).\nHowever it's possible to call a method of another contract that returns its balance.\nIn this case execution is serialized.\n\n:::note[Note]\n`this.balance` is updated automatically when receiving funds via deposit, or when spending via `send()`.\n:::\n\n### Instruction costs\n\nTODO\n"
  },
  {
    "path": "docs/src/content/docs/software/RPC_protocol.md",
    "content": "---\ntitle: RPC Protocol\ndescription: MMX Node RPC Protocol.\n---\n\nEvery node exposes a HTTP endpoint on `localhost:11380` (by default).\nBinding to `0.0.0.0` needs to be enabled in `config/local/HttpServer.json`.\n\nThe native API can be accessed via `/api/`.\nA web-friendly `/wapi/` is available for select features.\n\n## Authentication\n\nAuthentication is required to access private API endpoints or remove limits from public enpoints.\n\nThe best way to setup static authentication is to create an API token, by editing `config/local/HttpServer.json`:\n```json\n{\n  \"token_map\": [\n    [\"secure_random_token_here\", \"ADMIN\"]\n  ]\n}\n```\nA secure random token can be generated with the `generate_passwd` tool.\n`ADMIN` allows access to every endpoint, even spending from the wallet.\n`USER` does not allow wallet spending.\n\nTo use the token, a HTTP header `x-api-token: <token>` needs to be specified for every request.\nThe name of this header can be changed by setting `token_header_name` in `HttpServer.json`.\n\n## Native API\n\nThe native API can be accessed via `/api/`:\n- `/api/node/` to access Node API\n- `/api/router/` to access Router API\n- `/api/wallet/` to access Wallet API\n- `/api/farmer/` to access Farmer API\n- `/api/harvester/` to access Harvester API\n\nDocumentation for those are found in [modules](https://github.com/madMAx43v3r/mmx-node/tree/master/modules).\n\n`GET` can be used for `const` methods.\n`POST` is needed for `non-const` methods, with a JSON object payload containing the function arguments.\nResults are returned in JSON format.\n\nHashes and addresses are returned as byte arrays, not as a hex or bech32 string.\nHowever they can be specified this way for arguments.\n\n## WebAPI (WAPI)\n\nA web friendly API is available to make developing web applications easier.\n\nIn case of an error a plaintext error message is returned, with a status code != 200.\n\n### Public WAPI\n\nThe public section of the WAPI can be accessed without authentication, but limits are enforced to prevent large queries.\nThis is what RPC servers provide.\n\n#### GET /wapi/chain/info\n\nReturns an object with global parameters, see [ChainParams.vni](https://github.com/madMAx43v3r/mmx-node/blob/master/interface/ChainParams.vni).\n\n#### GET /wapi/node/info\n\nReturns an object with current network info, see [NetworkInfo.vni](https://github.com/madMAx43v3r/mmx-node/blob/master/interface/NetworkInfo.vni).\n\n#### GET /wapi/header\n\nQuery parameters:\n- `hash`: Block hash, or:\n- `height`: Block height\n\nReturns block header object, or status 404 if not found.\n\n#### GET /wapi/headers\n\nQuery parameters:\n- `limit`: Result limit (default = 20)\n- `offset`: Optional starting height\n\nReturns array of most recent block headers.\n\n#### GET /wapi/block\n\nQuery parameters:\n- `hash`: Block hash, or:\n- `height`: Block height\n\nReturns full block object, or status 404 if not found.\n\n#### GET /wapi/transaction\n\nQuery parameters:\n- `id`: Transaction ID (hex string)\n\nReturns transaction info object (see [tx_info_t.vni](https://github.com/madMAx43v3r/mmx-node/blob/master/interface/tx_info_t.vni)), or status 404 if not found.\n\n#### GET /wapi/transactions\n\nReturns array of most recent transaction info objects, or list of transaction info objects for a given block height.\n\nQuery parameters:\n- `limit`: Result limit (default = 100)\n- `height`: Optional block height\n- `offset`: Optional starting index when `height` is specified\n\n#### GET /wapi/address\n\nQuery parameters:\n- `id`: Address (bech32)\n\nReturns object:\n- `balances`: Array of balance objects\n- `contract`: Contract object if not a regular wallet address\n\n#### GET /wapi/address/history\n\nQuery parameters:\n- `id`: Address (bech32)\n- `limit`: Result limit (default = 100)\n- `since`: Since block height, inclusive (default = 0)\n- `until`: Until block height, inclusive (default = current height)\n- `type`: Optional type filter: `RECEIVE`, `SPEND`, `TXFEE`, `REWARD`, `VDF_REWARD`\n- `currency`: Optional curreny filter (bech32 token address)\n\nReturns an array of history objects, same as `/wapi/wallet/history`.\n\n#### GET /wapi/balance\n\nQuery parameters:\n- `id`: Address (bech32)\n- `limit`: Optional result limit (default = 100)\n- `currency`: Optional currency address (bech32)\n\nReturns object:\n- `balances`: Array of balance objects\n- `nfts`: Array of NFT addresses\n\n#### GET /wapi/supply\n\nTo query current supply of a given token.\n\nQuery parameters:\n- `id`: Currency address (bech32, defaults to MMX)\n\nReturns object:\n- `value`: Supply with decimals\n- `amount`: Supply as raw integer (but string format)\n\n#### GET /wapi/contract\n\nQuery parameters:\n- `id`: Address (bech32)\n\nReturns contract object, or `null` in case not a contract.\n\n#### GET /wapi/plotnft\n\nQuery parameters:\n- `id`: Address (bech32)\n\nReturns PlotNFT info, or status 404 if not a PlotNFT.\n\n#### GET /wapi/contract/exec_history\n\nQuery parameters:\n- `id`: Address (bech32)\n- `limit`: Result limit (default = 100)\n\nReturns an array of most recent contract execution objects (see [exec_entry_t.vni](https://github.com/madMAx43v3r/mmx-node/blob/master/interface/exec_entry_t.vni)).\n\n#### GET /wapi/contract/storage\n\nQuery parameters:\n- `id`: Address (bech32)\n\nReturns object with contract storage fields.\n\n#### GET /wapi/contract/storage/field\n\nQuery parameters:\n- `id`: Address (bech32)\n- `name`: Field name\n\nReturns value of specified contract storage field.\n\n#### GET /wapi/contract/storage/entry\n\nQuery parameters:\n- `id`: Address (bech32)\n- `name`: Field name, or:\n- `addr`: Field address\n- `key`: Map key\n\nReturns value for a specified key in a storage map.\n\n#### GET/POST /wapi/contract/call\n\nExecutes a smart contract function in read only mode and returns the result.\n\nQuery parameters:\n- `id`: Contract address (bech32)\n- `method`: Method name (without `()`)\n- `user`: Optional user address (bech32)\n\nWhen needing to specify function arguments, `POST` has to be used with the following JSON object content:\n- `args`: Array of function arguments\n- `deposit`: Optional deposit info (array of [currency, amount])\n\nExample: `POST /wapi/contract/call?id=mmx1...&method=get_price` with content:\n```\n{\"args\": [0]}\n```\n\n#### GET /wapi/farmers\n\nQuery parameters:\n- `limit`: Result limit (default = 100)\n\nReturns an array of objects in descending order:\n- `farmer_key`: Farmer public key\n- `block_count`: Number of blocks farmed since genesis\n\n#### GET /wapi/farmer\n\nQuery parameters:\n- `id`: Farmer public key (hex string)\n- `since`: Optional starting height (default = 0)\n\nReturns farmer summary object.\n\n#### GET /wapi/farmer/blocks\n\nQuery parameters:\n- `id`: Farmer public key (hex string)\n- `limit`: Result limit (default = 50)\n- `since`: Optional starting height (default = 0)\n\nReturns array of recently farmed block headers.\n\n#### POST /wapi/transaction/validate\n\nValidates a given transaction as specified via request payload and returns execution result object (see [exec_result_t.vni](https://github.com/madMAx43v3r/mmx-node/blob/master/interface/exec_result_t.vni)):\n- `did_fail`: Boolean, if transaction failed (but still able to include)\n- `error`: Error object (see [exec_error_t.vni](https://github.com/madMAx43v3r/mmx-node/blob/master/interface/exec_error_t.vni)) in case of failure, otherwise `null`\n- `total_cost`: Total transaction cost\n- `total_fee`: Total fee as raw integer (`total_cost` times fee ratio)\n- `total_fee_value`: Total fee in MMX (with decimals)\n\nReturns status 400 with error message in case static validation failed, for example due to:\n- Invalid hash\n- Invalid signature\n- Insufficient balance for TX fee\n\n:::note[Note]\nClients must handle `nonce` field as a 64-bit integer, truncation will cause static failure.\n:::\n\n#### POST /wapi/transaction/broadcast\n\nValidates and sends a given transaction as specified via request payload.\nWill skip sending and return status 400 if static validation failed.\nReturns status 200 on success.\n\n### Wallet WAPI\n\nCommon parameters:\n- `index`: Wallet index, see `/wapi/wallet/accounts` or `mmx wallet accounts`.\n- `options`: Object with additional options:\n  - `auto_send`: If to send transaction automatically (default = true)\n  - `mark_spent`: If to mark transaction as spent in cache (default = false)\n  - `fee_ratio`: TX fee ratio as integer (default = 1024)\n  - `gas_limit`: Limit for extra dynamic cost (default = 5 MMX)\n  - `expire_at`: Optional expiration height\n  - `expire_delta`: Expiration delta, relative to current height (default = 100, `null` to disable)\n  - `nonce`: Custom nonce (needs be > 0)\n  - `user`: Custom user for contract calls (default = first address)\n  - `sender`: Custom sender address (who will pay TX fee, default = first address)\n  - `passphrase`: Optional passphrase to atomically unlock wallet.\n  - `note`: Transaction note, see [tx_note_e.vni](https://github.com/madMAx43v3r/mmx-node/blob/master/interface/tx_note_e.vni).\n  - `memo`: Optional memo string (max. 64 chars)\n\nEndpoints that send a transaction will first validate it, and if invalid sending is aborted (saving TX fees).\n\n#### GET /wapi/wallet/accounts\n\nReturns an array of account objects:\n- `account`: Wallet index\n- `address`: First wallet address\n- `name`: Custom wallet name\n- `index`: Sub-account index, zero by default.\n- etc\n\n#### GET /wapi/wallet/account\n\nQuery parameters:\n- `index`: Wallet index\n\nReturns specific wallet info, same as `wallet/accounts`.\n\n#### GET /wapi/wallet/balance\n\nQuery parameters:\n- `index`: Wallet index\n- `currency`: Optional currency address (bech32)\n- `with_zero`: If to include zero balances (default = false)\n\nReturns an object:\n- `balances`: Array of balance objects\n- `nfts`: Array of NFT addresses\n\n#### GET /wapi/wallet/address\n\nQuery parameters:\n- `index`: Wallet index\n- `limit`: Result limit (default = 1)\n- `offset`: Starting offset (default = 0)\n\nReturns an array of wallet addresses in case limit > 1, otherwise returns single address at specified offset.\n\n#### GET /wapi/wallet/tokens\n\nReturns an array of white-listed token objects.\n\n#### GET /wapi/wallet/history\n\nQuery parameters:\n- `index`: Wallet index\n- `limit`: Result limit (default = 100)\n- `since`: Since block height, inclusive (default = 0)\n- `until`: Until block height, inclusive (default = current height)\n- `type`: Optional type filter: `RECEIVE`, `SPEND`, `TXFEE`, `REWARD`, `VDF_REWARD`\n- `memo`: Optional memo filter (exact matches only)\n- `currency`: Optional curreny filter (bech32 token address)\n\nReturns an array of objects:\n- `height`: Block height (4294967295 in case pending)\n- `txid`: Transaction ID or block hash in case of `REWARD` and `VDF_REWARD`\n- `amount`: Token amount (integer)\n- `value` Token value (float with decimals)\n- `decimals`: Number of decimals\n- etc\n\n:::note[Note]\nThis endpoint includes pending transactions, `is_pending` or `height` needs to be checked.\n:::\n\n#### GET /wapi/wallet/tx_history\n\nQuery parameters:\n- `index`: Wallet index\n- `limit`: Result limit (default = 100)\n\nReturns most recent sent transactions.\n\n#### GET /wapi/wallet/keys\n\nQuery parameters:\n- `index`: Wallet index\n\nReturns an object:\n- `farmer_public_key`: Farmer public key\n\n#### GET /wapi/wallet/seed\n\nQuery parameters:\n- `index`: Wallet index\n\nReturns an object with the mnemonic seed:\n- `words`: Array of words\n- `string`: String of words with space in-between\n\n#### POST /wapi/wallet/send\n\nSend tokens to a single destination.\n\nRequest payload is an object of arguments:\n- `index`: Wallet index\n- `amount`: Floating point amount, either as float or string.\n- `currency`: Token address (bech32, default = MMX)\n- `dst_addr`: Destination address (bech32)\n- `src_addr`: Optional source address (bech32)\n- `raw_mode`: Boolean, if true `amount` is parsed as a raw integer (default = false)\n- `options`: Object with options\n\nReturns transaction object if successful.\n\n#### POST /wapi/wallet/send_many\n\nSend tokens to many destinations in a single transaction.\n\nSame as `/wapi/wallet/send`, except:\n- `amounts`: Array of pairs: `[[address, amount], ...]`\n- `src_addr`: Not supported\n\n#### POST /wapi/wallet/send_off\n\nSend a given transaction, while marking it as spent in the cache.\n\nRequest payload is an object of arguments:\n- `index`: Wallet index\n- `tx`: Transaction object\n\nReturns status 200 if successful.\n\n:::note[Note]\nClients must handle `nonce` field as a 64-bit integer, truncation will cause static failure.\n:::\n\n#### POST /wapi/wallet/deploy\n\nDeploy a contract.\n\nRequest payload is an object of arguments:\n- `index`: Wallet index\n- `payload`: Contract object\n- `options`: Object with options\n\nReturns contract address (bech32) if successful.\n\nExample `payload` for a smart contract:\n```json\n{\n  \"__type\": \"mmx.contract.Executable\",\n  \"name\": \"Fake Testnet USD\",\n  \"symbol\": \"USDM\",\n  \"decimals\": 4,\n  \"binary\": \"mmx17pzl9cgmesyjur7rvvev70fx7f55rvyv7549cvrtf7chjml4qh4sryu9yl\",\n  \"init_args\": [\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\"]\n}\n```\n\n#### POST /wapi/wallet/execute\n\nExecute a single smart contract function.\n\nRequest payload is an object of arguments:\n- `index`: Wallet index\n- `address`: Contract address\n- `method`: Method name\n- `args`: Array of function arguments (positional)\n- `user`: Optional custom user (default = first address)\n- `options`: Object with options\n\nReturns transaction object if successful.\n"
  },
  {
    "path": "docs/src/content/docs/software/cli-commands.md",
    "content": "---\ntitle: CLI Commands\ndescription: MMX Node CLI Command Reference.\n---\n\nWhen compiled from source:\n```bash frame=\"none\"\ncd mmx-node\nsource ./activate.sh\n```\nWith a binary package install, just open a new terminal. On Windows search for `MMX CMD`.\n\nTo run any `mmx` commands (except `mmx wallet create`), the node needs to be running. See [Getting Started](../../guides/getting-started/) to read on how to start it.\n\n## Node CLI\n\nTo check on the node: `mmx node info`\n\nTo check on the peers: `mmx node peers`\n\nTo check on a transaction: `mmx node tx <txid>`\n\nTo show current node height: `mmx node get height`\n\nTo dump a transaction: `mmx node get tx <txid>`\n\nTo dump a contract: `mmx node get contract <address>`\n\nTo get balance for an address: `mmx node get balance <address> -x <currency>`\n\nTo get raw balance for an address: `mmx node get amount <address> -x <currency>`\n\nTo dump a block: `mmx node get block <height>`\n\nTo dump a block header: `mmx node get header <height>`\n\nTo show connected peers: `mmx node get peers`\n\nTo show estimated netspace: `mmx node get netspace`\n\nTo show circulating coin supply: `mmx node get supply`\n\nTo call a smart contract const function: `mmx node call`\n\nTo show smart contract state variables: `mmx node read`\n\nTo dump all storage of a smart contract: `mmx node dump`\n\nTo dump assembly code of a smart contract: `mmx node dump_code`\n\nTo fetch a block from a peer: `mmx node fetch block <peer> <height>`\n\nTo fetch a block header from a peer: `mmx node fetch header <peer> <height>`\n\nTo check the balance of an address: `mmx node balance <address>`\n\nTo check the history of an address since a particlar block height: `mmx node history <address> <block_height>`\n\nTo csv export the history of an address since a particlar block height: `mmx node history_csv <address> <block_height>`\n\nTo show all offers: `mmx node offers [open | closed]`\n\nTo force a re-sync: `mmx node sync`\n\nTo replay/revert to an earlier block height: `mmx node revert <height>`\n\n## Wallet CLI\n\nTo show everything in a wallet: `mmx wallet show`\n\nTo show wallet balances: `mmx wallet show balance`\n\nTo show wallet contracts: `mmx wallet show contracts`\n\nTo show wallet offers: `mmx wallet show offers`\n\nTo get a specific wallet address: `mmx wallet get address`\n\nTo get a specific wallet balance: `mmx wallet get balance`\n\nTo get a specific raw wallet balance: `mmx wallet get amount`\n\nTo get a list of all contract addresses: `mmx wallet get contracts`\n\nTo get the mnemonic seed words of a wallet: `mmx wallet get seed`\n\nTo show entire wallet activity : `mmx wallet log`\n\nTo csv export entire wallet activity : `mmx wallet log_csv`\n\nTo show recent wallet activity : `mmx wallet log -N <limit>`\n\nTo transfer funds: `mmx wallet send <options>`\n```\n  -a <amount to send, 1.23>\n  -r <tx fee multiplier>\n  -t <destination address>\n  -x <currency>\n```\nTo withdraw funds from a contract: `mmx wallet send_from -s <address>`\n\nTo transfer an NFT, same as sending with one satoshi: `mmx wallet transfer`\n\nTo create an offer on the chain: `mmx wallet offer`\n```\n  (-x / -z default MMX)\n  -a <bid amount> -b <ask amount>\n  -x <bid currency> -z <ask currency>\n```\nTo accept an offer: `mmx wallet accept <address>`\n\nTo mint tokens: `mmx wallet mint`\n```\n  -a <amount>\n  -t <destination>\n  -x <currency>\n```\nTo deploy a contract: `mmx wallet deploy <file>`\n\nTo execute a smart contract function: `mmx wallet exec <function> <args> -x <contract>`\n\nTo deposit funds to a smart contract: `mmx wallet deposit <function> <args>`\n```\n  -a <amount to send, 1.23>\n  -t <contract address>\n  -x <currency>\n```\n\nTo create a new wallet (offline): `mmx wallet create -f [file_name] [--with-passphrase]`\n\nTo create a new wallet (online): `mmx wallet new [name] [--with-passphrase]`\n\nTo restore a wallet from a seed hash: `mmx wallet create --with-seed`\n\nTo restore a wallet from a set of 24 mnemonic words: `mmx wallet create --with-mnemonic`\n\nTo show all wallets and their index: `mmx wallet accounts`\n\nTo get farmer / pool keys for plotting: `mmx wallet keys`\n\nTo lock a wallet if passphase enabled: `mmx wallet lock`\n\nTo unlock a wallet with passphrase: `mmx wallet unlock`\n\n**To use a non-default wallet, specify `-j <index>` in combination with the above commands. See `mmx wallet accounts`.**\n\n## Farmer CLI\n\nTo check on the farm: `mmx farm info`\n\nTo get total space in bytes: `mmx farm get space`\n\nTo show plot directories: `mmx farm get dirs`\n\nTo add plot directories: `mmx farm add <dir>`\n\nTo remove plot directories: `mmx farm remove <dir>`\n\nTo reload plots: `mmx farm reload`\n\n## Harvester CLI\n\nTo check on the harvester: `mmx harvester info`\n\nTo get harvester space in bytes: `mmx harvester get space`\n\nTo show plot directories: `mmx harvester get dirs`\n\nTo add plot directories: `mmx harvester add <dir>`\n\nTo remove plot directories: `mmx harvester remove <dir>`\n\nTo reload plots: `mmx harvester reload`\n\n## Pooling\n\nTo use pooling first create a plot NFT, then create plots for it and finally join a pool.\n\n### Create Plot NFT\n\n```bash frame=\"none\"\nmmx wallet plotnft create <name>\n```\n\n`<name>` can be any string without whitespace.\n\nAfter creation the plot NFT is in solo farming mode, which means block rewards will directly go to your Farmer reward address.\nSee below how to join a pool.\n\n:::note[Note]\nNeed to wait for the transaction to confirm before it will show up.\\\nThis command takes the usual `-j <index>` argument to select a different wallet.\n:::\n\n### Show Plot NFTs\n\n```bash frame=\"none\"\nmmx wallet plotnft show\n```\n\nThe address shown in `[...]` is the plot NFT contract address, which needs to be used for plotting.\n\n:::note[Note]\nThis command takes the usual `-j <index>` argument to select a different wallet.\n:::\n\nExample:\n```bash frame=\"none\"\nmmx wallet plotnft show -j 1\n```\n```\n[mmx1wknv8xxvzjafrswsrwr3l85y6d8nms2dz22dgxl2qpcyjp64amtsjqjna5]\n  Name: test1\n  Locked: true\n  Server URL: http://localhost:8080\n```\n\n### Join a Pool\n\nFirst you need to obtain the pool server URL for the pool, via their website or discord.\n\n```bash frame=\"none\"\nmmx wallet plotnft join <pool_url> -x <plot_nft_address>\n```\n\n`<plot_nft_address>` is the same as used for plotting, see `mmx wallet plotnft show`.\n\n:::note[Note]\nThis command does not need any `-j` to select a wallet.\n:::\n\nExample:\n```bash frame=\"none\"\nmmx wallet plotnft join http://localhost:8080 -x mmx1wknv8xxvzjafrswsrwr3l85y6d8nms2dz22dgxl2qpcyjp64amtsjqjna5\n```\n\n### Leave Pool\n\n```bash frame=\"none\"\nmmx wallet plotnft unlock -x <plot_nft_address>\n```\n\nThis will take 256 blocks to complete, to avoid cheating.\nOnce complete the plot NFT is in solo farming mode, which means block rewards will directly go to your Farmer reward address.\n\n:::note[Note]\nThis command does not need any `-j` to select a wallet.\n:::\n\nExample:\n```bash frame=\"none\"\nmmx wallet plotnft unlock -x mmx1wknv8xxvzjafrswsrwr3l85y6d8nms2dz22dgxl2qpcyjp64amtsjqjna5\n```\n\n### Switch Pool\n\nFirst leave the current pool, wait 256 blocks for the plot NFT to unlock, then join the new pool as shown above.\n\n### Show Info\n\nTo see pool account: `mmx pool info`\n\nTo see partials info: `mmx farm info`\n\nExample:\n```bash frame=\"none\"\nmmx pool info\n```\n```\nPool [http://localhost:8080]\n  Balance: 1.5 MMX\n  Total Paid: 123.456 MMX\n  Difficulty: 1\n  Pool Share: 33 %\n  Partial Rate: 33.5417 per hour\n  Blocks Found: 42\n  Estimated Space: 13.3789 TB\n```\n\n```bash frame=\"none\"\nmmx farm info\n```\n```\nPlot NFT [mmx1wknv8xxvzjafrswsrwr3l85y6d8nms2dz22dgxl2qpcyjp64amtsjqjna5]\n  Name: test1\n  Server URL: http://localhost:8080\n  Target Address: mmx1uj2dth7r9tcn3vas42f0hzz74dkz8ygv59mpx44n7px7j7yhvv4sfmkf0d\n  Plot Count: 100\n  Points: 309 OK / 0 FAIL\n  Difficulty: 1\n  Avg. Response: 0.515676 sec\n  Last Partial: 2024-10-13 23:25:44\n```\n"
  },
  {
    "path": "docs/src/content/docs/software/web_wallet_api.md",
    "content": "---\ntitle: Web Wallet API\ndescription: API to interact with the web wallet (extension).\n---\n\nThe MMX Web Wallet can be accessed from any webpage via `window.mmx_wallet`.\n\nEven though the wallet can have multiple accounts or addresses, only one is active at a time, to simplify the API.\n\n### get_address()\n\nReturns the (currently active) wallet address in bech32 format.\n\nKeep in mind this address can be spoofed by the wallet.\nTo make sure the user actually owns this address you need to have them sign a random message via `sign_message(msg)` and verify the signature.\n\n### get_public_key()\n\nReturns the (currently active) wallet public key in hex string format (upper case).\n\n### get_network()\n\nReturns `MMX/mainnet` for mainnet.\n\n### sign_message(msg)\n\nSigns a string message with the prefix `MMX/sign_message/` using SHA2-256. Used to prove ownership of the wallet (address).\n\nExample:\n```\nwallet.sign_message(\"test123\") // -> Sign(SHA256(\"MMX/sign_message/test123\"))\n```\n\nReturns an object with the signature and public key in hex string format (upper case):\n```\n{\"signature\": \"123ABC...\", \"public_key\": \"345345FDD\"}\n```\n\nReturns `null` in case the user doesn't approve.\n\n### sign_transaction(tx)\n\nSigns a given transaction if the user approves it.\n\nThe `tx` format is the same as specified in `interface/Transaction.vni`.\n\nIf `tx.id` is not specified, the user is free to modify the given transaction, such as expiration height or fee level.\n\nReturns the signed transaction in full. Returns `null` in case the user doesn't approve.\n"
  },
  {
    "path": "docs/src/content.config.ts",
    "content": "import { defineCollection, z } from 'astro:content';\nimport { docsLoader } from '@astrojs/starlight/loaders';\nimport { docsSchema } from '@astrojs/starlight/schema';\n\nexport const collections = {\n\tdocs: defineCollection({\n\t\tloader: docsLoader(),\n\t\tschema: docsSchema({\n\t\t\textend: z.object({\n\t\t\t\tarticlePublished: z.date().optional(),\n\t\t\t\tarticleUpdated: z.date().optional(),\n\t\t\t\tauthorName: z.string().optional(),\n\t\t\t\tauthorPicture: z.string().optional(),\n\t\t\t\tauthorURL: z.string().optional(),\n\t\t\t}),\n\t\t}),\n\t}),\n};\n"
  },
  {
    "path": "docs/src/pages/tools/time-calculator.astro",
    "content": "---\nimport StarlightPage from '@astrojs/starlight/components/StarlightPage.astro';\nimport AnchorHeading from '@astrojs/starlight/components/AnchorHeading.astro';\n---\n\n<!--*\n    * File: time-calculator.astro\n    *\n    * Source: https://github.com/madMAx43v3r/mmx-node/blob/HEAD/docs/src/pages/tools/time-calculator.astro\n    * URL: https://docs.mmx.network/tools/time-calculator/\n    *\n    *-->\n\n<!-- Starlight design for Astro page -->\n\n<StarlightPage\n  frontmatter={{\n    title: 'Time Calculator',\n    description: 'Simple calculator to lookup or estimate blockchain heights, time and date.',\n  }}\n  headings={[\n    { depth: 3, slug: 'lookup-height', text: 'Lookup height' },\n    { depth: 3, slug: 'estimate-height', text: 'Estimate height' },\n  ]}\n>\n\n<!-- HTML content -->\n\n<p>\n  Simple calculator to lookup or estimate heights, time and date.<br>\n  Read this <a href=\"../../../faq/node/#what-is-vdf-height\">FAQ</a> entry for understanding of height vs. VDF height.\n</p>\n\n<AnchorHeading level=\"3\" id=\"lookup-height\">Lookup height</AnchorHeading>\n\n<p><a href=\"../../../software/rpc_protocol/\">RPC</a> query data from public blockchain <a href=\"https://explore.mmx.network/\">explorer</a>.</p>\n\n<table>\n  <tr>\n    <td align=\"left\">Height</td>\n    <td align=\"left\">\n      <input type=\"text\" size=\"15\" id=\"lookupheight\">\n      <button type=\"button\" id=\"lookupbuttonheight\">Query</button>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"left\">VDF Height</td>\n    <td align=\"left\">\n      <input type=\"text\" size=\"15\" id=\"lookupvdf\">\n      <button type=\"button\" id=\"lookupbuttonvdf\">Query</button>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"left\">Timestamp</td>\n    <td align=\"left\"><span id=\"lookuptimestamp\"></span></td>\n  </tr>\n  <tr>\n    <td align=\"left\">Local Time</td>\n    <td align=\"left\"><span id=\"lookuplocaltime\"></span></td>\n  </tr>\n  <tr>\n    <td align=\"left\">UTC Time</td>\n    <td align=\"left\"><span id=\"lookuputctime\"></span></td>\n  </tr>\n  <tr>\n    <td align=\"left\">Discord</td>\n    <td align=\"left\"><span id=\"lookupdiscord\"></span></td>\n  </tr>\n  <tr>\n    <td align=\"left\">Proof Score</td>\n    <td align=\"left\"><span id=\"lookupproof\"></span></td>\n  </tr>\n</table>\n\n<AnchorHeading level=\"3\" id=\"estimate-height\">Estimate height</AnchorHeading>\n\n<p>Estimate result for a given height or timestamp.</p>\n\n<table>\n  <tr>\n    <td align=\"left\">Height</td>\n    <td align=\"left\">\n      <input type=\"text\" size=\"15\" id=\"estimateheight\">\n      <button type=\"button\" id=\"estimatebuttonheight\">Estimate</button>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"left\">VDF Height</td>\n    <td align=\"left\">\n      <input type=\"text\" size=\"15\" id=\"estimatevdf\">\n      <button type=\"button\" id=\"estimatebuttonvdf\">Estimate</button>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"left\">Timestamp</td>\n    <td align=\"left\">\n      <input type=\"text\" size=\"15\" id=\"estimatetimestamp\">\n      <button type=\"button\" id=\"estimatebuttontimestamp\">Estimate</button>\n    </td>\n  </tr>\n  <tr>\n    <td align=\"left\">Local Time</td>\n    <td align=\"left\"><span id=\"estimatelocaltime\"></span></td>\n  </tr>\n  <tr>\n    <td align=\"left\">UTC Time</td>\n    <td align=\"left\"><span id=\"estimateutctime\"></span></td>\n  </tr>\n  <tr>\n    <td align=\"left\">Discord</td>\n    <td align=\"left\"><span id=\"estimatediscord\"></span></td>\n  </tr>\n</table>\n\n<details>\n  <summary>Estimating with data from height <span id=\"estpheight\"></span></summary>\n  <p>\n    VDF height: <span id=\"estpvdf\"></span><br>\n    Timestamp: <span id=\"estptimestamp\"></span><br>\n    <span id=\"estpnontx\"></span>% non-TX heights, previous 500k<br>\n    <span id=\"estp10sdev\"></span>% 10 sec deviation, previous 500k\n  </p>\n</details>\n<button type=\"button\" id=\"estimatebuttonupdate\">Query updated estimate data</button>\n\n</StarlightPage>\n\n<!-- JavaScript code -->\n\n<script>\n\n/* ---\n * Variables used throughout Time Calculator\n */\n\nvar urlrpcserver = \"https://rpc.mmx.network\";\nvar urlexpserver = \"https://explore.mmx.network\";\n\nvar localeFormat = \"en-GB\";\nvar localeOptLocal = { hour12: false, weekday: \"short\", day: \"2-digit\", month: \"short\", year: \"numeric\", hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\", timeZoneName: \"short\" };\nvar localeOptUTC = { timeZone: \"UTC\", hour12: false, weekday: \"short\", day: \"2-digit\", month: \"short\", year: \"numeric\", hour: \"2-digit\", minute: \"2-digit\", second: \"2-digit\", timeZoneName: \"short\" };\n\n/* ---\n * initfunc() - initialize internal logic for Time Calculator\n */\n\nwindow.onload = function(){ initfunc(); };\n\nfunction initfunc()\n{\n document.getElementById(\"lookupheight\").addEventListener(\"keydown\", function(){ if(event.key === \"Enter\"){ lookupheightfunc(); } } );\n document.getElementById(\"lookupbuttonheight\").addEventListener(\"click\", function(){ lookupheightfunc(); } );\n\n document.getElementById(\"lookupvdf\").addEventListener(\"keydown\", function(){ if(event.key === \"Enter\"){ lookupvdffunc(); } } );\n document.getElementById(\"lookupbuttonvdf\").addEventListener(\"click\", function(){ lookupvdffunc(); } );\n\n document.getElementById(\"estimateheight\").addEventListener(\"keydown\", function(){ if(event.key === \"Enter\"){ estimatefunc(\"height\"); } } );\n document.getElementById(\"estimatebuttonheight\").addEventListener(\"click\", function(){ estimatefunc(\"height\"); } );\n document.getElementById(\"estimatevdf\").addEventListener(\"keydown\", function(){ if(event.key === \"Enter\"){ estimatefunc(\"vdf\"); } } );\n document.getElementById(\"estimatebuttonvdf\").addEventListener(\"click\", function(){ estimatefunc(\"vdf\"); } );\n document.getElementById(\"estimatetimestamp\").addEventListener(\"keydown\", function(){ if(event.key === \"Enter\"){ estimatefunc(\"timestamp\"); } } );\n document.getElementById(\"estimatebuttontimestamp\").addEventListener(\"click\", function(){ estimatefunc(\"timestamp\"); } );\n\n document.getElementById(\"estimatebuttonupdate\").addEventListener(\"click\", function(){ estimateupdatefunc(); } );\n\n estimatedata.paramHeight = estimatedata.paramQToHeight;\n estimatedata.paramVDF = estimatedata.paramQToVDF;\n estimatedata.paramTimestamp = estimatedata.paramQToTimestamp;\n estimatedata.paramNonTX = (estimatedata.paramQToVDF - estimatedata.paramQFromVDF) / (estimatedata.paramQToHeight - estimatedata.paramQFromHeight);\n estimatedata.param10sDev = (estimatedata.paramQToTimestamp - estimatedata.paramQFromTimestamp) / ((estimatedata.paramQToHeight - estimatedata.paramQFromHeight) * 10 * 1000);\n\n document.getElementById(\"estpheight\").innerHTML = estimatedata.paramHeight;\n document.getElementById(\"estpvdf\").innerHTML = estimatedata.paramVDF;\n document.getElementById(\"estptimestamp\").innerHTML = estimatedata.paramTimestamp;\n document.getElementById(\"estpnontx\").innerHTML = ((estimatedata.paramNonTX - 1) * 100).toFixed(4);\n document.getElementById(\"estp10sdev\").innerHTML = ((estimatedata.param10sDev - 1) * 100).toFixed(4);\n}\n\n/* ---\n * lookupheightfunc() - Main entrypoint/callback for 'Lookup height' logic, Height\n */\n\nconst lookupheightdata = {\n  stage: 0,\n  callcount: 0,\n\n  querylatest: false,\n  queryheight: 0,\n\n  findvdf: 0,\n  findtimestamp: 0,\n  findproof: \"\",\n\n  fallback: false,\n  fallbackmsg: \"\"\n  }\n\nfunction lookupheightfunc(callback = false, jsondata = null, status = null)\n{\n if(lookupheightdata.stage > 0 && !callback){ return; }\n\n ++(lookupheightdata.callcount);\n if(lookupheightdata.callcount > 10) return; // Failsafe, if too many calls/iters, one query\n\n if(lookupheightdata.stage <= 0){ // Stage 0: Query 'Height' button/enter pressed\n   lookupheightdata.stage = 1;\n   lookupheightdata.callcount = 1;\n   lookup_disabled(true);\n\n   lookupheightdata.querylatest = (document.getElementById(\"lookupheight\").value == \"\") ? true : false;\n   lookupheightdata.queryheight = lookup_getvalue(document.getElementById(\"lookupheight\").value);\n   lookupheightdata.findvdf = 0;\n   lookupheightdata.findtimestamp = 0;\n   lookupheightdata.findproof = \"\";\n\n   lookupheightdata.fallback = false;\n   lookupheightdata.fallbackmsg = \"\";\n\n   lookup_output(lookupheightdata.querylatest ? null : lookupheightdata.queryheight, \"\", \"...\", \"...\", \"...\", \"...\", \"...\");\n\n   if(lookupheightdata.querylatest){ // Input field empty, query chain height\n     lookupheightdata.stage = 1;\n     rpcquerynodeinfo(lookupheightfunc);\n     return;\n     }\n\n   lookupheightdata.stage = 2;\n   rpcqueryheight(lookupheightdata.queryheight, lookupheightfunc);\n   return;\n   }\n\n else if(lookupheightdata.stage == 1){ // Stage 1: Callback with chain height\n   if(status != 200){ // Fallback, no response\n      lookupheightdata.fallback = true;\n      lookupheightdata.fallbackmsg = \"no response\";\n      lookupheightdata.stage = 9;\n      lookupheightfunc(true, null, null);\n      return;\n      }\n\n   lookupheightdata.queryheight = lookup_getvalue(jsondata[\"height\"]);\n\n   lookupheightdata.stage = 2;\n   rpcqueryheight(lookupheightdata.queryheight, lookupheightfunc);\n   return;\n   }\n\n else if(lookupheightdata.stage == 2){ // Stage 2: Callback with height data\n   if(status != 200){ // Fallback, no height data, no response\n     lookupheightdata.fallback = true;\n     lookupheightdata.fallbackmsg = (status == 204) ? \"no height data\" : \"no response\";\n     lookupheightdata.stage = 9;\n     lookupheightfunc(true, null, null);\n     return;\n     }\n\n   var blockheight = lookup_getvalue(jsondata[\"height\"]);\n   var blockvdf = lookup_getvalue(jsondata[\"vdf_height\"]);\n   var blocktimestamp = lookup_getvalue(jsondata[\"time_stamp\"]);\n   var blockproof = lookup_getvalue(jsondata[\"score\"]);\n   var blockksize = lookup_getvalue(jsondata[\"ksize\"]);\n   var blockvdfcount = lookup_getvalue(jsondata[\"vdf_count\"]);\n\n   lookupheightdata.findvdf = blockvdf;\n   lookupheightdata.findtimestamp = blocktimestamp;\n   lookupheightdata.findproof = (blockheight == 0) ? \"n/a\" : blockproof + \" (k\" + blockksize + \", VDF: +\" + blockvdfcount + ', <a href=\"' + urlexpserver + '/#/explore/block/height/' + blockheight + '\">more</a>)';\n   lookupheightdata.stage = 9;\n   lookupheightfunc(true, null, null);\n   return;\n   }\n\n else if(lookupheightdata.stage == 9){ // Stage 9: Output result of query\n   var outputtemp = \"<em>\" + (lookupheightdata.fallback ? lookupheightdata.fallbackmsg : \"unknown\") + \"</em>\";\n\n   var outputheight = null;\n   var outputvdf = \"\";\n   var outputtimestamp = outputtemp;\n   var outputlocaltime = outputtemp;\n   var outpututctime = outputtemp;\n   var outputdiscord = outputtemp;\n   var outputproof = outputtemp;\n\n   if(!lookupheightdata.fallback){\n     outputheight = lookupheightdata.queryheight;\n     outputvdf = lookupheightdata.findvdf;\n     outputtimestamp = lookupheightdata.findtimestamp + ' (ms, <a href=\"https://www.unixtimestamp.com/\">Unix</a>)';\n     const datetimestamp = new Date(lookupheightdata.findtimestamp);\n     outputlocaltime = datetimestamp.toLocaleString(localeFormat, localeOptLocal);\n     outpututctime = datetimestamp.toLocaleString(localeFormat, localeOptUTC);\n     outputdiscord = \"<code>&lt;t:\" + Math.round(lookupheightdata.findtimestamp / 1000) + \":F&gt;</code>\"  + ' (<a href=\"https://discord.com/developers/docs/reference#message-formatting-timestamp-styles\">style</a>)';\n     outputproof = lookupheightdata.findproof;\n     }\n\n   lookup_output((outputheight != null) ? outputheight : null, outputvdf, outputtimestamp, outputlocaltime, outpututctime, outputdiscord, outputproof);\n\n   lookup_disabled(false);\n   lookupheightdata.callcount = 0;\n   lookupheightdata.stage  = 0;\n   return;\n   }\n}\n\n/* ---\n * lookupvdffunc() - Main entrypoint/callback for 'Lookup height' logic, VDF Height\n */\n\nconst lookupvdfdata = {\n  stage: 0,\n  callcount: 0,\n\n  chainheight: 0,\n  chainvdf: 0,\n\n  querylatest: false,\n  queryvdf: 0,\n\n  findheight: 0,\n  findheightprev1x: -1,\n  findheightprev2x: -1,\n  findheightrepeat: false,\n  findtimestamp: 0,\n  findproof: \"\",\n\n  fallback: false,\n  fallbackmsg: \"\",\n\n  paramNonTX: 1.02 // Using static 2% estimate for VDF vs height ratio\n  }\n\nfunction lookupvdffunc(callback = false, jsondata = null, status = null)\n{\n if(lookupvdfdata.stage > 0 && !callback){ return; }\n\n ++(lookupvdfdata.callcount);\n if(lookupvdfdata.callcount > 10) return; // Failsafe, if too many calls/iters, one query\n\n if(lookupvdfdata.stage <= 0){ // Stage 0: Query 'VDF Height' button/enter pressed\n   lookupvdfdata.stage = 1;\n   lookupvdfdata.callcount = 1;\n   lookup_disabled(true);\n\n   lookupvdfdata.chainheight = 0;\n   lookupvdfdata.chainvdf = 0;\n   lookupvdfdata.querylatest = (document.getElementById(\"lookupvdf\").value == \"\") ? true : false;\n   lookupvdfdata.queryvdf = lookup_getvalue(document.getElementById(\"lookupvdf\").value);\n   lookupvdfdata.findheight = 0;\n   lookupvdfdata.findheightprev1x = -1;\n   lookupvdfdata.findheightprev2x = -1;\n   lookupvdfdata.findheightrepeat = false;\n   lookupvdfdata.findtimestamp = 0;\n   lookupvdfdata.findproof = \"\";\n\n   lookupvdfdata.fallback = false;\n   lookupvdfdata.fallbackmsg = \"\";\n\n   lookup_output(\"\", lookupvdfdata.querylatest ? null : lookupvdfdata.queryvdf, \"...\", \"...\", \"...\", \"...\", \"...\");\n\n   lookupvdfdata.stage  = 1;\n   rpcquerynodeinfo(lookupvdffunc);\n   return;\n   }\n\n else if(lookupvdfdata.stage == 1){ // Stage 1: Callback with chain height\n   if(status != 200){ // Fallback, no response\n      lookupvdfdata.fallback = true;\n      lookupvdfdata.fallbackmsg = \"no response\";\n      lookupvdfdata.stage = 9;\n      lookupvdffunc(true, null, null);\n      return;\n      }\n\n   lookupvdfdata.chainheight = lookup_getvalue(jsondata[\"height\"]);\n   lookupvdfdata.chainvdf = lookup_getvalue(jsondata[\"vdf_height\"]);\n\n   if(lookupvdfdata.querylatest) lookupvdfdata.queryvdf = lookupvdfdata.chainvdf;\n\n   if(!lookupvdfdata.querylatest && lookupvdfdata.queryvdf > lookupvdfdata.chainvdf){ // Fallback, no height data\n     lookupvdfdata.fallback = true;\n     lookupvdfdata.fallbackmsg = \"no height data\";\n     lookupvdfdata.stage = 9;\n     lookupvdffunc(true, null, null);\n     return;\n     }\n\n   lookupvdfdata.findheight = lookupvdfdata.querylatest ? lookupvdfdata.chainheight : Math.round(lookupvdfdata.queryvdf / lookupvdfdata.paramNonTX);\n   if(lookupvdfdata.findheight < 0) lookupvdfdata.findheight = 0;\n   if(lookupvdfdata.findheight > lookupvdfdata.chainheight) lookupvdfdata.findheight = lookupvdfdata.chainheight;\n   lookupvdfdata.findheightprev2x = lookupvdfdata.findheightprev1x;\n   lookupvdfdata.findheightprev1x = lookupvdfdata.findheight;\n\n   lookupvdfdata.stage = 2;\n   rpcqueryheight(lookupvdfdata.findheight, lookupvdffunc);\n   return;\n   }\n\n else if(lookupvdfdata.stage == 2){ // Stage 2: Callback with height data\n   if(status != 200){ // Fallback, no response\n     lookupvdfdata.fallback = true;\n     lookupvdfdata.fallbackmsg = \"no response\";\n     lookupvdfdata.stage = 9;\n     lookupvdffunc(true, null, null);\n     return;\n     }\n\n   var blockheight = lookup_getvalue(jsondata[\"height\"]);\n   var blockvdf = lookup_getvalue(jsondata[\"vdf_height\"]);\n   var blocktimestamp = lookup_getvalue(jsondata[\"time_stamp\"]);\n   var blockproof = lookup_getvalue(jsondata[\"score\"]);\n   var blockksize = lookup_getvalue(jsondata[\"ksize\"]);\n   var blockvdfcount = lookup_getvalue(jsondata[\"vdf_count\"]);\n\n   if(blockvdf == lookupvdfdata.queryvdf || lookupvdfdata.querylatest){ // Found, use/output block height data\n     lookupvdfdata.findheight = blockheight;\n     lookupvdfdata.findtimestamp = blocktimestamp;\n     lookupvdfdata.findproof = (blockheight == 0) ? \"n/a\" : blockproof + \" (k\" + blockksize + \", VDF: +\" + blockvdfcount + ', <a href=\"' + urlexpserver + '/#/explore/block/height/' + blockheight + '\">more</a>)';\n     lookupvdfdata.stage = 9;\n     lookupvdffunc(true, null, null);\n     return;\n     }\n\n   if(blockvdfcount > 1 && lookupvdfdata.queryvdf > (blockvdf - blockvdfcount) && lookupvdfdata.queryvdf < blockvdf){ // Fallback, non-TX VDF height\n     lookupvdfdata.fallback = true;\n     lookupvdfdata.fallbackmsg = \"non-tx vdf height\";\n     lookupvdfdata.stage = 9;\n     lookupvdffunc(true, null, null);\n     return;\n     }\n\n   var blockadjust = Math.round((lookupvdfdata.queryvdf - blockvdf) / lookupvdfdata.paramNonTX);\n   if(lookupvdfdata.findheight + blockadjust == lookupvdfdata.findheightprev2x) lookupvdfdata.findheightrepeat = true;\n\n   if(lookupvdfdata.findheightrepeat && blockadjust < 0) blockadjust = -1;\n   if(lookupvdfdata.findheightrepeat && blockadjust >= 0) blockadjust = 1;\n   lookupvdfdata.findheight += blockadjust;\n   if(lookupvdfdata.findheight < 0) lookupvdfdata.findheight = 0;\n   if(lookupvdfdata.findheight > lookupvdfdata.chainheight) lookupvdfdata.findheight = lookupvdfdata.chainheight;\n   lookupvdfdata.findheightprev2x = lookupvdfdata.findheightprev1x;\n   lookupvdfdata.findheightprev1x = lookupvdfdata.findheight;\n\n   lookupvdfdata.stage = 2;\n   rpcqueryheight(lookupvdfdata.findheight, lookupvdffunc);\n   return;\n   }\n\n else if(lookupvdfdata.stage == 9){ // Stage 9: Output result of query\n   var outputtemp = \"<em>\" + (lookupvdfdata.fallback ? lookupvdfdata.fallbackmsg : \"unknown\") + \"</em>\";\n\n   var outputheight = \"\";\n   var outputvdf = null;\n   var outputtimestamp = outputtemp;\n   var outputlocaltime = outputtemp;\n   var outpututctime = outputtemp;\n   var outputdiscord = outputtemp;\n   var outputproof = outputtemp;\n\n   if(!lookupvdfdata.fallback){\n     outputheight = lookupvdfdata.findheight;\n     outputvdf = lookupvdfdata.queryvdf;\n     outputtimestamp = lookupvdfdata.findtimestamp + ' (ms, <a href=\"https://www.unixtimestamp.com/\">Unix</a>)';\n     const datetimestamp = new Date(lookupvdfdata.findtimestamp);\n     outputlocaltime = datetimestamp.toLocaleString(localeFormat, localeOptLocal);\n     outpututctime = datetimestamp.toLocaleString(localeFormat, localeOptUTC);\n     outputdiscord = \"<code>&lt;t:\" + Math.round(lookupvdfdata.findtimestamp / 1000) + \":F&gt;</code>\"  + ' (<a href=\"https://discord.com/developers/docs/reference#message-formatting-timestamp-styles\">style</a>)';\n     outputproof = lookupvdfdata.findproof;\n     }\n\n   lookup_output(outputheight, (outputvdf != null) ? outputvdf : null, outputtimestamp, outputlocaltime, outpututctime, outputdiscord, outputproof);\n\n   lookup_disabled(false);\n   lookupvdfdata.callcount = 0;\n   lookupvdfdata.stage  = 0;\n   return;\n   }\n}\n\n/* ---\n * lookup_disabled() - Disable/enable 'Lookup height' input elements HTML\n */\n\nfunction lookup_disabled(disabled = false)\n{\n document.getElementById(\"lookupheight\").disabled = disabled;\n document.getElementById(\"lookupbuttonheight\").disabled = disabled;\n document.getElementById(\"lookupvdf\").disabled = disabled;\n document.getElementById(\"lookupbuttonvdf\").disabled = disabled;\n}\n\n/* ---\n * lookup_getvalue() - Secure 'Lookup height' value, positive integer\n */\n\nfunction lookup_getvalue(value = null)\n{\n if(value == null) return 0;\n value = Number(value);\n if(value !== value) value = 0;\n if(value < 0) value = 0;\n return Math.floor(value);\n}\n\n/* ---\n * lookup_output() - Output values to 'Lookup height' elements HTML\n */\n\nfunction lookup_output(height = null, vdf = null, timestamp = null, localtime = null, utctime = null, discord = null, proof = null)\n{\n if(height != null) document.getElementById(\"lookupheight\").value = height;\n if(vdf != null)  document.getElementById(\"lookupvdf\").value = vdf;\n if(timestamp != null) document.getElementById(\"lookuptimestamp\").innerHTML = timestamp;\n if(localtime != null) document.getElementById(\"lookuplocaltime\").innerHTML = localtime;\n if(utctime != null) document.getElementById(\"lookuputctime\").innerHTML = utctime;\n if(discord != null) document.getElementById(\"lookupdiscord\").innerHTML = discord;\n if(proof != null) document.getElementById(\"lookupproof\").innerHTML = proof;\n}\n\n/* ---\n * estimatefunc() -  Main entrypoint/callback for 'Estimate height' logic\n */\n\nconst estimatedata = {\n  stage: 0,\n\n  paramQToHeight: 1000000,\n  paramQToVDF: 1019055,\n  paramQToTimestamp: 1747121045546,\n\n  paramQFromHeight: 500000,\n  paramQFromVDF: 509337,\n  paramQFromTimestamp: 1742121511863,\n\n  paramHeight: 0,\n  paramVDF: 0,\n  paramTimestamp: 0,\n  paramNonTX: 0,\n  param10sDev: 0\n  }\n\nfunction estimatefunc(button = null)\n{\n if(estimatedata.stage > 0) return;\n estimatedata.stage = 1;\n estimate_disabled(true);\n\n var estimateheight = estimate_getvalue(document.getElementById(\"estimateheight\").value);\n var estimatevdf = estimate_getvalue(document.getElementById(\"estimatevdf\").value);\n var estimatetimestamp = estimate_getvalue(document.getElementById(\"estimatetimestamp\").value);\n\n var outputheight = \"\";\n var outputvdf = \"\";\n var outputtimestamp = \"\";\n var outputlocaltime = \"...\";\n var outpututctime = \"...\";\n var outputdiscord = \"...\";\n\n estimate_output(outputheight, outputvdf, outputtimestamp, outputlocaltime, outpututctime, outputdiscord);\n\n if(button === \"vdf\"){ // Estimate: VDF Height\n   outputvdf = estimatevdf;\n   outputheight = Math.round(estimatedata.paramHeight + ((outputvdf - estimatedata.paramVDF) / estimatedata.paramNonTX));\n   outputtimestamp = Math.round(estimatedata.paramTimestamp + (((outputheight - estimatedata.paramHeight) * estimatedata.param10sDev) * 10 * 1000));\n   }\n else if(button === \"timestamp\"){ // Estimate: Timestamp\n   outputtimestamp = estimatetimestamp;\n   outputheight = Math.round(estimatedata.paramHeight + (((outputtimestamp - estimatedata.paramTimestamp) / estimatedata.param10sDev) / 1000 / 10));\n   outputvdf = Math.round(estimatedata.paramVDF + ((outputheight - estimatedata.paramHeight) * estimatedata.paramNonTX));\n   }\n else{ // Estimate: Height\n   outputheight = estimateheight;\n   outputvdf = Math.round(estimatedata.paramVDF + ((outputheight - estimatedata.paramHeight) * estimatedata.paramNonTX));\n   outputtimestamp = Math.round(estimatedata.paramTimestamp + (((outputheight - estimatedata.paramHeight) * estimatedata.param10sDev) * 10 * 1000));\n   }\n\n const datetimestamp = new Date(outputtimestamp);\n outputlocaltime = datetimestamp.toLocaleString(localeFormat, localeOptLocal);\n outpututctime = datetimestamp.toLocaleString(localeFormat, localeOptUTC);\n outputdiscord = \"<code>&lt;t:\" + Math.round(outputtimestamp / 1000) + \":F&gt;</code>\"  + ' (<a href=\"https://discord.com/developers/docs/reference#message-formatting-timestamp-styles\">style</a>)';\n\n estimate_output(outputheight, outputvdf, outputtimestamp, outputlocaltime, outpututctime, outputdiscord);\n\n estimate_disabled(false);\n estimatedata.stage = 0;\n}\n\n/* ---\n * estimate_disabled() - Disable/enable 'Estimate height' input elements HTML\n */\n\nfunction estimate_disabled(disabled = false)\n{\n document.getElementById(\"estimateheight\").disabled = disabled;\n document.getElementById(\"estimatebuttonheight\").disabled = disabled;\n document.getElementById(\"estimatevdf\").disabled = disabled;\n document.getElementById(\"estimatebuttonvdf\").disabled = disabled;\n document.getElementById(\"estimatetimestamp\").disabled = disabled;\n document.getElementById(\"estimatebuttontimestamp\").disabled = disabled;\n}\n\n/* ---\n * estimate_getvalue() - Secure 'Estimate height' value, numeric\n */\n\nfunction estimate_getvalue(value = null)\n{\n if(value == null) return 0;\n value = Number(value);\n if(value !== value) value = 0;\n return Math.floor(value);\n}\n\n/* ---\n * estimate_output() - Output values to 'Estimate height' elements HTML\n */\n\nfunction estimate_output(height = null, vdf = null, timestamp = null, localtime = null, utctime = null, discord = null)\n{\n if(height != null) document.getElementById(\"estimateheight\").value = height;\n if(vdf != null) document.getElementById(\"estimatevdf\").value = vdf;\n if(timestamp != null) document.getElementById(\"estimatetimestamp\").value = timestamp;\n if(localtime != null) document.getElementById(\"estimatelocaltime\").innerHTML = localtime;\n if(utctime != null) document.getElementById(\"estimateutctime\").innerHTML = utctime;\n if(discord != null) document.getElementById(\"estimatediscord\").innerHTML = discord;\n}\n\n/* ---\n * estimateupdatefunc() - Main entrypoint/callback for 'Estimate height (update)' logic\n */\n\nconst estimateupdatedata = {\n  stage: 0,\n  callcount: 0\n  }\n\nfunction estimateupdatefunc(callback = false, jsondata = null, status = null)\n{\n if(estimateupdatedata.stage > 0 && !callback) return;\n\n ++(estimateupdatedata.callcount);\n if(estimateupdatedata.callcount > 10) return; // Failsafe, if too many calls/iters, one query\n\n if(estimateupdatedata.stage <= 0){ // Stage 0: Update button pressed\n   estimateupdatedata.stage = 1;\n   estimateupdatedata.callcount = 1;\n   document.getElementById(\"estimatebuttonupdate\").disabled = true;\n\n   estimateupdate_output(\"...\", \"...\", \"...\", \"...\", \"...\");\n\n   estimateupdatedata.stage = 1;\n   rpcquerynodeinfo(estimateupdatefunc);\n\n   return;\n   }\n\n else if(estimateupdatedata.stage == 1){ // Stage 1: Callback with chain height\n   if(status != 200){ estimateupdatedata.stage = 9; estimateupdatefunc(true, null, null); return; } // Fallback, keep existing data\n   var chainheight = estimateupdate_getvalue(jsondata[\"height\"]);\n\n   estimateupdatedata.stage = 2;\n   rpcqueryheight(chainheight, estimateupdatefunc);\n   return;\n   }\n\n else if(estimateupdatedata.stage == 2){ // Stage 2: Callback with 'to' height data\n   if(status != 200){ estimateupdatedata.stage = 9; estimateupdatefunc(true, null, null); return; } // Fallback, keep existing data\n   estimatedata.paramQToHeight = estimateupdate_getvalue(jsondata[\"height\"]);\n   estimatedata.paramQToVDF = estimateupdate_getvalue(jsondata[\"vdf_height\"]);\n   estimatedata.paramQToTimestamp = estimateupdate_getvalue(jsondata[\"time_stamp\"]);\n\n   estimateupdatedata.stage = 3;\n   rpcqueryheight(estimatedata.paramQToHeight - 500000, estimateupdatefunc);\n   return;\n   }\n\n else if(estimateupdatedata.stage == 3){ // Stage 3: Callback with 'from' height data\n   if(status != 200){ estimateupdatedata.stage = 9; estimateupdatefunc(true, null, null); return; } // Fallback, keep existing data\n   estimatedata.paramQFromHeight = estimateupdate_getvalue(jsondata[\"height\"]);\n   estimatedata.paramQFromVDF = estimateupdate_getvalue(jsondata[\"vdf_height\"]);\n   estimatedata.paramQFromTimestamp = estimateupdate_getvalue(jsondata[\"time_stamp\"]);\n\n   estimatedata.paramHeight = estimatedata.paramQToHeight;\n   estimatedata.paramVDF = estimatedata.paramQToVDF;\n   estimatedata.paramTimestamp = estimatedata.paramQToTimestamp;\n   estimatedata.paramNonTX = (estimatedata.paramQToVDF - estimatedata.paramQFromVDF) / (estimatedata.paramQToHeight - estimatedata.paramQFromHeight);\n   estimatedata.param10sDev = (estimatedata.paramQToTimestamp - estimatedata.paramQFromTimestamp) / ((estimatedata.paramQToHeight - estimatedata.paramQFromHeight) * 10 * 1000);\n\n   estimateupdatedata.stage = 9;\n   estimateupdatefunc(true, null, null);\n   return;\n   }\n\n else if(estimateupdatedata.stage == 9){ // Stage 9: Output updated estimate data\n   estimateupdate_output(estimatedata.paramHeight, estimatedata.paramVDF, estimatedata.paramTimestamp, ((estimatedata.paramNonTX - 1) * 100).toFixed(4), ((estimatedata.param10sDev - 1) * 100).toFixed(4));\n\n   document.getElementById(\"estimatebuttonupdate\").disabled = false;\n   estimateupdatedata.callcount = 0;\n   estimateupdatedata.stage = 0;\n   return;\n   }\n}\n\n/* ---\n * estimateupdate_getvalue() - Secure 'Lookup height (update)' value, positive integer\n */\n\nfunction estimateupdate_getvalue(value = null)\n{\n if(value == null) return 0;\n value = Number(value);\n if(value !== value) value = 0;\n if(value < 0) value = 0;\n return Math.floor(value);\n}\n\n/* ---\n * estimateupdate_output() - Output values to 'Estimate height (update)' elements HTML\n */\n\nfunction estimateupdate_output(pheight = null, pvdf = null, ptimestamp = null, pnontx = null, p10sdev = null)\n{\n if(pheight != null) document.getElementById(\"estpheight\").innerHTML = pheight;\n if(pvdf != null) document.getElementById(\"estpvdf\").innerHTML = pvdf;\n if(ptimestamp != null) document.getElementById(\"estptimestamp\").innerHTML = ptimestamp;\n if(pnontx != null) document.getElementById(\"estpnontx\").innerHTML = pnontx;\n if(p10sdev != null) document.getElementById(\"estp10sdev\").innerHTML = p10sdev;\n}\n\n/* ---\n * rpcqueryheight() - rpc query MMX block with height data\n */\n\nfunction rpcqueryheight(height = 0, callbackfunc = null)\n{\n if(!callbackfunc) return;\n\n fetch(urlrpcserver + \"/block?height=\" + height)\n   .then(response => {\n     return ((response.status == 200) ? response.json() : null);\n     })\n   .then(data => {\n     callbackfunc(true, data, data ? 200 : 204);\n     })\n   .catch(err => {\n     callbackfunc(true, null, 0);\n     });\n}\n\n/* ---\n * rpcquerynodeinfo() - rpc query MMX node info with chain height\n */\n\nfunction rpcquerynodeinfo(callbackfunc = null)\n{\n if(!callbackfunc) return;\n\n fetch(urlrpcserver + \"/node/info\")\n   .then(response => {\n     return ((response.status == 200) ? response.json() : null);\n     })\n   .then(data => {\n     callbackfunc(true, data, data ? 200 : 204);\n     })\n   .catch(err => {\n     callbackfunc(true, null, 0);\n     });\n}\n\n</script>\n\n<!-- <eof> -->\n"
  },
  {
    "path": "docs/src/styles/style.css",
    "content": ":root {\n\t--sl-color-white: hsl(0, 0%, 100%);\n\t--sl-color-gray-1: hsl(232, 0%, 94%);\n\t--sl-color-gray-2: hsl(232, 0%, 77%);\n\t--sl-color-gray-3: hsl(232, 0%, 56%);\n\t--sl-color-gray-4: hsl(232, 0%, 36%);\n\t--sl-color-gray-5: hsl(232, 0%, 23%);\n\t--sl-color-gray-6: hsl(232, 0%, 16%);\n\t--sl-color-black: hsl(232, 0%, 7%);\n\n\t--sl-nav-pad-y: 0rem;\n\n\t.site-title { color: var(--sl-color-white); }\n\t.site-title { font-size: var(--sl-text-h3); }\n\n\t.social-icons > a {\n\t\tcolor: var(--sl-color-white);\n\t\tpadding: 0.5em;\n\t\tmargin: -0.5em;\n\t}\n\n\t.social-icons > a:hover {\n\t\topacity: 0.66;\n\t}\n\n\t.sl-markdown-content :is(h1, h2, h3, h4, h5, h6) > a {\n\t\tcolor: var(--sl-color-white);\n\t\ttext-decoration: none;\n\t}\n}\n\n:root[data-theme='light'] {\n\t--sl-color-white: hsl(232, 0%, 5%);\n\t--sl-color-gray-1: hsl(232, 0%, 13%);\n\t--sl-color-gray-2: hsl(232, 0%, 20%);\n\t--sl-color-gray-3: hsl(232, 0%, 33%);\n\t--sl-color-gray-4: hsl(232, 0%, 53%);\n\t--sl-color-gray-5: hsl(232, 0%, 75%);\n\t--sl-color-gray-6: hsl(232, 0%, 93%);\n\t--sl-color-gray-7: hsl(232, 0%, 96%);\n\t--sl-color-black: hsl(0, 0%, 100%);\n}\n\n:root[data-has-sidebar] {\n\t.sl-container:has(footer) { max-width: none; }\n\n\t--sl-custom-content-pad-x-max: 5rem;\n\t--sl-custom-main-pane-width-max: 80rem;\n\n\t@media (min-width: 50rem) {\n\t\t--__sl-custom-grid-col1-min1: calc(var(--sl-content-width) + (var(--sl-nav-pad-x) * 2) + var(--sl-content-pad-x));\n\t\t--__sl-custom-grid-col1-min2: calc(var(--sl-sidebar-pad-x) + var(--sl-sidebar-width) + var(--sl-sidebar-pad-x) + var(--sl-content-pad-x));\n\t\t.header { grid-template-columns: minmax(max(min(100% - var(--__sl-custom-grid-col1-min1), var(--__sl-custom-grid-col1-min2)), calc(var(--sl-sidebar-width) - var(--sl-nav-pad-x))), auto) 1fr auto; }\n\t}\n\n\t@media (min-width: 72rem) {\n\t\t.main-pane {\n\t\t\t--__sl-custom-tmp72-min: calc(var(--sl-content-width) + (var(--sl-content-pad-x) * 2));\n\t\t\tpadding-left: min(100% - var(--__sl-custom-tmp72-min) - (var(--sl-nav-pad-x) * 2), var(--sl-custom-content-pad-x-max));\n\t\t\twidth: min(100%, var(--sl-custom-main-pane-width-max) - var(--sl-custom-content-pad-x-max));\n\t\t}\n\t\t.sl-container:has(h1#_top) { margin-inline: 0 auto; }\n\t}\n}\n\n\n:root[data-has-sidebar][data-has-toc] {\n\t.sl-container:has(footer) { max-width: none; }\n\t.right-sidebar-container { width: var(--sl-sidebar-width); }\n\n\t--sl-custom-content-pad-x-max: 5rem;\n\t--sl-custom-main-pane-width-max: 80rem;\n\n\t@media (min-width: 50rem) {\n\t\t--__sl-custom-grid-col1-min1: calc(var(--sl-content-pad-x) + var(--sl-content-width) + var(--sl-content-pad-x) + var(--sl-sidebar-width) + var(--sl-nav-pad-x));\n\t\t--__sl-custom-grid-col1-min2: calc(var(--sl-sidebar-pad-x) + var(--sl-sidebar-width) + var(--sl-sidebar-pad-x) + var(--sl-content-pad-x));\n\t\t.header { grid-template-columns: minmax(max(min(100% - var(--__sl-custom-grid-col1-min1), var(--__sl-custom-grid-col1-min2)), calc(var(--sl-sidebar-width) - var(--sl-nav-pad-x))), auto) 1fr auto; }\n\t}\n\n\t@media (min-width: 72rem) {\n\t\t.main-pane {\n\t\t\t--__sl-custom-tmp72-min1: calc(var(--sl-content-width) + (var(--sl-content-pad-x) * 2) + var(--sl-sidebar-width) + (var(--sl-nav-pad-x) * 2));\n\t\t\t--__sl-custom-tmp72-min2: calc(var(--__sl-custom-tmp72-min1) + var(--sl-custom-content-pad-x-max));\n\t\t\tpadding-left: min(100% - var(--__sl-custom-tmp72-min1), var(--sl-custom-content-pad-x-max));\n\t\t\tpadding-right: min(100% - var(--__sl-custom-tmp72-min2), var(--sl-custom-content-pad-x-max));\n\t\t\twidth: min(100% - var(--sl-sidebar-width), var(--sl-custom-main-pane-width-max));\n\t\t}\n\t\t.sl-container:has(h1#_top) { margin-inline: 0 auto; }\n\t}\n}\n"
  },
  {
    "path": "docs/tsconfig.json",
    "content": "{\n  \"extends\": \"astro/tsconfigs/strict\",\n  \"include\": [\".astro/types.d.ts\", \"**/*\"],\n  \"exclude\": [\"dist\"]\n}\n"
  },
  {
    "path": "generated/contract/include/mmx/contract/Binary.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_contract_Binary_HXX_\n#define INCLUDE_mmx_contract_Binary_HXX_\n\n#include <mmx/contract/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/compile_flags_t.hxx>\n#include <mmx/contract/method_t.hxx>\n#include <mmx/hash_t.hpp>\n\n\nnamespace mmx {\nnamespace contract {\n\nclass MMX_CONTRACT_EXPORT Binary : public ::mmx::Contract {\npublic:\n\t\n\tstd::string name;\n\tstd::map<std::string, uint32_t> fields;\n\tstd::map<std::string, ::mmx::contract::method_t> methods;\n\tstd::vector<uint8_t> constant;\n\tstd::vector<uint8_t> binary;\n\tstd::map<uint32_t, uint32_t> line_info;\n\tstd::string source;\n\tstd::string compiler;\n\t::mmx::compile_flags_t build_flags;\n\t\n\ttypedef ::mmx::Contract Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xbbeba47fc8b740e5ull;\n\t\n\tBinary() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = 0) const override;\n\tvirtual uint64_t num_bytes() const override;\n\tvirtual vnx::optional<uint32_t> find_field(const std::string& name = \"\") const;\n\tvirtual vnx::optional<::mmx::contract::method_t> find_method(const std::string& name = \"\") const;\n\tvirtual vnx::optional<uint32_t> find_line(const uint32_t& address = 0) const;\n\t\n\tstatic std::shared_ptr<Binary> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Binary& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Binary& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Binary::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Binary>(10);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"name\", 1); _visitor.accept(name);\n\t_visitor.type_field(\"fields\", 2); _visitor.accept(fields);\n\t_visitor.type_field(\"methods\", 3); _visitor.accept(methods);\n\t_visitor.type_field(\"constant\", 4); _visitor.accept(constant);\n\t_visitor.type_field(\"binary\", 5); _visitor.accept(binary);\n\t_visitor.type_field(\"line_info\", 6); _visitor.accept(line_info);\n\t_visitor.type_field(\"source\", 7); _visitor.accept(source);\n\t_visitor.type_field(\"compiler\", 8); _visitor.accept(compiler);\n\t_visitor.type_field(\"build_flags\", 9); _visitor.accept(build_flags);\n\t_visitor.template type_end<Binary>(10);\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_contract_Binary_HXX_\n"
  },
  {
    "path": "generated/contract/include/mmx/contract/Data.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_contract_Data_HXX_\n#define INCLUDE_mmx_contract_Data_HXX_\n\n#include <mmx/contract/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\nnamespace contract {\n\nclass MMX_CONTRACT_EXPORT Data : public ::mmx::Contract {\npublic:\n\t\n\t::vnx::Variant value;\n\t\n\ttypedef ::mmx::Contract Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xadfeee3822244f50ull;\n\t\n\tData() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = 0) const override;\n\tvirtual uint64_t num_bytes() const override;\n\t\n\tstatic std::shared_ptr<Data> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Data& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Data& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Data::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Data>(2);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"value\", 1); _visitor.accept(value);\n\t_visitor.template type_end<Data>(2);\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_contract_Data_HXX_\n"
  },
  {
    "path": "generated/contract/include/mmx/contract/Executable.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_contract_Executable_HXX_\n#define INCLUDE_mmx_contract_Executable_HXX_\n\n#include <mmx/contract/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/contract/TokenBase.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\nnamespace contract {\n\nclass MMX_CONTRACT_EXPORT Executable : public ::mmx::contract::TokenBase {\npublic:\n\t\n\t::mmx::addr_t binary;\n\tstd::string init_method = \"init\";\n\tstd::vector<::vnx::Variant> init_args;\n\tstd::map<std::string, ::mmx::addr_t> depends;\n\t\n\ttypedef ::mmx::contract::TokenBase Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xfa6a3ac9103ebb12ull;\n\t\n\tExecutable() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::addr_t get_external(const std::string& name = \"\") const;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = 0) const override;\n\tvirtual uint64_t calc_cost(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const;\n\tvirtual uint64_t num_bytes() const override;\n\tvirtual ::vnx::Variant read_field(const std::string& name = \"\") const;\n\tvirtual ::vnx::Variant get_arg(const uint32_t& index = 0) const;\n\t\n\tstatic std::shared_ptr<Executable> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Executable& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Executable& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Executable::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Executable>(9);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"name\", 1); _visitor.accept(name);\n\t_visitor.type_field(\"symbol\", 2); _visitor.accept(symbol);\n\t_visitor.type_field(\"decimals\", 3); _visitor.accept(decimals);\n\t_visitor.type_field(\"meta_data\", 4); _visitor.accept(meta_data);\n\t_visitor.type_field(\"binary\", 5); _visitor.accept(binary);\n\t_visitor.type_field(\"init_method\", 6); _visitor.accept(init_method);\n\t_visitor.type_field(\"init_args\", 7); _visitor.accept(init_args);\n\t_visitor.type_field(\"depends\", 8); _visitor.accept(depends);\n\t_visitor.template type_end<Executable>(9);\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_contract_Executable_HXX_\n"
  },
  {
    "path": "generated/contract/include/mmx/contract/MultiSig.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_contract_MultiSig_HXX_\n#define INCLUDE_mmx_contract_MultiSig_HXX_\n\n#include <mmx/contract/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\nnamespace contract {\n\nclass MMX_CONTRACT_EXPORT MultiSig : public ::mmx::Contract {\npublic:\n\t\n\tuint32_t num_required = 0;\n\tstd::set<::mmx::addr_t> owners;\n\t\n\ttypedef ::mmx::Contract Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x7d674c5f7297dedull;\n\t\n\tMultiSig() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = 0) const override;\n\tvirtual uint64_t num_bytes() const override;\n\tvirtual void validate(std::shared_ptr<const ::mmx::Solution> solution = nullptr, const ::mmx::hash_t& txid = ::mmx::hash_t()) const override;\n\tvirtual ::vnx::Variant read_field(const std::string& name = \"\") const override;\n\t\n\tstatic std::shared_ptr<MultiSig> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const MultiSig& _value);\n\tfriend std::istream& operator>>(std::istream& _in, MultiSig& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid MultiSig::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<MultiSig>(3);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"num_required\", 1); _visitor.accept(num_required);\n\t_visitor.type_field(\"owners\", 2); _visitor.accept(owners);\n\t_visitor.template type_end<MultiSig>(3);\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_contract_MultiSig_HXX_\n"
  },
  {
    "path": "generated/contract/include/mmx/contract/PubKey.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_contract_PubKey_HXX_\n#define INCLUDE_mmx_contract_PubKey_HXX_\n\n#include <mmx/contract/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\nnamespace contract {\n\nclass MMX_CONTRACT_EXPORT PubKey : public ::mmx::Contract {\npublic:\n\t\n\t::mmx::addr_t address;\n\t\n\ttypedef ::mmx::Contract Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9b3cd508d7f41423ull;\n\t\n\tPubKey() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = 0) const override;\n\tvirtual uint64_t num_bytes() const override;\n\tvirtual vnx::optional<::mmx::addr_t> get_owner() const override;\n\tvirtual void validate(std::shared_ptr<const ::mmx::Solution> solution = nullptr, const ::mmx::hash_t& txid = ::mmx::hash_t()) const override;\n\tvirtual ::vnx::Variant read_field(const std::string& name = \"\") const override;\n\t\n\tstatic std::shared_ptr<PubKey> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const PubKey& _value);\n\tfriend std::istream& operator>>(std::istream& _in, PubKey& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid PubKey::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<PubKey>(2);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.template type_end<PubKey>(2);\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_contract_PubKey_HXX_\n"
  },
  {
    "path": "generated/contract/include/mmx/contract/TokenBase.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_contract_TokenBase_HXX_\n#define INCLUDE_mmx_contract_TokenBase_HXX_\n\n#include <mmx/contract/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\nnamespace contract {\n\nclass MMX_CONTRACT_EXPORT TokenBase : public ::mmx::Contract {\npublic:\n\t\n\tstd::string name;\n\tstd::string symbol;\n\tint32_t decimals = 0;\n\t::vnx::Variant meta_data;\n\t\n\ttypedef ::mmx::Contract Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5aeed4c96d232b5eull;\n\t\n\tTokenBase() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = 0) const override;\n\tvirtual uint64_t num_bytes() const override;\n\t\n\tstatic std::shared_ptr<TokenBase> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const TokenBase& _value);\n\tfriend std::istream& operator>>(std::istream& _in, TokenBase& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid TokenBase::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<TokenBase>(5);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"name\", 1); _visitor.accept(name);\n\t_visitor.type_field(\"symbol\", 2); _visitor.accept(symbol);\n\t_visitor.type_field(\"decimals\", 3); _visitor.accept(decimals);\n\t_visitor.type_field(\"meta_data\", 4); _visitor.accept(meta_data);\n\t_visitor.template type_end<TokenBase>(5);\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_contract_TokenBase_HXX_\n"
  },
  {
    "path": "generated/contract/include/mmx/contract/WebData.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_contract_WebData_HXX_\n#define INCLUDE_mmx_contract_WebData_HXX_\n\n#include <mmx/contract/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Buffer.hpp>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\nnamespace contract {\n\nclass MMX_CONTRACT_EXPORT WebData : public ::mmx::Contract {\npublic:\n\t\n\tstd::string mime_type;\n\t::vnx::Buffer payload;\n\t\n\ttypedef ::mmx::Contract Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf7c226b211c088c4ull;\n\t\n\tWebData() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = 0) const override;\n\tvirtual uint64_t num_bytes() const override;\n\tvirtual ::vnx::Variant read_field(const std::string& name = \"\") const override;\n\t\n\tstatic std::shared_ptr<WebData> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const WebData& _value);\n\tfriend std::istream& operator>>(std::istream& _in, WebData& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid WebData::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<WebData>(3);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"mime_type\", 1); _visitor.accept(mime_type);\n\t_visitor.type_field(\"payload\", 2); _visitor.accept(payload);\n\t_visitor.template type_end<WebData>(3);\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_contract_WebData_HXX_\n"
  },
  {
    "path": "generated/contract/include/mmx/contract/accept_generic.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_contract_ACCEPT_GENERIC_HXX_\n#define INCLUDE_mmx_contract_ACCEPT_GENERIC_HXX_\n\n#include <mmx/contract/Binary.hxx>\n#include <mmx/contract/Data.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/contract/MultiSig.hxx>\n#include <mmx/contract/PubKey.hxx>\n#include <mmx/contract/TokenBase.hxx>\n#include <mmx/contract/WebData.hxx>\n\n\nnamespace vnx {\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::Binary> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::Data> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::Executable> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::MultiSig> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::PubKey> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::TokenBase> value) {\n\tif(value) {\n\t\tif(auto tmp = std::dynamic_pointer_cast<const ::mmx::contract::Executable>(value)) {\n\t\t\tvnx::accept_generic(visitor, tmp);\n\t\t} else {\n\t\t\tvalue->accept_generic(visitor);\n\t\t}\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::WebData> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\n\n\n} // namespace vnx\n\n#endif // INCLUDE_mmx_contract_ACCEPT_GENERIC_HXX_\n"
  },
  {
    "path": "generated/contract/include/mmx/contract/method_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_contract_method_t_HXX_\n#define INCLUDE_mmx_contract_method_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/contract/package.hxx>\n\n\nnamespace mmx {\nnamespace contract {\n\nstruct MMX_CONTRACT_EXPORT method_t : vnx::struct_t {\n\t\n\t\n\tstd::string name;\n\tstd::string info;\n\tvnx::bool_t is_init = 0;\n\tvnx::bool_t is_const = 0;\n\tvnx::bool_t is_public = 0;\n\tvnx::bool_t is_payable = 0;\n\tuint32_t entry_point = 0;\n\tstd::vector<std::string> args;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1f62512698176a39ull;\n\t\n\tmethod_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tuint64_t num_bytes() const;\n\t\n\tstatic std::shared_ptr<method_t> create();\n\tstd::shared_ptr<method_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const method_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, method_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid method_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<method_t>(8);\n\t_visitor.type_field(\"name\", 0); _visitor.accept(name);\n\t_visitor.type_field(\"info\", 1); _visitor.accept(info);\n\t_visitor.type_field(\"is_init\", 2); _visitor.accept(is_init);\n\t_visitor.type_field(\"is_const\", 3); _visitor.accept(is_const);\n\t_visitor.type_field(\"is_public\", 4); _visitor.accept(is_public);\n\t_visitor.type_field(\"is_payable\", 5); _visitor.accept(is_payable);\n\t_visitor.type_field(\"entry_point\", 6); _visitor.accept(entry_point);\n\t_visitor.type_field(\"args\", 7); _visitor.accept(args);\n\t_visitor.template type_end<method_t>(8);\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::contract::method_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_contract_method_t_HXX_\n"
  },
  {
    "path": "generated/contract/include/mmx/contract/package.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_contract_PACKAGE_HXX_\n#define INCLUDE_mmx_contract_PACKAGE_HXX_\n\n#include <vnx/Type.h>\n\n#include <mmx/package.hxx>\n#include <vnx/package.hxx>\n\n#ifdef MMX_CONTRACT_EXPORT_ENABLE\n#include <mmx_contract_export.h>\n#else\n#ifndef MMX_CONTRACT_EXPORT\n#define MMX_CONTRACT_EXPORT\n#endif\n#endif\n\n\nnamespace mmx {\nnamespace contract {\n\nvoid register_all_types();\n\n\nclass Binary;\nclass Data;\nclass Executable;\nclass MultiSig;\nclass PubKey;\nclass TokenBase;\nclass WebData;\nstruct method_t;\n\nMMX_CONTRACT_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Binary; ///< \\private\nMMX_CONTRACT_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Data; ///< \\private\nMMX_CONTRACT_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Executable; ///< \\private\nMMX_CONTRACT_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_MultiSig; ///< \\private\nMMX_CONTRACT_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_PubKey; ///< \\private\nMMX_CONTRACT_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_TokenBase; ///< \\private\nMMX_CONTRACT_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_WebData; ///< \\private\nMMX_CONTRACT_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_method_t; ///< \\private\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::contract::Binary& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::contract::Data& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::contract::Executable& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::contract::MultiSig& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::contract::PubKey& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::contract::TokenBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::contract::WebData& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::contract::method_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid write(TypeOutput& out, const ::mmx::contract::Binary& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::contract::Data& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::contract::Executable& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::contract::MultiSig& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::contract::PubKey& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::contract::TokenBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::contract::WebData& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::contract::method_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid read(std::istream& in, ::mmx::contract::Binary& value); ///< \\private\nvoid read(std::istream& in, ::mmx::contract::Data& value); ///< \\private\nvoid read(std::istream& in, ::mmx::contract::Executable& value); ///< \\private\nvoid read(std::istream& in, ::mmx::contract::MultiSig& value); ///< \\private\nvoid read(std::istream& in, ::mmx::contract::PubKey& value); ///< \\private\nvoid read(std::istream& in, ::mmx::contract::TokenBase& value); ///< \\private\nvoid read(std::istream& in, ::mmx::contract::WebData& value); ///< \\private\nvoid read(std::istream& in, ::mmx::contract::method_t& value); ///< \\private\n\nvoid write(std::ostream& out, const ::mmx::contract::Binary& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::contract::Data& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::contract::Executable& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::contract::MultiSig& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::contract::PubKey& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::contract::TokenBase& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::contract::WebData& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::contract::method_t& value); ///< \\private\n\nvoid accept(Visitor& visitor, const ::mmx::contract::Binary& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::contract::Data& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::contract::Executable& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::contract::MultiSig& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::contract::PubKey& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::contract::TokenBase& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::contract::WebData& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::contract::method_t& value); ///< \\private\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::Binary> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::Data> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::Executable> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::MultiSig> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::PubKey> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::TokenBase> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::contract::WebData> value); ///< \\private\n\n/// \\private\ntemplate<>\nstruct type<::mmx::contract::Binary> {\n\tvoid read(TypeInput& in, ::mmx::contract::Binary& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::contract::Binary& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::contract::Binary& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::contract::Binary& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::contract::Binary& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::Binary& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::contract::Data> {\n\tvoid read(TypeInput& in, ::mmx::contract::Data& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::contract::Data& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::contract::Data& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::contract::Data& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::contract::Data& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::Data& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::contract::Executable> {\n\tvoid read(TypeInput& in, ::mmx::contract::Executable& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::contract::Executable& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::contract::Executable& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::contract::Executable& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::contract::Executable& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::Executable& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::contract::MultiSig> {\n\tvoid read(TypeInput& in, ::mmx::contract::MultiSig& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::contract::MultiSig& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::contract::MultiSig& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::contract::MultiSig& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::contract::MultiSig& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::MultiSig& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::contract::PubKey> {\n\tvoid read(TypeInput& in, ::mmx::contract::PubKey& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::contract::PubKey& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::contract::PubKey& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::contract::PubKey& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::contract::PubKey& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::PubKey& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::contract::TokenBase> {\n\tvoid read(TypeInput& in, ::mmx::contract::TokenBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::contract::TokenBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::contract::TokenBase& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::contract::TokenBase& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::contract::TokenBase& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::TokenBase& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::contract::WebData> {\n\tvoid read(TypeInput& in, ::mmx::contract::WebData& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::contract::WebData& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::contract::WebData& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::contract::WebData& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::contract::WebData& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::WebData& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::contract::method_t> {\n\tvoid read(TypeInput& in, ::mmx::contract::method_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::contract::method_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::contract::method_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::contract::method_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::contract::method_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::method_t& value, bool special = false);\n};\n\n\n} // namespace vnx\n\n#endif // INCLUDE_mmx_contract_PACKAGE_HXX_\n"
  },
  {
    "path": "generated/contract/src/Binary.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/contract/package.hxx>\n#include <mmx/contract/Binary.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/compile_flags_t.hxx>\n#include <mmx/contract/method_t.hxx>\n#include <mmx/hash_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace contract {\n\n\nconst vnx::Hash64 Binary::VNX_TYPE_HASH(0xbbeba47fc8b740e5ull);\nconst vnx::Hash64 Binary::VNX_CODE_HASH(0xdafe5167bf0b4ebbull);\n\nvnx::Hash64 Binary::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Binary::get_type_name() const {\n\treturn \"mmx.contract.Binary\";\n}\n\nconst vnx::TypeCode* Binary::get_type_code() const {\n\treturn mmx::contract::vnx_native_type_code_Binary;\n}\n\nstd::shared_ptr<Binary> Binary::create() {\n\treturn std::make_shared<Binary>();\n}\n\nstd::shared_ptr<vnx::Value> Binary::clone() const {\n\treturn std::make_shared<Binary>(*this);\n}\n\nvoid Binary::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Binary::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Binary::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::contract::vnx_native_type_code_Binary;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, fields);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, methods);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, constant);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, binary);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, line_info);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, source);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, compiler);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, build_flags);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Binary::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.contract.Binary\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"fields\\\": \"; vnx::write(_out, fields);\n\t_out << \", \\\"methods\\\": \"; vnx::write(_out, methods);\n\t_out << \", \\\"constant\\\": \"; vnx::write(_out, constant);\n\t_out << \", \\\"binary\\\": \"; vnx::write(_out, binary);\n\t_out << \", \\\"line_info\\\": \"; vnx::write(_out, line_info);\n\t_out << \", \\\"source\\\": \"; vnx::write(_out, source);\n\t_out << \", \\\"compiler\\\": \"; vnx::write(_out, compiler);\n\t_out << \", \\\"build_flags\\\": \"; vnx::write(_out, build_flags);\n\t_out << \"}\";\n}\n\nvoid Binary::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Binary::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.contract.Binary\";\n\t_object[\"version\"] = version;\n\t_object[\"name\"] = name;\n\t_object[\"fields\"] = fields;\n\t_object[\"methods\"] = methods;\n\t_object[\"constant\"] = constant;\n\t_object[\"binary\"] = binary;\n\t_object[\"line_info\"] = line_info;\n\t_object[\"source\"] = source;\n\t_object[\"compiler\"] = compiler;\n\t_object[\"build_flags\"] = build_flags;\n\treturn _object;\n}\n\nvoid Binary::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"binary\") {\n\t\t\t_entry.second.to(binary);\n\t\t} else if(_entry.first == \"build_flags\") {\n\t\t\t_entry.second.to(build_flags);\n\t\t} else if(_entry.first == \"compiler\") {\n\t\t\t_entry.second.to(compiler);\n\t\t} else if(_entry.first == \"constant\") {\n\t\t\t_entry.second.to(constant);\n\t\t} else if(_entry.first == \"fields\") {\n\t\t\t_entry.second.to(fields);\n\t\t} else if(_entry.first == \"line_info\") {\n\t\t\t_entry.second.to(line_info);\n\t\t} else if(_entry.first == \"methods\") {\n\t\t\t_entry.second.to(methods);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t} else if(_entry.first == \"source\") {\n\t\t\t_entry.second.to(source);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant Binary::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"fields\") {\n\t\treturn vnx::Variant(fields);\n\t}\n\tif(_name == \"methods\") {\n\t\treturn vnx::Variant(methods);\n\t}\n\tif(_name == \"constant\") {\n\t\treturn vnx::Variant(constant);\n\t}\n\tif(_name == \"binary\") {\n\t\treturn vnx::Variant(binary);\n\t}\n\tif(_name == \"line_info\") {\n\t\treturn vnx::Variant(line_info);\n\t}\n\tif(_name == \"source\") {\n\t\treturn vnx::Variant(source);\n\t}\n\tif(_name == \"compiler\") {\n\t\treturn vnx::Variant(compiler);\n\t}\n\tif(_name == \"build_flags\") {\n\t\treturn vnx::Variant(build_flags);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Binary::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"fields\") {\n\t\t_value.to(fields);\n\t} else if(_name == \"methods\") {\n\t\t_value.to(methods);\n\t} else if(_name == \"constant\") {\n\t\t_value.to(constant);\n\t} else if(_name == \"binary\") {\n\t\t_value.to(binary);\n\t} else if(_name == \"line_info\") {\n\t\t_value.to(line_info);\n\t} else if(_name == \"source\") {\n\t\t_value.to(source);\n\t} else if(_name == \"compiler\") {\n\t\t_value.to(compiler);\n\t} else if(_name == \"build_flags\") {\n\t\t_value.to(build_flags);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Binary& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Binary& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Binary::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Binary::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.contract.Binary\";\n\ttype_code->type_hash = vnx::Hash64(0xbbeba47fc8b740e5ull);\n\ttype_code->code_hash = vnx::Hash64(0xdafe5167bf0b4ebbull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::contract::Binary);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::Contract::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Binary>(); };\n\ttype_code->depends.resize(2);\n\ttype_code->depends[0] = ::mmx::contract::method_t::static_get_type_code();\n\ttype_code->depends[1] = ::mmx::compile_flags_t::static_get_type_code();\n\ttype_code->fields.resize(10);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"fields\";\n\t\tfield.code = {13, 3, 32, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"methods\";\n\t\tfield.code = {13, 3, 32, 19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"constant\";\n\t\tfield.code = {12, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"binary\";\n\t\tfield.code = {12, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"line_info\";\n\t\tfield.code = {13, 3, 3, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"source\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"compiler\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"build_flags\";\n\t\tfield.code = {19, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Binary::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::contract::Binary& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.fields, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.methods, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.constant, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.binary, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.line_info, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.source, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.compiler, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.build_flags, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::contract::Binary& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::contract::vnx_native_type_code_Binary;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::contract::Binary>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write(out, value.name, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.fields, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.methods, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.constant, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.binary, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.line_info, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.source, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.compiler, type_code, type_code->fields[8].code.data());\n\tvnx::write(out, value.build_flags, type_code, type_code->fields[9].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::contract::Binary& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::contract::Binary& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::contract::Binary& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/contract/src/Data.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/contract/package.hxx>\n#include <mmx/contract/Data.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace contract {\n\n\nconst vnx::Hash64 Data::VNX_TYPE_HASH(0xadfeee3822244f50ull);\nconst vnx::Hash64 Data::VNX_CODE_HASH(0x7a6fca30dfd10cdeull);\n\nvnx::Hash64 Data::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Data::get_type_name() const {\n\treturn \"mmx.contract.Data\";\n}\n\nconst vnx::TypeCode* Data::get_type_code() const {\n\treturn mmx::contract::vnx_native_type_code_Data;\n}\n\nstd::shared_ptr<Data> Data::create() {\n\treturn std::make_shared<Data>();\n}\n\nstd::shared_ptr<vnx::Value> Data::clone() const {\n\treturn std::make_shared<Data>(*this);\n}\n\nvoid Data::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Data::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Data::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::contract::vnx_native_type_code_Data;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, value);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Data::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.contract.Data\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"value\\\": \"; vnx::write(_out, value);\n\t_out << \"}\";\n}\n\nvoid Data::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Data::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.contract.Data\";\n\t_object[\"version\"] = version;\n\t_object[\"value\"] = value;\n\treturn _object;\n}\n\nvoid Data::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"value\") {\n\t\t\t_entry.second.to(value);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant Data::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"value\") {\n\t\treturn vnx::Variant(value);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Data::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"value\") {\n\t\t_value.to(value);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Data& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Data& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Data::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Data::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.contract.Data\";\n\ttype_code->type_hash = vnx::Hash64(0xadfeee3822244f50ull);\n\ttype_code->code_hash = vnx::Hash64(0x7a6fca30dfd10cdeull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::contract::Data);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::Contract::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Data>(); };\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"value\";\n\t\tfield.code = {17};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Data::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::contract::Data& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.value, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::contract::Data& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::contract::vnx_native_type_code_Data;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::contract::Data>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write(out, value.value, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::contract::Data& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::contract::Data& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::contract::Data& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/contract/src/Executable.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/contract/package.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/contract/TokenBase.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace contract {\n\n\nconst vnx::Hash64 Executable::VNX_TYPE_HASH(0xfa6a3ac9103ebb12ull);\nconst vnx::Hash64 Executable::VNX_CODE_HASH(0x470f751e7fd03cf8ull);\n\nvnx::Hash64 Executable::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Executable::get_type_name() const {\n\treturn \"mmx.contract.Executable\";\n}\n\nconst vnx::TypeCode* Executable::get_type_code() const {\n\treturn mmx::contract::vnx_native_type_code_Executable;\n}\n\nstd::shared_ptr<Executable> Executable::create() {\n\treturn std::make_shared<Executable>();\n}\n\nstd::shared_ptr<vnx::Value> Executable::clone() const {\n\treturn std::make_shared<Executable>(*this);\n}\n\nvoid Executable::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Executable::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Executable::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::contract::vnx_native_type_code_Executable;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, symbol);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, decimals);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, meta_data);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, binary);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, init_method);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, init_args);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, depends);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Executable::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.contract.Executable\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"symbol\\\": \"; vnx::write(_out, symbol);\n\t_out << \", \\\"decimals\\\": \"; vnx::write(_out, decimals);\n\t_out << \", \\\"meta_data\\\": \"; vnx::write(_out, meta_data);\n\t_out << \", \\\"binary\\\": \"; vnx::write(_out, binary);\n\t_out << \", \\\"init_method\\\": \"; vnx::write(_out, init_method);\n\t_out << \", \\\"init_args\\\": \"; vnx::write(_out, init_args);\n\t_out << \", \\\"depends\\\": \"; vnx::write(_out, depends);\n\t_out << \"}\";\n}\n\nvoid Executable::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Executable::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.contract.Executable\";\n\t_object[\"version\"] = version;\n\t_object[\"name\"] = name;\n\t_object[\"symbol\"] = symbol;\n\t_object[\"decimals\"] = decimals;\n\t_object[\"meta_data\"] = meta_data;\n\t_object[\"binary\"] = binary;\n\t_object[\"init_method\"] = init_method;\n\t_object[\"init_args\"] = init_args;\n\t_object[\"depends\"] = depends;\n\treturn _object;\n}\n\nvoid Executable::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"binary\") {\n\t\t\t_entry.second.to(binary);\n\t\t} else if(_entry.first == \"decimals\") {\n\t\t\t_entry.second.to(decimals);\n\t\t} else if(_entry.first == \"depends\") {\n\t\t\t_entry.second.to(depends);\n\t\t} else if(_entry.first == \"init_args\") {\n\t\t\t_entry.second.to(init_args);\n\t\t} else if(_entry.first == \"init_method\") {\n\t\t\t_entry.second.to(init_method);\n\t\t} else if(_entry.first == \"meta_data\") {\n\t\t\t_entry.second.to(meta_data);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t} else if(_entry.first == \"symbol\") {\n\t\t\t_entry.second.to(symbol);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant Executable::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"symbol\") {\n\t\treturn vnx::Variant(symbol);\n\t}\n\tif(_name == \"decimals\") {\n\t\treturn vnx::Variant(decimals);\n\t}\n\tif(_name == \"meta_data\") {\n\t\treturn vnx::Variant(meta_data);\n\t}\n\tif(_name == \"binary\") {\n\t\treturn vnx::Variant(binary);\n\t}\n\tif(_name == \"init_method\") {\n\t\treturn vnx::Variant(init_method);\n\t}\n\tif(_name == \"init_args\") {\n\t\treturn vnx::Variant(init_args);\n\t}\n\tif(_name == \"depends\") {\n\t\treturn vnx::Variant(depends);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Executable::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"symbol\") {\n\t\t_value.to(symbol);\n\t} else if(_name == \"decimals\") {\n\t\t_value.to(decimals);\n\t} else if(_name == \"meta_data\") {\n\t\t_value.to(meta_data);\n\t} else if(_name == \"binary\") {\n\t\t_value.to(binary);\n\t} else if(_name == \"init_method\") {\n\t\t_value.to(init_method);\n\t} else if(_name == \"init_args\") {\n\t\t_value.to(init_args);\n\t} else if(_name == \"depends\") {\n\t\t_value.to(depends);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Executable& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Executable& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Executable::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Executable::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.contract.Executable\";\n\ttype_code->type_hash = vnx::Hash64(0xfa6a3ac9103ebb12ull);\n\ttype_code->code_hash = vnx::Hash64(0x470f751e7fd03cf8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::contract::Executable);\n\ttype_code->parents.resize(2);\n\ttype_code->parents[0] = ::mmx::contract::TokenBase::static_get_type_code();\n\ttype_code->parents[1] = ::mmx::Contract::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Executable>(); };\n\ttype_code->fields.resize(9);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"symbol\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"decimals\";\n\t\tfield.value = vnx::to_string(0);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"meta_data\";\n\t\tfield.code = {17};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"binary\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"init_method\";\n\t\tfield.value = vnx::to_string(\"init\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"init_args\";\n\t\tfield.code = {12, 17};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"depends\";\n\t\tfield.code = {13, 3, 32, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Executable::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::contract::Executable& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.decimals, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.symbol, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.meta_data, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.binary, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.init_method, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.init_args, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.depends, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::contract::Executable& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::contract::vnx_native_type_code_Executable;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::contract::Executable>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.decimals);\n\tvnx::write(out, value.name, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.symbol, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.meta_data, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.binary, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.init_method, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.init_args, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.depends, type_code, type_code->fields[8].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::contract::Executable& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::contract::Executable& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::contract::Executable& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/contract/src/MultiSig.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/contract/package.hxx>\n#include <mmx/contract/MultiSig.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace contract {\n\n\nconst vnx::Hash64 MultiSig::VNX_TYPE_HASH(0x7d674c5f7297dedull);\nconst vnx::Hash64 MultiSig::VNX_CODE_HASH(0x5ad3a573cd4bc2f4ull);\n\nvnx::Hash64 MultiSig::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string MultiSig::get_type_name() const {\n\treturn \"mmx.contract.MultiSig\";\n}\n\nconst vnx::TypeCode* MultiSig::get_type_code() const {\n\treturn mmx::contract::vnx_native_type_code_MultiSig;\n}\n\nstd::shared_ptr<MultiSig> MultiSig::create() {\n\treturn std::make_shared<MultiSig>();\n}\n\nstd::shared_ptr<vnx::Value> MultiSig::clone() const {\n\treturn std::make_shared<MultiSig>(*this);\n}\n\nvoid MultiSig::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid MultiSig::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid MultiSig::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::contract::vnx_native_type_code_MultiSig;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, num_required);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, owners);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid MultiSig::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.contract.MultiSig\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"num_required\\\": \"; vnx::write(_out, num_required);\n\t_out << \", \\\"owners\\\": \"; vnx::write(_out, owners);\n\t_out << \"}\";\n}\n\nvoid MultiSig::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object MultiSig::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.contract.MultiSig\";\n\t_object[\"version\"] = version;\n\t_object[\"num_required\"] = num_required;\n\t_object[\"owners\"] = owners;\n\treturn _object;\n}\n\nvoid MultiSig::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"num_required\") {\n\t\t\t_entry.second.to(num_required);\n\t\t} else if(_entry.first == \"owners\") {\n\t\t\t_entry.second.to(owners);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant MultiSig::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"num_required\") {\n\t\treturn vnx::Variant(num_required);\n\t}\n\tif(_name == \"owners\") {\n\t\treturn vnx::Variant(owners);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid MultiSig::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"num_required\") {\n\t\t_value.to(num_required);\n\t} else if(_name == \"owners\") {\n\t\t_value.to(owners);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const MultiSig& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, MultiSig& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* MultiSig::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> MultiSig::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.contract.MultiSig\";\n\ttype_code->type_hash = vnx::Hash64(0x7d674c5f7297dedull);\n\ttype_code->code_hash = vnx::Hash64(0x5ad3a573cd4bc2f4ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::contract::MultiSig);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::Contract::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<MultiSig>(); };\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_required\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"owners\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> MultiSig::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::contract::MultiSig& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_required, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 2: vnx::read(in, value.owners, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::contract::MultiSig& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::contract::vnx_native_type_code_MultiSig;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::contract::MultiSig>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.num_required);\n\tvnx::write(out, value.owners, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::contract::MultiSig& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::contract::MultiSig& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::contract::MultiSig& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/contract/src/PubKey.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/contract/package.hxx>\n#include <mmx/contract/PubKey.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace contract {\n\n\nconst vnx::Hash64 PubKey::VNX_TYPE_HASH(0x9b3cd508d7f41423ull);\nconst vnx::Hash64 PubKey::VNX_CODE_HASH(0xd94be3121579efceull);\n\nvnx::Hash64 PubKey::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string PubKey::get_type_name() const {\n\treturn \"mmx.contract.PubKey\";\n}\n\nconst vnx::TypeCode* PubKey::get_type_code() const {\n\treturn mmx::contract::vnx_native_type_code_PubKey;\n}\n\nstd::shared_ptr<PubKey> PubKey::create() {\n\treturn std::make_shared<PubKey>();\n}\n\nstd::shared_ptr<vnx::Value> PubKey::clone() const {\n\treturn std::make_shared<PubKey>(*this);\n}\n\nvoid PubKey::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid PubKey::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid PubKey::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::contract::vnx_native_type_code_PubKey;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid PubKey::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.contract.PubKey\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid PubKey::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object PubKey::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.contract.PubKey\";\n\t_object[\"version\"] = version;\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid PubKey::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant PubKey::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid PubKey::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const PubKey& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, PubKey& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* PubKey::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> PubKey::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.contract.PubKey\";\n\ttype_code->type_hash = vnx::Hash64(0x9b3cd508d7f41423ull);\n\ttype_code->code_hash = vnx::Hash64(0xd94be3121579efceull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::contract::PubKey);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::Contract::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<PubKey>(); };\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> PubKey::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::contract::PubKey& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::contract::PubKey& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::contract::vnx_native_type_code_PubKey;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::contract::PubKey>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::contract::PubKey& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::contract::PubKey& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::contract::PubKey& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/contract/src/TokenBase.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/contract/package.hxx>\n#include <mmx/contract/TokenBase.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace contract {\n\n\nconst vnx::Hash64 TokenBase::VNX_TYPE_HASH(0x5aeed4c96d232b5eull);\nconst vnx::Hash64 TokenBase::VNX_CODE_HASH(0x8d6ff46e314f1840ull);\n\nvnx::Hash64 TokenBase::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string TokenBase::get_type_name() const {\n\treturn \"mmx.contract.TokenBase\";\n}\n\nconst vnx::TypeCode* TokenBase::get_type_code() const {\n\treturn mmx::contract::vnx_native_type_code_TokenBase;\n}\n\nstd::shared_ptr<TokenBase> TokenBase::create() {\n\treturn std::make_shared<TokenBase>();\n}\n\nstd::shared_ptr<vnx::Value> TokenBase::clone() const {\n\treturn std::make_shared<TokenBase>(*this);\n}\n\nvoid TokenBase::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid TokenBase::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid TokenBase::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::contract::vnx_native_type_code_TokenBase;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, symbol);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, decimals);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, meta_data);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid TokenBase::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.contract.TokenBase\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"symbol\\\": \"; vnx::write(_out, symbol);\n\t_out << \", \\\"decimals\\\": \"; vnx::write(_out, decimals);\n\t_out << \", \\\"meta_data\\\": \"; vnx::write(_out, meta_data);\n\t_out << \"}\";\n}\n\nvoid TokenBase::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object TokenBase::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.contract.TokenBase\";\n\t_object[\"version\"] = version;\n\t_object[\"name\"] = name;\n\t_object[\"symbol\"] = symbol;\n\t_object[\"decimals\"] = decimals;\n\t_object[\"meta_data\"] = meta_data;\n\treturn _object;\n}\n\nvoid TokenBase::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"decimals\") {\n\t\t\t_entry.second.to(decimals);\n\t\t} else if(_entry.first == \"meta_data\") {\n\t\t\t_entry.second.to(meta_data);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t} else if(_entry.first == \"symbol\") {\n\t\t\t_entry.second.to(symbol);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant TokenBase::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"symbol\") {\n\t\treturn vnx::Variant(symbol);\n\t}\n\tif(_name == \"decimals\") {\n\t\treturn vnx::Variant(decimals);\n\t}\n\tif(_name == \"meta_data\") {\n\t\treturn vnx::Variant(meta_data);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid TokenBase::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"symbol\") {\n\t\t_value.to(symbol);\n\t} else if(_name == \"decimals\") {\n\t\t_value.to(decimals);\n\t} else if(_name == \"meta_data\") {\n\t\t_value.to(meta_data);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const TokenBase& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, TokenBase& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* TokenBase::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> TokenBase::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.contract.TokenBase\";\n\ttype_code->type_hash = vnx::Hash64(0x5aeed4c96d232b5eull);\n\ttype_code->code_hash = vnx::Hash64(0x8d6ff46e314f1840ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::contract::TokenBase);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::Contract::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<TokenBase>(); };\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"symbol\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"decimals\";\n\t\tfield.value = vnx::to_string(0);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"meta_data\";\n\t\tfield.code = {17};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> TokenBase::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::contract::TokenBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.decimals, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.symbol, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.meta_data, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::contract::TokenBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::contract::vnx_native_type_code_TokenBase;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::contract::TokenBase>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.decimals);\n\tvnx::write(out, value.name, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.symbol, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.meta_data, type_code, type_code->fields[4].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::contract::TokenBase& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::contract::TokenBase& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::contract::TokenBase& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/contract/src/WebData.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/contract/package.hxx>\n#include <mmx/contract/WebData.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Buffer.hpp>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace contract {\n\n\nconst vnx::Hash64 WebData::VNX_TYPE_HASH(0xf7c226b211c088c4ull);\nconst vnx::Hash64 WebData::VNX_CODE_HASH(0x1f49299db4776797ull);\n\nvnx::Hash64 WebData::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string WebData::get_type_name() const {\n\treturn \"mmx.contract.WebData\";\n}\n\nconst vnx::TypeCode* WebData::get_type_code() const {\n\treturn mmx::contract::vnx_native_type_code_WebData;\n}\n\nstd::shared_ptr<WebData> WebData::create() {\n\treturn std::make_shared<WebData>();\n}\n\nstd::shared_ptr<vnx::Value> WebData::clone() const {\n\treturn std::make_shared<WebData>(*this);\n}\n\nvoid WebData::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid WebData::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid WebData::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::contract::vnx_native_type_code_WebData;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, mime_type);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, payload);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid WebData::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.contract.WebData\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"mime_type\\\": \"; vnx::write(_out, mime_type);\n\t_out << \", \\\"payload\\\": \"; vnx::write(_out, payload);\n\t_out << \"}\";\n}\n\nvoid WebData::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object WebData::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.contract.WebData\";\n\t_object[\"version\"] = version;\n\t_object[\"mime_type\"] = mime_type;\n\t_object[\"payload\"] = payload;\n\treturn _object;\n}\n\nvoid WebData::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"mime_type\") {\n\t\t\t_entry.second.to(mime_type);\n\t\t} else if(_entry.first == \"payload\") {\n\t\t\t_entry.second.to(payload);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant WebData::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"mime_type\") {\n\t\treturn vnx::Variant(mime_type);\n\t}\n\tif(_name == \"payload\") {\n\t\treturn vnx::Variant(payload);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid WebData::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"mime_type\") {\n\t\t_value.to(mime_type);\n\t} else if(_name == \"payload\") {\n\t\t_value.to(payload);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const WebData& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, WebData& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* WebData::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> WebData::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.contract.WebData\";\n\ttype_code->type_hash = vnx::Hash64(0xf7c226b211c088c4ull);\n\ttype_code->code_hash = vnx::Hash64(0x1f49299db4776797ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::contract::WebData);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::Contract::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<WebData>(); };\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"mime_type\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"payload\";\n\t\tfield.code = {12, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> WebData::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::contract::WebData& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.mime_type, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.payload, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::contract::WebData& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::contract::vnx_native_type_code_WebData;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::contract::WebData>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write(out, value.mime_type, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.payload, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::contract::WebData& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::contract::WebData& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::contract::WebData& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/contract/src/method_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/contract/package.hxx>\n#include <mmx/contract/method_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace contract {\n\n\nconst vnx::Hash64 method_t::VNX_TYPE_HASH(0x1f62512698176a39ull);\nconst vnx::Hash64 method_t::VNX_CODE_HASH(0xf70ca6386623ddb6ull);\n\nvnx::Hash64 method_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string method_t::get_type_name() const {\n\treturn \"mmx.contract.method_t\";\n}\n\nconst vnx::TypeCode* method_t::get_type_code() const {\n\treturn mmx::contract::vnx_native_type_code_method_t;\n}\n\nstd::shared_ptr<method_t> method_t::create() {\n\treturn std::make_shared<method_t>();\n}\n\nstd::shared_ptr<method_t> method_t::clone() const {\n\treturn std::make_shared<method_t>(*this);\n}\n\nvoid method_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid method_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid method_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::contract::vnx_native_type_code_method_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, info);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, is_init);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, is_const);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, is_public);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, is_payable);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, entry_point);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, args);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid method_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"info\\\": \"; vnx::write(_out, info);\n\t_out << \", \\\"is_init\\\": \"; vnx::write(_out, is_init);\n\t_out << \", \\\"is_const\\\": \"; vnx::write(_out, is_const);\n\t_out << \", \\\"is_public\\\": \"; vnx::write(_out, is_public);\n\t_out << \", \\\"is_payable\\\": \"; vnx::write(_out, is_payable);\n\t_out << \", \\\"entry_point\\\": \"; vnx::write(_out, entry_point);\n\t_out << \", \\\"args\\\": \"; vnx::write(_out, args);\n\t_out << \"}\";\n}\n\nvoid method_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object method_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.contract.method_t\";\n\t_object[\"name\"] = name;\n\t_object[\"info\"] = info;\n\t_object[\"is_init\"] = is_init;\n\t_object[\"is_const\"] = is_const;\n\t_object[\"is_public\"] = is_public;\n\t_object[\"is_payable\"] = is_payable;\n\t_object[\"entry_point\"] = entry_point;\n\t_object[\"args\"] = args;\n\treturn _object;\n}\n\nvoid method_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"args\") {\n\t\t\t_entry.second.to(args);\n\t\t} else if(_entry.first == \"entry_point\") {\n\t\t\t_entry.second.to(entry_point);\n\t\t} else if(_entry.first == \"info\") {\n\t\t\t_entry.second.to(info);\n\t\t} else if(_entry.first == \"is_const\") {\n\t\t\t_entry.second.to(is_const);\n\t\t} else if(_entry.first == \"is_init\") {\n\t\t\t_entry.second.to(is_init);\n\t\t} else if(_entry.first == \"is_payable\") {\n\t\t\t_entry.second.to(is_payable);\n\t\t} else if(_entry.first == \"is_public\") {\n\t\t\t_entry.second.to(is_public);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t}\n\t}\n}\n\nvnx::Variant method_t::get_field(const std::string& _name) const {\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"info\") {\n\t\treturn vnx::Variant(info);\n\t}\n\tif(_name == \"is_init\") {\n\t\treturn vnx::Variant(is_init);\n\t}\n\tif(_name == \"is_const\") {\n\t\treturn vnx::Variant(is_const);\n\t}\n\tif(_name == \"is_public\") {\n\t\treturn vnx::Variant(is_public);\n\t}\n\tif(_name == \"is_payable\") {\n\t\treturn vnx::Variant(is_payable);\n\t}\n\tif(_name == \"entry_point\") {\n\t\treturn vnx::Variant(entry_point);\n\t}\n\tif(_name == \"args\") {\n\t\treturn vnx::Variant(args);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid method_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"info\") {\n\t\t_value.to(info);\n\t} else if(_name == \"is_init\") {\n\t\t_value.to(is_init);\n\t} else if(_name == \"is_const\") {\n\t\t_value.to(is_const);\n\t} else if(_name == \"is_public\") {\n\t\t_value.to(is_public);\n\t} else if(_name == \"is_payable\") {\n\t\t_value.to(is_payable);\n\t} else if(_name == \"entry_point\") {\n\t\t_value.to(entry_point);\n\t} else if(_name == \"args\") {\n\t\t_value.to(args);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const method_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, method_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* method_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> method_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.contract.method_t\";\n\ttype_code->type_hash = vnx::Hash64(0x1f62512698176a39ull);\n\ttype_code->code_hash = vnx::Hash64(0xf70ca6386623ddb6ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::contract::method_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<method_t>>(); };\n\ttype_code->fields.resize(8);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"info\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_init\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_const\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_public\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_payable\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"entry_point\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"args\";\n\t\tfield.code = {12, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n} // namespace contract\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::contract::method_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_init, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_const, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_public, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_payable, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.entry_point, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.info, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.args, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::contract::method_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::contract::vnx_native_type_code_method_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::contract::method_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.is_init);\n\tvnx::write_value(_buf + 1, value.is_const);\n\tvnx::write_value(_buf + 2, value.is_public);\n\tvnx::write_value(_buf + 3, value.is_payable);\n\tvnx::write_value(_buf + 4, value.entry_point);\n\tvnx::write(out, value.name, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.info, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.args, type_code, type_code->fields[7].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::contract::method_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::contract::method_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::contract::method_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::contract::method_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::contract::method_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/contract/src/package.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/contract/Binary.hxx>\n#include <mmx/contract/Data.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/contract/MultiSig.hxx>\n#include <mmx/contract/PubKey.hxx>\n#include <mmx/contract/TokenBase.hxx>\n#include <mmx/contract/WebData.hxx>\n#include <mmx/contract/method_t.hxx>\n\n#include <mmx/contract/package.hxx>\n#include <vnx/vnx.h>\n\n\n\nnamespace vnx {\n\nconst TypeCode* type<::mmx::contract::Binary>::get_type_code() {\n\treturn mmx::contract::vnx_native_type_code_Binary;\n}\n\nvoid type<::mmx::contract::Binary>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::contract::Binary());\n}\n\nvoid type<::mmx::contract::Binary>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::Binary& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::contract::Data>::get_type_code() {\n\treturn mmx::contract::vnx_native_type_code_Data;\n}\n\nvoid type<::mmx::contract::Data>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::contract::Data());\n}\n\nvoid type<::mmx::contract::Data>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::Data& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::contract::Executable>::get_type_code() {\n\treturn mmx::contract::vnx_native_type_code_Executable;\n}\n\nvoid type<::mmx::contract::Executable>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::contract::Executable());\n}\n\nvoid type<::mmx::contract::Executable>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::Executable& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::contract::MultiSig>::get_type_code() {\n\treturn mmx::contract::vnx_native_type_code_MultiSig;\n}\n\nvoid type<::mmx::contract::MultiSig>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::contract::MultiSig());\n}\n\nvoid type<::mmx::contract::MultiSig>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::MultiSig& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::contract::PubKey>::get_type_code() {\n\treturn mmx::contract::vnx_native_type_code_PubKey;\n}\n\nvoid type<::mmx::contract::PubKey>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::contract::PubKey());\n}\n\nvoid type<::mmx::contract::PubKey>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::PubKey& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::contract::TokenBase>::get_type_code() {\n\treturn mmx::contract::vnx_native_type_code_TokenBase;\n}\n\nvoid type<::mmx::contract::TokenBase>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::contract::TokenBase());\n}\n\nvoid type<::mmx::contract::TokenBase>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::TokenBase& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::contract::WebData>::get_type_code() {\n\treturn mmx::contract::vnx_native_type_code_WebData;\n}\n\nvoid type<::mmx::contract::WebData>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::contract::WebData());\n}\n\nvoid type<::mmx::contract::WebData>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::WebData& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::contract::method_t>::get_type_code() {\n\treturn mmx::contract::vnx_native_type_code_method_t;\n}\n\nvoid type<::mmx::contract::method_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::contract::method_t());\n}\n\nvoid type<::mmx::contract::method_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::contract::method_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\n\n} // namespace vnx\n\n\nnamespace mmx {\nnamespace contract {\n\n\nvoid register_all_types() {\n\tvnx::register_type_code(::mmx::contract::Binary::static_create_type_code());\n\tvnx::register_type_code(::mmx::contract::Data::static_create_type_code());\n\tvnx::register_type_code(::mmx::contract::Executable::static_create_type_code());\n\tvnx::register_type_code(::mmx::contract::MultiSig::static_create_type_code());\n\tvnx::register_type_code(::mmx::contract::PubKey::static_create_type_code());\n\tvnx::register_type_code(::mmx::contract::TokenBase::static_create_type_code());\n\tvnx::register_type_code(::mmx::contract::WebData::static_create_type_code());\n\tvnx::register_type_code(::mmx::contract::method_t::static_create_type_code());\n}\n\nstatic struct vnx_static_init {\n\tvnx_static_init() {\n\t\tregister_all_types();\n\t}\n} vnx_static_init_;\n\nconst vnx::TypeCode* const vnx_native_type_code_Binary = vnx::get_type_code(vnx::Hash64(0xbbeba47fc8b740e5ull));\nconst vnx::TypeCode* const vnx_native_type_code_Data = vnx::get_type_code(vnx::Hash64(0xadfeee3822244f50ull));\nconst vnx::TypeCode* const vnx_native_type_code_Executable = vnx::get_type_code(vnx::Hash64(0xfa6a3ac9103ebb12ull));\nconst vnx::TypeCode* const vnx_native_type_code_MultiSig = vnx::get_type_code(vnx::Hash64(0x7d674c5f7297dedull));\nconst vnx::TypeCode* const vnx_native_type_code_PubKey = vnx::get_type_code(vnx::Hash64(0x9b3cd508d7f41423ull));\nconst vnx::TypeCode* const vnx_native_type_code_TokenBase = vnx::get_type_code(vnx::Hash64(0x5aeed4c96d232b5eull));\nconst vnx::TypeCode* const vnx_native_type_code_WebData = vnx::get_type_code(vnx::Hash64(0xf7c226b211c088c4ull));\nconst vnx::TypeCode* const vnx_native_type_code_method_t = vnx::get_type_code(vnx::Hash64(0x1f62512698176a39ull));\n\n} // namespace mmx\n} // namespace contract\n"
  },
  {
    "path": "generated/include/mmx/Block.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Block_HXX_\n#define INCLUDE_mmx_Block_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/txio_entry_t.hxx>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Block : public ::mmx::BlockHeader {\npublic:\n\t\n\tstd::vector<std::shared_ptr<const ::mmx::Transaction>> tx_list;\n\t\n\ttypedef ::mmx::BlockHeader Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x94965d816d328467ull;\n\t\n\tBlock() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual void finalize();\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_tx_hash() const;\n\tvirtual std::shared_ptr<const ::mmx::BlockHeader> get_header() const override;\n\tvirtual std::vector<std::shared_ptr<const ::mmx::Transaction>> get_transactions() const;\n\tvirtual std::vector<::mmx::txio_entry_t> get_inputs(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const;\n\tvirtual std::vector<::mmx::txio_entry_t> get_outputs(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const;\n\t\n\tstatic std::shared_ptr<Block> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Block& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Block& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Block::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Block>(41);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"support_flags\", 1); _visitor.accept(support_flags);\n\t_visitor.type_field(\"hash\", 2); _visitor.accept(hash);\n\t_visitor.type_field(\"prev\", 3); _visitor.accept(prev);\n\t_visitor.type_field(\"height\", 4); _visitor.accept(height);\n\t_visitor.type_field(\"vdf_height\", 5); _visitor.accept(vdf_height);\n\t_visitor.type_field(\"nonce\", 6); _visitor.accept(nonce);\n\t_visitor.type_field(\"time_stamp\", 7); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"time_diff\", 8); _visitor.accept(time_diff);\n\t_visitor.type_field(\"space_diff\", 9); _visitor.accept(space_diff);\n\t_visitor.type_field(\"weight\", 10); _visitor.accept(weight);\n\t_visitor.type_field(\"total_weight\", 11); _visitor.accept(total_weight);\n\t_visitor.type_field(\"vdf_count\", 12); _visitor.accept(vdf_count);\n\t_visitor.type_field(\"vdf_iters\", 13); _visitor.accept(vdf_iters);\n\t_visitor.type_field(\"vdf_output\", 14); _visitor.accept(vdf_output);\n\t_visitor.type_field(\"vdf_reward_addr\", 15); _visitor.accept(vdf_reward_addr);\n\t_visitor.type_field(\"vdf_reward_payout\", 16); _visitor.accept(vdf_reward_payout);\n\t_visitor.type_field(\"proof\", 17); _visitor.accept(proof);\n\t_visitor.type_field(\"proof_hash\", 18); _visitor.accept(proof_hash);\n\t_visitor.type_field(\"challenge\", 19); _visitor.accept(challenge);\n\t_visitor.type_field(\"is_space_fork\", 20); _visitor.accept(is_space_fork);\n\t_visitor.type_field(\"space_fork_len\", 21); _visitor.accept(space_fork_len);\n\t_visitor.type_field(\"space_fork_proofs\", 22); _visitor.accept(space_fork_proofs);\n\t_visitor.type_field(\"reward_amount\", 23); _visitor.accept(reward_amount);\n\t_visitor.type_field(\"reward_addr\", 24); _visitor.accept(reward_addr);\n\t_visitor.type_field(\"reward_contract\", 25); _visitor.accept(reward_contract);\n\t_visitor.type_field(\"reward_account\", 26); _visitor.accept(reward_account);\n\t_visitor.type_field(\"reward_vote\", 27); _visitor.accept(reward_vote);\n\t_visitor.type_field(\"reward_vote_sum\", 28); _visitor.accept(reward_vote_sum);\n\t_visitor.type_field(\"reward_vote_count\", 29); _visitor.accept(reward_vote_count);\n\t_visitor.type_field(\"base_reward\", 30); _visitor.accept(base_reward);\n\t_visitor.type_field(\"project_addr\", 31); _visitor.accept(project_addr);\n\t_visitor.type_field(\"static_cost\", 32); _visitor.accept(static_cost);\n\t_visitor.type_field(\"total_cost\", 33); _visitor.accept(total_cost);\n\t_visitor.type_field(\"tx_count\", 34); _visitor.accept(tx_count);\n\t_visitor.type_field(\"tx_fees\", 35); _visitor.accept(tx_fees);\n\t_visitor.type_field(\"txfee_buffer\", 36); _visitor.accept(txfee_buffer);\n\t_visitor.type_field(\"tx_hash\", 37); _visitor.accept(tx_hash);\n\t_visitor.type_field(\"farmer_sig\", 38); _visitor.accept(farmer_sig);\n\t_visitor.type_field(\"content_hash\", 39); _visitor.accept(content_hash);\n\t_visitor.type_field(\"tx_list\", 40); _visitor.accept(tx_list);\n\t_visitor.template type_end<Block>(41);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Block_HXX_\n"
  },
  {
    "path": "generated/include/mmx/BlockHeader.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_BlockHeader_HXX_\n#define INCLUDE_mmx_BlockHeader_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/block_index_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT BlockHeader : public ::vnx::Value {\npublic:\n\tstatic const uint32_t SUPPORT_HARDFORK1 = 0x1;\n\t\n\tuint32_t version = 0;\n\tuint32_t support_flags = 0;\n\t::mmx::hash_t hash;\n\t::mmx::hash_t prev;\n\tuint32_t height = 0;\n\tuint32_t vdf_height = 0;\n\tuint64_t nonce = 0;\n\tint64_t time_stamp = 0;\n\tuint64_t time_diff = 0;\n\tuint64_t space_diff = 0;\n\t::mmx::uint128 weight;\n\t::mmx::uint128 total_weight;\n\tuint32_t vdf_count = 0;\n\tuint64_t vdf_iters = 0;\n\t::mmx::hash_t vdf_output;\n\tstd::vector<::mmx::addr_t> vdf_reward_addr;\n\tvnx::optional<::mmx::addr_t> vdf_reward_payout;\n\tstd::vector<std::shared_ptr<const ::mmx::ProofOfSpace>> proof;\n\t::mmx::hash_t proof_hash;\n\t::mmx::hash_t challenge;\n\tvnx::bool_t is_space_fork = 0;\n\tuint32_t space_fork_len = 0;\n\tuint32_t space_fork_proofs = 0;\n\tuint64_t reward_amount = 0;\n\tvnx::optional<::mmx::addr_t> reward_addr;\n\tvnx::optional<::mmx::addr_t> reward_contract;\n\tvnx::optional<::mmx::addr_t> reward_account;\n\tint8_t reward_vote = 0;\n\tint32_t reward_vote_sum = 0;\n\tuint32_t reward_vote_count = 0;\n\tuint64_t base_reward = 0;\n\t::mmx::addr_t project_addr;\n\tuint64_t static_cost = 0;\n\tuint64_t total_cost = 0;\n\tuint32_t tx_count = 0;\n\tuint64_t tx_fees = 0;\n\tuint64_t txfee_buffer = 0;\n\t::mmx::hash_t tx_hash;\n\tvnx::optional<::mmx::signature_t> farmer_sig;\n\t::mmx::hash_t content_hash;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xcaae941a2fc712a6ull;\n\t\n\tBlockHeader() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const;\n\tvirtual ::mmx::hash_t calc_hash() const;\n\tvirtual ::mmx::hash_t calc_content_hash() const;\n\tvirtual void validate() const;\n\tvirtual std::shared_ptr<const ::mmx::BlockHeader> get_header() const;\n\tvirtual ::mmx::pubkey_t get_farmer_key() const;\n\tvirtual ::mmx::block_index_t get_block_index(const int64_t& file_offset = 0) const;\n\tvirtual void set_space_diff(std::shared_ptr<const ::mmx::ChainParams> params = nullptr, std::shared_ptr<const ::mmx::BlockHeader> prev = nullptr);\n\tvirtual void set_base_reward(std::shared_ptr<const ::mmx::ChainParams> params = nullptr, std::shared_ptr<const ::mmx::BlockHeader> prev = nullptr);\n\t\n\tstatic std::shared_ptr<BlockHeader> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const BlockHeader& _value);\n\tfriend std::istream& operator>>(std::istream& _in, BlockHeader& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid BlockHeader::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<BlockHeader>(40);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"support_flags\", 1); _visitor.accept(support_flags);\n\t_visitor.type_field(\"hash\", 2); _visitor.accept(hash);\n\t_visitor.type_field(\"prev\", 3); _visitor.accept(prev);\n\t_visitor.type_field(\"height\", 4); _visitor.accept(height);\n\t_visitor.type_field(\"vdf_height\", 5); _visitor.accept(vdf_height);\n\t_visitor.type_field(\"nonce\", 6); _visitor.accept(nonce);\n\t_visitor.type_field(\"time_stamp\", 7); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"time_diff\", 8); _visitor.accept(time_diff);\n\t_visitor.type_field(\"space_diff\", 9); _visitor.accept(space_diff);\n\t_visitor.type_field(\"weight\", 10); _visitor.accept(weight);\n\t_visitor.type_field(\"total_weight\", 11); _visitor.accept(total_weight);\n\t_visitor.type_field(\"vdf_count\", 12); _visitor.accept(vdf_count);\n\t_visitor.type_field(\"vdf_iters\", 13); _visitor.accept(vdf_iters);\n\t_visitor.type_field(\"vdf_output\", 14); _visitor.accept(vdf_output);\n\t_visitor.type_field(\"vdf_reward_addr\", 15); _visitor.accept(vdf_reward_addr);\n\t_visitor.type_field(\"vdf_reward_payout\", 16); _visitor.accept(vdf_reward_payout);\n\t_visitor.type_field(\"proof\", 17); _visitor.accept(proof);\n\t_visitor.type_field(\"proof_hash\", 18); _visitor.accept(proof_hash);\n\t_visitor.type_field(\"challenge\", 19); _visitor.accept(challenge);\n\t_visitor.type_field(\"is_space_fork\", 20); _visitor.accept(is_space_fork);\n\t_visitor.type_field(\"space_fork_len\", 21); _visitor.accept(space_fork_len);\n\t_visitor.type_field(\"space_fork_proofs\", 22); _visitor.accept(space_fork_proofs);\n\t_visitor.type_field(\"reward_amount\", 23); _visitor.accept(reward_amount);\n\t_visitor.type_field(\"reward_addr\", 24); _visitor.accept(reward_addr);\n\t_visitor.type_field(\"reward_contract\", 25); _visitor.accept(reward_contract);\n\t_visitor.type_field(\"reward_account\", 26); _visitor.accept(reward_account);\n\t_visitor.type_field(\"reward_vote\", 27); _visitor.accept(reward_vote);\n\t_visitor.type_field(\"reward_vote_sum\", 28); _visitor.accept(reward_vote_sum);\n\t_visitor.type_field(\"reward_vote_count\", 29); _visitor.accept(reward_vote_count);\n\t_visitor.type_field(\"base_reward\", 30); _visitor.accept(base_reward);\n\t_visitor.type_field(\"project_addr\", 31); _visitor.accept(project_addr);\n\t_visitor.type_field(\"static_cost\", 32); _visitor.accept(static_cost);\n\t_visitor.type_field(\"total_cost\", 33); _visitor.accept(total_cost);\n\t_visitor.type_field(\"tx_count\", 34); _visitor.accept(tx_count);\n\t_visitor.type_field(\"tx_fees\", 35); _visitor.accept(tx_fees);\n\t_visitor.type_field(\"txfee_buffer\", 36); _visitor.accept(txfee_buffer);\n\t_visitor.type_field(\"tx_hash\", 37); _visitor.accept(tx_hash);\n\t_visitor.type_field(\"farmer_sig\", 38); _visitor.accept(farmer_sig);\n\t_visitor.type_field(\"content_hash\", 39); _visitor.accept(content_hash);\n\t_visitor.template type_end<BlockHeader>(40);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_BlockHeader_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ChainParams.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ChainParams_HXX_\n#define INCLUDE_mmx_ChainParams_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint_fraction_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT ChainParams : public ::vnx::Value {\npublic:\n\t\n\tuint32_t port = 0;\n\tint32_t decimals = 6;\n\tuint32_t min_ksize = 29;\n\tuint32_t max_ksize = 32;\n\tuint32_t plot_filter = 4;\n\tuint32_t post_filter = 10;\n\tuint32_t commit_delay = 18;\n\tuint32_t infuse_delay = 6;\n\tuint32_t challenge_delay = 9;\n\tuint32_t challenge_interval = 48;\n\tuint32_t max_diff_adjust = 10;\n\tuint32_t max_vdf_count = 100;\n\tuint32_t avg_proof_count = 3;\n\tuint32_t max_proof_count = 50;\n\tuint32_t max_validators = 11;\n\tuint64_t min_reward = 200000;\n\tuint64_t vdf_reward = 500000;\n\tuint32_t vdf_reward_interval = 50;\n\tuint32_t vdf_segment_size = 50000;\n\tuint32_t reward_adjust_div = 100;\n\tuint32_t reward_adjust_tick = 10000;\n\tuint32_t reward_adjust_interval = 8640;\n\tuint32_t target_mmx_gold_price = 2000;\n\tuint64_t time_diff_divider = 1000;\n\tuint64_t time_diff_constant = 1000000;\n\tuint64_t space_diff_constant = 100000000;\n\tuint64_t initial_time_diff = 50;\n\tuint64_t initial_space_diff = 10;\n\tuint64_t initial_time_stamp = 0;\n\tuint64_t min_txfee = 100;\n\tuint64_t min_txfee_io = 100;\n\tuint64_t min_txfee_sign = 1000;\n\tuint64_t min_txfee_memo = 50;\n\tuint64_t min_txfee_exec = 10000;\n\tuint64_t min_txfee_deploy = 100000;\n\tuint64_t min_txfee_depend = 50000;\n\tuint64_t min_txfee_byte = 10;\n\tuint64_t min_txfee_read = 1000;\n\tuint64_t min_txfee_read_kbyte = 1000;\n\tuint64_t max_block_size = 10000000;\n\tuint64_t max_block_cost = 100000000;\n\tuint64_t max_tx_cost = 1000000;\n\tuint32_t max_rcall_depth = 3;\n\tuint32_t max_rcall_width = 10;\n\tstd::vector<uint32_t> min_fee_ratio;\n\tint64_t block_interval_ms = 10000;\n\tstd::string network;\n\t::mmx::addr_t nft_binary;\n\t::mmx::addr_t swap_binary;\n\t::mmx::addr_t offer_binary;\n\t::mmx::addr_t token_binary;\n\t::mmx::addr_t plot_nft_binary;\n\t::mmx::addr_t escrow_binary;\n\t::mmx::addr_t time_lock_binary;\n\t::mmx::addr_t relay_binary;\n\tuint64_t fixed_project_reward = 50000;\n\t::mmx::uint_fraction_t project_ratio;\n\tuint32_t reward_activation = 50000;\n\tuint32_t transaction_activation = 100000;\n\tuint32_t hardfork1_height = 1000000;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x51bba8d28881e8e7ull;\n\t\n\tChainParams() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::float64_t get_block_time() const;\n\t\n\tstatic std::shared_ptr<ChainParams> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ChainParams& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ChainParams& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid ChainParams::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ChainParams>(60);\n\t_visitor.type_field(\"port\", 0); _visitor.accept(port);\n\t_visitor.type_field(\"decimals\", 1); _visitor.accept(decimals);\n\t_visitor.type_field(\"min_ksize\", 2); _visitor.accept(min_ksize);\n\t_visitor.type_field(\"max_ksize\", 3); _visitor.accept(max_ksize);\n\t_visitor.type_field(\"plot_filter\", 4); _visitor.accept(plot_filter);\n\t_visitor.type_field(\"post_filter\", 5); _visitor.accept(post_filter);\n\t_visitor.type_field(\"commit_delay\", 6); _visitor.accept(commit_delay);\n\t_visitor.type_field(\"infuse_delay\", 7); _visitor.accept(infuse_delay);\n\t_visitor.type_field(\"challenge_delay\", 8); _visitor.accept(challenge_delay);\n\t_visitor.type_field(\"challenge_interval\", 9); _visitor.accept(challenge_interval);\n\t_visitor.type_field(\"max_diff_adjust\", 10); _visitor.accept(max_diff_adjust);\n\t_visitor.type_field(\"max_vdf_count\", 11); _visitor.accept(max_vdf_count);\n\t_visitor.type_field(\"avg_proof_count\", 12); _visitor.accept(avg_proof_count);\n\t_visitor.type_field(\"max_proof_count\", 13); _visitor.accept(max_proof_count);\n\t_visitor.type_field(\"max_validators\", 14); _visitor.accept(max_validators);\n\t_visitor.type_field(\"min_reward\", 15); _visitor.accept(min_reward);\n\t_visitor.type_field(\"vdf_reward\", 16); _visitor.accept(vdf_reward);\n\t_visitor.type_field(\"vdf_reward_interval\", 17); _visitor.accept(vdf_reward_interval);\n\t_visitor.type_field(\"vdf_segment_size\", 18); _visitor.accept(vdf_segment_size);\n\t_visitor.type_field(\"reward_adjust_div\", 19); _visitor.accept(reward_adjust_div);\n\t_visitor.type_field(\"reward_adjust_tick\", 20); _visitor.accept(reward_adjust_tick);\n\t_visitor.type_field(\"reward_adjust_interval\", 21); _visitor.accept(reward_adjust_interval);\n\t_visitor.type_field(\"target_mmx_gold_price\", 22); _visitor.accept(target_mmx_gold_price);\n\t_visitor.type_field(\"time_diff_divider\", 23); _visitor.accept(time_diff_divider);\n\t_visitor.type_field(\"time_diff_constant\", 24); _visitor.accept(time_diff_constant);\n\t_visitor.type_field(\"space_diff_constant\", 25); _visitor.accept(space_diff_constant);\n\t_visitor.type_field(\"initial_time_diff\", 26); _visitor.accept(initial_time_diff);\n\t_visitor.type_field(\"initial_space_diff\", 27); _visitor.accept(initial_space_diff);\n\t_visitor.type_field(\"initial_time_stamp\", 28); _visitor.accept(initial_time_stamp);\n\t_visitor.type_field(\"min_txfee\", 29); _visitor.accept(min_txfee);\n\t_visitor.type_field(\"min_txfee_io\", 30); _visitor.accept(min_txfee_io);\n\t_visitor.type_field(\"min_txfee_sign\", 31); _visitor.accept(min_txfee_sign);\n\t_visitor.type_field(\"min_txfee_memo\", 32); _visitor.accept(min_txfee_memo);\n\t_visitor.type_field(\"min_txfee_exec\", 33); _visitor.accept(min_txfee_exec);\n\t_visitor.type_field(\"min_txfee_deploy\", 34); _visitor.accept(min_txfee_deploy);\n\t_visitor.type_field(\"min_txfee_depend\", 35); _visitor.accept(min_txfee_depend);\n\t_visitor.type_field(\"min_txfee_byte\", 36); _visitor.accept(min_txfee_byte);\n\t_visitor.type_field(\"min_txfee_read\", 37); _visitor.accept(min_txfee_read);\n\t_visitor.type_field(\"min_txfee_read_kbyte\", 38); _visitor.accept(min_txfee_read_kbyte);\n\t_visitor.type_field(\"max_block_size\", 39); _visitor.accept(max_block_size);\n\t_visitor.type_field(\"max_block_cost\", 40); _visitor.accept(max_block_cost);\n\t_visitor.type_field(\"max_tx_cost\", 41); _visitor.accept(max_tx_cost);\n\t_visitor.type_field(\"max_rcall_depth\", 42); _visitor.accept(max_rcall_depth);\n\t_visitor.type_field(\"max_rcall_width\", 43); _visitor.accept(max_rcall_width);\n\t_visitor.type_field(\"min_fee_ratio\", 44); _visitor.accept(min_fee_ratio);\n\t_visitor.type_field(\"block_interval_ms\", 45); _visitor.accept(block_interval_ms);\n\t_visitor.type_field(\"network\", 46); _visitor.accept(network);\n\t_visitor.type_field(\"nft_binary\", 47); _visitor.accept(nft_binary);\n\t_visitor.type_field(\"swap_binary\", 48); _visitor.accept(swap_binary);\n\t_visitor.type_field(\"offer_binary\", 49); _visitor.accept(offer_binary);\n\t_visitor.type_field(\"token_binary\", 50); _visitor.accept(token_binary);\n\t_visitor.type_field(\"plot_nft_binary\", 51); _visitor.accept(plot_nft_binary);\n\t_visitor.type_field(\"escrow_binary\", 52); _visitor.accept(escrow_binary);\n\t_visitor.type_field(\"time_lock_binary\", 53); _visitor.accept(time_lock_binary);\n\t_visitor.type_field(\"relay_binary\", 54); _visitor.accept(relay_binary);\n\t_visitor.type_field(\"fixed_project_reward\", 55); _visitor.accept(fixed_project_reward);\n\t_visitor.type_field(\"project_ratio\", 56); _visitor.accept(project_ratio);\n\t_visitor.type_field(\"reward_activation\", 57); _visitor.accept(reward_activation);\n\t_visitor.type_field(\"transaction_activation\", 58); _visitor.accept(transaction_activation);\n\t_visitor.type_field(\"hardfork1_height\", 59); _visitor.accept(hardfork1_height);\n\t_visitor.template type_end<ChainParams>(60);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_ChainParams_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Challenge.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Challenge_HXX_\n#define INCLUDE_mmx_Challenge_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Challenge : public ::vnx::Value {\npublic:\n\t\n\tuint32_t vdf_height = 0;\n\t::mmx::hash_t challenge;\n\tuint64_t difficulty = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4bf49f8022405249ull;\n\t\n\tChallenge() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Challenge> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Challenge& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Challenge& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Challenge::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Challenge>(3);\n\t_visitor.type_field(\"vdf_height\", 0); _visitor.accept(vdf_height);\n\t_visitor.type_field(\"challenge\", 1); _visitor.accept(challenge);\n\t_visitor.type_field(\"difficulty\", 2); _visitor.accept(difficulty);\n\t_visitor.template type_end<Challenge>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Challenge_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Contract.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Contract_HXX_\n#define INCLUDE_mmx_Contract_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Contract : public ::vnx::Value {\npublic:\n\t\n\tuint32_t version = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x26b896ae8c415285ull;\n\t\n\tContract() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = 0) const;\n\tvirtual uint64_t num_bytes() const;\n\tvirtual uint64_t calc_cost(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const;\n\tvirtual vnx::optional<::mmx::addr_t> get_owner() const;\n\tvirtual void validate(std::shared_ptr<const ::mmx::Solution> solution = nullptr, const ::mmx::hash_t& txid = ::mmx::hash_t()) const;\n\tvirtual ::vnx::Variant read_field(const std::string& name = \"\") const;\n\t\n\tstatic std::shared_ptr<Contract> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Contract& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Contract& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Contract::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Contract>(1);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.template type_end<Contract>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Contract_HXX_\n"
  },
  {
    "path": "generated/include/mmx/FarmInfo.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_FarmInfo_HXX_\n#define INCLUDE_mmx_FarmInfo_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/pooling_info_t.hxx>\n#include <mmx/pooling_stats_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT FarmInfo : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::string> plot_dirs;\n\tstd::map<uint8_t, uint32_t> plot_count;\n\tstd::map<std::string, std::pair<uint64_t, uint64_t>> harvester_bytes;\n\tstd::map<::mmx::addr_t, ::mmx::pooling_info_t> pool_info;\n\tstd::map<::mmx::addr_t, ::mmx::pooling_stats_t> pool_stats;\n\tuint64_t total_bytes = 0;\n\tuint64_t total_bytes_effective = 0;\n\tuint64_t total_balance = 0;\n\tvnx::optional<std::string> harvester;\n\tvnx::optional<::mmx::hash_t> harvester_id;\n\tvnx::optional<::mmx::addr_t> reward_addr;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xa2701372b9137f0eull;\n\t\n\tFarmInfo() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<FarmInfo> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const FarmInfo& _value);\n\tfriend std::istream& operator>>(std::istream& _in, FarmInfo& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid FarmInfo::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<FarmInfo>(11);\n\t_visitor.type_field(\"plot_dirs\", 0); _visitor.accept(plot_dirs);\n\t_visitor.type_field(\"plot_count\", 1); _visitor.accept(plot_count);\n\t_visitor.type_field(\"harvester_bytes\", 2); _visitor.accept(harvester_bytes);\n\t_visitor.type_field(\"pool_info\", 3); _visitor.accept(pool_info);\n\t_visitor.type_field(\"pool_stats\", 4); _visitor.accept(pool_stats);\n\t_visitor.type_field(\"total_bytes\", 5); _visitor.accept(total_bytes);\n\t_visitor.type_field(\"total_bytes_effective\", 6); _visitor.accept(total_bytes_effective);\n\t_visitor.type_field(\"total_balance\", 7); _visitor.accept(total_balance);\n\t_visitor.type_field(\"harvester\", 8); _visitor.accept(harvester);\n\t_visitor.type_field(\"harvester_id\", 9); _visitor.accept(harvester_id);\n\t_visitor.type_field(\"reward_addr\", 10); _visitor.accept(reward_addr);\n\t_visitor.template type_end<FarmInfo>(11);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_FarmInfo_HXX_\n"
  },
  {
    "path": "generated/include/mmx/FarmerAsyncClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_ASYNC_CLIENT_HXX_\n#define INCLUDE_mmx_Farmer_ASYNC_CLIENT_HXX_\n\n#include <vnx/AsyncClient.h>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Hash64.hpp>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n\n\nnamespace mmx {\n\nclass FarmerAsyncClient : public vnx::AsyncClient {\npublic:\n\tFarmerAsyncClient(const std::string& service_name);\n\t\n\tFarmerAsyncClient(vnx::Hash64 service_addr);\n\t\n\tuint64_t get_mac_addr(\n\t\t\tconst std::function<void(const ::vnx::Hash64&)>& _callback = std::function<void(const ::vnx::Hash64&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_partial_diff(const ::mmx::addr_t& plot_nft = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const uint64_t&)>& _callback = std::function<void(const uint64_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_partial_diffs(const std::vector<::mmx::addr_t>& plot_nfts = {}, \n\t\t\tconst std::function<void(const std::map<::mmx::addr_t, uint64_t>&)>& _callback = std::function<void(const std::map<::mmx::addr_t, uint64_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_farmer_keys(\n\t\t\tconst std::function<void(const std::vector<::mmx::pubkey_t>&)>& _callback = std::function<void(const std::vector<::mmx::pubkey_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_farm_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::FarmInfo>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::FarmInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t sign_block(std::shared_ptr<const ::mmx::BlockHeader> block = nullptr, \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t sign_vote(std::shared_ptr<const ::mmx::ValidatorVote> vote = nullptr, \n\t\t\tconst std::function<void(const ::mmx::signature_t&)>& _callback = std::function<void(const ::mmx::signature_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config_object(\n\t\t\tconst std::function<void(const ::vnx::Object&)>& _callback = std::function<void(const ::vnx::Object&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config(const std::string& name = \"\", \n\t\t\tconst std::function<void(const ::vnx::Variant&)>& _callback = std::function<void(const ::vnx::Variant&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_type_code(\n\t\t\tconst std::function<void(const ::vnx::TypeCode&)>& _callback = std::function<void(const ::vnx::TypeCode&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_module_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_restart(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_stop(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_self_test(\n\t\t\tconst std::function<void(const vnx::bool_t&)>& _callback = std::function<void(const vnx::bool_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\nprotected:\n\tint32_t vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) override;\n\t\n\tint32_t vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) override;\n\t\nprivate:\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Hash64&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_mac_addr;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const uint64_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_partial_diff;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::addr_t, uint64_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_partial_diffs;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::pubkey_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_farmer_keys;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::FarmInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_farm_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>, std::function<void(const vnx::exception&)>>> vnx_queue_sign_block;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::signature_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_sign_vote;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Object&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Variant&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::TypeCode&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_type_code;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_module_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_restart;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_stop;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::bool_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_self_test;\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_Farmer_ASYNC_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/FarmerBase.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_FarmerBase_HXX_\n#define INCLUDE_mmx_FarmerBase_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Hash64.hpp>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT FarmerBase : public ::vnx::Module {\npublic:\n\t\n\t::vnx::TopicPtr input_info = \"harvester.info\";\n\t::vnx::TopicPtr input_proofs = \"harvester.proof\";\n\t::vnx::TopicPtr input_partials = \"harvester.partials\";\n\t::vnx::TopicPtr output_proofs = \"farmer.proof\";\n\t::vnx::TopicPtr output_partials = \"farmer.partials\";\n\tuint32_t harvester_timeout = 60;\n\tuint32_t difficulty_interval = 300;\n\tstd::string node_server = \"Node\";\n\tstd::string wallet_server = \"Wallet\";\n\tvnx::optional<::mmx::addr_t> reward_addr;\n\tvnx::optional<uint64_t> partial_diff;\n\tvnx::optional<uint64_t> payout_threshold;\n\t\n\ttypedef ::vnx::Module Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xff732ba14d9d1abull;\n\t\n\tFarmerBase(const std::string& _vnx_name);\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const FarmerBase& _value);\n\tfriend std::istream& operator>>(std::istream& _in, FarmerBase& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tusing Super::handle;\n\t\n\tvirtual ::vnx::Hash64 get_mac_addr() const = 0;\n\tvirtual uint64_t get_partial_diff(const ::mmx::addr_t& plot_nft) const = 0;\n\tvirtual std::map<::mmx::addr_t, uint64_t> get_partial_diffs(const std::vector<::mmx::addr_t>& plot_nfts) const = 0;\n\tvirtual std::vector<::mmx::pubkey_t> get_farmer_keys() const = 0;\n\tvirtual std::shared_ptr<const ::mmx::FarmInfo> get_farm_info() const = 0;\n\tvirtual std::shared_ptr<const ::mmx::BlockHeader> sign_block(std::shared_ptr<const ::mmx::BlockHeader> block) const = 0;\n\tvirtual ::mmx::signature_t sign_vote(std::shared_ptr<const ::mmx::ValidatorVote> vote) const = 0;\n\tvirtual void handle(std::shared_ptr<const ::mmx::FarmInfo> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::ProofResponse> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::Partial> _value) {}\n\t\n\tvoid vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) override;\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) override;\n\t\n};\n\ntemplate<typename T>\nvoid FarmerBase::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<FarmerBase>(12);\n\t_visitor.type_field(\"input_info\", 0); _visitor.accept(input_info);\n\t_visitor.type_field(\"input_proofs\", 1); _visitor.accept(input_proofs);\n\t_visitor.type_field(\"input_partials\", 2); _visitor.accept(input_partials);\n\t_visitor.type_field(\"output_proofs\", 3); _visitor.accept(output_proofs);\n\t_visitor.type_field(\"output_partials\", 4); _visitor.accept(output_partials);\n\t_visitor.type_field(\"harvester_timeout\", 5); _visitor.accept(harvester_timeout);\n\t_visitor.type_field(\"difficulty_interval\", 6); _visitor.accept(difficulty_interval);\n\t_visitor.type_field(\"node_server\", 7); _visitor.accept(node_server);\n\t_visitor.type_field(\"wallet_server\", 8); _visitor.accept(wallet_server);\n\t_visitor.type_field(\"reward_addr\", 9); _visitor.accept(reward_addr);\n\t_visitor.type_field(\"partial_diff\", 10); _visitor.accept(partial_diff);\n\t_visitor.type_field(\"payout_threshold\", 11); _visitor.accept(payout_threshold);\n\t_visitor.template type_end<FarmerBase>(12);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_FarmerBase_HXX_\n"
  },
  {
    "path": "generated/include/mmx/FarmerClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_CLIENT_HXX_\n#define INCLUDE_mmx_Farmer_CLIENT_HXX_\n\n#include <vnx/Client.h>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Hash64.hpp>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n\n\nnamespace mmx {\n\nclass FarmerClient : public vnx::Client {\npublic:\n\tFarmerClient(const std::string& service_name);\n\t\n\tFarmerClient(vnx::Hash64 service_addr);\n\t\n\t::vnx::Hash64 get_mac_addr();\n\t\n\tuint64_t get_partial_diff(const ::mmx::addr_t& plot_nft = ::mmx::addr_t());\n\t\n\tstd::map<::mmx::addr_t, uint64_t> get_partial_diffs(const std::vector<::mmx::addr_t>& plot_nfts = {});\n\t\n\tstd::vector<::mmx::pubkey_t> get_farmer_keys();\n\t\n\tstd::shared_ptr<const ::mmx::FarmInfo> get_farm_info();\n\t\n\tstd::shared_ptr<const ::mmx::BlockHeader> sign_block(std::shared_ptr<const ::mmx::BlockHeader> block = nullptr);\n\t\n\t::mmx::signature_t sign_vote(std::shared_ptr<const ::mmx::ValidatorVote> vote = nullptr);\n\t\n\t::vnx::Object vnx_get_config_object();\n\t\n\t::vnx::Variant vnx_get_config(const std::string& name = \"\");\n\t\n\tvoid vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config_object_async(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\tvoid vnx_set_config_async(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\t::vnx::TypeCode vnx_get_type_code();\n\t\n\tstd::shared_ptr<const ::vnx::ModuleInfo> vnx_get_module_info();\n\t\n\tvoid vnx_restart();\n\t\n\tvoid vnx_restart_async();\n\t\n\tvoid vnx_stop();\n\t\n\tvoid vnx_stop_async();\n\t\n\tvnx::bool_t vnx_self_test();\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_Farmer_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_get_farm_info.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_get_farm_info_HXX_\n#define INCLUDE_mmx_Farmer_get_farm_info_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_get_farm_info : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x7e72655f6f215b5aull;\n\t\n\tFarmer_get_farm_info() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_get_farm_info> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_get_farm_info& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_get_farm_info& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_get_farm_info::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_get_farm_info>(0);\n\t_visitor.template type_end<Farmer_get_farm_info>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_get_farm_info_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_get_farm_info_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_get_farm_info_return_HXX_\n#define INCLUDE_mmx_Farmer_get_farm_info_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_get_farm_info_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::FarmInfo> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xccf47453b394d3e3ull;\n\t\n\tFarmer_get_farm_info_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_get_farm_info_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_get_farm_info_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_get_farm_info_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_get_farm_info_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_get_farm_info_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Farmer_get_farm_info_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_get_farm_info_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_get_farmer_keys.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_get_farmer_keys_HXX_\n#define INCLUDE_mmx_Farmer_get_farmer_keys_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_get_farmer_keys : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x784507b4594a776aull;\n\t\n\tFarmer_get_farmer_keys() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_get_farmer_keys> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_get_farmer_keys& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_get_farmer_keys& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_get_farmer_keys::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_get_farmer_keys>(0);\n\t_visitor.template type_end<Farmer_get_farmer_keys>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_get_farmer_keys_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_get_farmer_keys_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_get_farmer_keys_return_HXX_\n#define INCLUDE_mmx_Farmer_get_farmer_keys_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_get_farmer_keys_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::pubkey_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xdb382c476694095full;\n\t\n\tFarmer_get_farmer_keys_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_get_farmer_keys_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_get_farmer_keys_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_get_farmer_keys_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_get_farmer_keys_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_get_farmer_keys_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Farmer_get_farmer_keys_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_get_farmer_keys_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_get_mac_addr.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_get_mac_addr_HXX_\n#define INCLUDE_mmx_Farmer_get_mac_addr_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_get_mac_addr : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe9ced9f6feb676b3ull;\n\t\n\tFarmer_get_mac_addr() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_get_mac_addr> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_get_mac_addr& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_get_mac_addr& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_get_mac_addr::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_get_mac_addr>(0);\n\t_visitor.template type_end<Farmer_get_mac_addr>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_get_mac_addr_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_get_mac_addr_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_get_mac_addr_return_HXX_\n#define INCLUDE_mmx_Farmer_get_mac_addr_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Hash64.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_get_mac_addr_return : public ::vnx::Value {\npublic:\n\t\n\t::vnx::Hash64 _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9e4caad2ffaba990ull;\n\t\n\tFarmer_get_mac_addr_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_get_mac_addr_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_get_mac_addr_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_get_mac_addr_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_get_mac_addr_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_get_mac_addr_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Farmer_get_mac_addr_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_get_mac_addr_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_get_partial_diff.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_get_partial_diff_HXX_\n#define INCLUDE_mmx_Farmer_get_partial_diff_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_get_partial_diff : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t plot_nft;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x40f08b90e2eb4ca0ull;\n\t\n\tFarmer_get_partial_diff() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_get_partial_diff> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_get_partial_diff& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_get_partial_diff& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_get_partial_diff::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_get_partial_diff>(1);\n\t_visitor.type_field(\"plot_nft\", 0); _visitor.accept(plot_nft);\n\t_visitor.template type_end<Farmer_get_partial_diff>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_get_partial_diff_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_get_partial_diff_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_get_partial_diff_return_HXX_\n#define INCLUDE_mmx_Farmer_get_partial_diff_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_get_partial_diff_return : public ::vnx::Value {\npublic:\n\t\n\tuint64_t _ret_0 = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd5650a69bbe8d978ull;\n\t\n\tFarmer_get_partial_diff_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_get_partial_diff_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_get_partial_diff_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_get_partial_diff_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_get_partial_diff_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_get_partial_diff_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Farmer_get_partial_diff_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_get_partial_diff_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_get_partial_diffs.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_get_partial_diffs_HXX_\n#define INCLUDE_mmx_Farmer_get_partial_diffs_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_get_partial_diffs : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> plot_nfts;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8806f6763215c58bull;\n\t\n\tFarmer_get_partial_diffs() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_get_partial_diffs> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_get_partial_diffs& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_get_partial_diffs& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_get_partial_diffs::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_get_partial_diffs>(1);\n\t_visitor.type_field(\"plot_nfts\", 0); _visitor.accept(plot_nfts);\n\t_visitor.template type_end<Farmer_get_partial_diffs>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_get_partial_diffs_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_get_partial_diffs_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_get_partial_diffs_return_HXX_\n#define INCLUDE_mmx_Farmer_get_partial_diffs_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_get_partial_diffs_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::addr_t, uint64_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x439549fd31330df6ull;\n\t\n\tFarmer_get_partial_diffs_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_get_partial_diffs_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_get_partial_diffs_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_get_partial_diffs_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_get_partial_diffs_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_get_partial_diffs_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Farmer_get_partial_diffs_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_get_partial_diffs_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_sign_block.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_sign_block_HXX_\n#define INCLUDE_mmx_Farmer_sign_block_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_sign_block : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::BlockHeader> block;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6924b10f345eb316ull;\n\t\n\tFarmer_sign_block() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_sign_block> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_sign_block& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_sign_block& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_sign_block::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_sign_block>(1);\n\t_visitor.type_field(\"block\", 0); _visitor.accept(block);\n\t_visitor.template type_end<Farmer_sign_block>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_sign_block_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_sign_block_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_sign_block_return_HXX_\n#define INCLUDE_mmx_Farmer_sign_block_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_sign_block_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::BlockHeader> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb8acce9269f91310ull;\n\t\n\tFarmer_sign_block_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_sign_block_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_sign_block_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_sign_block_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_sign_block_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_sign_block_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Farmer_sign_block_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_sign_block_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_sign_vote.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_sign_vote_HXX_\n#define INCLUDE_mmx_Farmer_sign_vote_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_sign_vote : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::ValidatorVote> vote;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x655117e05d64b5fcull;\n\t\n\tFarmer_sign_vote() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_sign_vote> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_sign_vote& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_sign_vote& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_sign_vote::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_sign_vote>(1);\n\t_visitor.type_field(\"vote\", 0); _visitor.accept(vote);\n\t_visitor.template type_end<Farmer_sign_vote>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_sign_vote_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Farmer_sign_vote_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Farmer_sign_vote_return_HXX_\n#define INCLUDE_mmx_Farmer_sign_vote_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/signature_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Farmer_sign_vote_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::signature_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x40848c38fe18b587ull;\n\t\n\tFarmer_sign_vote_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Farmer_sign_vote_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Farmer_sign_vote_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Farmer_sign_vote_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Farmer_sign_vote_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Farmer_sign_vote_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Farmer_sign_vote_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Farmer_sign_vote_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/HarvesterAsyncClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_ASYNC_CLIENT_HXX_\n#define INCLUDE_mmx_Harvester_ASYNC_CLIENT_HXX_\n\n#include <vnx/AsyncClient.h>\n#include <mmx/Challenge.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass HarvesterAsyncClient : public vnx::AsyncClient {\npublic:\n\tHarvesterAsyncClient(const std::string& service_name);\n\t\n\tHarvesterAsyncClient(vnx::Hash64 service_addr);\n\t\n\tuint64_t reload(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t add_plot_dir(const std::string& path = \"\", \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t rem_plot_dir(const std::string& path = \"\", \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_farm_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::FarmInfo>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::FarmInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_total_bytes(\n\t\t\tconst std::function<void(const uint64_t&)>& _callback = std::function<void(const uint64_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", \n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", const int64_t& offset = 0, const int64_t& max_bytes = 0, \n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config_object(\n\t\t\tconst std::function<void(const ::vnx::Object&)>& _callback = std::function<void(const ::vnx::Object&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config(const std::string& name = \"\", \n\t\t\tconst std::function<void(const ::vnx::Variant&)>& _callback = std::function<void(const ::vnx::Variant&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_type_code(\n\t\t\tconst std::function<void(const ::vnx::TypeCode&)>& _callback = std::function<void(const ::vnx::TypeCode&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_module_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_restart(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_stop(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_self_test(\n\t\t\tconst std::function<void(const vnx::bool_t&)>& _callback = std::function<void(const vnx::bool_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\nprotected:\n\tint32_t vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) override;\n\t\n\tint32_t vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) override;\n\t\nprivate:\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_reload;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_add_plot_dir;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_rem_plot_dir;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::FarmInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_farm_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const uint64_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_total_bytes;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>, std::function<void(const vnx::exception&)>>> vnx_queue_http_request;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>, std::function<void(const vnx::exception&)>>> vnx_queue_http_request_chunk;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Object&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Variant&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::TypeCode&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_type_code;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_module_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_restart;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_stop;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::bool_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_self_test;\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_Harvester_ASYNC_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/HarvesterBase.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_HarvesterBase_HXX_\n#define INCLUDE_mmx_HarvesterBase_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Challenge.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT HarvesterBase : public ::vnx::Module {\npublic:\n\t\n\t::vnx::TopicPtr input_challenges = \"harvester.challenges\";\n\t::vnx::TopicPtr output_info = \"harvester.info\";\n\t::vnx::TopicPtr output_proofs = \"harvester.proof\";\n\t::vnx::TopicPtr output_lookups = \"harvester.lookups\";\n\t::vnx::TopicPtr output_partials = \"harvester.partials\";\n\tstd::set<std::string> plot_dirs;\n\tstd::set<std::string> dir_blacklist;\n\tstd::string node_server = \"Node\";\n\tstd::string farmer_server = \"Farmer\";\n\tstd::string config_path;\n\tstd::string storage_path;\n\tstd::string my_name;\n\tint32_t max_queue_ms = 10000;\n\tint32_t reload_interval = 3600;\n\tint32_t nft_query_interval = 60;\n\tuint32_t num_threads = 32;\n\tuint32_t max_recursion = 4;\n\tvnx::bool_t recursive_search = true;\n\tvnx::bool_t farm_virtual_plots = true;\n\t\n\ttypedef ::vnx::Module Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc17118896cde1555ull;\n\t\n\tHarvesterBase(const std::string& _vnx_name);\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const HarvesterBase& _value);\n\tfriend std::istream& operator>>(std::istream& _in, HarvesterBase& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tusing Super::handle;\n\t\n\tvirtual void reload() = 0;\n\tvirtual void add_plot_dir(const std::string& path) = 0;\n\tvirtual void rem_plot_dir(const std::string& path) = 0;\n\tvirtual std::shared_ptr<const ::mmx::FarmInfo> get_farm_info() const = 0;\n\tvirtual uint64_t get_total_bytes() const = 0;\n\tvirtual void handle(std::shared_ptr<const ::mmx::Challenge> _value) {}\n\tvirtual void http_request_async(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const vnx::request_id_t& _request_id) const = 0;\n\tvoid http_request_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpResponse>& _ret_0) const;\n\tvirtual void http_request_chunk_async(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& _request_id) const = 0;\n\tvoid http_request_chunk_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpData>& _ret_0) const;\n\t\n\tvoid vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) override;\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) override;\n\t\n};\n\ntemplate<typename T>\nvoid HarvesterBase::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<HarvesterBase>(19);\n\t_visitor.type_field(\"input_challenges\", 0); _visitor.accept(input_challenges);\n\t_visitor.type_field(\"output_info\", 1); _visitor.accept(output_info);\n\t_visitor.type_field(\"output_proofs\", 2); _visitor.accept(output_proofs);\n\t_visitor.type_field(\"output_lookups\", 3); _visitor.accept(output_lookups);\n\t_visitor.type_field(\"output_partials\", 4); _visitor.accept(output_partials);\n\t_visitor.type_field(\"plot_dirs\", 5); _visitor.accept(plot_dirs);\n\t_visitor.type_field(\"dir_blacklist\", 6); _visitor.accept(dir_blacklist);\n\t_visitor.type_field(\"node_server\", 7); _visitor.accept(node_server);\n\t_visitor.type_field(\"farmer_server\", 8); _visitor.accept(farmer_server);\n\t_visitor.type_field(\"config_path\", 9); _visitor.accept(config_path);\n\t_visitor.type_field(\"storage_path\", 10); _visitor.accept(storage_path);\n\t_visitor.type_field(\"my_name\", 11); _visitor.accept(my_name);\n\t_visitor.type_field(\"max_queue_ms\", 12); _visitor.accept(max_queue_ms);\n\t_visitor.type_field(\"reload_interval\", 13); _visitor.accept(reload_interval);\n\t_visitor.type_field(\"nft_query_interval\", 14); _visitor.accept(nft_query_interval);\n\t_visitor.type_field(\"num_threads\", 15); _visitor.accept(num_threads);\n\t_visitor.type_field(\"max_recursion\", 16); _visitor.accept(max_recursion);\n\t_visitor.type_field(\"recursive_search\", 17); _visitor.accept(recursive_search);\n\t_visitor.type_field(\"farm_virtual_plots\", 18); _visitor.accept(farm_virtual_plots);\n\t_visitor.template type_end<HarvesterBase>(19);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_HarvesterBase_HXX_\n"
  },
  {
    "path": "generated/include/mmx/HarvesterClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_CLIENT_HXX_\n#define INCLUDE_mmx_Harvester_CLIENT_HXX_\n\n#include <vnx/Client.h>\n#include <mmx/Challenge.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass HarvesterClient : public vnx::Client {\npublic:\n\tHarvesterClient(const std::string& service_name);\n\t\n\tHarvesterClient(vnx::Hash64 service_addr);\n\t\n\tvoid reload();\n\t\n\tvoid reload_async();\n\t\n\tvoid add_plot_dir(const std::string& path = \"\");\n\t\n\tvoid add_plot_dir_async(const std::string& path = \"\");\n\t\n\tvoid rem_plot_dir(const std::string& path = \"\");\n\t\n\tvoid rem_plot_dir_async(const std::string& path = \"\");\n\t\n\tstd::shared_ptr<const ::mmx::FarmInfo> get_farm_info();\n\t\n\tuint64_t get_total_bytes();\n\t\n\tstd::shared_ptr<const ::vnx::addons::HttpResponse> http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\");\n\t\n\tstd::shared_ptr<const ::vnx::addons::HttpData> http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", const int64_t& offset = 0, const int64_t& max_bytes = 0);\n\t\n\t::vnx::Object vnx_get_config_object();\n\t\n\t::vnx::Variant vnx_get_config(const std::string& name = \"\");\n\t\n\tvoid vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config_object_async(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\tvoid vnx_set_config_async(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\t::vnx::TypeCode vnx_get_type_code();\n\t\n\tstd::shared_ptr<const ::vnx::ModuleInfo> vnx_get_module_info();\n\t\n\tvoid vnx_restart();\n\t\n\tvoid vnx_restart_async();\n\t\n\tvoid vnx_stop();\n\t\n\tvoid vnx_stop_async();\n\t\n\tvnx::bool_t vnx_self_test();\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_Harvester_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Harvester_add_plot_dir.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_add_plot_dir_HXX_\n#define INCLUDE_mmx_Harvester_add_plot_dir_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Harvester_add_plot_dir : public ::vnx::Value {\npublic:\n\t\n\tstd::string path;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x61714d1c7ecaffddull;\n\t\n\tHarvester_add_plot_dir() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Harvester_add_plot_dir> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Harvester_add_plot_dir& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Harvester_add_plot_dir& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Harvester_add_plot_dir::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Harvester_add_plot_dir>(1);\n\t_visitor.type_field(\"path\", 0); _visitor.accept(path);\n\t_visitor.template type_end<Harvester_add_plot_dir>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Harvester_add_plot_dir_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Harvester_add_plot_dir_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_add_plot_dir_return_HXX_\n#define INCLUDE_mmx_Harvester_add_plot_dir_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Harvester_add_plot_dir_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8b5f7bc4f34fb5d5ull;\n\t\n\tHarvester_add_plot_dir_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Harvester_add_plot_dir_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Harvester_add_plot_dir_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Harvester_add_plot_dir_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Harvester_add_plot_dir_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Harvester_add_plot_dir_return>(0);\n\t_visitor.template type_end<Harvester_add_plot_dir_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Harvester_add_plot_dir_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Harvester_get_farm_info.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_get_farm_info_HXX_\n#define INCLUDE_mmx_Harvester_get_farm_info_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Harvester_get_farm_info : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x129f91b9ade2891full;\n\t\n\tHarvester_get_farm_info() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Harvester_get_farm_info> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Harvester_get_farm_info& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Harvester_get_farm_info& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Harvester_get_farm_info::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Harvester_get_farm_info>(0);\n\t_visitor.template type_end<Harvester_get_farm_info>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Harvester_get_farm_info_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Harvester_get_farm_info_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_get_farm_info_return_HXX_\n#define INCLUDE_mmx_Harvester_get_farm_info_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Harvester_get_farm_info_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::FarmInfo> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x87a91b15ec42441full;\n\t\n\tHarvester_get_farm_info_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Harvester_get_farm_info_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Harvester_get_farm_info_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Harvester_get_farm_info_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Harvester_get_farm_info_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Harvester_get_farm_info_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Harvester_get_farm_info_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Harvester_get_farm_info_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Harvester_get_total_bytes.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_get_total_bytes_HXX_\n#define INCLUDE_mmx_Harvester_get_total_bytes_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Harvester_get_total_bytes : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x36f2104b41d9a25cull;\n\t\n\tHarvester_get_total_bytes() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Harvester_get_total_bytes> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Harvester_get_total_bytes& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Harvester_get_total_bytes& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Harvester_get_total_bytes::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Harvester_get_total_bytes>(0);\n\t_visitor.template type_end<Harvester_get_total_bytes>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Harvester_get_total_bytes_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Harvester_get_total_bytes_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_get_total_bytes_return_HXX_\n#define INCLUDE_mmx_Harvester_get_total_bytes_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Harvester_get_total_bytes_return : public ::vnx::Value {\npublic:\n\t\n\tuint64_t _ret_0 = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd9a9fe83ba7d6918ull;\n\t\n\tHarvester_get_total_bytes_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Harvester_get_total_bytes_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Harvester_get_total_bytes_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Harvester_get_total_bytes_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Harvester_get_total_bytes_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Harvester_get_total_bytes_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Harvester_get_total_bytes_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Harvester_get_total_bytes_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Harvester_reload.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_reload_HXX_\n#define INCLUDE_mmx_Harvester_reload_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Harvester_reload : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc67a4577de7e85caull;\n\t\n\tHarvester_reload() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Harvester_reload> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Harvester_reload& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Harvester_reload& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Harvester_reload::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Harvester_reload>(0);\n\t_visitor.template type_end<Harvester_reload>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Harvester_reload_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Harvester_reload_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_reload_return_HXX_\n#define INCLUDE_mmx_Harvester_reload_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Harvester_reload_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x39fc8cc53bcf4659ull;\n\t\n\tHarvester_reload_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Harvester_reload_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Harvester_reload_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Harvester_reload_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Harvester_reload_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Harvester_reload_return>(0);\n\t_visitor.template type_end<Harvester_reload_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Harvester_reload_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Harvester_rem_plot_dir.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_rem_plot_dir_HXX_\n#define INCLUDE_mmx_Harvester_rem_plot_dir_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Harvester_rem_plot_dir : public ::vnx::Value {\npublic:\n\t\n\tstd::string path;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x57674e56f3ab6076ull;\n\t\n\tHarvester_rem_plot_dir() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Harvester_rem_plot_dir> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Harvester_rem_plot_dir& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Harvester_rem_plot_dir& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Harvester_rem_plot_dir::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Harvester_rem_plot_dir>(1);\n\t_visitor.type_field(\"path\", 0); _visitor.accept(path);\n\t_visitor.template type_end<Harvester_rem_plot_dir>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Harvester_rem_plot_dir_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Harvester_rem_plot_dir_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Harvester_rem_plot_dir_return_HXX_\n#define INCLUDE_mmx_Harvester_rem_plot_dir_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Harvester_rem_plot_dir_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb2a8cfb3633bf358ull;\n\t\n\tHarvester_rem_plot_dir_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Harvester_rem_plot_dir_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Harvester_rem_plot_dir_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Harvester_rem_plot_dir_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Harvester_rem_plot_dir_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Harvester_rem_plot_dir_return>(0);\n\t_visitor.template type_end<Harvester_rem_plot_dir_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Harvester_rem_plot_dir_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/IntervalRequest.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_IntervalRequest_HXX_\n#define INCLUDE_mmx_IntervalRequest_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT IntervalRequest : public ::vnx::Value {\npublic:\n\t\n\tuint32_t vdf_height = 0;\n\tuint64_t start = 0;\n\tuint64_t end = 0;\n\t::mmx::hash_t infuse;\n\tvnx::optional<::mmx::hash_t> input;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xa4e39be061f13d71ull;\n\t\n\tIntervalRequest() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<IntervalRequest> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const IntervalRequest& _value);\n\tfriend std::istream& operator>>(std::istream& _in, IntervalRequest& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid IntervalRequest::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<IntervalRequest>(5);\n\t_visitor.type_field(\"vdf_height\", 0); _visitor.accept(vdf_height);\n\t_visitor.type_field(\"start\", 1); _visitor.accept(start);\n\t_visitor.type_field(\"end\", 2); _visitor.accept(end);\n\t_visitor.type_field(\"infuse\", 3); _visitor.accept(infuse);\n\t_visitor.type_field(\"input\", 4); _visitor.accept(input);\n\t_visitor.template type_end<IntervalRequest>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_IntervalRequest_HXX_\n"
  },
  {
    "path": "generated/include/mmx/KeyFile.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_KeyFile_HXX_\n#define INCLUDE_mmx_KeyFile_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT KeyFile : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t seed_value;\n\tvnx::optional<std::string> finger_print;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xdf868931a939cba1ull;\n\t\n\tKeyFile() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<KeyFile> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const KeyFile& _value);\n\tfriend std::istream& operator>>(std::istream& _in, KeyFile& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid KeyFile::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<KeyFile>(2);\n\t_visitor.type_field(\"seed_value\", 0); _visitor.accept(seed_value);\n\t_visitor.type_field(\"finger_print\", 1); _visitor.accept(finger_print);\n\t_visitor.template type_end<KeyFile>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_KeyFile_HXX_\n"
  },
  {
    "path": "generated/include/mmx/LookupInfo.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_LookupInfo_HXX_\n#define INCLUDE_mmx_LookupInfo_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT LookupInfo : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t id;\n\tstd::string name;\n\tuint32_t vdf_height = 0;\n\tuint32_t num_passed = 0;\n\tuint32_t num_total = 0;\n\tint64_t slow_time_ms = 0;\n\tint64_t total_time_ms = 0;\n\tint64_t total_delay_ms = 0;\n\tvnx::optional<std::string> slow_plot;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb7b2ff343487dd63ull;\n\t\n\tLookupInfo() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<LookupInfo> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const LookupInfo& _value);\n\tfriend std::istream& operator>>(std::istream& _in, LookupInfo& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid LookupInfo::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<LookupInfo>(9);\n\t_visitor.type_field(\"id\", 0); _visitor.accept(id);\n\t_visitor.type_field(\"name\", 1); _visitor.accept(name);\n\t_visitor.type_field(\"vdf_height\", 2); _visitor.accept(vdf_height);\n\t_visitor.type_field(\"num_passed\", 3); _visitor.accept(num_passed);\n\t_visitor.type_field(\"num_total\", 4); _visitor.accept(num_total);\n\t_visitor.type_field(\"slow_time_ms\", 5); _visitor.accept(slow_time_ms);\n\t_visitor.type_field(\"total_time_ms\", 6); _visitor.accept(total_time_ms);\n\t_visitor.type_field(\"total_delay_ms\", 7); _visitor.accept(total_delay_ms);\n\t_visitor.type_field(\"slow_plot\", 8); _visitor.accept(slow_plot);\n\t_visitor.template type_end<LookupInfo>(9);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_LookupInfo_HXX_\n"
  },
  {
    "path": "generated/include/mmx/NetworkInfo.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_NetworkInfo_HXX_\n#define INCLUDE_mmx_NetworkInfo_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT NetworkInfo : public ::vnx::Value {\npublic:\n\t\n\tvnx::bool_t is_synced = 0;\n\tuint32_t height = 0;\n\tuint32_t vdf_height = 0;\n\tuint32_t synced_since = 0;\n\tint64_t time_stamp = 0;\n\tuint64_t time_diff = 0;\n\tuint64_t space_diff = 0;\n\tuint64_t block_reward = 0;\n\tuint64_t total_space = 0;\n\tuint64_t total_supply = 0;\n\tuint64_t address_count = 0;\n\tvnx::float64_t vdf_speed = 0;\n\tvnx::float64_t block_size = 0;\n\tuint64_t average_txfee = 0;\n\t::mmx::hash_t genesis_hash;\n\tstd::string name;\n\tstd::string node_commit;\n\tstd::string node_version;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd984018819746101ull;\n\t\n\tNetworkInfo() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<NetworkInfo> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const NetworkInfo& _value);\n\tfriend std::istream& operator>>(std::istream& _in, NetworkInfo& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid NetworkInfo::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<NetworkInfo>(18);\n\t_visitor.type_field(\"is_synced\", 0); _visitor.accept(is_synced);\n\t_visitor.type_field(\"height\", 1); _visitor.accept(height);\n\t_visitor.type_field(\"vdf_height\", 2); _visitor.accept(vdf_height);\n\t_visitor.type_field(\"synced_since\", 3); _visitor.accept(synced_since);\n\t_visitor.type_field(\"time_stamp\", 4); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"time_diff\", 5); _visitor.accept(time_diff);\n\t_visitor.type_field(\"space_diff\", 6); _visitor.accept(space_diff);\n\t_visitor.type_field(\"block_reward\", 7); _visitor.accept(block_reward);\n\t_visitor.type_field(\"total_space\", 8); _visitor.accept(total_space);\n\t_visitor.type_field(\"total_supply\", 9); _visitor.accept(total_supply);\n\t_visitor.type_field(\"address_count\", 10); _visitor.accept(address_count);\n\t_visitor.type_field(\"vdf_speed\", 11); _visitor.accept(vdf_speed);\n\t_visitor.type_field(\"block_size\", 12); _visitor.accept(block_size);\n\t_visitor.type_field(\"average_txfee\", 13); _visitor.accept(average_txfee);\n\t_visitor.type_field(\"genesis_hash\", 14); _visitor.accept(genesis_hash);\n\t_visitor.type_field(\"name\", 15); _visitor.accept(name);\n\t_visitor.type_field(\"node_commit\", 16); _visitor.accept(node_commit);\n\t_visitor.type_field(\"node_version\", 17); _visitor.accept(node_version);\n\t_visitor.template type_end<NetworkInfo>(18);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_NetworkInfo_HXX_\n"
  },
  {
    "path": "generated/include/mmx/NodeAsyncClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_ASYNC_CLIENT_HXX_\n#define INCLUDE_mmx_Node_ASYNC_CLIENT_HXX_\n\n#include <vnx/AsyncClient.h>\n#include <mmx/Block.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/NetworkInfo.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/exec_entry_t.hxx>\n#include <mmx/exec_result_t.hxx>\n#include <mmx/farmed_block_summary_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/plot_nft_info_t.hxx>\n#include <mmx/pooling_error_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/swap_entry_t.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <mmx/swap_user_info_t.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <mmx/uint128.hpp>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass NodeAsyncClient : public vnx::AsyncClient {\npublic:\n\tNodeAsyncClient(const std::string& service_name);\n\t\n\tNodeAsyncClient(vnx::Hash64 service_addr);\n\t\n\tuint64_t get_params(\n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::ChainParams>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::ChainParams>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_network_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::NetworkInfo>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::NetworkInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_genesis_hash(\n\t\t\tconst std::function<void(const ::mmx::hash_t&)>& _callback = std::function<void(const ::mmx::hash_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_height(\n\t\t\tconst std::function<void(const uint32_t&)>& _callback = std::function<void(const uint32_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_vdf_height(\n\t\t\tconst std::function<void(const uint32_t&)>& _callback = std::function<void(const uint32_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_synced_height(\n\t\t\tconst std::function<void(const vnx::optional<uint32_t>&)>& _callback = std::function<void(const vnx::optional<uint32_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_synced_vdf_height(\n\t\t\tconst std::function<void(const vnx::optional<uint32_t>&)>& _callback = std::function<void(const vnx::optional<uint32_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_vdf_peak(\n\t\t\tconst std::function<void(const ::mmx::hash_t&)>& _callback = std::function<void(const ::mmx::hash_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_block(const ::mmx::hash_t& hash = ::mmx::hash_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Block>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Block>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_block_at(const uint32_t& height = 0, \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Block>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Block>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_header(const ::mmx::hash_t& hash = ::mmx::hash_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_header_at(const uint32_t& height = 0, \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_block_hash(const uint32_t& height = 0, \n\t\t\tconst std::function<void(const vnx::optional<::mmx::hash_t>&)>& _callback = std::function<void(const vnx::optional<::mmx::hash_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_block_hash_ex(const uint32_t& height = 0, \n\t\t\tconst std::function<void(const vnx::optional<std::pair<::mmx::hash_t, ::mmx::hash_t>>&)>& _callback = std::function<void(const vnx::optional<std::pair<::mmx::hash_t, ::mmx::hash_t>>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_tx_height(const ::mmx::hash_t& id = ::mmx::hash_t(), \n\t\t\tconst std::function<void(const vnx::optional<uint32_t>&)>& _callback = std::function<void(const vnx::optional<uint32_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_tx_info(const ::mmx::hash_t& id = ::mmx::hash_t(), \n\t\t\tconst std::function<void(const vnx::optional<::mmx::tx_info_t>&)>& _callback = std::function<void(const vnx::optional<::mmx::tx_info_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_tx_info_for(std::shared_ptr<const ::mmx::Transaction> tx = nullptr, \n\t\t\tconst std::function<void(const vnx::optional<::mmx::tx_info_t>&)>& _callback = std::function<void(const vnx::optional<::mmx::tx_info_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_tx_ids(const uint32_t& limit = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::hash_t>&)>& _callback = std::function<void(const std::vector<::mmx::hash_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_tx_ids_at(const uint32_t& height = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::hash_t>&)>& _callback = std::function<void(const std::vector<::mmx::hash_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_tx_ids_since(const uint32_t& height = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::hash_t>&)>& _callback = std::function<void(const std::vector<::mmx::hash_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t validate(std::shared_ptr<const ::mmx::Transaction> tx = nullptr, \n\t\t\tconst std::function<void(const ::mmx::exec_result_t&)>& _callback = std::function<void(const ::mmx::exec_result_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t add_block(std::shared_ptr<const ::mmx::Block> block = nullptr, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t add_transaction(std::shared_ptr<const ::mmx::Transaction> tx = nullptr, const vnx::bool_t& pre_validate = 0, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_contract(const ::mmx::addr_t& address = ::mmx::addr_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Contract>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Contract>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_contract_for(const ::mmx::addr_t& address = ::mmx::addr_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Contract>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Contract>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_contracts(const std::vector<::mmx::addr_t>& addresses = {}, \n\t\t\tconst std::function<void(const std::vector<std::shared_ptr<const ::mmx::Contract>>&)>& _callback = std::function<void(const std::vector<std::shared_ptr<const ::mmx::Contract>>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_contracts_by(const std::vector<::mmx::addr_t>& addresses = {}, const vnx::optional<::mmx::hash_t>& type_hash = nullptr, \n\t\t\tconst std::function<void(const std::vector<::mmx::addr_t>&)>& _callback = std::function<void(const std::vector<::mmx::addr_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_contracts_owned_by(const std::vector<::mmx::addr_t>& addresses = {}, const vnx::optional<::mmx::hash_t>& type_hash = nullptr, \n\t\t\tconst std::function<void(const std::vector<::mmx::addr_t>&)>& _callback = std::function<void(const std::vector<::mmx::addr_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_transaction(const ::mmx::hash_t& id = ::mmx::hash_t(), const vnx::bool_t& pending = 0, \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_transactions(const std::vector<::mmx::hash_t>& ids = {}, \n\t\t\tconst std::function<void(const std::vector<std::shared_ptr<const ::mmx::Transaction>>&)>& _callback = std::function<void(const std::vector<std::shared_ptr<const ::mmx::Transaction>>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_history(const std::vector<::mmx::addr_t>& addresses = {}, const ::mmx::query_filter_t& filter = ::mmx::query_filter_t(), \n\t\t\tconst std::function<void(const std::vector<::mmx::tx_entry_t>&)>& _callback = std::function<void(const std::vector<::mmx::tx_entry_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_history_memo(const std::vector<::mmx::addr_t>& addresses = {}, const std::string& memo = \"\", const ::mmx::query_filter_t& filter = ::mmx::query_filter_t(), \n\t\t\tconst std::function<void(const std::vector<::mmx::tx_entry_t>&)>& _callback = std::function<void(const std::vector<::mmx::tx_entry_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_balance(const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::addr_t& currency = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const ::mmx::uint128&)>& _callback = std::function<void(const ::mmx::uint128&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_balances(const ::mmx::addr_t& address = ::mmx::addr_t(), const std::set<::mmx::addr_t>& whitelist = {}, const int32_t& limit = 100, \n\t\t\tconst std::function<void(const std::map<::mmx::addr_t, ::mmx::uint128>&)>& _callback = std::function<void(const std::map<::mmx::addr_t, ::mmx::uint128>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_contract_balances(const ::mmx::addr_t& address = ::mmx::addr_t(), const std::set<::mmx::addr_t>& whitelist = {}, const int32_t& limit = 100, \n\t\t\tconst std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>& _callback = std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_total_balance(const std::vector<::mmx::addr_t>& addresses = {}, const ::mmx::addr_t& currency = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const ::mmx::uint128&)>& _callback = std::function<void(const ::mmx::uint128&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_total_balances(const std::vector<::mmx::addr_t>& addresses = {}, const std::set<::mmx::addr_t>& whitelist = {}, const int32_t& limit = 100, \n\t\t\tconst std::function<void(const std::map<::mmx::addr_t, ::mmx::uint128>&)>& _callback = std::function<void(const std::map<::mmx::addr_t, ::mmx::uint128>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_all_balances(const std::vector<::mmx::addr_t>& addresses = {}, const std::set<::mmx::addr_t>& whitelist = {}, const int32_t& limit = 100, \n\t\t\tconst std::function<void(const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>&)>& _callback = std::function<void(const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_exec_history(const ::mmx::addr_t& address = ::mmx::addr_t(), const int32_t& limit = 100, const vnx::bool_t& recent = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::exec_entry_t>&)>& _callback = std::function<void(const std::vector<::mmx::exec_entry_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t read_storage(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint32_t& height = -1, \n\t\t\tconst std::function<void(const std::map<std::string, ::mmx::vm::varptr_t>&)>& _callback = std::function<void(const std::map<std::string, ::mmx::vm::varptr_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t dump_storage(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint32_t& height = -1, \n\t\t\tconst std::function<void(const std::map<uint64_t, ::mmx::vm::varptr_t>&)>& _callback = std::function<void(const std::map<uint64_t, ::mmx::vm::varptr_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t read_storage_var(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint64_t& address = 0, const uint32_t& height = -1, \n\t\t\tconst std::function<void(const ::mmx::vm::varptr_t&)>& _callback = std::function<void(const ::mmx::vm::varptr_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t read_storage_entry_var(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint64_t& address = 0, const uint64_t& key = 0, const uint32_t& height = -1, \n\t\t\tconst std::function<void(const ::mmx::vm::varptr_t&)>& _callback = std::function<void(const ::mmx::vm::varptr_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t read_storage_field(const ::mmx::addr_t& contract = ::mmx::addr_t(), const std::string& name = \"\", const uint32_t& height = -1, \n\t\t\tconst std::function<void(const std::pair<::mmx::vm::varptr_t, uint64_t>&)>& _callback = std::function<void(const std::pair<::mmx::vm::varptr_t, uint64_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t read_storage_entry_addr(const ::mmx::addr_t& contract = ::mmx::addr_t(), const std::string& name = \"\", const ::mmx::addr_t& key = ::mmx::addr_t(), const uint32_t& height = -1, \n\t\t\tconst std::function<void(const std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>&)>& _callback = std::function<void(const std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t read_storage_entry_string(const ::mmx::addr_t& contract = ::mmx::addr_t(), const std::string& name = \"\", const std::string& key = \"\", const uint32_t& height = -1, \n\t\t\tconst std::function<void(const std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>&)>& _callback = std::function<void(const std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t read_storage_array(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint64_t& address = 0, const uint32_t& height = -1, \n\t\t\tconst std::function<void(const std::vector<::mmx::vm::varptr_t>&)>& _callback = std::function<void(const std::vector<::mmx::vm::varptr_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t read_storage_map(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint64_t& address = 0, const uint32_t& height = -1, \n\t\t\tconst std::function<void(const std::map<::mmx::vm::varptr_t, ::mmx::vm::varptr_t>&)>& _callback = std::function<void(const std::map<::mmx::vm::varptr_t, ::mmx::vm::varptr_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t read_storage_object(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint64_t& address = 0, const uint32_t& height = -1, \n\t\t\tconst std::function<void(const std::map<std::string, ::mmx::vm::varptr_t>&)>& _callback = std::function<void(const std::map<std::string, ::mmx::vm::varptr_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t call_contract(const ::mmx::addr_t& address = ::mmx::addr_t(), const std::string& method = \"\", const std::vector<::vnx::Variant>& args = {}, const vnx::optional<::mmx::addr_t>& user = nullptr, const vnx::optional<std::pair<::mmx::addr_t, ::mmx::uint128>>& deposit = nullptr, \n\t\t\tconst std::function<void(const ::vnx::Variant&)>& _callback = std::function<void(const ::vnx::Variant&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_plot_nft_info(const ::mmx::addr_t& address = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const vnx::optional<::mmx::plot_nft_info_t>&)>& _callback = std::function<void(const vnx::optional<::mmx::plot_nft_info_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_plot_nft_target(const ::mmx::addr_t& address = ::mmx::addr_t(), const vnx::optional<::mmx::addr_t>& farmer_addr = nullptr, \n\t\t\tconst std::function<void(const ::mmx::addr_t&)>& _callback = std::function<void(const ::mmx::addr_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_offer(const ::mmx::addr_t& address = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const ::mmx::offer_data_t&)>& _callback = std::function<void(const ::mmx::offer_data_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_offers(const uint32_t& since = 0, const vnx::bool_t& state = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback = std::function<void(const std::vector<::mmx::offer_data_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_offers_by(const std::vector<::mmx::addr_t>& owners = {}, const vnx::bool_t& state = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback = std::function<void(const std::vector<::mmx::offer_data_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t fetch_offers(const std::vector<::mmx::addr_t>& addresses = {}, const vnx::bool_t& state = 0, const vnx::bool_t& closed = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback = std::function<void(const std::vector<::mmx::offer_data_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_recent_offers(const int32_t& limit = 100, const vnx::bool_t& state = true, \n\t\t\tconst std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback = std::function<void(const std::vector<::mmx::offer_data_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_recent_offers_for(const vnx::optional<::mmx::addr_t>& bid = nullptr, const vnx::optional<::mmx::addr_t>& ask = nullptr, const ::mmx::uint128& min_bid = ::mmx::uint128(), const int32_t& limit = 100, const vnx::bool_t& state = true, \n\t\t\tconst std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback = std::function<void(const std::vector<::mmx::offer_data_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_trade_history(const int32_t& limit = 100, const uint32_t& since = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::trade_entry_t>&)>& _callback = std::function<void(const std::vector<::mmx::trade_entry_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_trade_history_for(const vnx::optional<::mmx::addr_t>& bid = nullptr, const vnx::optional<::mmx::addr_t>& ask = nullptr, const int32_t& limit = 100, const uint32_t& since = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::trade_entry_t>&)>& _callback = std::function<void(const std::vector<::mmx::trade_entry_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_swaps(const uint32_t& since = 0, const vnx::optional<::mmx::addr_t>& token = nullptr, const vnx::optional<::mmx::addr_t>& currency = nullptr, const int32_t& limit = 100, \n\t\t\tconst std::function<void(const std::vector<::mmx::swap_info_t>&)>& _callback = std::function<void(const std::vector<::mmx::swap_info_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_swap_info(const ::mmx::addr_t& address = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const ::mmx::swap_info_t&)>& _callback = std::function<void(const ::mmx::swap_info_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_swap_user_info(const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::addr_t& user = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const ::mmx::swap_user_info_t&)>& _callback = std::function<void(const ::mmx::swap_user_info_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_swap_history(const ::mmx::addr_t& address = ::mmx::addr_t(), const int32_t& limit = 100, \n\t\t\tconst std::function<void(const std::vector<::mmx::swap_entry_t>&)>& _callback = std::function<void(const std::vector<::mmx::swap_entry_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_swap_trade_estimate(const ::mmx::addr_t& address = ::mmx::addr_t(), const uint32_t& i = 0, const ::mmx::uint128& amount = ::mmx::uint128(), const int32_t& num_iter = 20, \n\t\t\tconst std::function<void(const std::array<::mmx::uint128, 2>&)>& _callback = std::function<void(const std::array<::mmx::uint128, 2>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_swap_fees_earned(const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::addr_t& user = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const std::array<::mmx::uint128, 2>&)>& _callback = std::function<void(const std::array<::mmx::uint128, 2>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_swap_equivalent_liquidity(const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::addr_t& user = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const std::array<::mmx::uint128, 2>&)>& _callback = std::function<void(const std::array<::mmx::uint128, 2>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_swap_liquidity_by(const std::vector<::mmx::addr_t>& addresses = {}, \n\t\t\tconst std::function<void(const std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>&)>& _callback = std::function<void(const std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_total_supply(const ::mmx::addr_t& currency = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const ::mmx::uint128&)>& _callback = std::function<void(const ::mmx::uint128&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_farmed_blocks(const std::vector<::mmx::pubkey_t>& farmer_keys = {}, const vnx::bool_t& full_blocks = 0, const uint32_t& since = 0, const int32_t& limit = 100, \n\t\t\tconst std::function<void(const std::vector<std::shared_ptr<const ::mmx::BlockHeader>>&)>& _callback = std::function<void(const std::vector<std::shared_ptr<const ::mmx::BlockHeader>>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_farmed_block_summary(const std::vector<::mmx::pubkey_t>& farmer_keys = {}, const uint32_t& since = 0, \n\t\t\tconst std::function<void(const ::mmx::farmed_block_summary_t&)>& _callback = std::function<void(const ::mmx::farmed_block_summary_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_farmer_ranking(const int32_t& limit = -1, \n\t\t\tconst std::function<void(const std::vector<std::pair<::mmx::pubkey_t, uint32_t>>&)>& _callback = std::function<void(const std::vector<std::pair<::mmx::pubkey_t, uint32_t>>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t verify_plot_nft_target(const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::addr_t& pool_target = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const std::tuple<::mmx::pooling_error_e, std::string>&)>& _callback = std::function<void(const std::tuple<::mmx::pooling_error_e, std::string>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t verify_partial(std::shared_ptr<const ::mmx::Partial> partial = nullptr, const vnx::optional<::mmx::addr_t>& pool_target = nullptr, \n\t\t\tconst std::function<void(const std::tuple<::mmx::pooling_error_e, std::string>&)>& _callback = std::function<void(const std::tuple<::mmx::pooling_error_e, std::string>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t start_sync(const vnx::bool_t& force = 0, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t revert_sync(const uint32_t& height = 0, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", \n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", const int64_t& offset = 0, const int64_t& max_bytes = 0, \n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config_object(\n\t\t\tconst std::function<void(const ::vnx::Object&)>& _callback = std::function<void(const ::vnx::Object&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config(const std::string& name = \"\", \n\t\t\tconst std::function<void(const ::vnx::Variant&)>& _callback = std::function<void(const ::vnx::Variant&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_type_code(\n\t\t\tconst std::function<void(const ::vnx::TypeCode&)>& _callback = std::function<void(const ::vnx::TypeCode&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_module_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_restart(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_stop(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_self_test(\n\t\t\tconst std::function<void(const vnx::bool_t&)>& _callback = std::function<void(const vnx::bool_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\nprotected:\n\tint32_t vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) override;\n\t\n\tint32_t vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) override;\n\t\nprivate:\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::ChainParams>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_params;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::NetworkInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_network_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::hash_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_genesis_hash;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const uint32_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_height;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const uint32_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_vdf_height;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::optional<uint32_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_synced_height;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::optional<uint32_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_synced_vdf_height;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::hash_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_vdf_peak;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Block>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_block;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Block>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_block_at;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_header;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_header_at;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::optional<::mmx::hash_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_block_hash;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::optional<std::pair<::mmx::hash_t, ::mmx::hash_t>>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_block_hash_ex;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::optional<uint32_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_tx_height;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::optional<::mmx::tx_info_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_tx_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::optional<::mmx::tx_info_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_tx_info_for;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::hash_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_tx_ids;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::hash_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_tx_ids_at;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::hash_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_tx_ids_since;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::exec_result_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_validate;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_add_block;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_add_transaction;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Contract>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_contract;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Contract>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_contract_for;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<std::shared_ptr<const ::mmx::Contract>>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_contracts;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::addr_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_contracts_by;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::addr_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_contracts_owned_by;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_transaction;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<std::shared_ptr<const ::mmx::Transaction>>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_transactions;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::tx_entry_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_history;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::tx_entry_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_history_memo;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::uint128&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_balance;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::addr_t, ::mmx::uint128>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_balances;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_contract_balances;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::uint128&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_total_balance;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::addr_t, ::mmx::uint128>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_total_balances;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_all_balances;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::exec_entry_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_exec_history;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<std::string, ::mmx::vm::varptr_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_read_storage;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<uint64_t, ::mmx::vm::varptr_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_dump_storage;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::vm::varptr_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_read_storage_var;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::vm::varptr_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_read_storage_entry_var;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::pair<::mmx::vm::varptr_t, uint64_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_read_storage_field;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_read_storage_entry_addr;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_read_storage_entry_string;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::vm::varptr_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_read_storage_array;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::vm::varptr_t, ::mmx::vm::varptr_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_read_storage_map;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<std::string, ::mmx::vm::varptr_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_read_storage_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Variant&)>, std::function<void(const vnx::exception&)>>> vnx_queue_call_contract;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::optional<::mmx::plot_nft_info_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_plot_nft_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::addr_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_plot_nft_target;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::offer_data_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_offer;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::offer_data_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_offers;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::offer_data_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_offers_by;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::offer_data_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_fetch_offers;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::offer_data_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_recent_offers;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::offer_data_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_recent_offers_for;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::trade_entry_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_trade_history;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::trade_entry_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_trade_history_for;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::swap_info_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_swaps;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::swap_info_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_swap_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::swap_user_info_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_swap_user_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::swap_entry_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_swap_history;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::array<::mmx::uint128, 2>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_swap_trade_estimate;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::array<::mmx::uint128, 2>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_swap_fees_earned;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::array<::mmx::uint128, 2>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_swap_equivalent_liquidity;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_swap_liquidity_by;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::uint128&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_total_supply;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<std::shared_ptr<const ::mmx::BlockHeader>>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_farmed_blocks;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::farmed_block_summary_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_farmed_block_summary;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<std::pair<::mmx::pubkey_t, uint32_t>>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_farmer_ranking;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::tuple<::mmx::pooling_error_e, std::string>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_verify_plot_nft_target;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::tuple<::mmx::pooling_error_e, std::string>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_verify_partial;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_start_sync;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_revert_sync;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>, std::function<void(const vnx::exception&)>>> vnx_queue_http_request;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>, std::function<void(const vnx::exception&)>>> vnx_queue_http_request_chunk;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Object&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Variant&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::TypeCode&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_type_code;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_module_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_restart;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_stop;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::bool_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_self_test;\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_Node_ASYNC_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/NodeBase.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_NodeBase_HXX_\n#define INCLUDE_mmx_NodeBase_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/NetworkInfo.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/exec_entry_t.hxx>\n#include <mmx/exec_result_t.hxx>\n#include <mmx/farmed_block_summary_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/plot_nft_info_t.hxx>\n#include <mmx/pooling_error_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/swap_entry_t.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <mmx/swap_user_info_t.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <mmx/uint128.hpp>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT NodeBase : public ::vnx::Module {\npublic:\n\t\n\t::vnx::TopicPtr input_vdfs = \"network.vdfs\";\n\t::vnx::TopicPtr input_votes = \"network.votes\";\n\t::vnx::TopicPtr input_proof = \"network.proof\";\n\t::vnx::TopicPtr input_blocks = \"network.blocks\";\n\t::vnx::TopicPtr input_transactions = \"network.transactions\";\n\t::vnx::TopicPtr input_timelord_vdfs = \"timelord.proof\";\n\t::vnx::TopicPtr input_harvester_proof = \"farmer.proof\";\n\t::vnx::TopicPtr input_vdf_points = \"network.vdf_points\";\n\t::vnx::TopicPtr output_verified_vdfs = \"node.verified_vdfs\";\n\t::vnx::TopicPtr output_verified_votes = \"node.verified_votes\";\n\t::vnx::TopicPtr output_verified_proof = \"node.verified_proof\";\n\t::vnx::TopicPtr output_verified_blocks = \"node.verified_blocks\";\n\t::vnx::TopicPtr output_verified_transactions = \"node.verified_transactions\";\n\t::vnx::TopicPtr output_committed_blocks = \"node.committed_blocks\";\n\t::vnx::TopicPtr output_transactions = \"node.transactions\";\n\t::vnx::TopicPtr output_interval_request = \"timelord.requests\";\n\t::vnx::TopicPtr output_challenges = \"harvester.challenges\";\n\t::vnx::TopicPtr output_vdf_points = \"node.vdf_points\";\n\t::vnx::TopicPtr output_votes = \"node.votes\";\n\tint32_t max_queue_ms = 10000;\n\tint32_t update_interval_ms = 1000;\n\tint32_t validate_interval_ms = 500;\n\tint32_t sync_loss_delay = 60;\n\tuint32_t max_history = 1000;\n\tuint32_t max_tx_pool = 100;\n\tuint32_t max_tx_queue = 10000;\n\tuint32_t max_sync_jobs = 64;\n\tuint32_t max_sync_ahead = 1000;\n\tuint32_t num_sync_retries = 3;\n\tuint32_t revert_height = -1;\n\tuint32_t num_threads = 24;\n\tuint32_t num_db_threads = 8;\n\tuint32_t num_api_threads = 8;\n\tuint32_t commit_threshold = 80;\n\tuint32_t max_future_sync = 100;\n\tuint32_t max_vdf_verify_pending = 2;\n\tint32_t opencl_device = 0;\n\tstd::string opencl_device_name;\n\tvnx::bool_t do_sync = true;\n\tvnx::bool_t show_warnings = 0;\n\tvnx::bool_t vdf_slave_mode = 0;\n\tvnx::bool_t run_tests = 0;\n\tvnx::bool_t exec_debug = 0;\n\tvnx::bool_t exec_profile = 0;\n\tvnx::bool_t exec_trace = 0;\n\tstd::string storage_path;\n\tstd::string database_path = \"db/\";\n\tstd::string router_name = \"Router\";\n\t::mmx::addr_t mmx_usd_swap_addr;\n\tstd::string metalsdev_api_key;\n\t\n\ttypedef ::vnx::Module Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x289d7651582d76a3ull;\n\t\n\tNodeBase(const std::string& _vnx_name);\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const NodeBase& _value);\n\tfriend std::istream& operator>>(std::istream& _in, NodeBase& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tusing Super::handle;\n\t\n\tvirtual std::shared_ptr<const ::mmx::ChainParams> get_params() const = 0;\n\tvirtual std::shared_ptr<const ::mmx::NetworkInfo> get_network_info() const = 0;\n\tvirtual ::mmx::hash_t get_genesis_hash() const = 0;\n\tvirtual uint32_t get_height() const = 0;\n\tvirtual uint32_t get_vdf_height() const = 0;\n\tvirtual vnx::optional<uint32_t> get_synced_height() const = 0;\n\tvirtual vnx::optional<uint32_t> get_synced_vdf_height() const = 0;\n\tvirtual ::mmx::hash_t get_vdf_peak() const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Block> get_block(const ::mmx::hash_t& hash) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Block> get_block_at(const uint32_t& height) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::BlockHeader> get_header(const ::mmx::hash_t& hash) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::BlockHeader> get_header_at(const uint32_t& height) const = 0;\n\tvirtual vnx::optional<::mmx::hash_t> get_block_hash(const uint32_t& height) const = 0;\n\tvirtual vnx::optional<std::pair<::mmx::hash_t, ::mmx::hash_t>> get_block_hash_ex(const uint32_t& height) const = 0;\n\tvirtual vnx::optional<uint32_t> get_tx_height(const ::mmx::hash_t& id) const = 0;\n\tvirtual vnx::optional<::mmx::tx_info_t> get_tx_info(const ::mmx::hash_t& id) const = 0;\n\tvirtual vnx::optional<::mmx::tx_info_t> get_tx_info_for(std::shared_ptr<const ::mmx::Transaction> tx) const = 0;\n\tvirtual std::vector<::mmx::hash_t> get_tx_ids(const uint32_t& limit) const = 0;\n\tvirtual std::vector<::mmx::hash_t> get_tx_ids_at(const uint32_t& height) const = 0;\n\tvirtual std::vector<::mmx::hash_t> get_tx_ids_since(const uint32_t& height) const = 0;\n\tvirtual ::mmx::exec_result_t validate(std::shared_ptr<const ::mmx::Transaction> tx) const = 0;\n\tvirtual void add_block(std::shared_ptr<const ::mmx::Block> block) = 0;\n\tvirtual void add_transaction(std::shared_ptr<const ::mmx::Transaction> tx, const vnx::bool_t& pre_validate) = 0;\n\tvirtual std::shared_ptr<const ::mmx::Contract> get_contract(const ::mmx::addr_t& address) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Contract> get_contract_for(const ::mmx::addr_t& address) const = 0;\n\tvirtual std::vector<std::shared_ptr<const ::mmx::Contract>> get_contracts(const std::vector<::mmx::addr_t>& addresses) const = 0;\n\tvirtual std::vector<::mmx::addr_t> get_contracts_by(const std::vector<::mmx::addr_t>& addresses, const vnx::optional<::mmx::hash_t>& type_hash) const = 0;\n\tvirtual std::vector<::mmx::addr_t> get_contracts_owned_by(const std::vector<::mmx::addr_t>& addresses, const vnx::optional<::mmx::hash_t>& type_hash) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> get_transaction(const ::mmx::hash_t& id, const vnx::bool_t& pending) const = 0;\n\tvirtual std::vector<std::shared_ptr<const ::mmx::Transaction>> get_transactions(const std::vector<::mmx::hash_t>& ids) const = 0;\n\tvirtual std::vector<::mmx::tx_entry_t> get_history(const std::vector<::mmx::addr_t>& addresses, const ::mmx::query_filter_t& filter) const = 0;\n\tvirtual std::vector<::mmx::tx_entry_t> get_history_memo(const std::vector<::mmx::addr_t>& addresses, const std::string& memo, const ::mmx::query_filter_t& filter) const = 0;\n\tvirtual ::mmx::uint128 get_balance(const ::mmx::addr_t& address, const ::mmx::addr_t& currency) const = 0;\n\tvirtual std::map<::mmx::addr_t, ::mmx::uint128> get_balances(const ::mmx::addr_t& address, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit) const = 0;\n\tvirtual std::map<::mmx::addr_t, ::mmx::balance_t> get_contract_balances(const ::mmx::addr_t& address, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit) const = 0;\n\tvirtual ::mmx::uint128 get_total_balance(const std::vector<::mmx::addr_t>& addresses, const ::mmx::addr_t& currency) const = 0;\n\tvirtual std::map<::mmx::addr_t, ::mmx::uint128> get_total_balances(const std::vector<::mmx::addr_t>& addresses, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit) const = 0;\n\tvirtual std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128> get_all_balances(const std::vector<::mmx::addr_t>& addresses, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit) const = 0;\n\tvirtual std::vector<::mmx::exec_entry_t> get_exec_history(const ::mmx::addr_t& address, const int32_t& limit, const vnx::bool_t& recent) const = 0;\n\tvirtual std::map<std::string, ::mmx::vm::varptr_t> read_storage(const ::mmx::addr_t& contract, const uint32_t& height) const = 0;\n\tvirtual std::map<uint64_t, ::mmx::vm::varptr_t> dump_storage(const ::mmx::addr_t& contract, const uint32_t& height) const = 0;\n\tvirtual ::mmx::vm::varptr_t read_storage_var(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height) const = 0;\n\tvirtual ::mmx::vm::varptr_t read_storage_entry_var(const ::mmx::addr_t& contract, const uint64_t& address, const uint64_t& key, const uint32_t& height) const = 0;\n\tvirtual std::pair<::mmx::vm::varptr_t, uint64_t> read_storage_field(const ::mmx::addr_t& contract, const std::string& name, const uint32_t& height) const = 0;\n\tvirtual std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t> read_storage_entry_addr(const ::mmx::addr_t& contract, const std::string& name, const ::mmx::addr_t& key, const uint32_t& height) const = 0;\n\tvirtual std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t> read_storage_entry_string(const ::mmx::addr_t& contract, const std::string& name, const std::string& key, const uint32_t& height) const = 0;\n\tvirtual std::vector<::mmx::vm::varptr_t> read_storage_array(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height) const = 0;\n\tvirtual std::map<::mmx::vm::varptr_t, ::mmx::vm::varptr_t> read_storage_map(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height) const = 0;\n\tvirtual std::map<std::string, ::mmx::vm::varptr_t> read_storage_object(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height) const = 0;\n\tvirtual ::vnx::Variant call_contract(const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const vnx::optional<::mmx::addr_t>& user, const vnx::optional<std::pair<::mmx::addr_t, ::mmx::uint128>>& deposit) const = 0;\n\tvirtual vnx::optional<::mmx::plot_nft_info_t> get_plot_nft_info(const ::mmx::addr_t& address) const = 0;\n\tvirtual ::mmx::addr_t get_plot_nft_target(const ::mmx::addr_t& address, const vnx::optional<::mmx::addr_t>& farmer_addr) const = 0;\n\tvirtual ::mmx::offer_data_t get_offer(const ::mmx::addr_t& address) const = 0;\n\tvirtual std::vector<::mmx::offer_data_t> get_offers(const uint32_t& since, const vnx::bool_t& state) const = 0;\n\tvirtual std::vector<::mmx::offer_data_t> get_offers_by(const std::vector<::mmx::addr_t>& owners, const vnx::bool_t& state) const = 0;\n\tvirtual std::vector<::mmx::offer_data_t> fetch_offers(const std::vector<::mmx::addr_t>& addresses, const vnx::bool_t& state, const vnx::bool_t& closed) const = 0;\n\tvirtual std::vector<::mmx::offer_data_t> get_recent_offers(const int32_t& limit, const vnx::bool_t& state) const = 0;\n\tvirtual std::vector<::mmx::offer_data_t> get_recent_offers_for(const vnx::optional<::mmx::addr_t>& bid, const vnx::optional<::mmx::addr_t>& ask, const ::mmx::uint128& min_bid, const int32_t& limit, const vnx::bool_t& state) const = 0;\n\tvirtual std::vector<::mmx::trade_entry_t> get_trade_history(const int32_t& limit, const uint32_t& since) const = 0;\n\tvirtual std::vector<::mmx::trade_entry_t> get_trade_history_for(const vnx::optional<::mmx::addr_t>& bid, const vnx::optional<::mmx::addr_t>& ask, const int32_t& limit, const uint32_t& since) const = 0;\n\tvirtual std::vector<::mmx::swap_info_t> get_swaps(const uint32_t& since, const vnx::optional<::mmx::addr_t>& token, const vnx::optional<::mmx::addr_t>& currency, const int32_t& limit) const = 0;\n\tvirtual ::mmx::swap_info_t get_swap_info(const ::mmx::addr_t& address) const = 0;\n\tvirtual ::mmx::swap_user_info_t get_swap_user_info(const ::mmx::addr_t& address, const ::mmx::addr_t& user) const = 0;\n\tvirtual std::vector<::mmx::swap_entry_t> get_swap_history(const ::mmx::addr_t& address, const int32_t& limit) const = 0;\n\tvirtual std::array<::mmx::uint128, 2> get_swap_trade_estimate(const ::mmx::addr_t& address, const uint32_t& i, const ::mmx::uint128& amount, const int32_t& num_iter) const = 0;\n\tvirtual std::array<::mmx::uint128, 2> get_swap_fees_earned(const ::mmx::addr_t& address, const ::mmx::addr_t& user) const = 0;\n\tvirtual std::array<::mmx::uint128, 2> get_swap_equivalent_liquidity(const ::mmx::addr_t& address, const ::mmx::addr_t& user) const = 0;\n\tvirtual std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>> get_swap_liquidity_by(const std::vector<::mmx::addr_t>& addresses) const = 0;\n\tvirtual ::mmx::uint128 get_total_supply(const ::mmx::addr_t& currency) const = 0;\n\tvirtual std::vector<std::shared_ptr<const ::mmx::BlockHeader>> get_farmed_blocks(const std::vector<::mmx::pubkey_t>& farmer_keys, const vnx::bool_t& full_blocks, const uint32_t& since, const int32_t& limit) const = 0;\n\tvirtual ::mmx::farmed_block_summary_t get_farmed_block_summary(const std::vector<::mmx::pubkey_t>& farmer_keys, const uint32_t& since) const = 0;\n\tvirtual std::vector<std::pair<::mmx::pubkey_t, uint32_t>> get_farmer_ranking(const int32_t& limit) const = 0;\n\tvirtual std::tuple<::mmx::pooling_error_e, std::string> verify_plot_nft_target(const ::mmx::addr_t& address, const ::mmx::addr_t& pool_target) const = 0;\n\tvirtual std::tuple<::mmx::pooling_error_e, std::string> verify_partial(std::shared_ptr<const ::mmx::Partial> partial, const vnx::optional<::mmx::addr_t>& pool_target) const = 0;\n\tvirtual void start_sync(const vnx::bool_t& force) = 0;\n\tvirtual void revert_sync(const uint32_t& height) = 0;\n\tvirtual void handle(std::shared_ptr<const ::mmx::Block> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::Transaction> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::ProofOfTime> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::ProofResponse> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::VDF_Point> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::ValidatorVote> _value) {}\n\tvirtual void http_request_async(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const vnx::request_id_t& _request_id) const = 0;\n\tvoid http_request_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpResponse>& _ret_0) const;\n\tvirtual void http_request_chunk_async(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& _request_id) const = 0;\n\tvoid http_request_chunk_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpData>& _ret_0) const;\n\t\n\tvoid vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) override;\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) override;\n\t\n};\n\ntemplate<typename T>\nvoid NodeBase::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<NodeBase>(50);\n\t_visitor.type_field(\"input_vdfs\", 0); _visitor.accept(input_vdfs);\n\t_visitor.type_field(\"input_votes\", 1); _visitor.accept(input_votes);\n\t_visitor.type_field(\"input_proof\", 2); _visitor.accept(input_proof);\n\t_visitor.type_field(\"input_blocks\", 3); _visitor.accept(input_blocks);\n\t_visitor.type_field(\"input_transactions\", 4); _visitor.accept(input_transactions);\n\t_visitor.type_field(\"input_timelord_vdfs\", 5); _visitor.accept(input_timelord_vdfs);\n\t_visitor.type_field(\"input_harvester_proof\", 6); _visitor.accept(input_harvester_proof);\n\t_visitor.type_field(\"input_vdf_points\", 7); _visitor.accept(input_vdf_points);\n\t_visitor.type_field(\"output_verified_vdfs\", 8); _visitor.accept(output_verified_vdfs);\n\t_visitor.type_field(\"output_verified_votes\", 9); _visitor.accept(output_verified_votes);\n\t_visitor.type_field(\"output_verified_proof\", 10); _visitor.accept(output_verified_proof);\n\t_visitor.type_field(\"output_verified_blocks\", 11); _visitor.accept(output_verified_blocks);\n\t_visitor.type_field(\"output_verified_transactions\", 12); _visitor.accept(output_verified_transactions);\n\t_visitor.type_field(\"output_committed_blocks\", 13); _visitor.accept(output_committed_blocks);\n\t_visitor.type_field(\"output_transactions\", 14); _visitor.accept(output_transactions);\n\t_visitor.type_field(\"output_interval_request\", 15); _visitor.accept(output_interval_request);\n\t_visitor.type_field(\"output_challenges\", 16); _visitor.accept(output_challenges);\n\t_visitor.type_field(\"output_vdf_points\", 17); _visitor.accept(output_vdf_points);\n\t_visitor.type_field(\"output_votes\", 18); _visitor.accept(output_votes);\n\t_visitor.type_field(\"max_queue_ms\", 19); _visitor.accept(max_queue_ms);\n\t_visitor.type_field(\"update_interval_ms\", 20); _visitor.accept(update_interval_ms);\n\t_visitor.type_field(\"validate_interval_ms\", 21); _visitor.accept(validate_interval_ms);\n\t_visitor.type_field(\"sync_loss_delay\", 22); _visitor.accept(sync_loss_delay);\n\t_visitor.type_field(\"max_history\", 23); _visitor.accept(max_history);\n\t_visitor.type_field(\"max_tx_pool\", 24); _visitor.accept(max_tx_pool);\n\t_visitor.type_field(\"max_tx_queue\", 25); _visitor.accept(max_tx_queue);\n\t_visitor.type_field(\"max_sync_jobs\", 26); _visitor.accept(max_sync_jobs);\n\t_visitor.type_field(\"max_sync_ahead\", 27); _visitor.accept(max_sync_ahead);\n\t_visitor.type_field(\"num_sync_retries\", 28); _visitor.accept(num_sync_retries);\n\t_visitor.type_field(\"revert_height\", 29); _visitor.accept(revert_height);\n\t_visitor.type_field(\"num_threads\", 30); _visitor.accept(num_threads);\n\t_visitor.type_field(\"num_db_threads\", 31); _visitor.accept(num_db_threads);\n\t_visitor.type_field(\"num_api_threads\", 32); _visitor.accept(num_api_threads);\n\t_visitor.type_field(\"commit_threshold\", 33); _visitor.accept(commit_threshold);\n\t_visitor.type_field(\"max_future_sync\", 34); _visitor.accept(max_future_sync);\n\t_visitor.type_field(\"max_vdf_verify_pending\", 35); _visitor.accept(max_vdf_verify_pending);\n\t_visitor.type_field(\"opencl_device\", 36); _visitor.accept(opencl_device);\n\t_visitor.type_field(\"opencl_device_name\", 37); _visitor.accept(opencl_device_name);\n\t_visitor.type_field(\"do_sync\", 38); _visitor.accept(do_sync);\n\t_visitor.type_field(\"show_warnings\", 39); _visitor.accept(show_warnings);\n\t_visitor.type_field(\"vdf_slave_mode\", 40); _visitor.accept(vdf_slave_mode);\n\t_visitor.type_field(\"run_tests\", 41); _visitor.accept(run_tests);\n\t_visitor.type_field(\"exec_debug\", 42); _visitor.accept(exec_debug);\n\t_visitor.type_field(\"exec_profile\", 43); _visitor.accept(exec_profile);\n\t_visitor.type_field(\"exec_trace\", 44); _visitor.accept(exec_trace);\n\t_visitor.type_field(\"storage_path\", 45); _visitor.accept(storage_path);\n\t_visitor.type_field(\"database_path\", 46); _visitor.accept(database_path);\n\t_visitor.type_field(\"router_name\", 47); _visitor.accept(router_name);\n\t_visitor.type_field(\"mmx_usd_swap_addr\", 48); _visitor.accept(mmx_usd_swap_addr);\n\t_visitor.type_field(\"metalsdev_api_key\", 49); _visitor.accept(metalsdev_api_key);\n\t_visitor.template type_end<NodeBase>(50);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_NodeBase_HXX_\n"
  },
  {
    "path": "generated/include/mmx/NodeClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_CLIENT_HXX_\n#define INCLUDE_mmx_Node_CLIENT_HXX_\n\n#include <vnx/Client.h>\n#include <mmx/Block.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/NetworkInfo.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/exec_entry_t.hxx>\n#include <mmx/exec_result_t.hxx>\n#include <mmx/farmed_block_summary_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/plot_nft_info_t.hxx>\n#include <mmx/pooling_error_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/swap_entry_t.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <mmx/swap_user_info_t.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <mmx/uint128.hpp>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass NodeClient : public vnx::Client {\npublic:\n\tNodeClient(const std::string& service_name);\n\t\n\tNodeClient(vnx::Hash64 service_addr);\n\t\n\tstd::shared_ptr<const ::mmx::ChainParams> get_params();\n\t\n\tstd::shared_ptr<const ::mmx::NetworkInfo> get_network_info();\n\t\n\t::mmx::hash_t get_genesis_hash();\n\t\n\tuint32_t get_height();\n\t\n\tuint32_t get_vdf_height();\n\t\n\tvnx::optional<uint32_t> get_synced_height();\n\t\n\tvnx::optional<uint32_t> get_synced_vdf_height();\n\t\n\t::mmx::hash_t get_vdf_peak();\n\t\n\tstd::shared_ptr<const ::mmx::Block> get_block(const ::mmx::hash_t& hash = ::mmx::hash_t());\n\t\n\tstd::shared_ptr<const ::mmx::Block> get_block_at(const uint32_t& height = 0);\n\t\n\tstd::shared_ptr<const ::mmx::BlockHeader> get_header(const ::mmx::hash_t& hash = ::mmx::hash_t());\n\t\n\tstd::shared_ptr<const ::mmx::BlockHeader> get_header_at(const uint32_t& height = 0);\n\t\n\tvnx::optional<::mmx::hash_t> get_block_hash(const uint32_t& height = 0);\n\t\n\tvnx::optional<std::pair<::mmx::hash_t, ::mmx::hash_t>> get_block_hash_ex(const uint32_t& height = 0);\n\t\n\tvnx::optional<uint32_t> get_tx_height(const ::mmx::hash_t& id = ::mmx::hash_t());\n\t\n\tvnx::optional<::mmx::tx_info_t> get_tx_info(const ::mmx::hash_t& id = ::mmx::hash_t());\n\t\n\tvnx::optional<::mmx::tx_info_t> get_tx_info_for(std::shared_ptr<const ::mmx::Transaction> tx = nullptr);\n\t\n\tstd::vector<::mmx::hash_t> get_tx_ids(const uint32_t& limit = 0);\n\t\n\tstd::vector<::mmx::hash_t> get_tx_ids_at(const uint32_t& height = 0);\n\t\n\tstd::vector<::mmx::hash_t> get_tx_ids_since(const uint32_t& height = 0);\n\t\n\t::mmx::exec_result_t validate(std::shared_ptr<const ::mmx::Transaction> tx = nullptr);\n\t\n\tvoid add_block(std::shared_ptr<const ::mmx::Block> block = nullptr);\n\t\n\tvoid add_block_async(std::shared_ptr<const ::mmx::Block> block = nullptr);\n\t\n\tvoid add_transaction(std::shared_ptr<const ::mmx::Transaction> tx = nullptr, const vnx::bool_t& pre_validate = 0);\n\t\n\tvoid add_transaction_async(std::shared_ptr<const ::mmx::Transaction> tx = nullptr, const vnx::bool_t& pre_validate = 0);\n\t\n\tstd::shared_ptr<const ::mmx::Contract> get_contract(const ::mmx::addr_t& address = ::mmx::addr_t());\n\t\n\tstd::shared_ptr<const ::mmx::Contract> get_contract_for(const ::mmx::addr_t& address = ::mmx::addr_t());\n\t\n\tstd::vector<std::shared_ptr<const ::mmx::Contract>> get_contracts(const std::vector<::mmx::addr_t>& addresses = {});\n\t\n\tstd::vector<::mmx::addr_t> get_contracts_by(const std::vector<::mmx::addr_t>& addresses = {}, const vnx::optional<::mmx::hash_t>& type_hash = nullptr);\n\t\n\tstd::vector<::mmx::addr_t> get_contracts_owned_by(const std::vector<::mmx::addr_t>& addresses = {}, const vnx::optional<::mmx::hash_t>& type_hash = nullptr);\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> get_transaction(const ::mmx::hash_t& id = ::mmx::hash_t(), const vnx::bool_t& pending = 0);\n\t\n\tstd::vector<std::shared_ptr<const ::mmx::Transaction>> get_transactions(const std::vector<::mmx::hash_t>& ids = {});\n\t\n\tstd::vector<::mmx::tx_entry_t> get_history(const std::vector<::mmx::addr_t>& addresses = {}, const ::mmx::query_filter_t& filter = ::mmx::query_filter_t());\n\t\n\tstd::vector<::mmx::tx_entry_t> get_history_memo(const std::vector<::mmx::addr_t>& addresses = {}, const std::string& memo = \"\", const ::mmx::query_filter_t& filter = ::mmx::query_filter_t());\n\t\n\t::mmx::uint128 get_balance(const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::addr_t& currency = ::mmx::addr_t());\n\t\n\tstd::map<::mmx::addr_t, ::mmx::uint128> get_balances(const ::mmx::addr_t& address = ::mmx::addr_t(), const std::set<::mmx::addr_t>& whitelist = {}, const int32_t& limit = 100);\n\t\n\tstd::map<::mmx::addr_t, ::mmx::balance_t> get_contract_balances(const ::mmx::addr_t& address = ::mmx::addr_t(), const std::set<::mmx::addr_t>& whitelist = {}, const int32_t& limit = 100);\n\t\n\t::mmx::uint128 get_total_balance(const std::vector<::mmx::addr_t>& addresses = {}, const ::mmx::addr_t& currency = ::mmx::addr_t());\n\t\n\tstd::map<::mmx::addr_t, ::mmx::uint128> get_total_balances(const std::vector<::mmx::addr_t>& addresses = {}, const std::set<::mmx::addr_t>& whitelist = {}, const int32_t& limit = 100);\n\t\n\tstd::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128> get_all_balances(const std::vector<::mmx::addr_t>& addresses = {}, const std::set<::mmx::addr_t>& whitelist = {}, const int32_t& limit = 100);\n\t\n\tstd::vector<::mmx::exec_entry_t> get_exec_history(const ::mmx::addr_t& address = ::mmx::addr_t(), const int32_t& limit = 100, const vnx::bool_t& recent = 0);\n\t\n\tstd::map<std::string, ::mmx::vm::varptr_t> read_storage(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint32_t& height = -1);\n\t\n\tstd::map<uint64_t, ::mmx::vm::varptr_t> dump_storage(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint32_t& height = -1);\n\t\n\t::mmx::vm::varptr_t read_storage_var(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint64_t& address = 0, const uint32_t& height = -1);\n\t\n\t::mmx::vm::varptr_t read_storage_entry_var(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint64_t& address = 0, const uint64_t& key = 0, const uint32_t& height = -1);\n\t\n\tstd::pair<::mmx::vm::varptr_t, uint64_t> read_storage_field(const ::mmx::addr_t& contract = ::mmx::addr_t(), const std::string& name = \"\", const uint32_t& height = -1);\n\t\n\tstd::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t> read_storage_entry_addr(const ::mmx::addr_t& contract = ::mmx::addr_t(), const std::string& name = \"\", const ::mmx::addr_t& key = ::mmx::addr_t(), const uint32_t& height = -1);\n\t\n\tstd::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t> read_storage_entry_string(const ::mmx::addr_t& contract = ::mmx::addr_t(), const std::string& name = \"\", const std::string& key = \"\", const uint32_t& height = -1);\n\t\n\tstd::vector<::mmx::vm::varptr_t> read_storage_array(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint64_t& address = 0, const uint32_t& height = -1);\n\t\n\tstd::map<::mmx::vm::varptr_t, ::mmx::vm::varptr_t> read_storage_map(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint64_t& address = 0, const uint32_t& height = -1);\n\t\n\tstd::map<std::string, ::mmx::vm::varptr_t> read_storage_object(const ::mmx::addr_t& contract = ::mmx::addr_t(), const uint64_t& address = 0, const uint32_t& height = -1);\n\t\n\t::vnx::Variant call_contract(const ::mmx::addr_t& address = ::mmx::addr_t(), const std::string& method = \"\", const std::vector<::vnx::Variant>& args = {}, const vnx::optional<::mmx::addr_t>& user = nullptr, const vnx::optional<std::pair<::mmx::addr_t, ::mmx::uint128>>& deposit = nullptr);\n\t\n\tvnx::optional<::mmx::plot_nft_info_t> get_plot_nft_info(const ::mmx::addr_t& address = ::mmx::addr_t());\n\t\n\t::mmx::addr_t get_plot_nft_target(const ::mmx::addr_t& address = ::mmx::addr_t(), const vnx::optional<::mmx::addr_t>& farmer_addr = nullptr);\n\t\n\t::mmx::offer_data_t get_offer(const ::mmx::addr_t& address = ::mmx::addr_t());\n\t\n\tstd::vector<::mmx::offer_data_t> get_offers(const uint32_t& since = 0, const vnx::bool_t& state = 0);\n\t\n\tstd::vector<::mmx::offer_data_t> get_offers_by(const std::vector<::mmx::addr_t>& owners = {}, const vnx::bool_t& state = 0);\n\t\n\tstd::vector<::mmx::offer_data_t> fetch_offers(const std::vector<::mmx::addr_t>& addresses = {}, const vnx::bool_t& state = 0, const vnx::bool_t& closed = 0);\n\t\n\tstd::vector<::mmx::offer_data_t> get_recent_offers(const int32_t& limit = 100, const vnx::bool_t& state = true);\n\t\n\tstd::vector<::mmx::offer_data_t> get_recent_offers_for(const vnx::optional<::mmx::addr_t>& bid = nullptr, const vnx::optional<::mmx::addr_t>& ask = nullptr, const ::mmx::uint128& min_bid = ::mmx::uint128(), const int32_t& limit = 100, const vnx::bool_t& state = true);\n\t\n\tstd::vector<::mmx::trade_entry_t> get_trade_history(const int32_t& limit = 100, const uint32_t& since = 0);\n\t\n\tstd::vector<::mmx::trade_entry_t> get_trade_history_for(const vnx::optional<::mmx::addr_t>& bid = nullptr, const vnx::optional<::mmx::addr_t>& ask = nullptr, const int32_t& limit = 100, const uint32_t& since = 0);\n\t\n\tstd::vector<::mmx::swap_info_t> get_swaps(const uint32_t& since = 0, const vnx::optional<::mmx::addr_t>& token = nullptr, const vnx::optional<::mmx::addr_t>& currency = nullptr, const int32_t& limit = 100);\n\t\n\t::mmx::swap_info_t get_swap_info(const ::mmx::addr_t& address = ::mmx::addr_t());\n\t\n\t::mmx::swap_user_info_t get_swap_user_info(const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::addr_t& user = ::mmx::addr_t());\n\t\n\tstd::vector<::mmx::swap_entry_t> get_swap_history(const ::mmx::addr_t& address = ::mmx::addr_t(), const int32_t& limit = 100);\n\t\n\tstd::array<::mmx::uint128, 2> get_swap_trade_estimate(const ::mmx::addr_t& address = ::mmx::addr_t(), const uint32_t& i = 0, const ::mmx::uint128& amount = ::mmx::uint128(), const int32_t& num_iter = 20);\n\t\n\tstd::array<::mmx::uint128, 2> get_swap_fees_earned(const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::addr_t& user = ::mmx::addr_t());\n\t\n\tstd::array<::mmx::uint128, 2> get_swap_equivalent_liquidity(const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::addr_t& user = ::mmx::addr_t());\n\t\n\tstd::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>> get_swap_liquidity_by(const std::vector<::mmx::addr_t>& addresses = {});\n\t\n\t::mmx::uint128 get_total_supply(const ::mmx::addr_t& currency = ::mmx::addr_t());\n\t\n\tstd::vector<std::shared_ptr<const ::mmx::BlockHeader>> get_farmed_blocks(const std::vector<::mmx::pubkey_t>& farmer_keys = {}, const vnx::bool_t& full_blocks = 0, const uint32_t& since = 0, const int32_t& limit = 100);\n\t\n\t::mmx::farmed_block_summary_t get_farmed_block_summary(const std::vector<::mmx::pubkey_t>& farmer_keys = {}, const uint32_t& since = 0);\n\t\n\tstd::vector<std::pair<::mmx::pubkey_t, uint32_t>> get_farmer_ranking(const int32_t& limit = -1);\n\t\n\tstd::tuple<::mmx::pooling_error_e, std::string> verify_plot_nft_target(const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::addr_t& pool_target = ::mmx::addr_t());\n\t\n\tstd::tuple<::mmx::pooling_error_e, std::string> verify_partial(std::shared_ptr<const ::mmx::Partial> partial = nullptr, const vnx::optional<::mmx::addr_t>& pool_target = nullptr);\n\t\n\tvoid start_sync(const vnx::bool_t& force = 0);\n\t\n\tvoid start_sync_async(const vnx::bool_t& force = 0);\n\t\n\tvoid revert_sync(const uint32_t& height = 0);\n\t\n\tvoid revert_sync_async(const uint32_t& height = 0);\n\t\n\tstd::shared_ptr<const ::vnx::addons::HttpResponse> http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\");\n\t\n\tstd::shared_ptr<const ::vnx::addons::HttpData> http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", const int64_t& offset = 0, const int64_t& max_bytes = 0);\n\t\n\t::vnx::Object vnx_get_config_object();\n\t\n\t::vnx::Variant vnx_get_config(const std::string& name = \"\");\n\t\n\tvoid vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config_object_async(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\tvoid vnx_set_config_async(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\t::vnx::TypeCode vnx_get_type_code();\n\t\n\tstd::shared_ptr<const ::vnx::ModuleInfo> vnx_get_module_info();\n\t\n\tvoid vnx_restart();\n\t\n\tvoid vnx_restart_async();\n\t\n\tvoid vnx_stop();\n\t\n\tvoid vnx_stop_async();\n\t\n\tvnx::bool_t vnx_self_test();\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_Node_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_add_block.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_add_block_HXX_\n#define INCLUDE_mmx_Node_add_block_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Block.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_add_block : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Block> block;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x63abca4d23f93894ull;\n\t\n\tNode_add_block() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_add_block> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_add_block& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_add_block& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_add_block::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_add_block>(1);\n\t_visitor.type_field(\"block\", 0); _visitor.accept(block);\n\t_visitor.template type_end<Node_add_block>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_add_block_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_add_block_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_add_block_return_HXX_\n#define INCLUDE_mmx_Node_add_block_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_add_block_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb6d1115db03a6d6aull;\n\t\n\tNode_add_block_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_add_block_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_add_block_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_add_block_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_add_block_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_add_block_return>(0);\n\t_visitor.template type_end<Node_add_block_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_add_block_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_add_transaction.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_add_transaction_HXX_\n#define INCLUDE_mmx_Node_add_transaction_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_add_transaction : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> tx;\n\tvnx::bool_t pre_validate = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd9782531c0e3f766ull;\n\t\n\tNode_add_transaction() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_add_transaction> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_add_transaction& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_add_transaction& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_add_transaction::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_add_transaction>(2);\n\t_visitor.type_field(\"tx\", 0); _visitor.accept(tx);\n\t_visitor.type_field(\"pre_validate\", 1); _visitor.accept(pre_validate);\n\t_visitor.template type_end<Node_add_transaction>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_add_transaction_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_add_transaction_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_add_transaction_return_HXX_\n#define INCLUDE_mmx_Node_add_transaction_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_add_transaction_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x2ded8c10e1721ba8ull;\n\t\n\tNode_add_transaction_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_add_transaction_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_add_transaction_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_add_transaction_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_add_transaction_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_add_transaction_return>(0);\n\t_visitor.template type_end<Node_add_transaction_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_add_transaction_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_call_contract.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_call_contract_HXX_\n#define INCLUDE_mmx_Node_call_contract_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_call_contract : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\tstd::string method;\n\tstd::vector<::vnx::Variant> args;\n\tvnx::optional<::mmx::addr_t> user;\n\tvnx::optional<std::pair<::mmx::addr_t, ::mmx::uint128>> deposit;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6a21b0dfe3e541e8ull;\n\t\n\tNode_call_contract() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_call_contract> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_call_contract& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_call_contract& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_call_contract::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_call_contract>(5);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"method\", 1); _visitor.accept(method);\n\t_visitor.type_field(\"args\", 2); _visitor.accept(args);\n\t_visitor.type_field(\"user\", 3); _visitor.accept(user);\n\t_visitor.type_field(\"deposit\", 4); _visitor.accept(deposit);\n\t_visitor.template type_end<Node_call_contract>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_call_contract_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_call_contract_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_call_contract_return_HXX_\n#define INCLUDE_mmx_Node_call_contract_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_call_contract_return : public ::vnx::Value {\npublic:\n\t\n\t::vnx::Variant _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8449f6656a89f7aeull;\n\t\n\tNode_call_contract_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_call_contract_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_call_contract_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_call_contract_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_call_contract_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_call_contract_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_call_contract_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_call_contract_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_dump_storage.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_dump_storage_HXX_\n#define INCLUDE_mmx_Node_dump_storage_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_dump_storage : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t contract;\n\tuint32_t height = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8b66a712eea839bbull;\n\t\n\tNode_dump_storage() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_dump_storage> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_dump_storage& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_dump_storage& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_dump_storage::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_dump_storage>(2);\n\t_visitor.type_field(\"contract\", 0); _visitor.accept(contract);\n\t_visitor.type_field(\"height\", 1); _visitor.accept(height);\n\t_visitor.template type_end<Node_dump_storage>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_dump_storage_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_dump_storage_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_dump_storage_return_HXX_\n#define INCLUDE_mmx_Node_dump_storage_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_dump_storage_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<uint64_t, ::mmx::vm::varptr_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xbc8c0b1ce37def41ull;\n\t\n\tNode_dump_storage_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_dump_storage_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_dump_storage_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_dump_storage_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_dump_storage_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_dump_storage_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_dump_storage_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_dump_storage_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_fetch_offers.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_fetch_offers_HXX_\n#define INCLUDE_mmx_Node_fetch_offers_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_fetch_offers : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\tvnx::bool_t state = 0;\n\tvnx::bool_t closed = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xfca08ee41b997129ull;\n\t\n\tNode_fetch_offers() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_fetch_offers> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_fetch_offers& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_fetch_offers& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_fetch_offers::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_fetch_offers>(3);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.type_field(\"state\", 1); _visitor.accept(state);\n\t_visitor.type_field(\"closed\", 2); _visitor.accept(closed);\n\t_visitor.template type_end<Node_fetch_offers>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_fetch_offers_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_fetch_offers_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_fetch_offers_return_HXX_\n#define INCLUDE_mmx_Node_fetch_offers_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_fetch_offers_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::offer_data_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8c5cc826b759938bull;\n\t\n\tNode_fetch_offers_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_fetch_offers_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_fetch_offers_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_fetch_offers_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_fetch_offers_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_fetch_offers_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_fetch_offers_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_fetch_offers_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_all_balances.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_all_balances_HXX_\n#define INCLUDE_mmx_Node_get_all_balances_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_all_balances : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\tstd::set<::mmx::addr_t> whitelist;\n\tint32_t limit = 100;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe099ac5aea49433ull;\n\t\n\tNode_get_all_balances() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_all_balances> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_all_balances& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_all_balances& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_all_balances::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_all_balances>(3);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.type_field(\"whitelist\", 1); _visitor.accept(whitelist);\n\t_visitor.type_field(\"limit\", 2); _visitor.accept(limit);\n\t_visitor.template type_end<Node_get_all_balances>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_all_balances_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_all_balances_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_all_balances_return_HXX_\n#define INCLUDE_mmx_Node_get_all_balances_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_all_balances_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x80800e710295b3c1ull;\n\t\n\tNode_get_all_balances_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_all_balances_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_all_balances_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_all_balances_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_all_balances_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_all_balances_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_all_balances_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_all_balances_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_balance.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_balance_HXX_\n#define INCLUDE_mmx_Node_get_balance_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_balance : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t::mmx::addr_t currency;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x2e00172d0470479ull;\n\t\n\tNode_get_balance() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_balance> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_balance& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_balance& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_balance::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_balance>(2);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"currency\", 1); _visitor.accept(currency);\n\t_visitor.template type_end<Node_get_balance>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_balance_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_balance_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_balance_return_HXX_\n#define INCLUDE_mmx_Node_get_balance_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_balance_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::uint128 _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe29d98f8f1ab3e21ull;\n\t\n\tNode_get_balance_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_balance_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_balance_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_balance_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_balance_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_balance_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_balance_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_balance_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_balances.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_balances_HXX_\n#define INCLUDE_mmx_Node_get_balances_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_balances : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\tstd::set<::mmx::addr_t> whitelist;\n\tint32_t limit = 100;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1c8af02c41e96460ull;\n\t\n\tNode_get_balances() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_balances> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_balances& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_balances& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_balances::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_balances>(3);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"whitelist\", 1); _visitor.accept(whitelist);\n\t_visitor.type_field(\"limit\", 2); _visitor.accept(limit);\n\t_visitor.template type_end<Node_get_balances>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_balances_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_balances_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_balances_return_HXX_\n#define INCLUDE_mmx_Node_get_balances_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_balances_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::addr_t, ::mmx::uint128> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1e00f02ae6304cf0ull;\n\t\n\tNode_get_balances_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_balances_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_balances_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_balances_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_balances_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_balances_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_balances_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_balances_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_block.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_block_HXX_\n#define INCLUDE_mmx_Node_get_block_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_block : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t hash;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xeb3fabe56dec161aull;\n\t\n\tNode_get_block() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_block> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_block& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_block& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_block::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_block>(1);\n\t_visitor.type_field(\"hash\", 0); _visitor.accept(hash);\n\t_visitor.template type_end<Node_get_block>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_block_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_block_at.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_block_at_HXX_\n#define INCLUDE_mmx_Node_get_block_at_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_block_at : public ::vnx::Value {\npublic:\n\t\n\tuint32_t height = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc69c9f876a00e48full;\n\t\n\tNode_get_block_at() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_block_at> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_block_at& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_block_at& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_block_at::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_block_at>(1);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.template type_end<Node_get_block_at>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_block_at_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_block_at_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_block_at_return_HXX_\n#define INCLUDE_mmx_Node_get_block_at_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Block.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_block_at_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Block> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6e3c22a7391c5491ull;\n\t\n\tNode_get_block_at_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_block_at_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_block_at_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_block_at_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_block_at_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_block_at_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_block_at_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_block_at_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_block_hash.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_block_hash_HXX_\n#define INCLUDE_mmx_Node_get_block_hash_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_block_hash : public ::vnx::Value {\npublic:\n\t\n\tuint32_t height = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x43c5087066b73f38ull;\n\t\n\tNode_get_block_hash() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_block_hash> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_block_hash& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_block_hash& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_block_hash::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_block_hash>(1);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.template type_end<Node_get_block_hash>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_block_hash_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_block_hash_ex.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_block_hash_ex_HXX_\n#define INCLUDE_mmx_Node_get_block_hash_ex_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_block_hash_ex : public ::vnx::Value {\npublic:\n\t\n\tuint32_t height = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6024ae54abca18cbull;\n\t\n\tNode_get_block_hash_ex() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_block_hash_ex> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_block_hash_ex& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_block_hash_ex& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_block_hash_ex::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_block_hash_ex>(1);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.template type_end<Node_get_block_hash_ex>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_block_hash_ex_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_block_hash_ex_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_block_hash_ex_return_HXX_\n#define INCLUDE_mmx_Node_get_block_hash_ex_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_block_hash_ex_return : public ::vnx::Value {\npublic:\n\t\n\tvnx::optional<std::pair<::mmx::hash_t, ::mmx::hash_t>> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8d82a7b11dfd7a4ull;\n\t\n\tNode_get_block_hash_ex_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_block_hash_ex_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_block_hash_ex_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_block_hash_ex_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_block_hash_ex_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_block_hash_ex_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_block_hash_ex_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_block_hash_ex_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_block_hash_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_block_hash_return_HXX_\n#define INCLUDE_mmx_Node_get_block_hash_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_block_hash_return : public ::vnx::Value {\npublic:\n\t\n\tvnx::optional<::mmx::hash_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x47877c5597b978dfull;\n\t\n\tNode_get_block_hash_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_block_hash_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_block_hash_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_block_hash_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_block_hash_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_block_hash_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_block_hash_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_block_hash_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_block_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_block_return_HXX_\n#define INCLUDE_mmx_Node_get_block_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Block.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_block_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Block> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6d9abdbf20c4b4d2ull;\n\t\n\tNode_get_block_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_block_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_block_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_block_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_block_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_block_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_block_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_block_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contract.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contract_HXX_\n#define INCLUDE_mmx_Node_get_contract_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contract : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xa28704c65a67a293ull;\n\t\n\tNode_get_contract() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contract> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contract& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contract& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contract::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contract>(1);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.template type_end<Node_get_contract>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contract_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contract_balances.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contract_balances_HXX_\n#define INCLUDE_mmx_Node_get_contract_balances_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contract_balances : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\tstd::set<::mmx::addr_t> whitelist;\n\tint32_t limit = 100;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xeb1e66155927b13aull;\n\t\n\tNode_get_contract_balances() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contract_balances> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contract_balances& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contract_balances& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contract_balances::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contract_balances>(3);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"whitelist\", 1); _visitor.accept(whitelist);\n\t_visitor.type_field(\"limit\", 2); _visitor.accept(limit);\n\t_visitor.template type_end<Node_get_contract_balances>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contract_balances_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contract_balances_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contract_balances_return_HXX_\n#define INCLUDE_mmx_Node_get_contract_balances_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contract_balances_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::addr_t, ::mmx::balance_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4974c6093398e264ull;\n\t\n\tNode_get_contract_balances_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contract_balances_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contract_balances_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contract_balances_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contract_balances_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contract_balances_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_contract_balances_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contract_balances_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contract_for.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contract_for_HXX_\n#define INCLUDE_mmx_Node_get_contract_for_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contract_for : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6a953dcea83b9832ull;\n\t\n\tNode_get_contract_for() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contract_for> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contract_for& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contract_for& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contract_for::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contract_for>(1);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.template type_end<Node_get_contract_for>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contract_for_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contract_for_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contract_for_return_HXX_\n#define INCLUDE_mmx_Node_get_contract_for_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Contract.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contract_for_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Contract> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xde97319367a6d647ull;\n\t\n\tNode_get_contract_for_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contract_for_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contract_for_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contract_for_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contract_for_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contract_for_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_contract_for_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contract_for_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contract_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contract_return_HXX_\n#define INCLUDE_mmx_Node_get_contract_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Contract.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contract_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Contract> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x314d0901de362f8cull;\n\t\n\tNode_get_contract_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contract_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contract_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contract_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contract_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contract_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_contract_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contract_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contracts.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contracts_HXX_\n#define INCLUDE_mmx_Node_get_contracts_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contracts : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x49e218583c1f1c8aull;\n\t\n\tNode_get_contracts() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contracts> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contracts& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contracts& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contracts::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contracts>(1);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.template type_end<Node_get_contracts>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contracts_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contracts_by.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contracts_by_HXX_\n#define INCLUDE_mmx_Node_get_contracts_by_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contracts_by : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\tvnx::optional<::mmx::hash_t> type_hash;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe7c397362a63f57cull;\n\t\n\tNode_get_contracts_by() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contracts_by> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contracts_by& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contracts_by& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contracts_by::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contracts_by>(2);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.type_field(\"type_hash\", 1); _visitor.accept(type_hash);\n\t_visitor.template type_end<Node_get_contracts_by>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contracts_by_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contracts_by_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contracts_by_return_HXX_\n#define INCLUDE_mmx_Node_get_contracts_by_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contracts_by_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9ad1099f1adf2565ull;\n\t\n\tNode_get_contracts_by_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contracts_by_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contracts_by_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contracts_by_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contracts_by_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contracts_by_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_contracts_by_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contracts_by_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contracts_owned_by.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contracts_owned_by_HXX_\n#define INCLUDE_mmx_Node_get_contracts_owned_by_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contracts_owned_by : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\tvnx::optional<::mmx::hash_t> type_hash;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x63989a04fee2fba4ull;\n\t\n\tNode_get_contracts_owned_by() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contracts_owned_by> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contracts_owned_by& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contracts_owned_by& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contracts_owned_by::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contracts_owned_by>(2);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.type_field(\"type_hash\", 1); _visitor.accept(type_hash);\n\t_visitor.template type_end<Node_get_contracts_owned_by>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contracts_owned_by_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contracts_owned_by_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contracts_owned_by_return_HXX_\n#define INCLUDE_mmx_Node_get_contracts_owned_by_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contracts_owned_by_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3b9dbec85ee482bfull;\n\t\n\tNode_get_contracts_owned_by_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contracts_owned_by_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contracts_owned_by_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contracts_owned_by_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contracts_owned_by_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contracts_owned_by_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_contracts_owned_by_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contracts_owned_by_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_contracts_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_contracts_return_HXX_\n#define INCLUDE_mmx_Node_get_contracts_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Contract.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_contracts_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::shared_ptr<const ::mmx::Contract>> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x13d73d6d69c8af0bull;\n\t\n\tNode_get_contracts_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_contracts_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_contracts_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_contracts_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_contracts_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_contracts_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_contracts_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_contracts_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_exec_history.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_exec_history_HXX_\n#define INCLUDE_mmx_Node_get_exec_history_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_exec_history : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\tint32_t limit = 100;\n\tvnx::bool_t recent = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf17c2f67bedb9df6ull;\n\t\n\tNode_get_exec_history() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_exec_history> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_exec_history& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_exec_history& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_exec_history::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_exec_history>(3);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"limit\", 1); _visitor.accept(limit);\n\t_visitor.type_field(\"recent\", 2); _visitor.accept(recent);\n\t_visitor.template type_end<Node_get_exec_history>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_exec_history_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_exec_history_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_exec_history_return_HXX_\n#define INCLUDE_mmx_Node_get_exec_history_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/exec_entry_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_exec_history_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::exec_entry_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x17079d265ede8785ull;\n\t\n\tNode_get_exec_history_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_exec_history_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_exec_history_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_exec_history_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_exec_history_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_exec_history_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_exec_history_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_exec_history_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_farmed_block_summary.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_farmed_block_summary_HXX_\n#define INCLUDE_mmx_Node_get_farmed_block_summary_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_farmed_block_summary : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::pubkey_t> farmer_keys;\n\tuint32_t since = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xa6cda1247bd4f537ull;\n\t\n\tNode_get_farmed_block_summary() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_farmed_block_summary> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_farmed_block_summary& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_farmed_block_summary& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_farmed_block_summary::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_farmed_block_summary>(2);\n\t_visitor.type_field(\"farmer_keys\", 0); _visitor.accept(farmer_keys);\n\t_visitor.type_field(\"since\", 1); _visitor.accept(since);\n\t_visitor.template type_end<Node_get_farmed_block_summary>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_farmed_block_summary_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_farmed_block_summary_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_farmed_block_summary_return_HXX_\n#define INCLUDE_mmx_Node_get_farmed_block_summary_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/farmed_block_summary_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_farmed_block_summary_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::farmed_block_summary_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xef3dcd5d4d2a58e3ull;\n\t\n\tNode_get_farmed_block_summary_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_farmed_block_summary_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_farmed_block_summary_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_farmed_block_summary_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_farmed_block_summary_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_farmed_block_summary_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_farmed_block_summary_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_farmed_block_summary_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_farmed_blocks.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_farmed_blocks_HXX_\n#define INCLUDE_mmx_Node_get_farmed_blocks_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_farmed_blocks : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::pubkey_t> farmer_keys;\n\tvnx::bool_t full_blocks = 0;\n\tuint32_t since = 0;\n\tint32_t limit = 100;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xfc412d06ff25542eull;\n\t\n\tNode_get_farmed_blocks() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_farmed_blocks> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_farmed_blocks& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_farmed_blocks& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_farmed_blocks::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_farmed_blocks>(4);\n\t_visitor.type_field(\"farmer_keys\", 0); _visitor.accept(farmer_keys);\n\t_visitor.type_field(\"full_blocks\", 1); _visitor.accept(full_blocks);\n\t_visitor.type_field(\"since\", 2); _visitor.accept(since);\n\t_visitor.type_field(\"limit\", 3); _visitor.accept(limit);\n\t_visitor.template type_end<Node_get_farmed_blocks>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_farmed_blocks_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_farmed_blocks_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_farmed_blocks_return_HXX_\n#define INCLUDE_mmx_Node_get_farmed_blocks_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_farmed_blocks_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::shared_ptr<const ::mmx::BlockHeader>> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe8697ffd381616baull;\n\t\n\tNode_get_farmed_blocks_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_farmed_blocks_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_farmed_blocks_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_farmed_blocks_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_farmed_blocks_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_farmed_blocks_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_farmed_blocks_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_farmed_blocks_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_farmer_ranking.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_farmer_ranking_HXX_\n#define INCLUDE_mmx_Node_get_farmer_ranking_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_farmer_ranking : public ::vnx::Value {\npublic:\n\t\n\tint32_t limit = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x548d571d6384bd43ull;\n\t\n\tNode_get_farmer_ranking() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_farmer_ranking> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_farmer_ranking& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_farmer_ranking& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_farmer_ranking::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_farmer_ranking>(1);\n\t_visitor.type_field(\"limit\", 0); _visitor.accept(limit);\n\t_visitor.template type_end<Node_get_farmer_ranking>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_farmer_ranking_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_farmer_ranking_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_farmer_ranking_return_HXX_\n#define INCLUDE_mmx_Node_get_farmer_ranking_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_farmer_ranking_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::pair<::mmx::pubkey_t, uint32_t>> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb74e7f1a70a60ecdull;\n\t\n\tNode_get_farmer_ranking_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_farmer_ranking_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_farmer_ranking_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_farmer_ranking_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_farmer_ranking_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_farmer_ranking_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_farmer_ranking_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_farmer_ranking_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_genesis_hash.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_genesis_hash_HXX_\n#define INCLUDE_mmx_Node_get_genesis_hash_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_genesis_hash : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xbfab786cb64c5a3ull;\n\t\n\tNode_get_genesis_hash() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_genesis_hash> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_genesis_hash& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_genesis_hash& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_genesis_hash::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_genesis_hash>(0);\n\t_visitor.template type_end<Node_get_genesis_hash>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_genesis_hash_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_genesis_hash_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_genesis_hash_return_HXX_\n#define INCLUDE_mmx_Node_get_genesis_hash_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_genesis_hash_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5c5ea53e3163fd5ull;\n\t\n\tNode_get_genesis_hash_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_genesis_hash_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_genesis_hash_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_genesis_hash_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_genesis_hash_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_genesis_hash_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_genesis_hash_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_genesis_hash_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_header.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_header_HXX_\n#define INCLUDE_mmx_Node_get_header_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_header : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t hash;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf17a5d0c180db198ull;\n\t\n\tNode_get_header() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_header> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_header& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_header& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_header::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_header>(1);\n\t_visitor.type_field(\"hash\", 0); _visitor.accept(hash);\n\t_visitor.template type_end<Node_get_header>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_header_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_header_at.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_header_at_HXX_\n#define INCLUDE_mmx_Node_get_header_at_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_header_at : public ::vnx::Value {\npublic:\n\t\n\tuint32_t height = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x52658163d8767c79ull;\n\t\n\tNode_get_header_at() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_header_at> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_header_at& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_header_at& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_header_at::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_header_at>(1);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.template type_end<Node_get_header_at>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_header_at_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_header_at_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_header_at_return_HXX_\n#define INCLUDE_mmx_Node_get_header_at_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_header_at_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::BlockHeader> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4efc6897885ee521ull;\n\t\n\tNode_get_header_at_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_header_at_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_header_at_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_header_at_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_header_at_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_header_at_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_header_at_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_header_at_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_header_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_header_return_HXX_\n#define INCLUDE_mmx_Node_get_header_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_header_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::BlockHeader> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xeffae31958103da7ull;\n\t\n\tNode_get_header_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_header_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_header_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_header_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_header_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_header_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_header_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_header_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_height.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_height_HXX_\n#define INCLUDE_mmx_Node_get_height_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_height : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x55f0d4ef7a117716ull;\n\t\n\tNode_get_height() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_height> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_height& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_height& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_height::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_height>(0);\n\t_visitor.template type_end<Node_get_height>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_height_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_height_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_height_return_HXX_\n#define INCLUDE_mmx_Node_get_height_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_height_return : public ::vnx::Value {\npublic:\n\t\n\tuint32_t _ret_0 = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5fb0ff1e11add033ull;\n\t\n\tNode_get_height_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_height_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_height_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_height_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_height_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_height_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_height_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_height_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_history.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_history_HXX_\n#define INCLUDE_mmx_Node_get_history_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_history : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\t::mmx::query_filter_t filter;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8b3db05c6e91011dull;\n\t\n\tNode_get_history() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_history> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_history& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_history& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_history::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_history>(2);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.type_field(\"filter\", 1); _visitor.accept(filter);\n\t_visitor.template type_end<Node_get_history>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_history_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_history_memo.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_history_memo_HXX_\n#define INCLUDE_mmx_Node_get_history_memo_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_history_memo : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\tstd::string memo;\n\t::mmx::query_filter_t filter;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x693c0c791039287cull;\n\t\n\tNode_get_history_memo() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_history_memo> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_history_memo& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_history_memo& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_history_memo::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_history_memo>(3);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.type_field(\"memo\", 1); _visitor.accept(memo);\n\t_visitor.type_field(\"filter\", 2); _visitor.accept(filter);\n\t_visitor.template type_end<Node_get_history_memo>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_history_memo_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_history_memo_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_history_memo_return_HXX_\n#define INCLUDE_mmx_Node_get_history_memo_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_history_memo_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::tx_entry_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3bba2b40c2e82885ull;\n\t\n\tNode_get_history_memo_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_history_memo_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_history_memo_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_history_memo_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_history_memo_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_history_memo_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_history_memo_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_history_memo_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_history_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_history_return_HXX_\n#define INCLUDE_mmx_Node_get_history_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_history_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::tx_entry_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xa925b7aa92603121ull;\n\t\n\tNode_get_history_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_history_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_history_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_history_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_history_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_history_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_history_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_history_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_network_info.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_network_info_HXX_\n#define INCLUDE_mmx_Node_get_network_info_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_network_info : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x79cedc8662eeb2e4ull;\n\t\n\tNode_get_network_info() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_network_info> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_network_info& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_network_info& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_network_info::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_network_info>(0);\n\t_visitor.template type_end<Node_get_network_info>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_network_info_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_network_info_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_network_info_return_HXX_\n#define INCLUDE_mmx_Node_get_network_info_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/NetworkInfo.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_network_info_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::NetworkInfo> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x28541acc5945ae0eull;\n\t\n\tNode_get_network_info_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_network_info_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_network_info_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_network_info_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_network_info_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_network_info_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_network_info_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_network_info_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_offer.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_offer_HXX_\n#define INCLUDE_mmx_Node_get_offer_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_offer : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd3e336e279686563ull;\n\t\n\tNode_get_offer() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_offer> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_offer& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_offer& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_offer::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_offer>(1);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.template type_end<Node_get_offer>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_offer_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_offer_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_offer_return_HXX_\n#define INCLUDE_mmx_Node_get_offer_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_offer_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::offer_data_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xa92bb7b910e3424full;\n\t\n\tNode_get_offer_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_offer_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_offer_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_offer_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_offer_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_offer_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_offer_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_offer_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_offers.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_offers_HXX_\n#define INCLUDE_mmx_Node_get_offers_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_offers : public ::vnx::Value {\npublic:\n\t\n\tuint32_t since = 0;\n\tvnx::bool_t state = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x62e5e37dd72d3175ull;\n\t\n\tNode_get_offers() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_offers> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_offers& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_offers& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_offers::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_offers>(2);\n\t_visitor.type_field(\"since\", 0); _visitor.accept(since);\n\t_visitor.type_field(\"state\", 1); _visitor.accept(state);\n\t_visitor.template type_end<Node_get_offers>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_offers_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_offers_by.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_offers_by_HXX_\n#define INCLUDE_mmx_Node_get_offers_by_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_offers_by : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> owners;\n\tvnx::bool_t state = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf83c55f59e407411ull;\n\t\n\tNode_get_offers_by() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_offers_by> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_offers_by& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_offers_by& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_offers_by::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_offers_by>(2);\n\t_visitor.type_field(\"owners\", 0); _visitor.accept(owners);\n\t_visitor.type_field(\"state\", 1); _visitor.accept(state);\n\t_visitor.template type_end<Node_get_offers_by>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_offers_by_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_offers_by_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_offers_by_return_HXX_\n#define INCLUDE_mmx_Node_get_offers_by_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_offers_by_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::offer_data_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x59efe1350028d6f4ull;\n\t\n\tNode_get_offers_by_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_offers_by_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_offers_by_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_offers_by_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_offers_by_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_offers_by_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_offers_by_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_offers_by_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_offers_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_offers_return_HXX_\n#define INCLUDE_mmx_Node_get_offers_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_offers_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::offer_data_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf93f5d6546a50db1ull;\n\t\n\tNode_get_offers_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_offers_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_offers_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_offers_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_offers_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_offers_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_offers_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_offers_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_params.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_params_HXX_\n#define INCLUDE_mmx_Node_get_params_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_params : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6384b34900c2e465ull;\n\t\n\tNode_get_params() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_params> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_params& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_params& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_params::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_params>(0);\n\t_visitor.template type_end<Node_get_params>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_params_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_params_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_params_return_HXX_\n#define INCLUDE_mmx_Node_get_params_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_params_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::ChainParams> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd0a614f2ed037180ull;\n\t\n\tNode_get_params_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_params_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_params_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_params_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_params_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_params_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_params_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_params_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_plot_nft_info.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_plot_nft_info_HXX_\n#define INCLUDE_mmx_Node_get_plot_nft_info_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_plot_nft_info : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x23efbfd355a3741full;\n\t\n\tNode_get_plot_nft_info() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_plot_nft_info> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_plot_nft_info& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_plot_nft_info& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_plot_nft_info::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_plot_nft_info>(1);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.template type_end<Node_get_plot_nft_info>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_plot_nft_info_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_plot_nft_info_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_plot_nft_info_return_HXX_\n#define INCLUDE_mmx_Node_get_plot_nft_info_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/plot_nft_info_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_plot_nft_info_return : public ::vnx::Value {\npublic:\n\t\n\tvnx::optional<::mmx::plot_nft_info_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4d3661c719d8496bull;\n\t\n\tNode_get_plot_nft_info_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_plot_nft_info_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_plot_nft_info_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_plot_nft_info_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_plot_nft_info_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_plot_nft_info_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_plot_nft_info_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_plot_nft_info_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_plot_nft_target.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_plot_nft_target_HXX_\n#define INCLUDE_mmx_Node_get_plot_nft_target_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_plot_nft_target : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\tvnx::optional<::mmx::addr_t> farmer_addr;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x14dfd6e2b1f3282eull;\n\t\n\tNode_get_plot_nft_target() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_plot_nft_target> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_plot_nft_target& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_plot_nft_target& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_plot_nft_target::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_plot_nft_target>(2);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"farmer_addr\", 1); _visitor.accept(farmer_addr);\n\t_visitor.template type_end<Node_get_plot_nft_target>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_plot_nft_target_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_plot_nft_target_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_plot_nft_target_return_HXX_\n#define INCLUDE_mmx_Node_get_plot_nft_target_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_plot_nft_target_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6d6444fd1b89732ull;\n\t\n\tNode_get_plot_nft_target_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_plot_nft_target_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_plot_nft_target_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_plot_nft_target_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_plot_nft_target_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_plot_nft_target_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_plot_nft_target_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_plot_nft_target_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_recent_offers.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_recent_offers_HXX_\n#define INCLUDE_mmx_Node_get_recent_offers_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_recent_offers : public ::vnx::Value {\npublic:\n\t\n\tint32_t limit = 100;\n\tvnx::bool_t state = true;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xfcd729efd0504fdeull;\n\t\n\tNode_get_recent_offers() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_recent_offers> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_recent_offers& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_recent_offers& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_recent_offers::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_recent_offers>(2);\n\t_visitor.type_field(\"limit\", 0); _visitor.accept(limit);\n\t_visitor.type_field(\"state\", 1); _visitor.accept(state);\n\t_visitor.template type_end<Node_get_recent_offers>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_recent_offers_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_recent_offers_for.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_recent_offers_for_HXX_\n#define INCLUDE_mmx_Node_get_recent_offers_for_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_recent_offers_for : public ::vnx::Value {\npublic:\n\t\n\tvnx::optional<::mmx::addr_t> bid;\n\tvnx::optional<::mmx::addr_t> ask;\n\t::mmx::uint128 min_bid;\n\tint32_t limit = 100;\n\tvnx::bool_t state = true;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd89f845556eb17a0ull;\n\t\n\tNode_get_recent_offers_for() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_recent_offers_for> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_recent_offers_for& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_recent_offers_for& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_recent_offers_for::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_recent_offers_for>(5);\n\t_visitor.type_field(\"bid\", 0); _visitor.accept(bid);\n\t_visitor.type_field(\"ask\", 1); _visitor.accept(ask);\n\t_visitor.type_field(\"min_bid\", 2); _visitor.accept(min_bid);\n\t_visitor.type_field(\"limit\", 3); _visitor.accept(limit);\n\t_visitor.type_field(\"state\", 4); _visitor.accept(state);\n\t_visitor.template type_end<Node_get_recent_offers_for>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_recent_offers_for_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_recent_offers_for_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_recent_offers_for_return_HXX_\n#define INCLUDE_mmx_Node_get_recent_offers_for_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_recent_offers_for_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::offer_data_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8fbaa054b954ea7bull;\n\t\n\tNode_get_recent_offers_for_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_recent_offers_for_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_recent_offers_for_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_recent_offers_for_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_recent_offers_for_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_recent_offers_for_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_recent_offers_for_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_recent_offers_for_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_recent_offers_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_recent_offers_return_HXX_\n#define INCLUDE_mmx_Node_get_recent_offers_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_recent_offers_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::offer_data_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x15933813d284d584ull;\n\t\n\tNode_get_recent_offers_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_recent_offers_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_recent_offers_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_recent_offers_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_recent_offers_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_recent_offers_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_recent_offers_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_recent_offers_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_equivalent_liquidity.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_equivalent_liquidity_HXX_\n#define INCLUDE_mmx_Node_get_swap_equivalent_liquidity_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_equivalent_liquidity : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t::mmx::addr_t user;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc43a3083725aa480ull;\n\t\n\tNode_get_swap_equivalent_liquidity() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_equivalent_liquidity> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_equivalent_liquidity& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_equivalent_liquidity& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_equivalent_liquidity::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_equivalent_liquidity>(2);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"user\", 1); _visitor.accept(user);\n\t_visitor.template type_end<Node_get_swap_equivalent_liquidity>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_equivalent_liquidity_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_equivalent_liquidity_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_equivalent_liquidity_return_HXX_\n#define INCLUDE_mmx_Node_get_swap_equivalent_liquidity_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_equivalent_liquidity_return : public ::vnx::Value {\npublic:\n\t\n\tstd::array<::mmx::uint128, 2> _ret_0 = {};\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8222183b679ab5f4ull;\n\t\n\tNode_get_swap_equivalent_liquidity_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_equivalent_liquidity_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_equivalent_liquidity_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_equivalent_liquidity_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_equivalent_liquidity_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_equivalent_liquidity_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_swap_equivalent_liquidity_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_equivalent_liquidity_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_fees_earned.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_fees_earned_HXX_\n#define INCLUDE_mmx_Node_get_swap_fees_earned_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_fees_earned : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t::mmx::addr_t user;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1dae57fb82265b93ull;\n\t\n\tNode_get_swap_fees_earned() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_fees_earned> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_fees_earned& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_fees_earned& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_fees_earned::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_fees_earned>(2);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"user\", 1); _visitor.accept(user);\n\t_visitor.template type_end<Node_get_swap_fees_earned>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_fees_earned_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_fees_earned_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_fees_earned_return_HXX_\n#define INCLUDE_mmx_Node_get_swap_fees_earned_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_fees_earned_return : public ::vnx::Value {\npublic:\n\t\n\tstd::array<::mmx::uint128, 2> _ret_0 = {};\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x57002afc89a8db98ull;\n\t\n\tNode_get_swap_fees_earned_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_fees_earned_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_fees_earned_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_fees_earned_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_fees_earned_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_fees_earned_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_swap_fees_earned_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_fees_earned_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_history.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_history_HXX_\n#define INCLUDE_mmx_Node_get_swap_history_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_history : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\tint32_t limit = 100;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc16faaf15fcc9f36ull;\n\t\n\tNode_get_swap_history() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_history> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_history& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_history& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_history::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_history>(2);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"limit\", 1); _visitor.accept(limit);\n\t_visitor.template type_end<Node_get_swap_history>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_history_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_history_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_history_return_HXX_\n#define INCLUDE_mmx_Node_get_swap_history_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/swap_entry_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_history_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::swap_entry_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe5d18002a6793518ull;\n\t\n\tNode_get_swap_history_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_history_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_history_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_history_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_history_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_history_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_swap_history_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_history_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_info.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_info_HXX_\n#define INCLUDE_mmx_Node_get_swap_info_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_info : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x14f546a807fae18cull;\n\t\n\tNode_get_swap_info() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_info> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_info& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_info& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_info::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_info>(1);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.template type_end<Node_get_swap_info>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_info_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_info_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_info_return_HXX_\n#define INCLUDE_mmx_Node_get_swap_info_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_info_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::swap_info_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x302116742171428ull;\n\t\n\tNode_get_swap_info_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_info_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_info_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_info_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_info_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_info_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_swap_info_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_info_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_liquidity_by.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_liquidity_by_HXX_\n#define INCLUDE_mmx_Node_get_swap_liquidity_by_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_liquidity_by : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x426cded100da751eull;\n\t\n\tNode_get_swap_liquidity_by() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_liquidity_by> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_liquidity_by& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_liquidity_by& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_liquidity_by::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_liquidity_by>(1);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.template type_end<Node_get_swap_liquidity_by>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_liquidity_by_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_liquidity_by_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_liquidity_by_return_HXX_\n#define INCLUDE_mmx_Node_get_swap_liquidity_by_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_liquidity_by_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8401973e1930a6c0ull;\n\t\n\tNode_get_swap_liquidity_by_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_liquidity_by_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_liquidity_by_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_liquidity_by_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_liquidity_by_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_liquidity_by_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_swap_liquidity_by_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_liquidity_by_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_trade_estimate.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_trade_estimate_HXX_\n#define INCLUDE_mmx_Node_get_swap_trade_estimate_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_trade_estimate : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\tuint32_t i = 0;\n\t::mmx::uint128 amount;\n\tint32_t num_iter = 20;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1c3d2e0c3a431e9eull;\n\t\n\tNode_get_swap_trade_estimate() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_trade_estimate> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_trade_estimate& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_trade_estimate& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_trade_estimate::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_trade_estimate>(4);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"i\", 1); _visitor.accept(i);\n\t_visitor.type_field(\"amount\", 2); _visitor.accept(amount);\n\t_visitor.type_field(\"num_iter\", 3); _visitor.accept(num_iter);\n\t_visitor.template type_end<Node_get_swap_trade_estimate>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_trade_estimate_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_trade_estimate_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_trade_estimate_return_HXX_\n#define INCLUDE_mmx_Node_get_swap_trade_estimate_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_trade_estimate_return : public ::vnx::Value {\npublic:\n\t\n\tstd::array<::mmx::uint128, 2> _ret_0 = {};\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xdad9da7cd6d250a8ull;\n\t\n\tNode_get_swap_trade_estimate_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_trade_estimate_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_trade_estimate_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_trade_estimate_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_trade_estimate_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_trade_estimate_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_swap_trade_estimate_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_trade_estimate_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_user_info.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_user_info_HXX_\n#define INCLUDE_mmx_Node_get_swap_user_info_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_user_info : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t::mmx::addr_t user;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb92b8fb7df56ec0full;\n\t\n\tNode_get_swap_user_info() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_user_info> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_user_info& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_user_info& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_user_info::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_user_info>(2);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"user\", 1); _visitor.accept(user);\n\t_visitor.template type_end<Node_get_swap_user_info>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_user_info_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swap_user_info_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swap_user_info_return_HXX_\n#define INCLUDE_mmx_Node_get_swap_user_info_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/swap_user_info_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swap_user_info_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::swap_user_info_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x50fb0bab9551a420ull;\n\t\n\tNode_get_swap_user_info_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swap_user_info_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swap_user_info_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swap_user_info_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swap_user_info_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swap_user_info_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_swap_user_info_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swap_user_info_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swaps.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swaps_HXX_\n#define INCLUDE_mmx_Node_get_swaps_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swaps : public ::vnx::Value {\npublic:\n\t\n\tuint32_t since = 0;\n\tvnx::optional<::mmx::addr_t> token;\n\tvnx::optional<::mmx::addr_t> currency;\n\tint32_t limit = 100;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x219bbb3e5dcd19eaull;\n\t\n\tNode_get_swaps() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swaps> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swaps& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swaps& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swaps::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swaps>(4);\n\t_visitor.type_field(\"since\", 0); _visitor.accept(since);\n\t_visitor.type_field(\"token\", 1); _visitor.accept(token);\n\t_visitor.type_field(\"currency\", 2); _visitor.accept(currency);\n\t_visitor.type_field(\"limit\", 3); _visitor.accept(limit);\n\t_visitor.template type_end<Node_get_swaps>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swaps_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_swaps_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_swaps_return_HXX_\n#define INCLUDE_mmx_Node_get_swaps_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_swaps_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::swap_info_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6c94172788fc0d28ull;\n\t\n\tNode_get_swaps_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_swaps_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_swaps_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_swaps_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_swaps_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_swaps_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_swaps_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_swaps_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_synced_height.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_synced_height_HXX_\n#define INCLUDE_mmx_Node_get_synced_height_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_synced_height : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc4fb44ec3d1a8bb7ull;\n\t\n\tNode_get_synced_height() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_synced_height> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_synced_height& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_synced_height& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_synced_height::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_synced_height>(0);\n\t_visitor.template type_end<Node_get_synced_height>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_synced_height_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_synced_height_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_synced_height_return_HXX_\n#define INCLUDE_mmx_Node_get_synced_height_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_synced_height_return : public ::vnx::Value {\npublic:\n\t\n\tvnx::optional<uint32_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd466ce92d1bbe9dbull;\n\t\n\tNode_get_synced_height_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_synced_height_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_synced_height_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_synced_height_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_synced_height_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_synced_height_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_synced_height_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_synced_height_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_synced_vdf_height.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_synced_vdf_height_HXX_\n#define INCLUDE_mmx_Node_get_synced_vdf_height_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_synced_vdf_height : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3c9ce92abd3b42c6ull;\n\t\n\tNode_get_synced_vdf_height() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_synced_vdf_height> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_synced_vdf_height& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_synced_vdf_height& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_synced_vdf_height::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_synced_vdf_height>(0);\n\t_visitor.template type_end<Node_get_synced_vdf_height>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_synced_vdf_height_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_synced_vdf_height_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_synced_vdf_height_return_HXX_\n#define INCLUDE_mmx_Node_get_synced_vdf_height_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_synced_vdf_height_return : public ::vnx::Value {\npublic:\n\t\n\tvnx::optional<uint32_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1122764a35c86b4ull;\n\t\n\tNode_get_synced_vdf_height_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_synced_vdf_height_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_synced_vdf_height_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_synced_vdf_height_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_synced_vdf_height_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_synced_vdf_height_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_synced_vdf_height_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_synced_vdf_height_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_total_balance.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_total_balance_HXX_\n#define INCLUDE_mmx_Node_get_total_balance_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_total_balance : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\t::mmx::addr_t currency;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x91e9019d224db4b0ull;\n\t\n\tNode_get_total_balance() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_total_balance> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_total_balance& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_total_balance& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_total_balance::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_total_balance>(2);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.type_field(\"currency\", 1); _visitor.accept(currency);\n\t_visitor.template type_end<Node_get_total_balance>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_total_balance_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_total_balance_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_total_balance_return_HXX_\n#define INCLUDE_mmx_Node_get_total_balance_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_total_balance_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::uint128 _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3336380a894f52a8ull;\n\t\n\tNode_get_total_balance_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_total_balance_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_total_balance_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_total_balance_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_total_balance_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_total_balance_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_total_balance_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_total_balance_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_total_balances.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_total_balances_HXX_\n#define INCLUDE_mmx_Node_get_total_balances_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_total_balances : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\tstd::set<::mmx::addr_t> whitelist;\n\tint32_t limit = 100;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf54c4ec46ee6053aull;\n\t\n\tNode_get_total_balances() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_total_balances> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_total_balances& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_total_balances& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_total_balances::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_total_balances>(3);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.type_field(\"whitelist\", 1); _visitor.accept(whitelist);\n\t_visitor.type_field(\"limit\", 2); _visitor.accept(limit);\n\t_visitor.template type_end<Node_get_total_balances>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_total_balances_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_total_balances_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_total_balances_return_HXX_\n#define INCLUDE_mmx_Node_get_total_balances_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_total_balances_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::addr_t, ::mmx::uint128> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9332c7a83f7644d7ull;\n\t\n\tNode_get_total_balances_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_total_balances_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_total_balances_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_total_balances_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_total_balances_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_total_balances_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_total_balances_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_total_balances_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_total_supply.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_total_supply_HXX_\n#define INCLUDE_mmx_Node_get_total_supply_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_total_supply : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t currency;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x17d971db6900bd9dull;\n\t\n\tNode_get_total_supply() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_total_supply> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_total_supply& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_total_supply& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_total_supply::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_total_supply>(1);\n\t_visitor.type_field(\"currency\", 0); _visitor.accept(currency);\n\t_visitor.template type_end<Node_get_total_supply>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_total_supply_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_total_supply_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_total_supply_return_HXX_\n#define INCLUDE_mmx_Node_get_total_supply_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_total_supply_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::uint128 _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe69f15a0766eaf27ull;\n\t\n\tNode_get_total_supply_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_total_supply_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_total_supply_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_total_supply_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_total_supply_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_total_supply_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_total_supply_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_total_supply_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_trade_history.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_trade_history_HXX_\n#define INCLUDE_mmx_Node_get_trade_history_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_trade_history : public ::vnx::Value {\npublic:\n\t\n\tint32_t limit = 100;\n\tuint32_t since = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x62736b035e3995cdull;\n\t\n\tNode_get_trade_history() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_trade_history> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_trade_history& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_trade_history& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_trade_history::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_trade_history>(2);\n\t_visitor.type_field(\"limit\", 0); _visitor.accept(limit);\n\t_visitor.type_field(\"since\", 1); _visitor.accept(since);\n\t_visitor.template type_end<Node_get_trade_history>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_trade_history_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_trade_history_for.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_trade_history_for_HXX_\n#define INCLUDE_mmx_Node_get_trade_history_for_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_trade_history_for : public ::vnx::Value {\npublic:\n\t\n\tvnx::optional<::mmx::addr_t> bid;\n\tvnx::optional<::mmx::addr_t> ask;\n\tint32_t limit = 100;\n\tuint32_t since = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd55cda633e3dd5b8ull;\n\t\n\tNode_get_trade_history_for() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_trade_history_for> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_trade_history_for& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_trade_history_for& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_trade_history_for::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_trade_history_for>(4);\n\t_visitor.type_field(\"bid\", 0); _visitor.accept(bid);\n\t_visitor.type_field(\"ask\", 1); _visitor.accept(ask);\n\t_visitor.type_field(\"limit\", 2); _visitor.accept(limit);\n\t_visitor.type_field(\"since\", 3); _visitor.accept(since);\n\t_visitor.template type_end<Node_get_trade_history_for>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_trade_history_for_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_trade_history_for_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_trade_history_for_return_HXX_\n#define INCLUDE_mmx_Node_get_trade_history_for_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_trade_history_for_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::trade_entry_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd61154789cdb246bull;\n\t\n\tNode_get_trade_history_for_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_trade_history_for_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_trade_history_for_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_trade_history_for_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_trade_history_for_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_trade_history_for_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_trade_history_for_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_trade_history_for_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_trade_history_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_trade_history_return_HXX_\n#define INCLUDE_mmx_Node_get_trade_history_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_trade_history_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::trade_entry_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4d3692b594dd7f9eull;\n\t\n\tNode_get_trade_history_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_trade_history_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_trade_history_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_trade_history_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_trade_history_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_trade_history_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_trade_history_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_trade_history_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_transaction.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_transaction_HXX_\n#define INCLUDE_mmx_Node_get_transaction_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_transaction : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t id;\n\tvnx::bool_t pending = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9c76ca142292750full;\n\t\n\tNode_get_transaction() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_transaction> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_transaction& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_transaction& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_transaction::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_transaction>(2);\n\t_visitor.type_field(\"id\", 0); _visitor.accept(id);\n\t_visitor.type_field(\"pending\", 1); _visitor.accept(pending);\n\t_visitor.template type_end<Node_get_transaction>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_transaction_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_transaction_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_transaction_return_HXX_\n#define INCLUDE_mmx_Node_get_transaction_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_transaction_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3848f078ff4024dull;\n\t\n\tNode_get_transaction_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_transaction_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_transaction_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_transaction_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_transaction_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_transaction_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_transaction_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_transaction_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_transactions.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_transactions_HXX_\n#define INCLUDE_mmx_Node_get_transactions_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_transactions : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::hash_t> ids;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x715a5bb668426203ull;\n\t\n\tNode_get_transactions() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_transactions> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_transactions& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_transactions& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_transactions::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_transactions>(1);\n\t_visitor.type_field(\"ids\", 0); _visitor.accept(ids);\n\t_visitor.template type_end<Node_get_transactions>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_transactions_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_transactions_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_transactions_return_HXX_\n#define INCLUDE_mmx_Node_get_transactions_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_transactions_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::shared_ptr<const ::mmx::Transaction>> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd11c40a507abaaaull;\n\t\n\tNode_get_transactions_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_transactions_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_transactions_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_transactions_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_transactions_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_transactions_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_transactions_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_transactions_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_height.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_height_HXX_\n#define INCLUDE_mmx_Node_get_tx_height_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_height : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t id;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf6f917fad9361e3aull;\n\t\n\tNode_get_tx_height() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_height> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_height& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_height& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_height::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_height>(1);\n\t_visitor.type_field(\"id\", 0); _visitor.accept(id);\n\t_visitor.template type_end<Node_get_tx_height>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_height_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_height_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_height_return_HXX_\n#define INCLUDE_mmx_Node_get_tx_height_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_height_return : public ::vnx::Value {\npublic:\n\t\n\tvnx::optional<uint32_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xda69a0d06f4b5c3eull;\n\t\n\tNode_get_tx_height_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_height_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_height_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_height_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_height_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_height_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_tx_height_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_height_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_ids.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_ids_HXX_\n#define INCLUDE_mmx_Node_get_tx_ids_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_ids : public ::vnx::Value {\npublic:\n\t\n\tuint32_t limit = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe268e5bf2a7f22d6ull;\n\t\n\tNode_get_tx_ids() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_ids> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_ids& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_ids::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_ids>(1);\n\t_visitor.type_field(\"limit\", 0); _visitor.accept(limit);\n\t_visitor.template type_end<Node_get_tx_ids>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_ids_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_ids_at.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_ids_at_HXX_\n#define INCLUDE_mmx_Node_get_tx_ids_at_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_ids_at : public ::vnx::Value {\npublic:\n\t\n\tuint32_t height = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x904c686b59c101c3ull;\n\t\n\tNode_get_tx_ids_at() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_ids_at> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids_at& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_ids_at& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_ids_at::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_ids_at>(1);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.template type_end<Node_get_tx_ids_at>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_ids_at_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_ids_at_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_ids_at_return_HXX_\n#define INCLUDE_mmx_Node_get_tx_ids_at_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_ids_at_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::hash_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x945565d9cbfadc31ull;\n\t\n\tNode_get_tx_ids_at_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_ids_at_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids_at_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_ids_at_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_ids_at_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_ids_at_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_tx_ids_at_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_ids_at_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_ids_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_ids_return_HXX_\n#define INCLUDE_mmx_Node_get_tx_ids_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_ids_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::hash_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xba3ffcf776e64920ull;\n\t\n\tNode_get_tx_ids_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_ids_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_ids_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_ids_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_ids_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_tx_ids_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_ids_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_ids_since.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_ids_since_HXX_\n#define INCLUDE_mmx_Node_get_tx_ids_since_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_ids_since : public ::vnx::Value {\npublic:\n\t\n\tuint32_t height = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x640af36b555e1606ull;\n\t\n\tNode_get_tx_ids_since() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_ids_since> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids_since& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_ids_since& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_ids_since::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_ids_since>(1);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.template type_end<Node_get_tx_ids_since>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_ids_since_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_ids_since_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_ids_since_return_HXX_\n#define INCLUDE_mmx_Node_get_tx_ids_since_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_ids_since_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::hash_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe5c1511a48d2d288ull;\n\t\n\tNode_get_tx_ids_since_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_ids_since_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids_since_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_ids_since_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_ids_since_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_ids_since_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_tx_ids_since_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_ids_since_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_info.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_info_HXX_\n#define INCLUDE_mmx_Node_get_tx_info_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_info : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t id;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb5409a3aaa19d1d2ull;\n\t\n\tNode_get_tx_info() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_info> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_info& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_info& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_info::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_info>(1);\n\t_visitor.type_field(\"id\", 0); _visitor.accept(id);\n\t_visitor.template type_end<Node_get_tx_info>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_info_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_info_for.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_info_for_HXX_\n#define INCLUDE_mmx_Node_get_tx_info_for_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_info_for : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> tx;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xba1c6e6eccfe9369ull;\n\t\n\tNode_get_tx_info_for() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_info_for> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_info_for& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_info_for& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_info_for::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_info_for>(1);\n\t_visitor.type_field(\"tx\", 0); _visitor.accept(tx);\n\t_visitor.template type_end<Node_get_tx_info_for>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_info_for_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_info_for_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_info_for_return_HXX_\n#define INCLUDE_mmx_Node_get_tx_info_for_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_info_for_return : public ::vnx::Value {\npublic:\n\t\n\tvnx::optional<::mmx::tx_info_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xfd527dc84681a04ull;\n\t\n\tNode_get_tx_info_for_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_info_for_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_info_for_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_info_for_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_info_for_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_info_for_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_tx_info_for_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_info_for_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_tx_info_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_tx_info_return_HXX_\n#define INCLUDE_mmx_Node_get_tx_info_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_tx_info_return : public ::vnx::Value {\npublic:\n\t\n\tvnx::optional<::mmx::tx_info_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3668f41cc643227full;\n\t\n\tNode_get_tx_info_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_tx_info_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_tx_info_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_tx_info_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_tx_info_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_tx_info_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_tx_info_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_tx_info_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_vdf_height.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_vdf_height_HXX_\n#define INCLUDE_mmx_Node_get_vdf_height_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_vdf_height : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x33db3aa655c4e5feull;\n\t\n\tNode_get_vdf_height() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_vdf_height> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_vdf_height& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_vdf_height& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_vdf_height::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_vdf_height>(0);\n\t_visitor.template type_end<Node_get_vdf_height>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_vdf_height_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_vdf_height_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_vdf_height_return_HXX_\n#define INCLUDE_mmx_Node_get_vdf_height_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_vdf_height_return : public ::vnx::Value {\npublic:\n\t\n\tuint32_t _ret_0 = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5f83cae2903e53bfull;\n\t\n\tNode_get_vdf_height_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_vdf_height_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_vdf_height_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_vdf_height_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_vdf_height_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_vdf_height_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_vdf_height_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_vdf_height_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_vdf_peak.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_vdf_peak_HXX_\n#define INCLUDE_mmx_Node_get_vdf_peak_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_vdf_peak : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf3449b43830283ddull;\n\t\n\tNode_get_vdf_peak() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_vdf_peak> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_vdf_peak& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_vdf_peak& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_vdf_peak::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_vdf_peak>(0);\n\t_visitor.template type_end<Node_get_vdf_peak>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_vdf_peak_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_get_vdf_peak_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_get_vdf_peak_return_HXX_\n#define INCLUDE_mmx_Node_get_vdf_peak_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_get_vdf_peak_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x837f2b6433a274a1ull;\n\t\n\tNode_get_vdf_peak_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_get_vdf_peak_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_get_vdf_peak_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_get_vdf_peak_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_get_vdf_peak_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_get_vdf_peak_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_get_vdf_peak_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_get_vdf_peak_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_HXX_\n#define INCLUDE_mmx_Node_read_storage_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t contract;\n\tuint32_t height = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd74cd2b291cb9cd6ull;\n\t\n\tNode_read_storage() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage>(2);\n\t_visitor.type_field(\"contract\", 0); _visitor.accept(contract);\n\t_visitor.type_field(\"height\", 1); _visitor.accept(height);\n\t_visitor.template type_end<Node_read_storage>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_array.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_array_HXX_\n#define INCLUDE_mmx_Node_read_storage_array_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_array : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t contract;\n\tuint64_t address = 0;\n\tuint32_t height = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe5826950ca0a442bull;\n\t\n\tNode_read_storage_array() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_array> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_array& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_array& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_array::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_array>(3);\n\t_visitor.type_field(\"contract\", 0); _visitor.accept(contract);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"height\", 2); _visitor.accept(height);\n\t_visitor.template type_end<Node_read_storage_array>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_array_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_array_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_array_return_HXX_\n#define INCLUDE_mmx_Node_read_storage_array_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_array_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::vm::varptr_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xba7fed069216454dull;\n\t\n\tNode_read_storage_array_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_array_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_array_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_array_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_array_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_array_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_read_storage_array_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_array_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_entry_addr.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_entry_addr_HXX_\n#define INCLUDE_mmx_Node_read_storage_entry_addr_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_entry_addr : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t contract;\n\tstd::string name;\n\t::mmx::addr_t key;\n\tuint32_t height = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xffbf8c4478bb5ab5ull;\n\t\n\tNode_read_storage_entry_addr() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_entry_addr> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_addr& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_entry_addr& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_entry_addr::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_entry_addr>(4);\n\t_visitor.type_field(\"contract\", 0); _visitor.accept(contract);\n\t_visitor.type_field(\"name\", 1); _visitor.accept(name);\n\t_visitor.type_field(\"key\", 2); _visitor.accept(key);\n\t_visitor.type_field(\"height\", 3); _visitor.accept(height);\n\t_visitor.template type_end<Node_read_storage_entry_addr>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_entry_addr_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_entry_addr_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_entry_addr_return_HXX_\n#define INCLUDE_mmx_Node_read_storage_entry_addr_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_entry_addr_return : public ::vnx::Value {\npublic:\n\t\n\tstd::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xacd2f58f1ca8df54ull;\n\t\n\tNode_read_storage_entry_addr_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_entry_addr_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_addr_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_entry_addr_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_entry_addr_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_entry_addr_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_read_storage_entry_addr_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_entry_addr_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_entry_string.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_entry_string_HXX_\n#define INCLUDE_mmx_Node_read_storage_entry_string_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_entry_string : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t contract;\n\tstd::string name;\n\tstd::string key;\n\tuint32_t height = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe5b52723a3714e9full;\n\t\n\tNode_read_storage_entry_string() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_entry_string> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_string& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_entry_string& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_entry_string::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_entry_string>(4);\n\t_visitor.type_field(\"contract\", 0); _visitor.accept(contract);\n\t_visitor.type_field(\"name\", 1); _visitor.accept(name);\n\t_visitor.type_field(\"key\", 2); _visitor.accept(key);\n\t_visitor.type_field(\"height\", 3); _visitor.accept(height);\n\t_visitor.template type_end<Node_read_storage_entry_string>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_entry_string_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_entry_string_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_entry_string_return_HXX_\n#define INCLUDE_mmx_Node_read_storage_entry_string_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_entry_string_return : public ::vnx::Value {\npublic:\n\t\n\tstd::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x56c6103ea03d7ceaull;\n\t\n\tNode_read_storage_entry_string_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_entry_string_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_string_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_entry_string_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_entry_string_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_entry_string_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_read_storage_entry_string_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_entry_string_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_entry_var.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_entry_var_HXX_\n#define INCLUDE_mmx_Node_read_storage_entry_var_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_entry_var : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t contract;\n\tuint64_t address = 0;\n\tuint64_t key = 0;\n\tuint32_t height = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb0ebcc688396e6dbull;\n\t\n\tNode_read_storage_entry_var() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_entry_var> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_var& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_entry_var& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_entry_var::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_entry_var>(4);\n\t_visitor.type_field(\"contract\", 0); _visitor.accept(contract);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"key\", 2); _visitor.accept(key);\n\t_visitor.type_field(\"height\", 3); _visitor.accept(height);\n\t_visitor.template type_end<Node_read_storage_entry_var>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_entry_var_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_entry_var_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_entry_var_return_HXX_\n#define INCLUDE_mmx_Node_read_storage_entry_var_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_entry_var_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::vm::varptr_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x773a90b50f714a11ull;\n\t\n\tNode_read_storage_entry_var_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_entry_var_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_var_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_entry_var_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_entry_var_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_entry_var_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_read_storage_entry_var_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_entry_var_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_field.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_field_HXX_\n#define INCLUDE_mmx_Node_read_storage_field_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_field : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t contract;\n\tstd::string name;\n\tuint32_t height = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc9a10c9f7f2cef16ull;\n\t\n\tNode_read_storage_field() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_field> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_field& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_field& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_field::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_field>(3);\n\t_visitor.type_field(\"contract\", 0); _visitor.accept(contract);\n\t_visitor.type_field(\"name\", 1); _visitor.accept(name);\n\t_visitor.type_field(\"height\", 2); _visitor.accept(height);\n\t_visitor.template type_end<Node_read_storage_field>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_field_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_field_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_field_return_HXX_\n#define INCLUDE_mmx_Node_read_storage_field_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_field_return : public ::vnx::Value {\npublic:\n\t\n\tstd::pair<::mmx::vm::varptr_t, uint64_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf817bcace12b9ef3ull;\n\t\n\tNode_read_storage_field_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_field_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_field_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_field_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_field_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_field_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_read_storage_field_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_field_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_map.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_map_HXX_\n#define INCLUDE_mmx_Node_read_storage_map_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_map : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t contract;\n\tuint64_t address = 0;\n\tuint32_t height = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1cc0cc12bc2c1b4eull;\n\t\n\tNode_read_storage_map() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_map> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_map& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_map& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_map::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_map>(3);\n\t_visitor.type_field(\"contract\", 0); _visitor.accept(contract);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"height\", 2); _visitor.accept(height);\n\t_visitor.template type_end<Node_read_storage_map>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_map_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_map_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_map_return_HXX_\n#define INCLUDE_mmx_Node_read_storage_map_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_map_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::vm::varptr_t, ::mmx::vm::varptr_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1d56300164b3e79ull;\n\t\n\tNode_read_storage_map_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_map_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_map_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_map_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_map_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_map_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_read_storage_map_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_map_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_object.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_object_HXX_\n#define INCLUDE_mmx_Node_read_storage_object_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_object : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t contract;\n\tuint64_t address = 0;\n\tuint32_t height = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5930cf36eeb662fbull;\n\t\n\tNode_read_storage_object() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_object> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_object& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_object& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_object::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_object>(3);\n\t_visitor.type_field(\"contract\", 0); _visitor.accept(contract);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"height\", 2); _visitor.accept(height);\n\t_visitor.template type_end<Node_read_storage_object>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_object_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_object_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_object_return_HXX_\n#define INCLUDE_mmx_Node_read_storage_object_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_object_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<std::string, ::mmx::vm::varptr_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x48c9a69123ef41afull;\n\t\n\tNode_read_storage_object_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_object_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_object_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_object_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_object_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_object_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_read_storage_object_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_object_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_return_HXX_\n#define INCLUDE_mmx_Node_read_storage_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<std::string, ::mmx::vm::varptr_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xab73866ba23ed19aull;\n\t\n\tNode_read_storage_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_read_storage_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_var.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_var_HXX_\n#define INCLUDE_mmx_Node_read_storage_var_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_var : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t contract;\n\tuint64_t address = 0;\n\tuint32_t height = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x16d0361bcb359c2full;\n\t\n\tNode_read_storage_var() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_var> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_var& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_var& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_var::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_var>(3);\n\t_visitor.type_field(\"contract\", 0); _visitor.accept(contract);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"height\", 2); _visitor.accept(height);\n\t_visitor.template type_end<Node_read_storage_var>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_var_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_read_storage_var_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_read_storage_var_return_HXX_\n#define INCLUDE_mmx_Node_read_storage_var_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_read_storage_var_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::vm::varptr_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xaaa6685b20943467ull;\n\t\n\tNode_read_storage_var_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_read_storage_var_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_read_storage_var_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_read_storage_var_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_read_storage_var_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_read_storage_var_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_read_storage_var_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_read_storage_var_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_revert_sync.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_revert_sync_HXX_\n#define INCLUDE_mmx_Node_revert_sync_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_revert_sync : public ::vnx::Value {\npublic:\n\t\n\tuint32_t height = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8c1cc38a7a8a6c1dull;\n\t\n\tNode_revert_sync() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_revert_sync> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_revert_sync& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_revert_sync& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_revert_sync::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_revert_sync>(1);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.template type_end<Node_revert_sync>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_revert_sync_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_revert_sync_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_revert_sync_return_HXX_\n#define INCLUDE_mmx_Node_revert_sync_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_revert_sync_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3962a4b86b203e0aull;\n\t\n\tNode_revert_sync_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_revert_sync_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_revert_sync_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_revert_sync_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_revert_sync_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_revert_sync_return>(0);\n\t_visitor.template type_end<Node_revert_sync_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_revert_sync_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_start_sync.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_start_sync_HXX_\n#define INCLUDE_mmx_Node_start_sync_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_start_sync : public ::vnx::Value {\npublic:\n\t\n\tvnx::bool_t force = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6c5be8aeb25ef3c8ull;\n\t\n\tNode_start_sync() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_start_sync> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_start_sync& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_start_sync& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_start_sync::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_start_sync>(1);\n\t_visitor.type_field(\"force\", 0); _visitor.accept(force);\n\t_visitor.template type_end<Node_start_sync>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_start_sync_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_start_sync_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_start_sync_return_HXX_\n#define INCLUDE_mmx_Node_start_sync_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_start_sync_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe75b8e6a62d7e744ull;\n\t\n\tNode_start_sync_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_start_sync_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_start_sync_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_start_sync_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_start_sync_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_start_sync_return>(0);\n\t_visitor.template type_end<Node_start_sync_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_start_sync_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_validate.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_validate_HXX_\n#define INCLUDE_mmx_Node_validate_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_validate : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> tx;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x95dbbd65f36b618ull;\n\t\n\tNode_validate() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_validate> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_validate& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_validate& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_validate::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_validate>(1);\n\t_visitor.type_field(\"tx\", 0); _visitor.accept(tx);\n\t_visitor.template type_end<Node_validate>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_validate_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_validate_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_validate_return_HXX_\n#define INCLUDE_mmx_Node_validate_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/exec_result_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_validate_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::exec_result_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe3c465d0fc0c4a4cull;\n\t\n\tNode_validate_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_validate_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_validate_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_validate_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_validate_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_validate_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_validate_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_validate_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_verify_partial.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_verify_partial_HXX_\n#define INCLUDE_mmx_Node_verify_partial_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_verify_partial : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Partial> partial;\n\tvnx::optional<::mmx::addr_t> pool_target;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xeb15396685387f88ull;\n\t\n\tNode_verify_partial() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_verify_partial> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_verify_partial& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_verify_partial& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_verify_partial::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_verify_partial>(2);\n\t_visitor.type_field(\"partial\", 0); _visitor.accept(partial);\n\t_visitor.type_field(\"pool_target\", 1); _visitor.accept(pool_target);\n\t_visitor.template type_end<Node_verify_partial>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_verify_partial_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_verify_partial_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_verify_partial_return_HXX_\n#define INCLUDE_mmx_Node_verify_partial_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/pooling_error_e.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_verify_partial_return : public ::vnx::Value {\npublic:\n\t\n\tstd::tuple<::mmx::pooling_error_e, std::string> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb64fb769c6ffcf36ull;\n\t\n\tNode_verify_partial_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_verify_partial_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_verify_partial_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_verify_partial_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_verify_partial_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_verify_partial_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_verify_partial_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_verify_partial_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_verify_plot_nft_target.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_verify_plot_nft_target_HXX_\n#define INCLUDE_mmx_Node_verify_plot_nft_target_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_verify_plot_nft_target : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t::mmx::addr_t pool_target;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf3ac786edcae50e1ull;\n\t\n\tNode_verify_plot_nft_target() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_verify_plot_nft_target> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_verify_plot_nft_target& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_verify_plot_nft_target& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_verify_plot_nft_target::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_verify_plot_nft_target>(2);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"pool_target\", 1); _visitor.accept(pool_target);\n\t_visitor.template type_end<Node_verify_plot_nft_target>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_verify_plot_nft_target_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Node_verify_plot_nft_target_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Node_verify_plot_nft_target_return_HXX_\n#define INCLUDE_mmx_Node_verify_plot_nft_target_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/pooling_error_e.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Node_verify_plot_nft_target_return : public ::vnx::Value {\npublic:\n\t\n\tstd::tuple<::mmx::pooling_error_e, std::string> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x82f0f6ed43a0c4bull;\n\t\n\tNode_verify_plot_nft_target_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Node_verify_plot_nft_target_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Node_verify_plot_nft_target_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Node_verify_plot_nft_target_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Node_verify_plot_nft_target_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Node_verify_plot_nft_target_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Node_verify_plot_nft_target_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Node_verify_plot_nft_target_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Operation.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Operation_HXX_\n#define INCLUDE_mmx_Operation_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Operation : public ::vnx::Value {\npublic:\n\tstatic const uint16_t NO_SOLUTION = -1;\n\t\n\tuint32_t version = 0;\n\t::mmx::addr_t address;\n\tuint16_t solution = -1;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xfd69dd82e906e619ull;\n\t\n\tOperation() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = 0) const;\n\tvirtual uint64_t calc_cost(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const;\n\t\n\tstatic std::shared_ptr<Operation> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Operation& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Operation& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Operation::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Operation>(3);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"solution\", 2); _visitor.accept(solution);\n\t_visitor.template type_end<Operation>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Operation_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Partial.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Partial_HXX_\n#define INCLUDE_mmx_Partial_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Partial : public ::vnx::Value {\npublic:\n\t\n\tuint32_t vdf_height = 0;\n\t::mmx::hash_t hash;\n\t::mmx::addr_t contract;\n\t::mmx::addr_t account;\n\tstd::string pool_url;\n\tstd::string harvester;\n\tuint32_t lookup_time_ms = 0;\n\tstd::shared_ptr<const ::mmx::ProofOfSpace> proof;\n\tvnx::optional<::mmx::signature_t> farmer_sig;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x2c849b13a7efd71aull;\n\t\n\tPartial() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual ::mmx::hash_t calc_hash() const;\n\t\n\tstatic std::shared_ptr<Partial> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Partial& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Partial& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Partial::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Partial>(9);\n\t_visitor.type_field(\"vdf_height\", 0); _visitor.accept(vdf_height);\n\t_visitor.type_field(\"hash\", 1); _visitor.accept(hash);\n\t_visitor.type_field(\"contract\", 2); _visitor.accept(contract);\n\t_visitor.type_field(\"account\", 3); _visitor.accept(account);\n\t_visitor.type_field(\"pool_url\", 4); _visitor.accept(pool_url);\n\t_visitor.type_field(\"harvester\", 5); _visitor.accept(harvester);\n\t_visitor.type_field(\"lookup_time_ms\", 6); _visitor.accept(lookup_time_ms);\n\t_visitor.type_field(\"proof\", 7); _visitor.accept(proof);\n\t_visitor.type_field(\"farmer_sig\", 8); _visitor.accept(farmer_sig);\n\t_visitor.template type_end<Partial>(9);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Partial_HXX_\n"
  },
  {
    "path": "generated/include/mmx/PeerInfo.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_PeerInfo_HXX_\n#define INCLUDE_mmx_PeerInfo_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/peer_info_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT PeerInfo : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::peer_info_t> peers;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf7a37f624c94a121ull;\n\t\n\tPeerInfo() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<PeerInfo> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const PeerInfo& _value);\n\tfriend std::istream& operator>>(std::istream& _in, PeerInfo& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid PeerInfo::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<PeerInfo>(1);\n\t_visitor.type_field(\"peers\", 0); _visitor.accept(peers);\n\t_visitor.template type_end<PeerInfo>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_PeerInfo_HXX_\n"
  },
  {
    "path": "generated/include/mmx/PlotHeader.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_PlotHeader_HXX_\n#define INCLUDE_mmx_PlotHeader_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT PlotHeader : public ::vnx::Value {\npublic:\n\t\n\tint32_t version = 0;\n\tint32_t ksize = 0;\n\tint32_t xbits = 0;\n\tvnx::bool_t has_meta = 0;\n\t::mmx::hash_t seed;\n\t::mmx::hash_t plot_id;\n\t::mmx::pubkey_t farmer_key;\n\tvnx::optional<::mmx::addr_t> contract;\n\tuint64_t plot_size = 0;\n\tint32_t park_size_x = 0;\n\tint32_t park_size_y = 0;\n\tint32_t park_size_pd = 0;\n\tint32_t park_size_meta = 0;\n\tint32_t park_bytes_x = 0;\n\tint32_t park_bytes_y = 0;\n\tint32_t park_bytes_pd = 0;\n\tint32_t park_bytes_meta = 0;\n\tint32_t entry_bits_x = 0;\n\tuint64_t num_entries_y = 0;\n\tuint64_t table_offset_x = -1;\n\tuint64_t table_offset_y = -1;\n\tuint64_t table_offset_meta = -1;\n\tstd::vector<uint64_t> table_offset_pd;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x299c5790983c47b6ull;\n\t\n\tPlotHeader() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<PlotHeader> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const PlotHeader& _value);\n\tfriend std::istream& operator>>(std::istream& _in, PlotHeader& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid PlotHeader::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<PlotHeader>(23);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"ksize\", 1); _visitor.accept(ksize);\n\t_visitor.type_field(\"xbits\", 2); _visitor.accept(xbits);\n\t_visitor.type_field(\"has_meta\", 3); _visitor.accept(has_meta);\n\t_visitor.type_field(\"seed\", 4); _visitor.accept(seed);\n\t_visitor.type_field(\"plot_id\", 5); _visitor.accept(plot_id);\n\t_visitor.type_field(\"farmer_key\", 6); _visitor.accept(farmer_key);\n\t_visitor.type_field(\"contract\", 7); _visitor.accept(contract);\n\t_visitor.type_field(\"plot_size\", 8); _visitor.accept(plot_size);\n\t_visitor.type_field(\"park_size_x\", 9); _visitor.accept(park_size_x);\n\t_visitor.type_field(\"park_size_y\", 10); _visitor.accept(park_size_y);\n\t_visitor.type_field(\"park_size_pd\", 11); _visitor.accept(park_size_pd);\n\t_visitor.type_field(\"park_size_meta\", 12); _visitor.accept(park_size_meta);\n\t_visitor.type_field(\"park_bytes_x\", 13); _visitor.accept(park_bytes_x);\n\t_visitor.type_field(\"park_bytes_y\", 14); _visitor.accept(park_bytes_y);\n\t_visitor.type_field(\"park_bytes_pd\", 15); _visitor.accept(park_bytes_pd);\n\t_visitor.type_field(\"park_bytes_meta\", 16); _visitor.accept(park_bytes_meta);\n\t_visitor.type_field(\"entry_bits_x\", 17); _visitor.accept(entry_bits_x);\n\t_visitor.type_field(\"num_entries_y\", 18); _visitor.accept(num_entries_y);\n\t_visitor.type_field(\"table_offset_x\", 19); _visitor.accept(table_offset_x);\n\t_visitor.type_field(\"table_offset_y\", 20); _visitor.accept(table_offset_y);\n\t_visitor.type_field(\"table_offset_meta\", 21); _visitor.accept(table_offset_meta);\n\t_visitor.type_field(\"table_offset_pd\", 22); _visitor.accept(table_offset_pd);\n\t_visitor.template type_end<PlotHeader>(23);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_PlotHeader_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ProofOfSpace.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ProofOfSpace_HXX_\n#define INCLUDE_mmx_ProofOfSpace_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT ProofOfSpace : public ::vnx::Value {\npublic:\n\t\n\tuint16_t score = 0;\n\t::mmx::hash_t plot_id;\n\t::mmx::hash_t challenge;\n\tuint64_t difficulty = 0;\n\t::mmx::pubkey_t farmer_key;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9269760ad5fd0058ull;\n\t\n\tProofOfSpace() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const;\n\tvirtual ::mmx::hash_t calc_hash() const;\n\tvirtual ::mmx::hash_t calc_proof_hash() const;\n\tvirtual void validate() const;\n\t\n\tstatic std::shared_ptr<ProofOfSpace> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ProofOfSpace& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ProofOfSpace& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid ProofOfSpace::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ProofOfSpace>(5);\n\t_visitor.type_field(\"score\", 0); _visitor.accept(score);\n\t_visitor.type_field(\"plot_id\", 1); _visitor.accept(plot_id);\n\t_visitor.type_field(\"challenge\", 2); _visitor.accept(challenge);\n\t_visitor.type_field(\"difficulty\", 3); _visitor.accept(difficulty);\n\t_visitor.type_field(\"farmer_key\", 4); _visitor.accept(farmer_key);\n\t_visitor.template type_end<ProofOfSpace>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_ProofOfSpace_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ProofOfSpaceNFT.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ProofOfSpaceNFT_HXX_\n#define INCLUDE_mmx_ProofOfSpaceNFT_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT ProofOfSpaceNFT : public ::mmx::ProofOfSpace {\npublic:\n\t\n\tuint8_t ksize = 0;\n\t::mmx::hash_t seed;\n\tstd::vector<uint32_t> proof_xs;\n\t::mmx::addr_t contract;\n\t\n\ttypedef ::mmx::ProofOfSpace Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x22a4d97166711bd9ull;\n\t\n\tProofOfSpaceNFT() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_hash() const override;\n\tvirtual ::mmx::hash_t calc_proof_hash() const override;\n\tvirtual void validate() const override;\n\t\n\tstatic std::shared_ptr<ProofOfSpaceNFT> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ProofOfSpaceNFT& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ProofOfSpaceNFT& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid ProofOfSpaceNFT::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ProofOfSpaceNFT>(9);\n\t_visitor.type_field(\"score\", 0); _visitor.accept(score);\n\t_visitor.type_field(\"plot_id\", 1); _visitor.accept(plot_id);\n\t_visitor.type_field(\"challenge\", 2); _visitor.accept(challenge);\n\t_visitor.type_field(\"difficulty\", 3); _visitor.accept(difficulty);\n\t_visitor.type_field(\"farmer_key\", 4); _visitor.accept(farmer_key);\n\t_visitor.type_field(\"ksize\", 5); _visitor.accept(ksize);\n\t_visitor.type_field(\"seed\", 6); _visitor.accept(seed);\n\t_visitor.type_field(\"proof_xs\", 7); _visitor.accept(proof_xs);\n\t_visitor.type_field(\"contract\", 8); _visitor.accept(contract);\n\t_visitor.template type_end<ProofOfSpaceNFT>(9);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_ProofOfSpaceNFT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ProofOfSpaceOG.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ProofOfSpaceOG_HXX_\n#define INCLUDE_mmx_ProofOfSpaceOG_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/hash_t.hpp>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT ProofOfSpaceOG : public ::mmx::ProofOfSpace {\npublic:\n\t\n\tuint8_t ksize = 0;\n\t::mmx::hash_t seed;\n\tstd::vector<uint32_t> proof_xs;\n\t\n\ttypedef ::mmx::ProofOfSpace Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6def5518efc37b4ull;\n\t\n\tProofOfSpaceOG() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_hash() const override;\n\tvirtual ::mmx::hash_t calc_proof_hash() const override;\n\tvirtual void validate() const override;\n\t\n\tstatic std::shared_ptr<ProofOfSpaceOG> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ProofOfSpaceOG& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ProofOfSpaceOG& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid ProofOfSpaceOG::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ProofOfSpaceOG>(8);\n\t_visitor.type_field(\"score\", 0); _visitor.accept(score);\n\t_visitor.type_field(\"plot_id\", 1); _visitor.accept(plot_id);\n\t_visitor.type_field(\"challenge\", 2); _visitor.accept(challenge);\n\t_visitor.type_field(\"difficulty\", 3); _visitor.accept(difficulty);\n\t_visitor.type_field(\"farmer_key\", 4); _visitor.accept(farmer_key);\n\t_visitor.type_field(\"ksize\", 5); _visitor.accept(ksize);\n\t_visitor.type_field(\"seed\", 6); _visitor.accept(seed);\n\t_visitor.type_field(\"proof_xs\", 7); _visitor.accept(proof_xs);\n\t_visitor.template type_end<ProofOfSpaceOG>(8);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_ProofOfSpaceOG_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ProofOfTime.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ProofOfTime_HXX_\n#define INCLUDE_mmx_ProofOfTime_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT ProofOfTime : public ::vnx::Value {\npublic:\n\t\n\tuint32_t version = 0;\n\t::mmx::hash_t hash;\n\tuint32_t vdf_height = 0;\n\tuint64_t start = 0;\n\tuint64_t num_iters = 0;\n\tuint32_t segment_size = 0;\n\t::mmx::hash_t input;\n\t::mmx::hash_t prev;\n\t::mmx::addr_t reward_addr;\n\tstd::vector<::mmx::hash_t> segments;\n\t::mmx::pubkey_t timelord_key;\n\t::mmx::signature_t timelord_sig;\n\t::mmx::hash_t content_hash;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xa84a63942b8e5c6aull;\n\t\n\tProofOfTime() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const;\n\tvirtual ::mmx::hash_t calc_hash() const;\n\tvirtual ::mmx::hash_t calc_content_hash() const;\n\tvirtual ::mmx::hash_t get_output() const;\n\tvirtual uint64_t get_vdf_iters() const;\n\tvirtual void validate() const;\n\t\n\tstatic std::shared_ptr<ProofOfTime> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ProofOfTime& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ProofOfTime& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid ProofOfTime::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ProofOfTime>(13);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"hash\", 1); _visitor.accept(hash);\n\t_visitor.type_field(\"vdf_height\", 2); _visitor.accept(vdf_height);\n\t_visitor.type_field(\"start\", 3); _visitor.accept(start);\n\t_visitor.type_field(\"num_iters\", 4); _visitor.accept(num_iters);\n\t_visitor.type_field(\"segment_size\", 5); _visitor.accept(segment_size);\n\t_visitor.type_field(\"input\", 6); _visitor.accept(input);\n\t_visitor.type_field(\"prev\", 7); _visitor.accept(prev);\n\t_visitor.type_field(\"reward_addr\", 8); _visitor.accept(reward_addr);\n\t_visitor.type_field(\"segments\", 9); _visitor.accept(segments);\n\t_visitor.type_field(\"timelord_key\", 10); _visitor.accept(timelord_key);\n\t_visitor.type_field(\"timelord_sig\", 11); _visitor.accept(timelord_sig);\n\t_visitor.type_field(\"content_hash\", 12); _visitor.accept(content_hash);\n\t_visitor.template type_end<ProofOfTime>(13);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_ProofOfTime_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ProofResponse.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ProofResponse_HXX_\n#define INCLUDE_mmx_ProofResponse_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Hash64.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT ProofResponse : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t hash;\n\tuint32_t vdf_height = 0;\n\tstd::shared_ptr<const ::mmx::ProofOfSpace> proof;\n\t::mmx::signature_t farmer_sig;\n\t::mmx::hash_t content_hash;\n\t::vnx::Hash64 farmer_addr;\n\tstd::string harvester;\n\tint64_t lookup_time_ms = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x816e898b36befae0ull;\n\t\n\tProofResponse() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const;\n\tvirtual ::mmx::hash_t calc_hash() const;\n\tvirtual ::mmx::hash_t calc_content_hash() const;\n\tvirtual void validate() const;\n\t\n\tstatic std::shared_ptr<ProofResponse> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ProofResponse& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ProofResponse& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid ProofResponse::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ProofResponse>(8);\n\t_visitor.type_field(\"hash\", 0); _visitor.accept(hash);\n\t_visitor.type_field(\"vdf_height\", 1); _visitor.accept(vdf_height);\n\t_visitor.type_field(\"proof\", 2); _visitor.accept(proof);\n\t_visitor.type_field(\"farmer_sig\", 3); _visitor.accept(farmer_sig);\n\t_visitor.type_field(\"content_hash\", 4); _visitor.accept(content_hash);\n\t_visitor.type_field(\"farmer_addr\", 5); _visitor.accept(farmer_addr);\n\t_visitor.type_field(\"harvester\", 6); _visitor.accept(harvester);\n\t_visitor.type_field(\"lookup_time_ms\", 7); _visitor.accept(lookup_time_ms);\n\t_visitor.template type_end<ProofResponse>(8);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_ProofResponse_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ProofServerAsyncClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ProofServer_ASYNC_CLIENT_HXX_\n#define INCLUDE_mmx_ProofServer_ASYNC_CLIENT_HXX_\n\n#include <vnx/AsyncClient.h>\n#include <mmx/hash_t.hpp>\n#include <mmx/table_entry_t.hxx>\n#include <vnx/Module.h>\n\n\nnamespace mmx {\n\nclass ProofServerAsyncClient : public vnx::AsyncClient {\npublic:\n\tProofServerAsyncClient(const std::string& service_name);\n\t\n\tProofServerAsyncClient(vnx::Hash64 service_addr);\n\t\n\tuint64_t compute(const std::vector<uint32_t>& X_values = {}, const ::mmx::hash_t& id = ::mmx::hash_t(), const int32_t& ksize = 0, const int32_t& xbits = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::table_entry_t>&)>& _callback = std::function<void(const std::vector<::mmx::table_entry_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config_object(\n\t\t\tconst std::function<void(const ::vnx::Object&)>& _callback = std::function<void(const ::vnx::Object&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config(const std::string& name = \"\", \n\t\t\tconst std::function<void(const ::vnx::Variant&)>& _callback = std::function<void(const ::vnx::Variant&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_type_code(\n\t\t\tconst std::function<void(const ::vnx::TypeCode&)>& _callback = std::function<void(const ::vnx::TypeCode&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_module_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_restart(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_stop(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_self_test(\n\t\t\tconst std::function<void(const vnx::bool_t&)>& _callback = std::function<void(const vnx::bool_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\nprotected:\n\tint32_t vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) override;\n\t\n\tint32_t vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) override;\n\t\nprivate:\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::table_entry_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_compute;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Object&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Variant&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::TypeCode&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_type_code;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_module_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_restart;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_stop;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::bool_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_self_test;\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_ProofServer_ASYNC_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ProofServerBase.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ProofServerBase_HXX_\n#define INCLUDE_mmx_ProofServerBase_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/table_entry_t.hxx>\n#include <vnx/Module.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT ProofServerBase : public ::vnx::Module {\npublic:\n\t\n\tuint32_t num_threads = 32;\n\t\n\ttypedef ::vnx::Module Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xa531590f144986a6ull;\n\t\n\tProofServerBase(const std::string& _vnx_name);\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ProofServerBase& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ProofServerBase& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tusing Super::handle;\n\t\n\tvirtual void compute_async(const std::vector<uint32_t>& X_values, const ::mmx::hash_t& id, const int32_t& ksize, const int32_t& xbits, const vnx::request_id_t& _request_id) const = 0;\n\tvoid compute_async_return(const vnx::request_id_t& _request_id, const std::vector<::mmx::table_entry_t>& _ret_0) const;\n\t\n\tvoid vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) override;\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) override;\n\t\n};\n\ntemplate<typename T>\nvoid ProofServerBase::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ProofServerBase>(1);\n\t_visitor.type_field(\"num_threads\", 0); _visitor.accept(num_threads);\n\t_visitor.template type_end<ProofServerBase>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_ProofServerBase_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ProofServerClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ProofServer_CLIENT_HXX_\n#define INCLUDE_mmx_ProofServer_CLIENT_HXX_\n\n#include <vnx/Client.h>\n#include <mmx/hash_t.hpp>\n#include <mmx/table_entry_t.hxx>\n#include <vnx/Module.h>\n\n\nnamespace mmx {\n\nclass ProofServerClient : public vnx::Client {\npublic:\n\tProofServerClient(const std::string& service_name);\n\t\n\tProofServerClient(vnx::Hash64 service_addr);\n\t\n\tstd::vector<::mmx::table_entry_t> compute(const std::vector<uint32_t>& X_values = {}, const ::mmx::hash_t& id = ::mmx::hash_t(), const int32_t& ksize = 0, const int32_t& xbits = 0);\n\t\n\t::vnx::Object vnx_get_config_object();\n\t\n\t::vnx::Variant vnx_get_config(const std::string& name = \"\");\n\t\n\tvoid vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config_object_async(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\tvoid vnx_set_config_async(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\t::vnx::TypeCode vnx_get_type_code();\n\t\n\tstd::shared_ptr<const ::vnx::ModuleInfo> vnx_get_module_info();\n\t\n\tvoid vnx_restart();\n\t\n\tvoid vnx_restart_async();\n\t\n\tvoid vnx_stop();\n\t\n\tvoid vnx_stop_async();\n\t\n\tvnx::bool_t vnx_self_test();\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_ProofServer_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ProofServer_compute.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ProofServer_compute_HXX_\n#define INCLUDE_mmx_ProofServer_compute_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT ProofServer_compute : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<uint32_t> X_values;\n\t::mmx::hash_t id;\n\tint32_t ksize = 0;\n\tint32_t xbits = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1565fa29d1604750ull;\n\t\n\tProofServer_compute() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<ProofServer_compute> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ProofServer_compute& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ProofServer_compute& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid ProofServer_compute::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ProofServer_compute>(4);\n\t_visitor.type_field(\"X_values\", 0); _visitor.accept(X_values);\n\t_visitor.type_field(\"id\", 1); _visitor.accept(id);\n\t_visitor.type_field(\"ksize\", 2); _visitor.accept(ksize);\n\t_visitor.type_field(\"xbits\", 3); _visitor.accept(xbits);\n\t_visitor.template type_end<ProofServer_compute>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_ProofServer_compute_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ProofServer_compute_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ProofServer_compute_return_HXX_\n#define INCLUDE_mmx_ProofServer_compute_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/table_entry_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT ProofServer_compute_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::table_entry_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5b42e049360ce028ull;\n\t\n\tProofServer_compute_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<ProofServer_compute_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ProofServer_compute_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ProofServer_compute_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid ProofServer_compute_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ProofServer_compute_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<ProofServer_compute_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_ProofServer_compute_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ReceiveNote.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ReceiveNote_HXX_\n#define INCLUDE_mmx_ReceiveNote_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT ReceiveNote : public ::vnx::Value {\npublic:\n\t\n\tint64_t time = 0;\n\t::mmx::hash_t hash;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x30439468cf29fa4bull;\n\t\n\tReceiveNote() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<ReceiveNote> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ReceiveNote& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ReceiveNote& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid ReceiveNote::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ReceiveNote>(2);\n\t_visitor.type_field(\"time\", 0); _visitor.accept(time);\n\t_visitor.type_field(\"hash\", 1); _visitor.accept(hash);\n\t_visitor.template type_end<ReceiveNote>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_ReceiveNote_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Request.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Request_HXX_\n#define INCLUDE_mmx_Request_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Request : public ::vnx::Value {\npublic:\n\t\n\tuint32_t id = 0;\n\tstd::shared_ptr<const ::vnx::Value> method;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x110ce6958669f66bull;\n\t\n\tRequest() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Request> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Request& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Request& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Request::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Request>(2);\n\t_visitor.type_field(\"id\", 0); _visitor.accept(id);\n\t_visitor.type_field(\"method\", 1); _visitor.accept(method);\n\t_visitor.template type_end<Request>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Request_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Return_HXX_\n#define INCLUDE_mmx_Return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Return : public ::vnx::Value {\npublic:\n\t\n\tuint32_t id = 0;\n\tstd::shared_ptr<const ::vnx::Value> result;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb479dce669278664ull;\n\t\n\tReturn() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Return>(2);\n\t_visitor.type_field(\"id\", 0); _visitor.accept(id);\n\t_visitor.type_field(\"result\", 1); _visitor.accept(result);\n\t_visitor.template type_end<Return>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/RouterAsyncClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_ASYNC_CLIENT_HXX_\n#define INCLUDE_mmx_Router_ASYNC_CLIENT_HXX_\n\n#include <vnx/AsyncClient.h>\n#include <mmx/Block.hxx>\n#include <mmx/PeerInfo.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/node_info_t.hxx>\n#include <mmx/node_type_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n#include <vnx/addons/MsgServer.h>\n\n\nnamespace mmx {\n\nclass RouterAsyncClient : public vnx::AsyncClient {\npublic:\n\tRouterAsyncClient(const std::string& service_name);\n\t\n\tRouterAsyncClient(vnx::Hash64 service_addr);\n\t\n\tuint64_t discover(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_id(\n\t\t\tconst std::function<void(const ::mmx::hash_t&)>& _callback = std::function<void(const ::mmx::hash_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_info(\n\t\t\tconst std::function<void(const ::mmx::node_info_t&)>& _callback = std::function<void(const ::mmx::node_info_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t sign_msg(const ::mmx::hash_t& msg = ::mmx::hash_t(), \n\t\t\tconst std::function<void(const std::pair<::mmx::pubkey_t, ::mmx::signature_t>&)>& _callback = std::function<void(const std::pair<::mmx::pubkey_t, ::mmx::signature_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_peers(const uint32_t& max_count = 10, \n\t\t\tconst std::function<void(const std::vector<std::string>&)>& _callback = std::function<void(const std::vector<std::string>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_known_peers(\n\t\t\tconst std::function<void(const std::vector<std::string>&)>& _callback = std::function<void(const std::vector<std::string>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_connected_peers(\n\t\t\tconst std::function<void(const std::vector<std::string>&)>& _callback = std::function<void(const std::vector<std::string>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_peer_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::PeerInfo>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::PeerInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t kick_peer(const std::string& address = \"\", \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_blocks_at(const uint32_t& height = 0, \n\t\t\tconst std::function<void(const std::vector<std::shared_ptr<const ::mmx::Block>>&)>& _callback = std::function<void(const std::vector<std::shared_ptr<const ::mmx::Block>>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t fetch_block(const ::mmx::hash_t& hash = ::mmx::hash_t(), const vnx::optional<std::string>& address = nullptr, \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Block>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Block>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t fetch_block_at(const uint32_t& height = 0, const std::string& address = \"\", \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Block>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Block>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", \n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", const int64_t& offset = 0, const int64_t& max_bytes = 0, \n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config_object(\n\t\t\tconst std::function<void(const ::vnx::Object&)>& _callback = std::function<void(const ::vnx::Object&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config(const std::string& name = \"\", \n\t\t\tconst std::function<void(const ::vnx::Variant&)>& _callback = std::function<void(const ::vnx::Variant&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_type_code(\n\t\t\tconst std::function<void(const ::vnx::TypeCode&)>& _callback = std::function<void(const ::vnx::TypeCode&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_module_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_restart(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_stop(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_self_test(\n\t\t\tconst std::function<void(const vnx::bool_t&)>& _callback = std::function<void(const vnx::bool_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\nprotected:\n\tint32_t vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) override;\n\t\n\tint32_t vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) override;\n\t\nprivate:\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_discover;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::hash_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_id;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::node_info_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::pair<::mmx::pubkey_t, ::mmx::signature_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_sign_msg;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<std::string>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_peers;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<std::string>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_known_peers;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<std::string>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_connected_peers;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::PeerInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_peer_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_kick_peer;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<std::shared_ptr<const ::mmx::Block>>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_blocks_at;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Block>)>, std::function<void(const vnx::exception&)>>> vnx_queue_fetch_block;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Block>)>, std::function<void(const vnx::exception&)>>> vnx_queue_fetch_block_at;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>, std::function<void(const vnx::exception&)>>> vnx_queue_http_request;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>, std::function<void(const vnx::exception&)>>> vnx_queue_http_request_chunk;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Object&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Variant&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::TypeCode&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_type_code;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_module_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_restart;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_stop;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::bool_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_self_test;\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_Router_ASYNC_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/RouterBase.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_RouterBase_HXX_\n#define INCLUDE_mmx_RouterBase_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/PeerInfo.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/node_info_t.hxx>\n#include <mmx/node_type_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n#include <vnx/addons/MsgServer.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT RouterBase : public ::vnx::addons::MsgServer {\npublic:\n\t\n\t::vnx::TopicPtr input_verified_vdfs = \"node.verified_vdfs\";\n\t::vnx::TopicPtr input_verified_votes = \"node.verified_votes\";\n\t::vnx::TopicPtr input_verified_proof = \"node.verified_proof\";\n\t::vnx::TopicPtr input_verified_blocks = \"node.verified_blocks\";\n\t::vnx::TopicPtr input_verified_transactions = \"node.verified_transactions\";\n\t::vnx::TopicPtr input_transactions = \"node.transactions\";\n\t::vnx::TopicPtr input_vdf_points = \"node.vdf_points\";\n\t::vnx::TopicPtr input_vdfs = \"timelord.proof\";\n\t::vnx::TopicPtr output_vdfs = \"network.vdfs\";\n\t::vnx::TopicPtr output_votes = \"network.votes\";\n\t::vnx::TopicPtr output_proof = \"network.proof\";\n\t::vnx::TopicPtr output_blocks = \"network.blocks\";\n\t::vnx::TopicPtr output_transactions = \"network.transactions\";\n\t::vnx::TopicPtr output_vdf_points = \"network.vdf_points\";\n\tint32_t max_queue_ms = 1000;\n\tint32_t send_interval_ms = 20;\n\tint32_t query_interval_ms = 10000;\n\tint32_t update_interval_ms = 1000;\n\tint32_t connect_interval_ms = 10000;\n\tint32_t fetch_timeout_ms = 10000;\n\tint32_t relay_target_ms = 5000;\n\tuint32_t sync_loss_delay = 60;\n\tuint32_t discover_interval = 60;\n\tuint32_t disconnect_interval = 0;\n\tuint32_t peer_retry_interval = 360;\n\tuint32_t num_peers_out = 8;\n\tuint32_t min_sync_peers = 2;\n\tuint32_t max_peer_set = 100;\n\tuint32_t max_sent_cache = 20000;\n\tuint32_t max_hash_cache = 100000;\n\tuint32_t max_vdf_segments = 65536;\n\tuint32_t node_version = 103;\n\t::mmx::node_type_e mode = ::mmx::node_type_e::FULL_NODE;\n\tvnx::bool_t do_relay = true;\n\tvnx::bool_t open_port = false;\n\tvnx::float64_t max_tx_upload = 2;\n\tvnx::float64_t max_pending_cost = 0.2;\n\tuint32_t priority_queue_size = 262144;\n\tstd::set<std::string> seed_peers;\n\tstd::set<std::string> fixed_peers;\n\tstd::set<std::string> block_peers;\n\tstd::set<std::string> master_nodes;\n\tstd::string storage_path;\n\tstd::string node_server = \"Node\";\n\t\n\ttypedef ::vnx::addons::MsgServer Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x952c4ef2956f31c4ull;\n\t\n\tRouterBase(const std::string& _vnx_name);\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const RouterBase& _value);\n\tfriend std::istream& operator>>(std::istream& _in, RouterBase& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tusing Super::handle;\n\t\n\tvirtual void discover() = 0;\n\tvirtual ::mmx::hash_t get_id() const = 0;\n\tvirtual ::mmx::node_info_t get_info() const = 0;\n\tvirtual std::pair<::mmx::pubkey_t, ::mmx::signature_t> sign_msg(const ::mmx::hash_t& msg) const = 0;\n\tvirtual std::vector<std::string> get_peers(const uint32_t& max_count) const = 0;\n\tvirtual std::vector<std::string> get_known_peers() const = 0;\n\tvirtual std::vector<std::string> get_connected_peers() const = 0;\n\tvirtual std::shared_ptr<const ::mmx::PeerInfo> get_peer_info() const = 0;\n\tvirtual void kick_peer(const std::string& address) = 0;\n\tvirtual void get_blocks_at_async(const uint32_t& height, const vnx::request_id_t& _request_id) const = 0;\n\tvoid get_blocks_at_async_return(const vnx::request_id_t& _request_id, const std::vector<std::shared_ptr<const ::mmx::Block>>& _ret_0) const;\n\tvirtual void fetch_block_async(const ::mmx::hash_t& hash, const vnx::optional<std::string>& address, const vnx::request_id_t& _request_id) const = 0;\n\tvoid fetch_block_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::mmx::Block>& _ret_0) const;\n\tvirtual void fetch_block_at_async(const uint32_t& height, const std::string& address, const vnx::request_id_t& _request_id) const = 0;\n\tvoid fetch_block_at_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::mmx::Block>& _ret_0) const;\n\tvirtual void handle(std::shared_ptr<const ::mmx::Block> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::Transaction> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::ProofOfTime> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::ProofResponse> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::VDF_Point> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::ValidatorVote> _value) {}\n\tvirtual void http_request_async(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const vnx::request_id_t& _request_id) const = 0;\n\tvoid http_request_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpResponse>& _ret_0) const;\n\tvirtual void http_request_chunk_async(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& _request_id) const = 0;\n\tvoid http_request_chunk_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpData>& _ret_0) const;\n\t\n\tvoid vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) override;\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) override;\n\t\n};\n\ntemplate<typename T>\nvoid RouterBase::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<RouterBase>(58);\n\t_visitor.type_field(\"port\", 0); _visitor.accept(port);\n\t_visitor.type_field(\"host\", 1); _visitor.accept(host);\n\t_visitor.type_field(\"max_connections\", 2); _visitor.accept(max_connections);\n\t_visitor.type_field(\"listen_queue_size\", 3); _visitor.accept(listen_queue_size);\n\t_visitor.type_field(\"stats_interval_ms\", 4); _visitor.accept(stats_interval_ms);\n\t_visitor.type_field(\"connection_timeout_ms\", 5); _visitor.accept(connection_timeout_ms);\n\t_visitor.type_field(\"send_buffer_size\", 6); _visitor.accept(send_buffer_size);\n\t_visitor.type_field(\"receive_buffer_size\", 7); _visitor.accept(receive_buffer_size);\n\t_visitor.type_field(\"tcp_no_delay\", 8); _visitor.accept(tcp_no_delay);\n\t_visitor.type_field(\"tcp_keepalive\", 9); _visitor.accept(tcp_keepalive);\n\t_visitor.type_field(\"show_warnings\", 10); _visitor.accept(show_warnings);\n\t_visitor.type_field(\"compress_level\", 11); _visitor.accept(compress_level);\n\t_visitor.type_field(\"max_msg_size\", 12); _visitor.accept(max_msg_size);\n\t_visitor.type_field(\"max_write_queue\", 13); _visitor.accept(max_write_queue);\n\t_visitor.type_field(\"input_verified_vdfs\", 14); _visitor.accept(input_verified_vdfs);\n\t_visitor.type_field(\"input_verified_votes\", 15); _visitor.accept(input_verified_votes);\n\t_visitor.type_field(\"input_verified_proof\", 16); _visitor.accept(input_verified_proof);\n\t_visitor.type_field(\"input_verified_blocks\", 17); _visitor.accept(input_verified_blocks);\n\t_visitor.type_field(\"input_verified_transactions\", 18); _visitor.accept(input_verified_transactions);\n\t_visitor.type_field(\"input_transactions\", 19); _visitor.accept(input_transactions);\n\t_visitor.type_field(\"input_vdf_points\", 20); _visitor.accept(input_vdf_points);\n\t_visitor.type_field(\"input_vdfs\", 21); _visitor.accept(input_vdfs);\n\t_visitor.type_field(\"output_vdfs\", 22); _visitor.accept(output_vdfs);\n\t_visitor.type_field(\"output_votes\", 23); _visitor.accept(output_votes);\n\t_visitor.type_field(\"output_proof\", 24); _visitor.accept(output_proof);\n\t_visitor.type_field(\"output_blocks\", 25); _visitor.accept(output_blocks);\n\t_visitor.type_field(\"output_transactions\", 26); _visitor.accept(output_transactions);\n\t_visitor.type_field(\"output_vdf_points\", 27); _visitor.accept(output_vdf_points);\n\t_visitor.type_field(\"max_queue_ms\", 28); _visitor.accept(max_queue_ms);\n\t_visitor.type_field(\"send_interval_ms\", 29); _visitor.accept(send_interval_ms);\n\t_visitor.type_field(\"query_interval_ms\", 30); _visitor.accept(query_interval_ms);\n\t_visitor.type_field(\"update_interval_ms\", 31); _visitor.accept(update_interval_ms);\n\t_visitor.type_field(\"connect_interval_ms\", 32); _visitor.accept(connect_interval_ms);\n\t_visitor.type_field(\"fetch_timeout_ms\", 33); _visitor.accept(fetch_timeout_ms);\n\t_visitor.type_field(\"relay_target_ms\", 34); _visitor.accept(relay_target_ms);\n\t_visitor.type_field(\"sync_loss_delay\", 35); _visitor.accept(sync_loss_delay);\n\t_visitor.type_field(\"discover_interval\", 36); _visitor.accept(discover_interval);\n\t_visitor.type_field(\"disconnect_interval\", 37); _visitor.accept(disconnect_interval);\n\t_visitor.type_field(\"peer_retry_interval\", 38); _visitor.accept(peer_retry_interval);\n\t_visitor.type_field(\"num_peers_out\", 39); _visitor.accept(num_peers_out);\n\t_visitor.type_field(\"min_sync_peers\", 40); _visitor.accept(min_sync_peers);\n\t_visitor.type_field(\"max_peer_set\", 41); _visitor.accept(max_peer_set);\n\t_visitor.type_field(\"max_sent_cache\", 42); _visitor.accept(max_sent_cache);\n\t_visitor.type_field(\"max_hash_cache\", 43); _visitor.accept(max_hash_cache);\n\t_visitor.type_field(\"max_vdf_segments\", 44); _visitor.accept(max_vdf_segments);\n\t_visitor.type_field(\"node_version\", 45); _visitor.accept(node_version);\n\t_visitor.type_field(\"mode\", 46); _visitor.accept(mode);\n\t_visitor.type_field(\"do_relay\", 47); _visitor.accept(do_relay);\n\t_visitor.type_field(\"open_port\", 48); _visitor.accept(open_port);\n\t_visitor.type_field(\"max_tx_upload\", 49); _visitor.accept(max_tx_upload);\n\t_visitor.type_field(\"max_pending_cost\", 50); _visitor.accept(max_pending_cost);\n\t_visitor.type_field(\"priority_queue_size\", 51); _visitor.accept(priority_queue_size);\n\t_visitor.type_field(\"seed_peers\", 52); _visitor.accept(seed_peers);\n\t_visitor.type_field(\"fixed_peers\", 53); _visitor.accept(fixed_peers);\n\t_visitor.type_field(\"block_peers\", 54); _visitor.accept(block_peers);\n\t_visitor.type_field(\"master_nodes\", 55); _visitor.accept(master_nodes);\n\t_visitor.type_field(\"storage_path\", 56); _visitor.accept(storage_path);\n\t_visitor.type_field(\"node_server\", 57); _visitor.accept(node_server);\n\t_visitor.template type_end<RouterBase>(58);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_RouterBase_HXX_\n"
  },
  {
    "path": "generated/include/mmx/RouterClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_CLIENT_HXX_\n#define INCLUDE_mmx_Router_CLIENT_HXX_\n\n#include <vnx/Client.h>\n#include <mmx/Block.hxx>\n#include <mmx/PeerInfo.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/node_info_t.hxx>\n#include <mmx/node_type_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n#include <vnx/addons/MsgServer.h>\n\n\nnamespace mmx {\n\nclass RouterClient : public vnx::Client {\npublic:\n\tRouterClient(const std::string& service_name);\n\t\n\tRouterClient(vnx::Hash64 service_addr);\n\t\n\tvoid discover();\n\t\n\tvoid discover_async();\n\t\n\t::mmx::hash_t get_id();\n\t\n\t::mmx::node_info_t get_info();\n\t\n\tstd::pair<::mmx::pubkey_t, ::mmx::signature_t> sign_msg(const ::mmx::hash_t& msg = ::mmx::hash_t());\n\t\n\tstd::vector<std::string> get_peers(const uint32_t& max_count = 10);\n\t\n\tstd::vector<std::string> get_known_peers();\n\t\n\tstd::vector<std::string> get_connected_peers();\n\t\n\tstd::shared_ptr<const ::mmx::PeerInfo> get_peer_info();\n\t\n\tvoid kick_peer(const std::string& address = \"\");\n\t\n\tvoid kick_peer_async(const std::string& address = \"\");\n\t\n\tstd::vector<std::shared_ptr<const ::mmx::Block>> get_blocks_at(const uint32_t& height = 0);\n\t\n\tstd::shared_ptr<const ::mmx::Block> fetch_block(const ::mmx::hash_t& hash = ::mmx::hash_t(), const vnx::optional<std::string>& address = nullptr);\n\t\n\tstd::shared_ptr<const ::mmx::Block> fetch_block_at(const uint32_t& height = 0, const std::string& address = \"\");\n\t\n\tstd::shared_ptr<const ::vnx::addons::HttpResponse> http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\");\n\t\n\tstd::shared_ptr<const ::vnx::addons::HttpData> http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", const int64_t& offset = 0, const int64_t& max_bytes = 0);\n\t\n\t::vnx::Object vnx_get_config_object();\n\t\n\t::vnx::Variant vnx_get_config(const std::string& name = \"\");\n\t\n\tvoid vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config_object_async(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\tvoid vnx_set_config_async(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\t::vnx::TypeCode vnx_get_type_code();\n\t\n\tstd::shared_ptr<const ::vnx::ModuleInfo> vnx_get_module_info();\n\t\n\tvoid vnx_restart();\n\t\n\tvoid vnx_restart_async();\n\t\n\tvoid vnx_stop();\n\t\n\tvoid vnx_stop_async();\n\t\n\tvnx::bool_t vnx_self_test();\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_Router_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_discover.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_discover_HXX_\n#define INCLUDE_mmx_Router_discover_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_discover : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xeda51767d96e246cull;\n\t\n\tRouter_discover() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_discover> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_discover& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_discover& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_discover::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_discover>(0);\n\t_visitor.template type_end<Router_discover>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_discover_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_discover_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_discover_return_HXX_\n#define INCLUDE_mmx_Router_discover_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_discover_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb4e47e012f264f94ull;\n\t\n\tRouter_discover_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_discover_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_discover_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_discover_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_discover_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_discover_return>(0);\n\t_visitor.template type_end<Router_discover_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_discover_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_fetch_block.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_fetch_block_HXX_\n#define INCLUDE_mmx_Router_fetch_block_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_fetch_block : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t hash;\n\tvnx::optional<std::string> address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x7c2f762681e7cc51ull;\n\t\n\tRouter_fetch_block() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_fetch_block> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_fetch_block& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_fetch_block& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_fetch_block::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_fetch_block>(2);\n\t_visitor.type_field(\"hash\", 0); _visitor.accept(hash);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.template type_end<Router_fetch_block>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_fetch_block_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_fetch_block_at.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_fetch_block_at_HXX_\n#define INCLUDE_mmx_Router_fetch_block_at_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_fetch_block_at : public ::vnx::Value {\npublic:\n\t\n\tuint32_t height = 0;\n\tstd::string address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xa4deba522ed6f8adull;\n\t\n\tRouter_fetch_block_at() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_fetch_block_at> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_fetch_block_at& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_fetch_block_at& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_fetch_block_at::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_fetch_block_at>(2);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.template type_end<Router_fetch_block_at>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_fetch_block_at_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_fetch_block_at_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_fetch_block_at_return_HXX_\n#define INCLUDE_mmx_Router_fetch_block_at_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Block.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_fetch_block_at_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Block> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xff711a762d6f885ull;\n\t\n\tRouter_fetch_block_at_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_fetch_block_at_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_fetch_block_at_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_fetch_block_at_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_fetch_block_at_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_fetch_block_at_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Router_fetch_block_at_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_fetch_block_at_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_fetch_block_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_fetch_block_return_HXX_\n#define INCLUDE_mmx_Router_fetch_block_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Block.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_fetch_block_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Block> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xcbe76155006bbb44ull;\n\t\n\tRouter_fetch_block_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_fetch_block_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_fetch_block_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_fetch_block_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_fetch_block_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_fetch_block_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Router_fetch_block_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_fetch_block_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_blocks_at.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_blocks_at_HXX_\n#define INCLUDE_mmx_Router_get_blocks_at_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_blocks_at : public ::vnx::Value {\npublic:\n\t\n\tuint32_t height = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1eb0c0d7eae3c33aull;\n\t\n\tRouter_get_blocks_at() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_blocks_at> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_blocks_at& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_blocks_at& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_blocks_at::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_blocks_at>(1);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.template type_end<Router_get_blocks_at>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_blocks_at_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_blocks_at_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_blocks_at_return_HXX_\n#define INCLUDE_mmx_Router_get_blocks_at_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Block.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_blocks_at_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::shared_ptr<const ::mmx::Block>> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x70f0e9e7aa72b810ull;\n\t\n\tRouter_get_blocks_at_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_blocks_at_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_blocks_at_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_blocks_at_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_blocks_at_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_blocks_at_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Router_get_blocks_at_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_blocks_at_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_connected_peers.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_connected_peers_HXX_\n#define INCLUDE_mmx_Router_get_connected_peers_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_connected_peers : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8682feb65fbb77feull;\n\t\n\tRouter_get_connected_peers() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_connected_peers> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_connected_peers& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_connected_peers& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_connected_peers::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_connected_peers>(0);\n\t_visitor.template type_end<Router_get_connected_peers>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_connected_peers_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_connected_peers_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_connected_peers_return_HXX_\n#define INCLUDE_mmx_Router_get_connected_peers_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_connected_peers_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::string> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5c96b95e03d32e32ull;\n\t\n\tRouter_get_connected_peers_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_connected_peers_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_connected_peers_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_connected_peers_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_connected_peers_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_connected_peers_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Router_get_connected_peers_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_connected_peers_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_id.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_id_HXX_\n#define INCLUDE_mmx_Router_get_id_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_id : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb9f7168b5ae94cd9ull;\n\t\n\tRouter_get_id() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_id> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_id& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_id& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_id::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_id>(0);\n\t_visitor.template type_end<Router_get_id>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_id_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_id_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_id_return_HXX_\n#define INCLUDE_mmx_Router_get_id_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_id_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3924146b7a803806ull;\n\t\n\tRouter_get_id_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_id_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_id_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_id_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_id_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_id_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Router_get_id_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_id_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_info.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_info_HXX_\n#define INCLUDE_mmx_Router_get_info_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_info : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x364ea887c149a265ull;\n\t\n\tRouter_get_info() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_info> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_info& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_info& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_info::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_info>(0);\n\t_visitor.template type_end<Router_get_info>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_info_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_info_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_info_return_HXX_\n#define INCLUDE_mmx_Router_get_info_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/node_info_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_info_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::node_info_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x15170c71ca9209a9ull;\n\t\n\tRouter_get_info_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_info_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_info_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_info_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_info_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_info_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Router_get_info_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_info_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_known_peers.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_known_peers_HXX_\n#define INCLUDE_mmx_Router_get_known_peers_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_known_peers : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xaa408b6bf4e8168dull;\n\t\n\tRouter_get_known_peers() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_known_peers> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_known_peers& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_known_peers& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_known_peers::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_known_peers>(0);\n\t_visitor.template type_end<Router_get_known_peers>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_known_peers_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_known_peers_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_known_peers_return_HXX_\n#define INCLUDE_mmx_Router_get_known_peers_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_known_peers_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::string> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc08cde4fbf7f2abcull;\n\t\n\tRouter_get_known_peers_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_known_peers_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_known_peers_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_known_peers_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_known_peers_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_known_peers_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Router_get_known_peers_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_known_peers_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_peer_info.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_peer_info_HXX_\n#define INCLUDE_mmx_Router_get_peer_info_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_peer_info : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x520a467ef9324cb3ull;\n\t\n\tRouter_get_peer_info() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_peer_info> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_peer_info& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_peer_info& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_peer_info::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_peer_info>(0);\n\t_visitor.template type_end<Router_get_peer_info>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_peer_info_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_peer_info_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_peer_info_return_HXX_\n#define INCLUDE_mmx_Router_get_peer_info_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/PeerInfo.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_peer_info_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::PeerInfo> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xffff4ae0244281b5ull;\n\t\n\tRouter_get_peer_info_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_peer_info_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_peer_info_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_peer_info_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_peer_info_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_peer_info_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Router_get_peer_info_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_peer_info_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_peers.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_peers_HXX_\n#define INCLUDE_mmx_Router_get_peers_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_peers : public ::vnx::Value {\npublic:\n\t\n\tuint32_t max_count = 10;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x66d68bd91b462049ull;\n\t\n\tRouter_get_peers() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_peers> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_peers& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_peers& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_peers::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_peers>(1);\n\t_visitor.type_field(\"max_count\", 0); _visitor.accept(max_count);\n\t_visitor.template type_end<Router_get_peers>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_peers_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_get_peers_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_get_peers_return_HXX_\n#define INCLUDE_mmx_Router_get_peers_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_get_peers_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::string> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x595714f80f272d86ull;\n\t\n\tRouter_get_peers_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_get_peers_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_get_peers_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_get_peers_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_get_peers_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_get_peers_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Router_get_peers_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_get_peers_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_kick_peer.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_kick_peer_HXX_\n#define INCLUDE_mmx_Router_kick_peer_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_kick_peer : public ::vnx::Value {\npublic:\n\t\n\tstd::string address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x359a21379021beedull;\n\t\n\tRouter_kick_peer() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_kick_peer> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_kick_peer& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_kick_peer& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_kick_peer::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_kick_peer>(1);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.template type_end<Router_kick_peer>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_kick_peer_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_kick_peer_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_kick_peer_return_HXX_\n#define INCLUDE_mmx_Router_kick_peer_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_kick_peer_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd7189e110cc3a50full;\n\t\n\tRouter_kick_peer_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_kick_peer_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_kick_peer_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_kick_peer_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_kick_peer_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_kick_peer_return>(0);\n\t_visitor.template type_end<Router_kick_peer_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_kick_peer_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_sign_msg.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_sign_msg_HXX_\n#define INCLUDE_mmx_Router_sign_msg_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_sign_msg : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t msg;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x88ede2fbb99ab63eull;\n\t\n\tRouter_sign_msg() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_sign_msg> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_sign_msg& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_sign_msg& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_sign_msg::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_sign_msg>(1);\n\t_visitor.type_field(\"msg\", 0); _visitor.accept(msg);\n\t_visitor.template type_end<Router_sign_msg>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_sign_msg_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Router_sign_msg_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Router_sign_msg_return_HXX_\n#define INCLUDE_mmx_Router_sign_msg_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Router_sign_msg_return : public ::vnx::Value {\npublic:\n\t\n\tstd::pair<::mmx::pubkey_t, ::mmx::signature_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x67c8c37a7b5fc991ull;\n\t\n\tRouter_sign_msg_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Router_sign_msg_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Router_sign_msg_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Router_sign_msg_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Router_sign_msg_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Router_sign_msg_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Router_sign_msg_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Router_sign_msg_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Solution.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Solution_HXX_\n#define INCLUDE_mmx_Solution_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Solution : public ::vnx::Value {\npublic:\n\t\n\tuint32_t version = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9f693babd1a91ccdull;\n\t\n\tSolution() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const;\n\tvirtual ::mmx::hash_t calc_hash() const;\n\tvirtual uint64_t calc_cost(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const;\n\t\n\tstatic std::shared_ptr<Solution> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Solution& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Solution& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Solution::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Solution>(1);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.template type_end<Solution>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Solution_HXX_\n"
  },
  {
    "path": "generated/include/mmx/TimeLordAsyncClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_TimeLord_ASYNC_CLIENT_HXX_\n#define INCLUDE_mmx_TimeLord_ASYNC_CLIENT_HXX_\n\n#include <vnx/AsyncClient.h>\n#include <mmx/IntervalRequest.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n\n\nnamespace mmx {\n\nclass TimeLordAsyncClient : public vnx::AsyncClient {\npublic:\n\tTimeLordAsyncClient(const std::string& service_name);\n\t\n\tTimeLordAsyncClient(vnx::Hash64 service_addr);\n\t\n\tuint64_t stop_vdf(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config_object(\n\t\t\tconst std::function<void(const ::vnx::Object&)>& _callback = std::function<void(const ::vnx::Object&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config(const std::string& name = \"\", \n\t\t\tconst std::function<void(const ::vnx::Variant&)>& _callback = std::function<void(const ::vnx::Variant&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_type_code(\n\t\t\tconst std::function<void(const ::vnx::TypeCode&)>& _callback = std::function<void(const ::vnx::TypeCode&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_module_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_restart(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_stop(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_self_test(\n\t\t\tconst std::function<void(const vnx::bool_t&)>& _callback = std::function<void(const vnx::bool_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\nprotected:\n\tint32_t vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) override;\n\t\n\tint32_t vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) override;\n\t\nprivate:\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_stop_vdf;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Object&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Variant&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::TypeCode&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_type_code;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_module_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_restart;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_stop;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::bool_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_self_test;\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_TimeLord_ASYNC_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/TimeLordBase.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_TimeLordBase_HXX_\n#define INCLUDE_mmx_TimeLordBase_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/IntervalRequest.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT TimeLordBase : public ::vnx::Module {\npublic:\n\t\n\t::vnx::TopicPtr input_request = \"timelord.requests\";\n\t::vnx::TopicPtr output_proofs = \"timelord.proof\";\n\tuint32_t max_history = 1000000;\n\tstd::string node_server = \"Node\";\n\tstd::string wallet_server = \"Wallet\";\n\tstd::string storage_path;\n\tvnx::optional<::mmx::addr_t> reward_addr;\n\t\n\ttypedef ::vnx::Module Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x311081636f6570efull;\n\t\n\tTimeLordBase(const std::string& _vnx_name);\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const TimeLordBase& _value);\n\tfriend std::istream& operator>>(std::istream& _in, TimeLordBase& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tusing Super::handle;\n\t\n\tvirtual void stop_vdf() = 0;\n\tvirtual void handle(std::shared_ptr<const ::mmx::IntervalRequest> _value) {}\n\t\n\tvoid vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) override;\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) override;\n\t\n};\n\ntemplate<typename T>\nvoid TimeLordBase::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<TimeLordBase>(7);\n\t_visitor.type_field(\"input_request\", 0); _visitor.accept(input_request);\n\t_visitor.type_field(\"output_proofs\", 1); _visitor.accept(output_proofs);\n\t_visitor.type_field(\"max_history\", 2); _visitor.accept(max_history);\n\t_visitor.type_field(\"node_server\", 3); _visitor.accept(node_server);\n\t_visitor.type_field(\"wallet_server\", 4); _visitor.accept(wallet_server);\n\t_visitor.type_field(\"storage_path\", 5); _visitor.accept(storage_path);\n\t_visitor.type_field(\"reward_addr\", 6); _visitor.accept(reward_addr);\n\t_visitor.template type_end<TimeLordBase>(7);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_TimeLordBase_HXX_\n"
  },
  {
    "path": "generated/include/mmx/TimeLordClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_TimeLord_CLIENT_HXX_\n#define INCLUDE_mmx_TimeLord_CLIENT_HXX_\n\n#include <vnx/Client.h>\n#include <mmx/IntervalRequest.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n\n\nnamespace mmx {\n\nclass TimeLordClient : public vnx::Client {\npublic:\n\tTimeLordClient(const std::string& service_name);\n\t\n\tTimeLordClient(vnx::Hash64 service_addr);\n\t\n\tvoid stop_vdf();\n\t\n\tvoid stop_vdf_async();\n\t\n\t::vnx::Object vnx_get_config_object();\n\t\n\t::vnx::Variant vnx_get_config(const std::string& name = \"\");\n\t\n\tvoid vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config_object_async(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\tvoid vnx_set_config_async(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\t::vnx::TypeCode vnx_get_type_code();\n\t\n\tstd::shared_ptr<const ::vnx::ModuleInfo> vnx_get_module_info();\n\t\n\tvoid vnx_restart();\n\t\n\tvoid vnx_restart_async();\n\t\n\tvoid vnx_stop();\n\t\n\tvoid vnx_stop_async();\n\t\n\tvnx::bool_t vnx_self_test();\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_TimeLord_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/TimeLord_stop_vdf.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_TimeLord_stop_vdf_HXX_\n#define INCLUDE_mmx_TimeLord_stop_vdf_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT TimeLord_stop_vdf : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf7f78eb9f371e6e7ull;\n\t\n\tTimeLord_stop_vdf() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<TimeLord_stop_vdf> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const TimeLord_stop_vdf& _value);\n\tfriend std::istream& operator>>(std::istream& _in, TimeLord_stop_vdf& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid TimeLord_stop_vdf::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<TimeLord_stop_vdf>(0);\n\t_visitor.template type_end<TimeLord_stop_vdf>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_TimeLord_stop_vdf_HXX_\n"
  },
  {
    "path": "generated/include/mmx/TimeLord_stop_vdf_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_TimeLord_stop_vdf_return_HXX_\n#define INCLUDE_mmx_TimeLord_stop_vdf_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT TimeLord_stop_vdf_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x53e37fb500ea3a9full;\n\t\n\tTimeLord_stop_vdf_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<TimeLord_stop_vdf_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const TimeLord_stop_vdf_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, TimeLord_stop_vdf_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid TimeLord_stop_vdf_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<TimeLord_stop_vdf_return>(0);\n\t_visitor.template type_end<TimeLord_stop_vdf_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_TimeLord_stop_vdf_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Transaction.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Transaction_HXX_\n#define INCLUDE_mmx_Transaction_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/Operation.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/TransactionBase.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/exec_result_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/tx_index_t.hxx>\n#include <mmx/tx_note_e.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/txout_t.hxx>\n#include <mmx/uint128.hpp>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Transaction : public ::mmx::TransactionBase {\npublic:\n\tstatic const uint32_t MAX_SOLUTIONS = 65535;\n\t\n\tuint32_t version = 0;\n\tuint32_t expires = -1;\n\tuint32_t fee_ratio = 1024;\n\tuint32_t static_cost = 0;\n\tuint32_t max_fee_amount = 0;\n\t::mmx::tx_note_e note;\n\tuint64_t nonce = 0;\n\tstd::string network;\n\tvnx::optional<::mmx::addr_t> sender;\n\tstd::vector<::mmx::txin_t> inputs;\n\tstd::vector<::mmx::txout_t> outputs;\n\tstd::vector<std::shared_ptr<const ::mmx::Operation>> execute;\n\tstd::vector<std::shared_ptr<const ::mmx::Solution>> solutions;\n\tstd::shared_ptr<const ::mmx::Contract> deploy;\n\tvnx::optional<::mmx::exec_result_t> exec_result;\n\t::mmx::hash_t content_hash;\n\t\n\ttypedef ::mmx::TransactionBase Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xce0462acdceaa5bcull;\n\t\n\tTransaction() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual void reset(std::shared_ptr<const ::mmx::ChainParams> params = nullptr);\n\tvirtual void update(const ::mmx::exec_result_t& result = ::mmx::exec_result_t(), std::shared_ptr<const ::mmx::ChainParams> params = nullptr);\n\tvirtual void finalize();\n\tvirtual void add_input(const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::uint128& amount = ::mmx::uint128());\n\tvirtual void add_output(const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::uint128& amount = ::mmx::uint128(), const vnx::optional<std::string>& memo = nullptr);\n\tvirtual void merge_sign(std::shared_ptr<const ::mmx::Transaction> tx = nullptr);\n\tvirtual vnx::bool_t is_valid(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const;\n\tvirtual vnx::bool_t is_signed() const;\n\tvirtual vnx::bool_t did_fail() const;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = false) const override;\n\tvirtual uint64_t calc_cost(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const override;\n\tvirtual std::shared_ptr<const ::mmx::Solution> get_solution(const uint32_t& index = 0) const;\n\tvirtual std::vector<::mmx::txin_t> get_inputs() const;\n\tvirtual std::vector<::mmx::txout_t> get_outputs() const;\n\tvirtual std::vector<std::shared_ptr<const ::mmx::Operation>> get_operations() const;\n\tvirtual std::map<::mmx::addr_t, std::pair<::mmx::uint128, ::mmx::uint128>> get_balance() const;\n\tvirtual std::vector<uint8_t> hash_serialize(const vnx::bool_t& full_hash = false) const;\n\tvirtual ::mmx::tx_index_t get_tx_index(std::shared_ptr<const ::mmx::ChainParams> params = nullptr, std::shared_ptr<const ::mmx::BlockHeader> block = nullptr, const int64_t& file_offset = 0) const;\n\t\n\tstatic std::shared_ptr<Transaction> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Transaction& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Transaction& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Transaction::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Transaction>(17);\n\t_visitor.type_field(\"id\", 0); _visitor.accept(id);\n\t_visitor.type_field(\"version\", 1); _visitor.accept(version);\n\t_visitor.type_field(\"expires\", 2); _visitor.accept(expires);\n\t_visitor.type_field(\"fee_ratio\", 3); _visitor.accept(fee_ratio);\n\t_visitor.type_field(\"static_cost\", 4); _visitor.accept(static_cost);\n\t_visitor.type_field(\"max_fee_amount\", 5); _visitor.accept(max_fee_amount);\n\t_visitor.type_field(\"note\", 6); _visitor.accept(note);\n\t_visitor.type_field(\"nonce\", 7); _visitor.accept(nonce);\n\t_visitor.type_field(\"network\", 8); _visitor.accept(network);\n\t_visitor.type_field(\"sender\", 9); _visitor.accept(sender);\n\t_visitor.type_field(\"inputs\", 10); _visitor.accept(inputs);\n\t_visitor.type_field(\"outputs\", 11); _visitor.accept(outputs);\n\t_visitor.type_field(\"execute\", 12); _visitor.accept(execute);\n\t_visitor.type_field(\"solutions\", 13); _visitor.accept(solutions);\n\t_visitor.type_field(\"deploy\", 14); _visitor.accept(deploy);\n\t_visitor.type_field(\"exec_result\", 15); _visitor.accept(exec_result);\n\t_visitor.type_field(\"content_hash\", 16); _visitor.accept(content_hash);\n\t_visitor.template type_end<Transaction>(17);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Transaction_HXX_\n"
  },
  {
    "path": "generated/include/mmx/TransactionBase.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_TransactionBase_HXX_\n#define INCLUDE_mmx_TransactionBase_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT TransactionBase : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t id;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6697ffbf3611887dull;\n\t\n\tTransactionBase() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = false) const;\n\tvirtual uint64_t calc_cost(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const;\n\tstatic std::shared_ptr<const ::mmx::TransactionBase> create_ex(const ::mmx::hash_t& id = ::mmx::hash_t());\n\t\n\tstatic std::shared_ptr<TransactionBase> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const TransactionBase& _value);\n\tfriend std::istream& operator>>(std::istream& _in, TransactionBase& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid TransactionBase::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<TransactionBase>(1);\n\t_visitor.type_field(\"id\", 0); _visitor.accept(id);\n\t_visitor.template type_end<TransactionBase>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_TransactionBase_HXX_\n"
  },
  {
    "path": "generated/include/mmx/VDF_Point.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_VDF_Point_HXX_\n#define INCLUDE_mmx_VDF_Point_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT VDF_Point : public ::vnx::Value {\npublic:\n\t\n\tuint32_t vdf_height = 0;\n\tuint64_t start = 0;\n\tuint64_t num_iters = 0;\n\t::mmx::hash_t input;\n\t::mmx::hash_t output;\n\t::mmx::hash_t prev;\n\t::mmx::addr_t reward_addr;\n\t::mmx::hash_t content_hash;\n\tint64_t recv_time = 0;\n\tstd::shared_ptr<const ::mmx::ProofOfTime> proof;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1671551501b6c956ull;\n\t\n\tVDF_Point() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const;\n\tvirtual ::mmx::hash_t calc_hash() const;\n\t\n\tstatic std::shared_ptr<VDF_Point> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const VDF_Point& _value);\n\tfriend std::istream& operator>>(std::istream& _in, VDF_Point& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid VDF_Point::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<VDF_Point>(10);\n\t_visitor.type_field(\"vdf_height\", 0); _visitor.accept(vdf_height);\n\t_visitor.type_field(\"start\", 1); _visitor.accept(start);\n\t_visitor.type_field(\"num_iters\", 2); _visitor.accept(num_iters);\n\t_visitor.type_field(\"input\", 3); _visitor.accept(input);\n\t_visitor.type_field(\"output\", 4); _visitor.accept(output);\n\t_visitor.type_field(\"prev\", 5); _visitor.accept(prev);\n\t_visitor.type_field(\"reward_addr\", 6); _visitor.accept(reward_addr);\n\t_visitor.type_field(\"content_hash\", 7); _visitor.accept(content_hash);\n\t_visitor.type_field(\"recv_time\", 8); _visitor.accept(recv_time);\n\t_visitor.type_field(\"proof\", 9); _visitor.accept(proof);\n\t_visitor.template type_end<VDF_Point>(10);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_VDF_Point_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ValidatorVote.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ValidatorVote_HXX_\n#define INCLUDE_mmx_ValidatorVote_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT ValidatorVote : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t hash;\n\t::mmx::pubkey_t farmer_key;\n\t::mmx::signature_t farmer_sig;\n\t::mmx::hash_t content_hash;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc056a2ff24cdee25ull;\n\t\n\tValidatorVote() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const;\n\tvirtual ::mmx::hash_t calc_content_hash() const;\n\t\n\tstatic std::shared_ptr<ValidatorVote> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ValidatorVote& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ValidatorVote& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid ValidatorVote::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ValidatorVote>(4);\n\t_visitor.type_field(\"hash\", 0); _visitor.accept(hash);\n\t_visitor.type_field(\"farmer_key\", 1); _visitor.accept(farmer_key);\n\t_visitor.type_field(\"farmer_sig\", 2); _visitor.accept(farmer_sig);\n\t_visitor.type_field(\"content_hash\", 3); _visitor.accept(content_hash);\n\t_visitor.template type_end<ValidatorVote>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_ValidatorVote_HXX_\n"
  },
  {
    "path": "generated/include/mmx/WalletAsyncClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_ASYNC_CLIENT_HXX_\n#define INCLUDE_mmx_Wallet_ASYNC_CLIENT_HXX_\n\n#include <vnx/AsyncClient.h>\n#include <mmx/Contract.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/account_info_t.hxx>\n#include <mmx/account_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/skey_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_log_entry_t.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Module.h>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass WalletAsyncClient : public vnx::AsyncClient {\npublic:\n\tWalletAsyncClient(const std::string& service_name);\n\t\n\tWalletAsyncClient(vnx::Hash64 service_addr);\n\t\n\tuint64_t send(const uint32_t& index = 0, const ::mmx::uint128& amount = ::mmx::uint128(), const ::mmx::addr_t& dst_addr = ::mmx::addr_t(), const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t send_many(const uint32_t& index = 0, const std::vector<std::pair<::mmx::addr_t, ::mmx::uint128>>& amounts = {}, const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t send_from(const uint32_t& index = 0, const ::mmx::uint128& amount = ::mmx::uint128(), const ::mmx::addr_t& dst_addr = ::mmx::addr_t(), const ::mmx::addr_t& src_addr = ::mmx::addr_t(), const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t deploy(const uint32_t& index = 0, std::shared_ptr<const ::mmx::Contract> contract = nullptr, const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t execute(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const std::string& method = \"\", const std::vector<::vnx::Variant>& args = {}, const vnx::optional<uint32_t>& user = nullptr, const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t deposit(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const std::string& method = \"\", const std::vector<::vnx::Variant>& args = {}, const ::mmx::uint128& amount = ::mmx::uint128(), const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t make_offer(const uint32_t& index = 0, const uint32_t& owner = 0, const ::mmx::uint128& bid_amount = ::mmx::uint128(), const ::mmx::addr_t& bid_currency = ::mmx::addr_t(), const ::mmx::uint128& ask_amount = ::mmx::uint128(), const ::mmx::addr_t& ask_currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t offer_trade(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::uint128& amount = ::mmx::uint128(), const uint32_t& dst_addr = 0, const ::mmx::uint128& price = ::mmx::uint128(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t offer_withdraw(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t accept_offer(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const uint32_t& dst_addr = 0, const ::mmx::uint128& price = ::mmx::uint128(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t cancel_offer(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t swap_trade(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::uint128& amount = ::mmx::uint128(), const ::mmx::addr_t& currency = ::mmx::addr_t(), const vnx::optional<::mmx::uint128>& min_trade = nullptr, const int32_t& num_iter = 20, const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t swap_add_liquid(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const std::array<::mmx::uint128, 2>& amount = {}, const uint32_t& pool_idx = 0, const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t swap_rem_liquid(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const std::array<::mmx::uint128, 2>& amount = {}, const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t plotnft_exec(const ::mmx::addr_t& address = ::mmx::addr_t(), const std::string& method = \"\", const std::vector<::vnx::Variant>& args = {}, const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t plotnft_create(const uint32_t& index = 0, const std::string& name = \"\", const vnx::optional<uint32_t>& owner = nullptr, const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t complete(const uint32_t& index = 0, std::shared_ptr<const ::mmx::Transaction> tx = nullptr, const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t sign_off(const uint32_t& index = 0, std::shared_ptr<const ::mmx::Transaction> tx = nullptr, const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Transaction>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t sign_msg(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::hash_t& msg = ::mmx::hash_t(), \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::Solution>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::Solution>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t send_off(const uint32_t& index = 0, std::shared_ptr<const ::mmx::Transaction> tx = nullptr, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t mark_spent(const uint32_t& index = 0, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts = {}, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t reserve(const uint32_t& index = 0, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts = {}, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t release(const uint32_t& index = 0, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts = {}, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t release_all(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t reset_cache(const uint32_t& index = 0, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t update_cache(const uint32_t& index = 0, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_history(const uint32_t& index = 0, const ::mmx::query_filter_t& filter = ::mmx::query_filter_t(), \n\t\t\tconst std::function<void(const std::vector<::mmx::tx_entry_t>&)>& _callback = std::function<void(const std::vector<::mmx::tx_entry_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_tx_log(const uint32_t& index = 0, const int32_t& limit = 100, \n\t\t\tconst std::function<void(const std::vector<::mmx::tx_log_entry_t>&)>& _callback = std::function<void(const std::vector<::mmx::tx_log_entry_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t gather_inputs_for(const uint32_t& index = 0, const ::mmx::uint128& amount = ::mmx::uint128(), const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t(), \n\t\t\tconst std::function<void(const std::vector<::mmx::txin_t>&)>& _callback = std::function<void(const std::vector<::mmx::txin_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_balance(const uint32_t& index = 0, const ::mmx::addr_t& currency = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const ::mmx::balance_t&)>& _callback = std::function<void(const ::mmx::balance_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_balances(const uint32_t& index = 0, const vnx::bool_t& with_zero = 0, \n\t\t\tconst std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>& _callback = std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_total_balances(const std::vector<::mmx::addr_t>& addresses = {}, \n\t\t\tconst std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>& _callback = std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_contract_balances(const ::mmx::addr_t& address = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>& _callback = std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_contracts(const uint32_t& index = 0, const vnx::optional<std::string>& type_name = nullptr, const vnx::optional<::mmx::hash_t>& type_hash = nullptr, \n\t\t\tconst std::function<void(const std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>&)>& _callback = std::function<void(const std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_contracts_owned(const uint32_t& index = 0, const vnx::optional<std::string>& type_name = nullptr, const vnx::optional<::mmx::hash_t>& type_hash = nullptr, \n\t\t\tconst std::function<void(const std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>&)>& _callback = std::function<void(const std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_offers(const uint32_t& index = 0, const vnx::bool_t& state = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback = std::function<void(const std::vector<::mmx::offer_data_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_swap_liquidity(const uint32_t& index = 0, \n\t\t\tconst std::function<void(const std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>&)>& _callback = std::function<void(const std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_address(const uint32_t& index = 0, const uint32_t& offset = 0, \n\t\t\tconst std::function<void(const ::mmx::addr_t&)>& _callback = std::function<void(const ::mmx::addr_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_all_addresses(const int32_t& index = 0, \n\t\t\tconst std::function<void(const std::vector<::mmx::addr_t>&)>& _callback = std::function<void(const std::vector<::mmx::addr_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t find_wallet_by_addr(const ::mmx::addr_t& address = ::mmx::addr_t(), \n\t\t\tconst std::function<void(const int32_t&)>& _callback = std::function<void(const int32_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_account(const uint32_t& index = 0, \n\t\t\tconst std::function<void(const ::mmx::account_info_t&)>& _callback = std::function<void(const ::mmx::account_info_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_all_accounts(\n\t\t\tconst std::function<void(const std::vector<::mmx::account_info_t>&)>& _callback = std::function<void(const std::vector<::mmx::account_info_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t is_locked(const uint32_t& index = 0, \n\t\t\tconst std::function<void(const vnx::bool_t&)>& _callback = std::function<void(const vnx::bool_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t lock(const uint32_t& index = 0, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t unlock(const uint32_t& index = 0, const std::string& passphrase = \"\", \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t add_account(const uint32_t& index = 0, const ::mmx::account_t& config = ::mmx::account_t(), const vnx::optional<std::string>& passphrase = nullptr, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t create_account(const ::mmx::account_t& config = ::mmx::account_t(), const vnx::optional<std::string>& passphrase = nullptr, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t create_wallet(const ::mmx::account_t& config = ::mmx::account_t(), const vnx::optional<std::string>& words = nullptr, const vnx::optional<std::string>& passphrase = nullptr, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t import_wallet(const ::mmx::account_t& config = ::mmx::account_t(), std::shared_ptr<const ::mmx::KeyFile> key_file = nullptr, const vnx::optional<std::string>& passphrase = nullptr, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t remove_account(const uint32_t& index = 0, const uint32_t& account = 0, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t set_address_count(const uint32_t& index = 0, const uint32_t& count = 0, \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_mnemonic_wordlist(const std::string& lang = \"en\", \n\t\t\tconst std::function<void(const std::vector<std::string>&)>& _callback = std::function<void(const std::vector<std::string>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_token_list(\n\t\t\tconst std::function<void(const std::set<::mmx::addr_t>&)>& _callback = std::function<void(const std::set<::mmx::addr_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t add_token(const ::mmx::addr_t& address = ::mmx::addr_t(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t rem_token(const ::mmx::addr_t& address = ::mmx::addr_t(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t export_wallet(const uint32_t& index = 0, \n\t\t\tconst std::function<void(std::shared_ptr<const ::mmx::KeyFile>)>& _callback = std::function<void(std::shared_ptr<const ::mmx::KeyFile>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_master_seed(const uint32_t& index = 0, \n\t\t\tconst std::function<void(const ::mmx::hash_t&)>& _callback = std::function<void(const ::mmx::hash_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_mnemonic_seed(const uint32_t& index = 0, \n\t\t\tconst std::function<void(const std::vector<std::string>&)>& _callback = std::function<void(const std::vector<std::string>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_farmer_keys(const uint32_t& index = 0, \n\t\t\tconst std::function<void(const std::pair<::mmx::skey_t, ::mmx::pubkey_t>&)>& _callback = std::function<void(const std::pair<::mmx::skey_t, ::mmx::pubkey_t>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t get_all_farmer_keys(\n\t\t\tconst std::function<void(const std::vector<std::pair<::mmx::skey_t, ::mmx::pubkey_t>>&)>& _callback = std::function<void(const std::vector<std::pair<::mmx::skey_t, ::mmx::pubkey_t>>&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", \n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", const int64_t& offset = 0, const int64_t& max_bytes = 0, \n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config_object(\n\t\t\tconst std::function<void(const ::vnx::Object&)>& _callback = std::function<void(const ::vnx::Object&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config(const std::string& name = \"\", \n\t\t\tconst std::function<void(const ::vnx::Variant&)>& _callback = std::function<void(const ::vnx::Variant&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_type_code(\n\t\t\tconst std::function<void(const ::vnx::TypeCode&)>& _callback = std::function<void(const ::vnx::TypeCode&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_module_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_restart(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_stop(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_self_test(\n\t\t\tconst std::function<void(const vnx::bool_t&)>& _callback = std::function<void(const vnx::bool_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\nprotected:\n\tint32_t vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) override;\n\t\n\tint32_t vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) override;\n\t\nprivate:\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_send;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_send_many;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_send_from;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_deploy;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_execute;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_deposit;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_make_offer;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_offer_trade;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_offer_withdraw;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_accept_offer;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_cancel_offer;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_swap_trade;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_swap_add_liquid;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_swap_rem_liquid;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_plotnft_exec;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_plotnft_create;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_complete;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Transaction>)>, std::function<void(const vnx::exception&)>>> vnx_queue_sign_off;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::Solution>)>, std::function<void(const vnx::exception&)>>> vnx_queue_sign_msg;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_send_off;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_mark_spent;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_reserve;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_release;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_release_all;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_reset_cache;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_update_cache;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::tx_entry_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_history;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::tx_log_entry_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_tx_log;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::txin_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_gather_inputs_for;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::balance_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_balance;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_balances;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_total_balances;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_contract_balances;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_contracts;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_contracts_owned;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::offer_data_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_offers;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_swap_liquidity;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::addr_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_address;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::addr_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_all_addresses;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const int32_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_find_wallet_by_addr;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::account_info_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_account;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<::mmx::account_info_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_all_accounts;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::bool_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_is_locked;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_lock;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_unlock;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_add_account;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_create_account;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_create_wallet;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_import_wallet;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_remove_account;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_set_address_count;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<std::string>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_mnemonic_wordlist;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::set<::mmx::addr_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_token_list;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_add_token;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_rem_token;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::mmx::KeyFile>)>, std::function<void(const vnx::exception&)>>> vnx_queue_export_wallet;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::mmx::hash_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_master_seed;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<std::string>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_mnemonic_seed;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::pair<::mmx::skey_t, ::mmx::pubkey_t>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_farmer_keys;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const std::vector<std::pair<::mmx::skey_t, ::mmx::pubkey_t>>&)>, std::function<void(const vnx::exception&)>>> vnx_queue_get_all_farmer_keys;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>, std::function<void(const vnx::exception&)>>> vnx_queue_http_request;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>, std::function<void(const vnx::exception&)>>> vnx_queue_http_request_chunk;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Object&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Variant&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::TypeCode&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_type_code;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_module_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_restart;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_stop;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::bool_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_self_test;\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_Wallet_ASYNC_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/WalletBase.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_WalletBase_HXX_\n#define INCLUDE_mmx_WalletBase_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/account_info_t.hxx>\n#include <mmx/account_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/skey_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_log_entry_t.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Module.h>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT WalletBase : public ::vnx::Module {\npublic:\n\t\n\tstd::vector<std::string> key_files;\n\tstd::vector<::mmx::account_t> accounts;\n\tstd::string config_path;\n\tstd::string storage_path;\n\tstd::string database_path = \"wallet/\";\n\tstd::string node_server = \"Node\";\n\tuint32_t max_key_files = 100;\n\tuint32_t num_addresses = 100;\n\tuint32_t max_addresses = 10000;\n\tuint32_t default_expire = 100;\n\tint32_t lock_timeout_sec = 600;\n\tint32_t cache_timeout_ms = 1000;\n\tstd::set<::mmx::addr_t> token_whitelist;\n\t\n\ttypedef ::vnx::Module Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x62207fd96d3aead7ull;\n\t\n\tWalletBase(const std::string& _vnx_name);\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const WalletBase& _value);\n\tfriend std::istream& operator>>(std::istream& _in, WalletBase& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tusing Super::handle;\n\t\n\tvirtual std::shared_ptr<const ::mmx::Transaction> send(const uint32_t& index, const ::mmx::uint128& amount, const ::mmx::addr_t& dst_addr, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> send_many(const uint32_t& index, const std::vector<std::pair<::mmx::addr_t, ::mmx::uint128>>& amounts, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> send_from(const uint32_t& index, const ::mmx::uint128& amount, const ::mmx::addr_t& dst_addr, const ::mmx::addr_t& src_addr, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> deploy(const uint32_t& index, std::shared_ptr<const ::mmx::Contract> contract, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> execute(const uint32_t& index, const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const vnx::optional<uint32_t>& user, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> deposit(const uint32_t& index, const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const ::mmx::uint128& amount, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> make_offer(const uint32_t& index, const uint32_t& owner, const ::mmx::uint128& bid_amount, const ::mmx::addr_t& bid_currency, const ::mmx::uint128& ask_amount, const ::mmx::addr_t& ask_currency, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> offer_trade(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::uint128& amount, const uint32_t& dst_addr, const ::mmx::uint128& price, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> offer_withdraw(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> accept_offer(const uint32_t& index, const ::mmx::addr_t& address, const uint32_t& dst_addr, const ::mmx::uint128& price, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> cancel_offer(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> swap_trade(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::uint128& amount, const ::mmx::addr_t& currency, const vnx::optional<::mmx::uint128>& min_trade, const int32_t& num_iter, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> swap_add_liquid(const uint32_t& index, const ::mmx::addr_t& address, const std::array<::mmx::uint128, 2>& amount, const uint32_t& pool_idx, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> swap_rem_liquid(const uint32_t& index, const ::mmx::addr_t& address, const std::array<::mmx::uint128, 2>& amount, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> plotnft_exec(const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> plotnft_create(const uint32_t& index, const std::string& name, const vnx::optional<uint32_t>& owner, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> complete(const uint32_t& index, std::shared_ptr<const ::mmx::Transaction> tx, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Transaction> sign_off(const uint32_t& index, std::shared_ptr<const ::mmx::Transaction> tx, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual std::shared_ptr<const ::mmx::Solution> sign_msg(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::hash_t& msg) const = 0;\n\tvirtual void send_off(const uint32_t& index, std::shared_ptr<const ::mmx::Transaction> tx) const = 0;\n\tvirtual void mark_spent(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts) = 0;\n\tvirtual void reserve(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts) = 0;\n\tvirtual void release(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts) = 0;\n\tvirtual void release_all() = 0;\n\tvirtual void reset_cache(const uint32_t& index) = 0;\n\tvirtual void update_cache(const uint32_t& index) const = 0;\n\tvirtual std::vector<::mmx::tx_entry_t> get_history(const uint32_t& index, const ::mmx::query_filter_t& filter) const = 0;\n\tvirtual std::vector<::mmx::tx_log_entry_t> get_tx_log(const uint32_t& index, const int32_t& limit) const = 0;\n\tvirtual std::vector<::mmx::txin_t> gather_inputs_for(const uint32_t& index, const ::mmx::uint128& amount, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options) const = 0;\n\tvirtual ::mmx::balance_t get_balance(const uint32_t& index, const ::mmx::addr_t& currency) const = 0;\n\tvirtual std::map<::mmx::addr_t, ::mmx::balance_t> get_balances(const uint32_t& index, const vnx::bool_t& with_zero) const = 0;\n\tvirtual std::map<::mmx::addr_t, ::mmx::balance_t> get_total_balances(const std::vector<::mmx::addr_t>& addresses) const = 0;\n\tvirtual std::map<::mmx::addr_t, ::mmx::balance_t> get_contract_balances(const ::mmx::addr_t& address) const = 0;\n\tvirtual std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>> get_contracts(const uint32_t& index, const vnx::optional<std::string>& type_name, const vnx::optional<::mmx::hash_t>& type_hash) const = 0;\n\tvirtual std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>> get_contracts_owned(const uint32_t& index, const vnx::optional<std::string>& type_name, const vnx::optional<::mmx::hash_t>& type_hash) const = 0;\n\tvirtual std::vector<::mmx::offer_data_t> get_offers(const uint32_t& index, const vnx::bool_t& state) const = 0;\n\tvirtual std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>> get_swap_liquidity(const uint32_t& index) const = 0;\n\tvirtual ::mmx::addr_t get_address(const uint32_t& index, const uint32_t& offset) const = 0;\n\tvirtual std::vector<::mmx::addr_t> get_all_addresses(const int32_t& index) const = 0;\n\tvirtual int32_t find_wallet_by_addr(const ::mmx::addr_t& address) const = 0;\n\tvirtual ::mmx::account_info_t get_account(const uint32_t& index) const = 0;\n\tvirtual std::vector<::mmx::account_info_t> get_all_accounts() const = 0;\n\tvirtual vnx::bool_t is_locked(const uint32_t& index) const = 0;\n\tvirtual void lock(const uint32_t& index) = 0;\n\tvirtual void unlock(const uint32_t& index, const std::string& passphrase) = 0;\n\tvirtual void add_account(const uint32_t& index, const ::mmx::account_t& config, const vnx::optional<std::string>& passphrase) = 0;\n\tvirtual void create_account(const ::mmx::account_t& config, const vnx::optional<std::string>& passphrase) = 0;\n\tvirtual void create_wallet(const ::mmx::account_t& config, const vnx::optional<std::string>& words, const vnx::optional<std::string>& passphrase) = 0;\n\tvirtual void import_wallet(const ::mmx::account_t& config, std::shared_ptr<const ::mmx::KeyFile> key_file, const vnx::optional<std::string>& passphrase) = 0;\n\tvirtual void remove_account(const uint32_t& index, const uint32_t& account) = 0;\n\tvirtual void set_address_count(const uint32_t& index, const uint32_t& count) = 0;\n\tvirtual std::vector<std::string> get_mnemonic_wordlist(const std::string& lang) const = 0;\n\tvirtual std::set<::mmx::addr_t> get_token_list() const = 0;\n\tvirtual void add_token(const ::mmx::addr_t& address) = 0;\n\tvirtual void rem_token(const ::mmx::addr_t& address) = 0;\n\tvirtual std::shared_ptr<const ::mmx::KeyFile> export_wallet(const uint32_t& index) const = 0;\n\tvirtual ::mmx::hash_t get_master_seed(const uint32_t& index) const = 0;\n\tvirtual std::vector<std::string> get_mnemonic_seed(const uint32_t& index) const = 0;\n\tvirtual std::pair<::mmx::skey_t, ::mmx::pubkey_t> get_farmer_keys(const uint32_t& index) const = 0;\n\tvirtual std::vector<std::pair<::mmx::skey_t, ::mmx::pubkey_t>> get_all_farmer_keys() const = 0;\n\tvirtual void http_request_async(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const vnx::request_id_t& _request_id) const = 0;\n\tvoid http_request_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpResponse>& _ret_0) const;\n\tvirtual void http_request_chunk_async(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& _request_id) const = 0;\n\tvoid http_request_chunk_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpData>& _ret_0) const;\n\t\n\tvoid vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) override;\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) override;\n\t\n};\n\ntemplate<typename T>\nvoid WalletBase::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<WalletBase>(13);\n\t_visitor.type_field(\"key_files\", 0); _visitor.accept(key_files);\n\t_visitor.type_field(\"accounts\", 1); _visitor.accept(accounts);\n\t_visitor.type_field(\"config_path\", 2); _visitor.accept(config_path);\n\t_visitor.type_field(\"storage_path\", 3); _visitor.accept(storage_path);\n\t_visitor.type_field(\"database_path\", 4); _visitor.accept(database_path);\n\t_visitor.type_field(\"node_server\", 5); _visitor.accept(node_server);\n\t_visitor.type_field(\"max_key_files\", 6); _visitor.accept(max_key_files);\n\t_visitor.type_field(\"num_addresses\", 7); _visitor.accept(num_addresses);\n\t_visitor.type_field(\"max_addresses\", 8); _visitor.accept(max_addresses);\n\t_visitor.type_field(\"default_expire\", 9); _visitor.accept(default_expire);\n\t_visitor.type_field(\"lock_timeout_sec\", 10); _visitor.accept(lock_timeout_sec);\n\t_visitor.type_field(\"cache_timeout_ms\", 11); _visitor.accept(cache_timeout_ms);\n\t_visitor.type_field(\"token_whitelist\", 12); _visitor.accept(token_whitelist);\n\t_visitor.template type_end<WalletBase>(13);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_WalletBase_HXX_\n"
  },
  {
    "path": "generated/include/mmx/WalletClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_CLIENT_HXX_\n#define INCLUDE_mmx_Wallet_CLIENT_HXX_\n\n#include <vnx/Client.h>\n#include <mmx/Contract.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/account_info_t.hxx>\n#include <mmx/account_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/skey_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_log_entry_t.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Module.h>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass WalletClient : public vnx::Client {\npublic:\n\tWalletClient(const std::string& service_name);\n\t\n\tWalletClient(vnx::Hash64 service_addr);\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> send(const uint32_t& index = 0, const ::mmx::uint128& amount = ::mmx::uint128(), const ::mmx::addr_t& dst_addr = ::mmx::addr_t(), const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> send_many(const uint32_t& index = 0, const std::vector<std::pair<::mmx::addr_t, ::mmx::uint128>>& amounts = {}, const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> send_from(const uint32_t& index = 0, const ::mmx::uint128& amount = ::mmx::uint128(), const ::mmx::addr_t& dst_addr = ::mmx::addr_t(), const ::mmx::addr_t& src_addr = ::mmx::addr_t(), const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> deploy(const uint32_t& index = 0, std::shared_ptr<const ::mmx::Contract> contract = nullptr, const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> execute(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const std::string& method = \"\", const std::vector<::vnx::Variant>& args = {}, const vnx::optional<uint32_t>& user = nullptr, const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> deposit(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const std::string& method = \"\", const std::vector<::vnx::Variant>& args = {}, const ::mmx::uint128& amount = ::mmx::uint128(), const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> make_offer(const uint32_t& index = 0, const uint32_t& owner = 0, const ::mmx::uint128& bid_amount = ::mmx::uint128(), const ::mmx::addr_t& bid_currency = ::mmx::addr_t(), const ::mmx::uint128& ask_amount = ::mmx::uint128(), const ::mmx::addr_t& ask_currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> offer_trade(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::uint128& amount = ::mmx::uint128(), const uint32_t& dst_addr = 0, const ::mmx::uint128& price = ::mmx::uint128(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> offer_withdraw(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> accept_offer(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const uint32_t& dst_addr = 0, const ::mmx::uint128& price = ::mmx::uint128(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> cancel_offer(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> swap_trade(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::uint128& amount = ::mmx::uint128(), const ::mmx::addr_t& currency = ::mmx::addr_t(), const vnx::optional<::mmx::uint128>& min_trade = nullptr, const int32_t& num_iter = 20, const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> swap_add_liquid(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const std::array<::mmx::uint128, 2>& amount = {}, const uint32_t& pool_idx = 0, const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> swap_rem_liquid(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const std::array<::mmx::uint128, 2>& amount = {}, const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> plotnft_exec(const ::mmx::addr_t& address = ::mmx::addr_t(), const std::string& method = \"\", const std::vector<::vnx::Variant>& args = {}, const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> plotnft_create(const uint32_t& index = 0, const std::string& name = \"\", const vnx::optional<uint32_t>& owner = nullptr, const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> complete(const uint32_t& index = 0, std::shared_ptr<const ::mmx::Transaction> tx = nullptr, const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> sign_off(const uint32_t& index = 0, std::shared_ptr<const ::mmx::Transaction> tx = nullptr, const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\tstd::shared_ptr<const ::mmx::Solution> sign_msg(const uint32_t& index = 0, const ::mmx::addr_t& address = ::mmx::addr_t(), const ::mmx::hash_t& msg = ::mmx::hash_t());\n\t\n\tvoid send_off(const uint32_t& index = 0, std::shared_ptr<const ::mmx::Transaction> tx = nullptr);\n\t\n\tvoid send_off_async(const uint32_t& index = 0, std::shared_ptr<const ::mmx::Transaction> tx = nullptr);\n\t\n\tvoid mark_spent(const uint32_t& index = 0, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts = {});\n\t\n\tvoid mark_spent_async(const uint32_t& index = 0, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts = {});\n\t\n\tvoid reserve(const uint32_t& index = 0, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts = {});\n\t\n\tvoid reserve_async(const uint32_t& index = 0, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts = {});\n\t\n\tvoid release(const uint32_t& index = 0, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts = {});\n\t\n\tvoid release_async(const uint32_t& index = 0, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts = {});\n\t\n\tvoid release_all();\n\t\n\tvoid release_all_async();\n\t\n\tvoid reset_cache(const uint32_t& index = 0);\n\t\n\tvoid reset_cache_async(const uint32_t& index = 0);\n\t\n\tvoid update_cache(const uint32_t& index = 0);\n\t\n\tvoid update_cache_async(const uint32_t& index = 0);\n\t\n\tstd::vector<::mmx::tx_entry_t> get_history(const uint32_t& index = 0, const ::mmx::query_filter_t& filter = ::mmx::query_filter_t());\n\t\n\tstd::vector<::mmx::tx_log_entry_t> get_tx_log(const uint32_t& index = 0, const int32_t& limit = 100);\n\t\n\tstd::vector<::mmx::txin_t> gather_inputs_for(const uint32_t& index = 0, const ::mmx::uint128& amount = ::mmx::uint128(), const ::mmx::addr_t& currency = ::mmx::addr_t(), const ::mmx::spend_options_t& options = ::mmx::spend_options_t());\n\t\n\t::mmx::balance_t get_balance(const uint32_t& index = 0, const ::mmx::addr_t& currency = ::mmx::addr_t());\n\t\n\tstd::map<::mmx::addr_t, ::mmx::balance_t> get_balances(const uint32_t& index = 0, const vnx::bool_t& with_zero = 0);\n\t\n\tstd::map<::mmx::addr_t, ::mmx::balance_t> get_total_balances(const std::vector<::mmx::addr_t>& addresses = {});\n\t\n\tstd::map<::mmx::addr_t, ::mmx::balance_t> get_contract_balances(const ::mmx::addr_t& address = ::mmx::addr_t());\n\t\n\tstd::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>> get_contracts(const uint32_t& index = 0, const vnx::optional<std::string>& type_name = nullptr, const vnx::optional<::mmx::hash_t>& type_hash = nullptr);\n\t\n\tstd::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>> get_contracts_owned(const uint32_t& index = 0, const vnx::optional<std::string>& type_name = nullptr, const vnx::optional<::mmx::hash_t>& type_hash = nullptr);\n\t\n\tstd::vector<::mmx::offer_data_t> get_offers(const uint32_t& index = 0, const vnx::bool_t& state = 0);\n\t\n\tstd::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>> get_swap_liquidity(const uint32_t& index = 0);\n\t\n\t::mmx::addr_t get_address(const uint32_t& index = 0, const uint32_t& offset = 0);\n\t\n\tstd::vector<::mmx::addr_t> get_all_addresses(const int32_t& index = 0);\n\t\n\tint32_t find_wallet_by_addr(const ::mmx::addr_t& address = ::mmx::addr_t());\n\t\n\t::mmx::account_info_t get_account(const uint32_t& index = 0);\n\t\n\tstd::vector<::mmx::account_info_t> get_all_accounts();\n\t\n\tvnx::bool_t is_locked(const uint32_t& index = 0);\n\t\n\tvoid lock(const uint32_t& index = 0);\n\t\n\tvoid lock_async(const uint32_t& index = 0);\n\t\n\tvoid unlock(const uint32_t& index = 0, const std::string& passphrase = \"\");\n\t\n\tvoid unlock_async(const uint32_t& index = 0, const std::string& passphrase = \"\");\n\t\n\tvoid add_account(const uint32_t& index = 0, const ::mmx::account_t& config = ::mmx::account_t(), const vnx::optional<std::string>& passphrase = nullptr);\n\t\n\tvoid add_account_async(const uint32_t& index = 0, const ::mmx::account_t& config = ::mmx::account_t(), const vnx::optional<std::string>& passphrase = nullptr);\n\t\n\tvoid create_account(const ::mmx::account_t& config = ::mmx::account_t(), const vnx::optional<std::string>& passphrase = nullptr);\n\t\n\tvoid create_account_async(const ::mmx::account_t& config = ::mmx::account_t(), const vnx::optional<std::string>& passphrase = nullptr);\n\t\n\tvoid create_wallet(const ::mmx::account_t& config = ::mmx::account_t(), const vnx::optional<std::string>& words = nullptr, const vnx::optional<std::string>& passphrase = nullptr);\n\t\n\tvoid create_wallet_async(const ::mmx::account_t& config = ::mmx::account_t(), const vnx::optional<std::string>& words = nullptr, const vnx::optional<std::string>& passphrase = nullptr);\n\t\n\tvoid import_wallet(const ::mmx::account_t& config = ::mmx::account_t(), std::shared_ptr<const ::mmx::KeyFile> key_file = nullptr, const vnx::optional<std::string>& passphrase = nullptr);\n\t\n\tvoid import_wallet_async(const ::mmx::account_t& config = ::mmx::account_t(), std::shared_ptr<const ::mmx::KeyFile> key_file = nullptr, const vnx::optional<std::string>& passphrase = nullptr);\n\t\n\tvoid remove_account(const uint32_t& index = 0, const uint32_t& account = 0);\n\t\n\tvoid remove_account_async(const uint32_t& index = 0, const uint32_t& account = 0);\n\t\n\tvoid set_address_count(const uint32_t& index = 0, const uint32_t& count = 0);\n\t\n\tvoid set_address_count_async(const uint32_t& index = 0, const uint32_t& count = 0);\n\t\n\tstd::vector<std::string> get_mnemonic_wordlist(const std::string& lang = \"en\");\n\t\n\tstd::set<::mmx::addr_t> get_token_list();\n\t\n\tvoid add_token(const ::mmx::addr_t& address = ::mmx::addr_t());\n\t\n\tvoid add_token_async(const ::mmx::addr_t& address = ::mmx::addr_t());\n\t\n\tvoid rem_token(const ::mmx::addr_t& address = ::mmx::addr_t());\n\t\n\tvoid rem_token_async(const ::mmx::addr_t& address = ::mmx::addr_t());\n\t\n\tstd::shared_ptr<const ::mmx::KeyFile> export_wallet(const uint32_t& index = 0);\n\t\n\t::mmx::hash_t get_master_seed(const uint32_t& index = 0);\n\t\n\tstd::vector<std::string> get_mnemonic_seed(const uint32_t& index = 0);\n\t\n\tstd::pair<::mmx::skey_t, ::mmx::pubkey_t> get_farmer_keys(const uint32_t& index = 0);\n\t\n\tstd::vector<std::pair<::mmx::skey_t, ::mmx::pubkey_t>> get_all_farmer_keys();\n\t\n\tstd::shared_ptr<const ::vnx::addons::HttpResponse> http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\");\n\t\n\tstd::shared_ptr<const ::vnx::addons::HttpData> http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", const int64_t& offset = 0, const int64_t& max_bytes = 0);\n\t\n\t::vnx::Object vnx_get_config_object();\n\t\n\t::vnx::Variant vnx_get_config(const std::string& name = \"\");\n\t\n\tvoid vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config_object_async(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\tvoid vnx_set_config_async(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\t::vnx::TypeCode vnx_get_type_code();\n\t\n\tstd::shared_ptr<const ::vnx::ModuleInfo> vnx_get_module_info();\n\t\n\tvoid vnx_restart();\n\t\n\tvoid vnx_restart_async();\n\t\n\tvoid vnx_stop();\n\t\n\tvoid vnx_stop_async();\n\t\n\tvnx::bool_t vnx_self_test();\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_Wallet_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/WalletFile.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_WalletFile_HXX_\n#define INCLUDE_mmx_WalletFile_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT WalletFile : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xefcdc0f20fc4360eull;\n\t\n\tWalletFile() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<WalletFile> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const WalletFile& _value);\n\tfriend std::istream& operator>>(std::istream& _in, WalletFile& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid WalletFile::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<WalletFile>(1);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.template type_end<WalletFile>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_WalletFile_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_accept_offer.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_accept_offer_HXX_\n#define INCLUDE_mmx_Wallet_accept_offer_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_accept_offer : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::addr_t address;\n\tuint32_t dst_addr = 0;\n\t::mmx::uint128 price;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3299e81eb354b78full;\n\t\n\tWallet_accept_offer() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_accept_offer> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_accept_offer& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_accept_offer& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_accept_offer::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_accept_offer>(5);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"dst_addr\", 2); _visitor.accept(dst_addr);\n\t_visitor.type_field(\"price\", 3); _visitor.accept(price);\n\t_visitor.type_field(\"options\", 4); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_accept_offer>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_accept_offer_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_accept_offer_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_accept_offer_return_HXX_\n#define INCLUDE_mmx_Wallet_accept_offer_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_accept_offer_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb44ec1a26ab66acdull;\n\t\n\tWallet_accept_offer_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_accept_offer_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_accept_offer_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_accept_offer_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_accept_offer_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_accept_offer_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_accept_offer_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_accept_offer_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_add_account.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_add_account_HXX_\n#define INCLUDE_mmx_Wallet_add_account_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/account_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_add_account : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::account_t config;\n\tvnx::optional<std::string> passphrase;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x92d2d3518d9c33aeull;\n\t\n\tWallet_add_account() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_add_account> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_add_account& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_add_account& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_add_account::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_add_account>(3);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"config\", 1); _visitor.accept(config);\n\t_visitor.type_field(\"passphrase\", 2); _visitor.accept(passphrase);\n\t_visitor.template type_end<Wallet_add_account>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_add_account_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_add_account_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_add_account_return_HXX_\n#define INCLUDE_mmx_Wallet_add_account_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_add_account_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xda0b2d71dd9e8336ull;\n\t\n\tWallet_add_account_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_add_account_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_add_account_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_add_account_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_add_account_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_add_account_return>(0);\n\t_visitor.template type_end<Wallet_add_account_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_add_account_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_add_token.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_add_token_HXX_\n#define INCLUDE_mmx_Wallet_add_token_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_add_token : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x15fcc67eabc550b6ull;\n\t\n\tWallet_add_token() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_add_token> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_add_token& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_add_token& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_add_token::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_add_token>(1);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.template type_end<Wallet_add_token>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_add_token_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_add_token_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_add_token_return_HXX_\n#define INCLUDE_mmx_Wallet_add_token_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_add_token_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb0b00a9f88ea83b5ull;\n\t\n\tWallet_add_token_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_add_token_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_add_token_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_add_token_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_add_token_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_add_token_return>(0);\n\t_visitor.template type_end<Wallet_add_token_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_add_token_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_cancel_offer.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_cancel_offer_HXX_\n#define INCLUDE_mmx_Wallet_cancel_offer_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_cancel_offer : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::addr_t address;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x200cca704ba873c6ull;\n\t\n\tWallet_cancel_offer() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_cancel_offer> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_cancel_offer& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_cancel_offer& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_cancel_offer::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_cancel_offer>(3);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"options\", 2); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_cancel_offer>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_cancel_offer_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_cancel_offer_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_cancel_offer_return_HXX_\n#define INCLUDE_mmx_Wallet_cancel_offer_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_cancel_offer_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x86f3531ebf8c56a2ull;\n\t\n\tWallet_cancel_offer_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_cancel_offer_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_cancel_offer_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_cancel_offer_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_cancel_offer_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_cancel_offer_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_cancel_offer_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_cancel_offer_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_complete.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_complete_HXX_\n#define INCLUDE_mmx_Wallet_complete_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_complete : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tstd::shared_ptr<const ::mmx::Transaction> tx;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x20da222e7c7de702ull;\n\t\n\tWallet_complete() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_complete> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_complete& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_complete& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_complete::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_complete>(3);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"tx\", 1); _visitor.accept(tx);\n\t_visitor.type_field(\"options\", 2); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_complete>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_complete_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_complete_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_complete_return_HXX_\n#define INCLUDE_mmx_Wallet_complete_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_complete_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x490ab9293f9dbfd0ull;\n\t\n\tWallet_complete_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_complete_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_complete_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_complete_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_complete_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_complete_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_complete_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_complete_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_create_account.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_create_account_HXX_\n#define INCLUDE_mmx_Wallet_create_account_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/account_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_create_account : public ::vnx::Value {\npublic:\n\t\n\t::mmx::account_t config;\n\tvnx::optional<std::string> passphrase;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x11cd618b00e9e56cull;\n\t\n\tWallet_create_account() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_create_account> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_create_account& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_create_account& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_create_account::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_create_account>(2);\n\t_visitor.type_field(\"config\", 0); _visitor.accept(config);\n\t_visitor.type_field(\"passphrase\", 1); _visitor.accept(passphrase);\n\t_visitor.template type_end<Wallet_create_account>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_create_account_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_create_account_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_create_account_return_HXX_\n#define INCLUDE_mmx_Wallet_create_account_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_create_account_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3a0ff64dc755a8d8ull;\n\t\n\tWallet_create_account_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_create_account_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_create_account_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_create_account_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_create_account_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_create_account_return>(0);\n\t_visitor.template type_end<Wallet_create_account_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_create_account_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_create_wallet.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_create_wallet_HXX_\n#define INCLUDE_mmx_Wallet_create_wallet_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/account_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_create_wallet : public ::vnx::Value {\npublic:\n\t\n\t::mmx::account_t config;\n\tvnx::optional<std::string> words;\n\tvnx::optional<std::string> passphrase;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xdcc08a3a1b171a19ull;\n\t\n\tWallet_create_wallet() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_create_wallet> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_create_wallet& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_create_wallet& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_create_wallet::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_create_wallet>(3);\n\t_visitor.type_field(\"config\", 0); _visitor.accept(config);\n\t_visitor.type_field(\"words\", 1); _visitor.accept(words);\n\t_visitor.type_field(\"passphrase\", 2); _visitor.accept(passphrase);\n\t_visitor.template type_end<Wallet_create_wallet>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_create_wallet_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_create_wallet_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_create_wallet_return_HXX_\n#define INCLUDE_mmx_Wallet_create_wallet_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_create_wallet_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb417dca300f1949bull;\n\t\n\tWallet_create_wallet_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_create_wallet_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_create_wallet_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_create_wallet_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_create_wallet_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_create_wallet_return>(0);\n\t_visitor.template type_end<Wallet_create_wallet_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_create_wallet_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_deploy.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_deploy_HXX_\n#define INCLUDE_mmx_Wallet_deploy_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_deploy : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tstd::shared_ptr<const ::mmx::Contract> contract;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xcd71b07853d17497ull;\n\t\n\tWallet_deploy() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_deploy> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_deploy& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_deploy& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_deploy::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_deploy>(3);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"contract\", 1); _visitor.accept(contract);\n\t_visitor.type_field(\"options\", 2); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_deploy>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_deploy_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_deploy_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_deploy_return_HXX_\n#define INCLUDE_mmx_Wallet_deploy_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_deploy_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x7de4805b16e313f6ull;\n\t\n\tWallet_deploy_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_deploy_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_deploy_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_deploy_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_deploy_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_deploy_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_deploy_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_deploy_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_deposit.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_deposit_HXX_\n#define INCLUDE_mmx_Wallet_deposit_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_deposit : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::addr_t address;\n\tstd::string method;\n\tstd::vector<::vnx::Variant> args;\n\t::mmx::uint128 amount;\n\t::mmx::addr_t currency;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4bf71b9049e1c689ull;\n\t\n\tWallet_deposit() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_deposit> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_deposit& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_deposit& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_deposit::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_deposit>(7);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"method\", 2); _visitor.accept(method);\n\t_visitor.type_field(\"args\", 3); _visitor.accept(args);\n\t_visitor.type_field(\"amount\", 4); _visitor.accept(amount);\n\t_visitor.type_field(\"currency\", 5); _visitor.accept(currency);\n\t_visitor.type_field(\"options\", 6); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_deposit>(7);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_deposit_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_deposit_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_deposit_return_HXX_\n#define INCLUDE_mmx_Wallet_deposit_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_deposit_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf21ba8f2309d78aeull;\n\t\n\tWallet_deposit_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_deposit_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_deposit_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_deposit_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_deposit_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_deposit_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_deposit_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_deposit_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_execute.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_execute_HXX_\n#define INCLUDE_mmx_Wallet_execute_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_execute : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::addr_t address;\n\tstd::string method;\n\tstd::vector<::vnx::Variant> args;\n\tvnx::optional<uint32_t> user;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x51a1276a27db7b4ull;\n\t\n\tWallet_execute() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_execute> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_execute& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_execute& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_execute::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_execute>(6);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"method\", 2); _visitor.accept(method);\n\t_visitor.type_field(\"args\", 3); _visitor.accept(args);\n\t_visitor.type_field(\"user\", 4); _visitor.accept(user);\n\t_visitor.type_field(\"options\", 5); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_execute>(6);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_execute_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_execute_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_execute_return_HXX_\n#define INCLUDE_mmx_Wallet_execute_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_execute_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9a51f18a1c26c764ull;\n\t\n\tWallet_execute_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_execute_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_execute_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_execute_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_execute_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_execute_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_execute_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_execute_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_export_wallet.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_export_wallet_HXX_\n#define INCLUDE_mmx_Wallet_export_wallet_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_export_wallet : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd52b494df565ce7ull;\n\t\n\tWallet_export_wallet() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_export_wallet> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_export_wallet& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_export_wallet& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_export_wallet::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_export_wallet>(1);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.template type_end<Wallet_export_wallet>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_export_wallet_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_export_wallet_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_export_wallet_return_HXX_\n#define INCLUDE_mmx_Wallet_export_wallet_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/KeyFile.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_export_wallet_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::KeyFile> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1c82818ba92b03f4ull;\n\t\n\tWallet_export_wallet_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_export_wallet_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_export_wallet_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_export_wallet_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_export_wallet_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_export_wallet_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_export_wallet_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_export_wallet_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_find_wallet_by_addr.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_find_wallet_by_addr_HXX_\n#define INCLUDE_mmx_Wallet_find_wallet_by_addr_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_find_wallet_by_addr : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x320237e79adcef6bull;\n\t\n\tWallet_find_wallet_by_addr() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_find_wallet_by_addr> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_find_wallet_by_addr& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_find_wallet_by_addr& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_find_wallet_by_addr::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_find_wallet_by_addr>(1);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.template type_end<Wallet_find_wallet_by_addr>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_find_wallet_by_addr_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_find_wallet_by_addr_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_find_wallet_by_addr_return_HXX_\n#define INCLUDE_mmx_Wallet_find_wallet_by_addr_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_find_wallet_by_addr_return : public ::vnx::Value {\npublic:\n\t\n\tint32_t _ret_0 = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xdae07576f8844f6aull;\n\t\n\tWallet_find_wallet_by_addr_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_find_wallet_by_addr_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_find_wallet_by_addr_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_find_wallet_by_addr_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_find_wallet_by_addr_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_find_wallet_by_addr_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_find_wallet_by_addr_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_find_wallet_by_addr_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_gather_inputs_for.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_gather_inputs_for_HXX_\n#define INCLUDE_mmx_Wallet_gather_inputs_for_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_gather_inputs_for : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::uint128 amount;\n\t::mmx::addr_t currency;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x31d9b9888b8c2de3ull;\n\t\n\tWallet_gather_inputs_for() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_gather_inputs_for> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_gather_inputs_for& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_gather_inputs_for& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_gather_inputs_for::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_gather_inputs_for>(4);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"amount\", 1); _visitor.accept(amount);\n\t_visitor.type_field(\"currency\", 2); _visitor.accept(currency);\n\t_visitor.type_field(\"options\", 3); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_gather_inputs_for>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_gather_inputs_for_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_gather_inputs_for_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_gather_inputs_for_return_HXX_\n#define INCLUDE_mmx_Wallet_gather_inputs_for_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/txin_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_gather_inputs_for_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::txin_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb099ed949b98dc77ull;\n\t\n\tWallet_gather_inputs_for_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_gather_inputs_for_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_gather_inputs_for_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_gather_inputs_for_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_gather_inputs_for_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_gather_inputs_for_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_gather_inputs_for_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_gather_inputs_for_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_account.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_account_HXX_\n#define INCLUDE_mmx_Wallet_get_account_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_account : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf9669d0d42aec09eull;\n\t\n\tWallet_get_account() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_account> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_account& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_account& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_account::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_account>(1);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.template type_end<Wallet_get_account>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_account_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_account_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_account_return_HXX_\n#define INCLUDE_mmx_Wallet_get_account_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/account_info_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_account_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::account_info_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xaed020aa500eed2bull;\n\t\n\tWallet_get_account_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_account_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_account_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_account_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_account_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_account_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_account_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_account_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_address.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_address_HXX_\n#define INCLUDE_mmx_Wallet_get_address_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_address : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tuint32_t offset = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xccad8dfe1543aa77ull;\n\t\n\tWallet_get_address() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_address> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_address& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_address& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_address::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_address>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"offset\", 1); _visitor.accept(offset);\n\t_visitor.template type_end<Wallet_get_address>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_address_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_address_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_address_return_HXX_\n#define INCLUDE_mmx_Wallet_get_address_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_address_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4c76a08d8d85c4e4ull;\n\t\n\tWallet_get_address_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_address_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_address_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_address_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_address_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_address_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_address_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_address_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_all_accounts.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_all_accounts_HXX_\n#define INCLUDE_mmx_Wallet_get_all_accounts_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_all_accounts : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xdf8bfad64085cb83ull;\n\t\n\tWallet_get_all_accounts() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_all_accounts> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_all_accounts& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_all_accounts& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_all_accounts::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_all_accounts>(0);\n\t_visitor.template type_end<Wallet_get_all_accounts>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_all_accounts_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_all_accounts_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_all_accounts_return_HXX_\n#define INCLUDE_mmx_Wallet_get_all_accounts_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/account_info_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_all_accounts_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::account_info_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x2bb48cc4299c5782ull;\n\t\n\tWallet_get_all_accounts_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_all_accounts_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_all_accounts_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_all_accounts_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_all_accounts_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_all_accounts_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_all_accounts_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_all_accounts_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_all_addresses.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_all_addresses_HXX_\n#define INCLUDE_mmx_Wallet_get_all_addresses_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_all_addresses : public ::vnx::Value {\npublic:\n\t\n\tint32_t index = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf5e2b4554613fd97ull;\n\t\n\tWallet_get_all_addresses() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_all_addresses> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_all_addresses& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_all_addresses& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_all_addresses::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_all_addresses>(1);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.template type_end<Wallet_get_all_addresses>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_all_addresses_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_all_addresses_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_all_addresses_return_HXX_\n#define INCLUDE_mmx_Wallet_get_all_addresses_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_all_addresses_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x2f16846155284194ull;\n\t\n\tWallet_get_all_addresses_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_all_addresses_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_all_addresses_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_all_addresses_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_all_addresses_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_all_addresses_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_all_addresses_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_all_addresses_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_all_farmer_keys.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_all_farmer_keys_HXX_\n#define INCLUDE_mmx_Wallet_get_all_farmer_keys_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_all_farmer_keys : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc6a03b3f813d071dull;\n\t\n\tWallet_get_all_farmer_keys() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_all_farmer_keys> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_all_farmer_keys& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_all_farmer_keys& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_all_farmer_keys::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_all_farmer_keys>(0);\n\t_visitor.template type_end<Wallet_get_all_farmer_keys>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_all_farmer_keys_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_all_farmer_keys_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_all_farmer_keys_return_HXX_\n#define INCLUDE_mmx_Wallet_get_all_farmer_keys_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/skey_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_all_farmer_keys_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::pair<::mmx::skey_t, ::mmx::pubkey_t>> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xa2de9b0aaffc515aull;\n\t\n\tWallet_get_all_farmer_keys_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_all_farmer_keys_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_all_farmer_keys_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_all_farmer_keys_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_all_farmer_keys_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_all_farmer_keys_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_all_farmer_keys_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_all_farmer_keys_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_balance.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_balance_HXX_\n#define INCLUDE_mmx_Wallet_get_balance_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_balance : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::addr_t currency;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1bc2c2dd67ab2829ull;\n\t\n\tWallet_get_balance() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_balance> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_balance& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_balance& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_balance::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_balance>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"currency\", 1); _visitor.accept(currency);\n\t_visitor.template type_end<Wallet_get_balance>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_balance_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_balance_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_balance_return_HXX_\n#define INCLUDE_mmx_Wallet_get_balance_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/balance_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_balance_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::balance_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xfa00e6f62563141full;\n\t\n\tWallet_get_balance_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_balance_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_balance_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_balance_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_balance_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_balance_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_balance_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_balance_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_balances.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_balances_HXX_\n#define INCLUDE_mmx_Wallet_get_balances_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_balances : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tvnx::bool_t with_zero = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5be581d54ae69a4ull;\n\t\n\tWallet_get_balances() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_balances> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_balances& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_balances& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_balances::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_balances>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"with_zero\", 1); _visitor.accept(with_zero);\n\t_visitor.template type_end<Wallet_get_balances>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_balances_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_balances_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_balances_return_HXX_\n#define INCLUDE_mmx_Wallet_get_balances_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_balances_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::addr_t, ::mmx::balance_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe041fcc6b3606c0full;\n\t\n\tWallet_get_balances_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_balances_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_balances_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_balances_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_balances_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_balances_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_balances_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_balances_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_contract_balances.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_contract_balances_HXX_\n#define INCLUDE_mmx_Wallet_get_contract_balances_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_contract_balances : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4d6b36c0c2804d26ull;\n\t\n\tWallet_get_contract_balances() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_contract_balances> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_contract_balances& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_contract_balances& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_contract_balances::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_contract_balances>(1);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.template type_end<Wallet_get_contract_balances>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_contract_balances_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_contract_balances_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_contract_balances_return_HXX_\n#define INCLUDE_mmx_Wallet_get_contract_balances_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_contract_balances_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::addr_t, ::mmx::balance_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x7800bce5a77b8bdcull;\n\t\n\tWallet_get_contract_balances_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_contract_balances_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_contract_balances_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_contract_balances_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_contract_balances_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_contract_balances_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_contract_balances_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_contract_balances_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_contracts.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_contracts_HXX_\n#define INCLUDE_mmx_Wallet_get_contracts_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_contracts : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tvnx::optional<std::string> type_name;\n\tvnx::optional<::mmx::hash_t> type_hash;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9ff1932bcec18d57ull;\n\t\n\tWallet_get_contracts() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_contracts> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_contracts& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_contracts& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_contracts::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_contracts>(3);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"type_name\", 1); _visitor.accept(type_name);\n\t_visitor.type_field(\"type_hash\", 2); _visitor.accept(type_hash);\n\t_visitor.template type_end<Wallet_get_contracts>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_contracts_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_contracts_owned.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_contracts_owned_HXX_\n#define INCLUDE_mmx_Wallet_get_contracts_owned_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_contracts_owned : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tvnx::optional<std::string> type_name;\n\tvnx::optional<::mmx::hash_t> type_hash;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x7834485ec000f577ull;\n\t\n\tWallet_get_contracts_owned() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_contracts_owned> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_contracts_owned& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_contracts_owned& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_contracts_owned::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_contracts_owned>(3);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"type_name\", 1); _visitor.accept(type_name);\n\t_visitor.type_field(\"type_hash\", 2); _visitor.accept(type_hash);\n\t_visitor.template type_end<Wallet_get_contracts_owned>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_contracts_owned_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_contracts_owned_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_contracts_owned_return_HXX_\n#define INCLUDE_mmx_Wallet_get_contracts_owned_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_contracts_owned_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x40aec1bc5f5f5c90ull;\n\t\n\tWallet_get_contracts_owned_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_contracts_owned_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_contracts_owned_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_contracts_owned_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_contracts_owned_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_contracts_owned_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_contracts_owned_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_contracts_owned_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_contracts_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_contracts_return_HXX_\n#define INCLUDE_mmx_Wallet_get_contracts_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_contracts_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf384dd12e1fac072ull;\n\t\n\tWallet_get_contracts_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_contracts_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_contracts_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_contracts_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_contracts_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_contracts_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_contracts_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_contracts_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_farmer_keys.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_farmer_keys_HXX_\n#define INCLUDE_mmx_Wallet_get_farmer_keys_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_farmer_keys : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x44709e11ff3ff3eeull;\n\t\n\tWallet_get_farmer_keys() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_farmer_keys> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_farmer_keys& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_farmer_keys& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_farmer_keys::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_farmer_keys>(1);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.template type_end<Wallet_get_farmer_keys>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_farmer_keys_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_farmer_keys_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_farmer_keys_return_HXX_\n#define INCLUDE_mmx_Wallet_get_farmer_keys_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/skey_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_farmer_keys_return : public ::vnx::Value {\npublic:\n\t\n\tstd::pair<::mmx::skey_t, ::mmx::pubkey_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x25479f868269fbb0ull;\n\t\n\tWallet_get_farmer_keys_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_farmer_keys_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_farmer_keys_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_farmer_keys_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_farmer_keys_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_farmer_keys_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_farmer_keys_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_farmer_keys_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_history.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_history_HXX_\n#define INCLUDE_mmx_Wallet_get_history_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/query_filter_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_history : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::query_filter_t filter;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x921f73f3d97d2d4dull;\n\t\n\tWallet_get_history() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_history> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_history& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_history& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_history::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_history>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"filter\", 1); _visitor.accept(filter);\n\t_visitor.template type_end<Wallet_get_history>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_history_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_history_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_history_return_HXX_\n#define INCLUDE_mmx_Wallet_get_history_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_history_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::tx_entry_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb1b8c9a446a81b1full;\n\t\n\tWallet_get_history_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_history_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_history_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_history_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_history_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_history_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_history_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_history_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_master_seed.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_master_seed_HXX_\n#define INCLUDE_mmx_Wallet_get_master_seed_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_master_seed : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8fddd77ece4d295bull;\n\t\n\tWallet_get_master_seed() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_master_seed> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_master_seed& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_master_seed& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_master_seed::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_master_seed>(1);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.template type_end<Wallet_get_master_seed>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_master_seed_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_master_seed_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_master_seed_return_HXX_\n#define INCLUDE_mmx_Wallet_get_master_seed_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_master_seed_return : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8b0f38e742e132f0ull;\n\t\n\tWallet_get_master_seed_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_master_seed_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_master_seed_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_master_seed_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_master_seed_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_master_seed_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_master_seed_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_master_seed_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_mnemonic_seed.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_mnemonic_seed_HXX_\n#define INCLUDE_mmx_Wallet_get_mnemonic_seed_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_mnemonic_seed : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xacf58d3b1a8ce4c0ull;\n\t\n\tWallet_get_mnemonic_seed() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_mnemonic_seed> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_mnemonic_seed& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_mnemonic_seed& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_mnemonic_seed::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_mnemonic_seed>(1);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.template type_end<Wallet_get_mnemonic_seed>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_mnemonic_seed_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_mnemonic_seed_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_mnemonic_seed_return_HXX_\n#define INCLUDE_mmx_Wallet_get_mnemonic_seed_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_mnemonic_seed_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::string> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd02dd0736911ac8bull;\n\t\n\tWallet_get_mnemonic_seed_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_mnemonic_seed_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_mnemonic_seed_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_mnemonic_seed_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_mnemonic_seed_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_mnemonic_seed_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_mnemonic_seed_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_mnemonic_seed_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_mnemonic_wordlist.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_mnemonic_wordlist_HXX_\n#define INCLUDE_mmx_Wallet_get_mnemonic_wordlist_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_mnemonic_wordlist : public ::vnx::Value {\npublic:\n\t\n\tstd::string lang = \"en\";\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb833298e3ff28a44ull;\n\t\n\tWallet_get_mnemonic_wordlist() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_mnemonic_wordlist> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_mnemonic_wordlist& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_mnemonic_wordlist& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_mnemonic_wordlist::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_mnemonic_wordlist>(1);\n\t_visitor.type_field(\"lang\", 0); _visitor.accept(lang);\n\t_visitor.template type_end<Wallet_get_mnemonic_wordlist>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_mnemonic_wordlist_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_mnemonic_wordlist_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_mnemonic_wordlist_return_HXX_\n#define INCLUDE_mmx_Wallet_get_mnemonic_wordlist_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_mnemonic_wordlist_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<std::string> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8ce49a9b57ee5789ull;\n\t\n\tWallet_get_mnemonic_wordlist_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_mnemonic_wordlist_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_mnemonic_wordlist_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_mnemonic_wordlist_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_mnemonic_wordlist_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_mnemonic_wordlist_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_mnemonic_wordlist_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_mnemonic_wordlist_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_offers.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_offers_HXX_\n#define INCLUDE_mmx_Wallet_get_offers_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_offers : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tvnx::bool_t state = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6dacbe70cbe08925ull;\n\t\n\tWallet_get_offers() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_offers> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_offers& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_offers& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_offers::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_offers>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"state\", 1); _visitor.accept(state);\n\t_visitor.template type_end<Wallet_get_offers>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_offers_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_offers_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_offers_return_HXX_\n#define INCLUDE_mmx_Wallet_get_offers_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_offers_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::offer_data_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xdb130e20d160c564ull;\n\t\n\tWallet_get_offers_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_offers_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_offers_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_offers_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_offers_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_offers_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_offers_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_offers_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_swap_liquidity.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_swap_liquidity_HXX_\n#define INCLUDE_mmx_Wallet_get_swap_liquidity_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_swap_liquidity : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3a8f17d496f625bull;\n\t\n\tWallet_get_swap_liquidity() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_swap_liquidity> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_swap_liquidity& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_swap_liquidity& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_swap_liquidity::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_swap_liquidity>(1);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.template type_end<Wallet_get_swap_liquidity>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_swap_liquidity_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_swap_liquidity_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_swap_liquidity_return_HXX_\n#define INCLUDE_mmx_Wallet_get_swap_liquidity_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_swap_liquidity_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6846e8caa82b1463ull;\n\t\n\tWallet_get_swap_liquidity_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_swap_liquidity_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_swap_liquidity_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_swap_liquidity_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_swap_liquidity_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_swap_liquidity_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_swap_liquidity_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_swap_liquidity_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_token_list.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_token_list_HXX_\n#define INCLUDE_mmx_Wallet_get_token_list_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_token_list : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x322b4f4af3737efcull;\n\t\n\tWallet_get_token_list() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_token_list> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_token_list& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_token_list& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_token_list::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_token_list>(0);\n\t_visitor.template type_end<Wallet_get_token_list>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_token_list_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_token_list_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_token_list_return_HXX_\n#define INCLUDE_mmx_Wallet_get_token_list_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_token_list_return : public ::vnx::Value {\npublic:\n\t\n\tstd::set<::mmx::addr_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe36d7210ddf3d216ull;\n\t\n\tWallet_get_token_list_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_token_list_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_token_list_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_token_list_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_token_list_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_token_list_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_token_list_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_token_list_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_total_balances.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_total_balances_HXX_\n#define INCLUDE_mmx_Wallet_get_total_balances_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_total_balances : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::addr_t> addresses;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xedd130caba2e2f04ull;\n\t\n\tWallet_get_total_balances() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_total_balances> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_total_balances& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_total_balances& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_total_balances::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_total_balances>(1);\n\t_visitor.type_field(\"addresses\", 0); _visitor.accept(addresses);\n\t_visitor.template type_end<Wallet_get_total_balances>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_total_balances_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_total_balances_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_total_balances_return_HXX_\n#define INCLUDE_mmx_Wallet_get_total_balances_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_total_balances_return : public ::vnx::Value {\npublic:\n\t\n\tstd::map<::mmx::addr_t, ::mmx::balance_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x46f0368d7c4e45ddull;\n\t\n\tWallet_get_total_balances_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_total_balances_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_total_balances_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_total_balances_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_total_balances_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_total_balances_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_total_balances_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_total_balances_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_tx_log.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_tx_log_HXX_\n#define INCLUDE_mmx_Wallet_get_tx_log_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_tx_log : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tint32_t limit = 100;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc5570936be29c0ebull;\n\t\n\tWallet_get_tx_log() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_tx_log> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_tx_log& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_tx_log& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_tx_log::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_tx_log>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"limit\", 1); _visitor.accept(limit);\n\t_visitor.template type_end<Wallet_get_tx_log>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_tx_log_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_get_tx_log_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_get_tx_log_return_HXX_\n#define INCLUDE_mmx_Wallet_get_tx_log_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/tx_log_entry_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_get_tx_log_return : public ::vnx::Value {\npublic:\n\t\n\tstd::vector<::mmx::tx_log_entry_t> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5c6d4b8fc9820ec1ull;\n\t\n\tWallet_get_tx_log_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_get_tx_log_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_get_tx_log_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_get_tx_log_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_get_tx_log_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_get_tx_log_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_get_tx_log_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_get_tx_log_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_import_wallet.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_import_wallet_HXX_\n#define INCLUDE_mmx_Wallet_import_wallet_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/account_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_import_wallet : public ::vnx::Value {\npublic:\n\t\n\t::mmx::account_t config;\n\tstd::shared_ptr<const ::mmx::KeyFile> key_file;\n\tvnx::optional<std::string> passphrase;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x63a1d5b2fe482dd1ull;\n\t\n\tWallet_import_wallet() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_import_wallet> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_import_wallet& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_import_wallet& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_import_wallet::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_import_wallet>(3);\n\t_visitor.type_field(\"config\", 0); _visitor.accept(config);\n\t_visitor.type_field(\"key_file\", 1); _visitor.accept(key_file);\n\t_visitor.type_field(\"passphrase\", 2); _visitor.accept(passphrase);\n\t_visitor.template type_end<Wallet_import_wallet>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_import_wallet_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_import_wallet_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_import_wallet_return_HXX_\n#define INCLUDE_mmx_Wallet_import_wallet_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_import_wallet_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc6edac537d44ecd1ull;\n\t\n\tWallet_import_wallet_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_import_wallet_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_import_wallet_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_import_wallet_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_import_wallet_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_import_wallet_return>(0);\n\t_visitor.template type_end<Wallet_import_wallet_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_import_wallet_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_is_locked.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_is_locked_HXX_\n#define INCLUDE_mmx_Wallet_is_locked_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_is_locked : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6087e83febcc233ull;\n\t\n\tWallet_is_locked() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_is_locked> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_is_locked& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_is_locked& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_is_locked::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_is_locked>(1);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.template type_end<Wallet_is_locked>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_is_locked_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_is_locked_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_is_locked_return_HXX_\n#define INCLUDE_mmx_Wallet_is_locked_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_is_locked_return : public ::vnx::Value {\npublic:\n\t\n\tvnx::bool_t _ret_0 = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1ea1b30193de8d7bull;\n\t\n\tWallet_is_locked_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_is_locked_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_is_locked_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_is_locked_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_is_locked_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_is_locked_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_is_locked_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_is_locked_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_lock.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_lock_HXX_\n#define INCLUDE_mmx_Wallet_lock_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_lock : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9072deb8ab538b2bull;\n\t\n\tWallet_lock() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_lock> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_lock& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_lock& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_lock::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_lock>(1);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.template type_end<Wallet_lock>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_lock_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_lock_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_lock_return_HXX_\n#define INCLUDE_mmx_Wallet_lock_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_lock_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x74cb9d670ae675f3ull;\n\t\n\tWallet_lock_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_lock_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_lock_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_lock_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_lock_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_lock_return>(0);\n\t_visitor.template type_end<Wallet_lock_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_lock_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_make_offer.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_make_offer_HXX_\n#define INCLUDE_mmx_Wallet_make_offer_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_make_offer : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tuint32_t owner = 0;\n\t::mmx::uint128 bid_amount;\n\t::mmx::addr_t bid_currency;\n\t::mmx::uint128 ask_amount;\n\t::mmx::addr_t ask_currency;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8b0cf597e8265a73ull;\n\t\n\tWallet_make_offer() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_make_offer> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_make_offer& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_make_offer& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_make_offer::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_make_offer>(7);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"owner\", 1); _visitor.accept(owner);\n\t_visitor.type_field(\"bid_amount\", 2); _visitor.accept(bid_amount);\n\t_visitor.type_field(\"bid_currency\", 3); _visitor.accept(bid_currency);\n\t_visitor.type_field(\"ask_amount\", 4); _visitor.accept(ask_amount);\n\t_visitor.type_field(\"ask_currency\", 5); _visitor.accept(ask_currency);\n\t_visitor.type_field(\"options\", 6); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_make_offer>(7);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_make_offer_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_make_offer_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_make_offer_return_HXX_\n#define INCLUDE_mmx_Wallet_make_offer_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_make_offer_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf8ecff218266aadaull;\n\t\n\tWallet_make_offer_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_make_offer_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_make_offer_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_make_offer_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_make_offer_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_make_offer_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_make_offer_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_make_offer_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_mark_spent.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_mark_spent_HXX_\n#define INCLUDE_mmx_Wallet_mark_spent_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_mark_spent : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tstd::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128> amounts;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x107fed23348b3333ull;\n\t\n\tWallet_mark_spent() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_mark_spent> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_mark_spent& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_mark_spent& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_mark_spent::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_mark_spent>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"amounts\", 1); _visitor.accept(amounts);\n\t_visitor.template type_end<Wallet_mark_spent>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_mark_spent_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_mark_spent_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_mark_spent_return_HXX_\n#define INCLUDE_mmx_Wallet_mark_spent_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_mark_spent_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf28950d2b8f874dfull;\n\t\n\tWallet_mark_spent_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_mark_spent_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_mark_spent_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_mark_spent_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_mark_spent_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_mark_spent_return>(0);\n\t_visitor.template type_end<Wallet_mark_spent_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_mark_spent_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_offer_trade.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_offer_trade_HXX_\n#define INCLUDE_mmx_Wallet_offer_trade_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_offer_trade : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::addr_t address;\n\t::mmx::uint128 amount;\n\tuint32_t dst_addr = 0;\n\t::mmx::uint128 price;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x557a94a5a4887bf2ull;\n\t\n\tWallet_offer_trade() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_offer_trade> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_offer_trade& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_offer_trade& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_offer_trade::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_offer_trade>(6);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"amount\", 2); _visitor.accept(amount);\n\t_visitor.type_field(\"dst_addr\", 3); _visitor.accept(dst_addr);\n\t_visitor.type_field(\"price\", 4); _visitor.accept(price);\n\t_visitor.type_field(\"options\", 5); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_offer_trade>(6);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_offer_trade_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_offer_trade_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_offer_trade_return_HXX_\n#define INCLUDE_mmx_Wallet_offer_trade_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_offer_trade_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb43f9bef89670cebull;\n\t\n\tWallet_offer_trade_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_offer_trade_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_offer_trade_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_offer_trade_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_offer_trade_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_offer_trade_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_offer_trade_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_offer_trade_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_offer_withdraw.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_offer_withdraw_HXX_\n#define INCLUDE_mmx_Wallet_offer_withdraw_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_offer_withdraw : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::addr_t address;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x790a334fbf5dd1e6ull;\n\t\n\tWallet_offer_withdraw() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_offer_withdraw> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_offer_withdraw& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_offer_withdraw& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_offer_withdraw::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_offer_withdraw>(3);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"options\", 2); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_offer_withdraw>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_offer_withdraw_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_offer_withdraw_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_offer_withdraw_return_HXX_\n#define INCLUDE_mmx_Wallet_offer_withdraw_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_offer_withdraw_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xea9f43cd17c41965ull;\n\t\n\tWallet_offer_withdraw_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_offer_withdraw_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_offer_withdraw_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_offer_withdraw_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_offer_withdraw_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_offer_withdraw_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_offer_withdraw_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_offer_withdraw_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_plotnft_create.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_plotnft_create_HXX_\n#define INCLUDE_mmx_Wallet_plotnft_create_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_plotnft_create : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tstd::string name;\n\tvnx::optional<uint32_t> owner;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6b0c985ca2c555c9ull;\n\t\n\tWallet_plotnft_create() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_plotnft_create> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_plotnft_create& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_plotnft_create& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_plotnft_create::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_plotnft_create>(4);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"name\", 1); _visitor.accept(name);\n\t_visitor.type_field(\"owner\", 2); _visitor.accept(owner);\n\t_visitor.type_field(\"options\", 3); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_plotnft_create>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_plotnft_create_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_plotnft_create_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_plotnft_create_return_HXX_\n#define INCLUDE_mmx_Wallet_plotnft_create_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_plotnft_create_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x349cedc7d1d4dcfull;\n\t\n\tWallet_plotnft_create_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_plotnft_create_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_plotnft_create_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_plotnft_create_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_plotnft_create_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_plotnft_create_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_plotnft_create_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_plotnft_create_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_plotnft_exec.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_plotnft_exec_HXX_\n#define INCLUDE_mmx_Wallet_plotnft_exec_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_plotnft_exec : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\tstd::string method;\n\tstd::vector<::vnx::Variant> args;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xca9e9d0dfde795d1ull;\n\t\n\tWallet_plotnft_exec() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_plotnft_exec> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_plotnft_exec& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_plotnft_exec& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_plotnft_exec::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_plotnft_exec>(4);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"method\", 1); _visitor.accept(method);\n\t_visitor.type_field(\"args\", 2); _visitor.accept(args);\n\t_visitor.type_field(\"options\", 3); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_plotnft_exec>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_plotnft_exec_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_plotnft_exec_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_plotnft_exec_return_HXX_\n#define INCLUDE_mmx_Wallet_plotnft_exec_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_plotnft_exec_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8330b38d9cb47b24ull;\n\t\n\tWallet_plotnft_exec_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_plotnft_exec_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_plotnft_exec_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_plotnft_exec_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_plotnft_exec_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_plotnft_exec_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_plotnft_exec_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_plotnft_exec_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_release.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_release_HXX_\n#define INCLUDE_mmx_Wallet_release_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_release : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tstd::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128> amounts;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x2cd72a3370e05db3ull;\n\t\n\tWallet_release() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_release> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_release& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_release& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_release::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_release>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"amounts\", 1); _visitor.accept(amounts);\n\t_visitor.template type_end<Wallet_release>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_release_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_release_all.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_release_all_HXX_\n#define INCLUDE_mmx_Wallet_release_all_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_release_all : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4bd57b9deca4be51ull;\n\t\n\tWallet_release_all() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_release_all> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_release_all& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_release_all& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_release_all::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_release_all>(0);\n\t_visitor.template type_end<Wallet_release_all>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_release_all_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_release_all_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_release_all_return_HXX_\n#define INCLUDE_mmx_Wallet_release_all_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_release_all_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf7029fb06b3b3fa5ull;\n\t\n\tWallet_release_all_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_release_all_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_release_all_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_release_all_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_release_all_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_release_all_return>(0);\n\t_visitor.template type_end<Wallet_release_all_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_release_all_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_release_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_release_return_HXX_\n#define INCLUDE_mmx_Wallet_release_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_release_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd302995a8c4dcf83ull;\n\t\n\tWallet_release_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_release_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_release_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_release_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_release_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_release_return>(0);\n\t_visitor.template type_end<Wallet_release_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_release_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_rem_token.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_rem_token_HXX_\n#define INCLUDE_mmx_Wallet_rem_token_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_rem_token : public ::vnx::Value {\npublic:\n\t\n\t::mmx::addr_t address;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc913cdd1600a2609ull;\n\t\n\tWallet_rem_token() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_rem_token> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_rem_token& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_rem_token& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_rem_token::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_rem_token>(1);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.template type_end<Wallet_rem_token>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_rem_token_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_rem_token_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_rem_token_return_HXX_\n#define INCLUDE_mmx_Wallet_rem_token_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_rem_token_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb59ee8fb44d30755ull;\n\t\n\tWallet_rem_token_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_rem_token_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_rem_token_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_rem_token_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_rem_token_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_rem_token_return>(0);\n\t_visitor.template type_end<Wallet_rem_token_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_rem_token_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_remove_account.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_remove_account_HXX_\n#define INCLUDE_mmx_Wallet_remove_account_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_remove_account : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tuint32_t account = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xdf7d8816958bcb8bull;\n\t\n\tWallet_remove_account() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_remove_account> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_remove_account& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_remove_account& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_remove_account::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_remove_account>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"account\", 1); _visitor.accept(account);\n\t_visitor.template type_end<Wallet_remove_account>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_remove_account_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_remove_account_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_remove_account_return_HXX_\n#define INCLUDE_mmx_Wallet_remove_account_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_remove_account_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8e0d71e4003dca80ull;\n\t\n\tWallet_remove_account_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_remove_account_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_remove_account_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_remove_account_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_remove_account_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_remove_account_return>(0);\n\t_visitor.template type_end<Wallet_remove_account_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_remove_account_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_reserve.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_reserve_HXX_\n#define INCLUDE_mmx_Wallet_reserve_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_reserve : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tstd::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128> amounts;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd14c466e8e7ebd76ull;\n\t\n\tWallet_reserve() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_reserve> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_reserve& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_reserve& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_reserve::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_reserve>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"amounts\", 1); _visitor.accept(amounts);\n\t_visitor.template type_end<Wallet_reserve>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_reserve_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_reserve_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_reserve_return_HXX_\n#define INCLUDE_mmx_Wallet_reserve_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_reserve_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x79de0793f575d4d6ull;\n\t\n\tWallet_reserve_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_reserve_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_reserve_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_reserve_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_reserve_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_reserve_return>(0);\n\t_visitor.template type_end<Wallet_reserve_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_reserve_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_reset_cache.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_reset_cache_HXX_\n#define INCLUDE_mmx_Wallet_reset_cache_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_reset_cache : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x922c4f0299ea0bf4ull;\n\t\n\tWallet_reset_cache() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_reset_cache> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_reset_cache& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_reset_cache& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_reset_cache::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_reset_cache>(1);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.template type_end<Wallet_reset_cache>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_reset_cache_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_reset_cache_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_reset_cache_return_HXX_\n#define INCLUDE_mmx_Wallet_reset_cache_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_reset_cache_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x59e9fbfbf5d8218bull;\n\t\n\tWallet_reset_cache_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_reset_cache_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_reset_cache_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_reset_cache_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_reset_cache_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_reset_cache_return>(0);\n\t_visitor.template type_end<Wallet_reset_cache_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_reset_cache_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_send.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_send_HXX_\n#define INCLUDE_mmx_Wallet_send_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_send : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::uint128 amount;\n\t::mmx::addr_t dst_addr;\n\t::mmx::addr_t currency;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3842658ae3c2d5ebull;\n\t\n\tWallet_send() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_send> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_send& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_send& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_send::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_send>(5);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"amount\", 1); _visitor.accept(amount);\n\t_visitor.type_field(\"dst_addr\", 2); _visitor.accept(dst_addr);\n\t_visitor.type_field(\"currency\", 3); _visitor.accept(currency);\n\t_visitor.type_field(\"options\", 4); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_send>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_send_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_send_from.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_send_from_HXX_\n#define INCLUDE_mmx_Wallet_send_from_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_send_from : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::uint128 amount;\n\t::mmx::addr_t dst_addr;\n\t::mmx::addr_t src_addr;\n\t::mmx::addr_t currency;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x40c3c88665341592ull;\n\t\n\tWallet_send_from() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_send_from> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_send_from& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_send_from& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_send_from::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_send_from>(6);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"amount\", 1); _visitor.accept(amount);\n\t_visitor.type_field(\"dst_addr\", 2); _visitor.accept(dst_addr);\n\t_visitor.type_field(\"src_addr\", 3); _visitor.accept(src_addr);\n\t_visitor.type_field(\"currency\", 4); _visitor.accept(currency);\n\t_visitor.type_field(\"options\", 5); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_send_from>(6);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_send_from_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_send_from_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_send_from_return_HXX_\n#define INCLUDE_mmx_Wallet_send_from_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_send_from_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf578239f07abf05dull;\n\t\n\tWallet_send_from_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_send_from_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_send_from_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_send_from_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_send_from_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_send_from_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_send_from_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_send_from_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_send_many.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_send_many_HXX_\n#define INCLUDE_mmx_Wallet_send_many_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_send_many : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tstd::vector<std::pair<::mmx::addr_t, ::mmx::uint128>> amounts;\n\t::mmx::addr_t currency;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4f35769a1b4c6786ull;\n\t\n\tWallet_send_many() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_send_many> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_send_many& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_send_many& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_send_many::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_send_many>(4);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"amounts\", 1); _visitor.accept(amounts);\n\t_visitor.type_field(\"currency\", 2); _visitor.accept(currency);\n\t_visitor.type_field(\"options\", 3); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_send_many>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_send_many_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_send_many_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_send_many_return_HXX_\n#define INCLUDE_mmx_Wallet_send_many_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_send_many_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x828bddc86fbaf1e1ull;\n\t\n\tWallet_send_many_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_send_many_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_send_many_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_send_many_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_send_many_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_send_many_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_send_many_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_send_many_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_send_off.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_send_off_HXX_\n#define INCLUDE_mmx_Wallet_send_off_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_send_off : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tstd::shared_ptr<const ::mmx::Transaction> tx;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8b7bfc0751d27adbull;\n\t\n\tWallet_send_off() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_send_off> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_send_off& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_send_off& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_send_off::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_send_off>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"tx\", 1); _visitor.accept(tx);\n\t_visitor.template type_end<Wallet_send_off>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_send_off_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_send_off_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_send_off_return_HXX_\n#define INCLUDE_mmx_Wallet_send_off_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_send_off_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9b9017e8636e8571ull;\n\t\n\tWallet_send_off_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_send_off_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_send_off_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_send_off_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_send_off_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_send_off_return>(0);\n\t_visitor.template type_end<Wallet_send_off_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_send_off_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_send_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_send_return_HXX_\n#define INCLUDE_mmx_Wallet_send_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_send_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5df7b911342a1e6full;\n\t\n\tWallet_send_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_send_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_send_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_send_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_send_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_send_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_send_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_send_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_set_address_count.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_set_address_count_HXX_\n#define INCLUDE_mmx_Wallet_set_address_count_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_set_address_count : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tuint32_t count = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9638ddc0c1d52b15ull;\n\t\n\tWallet_set_address_count() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_set_address_count> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_set_address_count& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_set_address_count& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_set_address_count::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_set_address_count>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"count\", 1); _visitor.accept(count);\n\t_visitor.template type_end<Wallet_set_address_count>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_set_address_count_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_set_address_count_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_set_address_count_return_HXX_\n#define INCLUDE_mmx_Wallet_set_address_count_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_set_address_count_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5948620640c50bf8ull;\n\t\n\tWallet_set_address_count_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_set_address_count_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_set_address_count_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_set_address_count_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_set_address_count_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_set_address_count_return>(0);\n\t_visitor.template type_end<Wallet_set_address_count_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_set_address_count_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_sign_msg.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_sign_msg_HXX_\n#define INCLUDE_mmx_Wallet_sign_msg_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_sign_msg : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::addr_t address;\n\t::mmx::hash_t msg;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5bc54cc8b0112d3aull;\n\t\n\tWallet_sign_msg() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_sign_msg> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_sign_msg& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_sign_msg& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_sign_msg::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_sign_msg>(3);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"msg\", 2); _visitor.accept(msg);\n\t_visitor.template type_end<Wallet_sign_msg>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_sign_msg_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_sign_msg_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_sign_msg_return_HXX_\n#define INCLUDE_mmx_Wallet_sign_msg_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Solution.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_sign_msg_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Solution> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5cf2f6b20fa33f51ull;\n\t\n\tWallet_sign_msg_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_sign_msg_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_sign_msg_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_sign_msg_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_sign_msg_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_sign_msg_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_sign_msg_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_sign_msg_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_sign_off.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_sign_off_HXX_\n#define INCLUDE_mmx_Wallet_sign_off_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_sign_off : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tstd::shared_ptr<const ::mmx::Transaction> tx;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x232c89cf3ed4d5b1ull;\n\t\n\tWallet_sign_off() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_sign_off> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_sign_off& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_sign_off& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_sign_off::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_sign_off>(3);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"tx\", 1); _visitor.accept(tx);\n\t_visitor.type_field(\"options\", 2); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_sign_off>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_sign_off_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_sign_off_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_sign_off_return_HXX_\n#define INCLUDE_mmx_Wallet_sign_off_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_sign_off_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4b2ee7febe4ec00aull;\n\t\n\tWallet_sign_off_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_sign_off_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_sign_off_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_sign_off_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_sign_off_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_sign_off_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_sign_off_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_sign_off_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_swap_add_liquid.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_swap_add_liquid_HXX_\n#define INCLUDE_mmx_Wallet_swap_add_liquid_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_swap_add_liquid : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::addr_t address;\n\tstd::array<::mmx::uint128, 2> amount = {};\n\tuint32_t pool_idx = 0;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe053d1ae718e2f64ull;\n\t\n\tWallet_swap_add_liquid() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_swap_add_liquid> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_swap_add_liquid& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_swap_add_liquid& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_swap_add_liquid::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_swap_add_liquid>(5);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"amount\", 2); _visitor.accept(amount);\n\t_visitor.type_field(\"pool_idx\", 3); _visitor.accept(pool_idx);\n\t_visitor.type_field(\"options\", 4); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_swap_add_liquid>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_swap_add_liquid_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_swap_add_liquid_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_swap_add_liquid_return_HXX_\n#define INCLUDE_mmx_Wallet_swap_add_liquid_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_swap_add_liquid_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc2812565c73ec527ull;\n\t\n\tWallet_swap_add_liquid_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_swap_add_liquid_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_swap_add_liquid_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_swap_add_liquid_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_swap_add_liquid_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_swap_add_liquid_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_swap_add_liquid_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_swap_add_liquid_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_swap_rem_liquid.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_swap_rem_liquid_HXX_\n#define INCLUDE_mmx_Wallet_swap_rem_liquid_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_swap_rem_liquid : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::addr_t address;\n\tstd::array<::mmx::uint128, 2> amount = {};\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6494b41c51e158eaull;\n\t\n\tWallet_swap_rem_liquid() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_swap_rem_liquid> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_swap_rem_liquid& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_swap_rem_liquid& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_swap_rem_liquid::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_swap_rem_liquid>(4);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"amount\", 2); _visitor.accept(amount);\n\t_visitor.type_field(\"options\", 3); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_swap_rem_liquid>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_swap_rem_liquid_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_swap_rem_liquid_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_swap_rem_liquid_return_HXX_\n#define INCLUDE_mmx_Wallet_swap_rem_liquid_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_swap_rem_liquid_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x946935a83dd0b8d2ull;\n\t\n\tWallet_swap_rem_liquid_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_swap_rem_liquid_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_swap_rem_liquid_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_swap_rem_liquid_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_swap_rem_liquid_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_swap_rem_liquid_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_swap_rem_liquid_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_swap_rem_liquid_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_swap_trade.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_swap_trade_HXX_\n#define INCLUDE_mmx_Wallet_swap_trade_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_swap_trade : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t::mmx::addr_t address;\n\t::mmx::uint128 amount;\n\t::mmx::addr_t currency;\n\tvnx::optional<::mmx::uint128> min_trade;\n\tint32_t num_iter = 20;\n\t::mmx::spend_options_t options;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x4b5a42cbf6657910ull;\n\t\n\tWallet_swap_trade() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_swap_trade> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_swap_trade& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_swap_trade& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_swap_trade::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_swap_trade>(7);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"amount\", 2); _visitor.accept(amount);\n\t_visitor.type_field(\"currency\", 3); _visitor.accept(currency);\n\t_visitor.type_field(\"min_trade\", 4); _visitor.accept(min_trade);\n\t_visitor.type_field(\"num_iter\", 5); _visitor.accept(num_iter);\n\t_visitor.type_field(\"options\", 6); _visitor.accept(options);\n\t_visitor.template type_end<Wallet_swap_trade>(7);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_swap_trade_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_swap_trade_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_swap_trade_return_HXX_\n#define INCLUDE_mmx_Wallet_swap_trade_return_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_swap_trade_return : public ::vnx::Value {\npublic:\n\t\n\tstd::shared_ptr<const ::mmx::Transaction> _ret_0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8fe4c13b007c63f4ull;\n\t\n\tWallet_swap_trade_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_swap_trade_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_swap_trade_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_swap_trade_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_swap_trade_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_swap_trade_return>(1);\n\t_visitor.type_field(\"_ret_0\", 0); _visitor.accept(_ret_0);\n\t_visitor.template type_end<Wallet_swap_trade_return>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_swap_trade_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_unlock.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_unlock_HXX_\n#define INCLUDE_mmx_Wallet_unlock_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_unlock : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\tstd::string passphrase;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x800deedf12a4df74ull;\n\t\n\tWallet_unlock() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_unlock> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_unlock& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_unlock& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_unlock::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_unlock>(2);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"passphrase\", 1); _visitor.accept(passphrase);\n\t_visitor.template type_end<Wallet_unlock>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_unlock_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_unlock_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_unlock_return_HXX_\n#define INCLUDE_mmx_Wallet_unlock_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_unlock_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe8e5c839343f6bbcull;\n\t\n\tWallet_unlock_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_unlock_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_unlock_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_unlock_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_unlock_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_unlock_return>(0);\n\t_visitor.template type_end<Wallet_unlock_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_unlock_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_update_cache.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_update_cache_HXX_\n#define INCLUDE_mmx_Wallet_update_cache_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_update_cache : public ::vnx::Value {\npublic:\n\t\n\tuint32_t index = 0;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf98cf07accda73b8ull;\n\t\n\tWallet_update_cache() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_update_cache> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_update_cache& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_update_cache& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_update_cache::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_update_cache>(1);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.template type_end<Wallet_update_cache>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_update_cache_HXX_\n"
  },
  {
    "path": "generated/include/mmx/Wallet_update_cache_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_Wallet_update_cache_return_HXX_\n#define INCLUDE_mmx_Wallet_update_cache_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT Wallet_update_cache_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x7e1b25fb37caf248ull;\n\t\n\tWallet_update_cache_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<Wallet_update_cache_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Wallet_update_cache_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Wallet_update_cache_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid Wallet_update_cache_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Wallet_update_cache_return>(0);\n\t_visitor.template type_end<Wallet_update_cache_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_Wallet_update_cache_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/WebAPIAsyncClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_WebAPI_ASYNC_CLIENT_HXX_\n#define INCLUDE_mmx_WebAPI_ASYNC_CLIENT_HXX_\n\n#include <vnx/AsyncClient.h>\n#include <mmx/Block.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <vnx/LogMsg.hxx>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass WebAPIAsyncClient : public vnx::AsyncClient {\npublic:\n\tWebAPIAsyncClient(const std::string& service_name);\n\t\n\tWebAPIAsyncClient(vnx::Hash64 service_addr);\n\t\n\tuint64_t shutdown(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", \n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", const int64_t& offset = 0, const int64_t& max_bytes = 0, \n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config_object(\n\t\t\tconst std::function<void(const ::vnx::Object&)>& _callback = std::function<void(const ::vnx::Object&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_config(const std::string& name = \"\", \n\t\t\tconst std::function<void(const ::vnx::Variant&)>& _callback = std::function<void(const ::vnx::Variant&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant(), \n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_type_code(\n\t\t\tconst std::function<void(const ::vnx::TypeCode&)>& _callback = std::function<void(const ::vnx::TypeCode&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_get_module_info(\n\t\t\tconst std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback = std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_restart(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_stop(\n\t\t\tconst std::function<void()>& _callback = std::function<void()>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\n\tuint64_t vnx_self_test(\n\t\t\tconst std::function<void(const vnx::bool_t&)>& _callback = std::function<void(const vnx::bool_t&)>(),\n\t\t\tconst std::function<void(const vnx::exception&)>& _error_callback = std::function<void(const vnx::exception&)>());\n\t\nprotected:\n\tint32_t vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) override;\n\t\n\tint32_t vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) override;\n\t\nprivate:\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_shutdown;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>, std::function<void(const vnx::exception&)>>> vnx_queue_http_request;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>, std::function<void(const vnx::exception&)>>> vnx_queue_http_request_chunk;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Object&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::Variant&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config_object;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_set_config;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const ::vnx::TypeCode&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_type_code;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_get_module_info;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_restart;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void()>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_stop;\n\tstd::unordered_map<uint64_t, std::pair<std::function<void(const vnx::bool_t&)>, std::function<void(const vnx::exception&)>>> vnx_queue_vnx_self_test;\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_WebAPI_ASYNC_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/WebAPIBase.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_WebAPIBase_HXX_\n#define INCLUDE_mmx_WebAPIBase_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <vnx/LogMsg.hxx>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT WebAPIBase : public ::vnx::Module {\npublic:\n\t\n\t::vnx::TopicPtr input_blocks = \"node.verified_blocks\";\n\t::vnx::TopicPtr input_proofs = \"harvester.proof\";\n\tstd::string node_server = \"Node\";\n\tstd::string wallet_server = \"Wallet\";\n\tstd::string farmer_server = \"Farmer\";\n\tstd::string exchange_server = \"ExchClient\";\n\tstd::string config_path;\n\tuint32_t max_recursion = 100;\n\tuint32_t max_log_history = 10000;\n\tuint32_t sync_delay = 18;\n\tuint32_t cache_max_age = 0;\n\t\n\ttypedef ::vnx::Module Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xfe90ce601fcc0cc6ull;\n\t\n\tWebAPIBase(const std::string& _vnx_name);\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const WebAPIBase& _value);\n\tfriend std::istream& operator>>(std::istream& _in, WebAPIBase& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tusing Super::handle;\n\t\n\tvirtual void shutdown() = 0;\n\tvirtual void handle(std::shared_ptr<const ::mmx::Block> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::mmx::ProofResponse> _value) {}\n\tvirtual void handle(std::shared_ptr<const ::vnx::LogMsg> _value) {}\n\tvirtual void http_request_async(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const vnx::request_id_t& _request_id) const = 0;\n\tvoid http_request_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpResponse>& _ret_0) const;\n\tvirtual void http_request_chunk_async(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& _request_id) const = 0;\n\tvoid http_request_chunk_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpData>& _ret_0) const;\n\t\n\tvoid vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) override;\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) override;\n\t\n};\n\ntemplate<typename T>\nvoid WebAPIBase::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<WebAPIBase>(11);\n\t_visitor.type_field(\"input_blocks\", 0); _visitor.accept(input_blocks);\n\t_visitor.type_field(\"input_proofs\", 1); _visitor.accept(input_proofs);\n\t_visitor.type_field(\"node_server\", 2); _visitor.accept(node_server);\n\t_visitor.type_field(\"wallet_server\", 3); _visitor.accept(wallet_server);\n\t_visitor.type_field(\"farmer_server\", 4); _visitor.accept(farmer_server);\n\t_visitor.type_field(\"exchange_server\", 5); _visitor.accept(exchange_server);\n\t_visitor.type_field(\"config_path\", 6); _visitor.accept(config_path);\n\t_visitor.type_field(\"max_recursion\", 7); _visitor.accept(max_recursion);\n\t_visitor.type_field(\"max_log_history\", 8); _visitor.accept(max_log_history);\n\t_visitor.type_field(\"sync_delay\", 9); _visitor.accept(sync_delay);\n\t_visitor.type_field(\"cache_max_age\", 10); _visitor.accept(cache_max_age);\n\t_visitor.template type_end<WebAPIBase>(11);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_WebAPIBase_HXX_\n"
  },
  {
    "path": "generated/include/mmx/WebAPIClient.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_WebAPI_CLIENT_HXX_\n#define INCLUDE_mmx_WebAPI_CLIENT_HXX_\n\n#include <vnx/Client.h>\n#include <mmx/Block.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <vnx/LogMsg.hxx>\n#include <vnx/Module.h>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n\nnamespace mmx {\n\nclass WebAPIClient : public vnx::Client {\npublic:\n\tWebAPIClient(const std::string& service_name);\n\t\n\tWebAPIClient(vnx::Hash64 service_addr);\n\t\n\tvoid shutdown();\n\t\n\tvoid shutdown_async();\n\t\n\tstd::shared_ptr<const ::vnx::addons::HttpResponse> http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\");\n\t\n\tstd::shared_ptr<const ::vnx::addons::HttpData> http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request = nullptr, const std::string& sub_path = \"\", const int64_t& offset = 0, const int64_t& max_bytes = 0);\n\t\n\t::vnx::Object vnx_get_config_object();\n\t\n\t::vnx::Variant vnx_get_config(const std::string& name = \"\");\n\t\n\tvoid vnx_set_config_object(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config_object_async(const ::vnx::Object& config = ::vnx::Object());\n\t\n\tvoid vnx_set_config(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\tvoid vnx_set_config_async(const std::string& name = \"\", const ::vnx::Variant& value = ::vnx::Variant());\n\t\n\t::vnx::TypeCode vnx_get_type_code();\n\t\n\tstd::shared_ptr<const ::vnx::ModuleInfo> vnx_get_module_info();\n\t\n\tvoid vnx_restart();\n\t\n\tvoid vnx_restart_async();\n\t\n\tvoid vnx_stop();\n\t\n\tvoid vnx_stop_async();\n\t\n\tvnx::bool_t vnx_self_test();\n\t\n};\n\n\n} // namespace mmx\n\n#endif // INCLUDE_mmx_WebAPI_CLIENT_HXX_\n"
  },
  {
    "path": "generated/include/mmx/WebAPI_shutdown.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_WebAPI_shutdown_HXX_\n#define INCLUDE_mmx_WebAPI_shutdown_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT WebAPI_shutdown : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x75dd6111dc25b9d6ull;\n\t\n\tWebAPI_shutdown() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<WebAPI_shutdown> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const WebAPI_shutdown& _value);\n\tfriend std::istream& operator>>(std::istream& _in, WebAPI_shutdown& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid WebAPI_shutdown::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<WebAPI_shutdown>(0);\n\t_visitor.template type_end<WebAPI_shutdown>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_WebAPI_shutdown_HXX_\n"
  },
  {
    "path": "generated/include/mmx/WebAPI_shutdown_return.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_WebAPI_shutdown_return_HXX_\n#define INCLUDE_mmx_WebAPI_shutdown_return_HXX_\n\n#include <mmx/package.hxx>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT WebAPI_shutdown_return : public ::vnx::Value {\npublic:\n\t\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x248624ff297c34ull;\n\t\n\tWebAPI_shutdown_return() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<WebAPI_shutdown_return> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const WebAPI_shutdown_return& _value);\n\tfriend std::istream& operator>>(std::istream& _in, WebAPI_shutdown_return& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid WebAPI_shutdown_return::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<WebAPI_shutdown_return>(0);\n\t_visitor.template type_end<WebAPI_shutdown_return>(0);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_WebAPI_shutdown_return_HXX_\n"
  },
  {
    "path": "generated/include/mmx/accept_generic.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ACCEPT_GENERIC_HXX_\n#define INCLUDE_mmx_ACCEPT_GENERIC_HXX_\n\n#include <mmx/Block.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Challenge.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/Farmer_get_farm_info.hxx>\n#include <mmx/Farmer_get_farm_info_return.hxx>\n#include <mmx/Farmer_get_farmer_keys.hxx>\n#include <mmx/Farmer_get_farmer_keys_return.hxx>\n#include <mmx/Farmer_get_mac_addr.hxx>\n#include <mmx/Farmer_get_mac_addr_return.hxx>\n#include <mmx/Farmer_get_partial_diff.hxx>\n#include <mmx/Farmer_get_partial_diff_return.hxx>\n#include <mmx/Farmer_get_partial_diffs.hxx>\n#include <mmx/Farmer_get_partial_diffs_return.hxx>\n#include <mmx/Farmer_sign_block.hxx>\n#include <mmx/Farmer_sign_block_return.hxx>\n#include <mmx/Farmer_sign_vote.hxx>\n#include <mmx/Farmer_sign_vote_return.hxx>\n#include <mmx/Harvester_add_plot_dir.hxx>\n#include <mmx/Harvester_add_plot_dir_return.hxx>\n#include <mmx/Harvester_get_farm_info.hxx>\n#include <mmx/Harvester_get_farm_info_return.hxx>\n#include <mmx/Harvester_get_total_bytes.hxx>\n#include <mmx/Harvester_get_total_bytes_return.hxx>\n#include <mmx/Harvester_reload.hxx>\n#include <mmx/Harvester_reload_return.hxx>\n#include <mmx/Harvester_rem_plot_dir.hxx>\n#include <mmx/Harvester_rem_plot_dir_return.hxx>\n#include <mmx/IntervalRequest.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/LookupInfo.hxx>\n#include <mmx/NetworkInfo.hxx>\n#include <mmx/Node_add_block.hxx>\n#include <mmx/Node_add_block_return.hxx>\n#include <mmx/Node_add_transaction.hxx>\n#include <mmx/Node_add_transaction_return.hxx>\n#include <mmx/Node_call_contract.hxx>\n#include <mmx/Node_call_contract_return.hxx>\n#include <mmx/Node_dump_storage.hxx>\n#include <mmx/Node_dump_storage_return.hxx>\n#include <mmx/Node_fetch_offers.hxx>\n#include <mmx/Node_fetch_offers_return.hxx>\n#include <mmx/Node_get_all_balances.hxx>\n#include <mmx/Node_get_all_balances_return.hxx>\n#include <mmx/Node_get_balance.hxx>\n#include <mmx/Node_get_balance_return.hxx>\n#include <mmx/Node_get_balances.hxx>\n#include <mmx/Node_get_balances_return.hxx>\n#include <mmx/Node_get_block.hxx>\n#include <mmx/Node_get_block_return.hxx>\n#include <mmx/Node_get_block_at.hxx>\n#include <mmx/Node_get_block_at_return.hxx>\n#include <mmx/Node_get_block_hash.hxx>\n#include <mmx/Node_get_block_hash_return.hxx>\n#include <mmx/Node_get_block_hash_ex.hxx>\n#include <mmx/Node_get_block_hash_ex_return.hxx>\n#include <mmx/Node_get_contract.hxx>\n#include <mmx/Node_get_contract_return.hxx>\n#include <mmx/Node_get_contract_balances.hxx>\n#include <mmx/Node_get_contract_balances_return.hxx>\n#include <mmx/Node_get_contract_for.hxx>\n#include <mmx/Node_get_contract_for_return.hxx>\n#include <mmx/Node_get_contracts.hxx>\n#include <mmx/Node_get_contracts_return.hxx>\n#include <mmx/Node_get_contracts_by.hxx>\n#include <mmx/Node_get_contracts_by_return.hxx>\n#include <mmx/Node_get_contracts_owned_by.hxx>\n#include <mmx/Node_get_contracts_owned_by_return.hxx>\n#include <mmx/Node_get_exec_history.hxx>\n#include <mmx/Node_get_exec_history_return.hxx>\n#include <mmx/Node_get_farmed_block_summary.hxx>\n#include <mmx/Node_get_farmed_block_summary_return.hxx>\n#include <mmx/Node_get_farmed_blocks.hxx>\n#include <mmx/Node_get_farmed_blocks_return.hxx>\n#include <mmx/Node_get_farmer_ranking.hxx>\n#include <mmx/Node_get_farmer_ranking_return.hxx>\n#include <mmx/Node_get_genesis_hash.hxx>\n#include <mmx/Node_get_genesis_hash_return.hxx>\n#include <mmx/Node_get_header.hxx>\n#include <mmx/Node_get_header_return.hxx>\n#include <mmx/Node_get_header_at.hxx>\n#include <mmx/Node_get_header_at_return.hxx>\n#include <mmx/Node_get_height.hxx>\n#include <mmx/Node_get_height_return.hxx>\n#include <mmx/Node_get_history.hxx>\n#include <mmx/Node_get_history_return.hxx>\n#include <mmx/Node_get_history_memo.hxx>\n#include <mmx/Node_get_history_memo_return.hxx>\n#include <mmx/Node_get_network_info.hxx>\n#include <mmx/Node_get_network_info_return.hxx>\n#include <mmx/Node_get_offer.hxx>\n#include <mmx/Node_get_offer_return.hxx>\n#include <mmx/Node_get_offers.hxx>\n#include <mmx/Node_get_offers_return.hxx>\n#include <mmx/Node_get_offers_by.hxx>\n#include <mmx/Node_get_offers_by_return.hxx>\n#include <mmx/Node_get_params.hxx>\n#include <mmx/Node_get_params_return.hxx>\n#include <mmx/Node_get_plot_nft_info.hxx>\n#include <mmx/Node_get_plot_nft_info_return.hxx>\n#include <mmx/Node_get_plot_nft_target.hxx>\n#include <mmx/Node_get_plot_nft_target_return.hxx>\n#include <mmx/Node_get_recent_offers.hxx>\n#include <mmx/Node_get_recent_offers_return.hxx>\n#include <mmx/Node_get_recent_offers_for.hxx>\n#include <mmx/Node_get_recent_offers_for_return.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity_return.hxx>\n#include <mmx/Node_get_swap_fees_earned.hxx>\n#include <mmx/Node_get_swap_fees_earned_return.hxx>\n#include <mmx/Node_get_swap_history.hxx>\n#include <mmx/Node_get_swap_history_return.hxx>\n#include <mmx/Node_get_swap_info.hxx>\n#include <mmx/Node_get_swap_info_return.hxx>\n#include <mmx/Node_get_swap_liquidity_by.hxx>\n#include <mmx/Node_get_swap_liquidity_by_return.hxx>\n#include <mmx/Node_get_swap_trade_estimate.hxx>\n#include <mmx/Node_get_swap_trade_estimate_return.hxx>\n#include <mmx/Node_get_swap_user_info.hxx>\n#include <mmx/Node_get_swap_user_info_return.hxx>\n#include <mmx/Node_get_swaps.hxx>\n#include <mmx/Node_get_swaps_return.hxx>\n#include <mmx/Node_get_synced_height.hxx>\n#include <mmx/Node_get_synced_height_return.hxx>\n#include <mmx/Node_get_synced_vdf_height.hxx>\n#include <mmx/Node_get_synced_vdf_height_return.hxx>\n#include <mmx/Node_get_total_balance.hxx>\n#include <mmx/Node_get_total_balance_return.hxx>\n#include <mmx/Node_get_total_balances.hxx>\n#include <mmx/Node_get_total_balances_return.hxx>\n#include <mmx/Node_get_total_supply.hxx>\n#include <mmx/Node_get_total_supply_return.hxx>\n#include <mmx/Node_get_trade_history.hxx>\n#include <mmx/Node_get_trade_history_return.hxx>\n#include <mmx/Node_get_trade_history_for.hxx>\n#include <mmx/Node_get_trade_history_for_return.hxx>\n#include <mmx/Node_get_transaction.hxx>\n#include <mmx/Node_get_transaction_return.hxx>\n#include <mmx/Node_get_transactions.hxx>\n#include <mmx/Node_get_transactions_return.hxx>\n#include <mmx/Node_get_tx_height.hxx>\n#include <mmx/Node_get_tx_height_return.hxx>\n#include <mmx/Node_get_tx_ids.hxx>\n#include <mmx/Node_get_tx_ids_return.hxx>\n#include <mmx/Node_get_tx_ids_at.hxx>\n#include <mmx/Node_get_tx_ids_at_return.hxx>\n#include <mmx/Node_get_tx_ids_since.hxx>\n#include <mmx/Node_get_tx_ids_since_return.hxx>\n#include <mmx/Node_get_tx_info.hxx>\n#include <mmx/Node_get_tx_info_return.hxx>\n#include <mmx/Node_get_tx_info_for.hxx>\n#include <mmx/Node_get_tx_info_for_return.hxx>\n#include <mmx/Node_get_vdf_height.hxx>\n#include <mmx/Node_get_vdf_height_return.hxx>\n#include <mmx/Node_get_vdf_peak.hxx>\n#include <mmx/Node_get_vdf_peak_return.hxx>\n#include <mmx/Node_read_storage.hxx>\n#include <mmx/Node_read_storage_return.hxx>\n#include <mmx/Node_read_storage_array.hxx>\n#include <mmx/Node_read_storage_array_return.hxx>\n#include <mmx/Node_read_storage_entry_addr.hxx>\n#include <mmx/Node_read_storage_entry_addr_return.hxx>\n#include <mmx/Node_read_storage_entry_string.hxx>\n#include <mmx/Node_read_storage_entry_string_return.hxx>\n#include <mmx/Node_read_storage_entry_var.hxx>\n#include <mmx/Node_read_storage_entry_var_return.hxx>\n#include <mmx/Node_read_storage_field.hxx>\n#include <mmx/Node_read_storage_field_return.hxx>\n#include <mmx/Node_read_storage_map.hxx>\n#include <mmx/Node_read_storage_map_return.hxx>\n#include <mmx/Node_read_storage_object.hxx>\n#include <mmx/Node_read_storage_object_return.hxx>\n#include <mmx/Node_read_storage_var.hxx>\n#include <mmx/Node_read_storage_var_return.hxx>\n#include <mmx/Node_revert_sync.hxx>\n#include <mmx/Node_revert_sync_return.hxx>\n#include <mmx/Node_start_sync.hxx>\n#include <mmx/Node_start_sync_return.hxx>\n#include <mmx/Node_validate.hxx>\n#include <mmx/Node_validate_return.hxx>\n#include <mmx/Node_verify_partial.hxx>\n#include <mmx/Node_verify_partial_return.hxx>\n#include <mmx/Node_verify_plot_nft_target.hxx>\n#include <mmx/Node_verify_plot_nft_target_return.hxx>\n#include <mmx/Operation.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/PeerInfo.hxx>\n#include <mmx/PlotHeader.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/ProofOfSpaceNFT.hxx>\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/ProofServer_compute.hxx>\n#include <mmx/ProofServer_compute_return.hxx>\n#include <mmx/ReceiveNote.hxx>\n#include <mmx/Request.hxx>\n#include <mmx/Return.hxx>\n#include <mmx/Router_discover.hxx>\n#include <mmx/Router_discover_return.hxx>\n#include <mmx/Router_fetch_block.hxx>\n#include <mmx/Router_fetch_block_return.hxx>\n#include <mmx/Router_fetch_block_at.hxx>\n#include <mmx/Router_fetch_block_at_return.hxx>\n#include <mmx/Router_get_blocks_at.hxx>\n#include <mmx/Router_get_blocks_at_return.hxx>\n#include <mmx/Router_get_connected_peers.hxx>\n#include <mmx/Router_get_connected_peers_return.hxx>\n#include <mmx/Router_get_id.hxx>\n#include <mmx/Router_get_id_return.hxx>\n#include <mmx/Router_get_info.hxx>\n#include <mmx/Router_get_info_return.hxx>\n#include <mmx/Router_get_known_peers.hxx>\n#include <mmx/Router_get_known_peers_return.hxx>\n#include <mmx/Router_get_peer_info.hxx>\n#include <mmx/Router_get_peer_info_return.hxx>\n#include <mmx/Router_get_peers.hxx>\n#include <mmx/Router_get_peers_return.hxx>\n#include <mmx/Router_kick_peer.hxx>\n#include <mmx/Router_kick_peer_return.hxx>\n#include <mmx/Router_sign_msg.hxx>\n#include <mmx/Router_sign_msg_return.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/TimeLord_stop_vdf.hxx>\n#include <mmx/TimeLord_stop_vdf_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/TransactionBase.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/Wallet_accept_offer.hxx>\n#include <mmx/Wallet_accept_offer_return.hxx>\n#include <mmx/Wallet_add_account.hxx>\n#include <mmx/Wallet_add_account_return.hxx>\n#include <mmx/Wallet_add_token.hxx>\n#include <mmx/Wallet_add_token_return.hxx>\n#include <mmx/Wallet_cancel_offer.hxx>\n#include <mmx/Wallet_cancel_offer_return.hxx>\n#include <mmx/Wallet_complete.hxx>\n#include <mmx/Wallet_complete_return.hxx>\n#include <mmx/Wallet_create_account.hxx>\n#include <mmx/Wallet_create_account_return.hxx>\n#include <mmx/Wallet_create_wallet.hxx>\n#include <mmx/Wallet_create_wallet_return.hxx>\n#include <mmx/Wallet_deploy.hxx>\n#include <mmx/Wallet_deploy_return.hxx>\n#include <mmx/Wallet_deposit.hxx>\n#include <mmx/Wallet_deposit_return.hxx>\n#include <mmx/Wallet_execute.hxx>\n#include <mmx/Wallet_execute_return.hxx>\n#include <mmx/Wallet_export_wallet.hxx>\n#include <mmx/Wallet_export_wallet_return.hxx>\n#include <mmx/Wallet_find_wallet_by_addr.hxx>\n#include <mmx/Wallet_find_wallet_by_addr_return.hxx>\n#include <mmx/Wallet_gather_inputs_for.hxx>\n#include <mmx/Wallet_gather_inputs_for_return.hxx>\n#include <mmx/Wallet_get_account.hxx>\n#include <mmx/Wallet_get_account_return.hxx>\n#include <mmx/Wallet_get_address.hxx>\n#include <mmx/Wallet_get_address_return.hxx>\n#include <mmx/Wallet_get_all_accounts.hxx>\n#include <mmx/Wallet_get_all_accounts_return.hxx>\n#include <mmx/Wallet_get_all_addresses.hxx>\n#include <mmx/Wallet_get_all_addresses_return.hxx>\n#include <mmx/Wallet_get_all_farmer_keys.hxx>\n#include <mmx/Wallet_get_all_farmer_keys_return.hxx>\n#include <mmx/Wallet_get_balance.hxx>\n#include <mmx/Wallet_get_balance_return.hxx>\n#include <mmx/Wallet_get_balances.hxx>\n#include <mmx/Wallet_get_balances_return.hxx>\n#include <mmx/Wallet_get_contract_balances.hxx>\n#include <mmx/Wallet_get_contract_balances_return.hxx>\n#include <mmx/Wallet_get_contracts.hxx>\n#include <mmx/Wallet_get_contracts_return.hxx>\n#include <mmx/Wallet_get_contracts_owned.hxx>\n#include <mmx/Wallet_get_contracts_owned_return.hxx>\n#include <mmx/Wallet_get_farmer_keys.hxx>\n#include <mmx/Wallet_get_farmer_keys_return.hxx>\n#include <mmx/Wallet_get_history.hxx>\n#include <mmx/Wallet_get_history_return.hxx>\n#include <mmx/Wallet_get_master_seed.hxx>\n#include <mmx/Wallet_get_master_seed_return.hxx>\n#include <mmx/Wallet_get_mnemonic_seed.hxx>\n#include <mmx/Wallet_get_mnemonic_seed_return.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist_return.hxx>\n#include <mmx/Wallet_get_offers.hxx>\n#include <mmx/Wallet_get_offers_return.hxx>\n#include <mmx/Wallet_get_swap_liquidity.hxx>\n#include <mmx/Wallet_get_swap_liquidity_return.hxx>\n#include <mmx/Wallet_get_token_list.hxx>\n#include <mmx/Wallet_get_token_list_return.hxx>\n#include <mmx/Wallet_get_total_balances.hxx>\n#include <mmx/Wallet_get_total_balances_return.hxx>\n#include <mmx/Wallet_get_tx_log.hxx>\n#include <mmx/Wallet_get_tx_log_return.hxx>\n#include <mmx/Wallet_import_wallet.hxx>\n#include <mmx/Wallet_import_wallet_return.hxx>\n#include <mmx/Wallet_is_locked.hxx>\n#include <mmx/Wallet_is_locked_return.hxx>\n#include <mmx/Wallet_lock.hxx>\n#include <mmx/Wallet_lock_return.hxx>\n#include <mmx/Wallet_make_offer.hxx>\n#include <mmx/Wallet_make_offer_return.hxx>\n#include <mmx/Wallet_mark_spent.hxx>\n#include <mmx/Wallet_mark_spent_return.hxx>\n#include <mmx/Wallet_offer_trade.hxx>\n#include <mmx/Wallet_offer_trade_return.hxx>\n#include <mmx/Wallet_offer_withdraw.hxx>\n#include <mmx/Wallet_offer_withdraw_return.hxx>\n#include <mmx/Wallet_plotnft_create.hxx>\n#include <mmx/Wallet_plotnft_create_return.hxx>\n#include <mmx/Wallet_plotnft_exec.hxx>\n#include <mmx/Wallet_plotnft_exec_return.hxx>\n#include <mmx/Wallet_release.hxx>\n#include <mmx/Wallet_release_return.hxx>\n#include <mmx/Wallet_release_all.hxx>\n#include <mmx/Wallet_release_all_return.hxx>\n#include <mmx/Wallet_rem_token.hxx>\n#include <mmx/Wallet_rem_token_return.hxx>\n#include <mmx/Wallet_remove_account.hxx>\n#include <mmx/Wallet_remove_account_return.hxx>\n#include <mmx/Wallet_reserve.hxx>\n#include <mmx/Wallet_reserve_return.hxx>\n#include <mmx/Wallet_reset_cache.hxx>\n#include <mmx/Wallet_reset_cache_return.hxx>\n#include <mmx/Wallet_send.hxx>\n#include <mmx/Wallet_send_return.hxx>\n#include <mmx/Wallet_send_from.hxx>\n#include <mmx/Wallet_send_from_return.hxx>\n#include <mmx/Wallet_send_many.hxx>\n#include <mmx/Wallet_send_many_return.hxx>\n#include <mmx/Wallet_send_off.hxx>\n#include <mmx/Wallet_send_off_return.hxx>\n#include <mmx/Wallet_set_address_count.hxx>\n#include <mmx/Wallet_set_address_count_return.hxx>\n#include <mmx/Wallet_sign_msg.hxx>\n#include <mmx/Wallet_sign_msg_return.hxx>\n#include <mmx/Wallet_sign_off.hxx>\n#include <mmx/Wallet_sign_off_return.hxx>\n#include <mmx/Wallet_swap_add_liquid.hxx>\n#include <mmx/Wallet_swap_add_liquid_return.hxx>\n#include <mmx/Wallet_swap_rem_liquid.hxx>\n#include <mmx/Wallet_swap_rem_liquid_return.hxx>\n#include <mmx/Wallet_swap_trade.hxx>\n#include <mmx/Wallet_swap_trade_return.hxx>\n#include <mmx/Wallet_unlock.hxx>\n#include <mmx/Wallet_unlock_return.hxx>\n#include <mmx/Wallet_update_cache.hxx>\n#include <mmx/Wallet_update_cache_return.hxx>\n#include <mmx/WalletFile.hxx>\n#include <mmx/WebAPI_shutdown.hxx>\n#include <mmx/WebAPI_shutdown_return.hxx>\n#include <mmx/tx_info_t.hxx>\n\n\nnamespace vnx {\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Block> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::BlockHeader> value) {\n\tif(value) {\n\t\tif(auto tmp = std::dynamic_pointer_cast<const ::mmx::Block>(value)) {\n\t\t\tvnx::accept_generic(visitor, tmp);\n\t\t} else {\n\t\t\tvalue->accept_generic(visitor);\n\t\t}\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ChainParams> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Challenge> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Contract> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::FarmInfo> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_farm_info> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_farm_info_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_farmer_keys> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_farmer_keys_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_mac_addr> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_mac_addr_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_partial_diff> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_partial_diff_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_partial_diffs> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_partial_diffs_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_sign_block> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_sign_block_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_sign_vote> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_sign_vote_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_add_plot_dir> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_add_plot_dir_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_get_farm_info> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_get_farm_info_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_get_total_bytes> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_get_total_bytes_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_reload> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_reload_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_rem_plot_dir> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_rem_plot_dir_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::IntervalRequest> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::KeyFile> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::LookupInfo> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::NetworkInfo> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_add_block> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_add_block_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_add_transaction> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_add_transaction_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_call_contract> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_call_contract_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_dump_storage> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_dump_storage_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_fetch_offers> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_fetch_offers_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_all_balances> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_all_balances_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_balance> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_balance_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_balances> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_balances_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_at> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_at_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_hash> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_hash_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_hash_ex> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_hash_ex_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract_balances> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract_balances_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract_for> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract_for_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts_by> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts_by_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts_owned_by> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts_owned_by_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_exec_history> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_exec_history_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmed_block_summary> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmed_block_summary_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmed_blocks> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmed_blocks_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmer_ranking> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmer_ranking_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_genesis_hash> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_genesis_hash_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_header> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_header_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_header_at> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_header_at_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_height> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_height_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_history> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_history_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_history_memo> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_history_memo_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_network_info> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_network_info_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offer> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offer_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offers> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offers_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offers_by> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offers_by_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_params> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_params_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_plot_nft_info> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_plot_nft_info_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_plot_nft_target> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_plot_nft_target_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_recent_offers> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_recent_offers_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_recent_offers_for> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_recent_offers_for_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_equivalent_liquidity> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_equivalent_liquidity_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_fees_earned> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_fees_earned_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_history> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_history_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_info> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_info_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_liquidity_by> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_liquidity_by_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_trade_estimate> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_trade_estimate_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_user_info> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_user_info_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swaps> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swaps_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_synced_height> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_synced_height_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_synced_vdf_height> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_synced_vdf_height_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_balance> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_balance_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_balances> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_balances_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_supply> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_supply_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_trade_history> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_trade_history_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_trade_history_for> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_trade_history_for_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_transaction> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_transaction_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_transactions> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_transactions_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_height> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_height_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids_at> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids_at_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids_since> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids_since_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_info> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_info_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_info_for> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_info_for_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_vdf_height> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_vdf_height_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_vdf_peak> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_vdf_peak_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_array> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_array_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_addr> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_addr_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_string> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_string_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_var> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_var_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_field> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_field_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_map> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_map_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_object> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_object_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_var> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_var_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_revert_sync> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_revert_sync_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_start_sync> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_start_sync_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_validate> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_validate_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_verify_partial> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_verify_partial_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_verify_plot_nft_target> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_verify_plot_nft_target_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Operation> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Partial> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::PeerInfo> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::PlotHeader> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofOfSpace> value) {\n\tif(value) {\n\t\tif(auto tmp = std::dynamic_pointer_cast<const ::mmx::ProofOfSpaceNFT>(value)) {\n\t\t\tvnx::accept_generic(visitor, tmp);\n\t\t} else if(auto tmp = std::dynamic_pointer_cast<const ::mmx::ProofOfSpaceOG>(value)) {\n\t\t\tvnx::accept_generic(visitor, tmp);\n\t\t} else {\n\t\t\tvalue->accept_generic(visitor);\n\t\t}\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofOfSpaceNFT> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofOfSpaceOG> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofOfTime> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofResponse> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofServer_compute> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofServer_compute_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ReceiveNote> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Request> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_discover> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_discover_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_fetch_block> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_fetch_block_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_fetch_block_at> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_fetch_block_at_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_blocks_at> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_blocks_at_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_connected_peers> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_connected_peers_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_id> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_id_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_info> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_info_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_known_peers> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_known_peers_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_peer_info> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_peer_info_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_peers> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_peers_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_kick_peer> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_kick_peer_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_sign_msg> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_sign_msg_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Solution> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::TimeLord_stop_vdf> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::TimeLord_stop_vdf_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Transaction> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::TransactionBase> value) {\n\tif(value) {\n\t\tif(auto tmp = std::dynamic_pointer_cast<const ::mmx::Transaction>(value)) {\n\t\t\tvnx::accept_generic(visitor, tmp);\n\t\t} else {\n\t\t\tvalue->accept_generic(visitor);\n\t\t}\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::VDF_Point> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ValidatorVote> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_accept_offer> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_accept_offer_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_add_account> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_add_account_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_add_token> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_add_token_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_cancel_offer> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_cancel_offer_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_complete> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_complete_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_create_account> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_create_account_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_create_wallet> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_create_wallet_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_deploy> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_deploy_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_deposit> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_deposit_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_execute> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_execute_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_export_wallet> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_export_wallet_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_find_wallet_by_addr> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_find_wallet_by_addr_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_gather_inputs_for> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_gather_inputs_for_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_account> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_account_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_address> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_address_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_accounts> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_accounts_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_addresses> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_addresses_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_farmer_keys> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_farmer_keys_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_balance> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_balance_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_balances> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_balances_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contract_balances> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contract_balances_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contracts> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contracts_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contracts_owned> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contracts_owned_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_farmer_keys> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_farmer_keys_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_history> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_history_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_master_seed> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_master_seed_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_mnemonic_seed> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_mnemonic_seed_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_mnemonic_wordlist> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_mnemonic_wordlist_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_offers> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_offers_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_swap_liquidity> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_swap_liquidity_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_token_list> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_token_list_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_total_balances> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_total_balances_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_tx_log> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_tx_log_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_import_wallet> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_import_wallet_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_is_locked> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_is_locked_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_lock> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_lock_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_make_offer> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_make_offer_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_mark_spent> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_mark_spent_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_offer_trade> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_offer_trade_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_offer_withdraw> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_offer_withdraw_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_plotnft_create> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_plotnft_create_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_plotnft_exec> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_plotnft_exec_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_release> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_release_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_release_all> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_release_all_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_rem_token> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_rem_token_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_remove_account> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_remove_account_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_reserve> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_reserve_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_reset_cache> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_reset_cache_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_from> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_from_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_many> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_many_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_off> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_off_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_set_address_count> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_set_address_count_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_sign_msg> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_sign_msg_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_sign_off> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_sign_off_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_add_liquid> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_add_liquid_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_rem_liquid> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_rem_liquid_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_trade> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_trade_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_unlock> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_unlock_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_update_cache> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_update_cache_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::WalletFile> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::WebAPI_shutdown> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::WebAPI_shutdown_return> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::tx_info_t> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\n\n\n} // namespace vnx\n\n#endif // INCLUDE_mmx_ACCEPT_GENERIC_HXX_\n"
  },
  {
    "path": "generated/include/mmx/account_info_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_account_info_t_HXX_\n#define INCLUDE_mmx_account_info_t_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/account_t.hxx>\n#include <mmx/addr_t.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT account_info_t : ::mmx::account_t {\n\t\n\t\n\tvnx::optional<::mmx::addr_t> address;\n\tuint32_t account = 0;\n\t\n\ttypedef ::mmx::account_t Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5858a2f32468feaeull;\n\t\n\taccount_info_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic ::mmx::account_info_t make(const uint32_t& account = 0, const vnx::optional<::mmx::addr_t>& address = nullptr, const ::mmx::account_t& config = ::mmx::account_t());\n\t\n\tstatic std::shared_ptr<account_info_t> create();\n\tstd::shared_ptr<account_info_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const account_info_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, account_info_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid account_info_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<account_info_t>(9);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"num_addresses\", 1); _visitor.accept(num_addresses);\n\t_visitor.type_field(\"name\", 2); _visitor.accept(name);\n\t_visitor.type_field(\"key_file\", 3); _visitor.accept(key_file);\n\t_visitor.type_field(\"finger_print\", 4); _visitor.accept(finger_print);\n\t_visitor.type_field(\"with_passphrase\", 5); _visitor.accept(with_passphrase);\n\t_visitor.type_field(\"is_hidden\", 6); _visitor.accept(is_hidden);\n\t_visitor.type_field(\"address\", 7); _visitor.accept(address);\n\t_visitor.type_field(\"account\", 8); _visitor.accept(account);\n\t_visitor.template type_end<account_info_t>(9);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::account_info_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_account_info_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/account_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_account_t_HXX_\n#define INCLUDE_mmx_account_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT account_t : vnx::struct_t {\n\t\n\t\n\tuint32_t index = 0;\n\tuint32_t num_addresses = 1;\n\tstd::string name;\n\tstd::string key_file;\n\tstd::string finger_print;\n\tvnx::bool_t with_passphrase = 0;\n\tvnx::bool_t is_hidden = 0;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc0c163f453729a7ull;\n\t\n\taccount_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<account_t> create();\n\tstd::shared_ptr<account_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const account_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, account_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid account_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<account_t>(7);\n\t_visitor.type_field(\"index\", 0); _visitor.accept(index);\n\t_visitor.type_field(\"num_addresses\", 1); _visitor.accept(num_addresses);\n\t_visitor.type_field(\"name\", 2); _visitor.accept(name);\n\t_visitor.type_field(\"key_file\", 3); _visitor.accept(key_file);\n\t_visitor.type_field(\"finger_print\", 4); _visitor.accept(finger_print);\n\t_visitor.type_field(\"with_passphrase\", 5); _visitor.accept(with_passphrase);\n\t_visitor.type_field(\"is_hidden\", 6); _visitor.accept(is_hidden);\n\t_visitor.template type_end<account_t>(7);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::account_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_account_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/balance_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_balance_t_HXX_\n#define INCLUDE_mmx_balance_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/uint128.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT balance_t : vnx::struct_t {\n\t\n\t\n\t::mmx::uint128 spendable;\n\t::mmx::uint128 reserved;\n\t::mmx::uint128 locked;\n\t::mmx::uint128 total;\n\tvnx::bool_t is_validated = 0;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x613173c7e5ce65b4ull;\n\t\n\tbalance_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<balance_t> create();\n\tstd::shared_ptr<balance_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const balance_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, balance_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid balance_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<balance_t>(5);\n\t_visitor.type_field(\"spendable\", 0); _visitor.accept(spendable);\n\t_visitor.type_field(\"reserved\", 1); _visitor.accept(reserved);\n\t_visitor.type_field(\"locked\", 2); _visitor.accept(locked);\n\t_visitor.type_field(\"total\", 3); _visitor.accept(total);\n\t_visitor.type_field(\"is_validated\", 4); _visitor.accept(is_validated);\n\t_visitor.template type_end<balance_t>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::balance_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_balance_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/block_index_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_block_index_t_HXX_\n#define INCLUDE_mmx_block_index_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT block_index_t : vnx::struct_t {\n\t\n\t\n\t::mmx::hash_t hash;\n\t::mmx::hash_t content_hash;\n\tuint32_t static_cost = 0;\n\tuint32_t total_cost = 0;\n\tint64_t file_offset = 0;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd00c722670bca900ull;\n\t\n\tblock_index_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<block_index_t> create();\n\tstd::shared_ptr<block_index_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const block_index_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, block_index_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid block_index_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<block_index_t>(5);\n\t_visitor.type_field(\"hash\", 0); _visitor.accept(hash);\n\t_visitor.type_field(\"content_hash\", 1); _visitor.accept(content_hash);\n\t_visitor.type_field(\"static_cost\", 2); _visitor.accept(static_cost);\n\t_visitor.type_field(\"total_cost\", 3); _visitor.accept(total_cost);\n\t_visitor.type_field(\"file_offset\", 4); _visitor.accept(file_offset);\n\t_visitor.template type_end<block_index_t>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::block_index_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_block_index_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/compile_flags_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_compile_flags_t_HXX_\n#define INCLUDE_mmx_compile_flags_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT compile_flags_t : vnx::struct_t {\n\t\n\t\n\tint32_t verbose = 0;\n\tint32_t opt_level = 3;\n\tvnx::bool_t catch_overflow = true;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x2d1279b3d438d884ull;\n\t\n\tcompile_flags_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<compile_flags_t> create();\n\tstd::shared_ptr<compile_flags_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const compile_flags_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, compile_flags_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid compile_flags_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<compile_flags_t>(3);\n\t_visitor.type_field(\"verbose\", 0); _visitor.accept(verbose);\n\t_visitor.type_field(\"opt_level\", 1); _visitor.accept(opt_level);\n\t_visitor.type_field(\"catch_overflow\", 2); _visitor.accept(catch_overflow);\n\t_visitor.template type_end<compile_flags_t>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::compile_flags_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_compile_flags_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/error_code_e.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_error_code_e_HXX_\n#define INCLUDE_mmx_error_code_e_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT error_code_e {\n\t\n\tenum enum_t : uint32_t {\n\t\tINSUFFICIENT_FUNDS = 1975784893l,\n\t\tINSUFFICIENT_FUNDS_TXFEE = 1882923049l,\n\t\tINVALID_CONTRACT = 914919857l,\n\t\tINVALID_OPERATION = 2667583392l,\n\t\tTXFEE_OVERRUN = 3169221647l,\n\t\tTX_EXPIRED = 327454547l,\n\t};\n\t\n\t::mmx::error_code_e::enum_t value = ::mmx::error_code_e::enum_t(0);\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc3330407879f46ull;\n\t\n\terror_code_e() {}\n\t\n\terror_code_e(const enum_t& _value) { value = _value; }\n\terror_code_e(const ::mmx::error_code_e& _other) { value = _other.value; }\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\toperator enum_t() const { return value; }\n\terror_code_e& operator=(const enum_t& _value) { value = _value; return *this; }\n\terror_code_e& operator=(const ::mmx::error_code_e& _other) { value = _other.value; return *this; }\n\t\n\tstatic std::shared_ptr<error_code_e> create();\n\tstd::shared_ptr<error_code_e> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::bool_t is_valid() const;\n\tstd::string to_string() const;\n\tstd::string to_string_value() const;\n\tstd::string to_string_value_full() const;\n\t\n\tvoid from_string(const std::string& str);\n\tvoid from_string_value(const std::string& name);\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const error_code_e& _value);\n\tfriend std::istream& operator>>(std::istream& _in, error_code_e& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid error_code_e::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<error_code_e>(1);\n\t_visitor.type_field(\"value\", 0); _visitor.accept(value);\n\t_visitor.template type_end<error_code_e>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::error_code_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid write(TypeOutput& out, const ::mmx::error_code_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::error_code_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::error_code_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::error_code_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::error_code_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::error_code_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::error_code_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstruct is_equivalent<::mmx::error_code_e> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_error_code_e_HXX_\n"
  },
  {
    "path": "generated/include/mmx/exec_entry_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_exec_entry_t_HXX_\n#define INCLUDE_mmx_exec_entry_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT exec_entry_t : vnx::struct_t {\n\t\n\t\n\tuint32_t height = 0;\n\tint64_t time_stamp = 0;\n\t::mmx::hash_t txid;\n\tstd::string method;\n\tstd::vector<::vnx::Variant> args;\n\tvnx::optional<::mmx::addr_t> user;\n\tvnx::optional<std::pair<::mmx::addr_t, ::mmx::uint128>> deposit;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xd30282844b1862a4ull;\n\t\n\texec_entry_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<exec_entry_t> create();\n\tstd::shared_ptr<exec_entry_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const exec_entry_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, exec_entry_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid exec_entry_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<exec_entry_t>(7);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.type_field(\"time_stamp\", 1); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"txid\", 2); _visitor.accept(txid);\n\t_visitor.type_field(\"method\", 3); _visitor.accept(method);\n\t_visitor.type_field(\"args\", 4); _visitor.accept(args);\n\t_visitor.type_field(\"user\", 5); _visitor.accept(user);\n\t_visitor.type_field(\"deposit\", 6); _visitor.accept(deposit);\n\t_visitor.template type_end<exec_entry_t>(7);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::exec_entry_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_exec_entry_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/exec_error_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_exec_error_t_HXX_\n#define INCLUDE_mmx_exec_error_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT exec_error_t : vnx::struct_t {\n\t\n\tstatic const uint32_t MAX_MESSAGE_LENGTH = 160;\n\t\n\tuint32_t code = 0;\n\tuint32_t address = -1;\n\tuint32_t operation = -1;\n\tvnx::optional<uint32_t> line;\n\tstd::string message;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x5cd84f2d984d4bfull;\n\t\n\texec_error_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tvnx::bool_t is_valid() const;\n\t::mmx::hash_t calc_hash() const;\n\t\n\tstatic std::shared_ptr<exec_error_t> create();\n\tstd::shared_ptr<exec_error_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const exec_error_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, exec_error_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid exec_error_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<exec_error_t>(5);\n\t_visitor.type_field(\"code\", 0); _visitor.accept(code);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"operation\", 2); _visitor.accept(operation);\n\t_visitor.type_field(\"line\", 3); _visitor.accept(line);\n\t_visitor.type_field(\"message\", 4); _visitor.accept(message);\n\t_visitor.template type_end<exec_error_t>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::exec_error_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_exec_error_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/exec_result_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_exec_result_t_HXX_\n#define INCLUDE_mmx_exec_result_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/exec_error_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/txin_t.hxx>\n#include <mmx/txout_t.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT exec_result_t : vnx::struct_t {\n\t\n\t\n\tvnx::bool_t did_fail = 0;\n\tuint32_t total_cost = 0;\n\tuint32_t total_fee = 0;\n\tstd::vector<::mmx::txin_t> inputs;\n\tstd::vector<::mmx::txout_t> outputs;\n\tvnx::optional<::mmx::exec_error_t> error;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x18fe02e2374b039eull;\n\t\n\texec_result_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tvnx::bool_t is_valid() const;\n\t::mmx::hash_t calc_hash() const;\n\tuint64_t calc_cost(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const;\n\tstd::string get_error_msg() const;\n\t\n\tstatic std::shared_ptr<exec_result_t> create();\n\tstd::shared_ptr<exec_result_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const exec_result_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, exec_result_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid exec_result_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<exec_result_t>(6);\n\t_visitor.type_field(\"did_fail\", 0); _visitor.accept(did_fail);\n\t_visitor.type_field(\"total_cost\", 1); _visitor.accept(total_cost);\n\t_visitor.type_field(\"total_fee\", 2); _visitor.accept(total_fee);\n\t_visitor.type_field(\"inputs\", 3); _visitor.accept(inputs);\n\t_visitor.type_field(\"outputs\", 4); _visitor.accept(outputs);\n\t_visitor.type_field(\"error\", 5); _visitor.accept(error);\n\t_visitor.template type_end<exec_result_t>(6);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::exec_result_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_exec_result_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/farmed_block_info_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_farmed_block_info_t_HXX_\n#define INCLUDE_mmx_farmed_block_info_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT farmed_block_info_t : vnx::struct_t {\n\t\n\t\n\tuint32_t height = 0;\n\tuint32_t reward = 0;\n\t::mmx::addr_t reward_addr;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x2e10154a52617b19ull;\n\t\n\tfarmed_block_info_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<farmed_block_info_t> create();\n\tstd::shared_ptr<farmed_block_info_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const farmed_block_info_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, farmed_block_info_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid farmed_block_info_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<farmed_block_info_t>(3);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.type_field(\"reward\", 1); _visitor.accept(reward);\n\t_visitor.type_field(\"reward_addr\", 2); _visitor.accept(reward_addr);\n\t_visitor.template type_end<farmed_block_info_t>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::farmed_block_info_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_farmed_block_info_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/farmed_block_summary_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_farmed_block_summary_t_HXX_\n#define INCLUDE_mmx_farmed_block_summary_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT farmed_block_summary_t : vnx::struct_t {\n\t\n\t\n\tuint32_t num_blocks = 0;\n\tuint32_t last_height = 0;\n\tuint64_t total_rewards = 0;\n\tstd::map<::mmx::addr_t, uint64_t> reward_map;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9fe2bac01782721dull;\n\t\n\tfarmed_block_summary_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<farmed_block_summary_t> create();\n\tstd::shared_ptr<farmed_block_summary_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const farmed_block_summary_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, farmed_block_summary_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid farmed_block_summary_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<farmed_block_summary_t>(4);\n\t_visitor.type_field(\"num_blocks\", 0); _visitor.accept(num_blocks);\n\t_visitor.type_field(\"last_height\", 1); _visitor.accept(last_height);\n\t_visitor.type_field(\"total_rewards\", 2); _visitor.accept(total_rewards);\n\t_visitor.type_field(\"reward_map\", 3); _visitor.accept(reward_map);\n\t_visitor.template type_end<farmed_block_summary_t>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::farmed_block_summary_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_farmed_block_summary_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/node_info_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_node_info_t_HXX_\n#define INCLUDE_mmx_node_info_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/node_type_e.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT node_info_t : vnx::struct_t {\n\t\n\t\n\t::mmx::hash_t id;\n\tuint32_t version = 0;\n\t::mmx::node_type_e type;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xda45b5e3a527588eull;\n\t\n\tnode_info_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<node_info_t> create();\n\tstd::shared_ptr<node_info_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const node_info_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, node_info_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid node_info_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<node_info_t>(3);\n\t_visitor.type_field(\"id\", 0); _visitor.accept(id);\n\t_visitor.type_field(\"version\", 1); _visitor.accept(version);\n\t_visitor.type_field(\"type\", 2); _visitor.accept(type);\n\t_visitor.template type_end<node_info_t>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::node_info_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_node_info_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/node_type_e.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_node_type_e_HXX_\n#define INCLUDE_mmx_node_type_e_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT node_type_e {\n\t\n\tenum enum_t : uint32_t {\n\t\tAPI_CLIENT = 1802393446l,\n\t\tFULL_NODE = 2903686019l,\n\t\tLIGHT_NODE = 3477499945l,\n\t};\n\t\n\t::mmx::node_type_e::enum_t value = ::mmx::node_type_e::enum_t(0);\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xa5de458f1ce5539aull;\n\t\n\tnode_type_e() {}\n\t\n\tnode_type_e(const enum_t& _value) { value = _value; }\n\tnode_type_e(const ::mmx::node_type_e& _other) { value = _other.value; }\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\toperator enum_t() const { return value; }\n\tnode_type_e& operator=(const enum_t& _value) { value = _value; return *this; }\n\tnode_type_e& operator=(const ::mmx::node_type_e& _other) { value = _other.value; return *this; }\n\t\n\tstatic std::shared_ptr<node_type_e> create();\n\tstd::shared_ptr<node_type_e> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::bool_t is_valid() const;\n\tstd::string to_string() const;\n\tstd::string to_string_value() const;\n\tstd::string to_string_value_full() const;\n\t\n\tvoid from_string(const std::string& str);\n\tvoid from_string_value(const std::string& name);\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const node_type_e& _value);\n\tfriend std::istream& operator>>(std::istream& _in, node_type_e& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid node_type_e::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<node_type_e>(1);\n\t_visitor.type_field(\"value\", 0); _visitor.accept(value);\n\t_visitor.template type_end<node_type_e>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::node_type_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid write(TypeOutput& out, const ::mmx::node_type_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::node_type_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::node_type_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::node_type_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::node_type_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::node_type_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::node_type_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstruct is_equivalent<::mmx::node_type_e> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_node_type_e_HXX_\n"
  },
  {
    "path": "generated/include/mmx/offer_data_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_offer_data_t_HXX_\n#define INCLUDE_mmx_offer_data_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT offer_data_t : vnx::struct_t {\n\t\n\t\n\tuint32_t height = 0;\n\tuint32_t last_update = 0;\n\tint64_t time_stamp = 0;\n\t::mmx::addr_t owner;\n\t::mmx::addr_t address;\n\tvnx::optional<::mmx::addr_t> partner;\n\t::mmx::addr_t bid_currency;\n\t::mmx::addr_t ask_currency;\n\t::mmx::uint128 bid_balance;\n\t::mmx::uint128 ask_balance;\n\t::mmx::uint128 ask_amount;\n\t::mmx::uint128 inv_price;\n\tvnx::float64_t price = 0;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc97a08a709a5f1efull;\n\t\n\toffer_data_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tvnx::bool_t is_scam() const;\n\tvnx::bool_t is_open() const;\n\tvnx::float64_t get_price() const;\n\t::mmx::uint128 get_bid_amount(const ::mmx::uint128& ask_amount = ::mmx::uint128()) const;\n\t::mmx::uint128 get_ask_amount(const ::mmx::uint128& bid_amount = ::mmx::uint128()) const;\n\t\n\tstatic std::shared_ptr<offer_data_t> create();\n\tstd::shared_ptr<offer_data_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const offer_data_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, offer_data_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid offer_data_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<offer_data_t>(13);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.type_field(\"last_update\", 1); _visitor.accept(last_update);\n\t_visitor.type_field(\"time_stamp\", 2); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"owner\", 3); _visitor.accept(owner);\n\t_visitor.type_field(\"address\", 4); _visitor.accept(address);\n\t_visitor.type_field(\"partner\", 5); _visitor.accept(partner);\n\t_visitor.type_field(\"bid_currency\", 6); _visitor.accept(bid_currency);\n\t_visitor.type_field(\"ask_currency\", 7); _visitor.accept(ask_currency);\n\t_visitor.type_field(\"bid_balance\", 8); _visitor.accept(bid_balance);\n\t_visitor.type_field(\"ask_balance\", 9); _visitor.accept(ask_balance);\n\t_visitor.type_field(\"ask_amount\", 10); _visitor.accept(ask_amount);\n\t_visitor.type_field(\"inv_price\", 11); _visitor.accept(inv_price);\n\t_visitor.type_field(\"price\", 12); _visitor.accept(price);\n\t_visitor.template type_end<offer_data_t>(13);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::offer_data_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_offer_data_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/package.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_PACKAGE_HXX_\n#define INCLUDE_mmx_PACKAGE_HXX_\n\n#include <vnx/Type.h>\n\n#include <mmx/vm/package.hxx>\n#include <vnx/package.hxx>\n#include <vnx/addons/package.hxx>\n\n#ifdef MMX_EXPORT_ENABLE\n#include <mmx_export.h>\n#else\n#ifndef MMX_EXPORT\n#define MMX_EXPORT\n#endif\n#endif\n\n\nnamespace mmx {\n\nvoid register_all_types();\n\n\nclass Block;\nclass BlockHeader;\nclass ChainParams;\nclass Challenge;\nclass Contract;\nclass FarmInfo;\nclass FarmerBase;\nclass Farmer_get_farm_info;\nclass Farmer_get_farm_info_return;\nclass Farmer_get_farmer_keys;\nclass Farmer_get_farmer_keys_return;\nclass Farmer_get_mac_addr;\nclass Farmer_get_mac_addr_return;\nclass Farmer_get_partial_diff;\nclass Farmer_get_partial_diff_return;\nclass Farmer_get_partial_diffs;\nclass Farmer_get_partial_diffs_return;\nclass Farmer_sign_block;\nclass Farmer_sign_block_return;\nclass Farmer_sign_vote;\nclass Farmer_sign_vote_return;\nclass HarvesterBase;\nclass Harvester_add_plot_dir;\nclass Harvester_add_plot_dir_return;\nclass Harvester_get_farm_info;\nclass Harvester_get_farm_info_return;\nclass Harvester_get_total_bytes;\nclass Harvester_get_total_bytes_return;\nclass Harvester_reload;\nclass Harvester_reload_return;\nclass Harvester_rem_plot_dir;\nclass Harvester_rem_plot_dir_return;\nclass IntervalRequest;\nclass KeyFile;\nclass LookupInfo;\nclass NetworkInfo;\nclass NodeBase;\nclass Node_add_block;\nclass Node_add_block_return;\nclass Node_add_transaction;\nclass Node_add_transaction_return;\nclass Node_call_contract;\nclass Node_call_contract_return;\nclass Node_dump_storage;\nclass Node_dump_storage_return;\nclass Node_fetch_offers;\nclass Node_fetch_offers_return;\nclass Node_get_all_balances;\nclass Node_get_all_balances_return;\nclass Node_get_balance;\nclass Node_get_balance_return;\nclass Node_get_balances;\nclass Node_get_balances_return;\nclass Node_get_block;\nclass Node_get_block_return;\nclass Node_get_block_at;\nclass Node_get_block_at_return;\nclass Node_get_block_hash;\nclass Node_get_block_hash_return;\nclass Node_get_block_hash_ex;\nclass Node_get_block_hash_ex_return;\nclass Node_get_contract;\nclass Node_get_contract_return;\nclass Node_get_contract_balances;\nclass Node_get_contract_balances_return;\nclass Node_get_contract_for;\nclass Node_get_contract_for_return;\nclass Node_get_contracts;\nclass Node_get_contracts_return;\nclass Node_get_contracts_by;\nclass Node_get_contracts_by_return;\nclass Node_get_contracts_owned_by;\nclass Node_get_contracts_owned_by_return;\nclass Node_get_exec_history;\nclass Node_get_exec_history_return;\nclass Node_get_farmed_block_summary;\nclass Node_get_farmed_block_summary_return;\nclass Node_get_farmed_blocks;\nclass Node_get_farmed_blocks_return;\nclass Node_get_farmer_ranking;\nclass Node_get_farmer_ranking_return;\nclass Node_get_genesis_hash;\nclass Node_get_genesis_hash_return;\nclass Node_get_header;\nclass Node_get_header_return;\nclass Node_get_header_at;\nclass Node_get_header_at_return;\nclass Node_get_height;\nclass Node_get_height_return;\nclass Node_get_history;\nclass Node_get_history_return;\nclass Node_get_history_memo;\nclass Node_get_history_memo_return;\nclass Node_get_network_info;\nclass Node_get_network_info_return;\nclass Node_get_offer;\nclass Node_get_offer_return;\nclass Node_get_offers;\nclass Node_get_offers_return;\nclass Node_get_offers_by;\nclass Node_get_offers_by_return;\nclass Node_get_params;\nclass Node_get_params_return;\nclass Node_get_plot_nft_info;\nclass Node_get_plot_nft_info_return;\nclass Node_get_plot_nft_target;\nclass Node_get_plot_nft_target_return;\nclass Node_get_recent_offers;\nclass Node_get_recent_offers_return;\nclass Node_get_recent_offers_for;\nclass Node_get_recent_offers_for_return;\nclass Node_get_swap_equivalent_liquidity;\nclass Node_get_swap_equivalent_liquidity_return;\nclass Node_get_swap_fees_earned;\nclass Node_get_swap_fees_earned_return;\nclass Node_get_swap_history;\nclass Node_get_swap_history_return;\nclass Node_get_swap_info;\nclass Node_get_swap_info_return;\nclass Node_get_swap_liquidity_by;\nclass Node_get_swap_liquidity_by_return;\nclass Node_get_swap_trade_estimate;\nclass Node_get_swap_trade_estimate_return;\nclass Node_get_swap_user_info;\nclass Node_get_swap_user_info_return;\nclass Node_get_swaps;\nclass Node_get_swaps_return;\nclass Node_get_synced_height;\nclass Node_get_synced_height_return;\nclass Node_get_synced_vdf_height;\nclass Node_get_synced_vdf_height_return;\nclass Node_get_total_balance;\nclass Node_get_total_balance_return;\nclass Node_get_total_balances;\nclass Node_get_total_balances_return;\nclass Node_get_total_supply;\nclass Node_get_total_supply_return;\nclass Node_get_trade_history;\nclass Node_get_trade_history_return;\nclass Node_get_trade_history_for;\nclass Node_get_trade_history_for_return;\nclass Node_get_transaction;\nclass Node_get_transaction_return;\nclass Node_get_transactions;\nclass Node_get_transactions_return;\nclass Node_get_tx_height;\nclass Node_get_tx_height_return;\nclass Node_get_tx_ids;\nclass Node_get_tx_ids_return;\nclass Node_get_tx_ids_at;\nclass Node_get_tx_ids_at_return;\nclass Node_get_tx_ids_since;\nclass Node_get_tx_ids_since_return;\nclass Node_get_tx_info;\nclass Node_get_tx_info_return;\nclass Node_get_tx_info_for;\nclass Node_get_tx_info_for_return;\nclass Node_get_vdf_height;\nclass Node_get_vdf_height_return;\nclass Node_get_vdf_peak;\nclass Node_get_vdf_peak_return;\nclass Node_read_storage;\nclass Node_read_storage_return;\nclass Node_read_storage_array;\nclass Node_read_storage_array_return;\nclass Node_read_storage_entry_addr;\nclass Node_read_storage_entry_addr_return;\nclass Node_read_storage_entry_string;\nclass Node_read_storage_entry_string_return;\nclass Node_read_storage_entry_var;\nclass Node_read_storage_entry_var_return;\nclass Node_read_storage_field;\nclass Node_read_storage_field_return;\nclass Node_read_storage_map;\nclass Node_read_storage_map_return;\nclass Node_read_storage_object;\nclass Node_read_storage_object_return;\nclass Node_read_storage_var;\nclass Node_read_storage_var_return;\nclass Node_revert_sync;\nclass Node_revert_sync_return;\nclass Node_start_sync;\nclass Node_start_sync_return;\nclass Node_validate;\nclass Node_validate_return;\nclass Node_verify_partial;\nclass Node_verify_partial_return;\nclass Node_verify_plot_nft_target;\nclass Node_verify_plot_nft_target_return;\nclass Operation;\nclass Partial;\nclass PeerInfo;\nclass PlotHeader;\nclass ProofOfSpace;\nclass ProofOfSpaceNFT;\nclass ProofOfSpaceOG;\nclass ProofOfTime;\nclass ProofResponse;\nclass ProofServerBase;\nclass ProofServer_compute;\nclass ProofServer_compute_return;\nclass ReceiveNote;\nclass Request;\nclass Return;\nclass RouterBase;\nclass Router_discover;\nclass Router_discover_return;\nclass Router_fetch_block;\nclass Router_fetch_block_return;\nclass Router_fetch_block_at;\nclass Router_fetch_block_at_return;\nclass Router_get_blocks_at;\nclass Router_get_blocks_at_return;\nclass Router_get_connected_peers;\nclass Router_get_connected_peers_return;\nclass Router_get_id;\nclass Router_get_id_return;\nclass Router_get_info;\nclass Router_get_info_return;\nclass Router_get_known_peers;\nclass Router_get_known_peers_return;\nclass Router_get_peer_info;\nclass Router_get_peer_info_return;\nclass Router_get_peers;\nclass Router_get_peers_return;\nclass Router_kick_peer;\nclass Router_kick_peer_return;\nclass Router_sign_msg;\nclass Router_sign_msg_return;\nclass Solution;\nclass TimeLordBase;\nclass TimeLord_stop_vdf;\nclass TimeLord_stop_vdf_return;\nclass Transaction;\nclass TransactionBase;\nclass VDF_Point;\nclass ValidatorVote;\nclass WalletBase;\nclass Wallet_accept_offer;\nclass Wallet_accept_offer_return;\nclass Wallet_add_account;\nclass Wallet_add_account_return;\nclass Wallet_add_token;\nclass Wallet_add_token_return;\nclass Wallet_cancel_offer;\nclass Wallet_cancel_offer_return;\nclass Wallet_complete;\nclass Wallet_complete_return;\nclass Wallet_create_account;\nclass Wallet_create_account_return;\nclass Wallet_create_wallet;\nclass Wallet_create_wallet_return;\nclass Wallet_deploy;\nclass Wallet_deploy_return;\nclass Wallet_deposit;\nclass Wallet_deposit_return;\nclass Wallet_execute;\nclass Wallet_execute_return;\nclass Wallet_export_wallet;\nclass Wallet_export_wallet_return;\nclass Wallet_find_wallet_by_addr;\nclass Wallet_find_wallet_by_addr_return;\nclass Wallet_gather_inputs_for;\nclass Wallet_gather_inputs_for_return;\nclass Wallet_get_account;\nclass Wallet_get_account_return;\nclass Wallet_get_address;\nclass Wallet_get_address_return;\nclass Wallet_get_all_accounts;\nclass Wallet_get_all_accounts_return;\nclass Wallet_get_all_addresses;\nclass Wallet_get_all_addresses_return;\nclass Wallet_get_all_farmer_keys;\nclass Wallet_get_all_farmer_keys_return;\nclass Wallet_get_balance;\nclass Wallet_get_balance_return;\nclass Wallet_get_balances;\nclass Wallet_get_balances_return;\nclass Wallet_get_contract_balances;\nclass Wallet_get_contract_balances_return;\nclass Wallet_get_contracts;\nclass Wallet_get_contracts_return;\nclass Wallet_get_contracts_owned;\nclass Wallet_get_contracts_owned_return;\nclass Wallet_get_farmer_keys;\nclass Wallet_get_farmer_keys_return;\nclass Wallet_get_history;\nclass Wallet_get_history_return;\nclass Wallet_get_master_seed;\nclass Wallet_get_master_seed_return;\nclass Wallet_get_mnemonic_seed;\nclass Wallet_get_mnemonic_seed_return;\nclass Wallet_get_mnemonic_wordlist;\nclass Wallet_get_mnemonic_wordlist_return;\nclass Wallet_get_offers;\nclass Wallet_get_offers_return;\nclass Wallet_get_swap_liquidity;\nclass Wallet_get_swap_liquidity_return;\nclass Wallet_get_token_list;\nclass Wallet_get_token_list_return;\nclass Wallet_get_total_balances;\nclass Wallet_get_total_balances_return;\nclass Wallet_get_tx_log;\nclass Wallet_get_tx_log_return;\nclass Wallet_import_wallet;\nclass Wallet_import_wallet_return;\nclass Wallet_is_locked;\nclass Wallet_is_locked_return;\nclass Wallet_lock;\nclass Wallet_lock_return;\nclass Wallet_make_offer;\nclass Wallet_make_offer_return;\nclass Wallet_mark_spent;\nclass Wallet_mark_spent_return;\nclass Wallet_offer_trade;\nclass Wallet_offer_trade_return;\nclass Wallet_offer_withdraw;\nclass Wallet_offer_withdraw_return;\nclass Wallet_plotnft_create;\nclass Wallet_plotnft_create_return;\nclass Wallet_plotnft_exec;\nclass Wallet_plotnft_exec_return;\nclass Wallet_release;\nclass Wallet_release_return;\nclass Wallet_release_all;\nclass Wallet_release_all_return;\nclass Wallet_rem_token;\nclass Wallet_rem_token_return;\nclass Wallet_remove_account;\nclass Wallet_remove_account_return;\nclass Wallet_reserve;\nclass Wallet_reserve_return;\nclass Wallet_reset_cache;\nclass Wallet_reset_cache_return;\nclass Wallet_send;\nclass Wallet_send_return;\nclass Wallet_send_from;\nclass Wallet_send_from_return;\nclass Wallet_send_many;\nclass Wallet_send_many_return;\nclass Wallet_send_off;\nclass Wallet_send_off_return;\nclass Wallet_set_address_count;\nclass Wallet_set_address_count_return;\nclass Wallet_sign_msg;\nclass Wallet_sign_msg_return;\nclass Wallet_sign_off;\nclass Wallet_sign_off_return;\nclass Wallet_swap_add_liquid;\nclass Wallet_swap_add_liquid_return;\nclass Wallet_swap_rem_liquid;\nclass Wallet_swap_rem_liquid_return;\nclass Wallet_swap_trade;\nclass Wallet_swap_trade_return;\nclass Wallet_unlock;\nclass Wallet_unlock_return;\nclass Wallet_update_cache;\nclass Wallet_update_cache_return;\nclass WalletFile;\nclass WebAPIBase;\nclass WebAPI_shutdown;\nclass WebAPI_shutdown_return;\nstruct account_info_t;\nstruct account_t;\nclass addr_t;\nstruct balance_t;\nstruct block_index_t;\nstruct compile_flags_t;\nstruct error_code_e;\nstruct exec_entry_t;\nstruct exec_error_t;\nstruct exec_result_t;\nstruct farmed_block_info_t;\nstruct farmed_block_summary_t;\nclass fixed128;\nclass hash_512_t;\nclass hash_t;\nstruct node_info_t;\nstruct node_type_e;\nstruct offer_data_t;\nstruct peer_info_t;\nstruct permission_e;\nstruct plot_nft_info_t;\nstruct pooling_error_e;\nstruct pooling_info_t;\nstruct pooling_stats_t;\nclass pubkey_t;\nstruct query_filter_t;\nclass signature_t;\nclass skey_t;\nstruct spend_options_t;\nstruct swap_entry_t;\nstruct swap_info_t;\nstruct swap_pool_info_t;\nstruct swap_user_info_t;\nstruct table_entry_t;\nstruct trade_entry_t;\nstruct trade_log_t;\nstruct tx_entry_t;\nstruct tx_index_t;\nclass tx_info_t;\nstruct tx_log_entry_t;\nstruct tx_note_e;\nstruct tx_type_e;\nstruct txin_t;\nstruct txio_entry_t;\nstruct txio_t;\nstruct txout_t;\nclass uint128;\nstruct uint_fraction_t;\nstruct ulong_fraction_t;\nstruct virtual_plot_info_t;\n\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Block; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_BlockHeader; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ChainParams; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Challenge; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Contract; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_FarmInfo; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_FarmerBase; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_get_farm_info; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_get_farm_info_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_get_farmer_keys; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_get_farmer_keys_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_get_mac_addr; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_get_mac_addr_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_get_partial_diff; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_get_partial_diff_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_get_partial_diffs; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_get_partial_diffs_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_sign_block; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_sign_block_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_sign_vote; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Farmer_sign_vote_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_HarvesterBase; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Harvester_add_plot_dir; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Harvester_add_plot_dir_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Harvester_get_farm_info; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Harvester_get_farm_info_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Harvester_get_total_bytes; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Harvester_get_total_bytes_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Harvester_reload; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Harvester_reload_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Harvester_rem_plot_dir; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Harvester_rem_plot_dir_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_IntervalRequest; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_KeyFile; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_LookupInfo; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_NetworkInfo; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_NodeBase; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_add_block; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_add_block_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_add_transaction; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_add_transaction_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_call_contract; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_call_contract_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_dump_storage; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_dump_storage_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_fetch_offers; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_fetch_offers_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_all_balances; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_all_balances_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_balance; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_balance_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_balances; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_balances_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_block; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_block_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_block_at; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_block_at_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_block_hash; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_block_hash_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_block_hash_ex; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_block_hash_ex_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contract; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contract_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contract_balances; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contract_balances_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contract_for; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contract_for_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contracts; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contracts_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contracts_by; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contracts_by_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contracts_owned_by; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_contracts_owned_by_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_exec_history; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_exec_history_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_farmed_block_summary; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_farmed_block_summary_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_farmed_blocks; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_farmed_blocks_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_farmer_ranking; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_farmer_ranking_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_genesis_hash; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_genesis_hash_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_header; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_header_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_header_at; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_header_at_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_height; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_height_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_history; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_history_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_history_memo; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_history_memo_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_network_info; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_network_info_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_offer; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_offer_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_offers; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_offers_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_offers_by; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_offers_by_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_params; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_params_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_plot_nft_info; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_plot_nft_info_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_plot_nft_target; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_plot_nft_target_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_recent_offers; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_recent_offers_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_recent_offers_for; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_recent_offers_for_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_equivalent_liquidity; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_equivalent_liquidity_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_fees_earned; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_fees_earned_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_history; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_history_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_info; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_info_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_liquidity_by; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_liquidity_by_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_trade_estimate; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_trade_estimate_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_user_info; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swap_user_info_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swaps; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_swaps_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_synced_height; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_synced_height_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_synced_vdf_height; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_synced_vdf_height_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_total_balance; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_total_balance_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_total_balances; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_total_balances_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_total_supply; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_total_supply_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_trade_history; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_trade_history_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_trade_history_for; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_trade_history_for_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_transaction; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_transaction_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_transactions; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_transactions_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_height; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_height_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids_at; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids_at_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids_since; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids_since_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_info; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_info_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_info_for; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_tx_info_for_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_vdf_height; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_vdf_height_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_vdf_peak; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_get_vdf_peak_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_array; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_array_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_addr; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_addr_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_string; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_string_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_var; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_var_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_field; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_field_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_map; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_map_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_object; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_object_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_var; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_read_storage_var_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_revert_sync; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_revert_sync_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_start_sync; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_start_sync_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_validate; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_validate_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_verify_partial; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_verify_partial_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_verify_plot_nft_target; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Node_verify_plot_nft_target_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Operation; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Partial; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_PeerInfo; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_PlotHeader; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ProofOfSpace; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ProofOfSpaceNFT; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ProofOfSpaceOG; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ProofOfTime; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ProofResponse; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ProofServerBase; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ProofServer_compute; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ProofServer_compute_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ReceiveNote; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Request; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_RouterBase; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_discover; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_discover_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_fetch_block; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_fetch_block_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_fetch_block_at; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_fetch_block_at_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_blocks_at; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_blocks_at_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_connected_peers; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_connected_peers_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_id; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_id_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_info; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_info_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_known_peers; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_known_peers_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_peer_info; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_peer_info_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_peers; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_get_peers_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_kick_peer; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_kick_peer_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_sign_msg; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Router_sign_msg_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Solution; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_TimeLordBase; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_TimeLord_stop_vdf; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_TimeLord_stop_vdf_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Transaction; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_TransactionBase; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_VDF_Point; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ValidatorVote; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_WalletBase; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_accept_offer; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_accept_offer_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_add_account; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_add_account_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_add_token; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_add_token_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_cancel_offer; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_cancel_offer_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_complete; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_complete_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_create_account; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_create_account_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_create_wallet; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_create_wallet_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_deploy; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_deploy_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_deposit; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_deposit_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_execute; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_execute_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_export_wallet; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_export_wallet_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_find_wallet_by_addr; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_find_wallet_by_addr_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_gather_inputs_for; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_gather_inputs_for_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_account; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_account_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_address; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_address_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_accounts; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_accounts_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_addresses; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_addresses_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_farmer_keys; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_farmer_keys_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_balance; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_balance_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_balances; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_balances_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_contract_balances; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_contract_balances_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_contracts; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_contracts_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_contracts_owned; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_contracts_owned_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_farmer_keys; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_farmer_keys_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_history; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_history_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_master_seed; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_master_seed_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_mnemonic_seed; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_mnemonic_seed_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_mnemonic_wordlist; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_mnemonic_wordlist_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_offers; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_offers_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_swap_liquidity; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_swap_liquidity_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_token_list; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_token_list_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_total_balances; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_total_balances_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_tx_log; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_get_tx_log_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_import_wallet; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_import_wallet_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_is_locked; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_is_locked_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_lock; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_lock_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_make_offer; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_make_offer_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_mark_spent; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_mark_spent_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_offer_trade; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_offer_trade_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_offer_withdraw; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_offer_withdraw_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_plotnft_create; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_plotnft_create_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_plotnft_exec; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_plotnft_exec_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_release; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_release_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_release_all; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_release_all_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_rem_token; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_rem_token_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_remove_account; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_remove_account_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_reserve; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_reserve_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_reset_cache; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_reset_cache_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_send; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_send_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_send_from; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_send_from_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_send_many; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_send_many_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_send_off; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_send_off_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_set_address_count; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_set_address_count_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_sign_msg; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_sign_msg_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_sign_off; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_sign_off_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_swap_add_liquid; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_swap_add_liquid_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_swap_rem_liquid; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_swap_rem_liquid_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_swap_trade; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_swap_trade_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_unlock; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_unlock_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_update_cache; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Wallet_update_cache_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_WalletFile; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_WebAPIBase; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_WebAPI_shutdown; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_WebAPI_shutdown_return; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_account_info_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_account_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_balance_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_block_index_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_compile_flags_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_error_code_e; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_exec_entry_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_exec_error_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_exec_result_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_farmed_block_info_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_farmed_block_summary_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_node_info_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_node_type_e; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_offer_data_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_peer_info_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_permission_e; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_plot_nft_info_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_pooling_error_e; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_pooling_info_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_pooling_stats_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_query_filter_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_spend_options_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_swap_entry_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_swap_info_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_swap_pool_info_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_swap_user_info_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_table_entry_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_trade_entry_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_trade_log_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_tx_entry_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_tx_index_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_tx_info_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_tx_log_entry_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_tx_note_e; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_tx_type_e; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_txin_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_txio_entry_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_txio_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_txout_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_uint_fraction_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_ulong_fraction_t; ///< \\private\nMMX_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_virtual_plot_info_t; ///< \\private\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Block& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::BlockHeader& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ChainParams& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Challenge& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Contract& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::FarmInfo& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::FarmerBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_get_farm_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_get_mac_addr& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_get_mac_addr_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diff& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diff_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diffs& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diffs_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_sign_block& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_sign_block_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_sign_vote& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Farmer_sign_vote_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::HarvesterBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Harvester_add_plot_dir& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Harvester_add_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Harvester_get_farm_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Harvester_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Harvester_get_total_bytes& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Harvester_get_total_bytes_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Harvester_reload& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Harvester_reload_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Harvester_rem_plot_dir& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Harvester_rem_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::IntervalRequest& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::KeyFile& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::LookupInfo& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::NetworkInfo& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::NodeBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_add_block& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_add_block_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_add_transaction& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_add_transaction_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_call_contract& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_call_contract_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_dump_storage& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_dump_storage_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_fetch_offers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_fetch_offers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_all_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_all_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_balance& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_balance_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_block& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_block_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_block_at& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_block_at_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_block_hash& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_block_hash_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_block_hash_ex& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_block_hash_ex_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contract& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contract_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contract_for& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contract_for_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contracts& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contracts_by& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contracts_by_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contracts_owned_by& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_contracts_owned_by_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_exec_history& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_exec_history_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_farmed_block_summary& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_farmed_block_summary_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_farmed_blocks& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_farmed_blocks_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_farmer_ranking& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_farmer_ranking_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_genesis_hash& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_genesis_hash_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_header& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_header_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_header_at& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_header_at_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_height& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_height_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_history& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_history_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_history_memo& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_history_memo_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_network_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_network_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_offer& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_offer_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_offers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_offers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_offers_by& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_offers_by_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_params& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_params_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_recent_offers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_recent_offers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_recent_offers_for& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_recent_offers_for_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_equivalent_liquidity& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_equivalent_liquidity_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_fees_earned& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_fees_earned_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_history& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_history_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_liquidity_by& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_liquidity_by_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_trade_estimate& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_trade_estimate_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_user_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swap_user_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swaps& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_swaps_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_synced_height& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_synced_height_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_synced_vdf_height& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_synced_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_total_balance& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_total_balance_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_total_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_total_supply& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_total_supply_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_trade_history& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_trade_history_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_trade_history_for& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_trade_history_for_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_transaction& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_transaction_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_transactions& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_transactions_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_height& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_height_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_at& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_at_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_since& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_since_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_info_for& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_tx_info_for_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_vdf_height& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_vdf_peak& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_get_vdf_peak_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_array& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_array_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_addr& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_addr_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_string& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_string_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_var& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_var_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_field& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_field_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_map& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_map_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_object& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_object_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_var& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_read_storage_var_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_revert_sync& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_revert_sync_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_start_sync& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_start_sync_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_validate& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_validate_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_verify_partial& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_verify_partial_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_verify_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Node_verify_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Operation& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Partial& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::PeerInfo& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::PlotHeader& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ProofOfSpace& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ProofOfSpaceNFT& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ProofOfSpaceOG& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ProofOfTime& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ProofResponse& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ProofServerBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ProofServer_compute& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ProofServer_compute_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ReceiveNote& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Request& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::RouterBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_discover& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_discover_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_fetch_block& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_fetch_block_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_fetch_block_at& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_fetch_block_at_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_blocks_at& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_blocks_at_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_connected_peers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_connected_peers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_id& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_id_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_known_peers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_known_peers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_peer_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_peer_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_peers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_get_peers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_kick_peer& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_kick_peer_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_sign_msg& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Router_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Solution& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::TimeLordBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::TimeLord_stop_vdf& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::TimeLord_stop_vdf_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Transaction& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::TransactionBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::VDF_Point& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ValidatorVote& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::WalletBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_accept_offer& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_accept_offer_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_add_account& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_add_account_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_add_token& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_add_token_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_cancel_offer& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_cancel_offer_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_complete& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_complete_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_create_account& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_create_account_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_create_wallet& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_create_wallet_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_deploy& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_deploy_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_deposit& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_deposit_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_execute& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_execute_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_export_wallet& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_export_wallet_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_find_wallet_by_addr& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_find_wallet_by_addr_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_gather_inputs_for& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_gather_inputs_for_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_account& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_account_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_address& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_address_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_accounts& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_accounts_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_addresses& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_addresses_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_farmer_keys& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_balance& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_balance_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_contracts& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_contracts_owned& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_contracts_owned_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_history& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_history_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_master_seed& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_master_seed_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_seed& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_seed_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_wordlist& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_wordlist_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_offers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_offers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_swap_liquidity& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_swap_liquidity_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_token_list& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_token_list_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_total_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_tx_log& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_get_tx_log_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_import_wallet& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_import_wallet_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_is_locked& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_is_locked_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_lock& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_lock_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_make_offer& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_make_offer_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_mark_spent& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_mark_spent_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_offer_trade& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_offer_trade_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_offer_withdraw& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_offer_withdraw_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_plotnft_create& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_plotnft_create_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_plotnft_exec& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_plotnft_exec_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_release& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_release_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_release_all& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_release_all_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_rem_token& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_rem_token_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_remove_account& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_remove_account_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_reserve& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_reserve_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_reset_cache& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_reset_cache_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_send& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_send_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_send_from& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_send_from_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_send_many& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_send_many_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_send_off& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_send_off_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_set_address_count& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_set_address_count_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_sign_msg& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_sign_off& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_sign_off_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_swap_add_liquid& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_swap_add_liquid_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_swap_rem_liquid& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_swap_rem_liquid_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_swap_trade& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_swap_trade_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_unlock& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_unlock_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_update_cache& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::Wallet_update_cache_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::WalletFile& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::WebAPIBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::WebAPI_shutdown& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::WebAPI_shutdown_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::account_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::account_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::addr_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::balance_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::block_index_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::compile_flags_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::error_code_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::exec_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::exec_error_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::exec_result_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::farmed_block_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::farmed_block_summary_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::fixed128& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::hash_512_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::hash_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::node_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::node_type_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::offer_data_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::peer_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::permission_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::plot_nft_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::pooling_error_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::pooling_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::pooling_stats_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::pubkey_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::query_filter_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::signature_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::skey_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::spend_options_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::swap_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::swap_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::swap_pool_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::swap_user_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::table_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::trade_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::trade_log_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::tx_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::tx_index_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::tx_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::tx_log_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::tx_note_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::tx_type_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::txin_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::txio_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::txio_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::txout_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::uint128& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::uint_fraction_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::ulong_fraction_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::virtual_plot_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid write(TypeOutput& out, const ::mmx::Block& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::BlockHeader& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ChainParams& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Challenge& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Contract& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::FarmInfo& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::FarmerBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_farm_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_mac_addr& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_mac_addr_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diff& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diff_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diffs& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diffs_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_sign_block& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_sign_block_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_sign_vote& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Farmer_sign_vote_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::HarvesterBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Harvester_add_plot_dir& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Harvester_add_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Harvester_get_farm_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Harvester_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Harvester_get_total_bytes& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Harvester_get_total_bytes_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Harvester_reload& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Harvester_reload_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Harvester_rem_plot_dir& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Harvester_rem_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::IntervalRequest& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::KeyFile& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::LookupInfo& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::NetworkInfo& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::NodeBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_add_block& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_add_block_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_add_transaction& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_add_transaction_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_call_contract& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_call_contract_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_dump_storage& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_dump_storage_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_fetch_offers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_fetch_offers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_all_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_all_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_balance& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_balance_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_block& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_at& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_at_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash_ex& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash_ex_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract_for& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract_for_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_by& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_by_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_owned_by& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_owned_by_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_exec_history& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_exec_history_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_block_summary& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_block_summary_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_blocks& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_blocks_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmer_ranking& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmer_ranking_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_genesis_hash& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_genesis_hash_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_header& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_header_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_header_at& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_header_at_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_height& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_height_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_history& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_history_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_history_memo& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_history_memo_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_network_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_network_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_offer& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_offer_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_offers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_offers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_offers_by& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_offers_by_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_params& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_params_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers_for& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers_for_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_equivalent_liquidity& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_equivalent_liquidity_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_fees_earned& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_fees_earned_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_history& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_history_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_liquidity_by& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_liquidity_by_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_trade_estimate& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_trade_estimate_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_user_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_user_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swaps& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_swaps_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_synced_height& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_synced_height_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_synced_vdf_height& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_synced_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_balance& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_balance_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_supply& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_supply_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history_for& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history_for_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_transaction& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_transaction_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_transactions& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_transactions_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_height& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_height_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_at& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_at_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_since& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_since_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info_for& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info_for_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_height& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_peak& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_peak_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_array& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_array_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_addr& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_addr_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_string& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_string_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_var& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_var_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_field& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_field_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_map& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_map_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_object& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_object_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_var& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_var_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_revert_sync& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_revert_sync_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_start_sync& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_start_sync_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_validate& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_validate_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_verify_partial& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_verify_partial_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_verify_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Node_verify_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Operation& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Partial& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::PeerInfo& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::PlotHeader& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ProofOfSpace& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ProofOfSpaceNFT& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ProofOfSpaceOG& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ProofOfTime& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ProofResponse& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ProofServerBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ProofServer_compute& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ProofServer_compute_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ReceiveNote& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Request& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::RouterBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_discover& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_discover_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_fetch_block& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_fetch_block_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_fetch_block_at& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_fetch_block_at_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_blocks_at& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_blocks_at_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_connected_peers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_connected_peers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_id& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_id_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_known_peers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_known_peers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_peer_info& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_peer_info_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_peers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_get_peers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_kick_peer& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_kick_peer_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_sign_msg& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Router_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Solution& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::TimeLordBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::TimeLord_stop_vdf& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::TimeLord_stop_vdf_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Transaction& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::TransactionBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::VDF_Point& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ValidatorVote& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::WalletBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_accept_offer& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_accept_offer_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_add_account& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_add_account_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_add_token& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_add_token_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_cancel_offer& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_cancel_offer_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_complete& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_complete_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_create_account& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_create_account_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_create_wallet& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_create_wallet_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_deploy& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_deploy_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_deposit& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_deposit_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_execute& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_execute_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_export_wallet& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_export_wallet_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_find_wallet_by_addr& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_find_wallet_by_addr_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_gather_inputs_for& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_gather_inputs_for_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_account& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_account_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_address& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_address_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_accounts& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_accounts_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_addresses& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_addresses_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_farmer_keys& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_balance& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_balance_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts_owned& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts_owned_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_history& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_history_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_master_seed& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_master_seed_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_seed& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_seed_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_wordlist& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_wordlist_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_offers& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_offers_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_swap_liquidity& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_swap_liquidity_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_token_list& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_token_list_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_total_balances& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_tx_log& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_tx_log_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_import_wallet& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_import_wallet_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_is_locked& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_is_locked_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_lock& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_lock_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_make_offer& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_make_offer_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_mark_spent& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_mark_spent_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_offer_trade& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_offer_trade_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_offer_withdraw& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_offer_withdraw_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_create& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_create_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_exec& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_exec_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_release& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_release_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_release_all& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_release_all_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_rem_token& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_rem_token_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_remove_account& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_remove_account_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_reserve& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_reserve_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_reset_cache& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_reset_cache_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_send& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_from& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_from_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_many& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_many_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_off& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_off_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_set_address_count& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_set_address_count_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_sign_msg& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_sign_off& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_sign_off_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_add_liquid& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_add_liquid_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_rem_liquid& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_rem_liquid_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_trade& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_trade_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_unlock& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_unlock_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_update_cache& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::Wallet_update_cache_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::WalletFile& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::WebAPIBase& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::WebAPI_shutdown& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::WebAPI_shutdown_return& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::account_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::account_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::addr_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::balance_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::block_index_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::compile_flags_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::error_code_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::exec_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::exec_error_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::exec_result_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::farmed_block_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::farmed_block_summary_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::fixed128& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::hash_512_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::hash_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::node_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::node_type_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::offer_data_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::peer_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::permission_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::plot_nft_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::pooling_error_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::pooling_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::pooling_stats_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::pubkey_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::query_filter_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::signature_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::skey_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::spend_options_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::swap_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::swap_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::swap_pool_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::swap_user_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::table_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::trade_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::trade_log_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::tx_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::tx_index_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::tx_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::tx_log_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::tx_note_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::tx_type_e& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::txin_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::txio_entry_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::txio_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::txout_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::uint128& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::uint_fraction_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::ulong_fraction_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::virtual_plot_info_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid read(std::istream& in, ::mmx::Block& value); ///< \\private\nvoid read(std::istream& in, ::mmx::BlockHeader& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ChainParams& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Challenge& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Contract& value); ///< \\private\nvoid read(std::istream& in, ::mmx::FarmInfo& value); ///< \\private\nvoid read(std::istream& in, ::mmx::FarmerBase& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_get_farm_info& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_get_farm_info_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_get_farmer_keys& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_get_farmer_keys_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_get_mac_addr& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_get_mac_addr_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_get_partial_diff& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_get_partial_diff_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_get_partial_diffs& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_get_partial_diffs_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_sign_block& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_sign_block_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_sign_vote& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Farmer_sign_vote_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::HarvesterBase& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Harvester_add_plot_dir& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Harvester_add_plot_dir_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Harvester_get_farm_info& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Harvester_get_farm_info_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Harvester_get_total_bytes& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Harvester_get_total_bytes_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Harvester_reload& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Harvester_reload_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Harvester_rem_plot_dir& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Harvester_rem_plot_dir_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::IntervalRequest& value); ///< \\private\nvoid read(std::istream& in, ::mmx::KeyFile& value); ///< \\private\nvoid read(std::istream& in, ::mmx::LookupInfo& value); ///< \\private\nvoid read(std::istream& in, ::mmx::NetworkInfo& value); ///< \\private\nvoid read(std::istream& in, ::mmx::NodeBase& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_add_block& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_add_block_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_add_transaction& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_add_transaction_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_call_contract& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_call_contract_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_dump_storage& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_dump_storage_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_fetch_offers& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_fetch_offers_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_all_balances& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_all_balances_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_balance& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_balance_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_balances& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_balances_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_block& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_block_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_block_at& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_block_at_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_block_hash& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_block_hash_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_block_hash_ex& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_block_hash_ex_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contract& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contract_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contract_balances& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contract_balances_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contract_for& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contract_for_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contracts& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contracts_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contracts_by& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contracts_by_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contracts_owned_by& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_contracts_owned_by_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_exec_history& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_exec_history_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_farmed_block_summary& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_farmed_block_summary_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_farmed_blocks& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_farmed_blocks_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_farmer_ranking& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_farmer_ranking_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_genesis_hash& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_genesis_hash_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_header& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_header_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_header_at& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_header_at_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_height& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_height_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_history& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_history_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_history_memo& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_history_memo_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_network_info& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_network_info_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_offer& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_offer_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_offers& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_offers_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_offers_by& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_offers_by_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_params& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_params_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_plot_nft_info& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_plot_nft_info_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_plot_nft_target& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_plot_nft_target_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_recent_offers& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_recent_offers_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_recent_offers_for& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_recent_offers_for_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_equivalent_liquidity& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_equivalent_liquidity_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_fees_earned& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_fees_earned_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_history& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_history_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_info& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_info_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_liquidity_by& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_liquidity_by_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_trade_estimate& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_trade_estimate_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_user_info& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swap_user_info_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swaps& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_swaps_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_synced_height& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_synced_height_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_synced_vdf_height& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_synced_vdf_height_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_total_balance& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_total_balance_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_total_balances& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_total_balances_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_total_supply& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_total_supply_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_trade_history& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_trade_history_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_trade_history_for& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_trade_history_for_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_transaction& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_transaction_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_transactions& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_transactions_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_height& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_height_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids_at& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids_at_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids_since& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids_since_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_info& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_info_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_info_for& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_tx_info_for_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_vdf_height& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_vdf_height_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_vdf_peak& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_get_vdf_peak_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_array& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_array_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_addr& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_addr_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_string& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_string_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_var& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_var_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_field& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_field_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_map& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_map_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_object& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_object_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_var& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_read_storage_var_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_revert_sync& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_revert_sync_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_start_sync& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_start_sync_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_validate& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_validate_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_verify_partial& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_verify_partial_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_verify_plot_nft_target& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Node_verify_plot_nft_target_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Operation& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Partial& value); ///< \\private\nvoid read(std::istream& in, ::mmx::PeerInfo& value); ///< \\private\nvoid read(std::istream& in, ::mmx::PlotHeader& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ProofOfSpace& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ProofOfSpaceNFT& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ProofOfSpaceOG& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ProofOfTime& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ProofResponse& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ProofServerBase& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ProofServer_compute& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ProofServer_compute_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ReceiveNote& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Request& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::RouterBase& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_discover& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_discover_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_fetch_block& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_fetch_block_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_fetch_block_at& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_fetch_block_at_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_blocks_at& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_blocks_at_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_connected_peers& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_connected_peers_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_id& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_id_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_info& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_info_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_known_peers& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_known_peers_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_peer_info& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_peer_info_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_peers& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_get_peers_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_kick_peer& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_kick_peer_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_sign_msg& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Router_sign_msg_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Solution& value); ///< \\private\nvoid read(std::istream& in, ::mmx::TimeLordBase& value); ///< \\private\nvoid read(std::istream& in, ::mmx::TimeLord_stop_vdf& value); ///< \\private\nvoid read(std::istream& in, ::mmx::TimeLord_stop_vdf_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Transaction& value); ///< \\private\nvoid read(std::istream& in, ::mmx::TransactionBase& value); ///< \\private\nvoid read(std::istream& in, ::mmx::VDF_Point& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ValidatorVote& value); ///< \\private\nvoid read(std::istream& in, ::mmx::WalletBase& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_accept_offer& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_accept_offer_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_add_account& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_add_account_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_add_token& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_add_token_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_cancel_offer& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_cancel_offer_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_complete& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_complete_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_create_account& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_create_account_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_create_wallet& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_create_wallet_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_deploy& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_deploy_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_deposit& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_deposit_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_execute& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_execute_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_export_wallet& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_export_wallet_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_find_wallet_by_addr& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_find_wallet_by_addr_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_gather_inputs_for& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_gather_inputs_for_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_account& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_account_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_address& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_address_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_all_accounts& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_all_accounts_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_all_addresses& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_all_addresses_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_all_farmer_keys& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_all_farmer_keys_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_balance& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_balance_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_balances& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_balances_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_contract_balances& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_contract_balances_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_contracts& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_contracts_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_contracts_owned& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_contracts_owned_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_farmer_keys& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_farmer_keys_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_history& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_history_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_master_seed& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_master_seed_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_seed& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_seed_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_wordlist& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_wordlist_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_offers& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_offers_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_swap_liquidity& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_swap_liquidity_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_token_list& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_token_list_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_total_balances& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_total_balances_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_tx_log& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_get_tx_log_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_import_wallet& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_import_wallet_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_is_locked& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_is_locked_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_lock& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_lock_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_make_offer& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_make_offer_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_mark_spent& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_mark_spent_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_offer_trade& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_offer_trade_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_offer_withdraw& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_offer_withdraw_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_plotnft_create& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_plotnft_create_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_plotnft_exec& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_plotnft_exec_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_release& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_release_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_release_all& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_release_all_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_rem_token& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_rem_token_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_remove_account& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_remove_account_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_reserve& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_reserve_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_reset_cache& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_reset_cache_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_send& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_send_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_send_from& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_send_from_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_send_many& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_send_many_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_send_off& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_send_off_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_set_address_count& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_set_address_count_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_sign_msg& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_sign_msg_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_sign_off& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_sign_off_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_swap_add_liquid& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_swap_add_liquid_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_swap_rem_liquid& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_swap_rem_liquid_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_swap_trade& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_swap_trade_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_unlock& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_unlock_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_update_cache& value); ///< \\private\nvoid read(std::istream& in, ::mmx::Wallet_update_cache_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::WalletFile& value); ///< \\private\nvoid read(std::istream& in, ::mmx::WebAPIBase& value); ///< \\private\nvoid read(std::istream& in, ::mmx::WebAPI_shutdown& value); ///< \\private\nvoid read(std::istream& in, ::mmx::WebAPI_shutdown_return& value); ///< \\private\nvoid read(std::istream& in, ::mmx::account_info_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::account_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::addr_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::balance_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::block_index_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::compile_flags_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::error_code_e& value); ///< \\private\nvoid read(std::istream& in, ::mmx::exec_entry_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::exec_error_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::exec_result_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::farmed_block_info_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::farmed_block_summary_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::fixed128& value); ///< \\private\nvoid read(std::istream& in, ::mmx::hash_512_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::hash_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::node_info_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::node_type_e& value); ///< \\private\nvoid read(std::istream& in, ::mmx::offer_data_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::peer_info_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::permission_e& value); ///< \\private\nvoid read(std::istream& in, ::mmx::plot_nft_info_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::pooling_error_e& value); ///< \\private\nvoid read(std::istream& in, ::mmx::pooling_info_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::pooling_stats_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::pubkey_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::query_filter_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::signature_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::skey_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::spend_options_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::swap_entry_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::swap_info_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::swap_pool_info_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::swap_user_info_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::table_entry_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::trade_entry_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::trade_log_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::tx_entry_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::tx_index_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::tx_info_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::tx_log_entry_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::tx_note_e& value); ///< \\private\nvoid read(std::istream& in, ::mmx::tx_type_e& value); ///< \\private\nvoid read(std::istream& in, ::mmx::txin_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::txio_entry_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::txio_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::txout_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::uint128& value); ///< \\private\nvoid read(std::istream& in, ::mmx::uint_fraction_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::ulong_fraction_t& value); ///< \\private\nvoid read(std::istream& in, ::mmx::virtual_plot_info_t& value); ///< \\private\n\nvoid write(std::ostream& out, const ::mmx::Block& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::BlockHeader& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ChainParams& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Challenge& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Contract& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::FarmInfo& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::FarmerBase& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_get_farm_info& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_get_farm_info_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_get_farmer_keys& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_get_farmer_keys_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_get_mac_addr& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_get_mac_addr_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diff& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diff_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diffs& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diffs_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_sign_block& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_sign_block_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_sign_vote& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Farmer_sign_vote_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::HarvesterBase& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Harvester_add_plot_dir& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Harvester_add_plot_dir_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Harvester_get_farm_info& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Harvester_get_farm_info_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Harvester_get_total_bytes& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Harvester_get_total_bytes_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Harvester_reload& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Harvester_reload_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Harvester_rem_plot_dir& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Harvester_rem_plot_dir_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::IntervalRequest& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::KeyFile& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::LookupInfo& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::NetworkInfo& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::NodeBase& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_add_block& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_add_block_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_add_transaction& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_add_transaction_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_call_contract& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_call_contract_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_dump_storage& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_dump_storage_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_fetch_offers& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_fetch_offers_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_all_balances& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_all_balances_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_balance& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_balance_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_balances& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_balances_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_block& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_block_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_block_at& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_block_at_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_block_hash& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_block_hash_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_block_hash_ex& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_block_hash_ex_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contract& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contract_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contract_balances& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contract_balances_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contract_for& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contract_for_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts_by& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts_by_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts_owned_by& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts_owned_by_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_exec_history& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_exec_history_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_farmed_block_summary& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_farmed_block_summary_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_farmed_blocks& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_farmed_blocks_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_farmer_ranking& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_farmer_ranking_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_genesis_hash& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_genesis_hash_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_header& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_header_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_header_at& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_header_at_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_height& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_height_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_history& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_history_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_history_memo& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_history_memo_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_network_info& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_network_info_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_offer& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_offer_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_offers& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_offers_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_offers_by& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_offers_by_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_params& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_params_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_info& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_info_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_target& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_target_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers_for& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers_for_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_equivalent_liquidity& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_equivalent_liquidity_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_fees_earned& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_fees_earned_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_history& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_history_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_info& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_info_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_liquidity_by& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_liquidity_by_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_trade_estimate& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_trade_estimate_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_user_info& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_user_info_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swaps& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_swaps_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_synced_height& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_synced_height_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_synced_vdf_height& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_synced_vdf_height_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_total_balance& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_total_balance_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_total_balances& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_total_balances_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_total_supply& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_total_supply_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_trade_history& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_trade_history_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_trade_history_for& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_trade_history_for_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_transaction& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_transaction_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_transactions& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_transactions_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_height& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_height_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_at& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_at_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_since& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_since_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_info& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_info_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_info_for& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_info_for_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_vdf_height& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_vdf_height_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_vdf_peak& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_get_vdf_peak_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_array& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_array_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_addr& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_addr_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_string& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_string_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_var& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_var_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_field& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_field_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_map& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_map_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_object& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_object_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_var& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_var_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_revert_sync& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_revert_sync_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_start_sync& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_start_sync_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_validate& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_validate_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_verify_partial& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_verify_partial_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_verify_plot_nft_target& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Node_verify_plot_nft_target_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Operation& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Partial& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::PeerInfo& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::PlotHeader& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ProofOfSpace& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ProofOfSpaceNFT& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ProofOfSpaceOG& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ProofOfTime& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ProofResponse& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ProofServerBase& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ProofServer_compute& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ProofServer_compute_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ReceiveNote& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Request& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::RouterBase& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_discover& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_discover_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_fetch_block& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_fetch_block_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_fetch_block_at& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_fetch_block_at_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_blocks_at& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_blocks_at_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_connected_peers& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_connected_peers_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_id& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_id_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_info& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_info_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_known_peers& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_known_peers_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_peer_info& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_peer_info_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_peers& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_get_peers_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_kick_peer& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_kick_peer_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_sign_msg& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Router_sign_msg_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Solution& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::TimeLordBase& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::TimeLord_stop_vdf& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::TimeLord_stop_vdf_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Transaction& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::TransactionBase& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::VDF_Point& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ValidatorVote& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::WalletBase& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_accept_offer& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_accept_offer_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_add_account& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_add_account_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_add_token& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_add_token_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_cancel_offer& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_cancel_offer_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_complete& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_complete_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_create_account& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_create_account_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_create_wallet& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_create_wallet_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_deploy& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_deploy_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_deposit& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_deposit_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_execute& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_execute_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_export_wallet& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_export_wallet_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_find_wallet_by_addr& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_find_wallet_by_addr_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_gather_inputs_for& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_gather_inputs_for_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_account& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_account_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_address& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_address_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_accounts& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_accounts_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_addresses& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_addresses_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_farmer_keys& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_farmer_keys_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_balance& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_balance_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_balances& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_balances_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contract_balances& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contract_balances_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts_owned& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts_owned_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_farmer_keys& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_farmer_keys_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_history& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_history_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_master_seed& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_master_seed_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_seed& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_seed_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_wordlist& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_wordlist_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_offers& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_offers_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_swap_liquidity& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_swap_liquidity_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_token_list& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_token_list_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_total_balances& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_total_balances_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_tx_log& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_get_tx_log_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_import_wallet& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_import_wallet_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_is_locked& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_is_locked_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_lock& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_lock_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_make_offer& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_make_offer_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_mark_spent& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_mark_spent_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_offer_trade& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_offer_trade_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_offer_withdraw& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_offer_withdraw_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_create& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_create_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_exec& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_exec_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_release& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_release_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_release_all& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_release_all_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_rem_token& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_rem_token_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_remove_account& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_remove_account_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_reserve& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_reserve_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_reset_cache& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_reset_cache_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_send& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_send_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_send_from& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_send_from_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_send_many& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_send_many_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_send_off& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_send_off_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_set_address_count& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_set_address_count_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_sign_msg& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_sign_msg_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_sign_off& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_sign_off_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_add_liquid& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_add_liquid_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_rem_liquid& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_rem_liquid_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_trade& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_trade_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_unlock& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_unlock_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_update_cache& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::Wallet_update_cache_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::WalletFile& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::WebAPIBase& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::WebAPI_shutdown& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::WebAPI_shutdown_return& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::account_info_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::account_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::addr_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::balance_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::block_index_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::compile_flags_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::error_code_e& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::exec_entry_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::exec_error_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::exec_result_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::farmed_block_info_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::farmed_block_summary_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::fixed128& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::hash_512_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::hash_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::node_info_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::node_type_e& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::offer_data_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::peer_info_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::permission_e& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::plot_nft_info_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::pooling_error_e& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::pooling_info_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::pooling_stats_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::pubkey_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::query_filter_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::signature_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::skey_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::spend_options_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::swap_entry_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::swap_info_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::swap_pool_info_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::swap_user_info_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::table_entry_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::trade_entry_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::trade_log_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::tx_entry_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::tx_index_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::tx_info_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::tx_log_entry_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::tx_note_e& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::tx_type_e& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::txin_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::txio_entry_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::txio_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::txout_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::uint128& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::uint_fraction_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::ulong_fraction_t& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::virtual_plot_info_t& value); ///< \\private\n\nvoid accept(Visitor& visitor, const ::mmx::Block& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::BlockHeader& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ChainParams& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Challenge& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Contract& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::FarmInfo& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::FarmerBase& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farm_info& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farm_info_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farmer_keys& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farmer_keys_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_mac_addr& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_mac_addr_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diff& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diff_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diffs& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diffs_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_block& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_block_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_vote& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_vote_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::HarvesterBase& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Harvester_add_plot_dir& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Harvester_add_plot_dir_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Harvester_get_farm_info& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Harvester_get_farm_info_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Harvester_get_total_bytes& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Harvester_get_total_bytes_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Harvester_reload& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Harvester_reload_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Harvester_rem_plot_dir& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Harvester_rem_plot_dir_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::IntervalRequest& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::KeyFile& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::LookupInfo& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::NetworkInfo& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::NodeBase& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_add_block& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_add_block_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_add_transaction& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_add_transaction_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_call_contract& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_call_contract_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_dump_storage& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_dump_storage_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_fetch_offers& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_fetch_offers_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_all_balances& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_all_balances_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_balance& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_balance_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_balances& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_balances_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_at& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_at_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash_ex& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash_ex_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_balances& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_balances_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_for& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_for_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_by& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_by_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_owned_by& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_owned_by_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_exec_history& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_exec_history_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_block_summary& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_block_summary_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_blocks& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_blocks_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmer_ranking& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmer_ranking_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_genesis_hash& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_genesis_hash_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_header& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_header_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_header_at& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_header_at_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_height& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_height_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_history& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_history_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_history_memo& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_history_memo_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_network_info& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_network_info_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offer& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offer_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offers& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offers_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offers_by& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offers_by_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_params& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_params_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_info& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_info_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_target& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_target_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers_for& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers_for_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_equivalent_liquidity& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_equivalent_liquidity_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_fees_earned& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_fees_earned_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_history& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_history_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_info& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_info_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_liquidity_by& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_liquidity_by_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_trade_estimate& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_trade_estimate_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_user_info& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_user_info_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swaps& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swaps_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_height& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_height_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_vdf_height& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_vdf_height_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balance& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balance_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balances& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balances_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_supply& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_supply_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history_for& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history_for_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_transaction& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_transaction_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_transactions& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_transactions_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_height& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_height_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_at& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_at_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_since& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_since_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info_for& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info_for_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_height& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_height_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_peak& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_peak_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_array& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_array_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_addr& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_addr_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_string& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_string_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_var& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_var_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_field& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_field_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_map& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_map_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_object& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_object_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_var& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_var_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_revert_sync& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_revert_sync_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_start_sync& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_start_sync_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_validate& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_validate_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_verify_partial& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_verify_partial_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_verify_plot_nft_target& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Node_verify_plot_nft_target_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Operation& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Partial& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::PeerInfo& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::PlotHeader& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ProofOfSpace& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ProofOfSpaceNFT& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ProofOfSpaceOG& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ProofOfTime& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ProofResponse& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ProofServerBase& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ProofServer_compute& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ProofServer_compute_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ReceiveNote& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Request& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::RouterBase& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_discover& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_discover_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block_at& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block_at_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_blocks_at& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_blocks_at_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_connected_peers& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_connected_peers_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_id& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_id_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_info& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_info_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_known_peers& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_known_peers_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_peer_info& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_peer_info_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_peers& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_get_peers_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_kick_peer& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_kick_peer_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_sign_msg& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Router_sign_msg_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Solution& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::TimeLordBase& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::TimeLord_stop_vdf& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::TimeLord_stop_vdf_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Transaction& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::TransactionBase& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::VDF_Point& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ValidatorVote& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::WalletBase& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_accept_offer& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_accept_offer_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_add_account& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_add_account_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_add_token& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_add_token_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_cancel_offer& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_cancel_offer_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_complete& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_complete_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_create_account& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_create_account_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_create_wallet& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_create_wallet_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_deploy& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_deploy_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_deposit& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_deposit_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_execute& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_execute_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_export_wallet& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_export_wallet_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_find_wallet_by_addr& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_find_wallet_by_addr_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_gather_inputs_for& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_gather_inputs_for_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_account& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_account_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_address& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_address_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_accounts& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_accounts_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_addresses& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_addresses_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_farmer_keys& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_farmer_keys_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balance& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balance_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balances& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balances_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contract_balances& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contract_balances_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts_owned& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts_owned_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_farmer_keys& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_farmer_keys_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_history& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_history_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_master_seed& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_master_seed_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_seed& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_seed_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_wordlist& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_wordlist_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_offers& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_offers_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_swap_liquidity& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_swap_liquidity_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_token_list& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_token_list_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_total_balances& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_total_balances_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_tx_log& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_tx_log_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_import_wallet& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_import_wallet_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_is_locked& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_is_locked_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_lock& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_lock_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_make_offer& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_make_offer_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_mark_spent& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_mark_spent_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_trade& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_trade_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_withdraw& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_withdraw_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_create& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_create_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_exec& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_exec_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_release& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_release_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_release_all& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_release_all_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_rem_token& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_rem_token_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_remove_account& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_remove_account_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_reserve& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_reserve_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_reset_cache& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_reset_cache_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_from& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_from_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_many& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_many_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_off& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_off_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_set_address_count& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_set_address_count_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_msg& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_msg_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_off& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_off_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_add_liquid& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_add_liquid_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_rem_liquid& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_rem_liquid_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_trade& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_trade_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_unlock& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_unlock_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_update_cache& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::Wallet_update_cache_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::WalletFile& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::WebAPIBase& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::WebAPI_shutdown& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::WebAPI_shutdown_return& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::account_info_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::account_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::addr_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::balance_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::block_index_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::compile_flags_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::error_code_e& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::exec_entry_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::exec_error_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::exec_result_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::farmed_block_info_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::farmed_block_summary_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::fixed128& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::hash_512_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::hash_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::node_info_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::node_type_e& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::offer_data_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::peer_info_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::permission_e& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::plot_nft_info_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::pooling_error_e& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::pooling_info_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::pooling_stats_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::pubkey_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::query_filter_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::signature_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::skey_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::spend_options_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::swap_entry_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::swap_info_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::swap_pool_info_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::swap_user_info_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::table_entry_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::trade_entry_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::trade_log_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::tx_entry_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::tx_index_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::tx_info_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::tx_log_entry_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::tx_note_e& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::tx_type_e& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::txin_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::txio_entry_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::txio_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::txout_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::uint128& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::uint_fraction_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::ulong_fraction_t& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::virtual_plot_info_t& value); ///< \\private\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Block> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::BlockHeader> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ChainParams> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Challenge> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Contract> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::FarmInfo> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_farm_info> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_farm_info_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_farmer_keys> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_farmer_keys_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_mac_addr> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_mac_addr_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_partial_diff> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_partial_diff_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_partial_diffs> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_get_partial_diffs_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_sign_block> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_sign_block_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_sign_vote> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Farmer_sign_vote_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_add_plot_dir> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_add_plot_dir_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_get_farm_info> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_get_farm_info_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_get_total_bytes> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_get_total_bytes_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_reload> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_reload_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_rem_plot_dir> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Harvester_rem_plot_dir_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::IntervalRequest> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::KeyFile> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::LookupInfo> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::NetworkInfo> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_add_block> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_add_block_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_add_transaction> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_add_transaction_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_call_contract> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_call_contract_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_dump_storage> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_dump_storage_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_fetch_offers> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_fetch_offers_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_all_balances> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_all_balances_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_balance> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_balance_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_balances> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_balances_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_at> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_at_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_hash> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_hash_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_hash_ex> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_block_hash_ex_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract_balances> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract_balances_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract_for> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contract_for_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts_by> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts_by_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts_owned_by> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_contracts_owned_by_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_exec_history> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_exec_history_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmed_block_summary> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmed_block_summary_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmed_blocks> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmed_blocks_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmer_ranking> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_farmer_ranking_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_genesis_hash> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_genesis_hash_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_header> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_header_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_header_at> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_header_at_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_height> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_height_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_history> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_history_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_history_memo> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_history_memo_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_network_info> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_network_info_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offer> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offer_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offers> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offers_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offers_by> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_offers_by_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_params> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_params_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_plot_nft_info> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_plot_nft_info_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_plot_nft_target> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_plot_nft_target_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_recent_offers> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_recent_offers_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_recent_offers_for> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_recent_offers_for_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_equivalent_liquidity> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_equivalent_liquidity_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_fees_earned> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_fees_earned_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_history> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_history_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_info> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_info_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_liquidity_by> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_liquidity_by_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_trade_estimate> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_trade_estimate_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_user_info> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swap_user_info_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swaps> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_swaps_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_synced_height> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_synced_height_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_synced_vdf_height> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_synced_vdf_height_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_balance> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_balance_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_balances> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_balances_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_supply> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_total_supply_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_trade_history> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_trade_history_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_trade_history_for> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_trade_history_for_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_transaction> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_transaction_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_transactions> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_transactions_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_height> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_height_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids_at> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids_at_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids_since> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_ids_since_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_info> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_info_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_info_for> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_tx_info_for_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_vdf_height> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_vdf_height_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_vdf_peak> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_get_vdf_peak_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_array> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_array_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_addr> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_addr_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_string> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_string_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_var> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_entry_var_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_field> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_field_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_map> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_map_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_object> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_object_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_var> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_read_storage_var_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_revert_sync> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_revert_sync_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_start_sync> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_start_sync_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_validate> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_validate_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_verify_partial> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_verify_partial_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_verify_plot_nft_target> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Node_verify_plot_nft_target_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Operation> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Partial> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::PeerInfo> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::PlotHeader> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofOfSpace> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofOfSpaceNFT> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofOfSpaceOG> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofOfTime> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofResponse> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofServer_compute> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ProofServer_compute_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ReceiveNote> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Request> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_discover> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_discover_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_fetch_block> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_fetch_block_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_fetch_block_at> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_fetch_block_at_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_blocks_at> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_blocks_at_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_connected_peers> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_connected_peers_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_id> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_id_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_info> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_info_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_known_peers> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_known_peers_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_peer_info> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_peer_info_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_peers> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_get_peers_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_kick_peer> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_kick_peer_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_sign_msg> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Router_sign_msg_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Solution> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::TimeLord_stop_vdf> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::TimeLord_stop_vdf_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Transaction> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::TransactionBase> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::VDF_Point> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::ValidatorVote> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_accept_offer> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_accept_offer_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_add_account> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_add_account_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_add_token> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_add_token_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_cancel_offer> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_cancel_offer_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_complete> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_complete_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_create_account> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_create_account_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_create_wallet> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_create_wallet_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_deploy> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_deploy_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_deposit> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_deposit_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_execute> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_execute_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_export_wallet> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_export_wallet_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_find_wallet_by_addr> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_find_wallet_by_addr_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_gather_inputs_for> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_gather_inputs_for_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_account> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_account_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_address> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_address_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_accounts> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_accounts_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_addresses> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_addresses_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_farmer_keys> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_all_farmer_keys_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_balance> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_balance_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_balances> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_balances_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contract_balances> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contract_balances_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contracts> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contracts_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contracts_owned> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_contracts_owned_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_farmer_keys> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_farmer_keys_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_history> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_history_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_master_seed> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_master_seed_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_mnemonic_seed> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_mnemonic_seed_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_mnemonic_wordlist> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_mnemonic_wordlist_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_offers> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_offers_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_swap_liquidity> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_swap_liquidity_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_token_list> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_token_list_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_total_balances> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_total_balances_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_tx_log> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_get_tx_log_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_import_wallet> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_import_wallet_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_is_locked> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_is_locked_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_lock> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_lock_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_make_offer> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_make_offer_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_mark_spent> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_mark_spent_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_offer_trade> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_offer_trade_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_offer_withdraw> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_offer_withdraw_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_plotnft_create> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_plotnft_create_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_plotnft_exec> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_plotnft_exec_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_release> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_release_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_release_all> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_release_all_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_rem_token> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_rem_token_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_remove_account> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_remove_account_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_reserve> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_reserve_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_reset_cache> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_reset_cache_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_from> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_from_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_many> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_many_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_off> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_send_off_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_set_address_count> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_set_address_count_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_sign_msg> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_sign_msg_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_sign_off> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_sign_off_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_add_liquid> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_add_liquid_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_rem_liquid> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_rem_liquid_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_trade> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_swap_trade_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_unlock> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_unlock_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_update_cache> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::Wallet_update_cache_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::WalletFile> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::WebAPI_shutdown> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::WebAPI_shutdown_return> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::tx_info_t> value); ///< \\private\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Block> {\n\tvoid read(TypeInput& in, ::mmx::Block& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Block& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Block& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Block& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Block& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Block& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::BlockHeader> {\n\tvoid read(TypeInput& in, ::mmx::BlockHeader& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::BlockHeader& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::BlockHeader& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::BlockHeader& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::BlockHeader& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::BlockHeader& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ChainParams> {\n\tvoid read(TypeInput& in, ::mmx::ChainParams& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ChainParams& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ChainParams& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ChainParams& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ChainParams& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ChainParams& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Challenge> {\n\tvoid read(TypeInput& in, ::mmx::Challenge& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Challenge& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Challenge& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Challenge& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Challenge& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Challenge& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Contract> {\n\tvoid read(TypeInput& in, ::mmx::Contract& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Contract& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Contract& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Contract& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Contract& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Contract& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::FarmInfo> {\n\tvoid read(TypeInput& in, ::mmx::FarmInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::FarmInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::FarmInfo& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::FarmInfo& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::FarmInfo& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::FarmInfo& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::FarmerBase> {\n\tvoid read(TypeInput& in, ::mmx::FarmerBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::FarmerBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::FarmerBase& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::FarmerBase& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::FarmerBase& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_get_farm_info> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_get_farm_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_get_farm_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_get_farm_info& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_get_farm_info& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farm_info& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_farm_info& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_get_farm_info_return> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_get_farm_info_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_get_farm_info_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farm_info_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_farm_info_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_get_farmer_keys> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_get_farmer_keys& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_get_farmer_keys& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farmer_keys& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_farmer_keys& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_get_farmer_keys_return> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_get_farmer_keys_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_get_farmer_keys_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farmer_keys_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_farmer_keys_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_get_mac_addr> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_get_mac_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_get_mac_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_get_mac_addr& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_get_mac_addr& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_get_mac_addr& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_mac_addr& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_get_mac_addr_return> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_get_mac_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_get_mac_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_get_mac_addr_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_get_mac_addr_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_get_mac_addr_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_mac_addr_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_get_partial_diff> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diff& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diff& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_get_partial_diff& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diff& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diff& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_partial_diff& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_get_partial_diff_return> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diff_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diff_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_get_partial_diff_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diff_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diff_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_partial_diff_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_get_partial_diffs> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diffs& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diffs& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_get_partial_diffs& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diffs& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diffs& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_partial_diffs& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_get_partial_diffs_return> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diffs_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diffs_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_get_partial_diffs_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diffs_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diffs_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_partial_diffs_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_sign_block> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_sign_block& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_sign_block& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_sign_block& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_sign_block& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_block& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_sign_block& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_sign_block_return> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_sign_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_sign_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_sign_block_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_sign_block_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_block_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_sign_block_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_sign_vote> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_sign_vote& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_sign_vote& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_sign_vote& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_sign_vote& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_vote& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_sign_vote& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Farmer_sign_vote_return> {\n\tvoid read(TypeInput& in, ::mmx::Farmer_sign_vote_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Farmer_sign_vote_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Farmer_sign_vote_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Farmer_sign_vote_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_vote_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_sign_vote_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::HarvesterBase> {\n\tvoid read(TypeInput& in, ::mmx::HarvesterBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::HarvesterBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::HarvesterBase& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::HarvesterBase& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::HarvesterBase& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Harvester_add_plot_dir> {\n\tvoid read(TypeInput& in, ::mmx::Harvester_add_plot_dir& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Harvester_add_plot_dir& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Harvester_add_plot_dir& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Harvester_add_plot_dir& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Harvester_add_plot_dir& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_add_plot_dir& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Harvester_add_plot_dir_return> {\n\tvoid read(TypeInput& in, ::mmx::Harvester_add_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Harvester_add_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Harvester_add_plot_dir_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Harvester_add_plot_dir_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Harvester_add_plot_dir_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_add_plot_dir_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Harvester_get_farm_info> {\n\tvoid read(TypeInput& in, ::mmx::Harvester_get_farm_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Harvester_get_farm_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Harvester_get_farm_info& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Harvester_get_farm_info& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Harvester_get_farm_info& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_get_farm_info& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Harvester_get_farm_info_return> {\n\tvoid read(TypeInput& in, ::mmx::Harvester_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Harvester_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Harvester_get_farm_info_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Harvester_get_farm_info_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Harvester_get_farm_info_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_get_farm_info_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Harvester_get_total_bytes> {\n\tvoid read(TypeInput& in, ::mmx::Harvester_get_total_bytes& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Harvester_get_total_bytes& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Harvester_get_total_bytes& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Harvester_get_total_bytes& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Harvester_get_total_bytes& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_get_total_bytes& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Harvester_get_total_bytes_return> {\n\tvoid read(TypeInput& in, ::mmx::Harvester_get_total_bytes_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Harvester_get_total_bytes_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Harvester_get_total_bytes_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Harvester_get_total_bytes_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Harvester_get_total_bytes_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_get_total_bytes_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Harvester_reload> {\n\tvoid read(TypeInput& in, ::mmx::Harvester_reload& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Harvester_reload& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Harvester_reload& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Harvester_reload& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Harvester_reload& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_reload& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Harvester_reload_return> {\n\tvoid read(TypeInput& in, ::mmx::Harvester_reload_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Harvester_reload_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Harvester_reload_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Harvester_reload_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Harvester_reload_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_reload_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Harvester_rem_plot_dir> {\n\tvoid read(TypeInput& in, ::mmx::Harvester_rem_plot_dir& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Harvester_rem_plot_dir& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Harvester_rem_plot_dir& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Harvester_rem_plot_dir& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Harvester_rem_plot_dir& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_rem_plot_dir& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Harvester_rem_plot_dir_return> {\n\tvoid read(TypeInput& in, ::mmx::Harvester_rem_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Harvester_rem_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Harvester_rem_plot_dir_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Harvester_rem_plot_dir_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Harvester_rem_plot_dir_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_rem_plot_dir_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::IntervalRequest> {\n\tvoid read(TypeInput& in, ::mmx::IntervalRequest& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::IntervalRequest& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::IntervalRequest& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::IntervalRequest& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::IntervalRequest& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::IntervalRequest& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::KeyFile> {\n\tvoid read(TypeInput& in, ::mmx::KeyFile& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::KeyFile& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::KeyFile& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::KeyFile& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::KeyFile& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::KeyFile& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::LookupInfo> {\n\tvoid read(TypeInput& in, ::mmx::LookupInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::LookupInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::LookupInfo& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::LookupInfo& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::LookupInfo& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::LookupInfo& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::NetworkInfo> {\n\tvoid read(TypeInput& in, ::mmx::NetworkInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::NetworkInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::NetworkInfo& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::NetworkInfo& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::NetworkInfo& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::NetworkInfo& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::NodeBase> {\n\tvoid read(TypeInput& in, ::mmx::NodeBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::NodeBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::NodeBase& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::NodeBase& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::NodeBase& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_add_block> {\n\tvoid read(TypeInput& in, ::mmx::Node_add_block& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_add_block& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_add_block& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_add_block& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_add_block& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_add_block& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_add_block_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_add_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_add_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_add_block_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_add_block_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_add_block_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_add_block_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_add_transaction> {\n\tvoid read(TypeInput& in, ::mmx::Node_add_transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_add_transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_add_transaction& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_add_transaction& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_add_transaction& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_add_transaction& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_add_transaction_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_add_transaction_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_add_transaction_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_add_transaction_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_add_transaction_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_add_transaction_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_add_transaction_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_call_contract> {\n\tvoid read(TypeInput& in, ::mmx::Node_call_contract& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_call_contract& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_call_contract& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_call_contract& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_call_contract& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_call_contract& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_call_contract_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_call_contract_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_call_contract_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_call_contract_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_call_contract_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_call_contract_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_call_contract_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_dump_storage> {\n\tvoid read(TypeInput& in, ::mmx::Node_dump_storage& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_dump_storage& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_dump_storage& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_dump_storage& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_dump_storage& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_dump_storage& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_dump_storage_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_dump_storage_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_dump_storage_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_dump_storage_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_dump_storage_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_dump_storage_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_dump_storage_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_fetch_offers> {\n\tvoid read(TypeInput& in, ::mmx::Node_fetch_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_fetch_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_fetch_offers& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_fetch_offers& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_fetch_offers& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_fetch_offers& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_fetch_offers_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_fetch_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_fetch_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_fetch_offers_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_fetch_offers_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_fetch_offers_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_fetch_offers_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_all_balances> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_all_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_all_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_all_balances& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_all_balances& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_all_balances& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_all_balances& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_all_balances_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_all_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_all_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_all_balances_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_all_balances_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_all_balances_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_all_balances_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_balance> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_balance& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_balance& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_balance& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_balance& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_balance_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_balance_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_balance_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_balance_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_balance_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_balances> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_balances& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_balances& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_balances& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_balances& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_balances_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_balances_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_balances_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_balances_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_balances_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_block> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_block& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_block& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_block& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_block& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_block& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_block_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_block_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_block_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_block_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_block_at> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_block_at& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_block_at& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_block_at& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_block_at& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_block_at& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_at& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_block_at_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_block_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_block_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_block_at_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_block_at_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_block_at_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_at_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_block_hash> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_block_hash& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_block_hash& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_block_hash& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_hash& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_block_hash_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_block_hash_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_block_hash_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_block_hash_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_hash_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_block_hash_ex> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_block_hash_ex& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash_ex& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_block_hash_ex& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_block_hash_ex& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash_ex& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_hash_ex& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_block_hash_ex_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_block_hash_ex_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash_ex_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_block_hash_ex_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_block_hash_ex_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash_ex_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_hash_ex_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contract> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contract& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contract& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contract& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contract& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contract& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contract_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contract_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contract_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contract_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contract_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contract_balances> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contract_balances& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contract_balances& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_balances& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract_balances& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contract_balances_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contract_balances_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contract_balances_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_balances_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract_balances_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contract_for> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contract_for& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contract_for& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contract_for& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contract_for& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_for& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract_for& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contract_for_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contract_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contract_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contract_for_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contract_for_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_for_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract_for_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contracts> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contracts& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contracts& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contracts& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contracts& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contracts_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contracts_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contracts_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contracts_by> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contracts_by& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_by& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contracts_by& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contracts_by& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_by& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts_by& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contracts_by_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contracts_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contracts_by_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contracts_by_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_by_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts_by_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contracts_owned_by> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contracts_owned_by& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_owned_by& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contracts_owned_by& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contracts_owned_by& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_owned_by& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts_owned_by& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_contracts_owned_by_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_contracts_owned_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_owned_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_contracts_owned_by_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_contracts_owned_by_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_owned_by_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts_owned_by_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_exec_history> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_exec_history& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_exec_history& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_exec_history& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_exec_history& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_exec_history& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_exec_history& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_exec_history_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_exec_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_exec_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_exec_history_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_exec_history_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_exec_history_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_exec_history_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_farmed_block_summary> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_farmed_block_summary& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_block_summary& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_farmed_block_summary& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_farmed_block_summary& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_block_summary& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmed_block_summary& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_farmed_block_summary_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_farmed_block_summary_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_block_summary_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_farmed_block_summary_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_farmed_block_summary_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_block_summary_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmed_block_summary_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_farmed_blocks> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_farmed_blocks& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_blocks& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_farmed_blocks& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_farmed_blocks& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_blocks& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmed_blocks& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_farmed_blocks_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_farmed_blocks_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_blocks_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_farmed_blocks_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_farmed_blocks_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_blocks_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmed_blocks_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_farmer_ranking> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_farmer_ranking& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_farmer_ranking& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_farmer_ranking& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_farmer_ranking& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_farmer_ranking& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmer_ranking& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_farmer_ranking_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_farmer_ranking_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_farmer_ranking_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_farmer_ranking_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_farmer_ranking_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_farmer_ranking_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmer_ranking_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_genesis_hash> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_genesis_hash& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_genesis_hash& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_genesis_hash& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_genesis_hash& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_genesis_hash& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_genesis_hash& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_genesis_hash_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_genesis_hash_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_genesis_hash_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_genesis_hash_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_genesis_hash_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_genesis_hash_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_genesis_hash_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_header> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_header& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_header& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_header& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_header& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_header& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_header& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_header_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_header_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_header_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_header_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_header_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_header_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_header_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_header_at> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_header_at& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_header_at& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_header_at& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_header_at& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_header_at& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_header_at& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_header_at_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_header_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_header_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_header_at_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_header_at_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_header_at_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_header_at_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_height> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_height& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_height& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_height& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_height& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_height& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_height& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_height_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_height_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_height_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_height_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_height_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_history> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_history& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_history& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_history& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_history& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_history& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_history& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_history_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_history_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_history_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_history_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_history_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_history_memo> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_history_memo& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_history_memo& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_history_memo& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_history_memo& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_history_memo& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_history_memo& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_history_memo_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_history_memo_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_history_memo_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_history_memo_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_history_memo_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_history_memo_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_history_memo_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_network_info> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_network_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_network_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_network_info& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_network_info& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_network_info& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_network_info& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_network_info_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_network_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_network_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_network_info_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_network_info_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_network_info_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_network_info_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_offer> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_offer& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_offer& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_offer& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offer& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_offer_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_offer_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_offer_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_offer_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offer_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_offers> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_offers& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_offers& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_offers& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offers& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_offers_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_offers_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_offers_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_offers_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offers_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_offers_by> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_offers_by& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_offers_by& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_offers_by& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_offers_by& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_offers_by& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offers_by& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_offers_by_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_offers_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_offers_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_offers_by_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_offers_by_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_offers_by_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offers_by_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_params> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_params& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_params& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_params& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_params& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_params& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_params& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_params_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_params_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_params_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_params_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_params_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_params_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_params_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_plot_nft_info> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_plot_nft_info& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_info& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_info& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_plot_nft_info& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_plot_nft_info_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_plot_nft_info_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_info_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_info_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_plot_nft_info_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_plot_nft_target> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_plot_nft_target& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_target& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_target& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_plot_nft_target& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_plot_nft_target_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_plot_nft_target_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_target_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_target_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_plot_nft_target_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_recent_offers> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_recent_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_recent_offers& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_recent_offers& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_recent_offers_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_recent_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_recent_offers_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_recent_offers_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_recent_offers_for> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_recent_offers_for& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers_for& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_recent_offers_for& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers_for& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers_for& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_recent_offers_for& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_recent_offers_for_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_recent_offers_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_recent_offers_for_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers_for_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers_for_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_recent_offers_for_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_equivalent_liquidity> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_equivalent_liquidity& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_equivalent_liquidity& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_equivalent_liquidity& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_equivalent_liquidity& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_equivalent_liquidity& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_equivalent_liquidity& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_equivalent_liquidity_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_equivalent_liquidity_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_equivalent_liquidity_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_equivalent_liquidity_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_equivalent_liquidity_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_equivalent_liquidity_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_equivalent_liquidity_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_fees_earned> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_fees_earned& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_fees_earned& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_fees_earned& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_fees_earned& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_fees_earned& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_fees_earned& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_fees_earned_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_fees_earned_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_fees_earned_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_fees_earned_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_fees_earned_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_fees_earned_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_fees_earned_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_history> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_history& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_history& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_history& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_history& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_history& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_history& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_history_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_history_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_history_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_history_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_history_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_info> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_info& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_info& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_info& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_info& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_info_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_info_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_info_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_info_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_info_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_liquidity_by> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_liquidity_by& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_liquidity_by& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_liquidity_by& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_liquidity_by& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_liquidity_by& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_liquidity_by& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_liquidity_by_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_liquidity_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_liquidity_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_liquidity_by_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_liquidity_by_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_liquidity_by_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_liquidity_by_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_trade_estimate> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_trade_estimate& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_trade_estimate& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_trade_estimate& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_trade_estimate& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_trade_estimate& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_trade_estimate& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_trade_estimate_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_trade_estimate_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_trade_estimate_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_trade_estimate_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_trade_estimate_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_trade_estimate_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_trade_estimate_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_user_info> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_user_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_user_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_user_info& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_user_info& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_user_info& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_user_info& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swap_user_info_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swap_user_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swap_user_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swap_user_info_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swap_user_info_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_user_info_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_user_info_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swaps> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swaps& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swaps& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swaps& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swaps& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swaps& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swaps& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_swaps_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_swaps_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_swaps_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_swaps_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_swaps_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_swaps_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swaps_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_synced_height> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_synced_height& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_synced_height& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_synced_height& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_synced_height& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_height& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_synced_height& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_synced_height_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_synced_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_synced_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_synced_height_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_synced_height_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_height_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_synced_height_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_synced_vdf_height> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_synced_vdf_height& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_synced_vdf_height& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_synced_vdf_height& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_synced_vdf_height& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_vdf_height& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_synced_vdf_height& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_synced_vdf_height_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_synced_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_synced_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_synced_vdf_height_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_synced_vdf_height_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_vdf_height_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_synced_vdf_height_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_total_balance> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_total_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_total_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_total_balance& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_total_balance& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balance& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_balance& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_total_balance_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_total_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_total_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_total_balance_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_total_balance_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balance_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_balance_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_total_balances> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_total_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_total_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_total_balances& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_total_balances& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balances& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_balances& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_total_balances_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_total_balances_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_total_balances_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balances_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_balances_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_total_supply> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_total_supply& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_total_supply& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_total_supply& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_total_supply& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_total_supply& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_supply& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_total_supply_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_total_supply_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_total_supply_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_total_supply_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_total_supply_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_total_supply_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_supply_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_trade_history> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_trade_history& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_trade_history& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_trade_history& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_trade_history& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_trade_history_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_trade_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_trade_history_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_trade_history_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_trade_history_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_trade_history_for> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_trade_history_for& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history_for& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_trade_history_for& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_trade_history_for& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history_for& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_trade_history_for& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_trade_history_for_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_trade_history_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_trade_history_for_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_trade_history_for_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history_for_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_trade_history_for_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_transaction> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_transaction& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_transaction& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_transaction& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_transaction& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_transaction_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_transaction_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_transaction_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_transaction_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_transaction_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_transaction_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_transaction_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_transactions> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_transactions& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_transactions& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_transactions& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_transactions& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_transactions& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_transactions& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_transactions_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_transactions_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_transactions_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_transactions_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_transactions_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_transactions_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_transactions_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_height> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_height& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_height& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_height& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_height& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_height& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_height& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_height_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_height_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_height_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_height_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_height_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_ids> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_ids& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_ids& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_ids_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_ids_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_ids_at> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_at& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_at& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_ids_at& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_at& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_at& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids_at& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_ids_at_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_ids_at_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_at_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_at_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids_at_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_ids_since> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_since& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_since& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_ids_since& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_since& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_since& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids_since& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_ids_since_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_since_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_since_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_ids_since_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_since_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_since_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids_since_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_info> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_info& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_info& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_info& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_info_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_info_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_info_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_info_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_info_for> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_info_for& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info_for& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_info_for& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_info_for& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info_for& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_info_for& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_tx_info_for_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_tx_info_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_tx_info_for_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_tx_info_for_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info_for_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_info_for_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_vdf_height> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_vdf_height& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_height& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_vdf_height& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_vdf_height& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_height& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_vdf_height& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_vdf_height_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_vdf_height_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_vdf_height_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_height_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_vdf_height_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_vdf_peak> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_vdf_peak& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_peak& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_vdf_peak& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_vdf_peak& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_peak& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_vdf_peak& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_get_vdf_peak_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_get_vdf_peak_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_peak_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_get_vdf_peak_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_get_vdf_peak_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_peak_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_vdf_peak_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_array> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_array& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_array& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_array& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_array& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_array& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_array& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_array_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_array_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_array_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_array_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_array_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_array_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_array_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_entry_addr> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_entry_addr& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_addr& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_addr& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_addr& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_entry_addr_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_entry_addr_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_addr_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_addr_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_addr_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_entry_string> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_string& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_string& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_entry_string& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_string& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_string& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_string& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_entry_string_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_string_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_string_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_entry_string_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_string_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_string_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_string_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_entry_var> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_var& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_var& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_entry_var& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_var& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_var& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_var& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_entry_var_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_var_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_var_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_entry_var_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_var_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_var_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_var_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_field> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_field& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_field& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_field& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_field& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_field& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_field& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_field_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_field_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_field_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_field_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_field_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_field_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_field_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_map> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_map& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_map& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_map& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_map& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_map& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_map& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_map_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_map_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_map_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_map_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_map_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_map_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_map_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_object> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_object& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_object& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_object& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_object& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_object& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_object& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_object_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_object_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_object_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_object_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_object_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_object_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_object_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_var> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_var& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_var& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_var& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_var& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_var& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_var& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_read_storage_var_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_read_storage_var_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_read_storage_var_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_read_storage_var_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_read_storage_var_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_var_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_var_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_revert_sync> {\n\tvoid read(TypeInput& in, ::mmx::Node_revert_sync& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_revert_sync& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_revert_sync& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_revert_sync& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_revert_sync& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_revert_sync& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_revert_sync_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_revert_sync_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_revert_sync_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_revert_sync_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_revert_sync_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_revert_sync_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_revert_sync_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_start_sync> {\n\tvoid read(TypeInput& in, ::mmx::Node_start_sync& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_start_sync& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_start_sync& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_start_sync& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_start_sync& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_start_sync& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_start_sync_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_start_sync_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_start_sync_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_start_sync_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_start_sync_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_start_sync_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_start_sync_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_validate> {\n\tvoid read(TypeInput& in, ::mmx::Node_validate& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_validate& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_validate& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_validate& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_validate& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_validate& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_validate_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_validate_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_validate_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_validate_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_validate_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_validate_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_validate_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_verify_partial> {\n\tvoid read(TypeInput& in, ::mmx::Node_verify_partial& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_verify_partial& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_verify_partial& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_verify_partial& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_verify_partial& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_verify_partial& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_verify_partial_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_verify_partial_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_verify_partial_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_verify_partial_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_verify_partial_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_verify_partial_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_verify_partial_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_verify_plot_nft_target> {\n\tvoid read(TypeInput& in, ::mmx::Node_verify_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_verify_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_verify_plot_nft_target& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_verify_plot_nft_target& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_verify_plot_nft_target& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_verify_plot_nft_target& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Node_verify_plot_nft_target_return> {\n\tvoid read(TypeInput& in, ::mmx::Node_verify_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Node_verify_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Node_verify_plot_nft_target_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Node_verify_plot_nft_target_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Node_verify_plot_nft_target_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_verify_plot_nft_target_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Operation> {\n\tvoid read(TypeInput& in, ::mmx::Operation& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Operation& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Operation& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Operation& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Operation& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Operation& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Partial> {\n\tvoid read(TypeInput& in, ::mmx::Partial& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Partial& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Partial& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Partial& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Partial& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Partial& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::PeerInfo> {\n\tvoid read(TypeInput& in, ::mmx::PeerInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::PeerInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::PeerInfo& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::PeerInfo& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::PeerInfo& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::PeerInfo& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::PlotHeader> {\n\tvoid read(TypeInput& in, ::mmx::PlotHeader& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::PlotHeader& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::PlotHeader& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::PlotHeader& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::PlotHeader& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::PlotHeader& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ProofOfSpace> {\n\tvoid read(TypeInput& in, ::mmx::ProofOfSpace& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ProofOfSpace& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ProofOfSpace& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ProofOfSpace& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ProofOfSpace& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofOfSpace& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ProofOfSpaceNFT> {\n\tvoid read(TypeInput& in, ::mmx::ProofOfSpaceNFT& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ProofOfSpaceNFT& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ProofOfSpaceNFT& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ProofOfSpaceNFT& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ProofOfSpaceNFT& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofOfSpaceNFT& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ProofOfSpaceOG> {\n\tvoid read(TypeInput& in, ::mmx::ProofOfSpaceOG& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ProofOfSpaceOG& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ProofOfSpaceOG& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ProofOfSpaceOG& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ProofOfSpaceOG& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofOfSpaceOG& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ProofOfTime> {\n\tvoid read(TypeInput& in, ::mmx::ProofOfTime& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ProofOfTime& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ProofOfTime& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ProofOfTime& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ProofOfTime& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofOfTime& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ProofResponse> {\n\tvoid read(TypeInput& in, ::mmx::ProofResponse& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ProofResponse& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ProofResponse& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ProofResponse& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ProofResponse& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofResponse& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ProofServerBase> {\n\tvoid read(TypeInput& in, ::mmx::ProofServerBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ProofServerBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ProofServerBase& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ProofServerBase& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ProofServerBase& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ProofServer_compute> {\n\tvoid read(TypeInput& in, ::mmx::ProofServer_compute& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ProofServer_compute& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ProofServer_compute& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ProofServer_compute& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ProofServer_compute& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofServer_compute& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ProofServer_compute_return> {\n\tvoid read(TypeInput& in, ::mmx::ProofServer_compute_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ProofServer_compute_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ProofServer_compute_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ProofServer_compute_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ProofServer_compute_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofServer_compute_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ReceiveNote> {\n\tvoid read(TypeInput& in, ::mmx::ReceiveNote& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ReceiveNote& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ReceiveNote& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ReceiveNote& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ReceiveNote& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ReceiveNote& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Request> {\n\tvoid read(TypeInput& in, ::mmx::Request& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Request& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Request& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Request& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Request& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Request& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Return> {\n\tvoid read(TypeInput& in, ::mmx::Return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::RouterBase> {\n\tvoid read(TypeInput& in, ::mmx::RouterBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::RouterBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::RouterBase& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::RouterBase& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::RouterBase& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_discover> {\n\tvoid read(TypeInput& in, ::mmx::Router_discover& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_discover& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_discover& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_discover& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_discover& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_discover& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_discover_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_discover_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_discover_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_discover_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_discover_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_discover_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_discover_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_fetch_block> {\n\tvoid read(TypeInput& in, ::mmx::Router_fetch_block& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_fetch_block& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_fetch_block& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_fetch_block& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_fetch_block& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_fetch_block_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_fetch_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_fetch_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_fetch_block_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_fetch_block_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_fetch_block_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_fetch_block_at> {\n\tvoid read(TypeInput& in, ::mmx::Router_fetch_block_at& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_fetch_block_at& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_fetch_block_at& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_fetch_block_at& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block_at& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_fetch_block_at& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_fetch_block_at_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_fetch_block_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_fetch_block_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_fetch_block_at_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_fetch_block_at_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block_at_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_fetch_block_at_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_blocks_at> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_blocks_at& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_blocks_at& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_blocks_at& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_blocks_at& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_blocks_at& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_blocks_at& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_blocks_at_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_blocks_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_blocks_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_blocks_at_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_blocks_at_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_blocks_at_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_blocks_at_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_connected_peers> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_connected_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_connected_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_connected_peers& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_connected_peers& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_connected_peers& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_connected_peers& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_connected_peers_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_connected_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_connected_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_connected_peers_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_connected_peers_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_connected_peers_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_connected_peers_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_id> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_id& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_id& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_id& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_id& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_id& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_id& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_id_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_id_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_id_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_id_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_id_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_id_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_id_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_info> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_info& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_info& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_info& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_info& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_info_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_info_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_info_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_info_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_info_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_known_peers> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_known_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_known_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_known_peers& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_known_peers& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_known_peers& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_known_peers& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_known_peers_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_known_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_known_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_known_peers_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_known_peers_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_known_peers_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_known_peers_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_peer_info> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_peer_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_peer_info& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_peer_info& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_peer_info& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_peer_info& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_peer_info& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_peer_info_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_peer_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_peer_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_peer_info_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_peer_info_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_peer_info_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_peer_info_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_peers> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_peers& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_peers& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_peers& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_peers& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_get_peers_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_get_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_get_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_get_peers_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_get_peers_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_get_peers_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_peers_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_kick_peer> {\n\tvoid read(TypeInput& in, ::mmx::Router_kick_peer& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_kick_peer& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_kick_peer& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_kick_peer& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_kick_peer& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_kick_peer& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_kick_peer_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_kick_peer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_kick_peer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_kick_peer_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_kick_peer_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_kick_peer_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_kick_peer_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_sign_msg> {\n\tvoid read(TypeInput& in, ::mmx::Router_sign_msg& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_sign_msg& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_sign_msg& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_sign_msg& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_sign_msg& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_sign_msg& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Router_sign_msg_return> {\n\tvoid read(TypeInput& in, ::mmx::Router_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Router_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Router_sign_msg_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Router_sign_msg_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Router_sign_msg_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_sign_msg_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Solution> {\n\tvoid read(TypeInput& in, ::mmx::Solution& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Solution& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Solution& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Solution& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Solution& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Solution& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::TimeLordBase> {\n\tvoid read(TypeInput& in, ::mmx::TimeLordBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::TimeLordBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::TimeLordBase& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::TimeLordBase& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::TimeLordBase& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::TimeLord_stop_vdf> {\n\tvoid read(TypeInput& in, ::mmx::TimeLord_stop_vdf& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::TimeLord_stop_vdf& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::TimeLord_stop_vdf& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::TimeLord_stop_vdf& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::TimeLord_stop_vdf& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::TimeLord_stop_vdf& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::TimeLord_stop_vdf_return> {\n\tvoid read(TypeInput& in, ::mmx::TimeLord_stop_vdf_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::TimeLord_stop_vdf_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::TimeLord_stop_vdf_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::TimeLord_stop_vdf_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::TimeLord_stop_vdf_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::TimeLord_stop_vdf_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Transaction> {\n\tvoid read(TypeInput& in, ::mmx::Transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Transaction& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Transaction& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Transaction& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Transaction& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::TransactionBase> {\n\tvoid read(TypeInput& in, ::mmx::TransactionBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::TransactionBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::TransactionBase& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::TransactionBase& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::TransactionBase& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::TransactionBase& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::VDF_Point> {\n\tvoid read(TypeInput& in, ::mmx::VDF_Point& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::VDF_Point& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::VDF_Point& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::VDF_Point& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::VDF_Point& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::VDF_Point& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ValidatorVote> {\n\tvoid read(TypeInput& in, ::mmx::ValidatorVote& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ValidatorVote& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ValidatorVote& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ValidatorVote& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ValidatorVote& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ValidatorVote& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::WalletBase> {\n\tvoid read(TypeInput& in, ::mmx::WalletBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::WalletBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::WalletBase& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::WalletBase& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::WalletBase& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_accept_offer> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_accept_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_accept_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_accept_offer& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_accept_offer& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_accept_offer& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_accept_offer& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_accept_offer_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_accept_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_accept_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_accept_offer_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_accept_offer_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_accept_offer_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_accept_offer_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_add_account> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_add_account& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_add_account& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_add_account& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_add_account& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_add_account& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_add_account& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_add_account_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_add_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_add_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_add_account_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_add_account_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_add_account_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_add_account_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_add_token> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_add_token& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_add_token& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_add_token& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_add_token& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_add_token& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_add_token& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_add_token_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_add_token_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_add_token_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_add_token_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_add_token_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_add_token_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_add_token_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_cancel_offer> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_cancel_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_cancel_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_cancel_offer& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_cancel_offer& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_cancel_offer& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_cancel_offer& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_cancel_offer_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_cancel_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_cancel_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_cancel_offer_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_cancel_offer_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_cancel_offer_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_cancel_offer_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_complete> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_complete& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_complete& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_complete& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_complete& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_complete& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_complete& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_complete_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_complete_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_complete_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_complete_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_complete_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_complete_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_complete_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_create_account> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_create_account& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_create_account& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_create_account& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_create_account& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_create_account& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_create_account& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_create_account_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_create_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_create_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_create_account_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_create_account_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_create_account_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_create_account_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_create_wallet> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_create_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_create_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_create_wallet& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_create_wallet& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_create_wallet& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_create_wallet& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_create_wallet_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_create_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_create_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_create_wallet_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_create_wallet_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_create_wallet_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_create_wallet_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_deploy> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_deploy& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_deploy& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_deploy& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_deploy& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_deploy& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_deploy& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_deploy_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_deploy_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_deploy_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_deploy_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_deploy_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_deploy_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_deploy_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_deposit> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_deposit& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_deposit& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_deposit& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_deposit& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_deposit& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_deposit& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_deposit_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_deposit_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_deposit_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_deposit_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_deposit_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_deposit_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_deposit_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_execute> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_execute& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_execute& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_execute& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_execute& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_execute& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_execute& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_execute_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_execute_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_execute_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_execute_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_execute_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_execute_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_execute_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_export_wallet> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_export_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_export_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_export_wallet& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_export_wallet& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_export_wallet& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_export_wallet& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_export_wallet_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_export_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_export_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_export_wallet_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_export_wallet_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_export_wallet_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_export_wallet_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_find_wallet_by_addr> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_find_wallet_by_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_find_wallet_by_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_find_wallet_by_addr& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_find_wallet_by_addr& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_find_wallet_by_addr& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_find_wallet_by_addr& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_find_wallet_by_addr_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_find_wallet_by_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_find_wallet_by_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_find_wallet_by_addr_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_find_wallet_by_addr_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_find_wallet_by_addr_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_find_wallet_by_addr_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_gather_inputs_for> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_gather_inputs_for& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_gather_inputs_for& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_gather_inputs_for& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_gather_inputs_for& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_gather_inputs_for& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_gather_inputs_for& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_gather_inputs_for_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_gather_inputs_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_gather_inputs_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_gather_inputs_for_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_gather_inputs_for_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_gather_inputs_for_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_gather_inputs_for_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_account> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_account& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_account& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_account& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_account& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_account& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_account& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_account_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_account_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_account_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_account_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_account_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_address> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_address& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_address& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_address& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_address& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_address& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_address& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_address_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_address_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_address_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_address_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_address_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_address_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_address_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_all_accounts> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_all_accounts& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_accounts& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_all_accounts& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_all_accounts& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_accounts& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_accounts& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_all_accounts_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_all_accounts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_accounts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_all_accounts_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_all_accounts_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_accounts_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_accounts_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_all_addresses> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_all_addresses& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_addresses& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_all_addresses& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_all_addresses& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_addresses& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_addresses& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_all_addresses_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_all_addresses_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_addresses_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_all_addresses_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_all_addresses_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_addresses_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_addresses_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_all_farmer_keys> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_all_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_all_farmer_keys& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_all_farmer_keys& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_farmer_keys& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_farmer_keys& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_all_farmer_keys_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_all_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_all_farmer_keys_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_all_farmer_keys_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_farmer_keys_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_farmer_keys_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_balance> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_balance& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_balance& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balance& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_balance& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_balance_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_balance_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_balance_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balance_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_balance_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_balances> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_balances& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_balances& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balances& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_balances& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_balances_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_balances_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_balances_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balances_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_balances_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_contract_balances> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_contract_balances& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_contract_balances& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contract_balances& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contract_balances& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_contract_balances_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_contract_balances_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_contract_balances_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contract_balances_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contract_balances_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_contracts> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_contracts& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_contracts& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contracts& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_contracts_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_contracts_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contracts_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_contracts_owned> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_contracts_owned& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts_owned& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_contracts_owned& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts_owned& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts_owned& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contracts_owned& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_contracts_owned_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_contracts_owned_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts_owned_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_contracts_owned_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts_owned_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts_owned_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contracts_owned_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_farmer_keys> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_farmer_keys& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_farmer_keys& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_farmer_keys& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_farmer_keys& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_farmer_keys_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_farmer_keys_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_farmer_keys_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_farmer_keys_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_farmer_keys_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_history> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_history& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_history& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_history& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_history& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_history& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_history& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_history_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_history_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_history_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_history_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_history_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_master_seed> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_master_seed& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_master_seed& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_master_seed& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_master_seed& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_master_seed& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_master_seed& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_master_seed_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_master_seed_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_master_seed_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_master_seed_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_master_seed_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_master_seed_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_master_seed_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_mnemonic_seed> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_seed& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_seed& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_seed& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_seed& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_seed& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_mnemonic_seed& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_mnemonic_seed_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_seed_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_seed_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_seed_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_seed_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_seed_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_mnemonic_seed_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_mnemonic_wordlist> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_wordlist& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_wordlist& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_wordlist& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_wordlist& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_wordlist& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_mnemonic_wordlist& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_mnemonic_wordlist_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_wordlist_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_wordlist_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_wordlist_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_wordlist_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_wordlist_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_mnemonic_wordlist_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_offers> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_offers& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_offers& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_offers& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_offers& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_offers_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_offers_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_offers_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_offers_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_offers_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_swap_liquidity> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_swap_liquidity& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_swap_liquidity& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_swap_liquidity& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_swap_liquidity& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_swap_liquidity& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_swap_liquidity& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_swap_liquidity_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_swap_liquidity_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_swap_liquidity_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_swap_liquidity_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_swap_liquidity_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_swap_liquidity_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_swap_liquidity_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_token_list> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_token_list& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_token_list& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_token_list& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_token_list& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_token_list& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_token_list& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_token_list_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_token_list_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_token_list_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_token_list_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_token_list_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_token_list_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_token_list_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_total_balances> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_total_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_total_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_total_balances& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_total_balances& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_total_balances& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_total_balances& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_total_balances_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_total_balances_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_total_balances_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_total_balances_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_total_balances_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_tx_log> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_tx_log& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_tx_log& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_tx_log& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_tx_log& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_tx_log& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_tx_log& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_get_tx_log_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_get_tx_log_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_get_tx_log_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_get_tx_log_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_get_tx_log_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_get_tx_log_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_tx_log_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_import_wallet> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_import_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_import_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_import_wallet& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_import_wallet& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_import_wallet& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_import_wallet& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_import_wallet_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_import_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_import_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_import_wallet_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_import_wallet_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_import_wallet_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_import_wallet_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_is_locked> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_is_locked& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_is_locked& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_is_locked& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_is_locked& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_is_locked& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_is_locked& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_is_locked_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_is_locked_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_is_locked_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_is_locked_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_is_locked_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_is_locked_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_is_locked_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_lock> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_lock& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_lock& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_lock& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_lock& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_lock& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_lock& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_lock_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_lock_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_lock_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_lock_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_lock_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_lock_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_lock_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_make_offer> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_make_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_make_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_make_offer& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_make_offer& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_make_offer& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_make_offer& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_make_offer_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_make_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_make_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_make_offer_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_make_offer_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_make_offer_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_make_offer_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_mark_spent> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_mark_spent& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_mark_spent& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_mark_spent& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_mark_spent& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_mark_spent& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_mark_spent& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_mark_spent_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_mark_spent_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_mark_spent_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_mark_spent_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_mark_spent_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_mark_spent_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_mark_spent_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_offer_trade> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_offer_trade& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_offer_trade& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_offer_trade& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_offer_trade& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_trade& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_offer_trade& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_offer_trade_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_offer_trade_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_offer_trade_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_offer_trade_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_offer_trade_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_trade_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_offer_trade_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_offer_withdraw> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_offer_withdraw& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_offer_withdraw& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_offer_withdraw& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_offer_withdraw& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_withdraw& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_offer_withdraw& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_offer_withdraw_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_offer_withdraw_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_offer_withdraw_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_offer_withdraw_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_offer_withdraw_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_withdraw_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_offer_withdraw_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_plotnft_create> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_plotnft_create& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_create& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_plotnft_create& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_create& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_create& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_plotnft_create& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_plotnft_create_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_plotnft_create_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_create_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_plotnft_create_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_create_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_create_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_plotnft_create_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_plotnft_exec> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_plotnft_exec& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_exec& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_plotnft_exec& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_exec& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_exec& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_plotnft_exec& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_plotnft_exec_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_plotnft_exec_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_exec_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_plotnft_exec_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_exec_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_exec_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_plotnft_exec_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_release> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_release& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_release& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_release& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_release& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_release& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_release& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_release_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_release_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_release_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_release_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_release_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_release_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_release_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_release_all> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_release_all& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_release_all& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_release_all& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_release_all& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_release_all& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_release_all& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_release_all_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_release_all_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_release_all_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_release_all_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_release_all_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_release_all_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_release_all_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_rem_token> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_rem_token& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_rem_token& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_rem_token& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_rem_token& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_rem_token& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_rem_token& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_rem_token_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_rem_token_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_rem_token_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_rem_token_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_rem_token_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_rem_token_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_rem_token_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_remove_account> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_remove_account& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_remove_account& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_remove_account& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_remove_account& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_remove_account& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_remove_account& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_remove_account_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_remove_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_remove_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_remove_account_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_remove_account_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_remove_account_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_remove_account_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_reserve> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_reserve& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_reserve& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_reserve& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_reserve& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_reserve& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_reserve& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_reserve_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_reserve_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_reserve_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_reserve_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_reserve_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_reserve_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_reserve_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_reset_cache> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_reset_cache& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_reset_cache& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_reset_cache& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_reset_cache& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_reset_cache& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_reset_cache& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_reset_cache_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_reset_cache_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_reset_cache_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_reset_cache_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_reset_cache_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_reset_cache_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_reset_cache_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_send> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_send& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_send& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_send& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_send& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_send& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_send_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_send_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_send_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_send_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_send_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_send_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_send_from> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_send_from& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_send_from& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_send_from& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_send_from& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_send_from& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_from& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_send_from_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_send_from_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_send_from_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_send_from_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_send_from_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_send_from_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_from_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_send_many> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_send_many& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_send_many& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_send_many& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_send_many& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_send_many& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_many& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_send_many_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_send_many_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_send_many_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_send_many_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_send_many_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_send_many_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_many_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_send_off> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_send_off& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_send_off& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_send_off& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_send_off& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_send_off& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_off& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_send_off_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_send_off_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_send_off_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_send_off_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_send_off_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_send_off_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_off_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_set_address_count> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_set_address_count& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_set_address_count& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_set_address_count& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_set_address_count& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_set_address_count& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_set_address_count& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_set_address_count_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_set_address_count_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_set_address_count_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_set_address_count_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_set_address_count_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_set_address_count_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_set_address_count_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_sign_msg> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_sign_msg& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_sign_msg& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_sign_msg& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_sign_msg& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_msg& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_sign_msg& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_sign_msg_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_sign_msg_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_sign_msg_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_msg_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_sign_msg_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_sign_off> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_sign_off& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_sign_off& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_sign_off& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_sign_off& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_off& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_sign_off& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_sign_off_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_sign_off_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_sign_off_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_sign_off_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_sign_off_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_off_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_sign_off_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_swap_add_liquid> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_swap_add_liquid& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_swap_add_liquid& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_swap_add_liquid& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_swap_add_liquid& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_add_liquid& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_add_liquid& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_swap_add_liquid_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_swap_add_liquid_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_swap_add_liquid_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_swap_add_liquid_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_swap_add_liquid_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_add_liquid_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_add_liquid_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_swap_rem_liquid> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_swap_rem_liquid& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_swap_rem_liquid& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_swap_rem_liquid& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_swap_rem_liquid& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_rem_liquid& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_rem_liquid& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_swap_rem_liquid_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_swap_rem_liquid_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_swap_rem_liquid_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_swap_rem_liquid_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_swap_rem_liquid_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_rem_liquid_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_rem_liquid_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_swap_trade> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_swap_trade& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_swap_trade& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_swap_trade& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_swap_trade& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_trade& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_trade& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_swap_trade_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_swap_trade_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_swap_trade_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_swap_trade_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_swap_trade_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_trade_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_trade_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_unlock> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_unlock& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_unlock& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_unlock& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_unlock& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_unlock& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_unlock& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_unlock_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_unlock_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_unlock_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_unlock_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_unlock_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_unlock_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_unlock_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_update_cache> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_update_cache& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_update_cache& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_update_cache& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_update_cache& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_update_cache& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_update_cache& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::Wallet_update_cache_return> {\n\tvoid read(TypeInput& in, ::mmx::Wallet_update_cache_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::Wallet_update_cache_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::Wallet_update_cache_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::Wallet_update_cache_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::Wallet_update_cache_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_update_cache_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::WalletFile> {\n\tvoid read(TypeInput& in, ::mmx::WalletFile& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::WalletFile& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::WalletFile& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::WalletFile& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::WalletFile& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::WalletFile& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::WebAPIBase> {\n\tvoid read(TypeInput& in, ::mmx::WebAPIBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::WebAPIBase& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::WebAPIBase& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::WebAPIBase& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::WebAPIBase& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::WebAPI_shutdown> {\n\tvoid read(TypeInput& in, ::mmx::WebAPI_shutdown& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::WebAPI_shutdown& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::WebAPI_shutdown& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::WebAPI_shutdown& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::WebAPI_shutdown& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::WebAPI_shutdown& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::WebAPI_shutdown_return> {\n\tvoid read(TypeInput& in, ::mmx::WebAPI_shutdown_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::WebAPI_shutdown_return& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::WebAPI_shutdown_return& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::WebAPI_shutdown_return& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::WebAPI_shutdown_return& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::WebAPI_shutdown_return& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::account_info_t> {\n\tvoid read(TypeInput& in, ::mmx::account_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::account_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::account_info_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::account_info_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::account_info_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::account_info_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::account_t> {\n\tvoid read(TypeInput& in, ::mmx::account_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::account_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::account_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::account_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::account_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::account_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::addr_t> {\n\tvoid read(TypeInput& in, ::mmx::addr_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::addr_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::addr_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::addr_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::addr_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::addr_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::balance_t> {\n\tvoid read(TypeInput& in, ::mmx::balance_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::balance_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::balance_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::balance_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::balance_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::balance_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::block_index_t> {\n\tvoid read(TypeInput& in, ::mmx::block_index_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::block_index_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::block_index_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::block_index_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::block_index_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::block_index_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::compile_flags_t> {\n\tvoid read(TypeInput& in, ::mmx::compile_flags_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::compile_flags_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::compile_flags_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::compile_flags_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::compile_flags_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::compile_flags_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::error_code_e> {\n\tvoid read(TypeInput& in, ::mmx::error_code_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::error_code_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::error_code_e& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::error_code_e& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::error_code_e& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::error_code_e& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::exec_entry_t> {\n\tvoid read(TypeInput& in, ::mmx::exec_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::exec_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::exec_entry_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::exec_entry_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::exec_entry_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::exec_entry_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::exec_error_t> {\n\tvoid read(TypeInput& in, ::mmx::exec_error_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::exec_error_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::exec_error_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::exec_error_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::exec_error_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::exec_error_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::exec_result_t> {\n\tvoid read(TypeInput& in, ::mmx::exec_result_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::exec_result_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::exec_result_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::exec_result_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::exec_result_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::exec_result_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::farmed_block_info_t> {\n\tvoid read(TypeInput& in, ::mmx::farmed_block_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::farmed_block_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::farmed_block_info_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::farmed_block_info_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::farmed_block_info_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::farmed_block_info_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::farmed_block_summary_t> {\n\tvoid read(TypeInput& in, ::mmx::farmed_block_summary_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::farmed_block_summary_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::farmed_block_summary_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::farmed_block_summary_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::farmed_block_summary_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::farmed_block_summary_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::fixed128> {\n\tvoid read(TypeInput& in, ::mmx::fixed128& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::fixed128& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::fixed128& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::fixed128& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::fixed128& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::fixed128& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::hash_512_t> {\n\tvoid read(TypeInput& in, ::mmx::hash_512_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::hash_512_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::hash_512_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::hash_512_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::hash_512_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::hash_512_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::hash_t> {\n\tvoid read(TypeInput& in, ::mmx::hash_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::hash_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::hash_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::hash_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::hash_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::hash_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::node_info_t> {\n\tvoid read(TypeInput& in, ::mmx::node_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::node_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::node_info_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::node_info_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::node_info_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::node_info_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::node_type_e> {\n\tvoid read(TypeInput& in, ::mmx::node_type_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::node_type_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::node_type_e& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::node_type_e& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::node_type_e& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::node_type_e& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::offer_data_t> {\n\tvoid read(TypeInput& in, ::mmx::offer_data_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::offer_data_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::offer_data_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::offer_data_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::offer_data_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::offer_data_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::peer_info_t> {\n\tvoid read(TypeInput& in, ::mmx::peer_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::peer_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::peer_info_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::peer_info_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::peer_info_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::peer_info_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::permission_e> {\n\tvoid read(TypeInput& in, ::mmx::permission_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::permission_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::permission_e& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::permission_e& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::permission_e& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::permission_e& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::plot_nft_info_t> {\n\tvoid read(TypeInput& in, ::mmx::plot_nft_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::plot_nft_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::plot_nft_info_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::plot_nft_info_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::plot_nft_info_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::plot_nft_info_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::pooling_error_e> {\n\tvoid read(TypeInput& in, ::mmx::pooling_error_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::pooling_error_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::pooling_error_e& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::pooling_error_e& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::pooling_error_e& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::pooling_error_e& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::pooling_info_t> {\n\tvoid read(TypeInput& in, ::mmx::pooling_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::pooling_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::pooling_info_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::pooling_info_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::pooling_info_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::pooling_info_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::pooling_stats_t> {\n\tvoid read(TypeInput& in, ::mmx::pooling_stats_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::pooling_stats_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::pooling_stats_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::pooling_stats_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::pooling_stats_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::pooling_stats_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::pubkey_t> {\n\tvoid read(TypeInput& in, ::mmx::pubkey_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::pubkey_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::pubkey_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::pubkey_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::pubkey_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::pubkey_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::query_filter_t> {\n\tvoid read(TypeInput& in, ::mmx::query_filter_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::query_filter_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::query_filter_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::query_filter_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::query_filter_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::query_filter_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::signature_t> {\n\tvoid read(TypeInput& in, ::mmx::signature_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::signature_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::signature_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::signature_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::signature_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::signature_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::skey_t> {\n\tvoid read(TypeInput& in, ::mmx::skey_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::skey_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::skey_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::skey_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::skey_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::skey_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::spend_options_t> {\n\tvoid read(TypeInput& in, ::mmx::spend_options_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::spend_options_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::spend_options_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::spend_options_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::spend_options_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::spend_options_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::swap_entry_t> {\n\tvoid read(TypeInput& in, ::mmx::swap_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::swap_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::swap_entry_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::swap_entry_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::swap_entry_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::swap_entry_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::swap_info_t> {\n\tvoid read(TypeInput& in, ::mmx::swap_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::swap_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::swap_info_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::swap_info_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::swap_info_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::swap_info_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::swap_pool_info_t> {\n\tvoid read(TypeInput& in, ::mmx::swap_pool_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::swap_pool_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::swap_pool_info_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::swap_pool_info_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::swap_pool_info_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::swap_pool_info_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::swap_user_info_t> {\n\tvoid read(TypeInput& in, ::mmx::swap_user_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::swap_user_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::swap_user_info_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::swap_user_info_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::swap_user_info_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::swap_user_info_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::table_entry_t> {\n\tvoid read(TypeInput& in, ::mmx::table_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::table_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::table_entry_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::table_entry_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::table_entry_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::table_entry_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::trade_entry_t> {\n\tvoid read(TypeInput& in, ::mmx::trade_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::trade_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::trade_entry_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::trade_entry_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::trade_entry_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::trade_entry_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::trade_log_t> {\n\tvoid read(TypeInput& in, ::mmx::trade_log_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::trade_log_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::trade_log_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::trade_log_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::trade_log_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::trade_log_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::tx_entry_t> {\n\tvoid read(TypeInput& in, ::mmx::tx_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::tx_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::tx_entry_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::tx_entry_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::tx_entry_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_entry_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::tx_index_t> {\n\tvoid read(TypeInput& in, ::mmx::tx_index_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::tx_index_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::tx_index_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::tx_index_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::tx_index_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_index_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::tx_info_t> {\n\tvoid read(TypeInput& in, ::mmx::tx_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::tx_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::tx_info_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::tx_info_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::tx_info_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_info_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::tx_log_entry_t> {\n\tvoid read(TypeInput& in, ::mmx::tx_log_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::tx_log_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::tx_log_entry_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::tx_log_entry_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::tx_log_entry_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_log_entry_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::tx_note_e> {\n\tvoid read(TypeInput& in, ::mmx::tx_note_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::tx_note_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::tx_note_e& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::tx_note_e& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::tx_note_e& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_note_e& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::tx_type_e> {\n\tvoid read(TypeInput& in, ::mmx::tx_type_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::tx_type_e& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::tx_type_e& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::tx_type_e& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::tx_type_e& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_type_e& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::txin_t> {\n\tvoid read(TypeInput& in, ::mmx::txin_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::txin_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::txin_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::txin_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::txin_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::txin_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::txio_entry_t> {\n\tvoid read(TypeInput& in, ::mmx::txio_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::txio_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::txio_entry_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::txio_entry_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::txio_entry_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::txio_entry_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::txio_t> {\n\tvoid read(TypeInput& in, ::mmx::txio_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::txio_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::txio_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::txio_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::txio_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::txio_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::txout_t> {\n\tvoid read(TypeInput& in, ::mmx::txout_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::txout_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::txout_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::txout_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::txout_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::txout_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::uint128> {\n\tvoid read(TypeInput& in, ::mmx::uint128& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::uint128& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::uint128& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::uint128& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::uint128& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::uint128& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::uint_fraction_t> {\n\tvoid read(TypeInput& in, ::mmx::uint_fraction_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::uint_fraction_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::uint_fraction_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::uint_fraction_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::uint_fraction_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::uint_fraction_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::ulong_fraction_t> {\n\tvoid read(TypeInput& in, ::mmx::ulong_fraction_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::ulong_fraction_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::ulong_fraction_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::ulong_fraction_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::ulong_fraction_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ulong_fraction_t& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::virtual_plot_info_t> {\n\tvoid read(TypeInput& in, ::mmx::virtual_plot_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::virtual_plot_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::virtual_plot_info_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::virtual_plot_info_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::virtual_plot_info_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::virtual_plot_info_t& value, bool special = false);\n};\n\n\n} // namespace vnx\n\n#endif // INCLUDE_mmx_PACKAGE_HXX_\n"
  },
  {
    "path": "generated/include/mmx/peer_info_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_peer_info_t_HXX_\n#define INCLUDE_mmx_peer_info_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/node_type_e.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT peer_info_t : vnx::struct_t {\n\t\n\t\n\tuint64_t id = 0;\n\tstd::string address;\n\t::mmx::node_type_e type;\n\tint32_t ping_ms = 0;\n\tuint32_t height = 0;\n\tuint32_t version = 0;\n\tint64_t recv_timeout_ms = 0;\n\tint64_t connect_time_ms = 0;\n\tuint64_t bytes_send = 0;\n\tuint64_t bytes_recv = 0;\n\tvnx::float64_t pending_cost = 0;\n\tvnx::float64_t compression_ratio = 0;\n\tvnx::bool_t is_synced = 0;\n\tvnx::bool_t is_paused = 0;\n\tvnx::bool_t is_blocked = 0;\n\tvnx::bool_t is_outbound = 0;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xce0ff32e89625afbull;\n\t\n\tpeer_info_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<peer_info_t> create();\n\tstd::shared_ptr<peer_info_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const peer_info_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, peer_info_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid peer_info_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<peer_info_t>(16);\n\t_visitor.type_field(\"id\", 0); _visitor.accept(id);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"type\", 2); _visitor.accept(type);\n\t_visitor.type_field(\"ping_ms\", 3); _visitor.accept(ping_ms);\n\t_visitor.type_field(\"height\", 4); _visitor.accept(height);\n\t_visitor.type_field(\"version\", 5); _visitor.accept(version);\n\t_visitor.type_field(\"recv_timeout_ms\", 6); _visitor.accept(recv_timeout_ms);\n\t_visitor.type_field(\"connect_time_ms\", 7); _visitor.accept(connect_time_ms);\n\t_visitor.type_field(\"bytes_send\", 8); _visitor.accept(bytes_send);\n\t_visitor.type_field(\"bytes_recv\", 9); _visitor.accept(bytes_recv);\n\t_visitor.type_field(\"pending_cost\", 10); _visitor.accept(pending_cost);\n\t_visitor.type_field(\"compression_ratio\", 11); _visitor.accept(compression_ratio);\n\t_visitor.type_field(\"is_synced\", 12); _visitor.accept(is_synced);\n\t_visitor.type_field(\"is_paused\", 13); _visitor.accept(is_paused);\n\t_visitor.type_field(\"is_blocked\", 14); _visitor.accept(is_blocked);\n\t_visitor.type_field(\"is_outbound\", 15); _visitor.accept(is_outbound);\n\t_visitor.template type_end<peer_info_t>(16);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::peer_info_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_peer_info_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/permission_e.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_permission_e_HXX_\n#define INCLUDE_mmx_permission_e_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT permission_e {\n\t\n\tenum enum_t : uint32_t {\n\t\tPUBLIC = 2166575688l,\n\t\tREMOTE = 412167022l,\n\t\tSIGN_BLOCK = 1091809605l,\n\t\tSPENDING = 1957258863l,\n\t};\n\t\n\t::mmx::permission_e::enum_t value = ::mmx::permission_e::enum_t(0);\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x7d75a3f04c313898ull;\n\t\n\tpermission_e() {}\n\t\n\tpermission_e(const enum_t& _value) { value = _value; }\n\tpermission_e(const ::mmx::permission_e& _other) { value = _other.value; }\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\toperator enum_t() const { return value; }\n\tpermission_e& operator=(const enum_t& _value) { value = _value; return *this; }\n\tpermission_e& operator=(const ::mmx::permission_e& _other) { value = _other.value; return *this; }\n\t\n\tstatic std::shared_ptr<permission_e> create();\n\tstd::shared_ptr<permission_e> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::bool_t is_valid() const;\n\tstd::string to_string() const;\n\tstd::string to_string_value() const;\n\tstd::string to_string_value_full() const;\n\t\n\tvoid from_string(const std::string& str);\n\tvoid from_string_value(const std::string& name);\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const permission_e& _value);\n\tfriend std::istream& operator>>(std::istream& _in, permission_e& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid permission_e::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<permission_e>(1);\n\t_visitor.type_field(\"value\", 0); _visitor.accept(value);\n\t_visitor.template type_end<permission_e>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::permission_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid write(TypeOutput& out, const ::mmx::permission_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::permission_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::permission_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::permission_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::permission_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::permission_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::permission_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstruct is_equivalent<::mmx::permission_e> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_permission_e_HXX_\n"
  },
  {
    "path": "generated/include/mmx/plot_nft_info_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_plot_nft_info_t_HXX_\n#define INCLUDE_mmx_plot_nft_info_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT plot_nft_info_t : vnx::struct_t {\n\t\n\t\n\tstd::string name;\n\t::mmx::addr_t owner;\n\t::mmx::addr_t address;\n\tvnx::bool_t is_locked = 0;\n\tvnx::optional<::mmx::addr_t> target;\n\tvnx::optional<uint32_t> unlock_height;\n\tvnx::optional<std::string> server_url;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xf8e0b44f3c0a54aeull;\n\t\n\tplot_nft_info_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<plot_nft_info_t> create();\n\tstd::shared_ptr<plot_nft_info_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const plot_nft_info_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, plot_nft_info_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid plot_nft_info_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<plot_nft_info_t>(7);\n\t_visitor.type_field(\"name\", 0); _visitor.accept(name);\n\t_visitor.type_field(\"owner\", 1); _visitor.accept(owner);\n\t_visitor.type_field(\"address\", 2); _visitor.accept(address);\n\t_visitor.type_field(\"is_locked\", 3); _visitor.accept(is_locked);\n\t_visitor.type_field(\"target\", 4); _visitor.accept(target);\n\t_visitor.type_field(\"unlock_height\", 5); _visitor.accept(unlock_height);\n\t_visitor.type_field(\"server_url\", 6); _visitor.accept(server_url);\n\t_visitor.template type_end<plot_nft_info_t>(7);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::plot_nft_info_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_plot_nft_info_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/pooling_error_e.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_pooling_error_e_HXX_\n#define INCLUDE_mmx_pooling_error_e_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT pooling_error_e {\n\t\n\tenum enum_t : uint32_t {\n\t\tCHALLENGE_NOT_CONFIRMED = 1645788267l,\n\t\tCHALLENGE_NOT_FOUND = 471927302l,\n\t\tCHALLENGE_REVERTED = 1760085717l,\n\t\tDUPLICATE_PARTIAL = 271202490l,\n\t\tINVALID_ACCOUNT = 3369359198l,\n\t\tINVALID_AUTH_KEY = 1953340654l,\n\t\tINVALID_CONTRACT = 914919857l,\n\t\tINVALID_DIFFICULTY = 1883406896l,\n\t\tINVALID_PARTIAL = 405897781l,\n\t\tINVALID_PROOF = 3117556933l,\n\t\tINVALID_SIGNATURE = 3529800621l,\n\t\tINVALID_TIMESTAMP = 2157722321l,\n\t\tNONE = 0l,\n\t\tPARTIAL_NOT_GOOD_ENOUGH = 1161496011l,\n\t\tPARTIAL_TOO_LATE = 2832488076l,\n\t\tPOOL_LOST_SYNC = 1324712875l,\n\t\tSERVER_ERROR = 2095599592l,\n\t};\n\t\n\t::mmx::pooling_error_e::enum_t value = ::mmx::pooling_error_e::enum_t(0);\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xec786b877a93f17ull;\n\t\n\tpooling_error_e() {}\n\t\n\tpooling_error_e(const enum_t& _value) { value = _value; }\n\tpooling_error_e(const ::mmx::pooling_error_e& _other) { value = _other.value; }\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\toperator enum_t() const { return value; }\n\tpooling_error_e& operator=(const enum_t& _value) { value = _value; return *this; }\n\tpooling_error_e& operator=(const ::mmx::pooling_error_e& _other) { value = _other.value; return *this; }\n\t\n\tstatic std::shared_ptr<pooling_error_e> create();\n\tstd::shared_ptr<pooling_error_e> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::bool_t is_valid() const;\n\tstd::string to_string() const;\n\tstd::string to_string_value() const;\n\tstd::string to_string_value_full() const;\n\t\n\tvoid from_string(const std::string& str);\n\tvoid from_string_value(const std::string& name);\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const pooling_error_e& _value);\n\tfriend std::istream& operator>>(std::istream& _in, pooling_error_e& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid pooling_error_e::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<pooling_error_e>(1);\n\t_visitor.type_field(\"value\", 0); _visitor.accept(value);\n\t_visitor.template type_end<pooling_error_e>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::pooling_error_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid write(TypeOutput& out, const ::mmx::pooling_error_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::pooling_error_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::pooling_error_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::pooling_error_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::pooling_error_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::pooling_error_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::pooling_error_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstruct is_equivalent<::mmx::pooling_error_e> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_pooling_error_e_HXX_\n"
  },
  {
    "path": "generated/include/mmx/pooling_info_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_pooling_info_t_HXX_\n#define INCLUDE_mmx_pooling_info_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT pooling_info_t : vnx::struct_t {\n\t\n\t\n\t::mmx::addr_t contract;\n\tvnx::optional<std::string> name;\n\tvnx::optional<std::string> server_url;\n\tvnx::optional<::mmx::addr_t> pool_target;\n\tuint64_t partial_diff = 0;\n\tuint32_t plot_count = 0;\n\tvnx::bool_t is_plot_nft = 0;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xbddcc977498f516full;\n\t\n\tpooling_info_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<pooling_info_t> create();\n\tstd::shared_ptr<pooling_info_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const pooling_info_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, pooling_info_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid pooling_info_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<pooling_info_t>(7);\n\t_visitor.type_field(\"contract\", 0); _visitor.accept(contract);\n\t_visitor.type_field(\"name\", 1); _visitor.accept(name);\n\t_visitor.type_field(\"server_url\", 2); _visitor.accept(server_url);\n\t_visitor.type_field(\"pool_target\", 3); _visitor.accept(pool_target);\n\t_visitor.type_field(\"partial_diff\", 4); _visitor.accept(partial_diff);\n\t_visitor.type_field(\"plot_count\", 5); _visitor.accept(plot_count);\n\t_visitor.type_field(\"is_plot_nft\", 6); _visitor.accept(is_plot_nft);\n\t_visitor.template type_end<pooling_info_t>(7);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::pooling_info_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_pooling_info_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/pooling_stats_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_pooling_stats_t_HXX_\n#define INCLUDE_mmx_pooling_stats_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/pooling_error_e.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT pooling_stats_t : vnx::struct_t {\n\t\n\t\n\tstd::string server_url;\n\tuint64_t partial_diff = 0;\n\tuint64_t valid_points = 0;\n\tuint64_t failed_points = 0;\n\tuint32_t total_partials = 0;\n\tint64_t total_response_time = 0;\n\tint64_t last_partial = 0;\n\tstd::map<::mmx::pooling_error_e, uint32_t> error_count;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xb2441a254359df11ull;\n\t\n\tpooling_stats_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<pooling_stats_t> create();\n\tstd::shared_ptr<pooling_stats_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const pooling_stats_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, pooling_stats_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid pooling_stats_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<pooling_stats_t>(8);\n\t_visitor.type_field(\"server_url\", 0); _visitor.accept(server_url);\n\t_visitor.type_field(\"partial_diff\", 1); _visitor.accept(partial_diff);\n\t_visitor.type_field(\"valid_points\", 2); _visitor.accept(valid_points);\n\t_visitor.type_field(\"failed_points\", 3); _visitor.accept(failed_points);\n\t_visitor.type_field(\"total_partials\", 4); _visitor.accept(total_partials);\n\t_visitor.type_field(\"total_response_time\", 5); _visitor.accept(total_response_time);\n\t_visitor.type_field(\"last_partial\", 6); _visitor.accept(last_partial);\n\t_visitor.type_field(\"error_count\", 7); _visitor.accept(error_count);\n\t_visitor.template type_end<pooling_stats_t>(8);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::pooling_stats_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_pooling_stats_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/query_filter_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_query_filter_t_HXX_\n#define INCLUDE_mmx_query_filter_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/tx_type_e.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT query_filter_t : vnx::struct_t {\n\t\n\t\n\tuint32_t since = 0;\n\tuint32_t until = -1;\n\tint32_t limit = -1;\n\tuint32_t max_search = 0;\n\tstd::set<::mmx::addr_t> currency;\n\tvnx::optional<::mmx::tx_type_e> type;\n\tvnx::optional<std::string> memo;\n\tvnx::bool_t white_list = 0;\n\tvnx::bool_t with_pending = 0;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x92b02006aeea9a76ull;\n\t\n\tquery_filter_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<query_filter_t> create();\n\tstd::shared_ptr<query_filter_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const query_filter_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, query_filter_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid query_filter_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<query_filter_t>(9);\n\t_visitor.type_field(\"since\", 0); _visitor.accept(since);\n\t_visitor.type_field(\"until\", 1); _visitor.accept(until);\n\t_visitor.type_field(\"limit\", 2); _visitor.accept(limit);\n\t_visitor.type_field(\"max_search\", 3); _visitor.accept(max_search);\n\t_visitor.type_field(\"currency\", 4); _visitor.accept(currency);\n\t_visitor.type_field(\"type\", 5); _visitor.accept(type);\n\t_visitor.type_field(\"memo\", 6); _visitor.accept(memo);\n\t_visitor.type_field(\"white_list\", 7); _visitor.accept(white_list);\n\t_visitor.type_field(\"with_pending\", 8); _visitor.accept(with_pending);\n\t_visitor.template type_end<query_filter_t>(9);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::query_filter_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_query_filter_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/spend_options_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_spend_options_t_HXX_\n#define INCLUDE_mmx_spend_options_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/tx_note_e.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT spend_options_t : vnx::struct_t {\n\t\n\t\n\tvnx::bool_t auto_send = true;\n\tvnx::bool_t mark_spent = false;\n\tuint32_t fee_ratio = 1024;\n\tuint32_t gas_limit = 5000000;\n\tvnx::optional<uint32_t> expire_at;\n\tvnx::optional<uint32_t> expire_delta;\n\tvnx::optional<uint64_t> nonce;\n\tvnx::optional<::mmx::addr_t> user;\n\tvnx::optional<::mmx::addr_t> sender;\n\tvnx::optional<std::string> passphrase;\n\tvnx::optional<::mmx::tx_note_e> note;\n\tvnx::optional<std::string> memo;\n\tstd::map<::mmx::addr_t, ::mmx::addr_t> owner_map;\n\tstd::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>> contract_map;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x37f7c6d377362e95ull;\n\t\n\tspend_options_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<spend_options_t> create();\n\tstd::shared_ptr<spend_options_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const spend_options_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, spend_options_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid spend_options_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<spend_options_t>(14);\n\t_visitor.type_field(\"auto_send\", 0); _visitor.accept(auto_send);\n\t_visitor.type_field(\"mark_spent\", 1); _visitor.accept(mark_spent);\n\t_visitor.type_field(\"fee_ratio\", 2); _visitor.accept(fee_ratio);\n\t_visitor.type_field(\"gas_limit\", 3); _visitor.accept(gas_limit);\n\t_visitor.type_field(\"expire_at\", 4); _visitor.accept(expire_at);\n\t_visitor.type_field(\"expire_delta\", 5); _visitor.accept(expire_delta);\n\t_visitor.type_field(\"nonce\", 6); _visitor.accept(nonce);\n\t_visitor.type_field(\"user\", 7); _visitor.accept(user);\n\t_visitor.type_field(\"sender\", 8); _visitor.accept(sender);\n\t_visitor.type_field(\"passphrase\", 9); _visitor.accept(passphrase);\n\t_visitor.type_field(\"note\", 10); _visitor.accept(note);\n\t_visitor.type_field(\"memo\", 11); _visitor.accept(memo);\n\t_visitor.type_field(\"owner_map\", 12); _visitor.accept(owner_map);\n\t_visitor.type_field(\"contract_map\", 13); _visitor.accept(contract_map);\n\t_visitor.template type_end<spend_options_t>(14);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::spend_options_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_spend_options_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/swap_entry_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_swap_entry_t_HXX_\n#define INCLUDE_mmx_swap_entry_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/uint128.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT swap_entry_t : vnx::struct_t {\n\t\n\t\n\tuint32_t height = 0;\n\tint64_t time_stamp = 0;\n\t::mmx::hash_t txid;\n\tstd::string type;\n\tuint8_t index = 0;\n\t::mmx::uint128 amount;\n\tvnx::optional<vnx::float64_t> value;\n\tvnx::optional<std::string> symbol;\n\tvnx::optional<::mmx::addr_t> user;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe3110712aa0f6064ull;\n\t\n\tswap_entry_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<swap_entry_t> create();\n\tstd::shared_ptr<swap_entry_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const swap_entry_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, swap_entry_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid swap_entry_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<swap_entry_t>(9);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.type_field(\"time_stamp\", 1); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"txid\", 2); _visitor.accept(txid);\n\t_visitor.type_field(\"type\", 3); _visitor.accept(type);\n\t_visitor.type_field(\"index\", 4); _visitor.accept(index);\n\t_visitor.type_field(\"amount\", 5); _visitor.accept(amount);\n\t_visitor.type_field(\"value\", 6); _visitor.accept(value);\n\t_visitor.type_field(\"symbol\", 7); _visitor.accept(symbol);\n\t_visitor.type_field(\"user\", 8); _visitor.accept(user);\n\t_visitor.template type_end<swap_entry_t>(9);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::swap_entry_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_swap_entry_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/swap_info_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_swap_info_t_HXX_\n#define INCLUDE_mmx_swap_info_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/swap_pool_info_t.hxx>\n#include <mmx/uint128.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT swap_info_t : vnx::struct_t {\n\t\n\t\n\tstd::string name;\n\t::mmx::addr_t address;\n\tstd::array<::mmx::addr_t, 2> tokens = {};\n\tstd::array<::mmx::uint128, 2> wallet = {};\n\tstd::array<::mmx::uint128, 2> balance = {};\n\tstd::array<::mmx::uint128, 2> volume = {};\n\tstd::array<::mmx::uint128, 2> fees_paid = {};\n\tstd::array<::mmx::uint128, 2> fees_claimed = {};\n\tstd::array<::mmx::uint128, 2> user_total = {};\n\tstd::array<::mmx::uint128, 2> volume_1d = {};\n\tstd::array<::mmx::uint128, 2> volume_7d = {};\n\tstd::array<vnx::float64_t, 2> avg_apy_1d = {};\n\tstd::array<vnx::float64_t, 2> avg_apy_7d = {};\n\tstd::vector<vnx::float64_t> fee_rates;\n\tstd::vector<::mmx::swap_pool_info_t> pools;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x7586be908f15ae8ull;\n\t\n\tswap_info_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<swap_info_t> create();\n\tstd::shared_ptr<swap_info_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const swap_info_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, swap_info_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid swap_info_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<swap_info_t>(15);\n\t_visitor.type_field(\"name\", 0); _visitor.accept(name);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"tokens\", 2); _visitor.accept(tokens);\n\t_visitor.type_field(\"wallet\", 3); _visitor.accept(wallet);\n\t_visitor.type_field(\"balance\", 4); _visitor.accept(balance);\n\t_visitor.type_field(\"volume\", 5); _visitor.accept(volume);\n\t_visitor.type_field(\"fees_paid\", 6); _visitor.accept(fees_paid);\n\t_visitor.type_field(\"fees_claimed\", 7); _visitor.accept(fees_claimed);\n\t_visitor.type_field(\"user_total\", 8); _visitor.accept(user_total);\n\t_visitor.type_field(\"volume_1d\", 9); _visitor.accept(volume_1d);\n\t_visitor.type_field(\"volume_7d\", 10); _visitor.accept(volume_7d);\n\t_visitor.type_field(\"avg_apy_1d\", 11); _visitor.accept(avg_apy_1d);\n\t_visitor.type_field(\"avg_apy_7d\", 12); _visitor.accept(avg_apy_7d);\n\t_visitor.type_field(\"fee_rates\", 13); _visitor.accept(fee_rates);\n\t_visitor.type_field(\"pools\", 14); _visitor.accept(pools);\n\t_visitor.template type_end<swap_info_t>(15);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::swap_info_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_swap_info_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/swap_pool_info_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_swap_pool_info_t_HXX_\n#define INCLUDE_mmx_swap_pool_info_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/uint128.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT swap_pool_info_t : vnx::struct_t {\n\t\n\t\n\tstd::array<::mmx::uint128, 2> balance = {};\n\tstd::array<::mmx::uint128, 2> fees_paid = {};\n\tstd::array<::mmx::uint128, 2> fees_claimed = {};\n\tstd::array<::mmx::uint128, 2> user_total = {};\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x6502e235a743dabull;\n\t\n\tswap_pool_info_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<swap_pool_info_t> create();\n\tstd::shared_ptr<swap_pool_info_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const swap_pool_info_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, swap_pool_info_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid swap_pool_info_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<swap_pool_info_t>(4);\n\t_visitor.type_field(\"balance\", 0); _visitor.accept(balance);\n\t_visitor.type_field(\"fees_paid\", 1); _visitor.accept(fees_paid);\n\t_visitor.type_field(\"fees_claimed\", 2); _visitor.accept(fees_claimed);\n\t_visitor.type_field(\"user_total\", 3); _visitor.accept(user_total);\n\t_visitor.template type_end<swap_pool_info_t>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::swap_pool_info_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_swap_pool_info_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/swap_user_info_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_swap_user_info_t_HXX_\n#define INCLUDE_mmx_swap_user_info_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/uint128.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT swap_user_info_t : vnx::struct_t {\n\t\n\t\n\tint32_t pool_idx = -1;\n\tstd::array<::mmx::uint128, 2> balance = {};\n\tstd::array<::mmx::uint128, 2> last_user_total = {};\n\tstd::array<::mmx::uint128, 2> last_fees_paid = {};\n\tstd::array<::mmx::uint128, 2> fees_earned = {};\n\tstd::array<::mmx::uint128, 2> equivalent_liquidity = {};\n\tuint32_t unlock_height = 0;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x1b6c720bff2d638cull;\n\t\n\tswap_user_info_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<swap_user_info_t> create();\n\tstd::shared_ptr<swap_user_info_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const swap_user_info_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, swap_user_info_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid swap_user_info_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<swap_user_info_t>(7);\n\t_visitor.type_field(\"pool_idx\", 0); _visitor.accept(pool_idx);\n\t_visitor.type_field(\"balance\", 1); _visitor.accept(balance);\n\t_visitor.type_field(\"last_user_total\", 2); _visitor.accept(last_user_total);\n\t_visitor.type_field(\"last_fees_paid\", 3); _visitor.accept(last_fees_paid);\n\t_visitor.type_field(\"fees_earned\", 4); _visitor.accept(fees_earned);\n\t_visitor.type_field(\"equivalent_liquidity\", 5); _visitor.accept(equivalent_liquidity);\n\t_visitor.type_field(\"unlock_height\", 6); _visitor.accept(unlock_height);\n\t_visitor.template type_end<swap_user_info_t>(7);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::swap_user_info_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_swap_user_info_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/table_entry_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_table_entry_t_HXX_\n#define INCLUDE_mmx_table_entry_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT table_entry_t : vnx::struct_t {\n\t\n\t\n\tuint32_t y = 0;\n\tstd::array<uint8_t, 48> meta = {};\n\tstd::vector<uint32_t> x_values;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x9bdbee40872de9a7ull;\n\t\n\ttable_entry_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<table_entry_t> create();\n\tstd::shared_ptr<table_entry_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const table_entry_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, table_entry_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid table_entry_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<table_entry_t>(3);\n\t_visitor.type_field(\"y\", 0); _visitor.accept(y);\n\t_visitor.type_field(\"meta\", 1); _visitor.accept(meta);\n\t_visitor.type_field(\"x_values\", 2); _visitor.accept(x_values);\n\t_visitor.template type_end<table_entry_t>(3);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::table_entry_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_table_entry_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/trade_entry_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_trade_entry_t_HXX_\n#define INCLUDE_mmx_trade_entry_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/uint128.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT trade_entry_t : vnx::struct_t {\n\t\n\t\n\tuint32_t height = 0;\n\tint64_t time_stamp = 0;\n\t::mmx::addr_t address;\n\t::mmx::hash_t txid;\n\t::mmx::addr_t bid_currency;\n\t::mmx::addr_t ask_currency;\n\t::mmx::uint128 bid_amount;\n\t::mmx::uint128 ask_amount;\n\tvnx::float64_t price = 0;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xed7d8e67cb8db394ull;\n\t\n\ttrade_entry_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<trade_entry_t> create();\n\tstd::shared_ptr<trade_entry_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const trade_entry_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, trade_entry_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid trade_entry_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<trade_entry_t>(9);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.type_field(\"time_stamp\", 1); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"address\", 2); _visitor.accept(address);\n\t_visitor.type_field(\"txid\", 3); _visitor.accept(txid);\n\t_visitor.type_field(\"bid_currency\", 4); _visitor.accept(bid_currency);\n\t_visitor.type_field(\"ask_currency\", 5); _visitor.accept(ask_currency);\n\t_visitor.type_field(\"bid_amount\", 6); _visitor.accept(bid_amount);\n\t_visitor.type_field(\"ask_amount\", 7); _visitor.accept(ask_amount);\n\t_visitor.type_field(\"price\", 8); _visitor.accept(price);\n\t_visitor.template type_end<trade_entry_t>(9);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::trade_entry_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_trade_entry_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/trade_log_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_trade_log_t_HXX_\n#define INCLUDE_mmx_trade_log_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/uint128.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT trade_log_t : vnx::struct_t {\n\t\n\t\n\tint64_t time_stamp = 0;\n\t::mmx::hash_t txid;\n\t::mmx::addr_t address;\n\t::mmx::uint128 inv_price;\n\t::mmx::uint128 ask_amount;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xafedf6853c645eb8ull;\n\t\n\ttrade_log_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\t::mmx::uint128 get_bid_amount() const;\n\tvnx::float64_t get_price() const;\n\t\n\tstatic std::shared_ptr<trade_log_t> create();\n\tstd::shared_ptr<trade_log_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const trade_log_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, trade_log_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid trade_log_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<trade_log_t>(5);\n\t_visitor.type_field(\"time_stamp\", 0); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"txid\", 1); _visitor.accept(txid);\n\t_visitor.type_field(\"address\", 2); _visitor.accept(address);\n\t_visitor.type_field(\"inv_price\", 3); _visitor.accept(inv_price);\n\t_visitor.type_field(\"ask_amount\", 4); _visitor.accept(ask_amount);\n\t_visitor.template type_end<trade_log_t>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::trade_log_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_trade_log_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/tx_entry_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_tx_entry_t_HXX_\n#define INCLUDE_mmx_tx_entry_t_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/txio_entry_t.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT tx_entry_t : ::mmx::txio_entry_t {\n\t\n\t\n\tvnx::bool_t is_validated = 0;\n\tvnx::bool_t is_pending = 0;\n\t\n\ttypedef ::mmx::txio_entry_t Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x438cda5719015870ull;\n\t\n\ttx_entry_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic ::mmx::tx_entry_t create_ex(const ::mmx::txio_entry_t& entry = ::mmx::txio_entry_t(), const vnx::bool_t& validated = 0);\n\t\n\tstatic std::shared_ptr<tx_entry_t> create();\n\tstd::shared_ptr<tx_entry_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const tx_entry_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, tx_entry_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid tx_entry_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<tx_entry_t>(10);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"contract\", 1); _visitor.accept(contract);\n\t_visitor.type_field(\"amount\", 2); _visitor.accept(amount);\n\t_visitor.type_field(\"memo\", 3); _visitor.accept(memo);\n\t_visitor.type_field(\"txid\", 4); _visitor.accept(txid);\n\t_visitor.type_field(\"height\", 5); _visitor.accept(height);\n\t_visitor.type_field(\"time_stamp\", 6); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"type\", 7); _visitor.accept(type);\n\t_visitor.type_field(\"is_validated\", 8); _visitor.accept(is_validated);\n\t_visitor.type_field(\"is_pending\", 9); _visitor.accept(is_pending);\n\t_visitor.template type_end<tx_entry_t>(10);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::tx_entry_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_tx_entry_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/tx_index_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_tx_index_t_HXX_\n#define INCLUDE_mmx_tx_index_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT tx_index_t : vnx::struct_t {\n\t\n\t\n\tuint32_t height = 0;\n\tuint32_t static_cost = 0;\n\tuint32_t contract_read_cost = 0;\n\tint64_t time_stamp = 0;\n\tint64_t file_offset = 0;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc326e232ee2ebb41ull;\n\t\n\ttx_index_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<tx_index_t> create();\n\tstd::shared_ptr<tx_index_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const tx_index_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, tx_index_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid tx_index_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<tx_index_t>(5);\n\t_visitor.type_field(\"height\", 0); _visitor.accept(height);\n\t_visitor.type_field(\"static_cost\", 1); _visitor.accept(static_cost);\n\t_visitor.type_field(\"contract_read_cost\", 2); _visitor.accept(contract_read_cost);\n\t_visitor.type_field(\"time_stamp\", 3); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"file_offset\", 4); _visitor.accept(file_offset);\n\t_visitor.template type_end<tx_index_t>(5);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::tx_index_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_tx_index_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/tx_info_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_tx_info_t_HXX_\n#define INCLUDE_mmx_tx_info_t_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/Operation.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/tx_note_e.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/txout_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n\nnamespace mmx {\n\nclass MMX_EXPORT tx_info_t : public ::vnx::Value {\npublic:\n\t\n\t::mmx::hash_t id;\n\tuint32_t expires = 0;\n\tvnx::bool_t did_fail = 0;\n\tvnx::optional<uint32_t> height;\n\tvnx::optional<int64_t> time_stamp;\n\tvnx::optional<::mmx::hash_t> block;\n\tvnx::optional<std::string> message;\n\tuint32_t fee = 0;\n\tuint32_t cost = 0;\n\t::mmx::tx_note_e note;\n\tvnx::optional<::mmx::addr_t> sender;\n\tstd::vector<::mmx::txin_t> inputs;\n\tstd::vector<::mmx::txout_t> outputs;\n\tstd::vector<std::shared_ptr<const ::mmx::Operation>> operations;\n\tstd::shared_ptr<const ::mmx::Contract> deployed;\n\tstd::map<::mmx::addr_t, ::mmx::uint128> input_amounts;\n\tstd::map<::mmx::addr_t, ::mmx::uint128> output_amounts;\n\tstd::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>> contracts;\n\t\n\ttypedef ::vnx::Value Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x44e4a710953f4785ull;\n\t\n\ttx_info_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tstatic std::shared_ptr<tx_info_t> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const tx_info_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, tx_info_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid tx_info_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<tx_info_t>(18);\n\t_visitor.type_field(\"id\", 0); _visitor.accept(id);\n\t_visitor.type_field(\"expires\", 1); _visitor.accept(expires);\n\t_visitor.type_field(\"did_fail\", 2); _visitor.accept(did_fail);\n\t_visitor.type_field(\"height\", 3); _visitor.accept(height);\n\t_visitor.type_field(\"time_stamp\", 4); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"block\", 5); _visitor.accept(block);\n\t_visitor.type_field(\"message\", 6); _visitor.accept(message);\n\t_visitor.type_field(\"fee\", 7); _visitor.accept(fee);\n\t_visitor.type_field(\"cost\", 8); _visitor.accept(cost);\n\t_visitor.type_field(\"note\", 9); _visitor.accept(note);\n\t_visitor.type_field(\"sender\", 10); _visitor.accept(sender);\n\t_visitor.type_field(\"inputs\", 11); _visitor.accept(inputs);\n\t_visitor.type_field(\"outputs\", 12); _visitor.accept(outputs);\n\t_visitor.type_field(\"operations\", 13); _visitor.accept(operations);\n\t_visitor.type_field(\"deployed\", 14); _visitor.accept(deployed);\n\t_visitor.type_field(\"input_amounts\", 15); _visitor.accept(input_amounts);\n\t_visitor.type_field(\"output_amounts\", 16); _visitor.accept(output_amounts);\n\t_visitor.type_field(\"contracts\", 17); _visitor.accept(contracts);\n\t_visitor.template type_end<tx_info_t>(18);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_tx_info_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/tx_log_entry_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_tx_log_entry_t_HXX_\n#define INCLUDE_mmx_tx_log_entry_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT tx_log_entry_t : vnx::struct_t {\n\t\n\t\n\tint64_t time = 0;\n\tstd::shared_ptr<const ::mmx::Transaction> tx;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc29d95c24aff8b43ull;\n\t\n\ttx_log_entry_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<tx_log_entry_t> create();\n\tstd::shared_ptr<tx_log_entry_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const tx_log_entry_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, tx_log_entry_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid tx_log_entry_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<tx_log_entry_t>(2);\n\t_visitor.type_field(\"time\", 0); _visitor.accept(time);\n\t_visitor.type_field(\"tx\", 1); _visitor.accept(tx);\n\t_visitor.template type_end<tx_log_entry_t>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::tx_log_entry_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_tx_log_entry_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/tx_note_e.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_tx_note_e_HXX_\n#define INCLUDE_mmx_tx_note_e_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT tx_note_e {\n\t\n\tenum enum_t : uint32_t {\n\t\tBURN = 1273454750l,\n\t\tCLAIM = 3251493825l,\n\t\tDEPLOY = 251696509l,\n\t\tDEPOSIT = 4272391094l,\n\t\tEXECUTE = 356250251l,\n\t\tMINT = 2140500429l,\n\t\tMUTATE = 2579166487l,\n\t\tOFFER = 1549148948l,\n\t\tREVOKE = 3821531424l,\n\t\tREWARD = 3842121424l,\n\t\tTIMELORD_REWARD = 1783340485l,\n\t\tTRADE = 329618288l,\n\t\tTRANSFER = 858544509l,\n\t\tWITHDRAW = 4266232802l,\n\t};\n\t\n\t::mmx::tx_note_e::enum_t value = ::mmx::tx_note_e::enum_t(0);\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x347c1deca0a9c9cull;\n\t\n\ttx_note_e() {}\n\t\n\ttx_note_e(const enum_t& _value) { value = _value; }\n\ttx_note_e(const ::mmx::tx_note_e& _other) { value = _other.value; }\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\toperator enum_t() const { return value; }\n\ttx_note_e& operator=(const enum_t& _value) { value = _value; return *this; }\n\ttx_note_e& operator=(const ::mmx::tx_note_e& _other) { value = _other.value; return *this; }\n\t\n\tstatic std::shared_ptr<tx_note_e> create();\n\tstd::shared_ptr<tx_note_e> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::bool_t is_valid() const;\n\tstd::string to_string() const;\n\tstd::string to_string_value() const;\n\tstd::string to_string_value_full() const;\n\t\n\tvoid from_string(const std::string& str);\n\tvoid from_string_value(const std::string& name);\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const tx_note_e& _value);\n\tfriend std::istream& operator>>(std::istream& _in, tx_note_e& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid tx_note_e::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<tx_note_e>(1);\n\t_visitor.type_field(\"value\", 0); _visitor.accept(value);\n\t_visitor.template type_end<tx_note_e>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::tx_note_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid write(TypeOutput& out, const ::mmx::tx_note_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::tx_note_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::tx_note_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::tx_note_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::tx_note_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::tx_note_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::tx_note_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstruct is_equivalent<::mmx::tx_note_e> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_tx_note_e_HXX_\n"
  },
  {
    "path": "generated/include/mmx/tx_type_e.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_tx_type_e_HXX_\n#define INCLUDE_mmx_tx_type_e_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT tx_type_e {\n\t\n\tenum enum_t : uint32_t {\n\t\tPROJECT_REWARD = 795347438l,\n\t\tRECEIVE = 940023181l,\n\t\tREWARD = 3842121424l,\n\t\tSPEND = 2341768809l,\n\t\tTXFEE = 3965595220l,\n\t\tVDF_REWARD = 1923446990l,\n\t};\n\t\n\t::mmx::tx_type_e::enum_t value = ::mmx::tx_type_e::enum_t(0);\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x3b7f577c2cfd4c91ull;\n\t\n\ttx_type_e() {}\n\t\n\ttx_type_e(const enum_t& _value) { value = _value; }\n\ttx_type_e(const ::mmx::tx_type_e& _other) { value = _other.value; }\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\toperator enum_t() const { return value; }\n\ttx_type_e& operator=(const enum_t& _value) { value = _value; return *this; }\n\ttx_type_e& operator=(const ::mmx::tx_type_e& _other) { value = _other.value; return *this; }\n\t\n\tstatic std::shared_ptr<tx_type_e> create();\n\tstd::shared_ptr<tx_type_e> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::bool_t is_valid() const;\n\tstd::string to_string() const;\n\tstd::string to_string_value() const;\n\tstd::string to_string_value_full() const;\n\t\n\tvoid from_string(const std::string& str);\n\tvoid from_string_value(const std::string& name);\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const tx_type_e& _value);\n\tfriend std::istream& operator>>(std::istream& _in, tx_type_e& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid tx_type_e::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<tx_type_e>(1);\n\t_visitor.type_field(\"value\", 0); _visitor.accept(value);\n\t_visitor.template type_end<tx_type_e>(1);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::tx_type_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid write(TypeOutput& out, const ::mmx::tx_type_e::enum_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::tx_type_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::tx_type_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::tx_type_e& _value); ///< \\private\n\ntemplate<>\nstd::string to_string(const ::mmx::tx_type_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value(const ::mmx::tx_type_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::tx_type_e::enum_t& _value); ///< \\private\n\ntemplate<>\nstruct is_equivalent<::mmx::tx_type_e> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_tx_type_e_HXX_\n"
  },
  {
    "path": "generated/include/mmx/txin_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_txin_t_HXX_\n#define INCLUDE_mmx_txin_t_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/txio_t.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT txin_t : ::mmx::txio_t {\n\t\n\tstatic const uint8_t IS_EXEC = 1;\n\tstatic const uint16_t NO_SOLUTION = -1;\n\t\n\tuint16_t solution = -1;\n\tuint8_t flags = 0;\n\t\n\ttypedef ::mmx::txio_t Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xda6587114a2413full;\n\t\n\ttxin_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<txin_t> create();\n\tstd::shared_ptr<txin_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const txin_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, txin_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid txin_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<txin_t>(6);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"contract\", 1); _visitor.accept(contract);\n\t_visitor.type_field(\"amount\", 2); _visitor.accept(amount);\n\t_visitor.type_field(\"memo\", 3); _visitor.accept(memo);\n\t_visitor.type_field(\"solution\", 4); _visitor.accept(solution);\n\t_visitor.type_field(\"flags\", 5); _visitor.accept(flags);\n\t_visitor.template type_end<txin_t>(6);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::txin_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_txin_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/txio_entry_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_txio_entry_t_HXX_\n#define INCLUDE_mmx_txio_entry_t_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/tx_type_e.hxx>\n#include <mmx/txio_t.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT txio_entry_t : ::mmx::txio_t {\n\t\n\t\n\t::mmx::hash_t txid;\n\tuint32_t height = 0;\n\tint64_t time_stamp = 0;\n\t::mmx::tx_type_e type;\n\t\n\ttypedef ::mmx::txio_t Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x2d1c65e166ab244bull;\n\t\n\ttxio_entry_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic ::mmx::txio_entry_t create_ex(const ::mmx::hash_t& txid = ::mmx::hash_t(), const uint32_t& height = 0, const int64_t& time_stamp = 0, const ::mmx::tx_type_e& type = ::mmx::tx_type_e(), const ::mmx::txio_t& txio = ::mmx::txio_t());\n\t\n\tstatic std::shared_ptr<txio_entry_t> create();\n\tstd::shared_ptr<txio_entry_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const txio_entry_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, txio_entry_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid txio_entry_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<txio_entry_t>(8);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"contract\", 1); _visitor.accept(contract);\n\t_visitor.type_field(\"amount\", 2); _visitor.accept(amount);\n\t_visitor.type_field(\"memo\", 3); _visitor.accept(memo);\n\t_visitor.type_field(\"txid\", 4); _visitor.accept(txid);\n\t_visitor.type_field(\"height\", 5); _visitor.accept(height);\n\t_visitor.type_field(\"time_stamp\", 6); _visitor.accept(time_stamp);\n\t_visitor.type_field(\"type\", 7); _visitor.accept(type);\n\t_visitor.template type_end<txio_entry_t>(8);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::txio_entry_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_txio_entry_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/txio_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_txio_t_HXX_\n#define INCLUDE_mmx_txio_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT txio_t : vnx::struct_t {\n\t\n\tstatic const uint32_t MAX_MEMO_SIZE = 64;\n\t\n\t::mmx::addr_t address;\n\t::mmx::addr_t contract;\n\t::mmx::uint128 amount;\n\tvnx::optional<std::string> memo;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x32adb93b85c82cf4ull;\n\t\n\ttxio_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tuint64_t calc_cost(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const;\n\t\n\tstatic std::shared_ptr<txio_t> create();\n\tstd::shared_ptr<txio_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const txio_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, txio_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid txio_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<txio_t>(4);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"contract\", 1); _visitor.accept(contract);\n\t_visitor.type_field(\"amount\", 2); _visitor.accept(amount);\n\t_visitor.type_field(\"memo\", 3); _visitor.accept(memo);\n\t_visitor.template type_end<txio_t>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::txio_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_txio_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/txout_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_txout_t_HXX_\n#define INCLUDE_mmx_txout_t_HXX_\n\n#include <mmx/package.hxx>\n#include <mmx/txio_t.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT txout_t : ::mmx::txio_t {\n\t\n\t\n\t\n\ttypedef ::mmx::txio_t Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xaa91772752216576ull;\n\t\n\ttxout_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<txout_t> create();\n\tstd::shared_ptr<txout_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const txout_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, txout_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid txout_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<txout_t>(4);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"contract\", 1); _visitor.accept(contract);\n\t_visitor.type_field(\"amount\", 2); _visitor.accept(amount);\n\t_visitor.type_field(\"memo\", 3); _visitor.accept(memo);\n\t_visitor.template type_end<txout_t>(4);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::txout_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_txout_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/uint_fraction_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_uint_fraction_t_HXX_\n#define INCLUDE_mmx_uint_fraction_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT uint_fraction_t : vnx::struct_t {\n\t\n\t\n\tuint32_t value = 0;\n\tuint32_t inverse = 1;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe5632136b5a3ed5aull;\n\t\n\tuint_fraction_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<uint_fraction_t> create();\n\tstd::shared_ptr<uint_fraction_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const uint_fraction_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, uint_fraction_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid uint_fraction_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<uint_fraction_t>(2);\n\t_visitor.type_field(\"value\", 0); _visitor.accept(value);\n\t_visitor.type_field(\"inverse\", 1); _visitor.accept(inverse);\n\t_visitor.template type_end<uint_fraction_t>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::uint_fraction_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_uint_fraction_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/ulong_fraction_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_ulong_fraction_t_HXX_\n#define INCLUDE_mmx_ulong_fraction_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT ulong_fraction_t : vnx::struct_t {\n\t\n\t\n\tuint64_t value = 0;\n\tuint64_t inverse = 1;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe9c2388a9c35ce06ull;\n\t\n\tulong_fraction_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<ulong_fraction_t> create();\n\tstd::shared_ptr<ulong_fraction_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const ulong_fraction_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, ulong_fraction_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid ulong_fraction_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<ulong_fraction_t>(2);\n\t_visitor.type_field(\"value\", 0); _visitor.accept(value);\n\t_visitor.type_field(\"inverse\", 1); _visitor.accept(inverse);\n\t_visitor.template type_end<ulong_fraction_t>(2);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::ulong_fraction_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_ulong_fraction_t_HXX_\n"
  },
  {
    "path": "generated/include/mmx/virtual_plot_info_t.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_virtual_plot_info_t_HXX_\n#define INCLUDE_mmx_virtual_plot_info_t_HXX_\n\n#include <vnx/Type.h>\n#include <mmx/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/pubkey_t.hpp>\n\n\nnamespace mmx {\n\nstruct MMX_EXPORT virtual_plot_info_t : vnx::struct_t {\n\t\n\t\n\t::mmx::addr_t address;\n\t::mmx::addr_t owner;\n\t::mmx::pubkey_t farmer_key;\n\tvnx::optional<::mmx::addr_t> reward_address;\n\tuint64_t balance = 0;\n\tuint64_t size_bytes = 0;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xcbcd7c49be95180eull;\n\t\n\tvirtual_plot_info_t() {}\n\t\n\tvnx::Hash64 get_type_hash() const;\n\tstd::string get_type_name() const;\n\tconst vnx::TypeCode* get_type_code() const;\n\t\n\tstatic std::shared_ptr<virtual_plot_info_t> create();\n\tstd::shared_ptr<virtual_plot_info_t> clone() const;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code);\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const;\n\t\n\tvoid read(std::istream& _in);\n\tvoid write(std::ostream& _out) const;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const;\n\t\n\tvnx::Object to_object() const;\n\tvoid from_object(const vnx::Object& object);\n\t\n\tvnx::Variant get_field(const std::string& name) const;\n\tvoid set_field(const std::string& name, const vnx::Variant& value);\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const virtual_plot_info_t& _value);\n\tfriend std::istream& operator>>(std::istream& _in, virtual_plot_info_t& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\n};\n\ntemplate<typename T>\nvoid virtual_plot_info_t::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<virtual_plot_info_t>(6);\n\t_visitor.type_field(\"address\", 0); _visitor.accept(address);\n\t_visitor.type_field(\"owner\", 1); _visitor.accept(owner);\n\t_visitor.type_field(\"farmer_key\", 2); _visitor.accept(farmer_key);\n\t_visitor.type_field(\"reward_address\", 3); _visitor.accept(reward_address);\n\t_visitor.type_field(\"balance\", 4); _visitor.accept(balance);\n\t_visitor.type_field(\"size_bytes\", 5); _visitor.accept(size_bytes);\n\t_visitor.template type_end<virtual_plot_info_t>(6);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\ntemplate<>\nstruct is_equivalent<::mmx::virtual_plot_info_t> {\n\tbool operator()(const uint16_t* code, const TypeCode* type_code);\n};\n\n} // vnx\n\n#endif // INCLUDE_mmx_virtual_plot_info_t_HXX_\n"
  },
  {
    "path": "generated/operation/include/mmx/operation/Deposit.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_operation_Deposit_HXX_\n#define INCLUDE_mmx_operation_Deposit_HXX_\n\n#include <mmx/operation/package.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/uint128.hpp>\n\n\nnamespace mmx {\nnamespace operation {\n\nclass MMX_OPERATION_EXPORT Deposit : public ::mmx::operation::Execute {\npublic:\n\t\n\t::mmx::addr_t currency;\n\t::mmx::uint128 amount;\n\t\n\ttypedef ::mmx::operation::Execute Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xc23408cb7b04b0ecull;\n\t\n\tDeposit() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = 0) const override;\n\t\n\tstatic std::shared_ptr<Deposit> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Deposit& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Deposit& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Deposit::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Deposit>(8);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"solution\", 2); _visitor.accept(solution);\n\t_visitor.type_field(\"method\", 3); _visitor.accept(method);\n\t_visitor.type_field(\"args\", 4); _visitor.accept(args);\n\t_visitor.type_field(\"user\", 5); _visitor.accept(user);\n\t_visitor.type_field(\"currency\", 6); _visitor.accept(currency);\n\t_visitor.type_field(\"amount\", 7); _visitor.accept(amount);\n\t_visitor.template type_end<Deposit>(8);\n}\n\n\n} // namespace mmx\n} // namespace operation\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_operation_Deposit_HXX_\n"
  },
  {
    "path": "generated/operation/include/mmx/operation/Execute.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_operation_Execute_HXX_\n#define INCLUDE_mmx_operation_Execute_HXX_\n\n#include <mmx/operation/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Operation.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\nnamespace operation {\n\nclass MMX_OPERATION_EXPORT Execute : public ::mmx::Operation {\npublic:\n\t\n\tstd::string method;\n\tstd::vector<::vnx::Variant> args;\n\tvnx::optional<::mmx::addr_t> user;\n\t\n\ttypedef ::mmx::Operation Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x8cd9012d9098c1d1ull;\n\t\n\tExecute() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_hash(const vnx::bool_t& full_hash = 0) const override;\n\tvirtual uint64_t calc_cost(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const override;\n\tvirtual ::vnx::Variant get_arg(const uint32_t& index = 0) const;\n\t\n\tstatic std::shared_ptr<Execute> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const Execute& _value);\n\tfriend std::istream& operator>>(std::istream& _in, Execute& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid Execute::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<Execute>(6);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"address\", 1); _visitor.accept(address);\n\t_visitor.type_field(\"solution\", 2); _visitor.accept(solution);\n\t_visitor.type_field(\"method\", 3); _visitor.accept(method);\n\t_visitor.type_field(\"args\", 4); _visitor.accept(args);\n\t_visitor.type_field(\"user\", 5); _visitor.accept(user);\n\t_visitor.template type_end<Execute>(6);\n}\n\n\n} // namespace mmx\n} // namespace operation\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_operation_Execute_HXX_\n"
  },
  {
    "path": "generated/operation/include/mmx/operation/accept_generic.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_operation_ACCEPT_GENERIC_HXX_\n#define INCLUDE_mmx_operation_ACCEPT_GENERIC_HXX_\n\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/operation/Execute.hxx>\n\n\nnamespace vnx {\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::operation::Deposit> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::operation::Execute> value) {\n\tif(value) {\n\t\tif(auto tmp = std::dynamic_pointer_cast<const ::mmx::operation::Deposit>(value)) {\n\t\t\tvnx::accept_generic(visitor, tmp);\n\t\t} else {\n\t\t\tvalue->accept_generic(visitor);\n\t\t}\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\n\n\n} // namespace vnx\n\n#endif // INCLUDE_mmx_operation_ACCEPT_GENERIC_HXX_\n"
  },
  {
    "path": "generated/operation/include/mmx/operation/package.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_operation_PACKAGE_HXX_\n#define INCLUDE_mmx_operation_PACKAGE_HXX_\n\n#include <vnx/Type.h>\n\n#include <mmx/package.hxx>\n#include <vnx/package.hxx>\n\n#ifdef MMX_OPERATION_EXPORT_ENABLE\n#include <mmx_operation_export.h>\n#else\n#ifndef MMX_OPERATION_EXPORT\n#define MMX_OPERATION_EXPORT\n#endif\n#endif\n\n\nnamespace mmx {\nnamespace operation {\n\nvoid register_all_types();\n\n\nclass Deposit;\nclass Execute;\n\nMMX_OPERATION_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Deposit; ///< \\private\nMMX_OPERATION_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_Execute; ///< \\private\n\n} // namespace mmx\n} // namespace operation\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::operation::Deposit& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::operation::Execute& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid write(TypeOutput& out, const ::mmx::operation::Deposit& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::operation::Execute& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid read(std::istream& in, ::mmx::operation::Deposit& value); ///< \\private\nvoid read(std::istream& in, ::mmx::operation::Execute& value); ///< \\private\n\nvoid write(std::ostream& out, const ::mmx::operation::Deposit& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::operation::Execute& value); ///< \\private\n\nvoid accept(Visitor& visitor, const ::mmx::operation::Deposit& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::operation::Execute& value); ///< \\private\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::operation::Deposit> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::operation::Execute> value); ///< \\private\n\n/// \\private\ntemplate<>\nstruct type<::mmx::operation::Deposit> {\n\tvoid read(TypeInput& in, ::mmx::operation::Deposit& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::operation::Deposit& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::operation::Deposit& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::operation::Deposit& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::operation::Deposit& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::operation::Deposit& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::operation::Execute> {\n\tvoid read(TypeInput& in, ::mmx::operation::Execute& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::operation::Execute& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::operation::Execute& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::operation::Execute& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::operation::Execute& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::operation::Execute& value, bool special = false);\n};\n\n\n} // namespace vnx\n\n#endif // INCLUDE_mmx_operation_PACKAGE_HXX_\n"
  },
  {
    "path": "generated/operation/src/Deposit.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/operation/package.hxx>\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/uint128.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace operation {\n\n\nconst vnx::Hash64 Deposit::VNX_TYPE_HASH(0xc23408cb7b04b0ecull);\nconst vnx::Hash64 Deposit::VNX_CODE_HASH(0xc1722b8fe9ad5dc0ull);\n\nvnx::Hash64 Deposit::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Deposit::get_type_name() const {\n\treturn \"mmx.operation.Deposit\";\n}\n\nconst vnx::TypeCode* Deposit::get_type_code() const {\n\treturn mmx::operation::vnx_native_type_code_Deposit;\n}\n\nstd::shared_ptr<Deposit> Deposit::create() {\n\treturn std::make_shared<Deposit>();\n}\n\nstd::shared_ptr<vnx::Value> Deposit::clone() const {\n\treturn std::make_shared<Deposit>(*this);\n}\n\nvoid Deposit::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Deposit::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Deposit::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::operation::vnx_native_type_code_Deposit;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, solution);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, method);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, args);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, user);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, currency);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, amount);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Deposit::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.operation.Deposit\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"solution\\\": \"; vnx::write(_out, solution);\n\t_out << \", \\\"method\\\": \"; vnx::write(_out, method);\n\t_out << \", \\\"args\\\": \"; vnx::write(_out, args);\n\t_out << \", \\\"user\\\": \"; vnx::write(_out, user);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \"}\";\n}\n\nvoid Deposit::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Deposit::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.operation.Deposit\";\n\t_object[\"version\"] = version;\n\t_object[\"address\"] = address;\n\t_object[\"solution\"] = solution;\n\t_object[\"method\"] = method;\n\t_object[\"args\"] = args;\n\t_object[\"user\"] = user;\n\t_object[\"currency\"] = currency;\n\t_object[\"amount\"] = amount;\n\treturn _object;\n}\n\nvoid Deposit::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"args\") {\n\t\t\t_entry.second.to(args);\n\t\t} else if(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t} else if(_entry.first == \"method\") {\n\t\t\t_entry.second.to(method);\n\t\t} else if(_entry.first == \"solution\") {\n\t\t\t_entry.second.to(solution);\n\t\t} else if(_entry.first == \"user\") {\n\t\t\t_entry.second.to(user);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant Deposit::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"solution\") {\n\t\treturn vnx::Variant(solution);\n\t}\n\tif(_name == \"method\") {\n\t\treturn vnx::Variant(method);\n\t}\n\tif(_name == \"args\") {\n\t\treturn vnx::Variant(args);\n\t}\n\tif(_name == \"user\") {\n\t\treturn vnx::Variant(user);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Deposit::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"solution\") {\n\t\t_value.to(solution);\n\t} else if(_name == \"method\") {\n\t\t_value.to(method);\n\t} else if(_name == \"args\") {\n\t\t_value.to(args);\n\t} else if(_name == \"user\") {\n\t\t_value.to(user);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Deposit& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Deposit& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Deposit::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Deposit::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.operation.Deposit\";\n\ttype_code->type_hash = vnx::Hash64(0xc23408cb7b04b0ecull);\n\ttype_code->code_hash = vnx::Hash64(0xc1722b8fe9ad5dc0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::operation::Deposit);\n\ttype_code->parents.resize(2);\n\ttype_code->parents[0] = ::mmx::operation::Execute::static_get_type_code();\n\ttype_code->parents[1] = ::mmx::Operation::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Deposit>(); };\n\ttype_code->fields.resize(8);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 2;\n\t\tfield.name = \"solution\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {2};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"method\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"args\";\n\t\tfield.code = {12, 17};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Deposit::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n} // namespace operation\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::operation::Deposit& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.solution, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.method, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.args, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.user, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::operation::Deposit& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::operation::vnx_native_type_code_Deposit;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::operation::Deposit>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(6);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.solution);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.method, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.args, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.user, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.currency, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[7].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::operation::Deposit& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::operation::Deposit& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::operation::Deposit& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/operation/src/Execute.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/operation/package.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Operation.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace operation {\n\n\nconst vnx::Hash64 Execute::VNX_TYPE_HASH(0x8cd9012d9098c1d1ull);\nconst vnx::Hash64 Execute::VNX_CODE_HASH(0x493c06d4cf1f1792ull);\n\nvnx::Hash64 Execute::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Execute::get_type_name() const {\n\treturn \"mmx.operation.Execute\";\n}\n\nconst vnx::TypeCode* Execute::get_type_code() const {\n\treturn mmx::operation::vnx_native_type_code_Execute;\n}\n\nstd::shared_ptr<Execute> Execute::create() {\n\treturn std::make_shared<Execute>();\n}\n\nstd::shared_ptr<vnx::Value> Execute::clone() const {\n\treturn std::make_shared<Execute>(*this);\n}\n\nvoid Execute::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Execute::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Execute::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::operation::vnx_native_type_code_Execute;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, solution);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, method);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, args);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, user);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Execute::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.operation.Execute\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"solution\\\": \"; vnx::write(_out, solution);\n\t_out << \", \\\"method\\\": \"; vnx::write(_out, method);\n\t_out << \", \\\"args\\\": \"; vnx::write(_out, args);\n\t_out << \", \\\"user\\\": \"; vnx::write(_out, user);\n\t_out << \"}\";\n}\n\nvoid Execute::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Execute::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.operation.Execute\";\n\t_object[\"version\"] = version;\n\t_object[\"address\"] = address;\n\t_object[\"solution\"] = solution;\n\t_object[\"method\"] = method;\n\t_object[\"args\"] = args;\n\t_object[\"user\"] = user;\n\treturn _object;\n}\n\nvoid Execute::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"args\") {\n\t\t\t_entry.second.to(args);\n\t\t} else if(_entry.first == \"method\") {\n\t\t\t_entry.second.to(method);\n\t\t} else if(_entry.first == \"solution\") {\n\t\t\t_entry.second.to(solution);\n\t\t} else if(_entry.first == \"user\") {\n\t\t\t_entry.second.to(user);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant Execute::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"solution\") {\n\t\treturn vnx::Variant(solution);\n\t}\n\tif(_name == \"method\") {\n\t\treturn vnx::Variant(method);\n\t}\n\tif(_name == \"args\") {\n\t\treturn vnx::Variant(args);\n\t}\n\tif(_name == \"user\") {\n\t\treturn vnx::Variant(user);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Execute::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"solution\") {\n\t\t_value.to(solution);\n\t} else if(_name == \"method\") {\n\t\t_value.to(method);\n\t} else if(_name == \"args\") {\n\t\t_value.to(args);\n\t} else if(_name == \"user\") {\n\t\t_value.to(user);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Execute& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Execute& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Execute::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Execute::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.operation.Execute\";\n\ttype_code->type_hash = vnx::Hash64(0x8cd9012d9098c1d1ull);\n\ttype_code->code_hash = vnx::Hash64(0x493c06d4cf1f1792ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::operation::Execute);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::Operation::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Execute>(); };\n\ttype_code->fields.resize(6);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 2;\n\t\tfield.name = \"solution\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {2};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"method\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"args\";\n\t\tfield.code = {12, 17};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Execute::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n} // namespace operation\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::operation::Execute& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.solution, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.method, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.args, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.user, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::operation::Execute& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::operation::vnx_native_type_code_Execute;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::operation::Execute>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(6);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.solution);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.method, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.args, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.user, type_code, type_code->fields[5].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::operation::Execute& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::operation::Execute& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::operation::Execute& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/operation/src/package.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/operation/Execute.hxx>\n\n#include <mmx/operation/package.hxx>\n#include <vnx/vnx.h>\n\n\n\nnamespace vnx {\n\nconst TypeCode* type<::mmx::operation::Deposit>::get_type_code() {\n\treturn mmx::operation::vnx_native_type_code_Deposit;\n}\n\nvoid type<::mmx::operation::Deposit>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::operation::Deposit());\n}\n\nvoid type<::mmx::operation::Deposit>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::operation::Deposit& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::operation::Execute>::get_type_code() {\n\treturn mmx::operation::vnx_native_type_code_Execute;\n}\n\nvoid type<::mmx::operation::Execute>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::operation::Execute());\n}\n\nvoid type<::mmx::operation::Execute>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::operation::Execute& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\n\n} // namespace vnx\n\n\nnamespace mmx {\nnamespace operation {\n\n\nvoid register_all_types() {\n\tvnx::register_type_code(::mmx::operation::Deposit::static_create_type_code());\n\tvnx::register_type_code(::mmx::operation::Execute::static_create_type_code());\n}\n\nstatic struct vnx_static_init {\n\tvnx_static_init() {\n\t\tregister_all_types();\n\t}\n} vnx_static_init_;\n\nconst vnx::TypeCode* const vnx_native_type_code_Deposit = vnx::get_type_code(vnx::Hash64(0xc23408cb7b04b0ecull));\nconst vnx::TypeCode* const vnx_native_type_code_Execute = vnx::get_type_code(vnx::Hash64(0x8cd9012d9098c1d1ull));\n\n} // namespace mmx\n} // namespace operation\n"
  },
  {
    "path": "generated/solution/include/mmx/solution/MultiSig.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_solution_MultiSig_HXX_\n#define INCLUDE_mmx_solution_MultiSig_HXX_\n\n#include <mmx/solution/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n\n\nnamespace mmx {\nnamespace solution {\n\nclass MMX_SOLUTION_EXPORT MultiSig : public ::mmx::Solution {\npublic:\n\t\n\tstd::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Solution>> solutions;\n\tuint32_t num_required = 0;\n\t\n\ttypedef ::mmx::Solution Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0x64ffa2f8fc8dffd1ull;\n\t\n\tMultiSig() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual vnx::bool_t is_valid() const override;\n\tvirtual ::mmx::hash_t calc_hash() const override;\n\tvirtual uint64_t calc_cost(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const override;\n\t\n\tstatic std::shared_ptr<MultiSig> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const MultiSig& _value);\n\tfriend std::istream& operator>>(std::istream& _in, MultiSig& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid MultiSig::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<MultiSig>(3);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"solutions\", 1); _visitor.accept(solutions);\n\t_visitor.type_field(\"num_required\", 2); _visitor.accept(num_required);\n\t_visitor.template type_end<MultiSig>(3);\n}\n\n\n} // namespace mmx\n} // namespace solution\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_solution_MultiSig_HXX_\n"
  },
  {
    "path": "generated/solution/include/mmx/solution/PubKey.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_solution_PubKey_HXX_\n#define INCLUDE_mmx_solution_PubKey_HXX_\n\n#include <mmx/solution/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n\n\nnamespace mmx {\nnamespace solution {\n\nclass MMX_SOLUTION_EXPORT PubKey : public ::mmx::Solution {\npublic:\n\t\n\t::mmx::pubkey_t pubkey;\n\t::mmx::signature_t signature;\n\t\n\ttypedef ::mmx::Solution Super;\n\t\n\tstatic const vnx::Hash64 VNX_TYPE_HASH;\n\tstatic const vnx::Hash64 VNX_CODE_HASH;\n\t\n\tstatic constexpr uint64_t VNX_TYPE_ID = 0xe47af6fcacfcefa5ull;\n\t\n\tPubKey() {}\n\t\n\tvnx::Hash64 get_type_hash() const override;\n\tstd::string get_type_name() const override;\n\tconst vnx::TypeCode* get_type_code() const override;\n\t\n\tvirtual ::mmx::hash_t calc_hash() const override;\n\tvirtual uint64_t calc_cost(std::shared_ptr<const ::mmx::ChainParams> params = nullptr) const override;\n\t\n\tstatic std::shared_ptr<PubKey> create();\n\tstd::shared_ptr<vnx::Value> clone() const override;\n\t\n\tvoid read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) override;\n\tvoid write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const override;\n\t\n\tvoid read(std::istream& _in) override;\n\tvoid write(std::ostream& _out) const override;\n\t\n\ttemplate<typename T>\n\tvoid accept_generic(T& _visitor) const;\n\tvoid accept(vnx::Visitor& _visitor) const override;\n\t\n\tvnx::Object to_object() const override;\n\tvoid from_object(const vnx::Object& object) override;\n\t\n\tvnx::Variant get_field(const std::string& name) const override;\n\tvoid set_field(const std::string& name, const vnx::Variant& value) override;\n\t\n\tfriend std::ostream& operator<<(std::ostream& _out, const PubKey& _value);\n\tfriend std::istream& operator>>(std::istream& _in, PubKey& _value);\n\t\n\tstatic const vnx::TypeCode* static_get_type_code();\n\tstatic std::shared_ptr<vnx::TypeCode> static_create_type_code();\n\t\nprotected:\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> _method) override;\n\t\n};\n\ntemplate<typename T>\nvoid PubKey::accept_generic(T& _visitor) const {\n\t_visitor.template type_begin<PubKey>(3);\n\t_visitor.type_field(\"version\", 0); _visitor.accept(version);\n\t_visitor.type_field(\"pubkey\", 1); _visitor.accept(pubkey);\n\t_visitor.type_field(\"signature\", 2); _visitor.accept(signature);\n\t_visitor.template type_end<PubKey>(3);\n}\n\n\n} // namespace mmx\n} // namespace solution\n\n\nnamespace vnx {\n\n} // vnx\n\n#endif // INCLUDE_mmx_solution_PubKey_HXX_\n"
  },
  {
    "path": "generated/solution/include/mmx/solution/accept_generic.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_solution_ACCEPT_GENERIC_HXX_\n#define INCLUDE_mmx_solution_ACCEPT_GENERIC_HXX_\n\n#include <mmx/solution/MultiSig.hxx>\n#include <mmx/solution/PubKey.hxx>\n\n\nnamespace vnx {\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::solution::MultiSig> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::solution::PubKey> value) {\n\tif(value) {\n\t\tvalue->accept_generic(visitor);\n\t} else {\n\t\tvisitor.accept(nullptr);\n\t}\n}\n\n\n\n} // namespace vnx\n\n#endif // INCLUDE_mmx_solution_ACCEPT_GENERIC_HXX_\n"
  },
  {
    "path": "generated/solution/include/mmx/solution/package.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_solution_PACKAGE_HXX_\n#define INCLUDE_mmx_solution_PACKAGE_HXX_\n\n#include <vnx/Type.h>\n\n#include <mmx/package.hxx>\n#include <vnx/package.hxx>\n\n#ifdef MMX_SOLUTION_EXPORT_ENABLE\n#include <mmx_solution_export.h>\n#else\n#ifndef MMX_SOLUTION_EXPORT\n#define MMX_SOLUTION_EXPORT\n#endif\n#endif\n\n\nnamespace mmx {\nnamespace solution {\n\nvoid register_all_types();\n\n\nclass MultiSig;\nclass PubKey;\n\nMMX_SOLUTION_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_MultiSig; ///< \\private\nMMX_SOLUTION_EXPORT extern const vnx::TypeCode* const vnx_native_type_code_PubKey; ///< \\private\n\n} // namespace mmx\n} // namespace solution\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::solution::MultiSig& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid read(TypeInput& in, ::mmx::solution::PubKey& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid write(TypeOutput& out, const ::mmx::solution::MultiSig& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\nvoid write(TypeOutput& out, const ::mmx::solution::PubKey& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid read(std::istream& in, ::mmx::solution::MultiSig& value); ///< \\private\nvoid read(std::istream& in, ::mmx::solution::PubKey& value); ///< \\private\n\nvoid write(std::ostream& out, const ::mmx::solution::MultiSig& value); ///< \\private\nvoid write(std::ostream& out, const ::mmx::solution::PubKey& value); ///< \\private\n\nvoid accept(Visitor& visitor, const ::mmx::solution::MultiSig& value); ///< \\private\nvoid accept(Visitor& visitor, const ::mmx::solution::PubKey& value); ///< \\private\n\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::solution::MultiSig> value); ///< \\private\ntemplate<typename V>\nvoid accept_generic(V& visitor, std::shared_ptr<const ::mmx::solution::PubKey> value); ///< \\private\n\n/// \\private\ntemplate<>\nstruct type<::mmx::solution::MultiSig> {\n\tvoid read(TypeInput& in, ::mmx::solution::MultiSig& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::solution::MultiSig& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::solution::MultiSig& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::solution::MultiSig& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::solution::MultiSig& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::solution::MultiSig& value, bool special = false);\n};\n\n/// \\private\ntemplate<>\nstruct type<::mmx::solution::PubKey> {\n\tvoid read(TypeInput& in, ::mmx::solution::PubKey& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::solution::PubKey& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::solution::PubKey& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::solution::PubKey& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::solution::PubKey& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::solution::PubKey& value, bool special = false);\n};\n\n\n} // namespace vnx\n\n#endif // INCLUDE_mmx_solution_PACKAGE_HXX_\n"
  },
  {
    "path": "generated/solution/src/MultiSig.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/solution/package.hxx>\n#include <mmx/solution/MultiSig.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace solution {\n\n\nconst vnx::Hash64 MultiSig::VNX_TYPE_HASH(0x64ffa2f8fc8dffd1ull);\nconst vnx::Hash64 MultiSig::VNX_CODE_HASH(0x6cd2454ba41c5e6dull);\n\nvnx::Hash64 MultiSig::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string MultiSig::get_type_name() const {\n\treturn \"mmx.solution.MultiSig\";\n}\n\nconst vnx::TypeCode* MultiSig::get_type_code() const {\n\treturn mmx::solution::vnx_native_type_code_MultiSig;\n}\n\nstd::shared_ptr<MultiSig> MultiSig::create() {\n\treturn std::make_shared<MultiSig>();\n}\n\nstd::shared_ptr<vnx::Value> MultiSig::clone() const {\n\treturn std::make_shared<MultiSig>(*this);\n}\n\nvoid MultiSig::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid MultiSig::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid MultiSig::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::solution::vnx_native_type_code_MultiSig;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, solutions);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, num_required);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid MultiSig::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.solution.MultiSig\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"solutions\\\": \"; vnx::write(_out, solutions);\n\t_out << \", \\\"num_required\\\": \"; vnx::write(_out, num_required);\n\t_out << \"}\";\n}\n\nvoid MultiSig::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object MultiSig::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.solution.MultiSig\";\n\t_object[\"version\"] = version;\n\t_object[\"solutions\"] = solutions;\n\t_object[\"num_required\"] = num_required;\n\treturn _object;\n}\n\nvoid MultiSig::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"num_required\") {\n\t\t\t_entry.second.to(num_required);\n\t\t} else if(_entry.first == \"solutions\") {\n\t\t\t_entry.second.to(solutions);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant MultiSig::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"solutions\") {\n\t\treturn vnx::Variant(solutions);\n\t}\n\tif(_name == \"num_required\") {\n\t\treturn vnx::Variant(num_required);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid MultiSig::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"solutions\") {\n\t\t_value.to(solutions);\n\t} else if(_name == \"num_required\") {\n\t\t_value.to(num_required);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const MultiSig& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, MultiSig& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* MultiSig::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> MultiSig::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.solution.MultiSig\";\n\ttype_code->type_hash = vnx::Hash64(0x64ffa2f8fc8dffd1ull);\n\ttype_code->code_hash = vnx::Hash64(0x6cd2454ba41c5e6dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::solution::MultiSig);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::Solution::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<MultiSig>(); };\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"solutions\";\n\t\tfield.code = {13, 5, 11, 32, 1, 16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_required\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> MultiSig::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n} // namespace solution\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::solution::MultiSig& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_required, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.solutions, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::solution::MultiSig& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::solution::vnx_native_type_code_MultiSig;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::solution::MultiSig>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.num_required);\n\tvnx::write(out, value.solutions, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::solution::MultiSig& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::solution::MultiSig& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::solution::MultiSig& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/solution/src/PubKey.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/solution/package.hxx>\n#include <mmx/solution/PubKey.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace solution {\n\n\nconst vnx::Hash64 PubKey::VNX_TYPE_HASH(0xe47af6fcacfcefa5ull);\nconst vnx::Hash64 PubKey::VNX_CODE_HASH(0xd8d22390f30ffec7ull);\n\nvnx::Hash64 PubKey::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string PubKey::get_type_name() const {\n\treturn \"mmx.solution.PubKey\";\n}\n\nconst vnx::TypeCode* PubKey::get_type_code() const {\n\treturn mmx::solution::vnx_native_type_code_PubKey;\n}\n\nstd::shared_ptr<PubKey> PubKey::create() {\n\treturn std::make_shared<PubKey>();\n}\n\nstd::shared_ptr<vnx::Value> PubKey::clone() const {\n\treturn std::make_shared<PubKey>(*this);\n}\n\nvoid PubKey::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid PubKey::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid PubKey::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::solution::vnx_native_type_code_PubKey;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, pubkey);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, signature);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid PubKey::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.solution.PubKey\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"pubkey\\\": \"; vnx::write(_out, pubkey);\n\t_out << \", \\\"signature\\\": \"; vnx::write(_out, signature);\n\t_out << \"}\";\n}\n\nvoid PubKey::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object PubKey::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.solution.PubKey\";\n\t_object[\"version\"] = version;\n\t_object[\"pubkey\"] = pubkey;\n\t_object[\"signature\"] = signature;\n\treturn _object;\n}\n\nvoid PubKey::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"pubkey\") {\n\t\t\t_entry.second.to(pubkey);\n\t\t} else if(_entry.first == \"signature\") {\n\t\t\t_entry.second.to(signature);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant PubKey::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"pubkey\") {\n\t\treturn vnx::Variant(pubkey);\n\t}\n\tif(_name == \"signature\") {\n\t\treturn vnx::Variant(signature);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid PubKey::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"pubkey\") {\n\t\t_value.to(pubkey);\n\t} else if(_name == \"signature\") {\n\t\t_value.to(signature);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const PubKey& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, PubKey& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* PubKey::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> PubKey::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.solution.PubKey\";\n\ttype_code->type_hash = vnx::Hash64(0xe47af6fcacfcefa5ull);\n\ttype_code->code_hash = vnx::Hash64(0xd8d22390f30ffec7ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::solution::PubKey);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::Solution::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<PubKey>(); };\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"pubkey\";\n\t\tfield.code = {11, 33, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"signature\";\n\t\tfield.code = {11, 64, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> PubKey::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n} // namespace solution\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::solution::PubKey& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.pubkey, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.signature, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::solution::PubKey& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::solution::vnx_native_type_code_PubKey;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::solution::PubKey>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write(out, value.pubkey, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.signature, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::solution::PubKey& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::solution::PubKey& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::solution::PubKey& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/solution/src/package.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/solution/MultiSig.hxx>\n#include <mmx/solution/PubKey.hxx>\n\n#include <mmx/solution/package.hxx>\n#include <vnx/vnx.h>\n\n\n\nnamespace vnx {\n\nconst TypeCode* type<::mmx::solution::MultiSig>::get_type_code() {\n\treturn mmx::solution::vnx_native_type_code_MultiSig;\n}\n\nvoid type<::mmx::solution::MultiSig>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::solution::MultiSig());\n}\n\nvoid type<::mmx::solution::MultiSig>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::solution::MultiSig& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::solution::PubKey>::get_type_code() {\n\treturn mmx::solution::vnx_native_type_code_PubKey;\n}\n\nvoid type<::mmx::solution::PubKey>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::solution::PubKey());\n}\n\nvoid type<::mmx::solution::PubKey>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::solution::PubKey& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\n\n} // namespace vnx\n\n\nnamespace mmx {\nnamespace solution {\n\n\nvoid register_all_types() {\n\tvnx::register_type_code(::mmx::solution::MultiSig::static_create_type_code());\n\tvnx::register_type_code(::mmx::solution::PubKey::static_create_type_code());\n}\n\nstatic struct vnx_static_init {\n\tvnx_static_init() {\n\t\tregister_all_types();\n\t}\n} vnx_static_init_;\n\nconst vnx::TypeCode* const vnx_native_type_code_MultiSig = vnx::get_type_code(vnx::Hash64(0x64ffa2f8fc8dffd1ull));\nconst vnx::TypeCode* const vnx_native_type_code_PubKey = vnx::get_type_code(vnx::Hash64(0xe47af6fcacfcefa5ull));\n\n} // namespace mmx\n} // namespace solution\n"
  },
  {
    "path": "generated/src/Block.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/txio_entry_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Block::VNX_TYPE_HASH(0x94965d816d328467ull);\nconst vnx::Hash64 Block::VNX_CODE_HASH(0x3d36c5edbb8788e3ull);\n\nvnx::Hash64 Block::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Block::get_type_name() const {\n\treturn \"mmx.Block\";\n}\n\nconst vnx::TypeCode* Block::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Block;\n}\n\nstd::shared_ptr<Block> Block::create() {\n\treturn std::make_shared<Block>();\n}\n\nstd::shared_ptr<vnx::Value> Block::clone() const {\n\treturn std::make_shared<Block>(*this);\n}\n\nvoid Block::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Block::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Block::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Block;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, support_flags);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, hash);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, prev);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, vdf_height);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, nonce);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, time_diff);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, space_diff);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, weight);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, total_weight);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, vdf_count);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, vdf_iters);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, vdf_output);\n\t_visitor.type_field(_type_code->fields[15], 15); vnx::accept(_visitor, vdf_reward_addr);\n\t_visitor.type_field(_type_code->fields[16], 16); vnx::accept(_visitor, vdf_reward_payout);\n\t_visitor.type_field(_type_code->fields[17], 17); vnx::accept(_visitor, proof);\n\t_visitor.type_field(_type_code->fields[18], 18); vnx::accept(_visitor, proof_hash);\n\t_visitor.type_field(_type_code->fields[19], 19); vnx::accept(_visitor, challenge);\n\t_visitor.type_field(_type_code->fields[20], 20); vnx::accept(_visitor, is_space_fork);\n\t_visitor.type_field(_type_code->fields[21], 21); vnx::accept(_visitor, space_fork_len);\n\t_visitor.type_field(_type_code->fields[22], 22); vnx::accept(_visitor, space_fork_proofs);\n\t_visitor.type_field(_type_code->fields[23], 23); vnx::accept(_visitor, reward_amount);\n\t_visitor.type_field(_type_code->fields[24], 24); vnx::accept(_visitor, reward_addr);\n\t_visitor.type_field(_type_code->fields[25], 25); vnx::accept(_visitor, reward_contract);\n\t_visitor.type_field(_type_code->fields[26], 26); vnx::accept(_visitor, reward_account);\n\t_visitor.type_field(_type_code->fields[27], 27); vnx::accept(_visitor, reward_vote);\n\t_visitor.type_field(_type_code->fields[28], 28); vnx::accept(_visitor, reward_vote_sum);\n\t_visitor.type_field(_type_code->fields[29], 29); vnx::accept(_visitor, reward_vote_count);\n\t_visitor.type_field(_type_code->fields[30], 30); vnx::accept(_visitor, base_reward);\n\t_visitor.type_field(_type_code->fields[31], 31); vnx::accept(_visitor, project_addr);\n\t_visitor.type_field(_type_code->fields[32], 32); vnx::accept(_visitor, static_cost);\n\t_visitor.type_field(_type_code->fields[33], 33); vnx::accept(_visitor, total_cost);\n\t_visitor.type_field(_type_code->fields[34], 34); vnx::accept(_visitor, tx_count);\n\t_visitor.type_field(_type_code->fields[35], 35); vnx::accept(_visitor, tx_fees);\n\t_visitor.type_field(_type_code->fields[36], 36); vnx::accept(_visitor, txfee_buffer);\n\t_visitor.type_field(_type_code->fields[37], 37); vnx::accept(_visitor, tx_hash);\n\t_visitor.type_field(_type_code->fields[38], 38); vnx::accept(_visitor, farmer_sig);\n\t_visitor.type_field(_type_code->fields[39], 39); vnx::accept(_visitor, content_hash);\n\t_visitor.type_field(_type_code->fields[40], 40); vnx::accept(_visitor, tx_list);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Block::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Block\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"support_flags\\\": \"; vnx::write(_out, support_flags);\n\t_out << \", \\\"hash\\\": \"; vnx::write(_out, hash);\n\t_out << \", \\\"prev\\\": \"; vnx::write(_out, prev);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"vdf_height\\\": \"; vnx::write(_out, vdf_height);\n\t_out << \", \\\"nonce\\\": \"; vnx::write(_out, nonce);\n\t_out << \", \\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"time_diff\\\": \"; vnx::write(_out, time_diff);\n\t_out << \", \\\"space_diff\\\": \"; vnx::write(_out, space_diff);\n\t_out << \", \\\"weight\\\": \"; vnx::write(_out, weight);\n\t_out << \", \\\"total_weight\\\": \"; vnx::write(_out, total_weight);\n\t_out << \", \\\"vdf_count\\\": \"; vnx::write(_out, vdf_count);\n\t_out << \", \\\"vdf_iters\\\": \"; vnx::write(_out, vdf_iters);\n\t_out << \", \\\"vdf_output\\\": \"; vnx::write(_out, vdf_output);\n\t_out << \", \\\"vdf_reward_addr\\\": \"; vnx::write(_out, vdf_reward_addr);\n\t_out << \", \\\"vdf_reward_payout\\\": \"; vnx::write(_out, vdf_reward_payout);\n\t_out << \", \\\"proof\\\": \"; vnx::write(_out, proof);\n\t_out << \", \\\"proof_hash\\\": \"; vnx::write(_out, proof_hash);\n\t_out << \", \\\"challenge\\\": \"; vnx::write(_out, challenge);\n\t_out << \", \\\"is_space_fork\\\": \"; vnx::write(_out, is_space_fork);\n\t_out << \", \\\"space_fork_len\\\": \"; vnx::write(_out, space_fork_len);\n\t_out << \", \\\"space_fork_proofs\\\": \"; vnx::write(_out, space_fork_proofs);\n\t_out << \", \\\"reward_amount\\\": \"; vnx::write(_out, reward_amount);\n\t_out << \", \\\"reward_addr\\\": \"; vnx::write(_out, reward_addr);\n\t_out << \", \\\"reward_contract\\\": \"; vnx::write(_out, reward_contract);\n\t_out << \", \\\"reward_account\\\": \"; vnx::write(_out, reward_account);\n\t_out << \", \\\"reward_vote\\\": \"; vnx::write(_out, reward_vote);\n\t_out << \", \\\"reward_vote_sum\\\": \"; vnx::write(_out, reward_vote_sum);\n\t_out << \", \\\"reward_vote_count\\\": \"; vnx::write(_out, reward_vote_count);\n\t_out << \", \\\"base_reward\\\": \"; vnx::write(_out, base_reward);\n\t_out << \", \\\"project_addr\\\": \"; vnx::write(_out, project_addr);\n\t_out << \", \\\"static_cost\\\": \"; vnx::write(_out, static_cost);\n\t_out << \", \\\"total_cost\\\": \"; vnx::write(_out, total_cost);\n\t_out << \", \\\"tx_count\\\": \"; vnx::write(_out, tx_count);\n\t_out << \", \\\"tx_fees\\\": \"; vnx::write(_out, tx_fees);\n\t_out << \", \\\"txfee_buffer\\\": \"; vnx::write(_out, txfee_buffer);\n\t_out << \", \\\"tx_hash\\\": \"; vnx::write(_out, tx_hash);\n\t_out << \", \\\"farmer_sig\\\": \"; vnx::write(_out, farmer_sig);\n\t_out << \", \\\"content_hash\\\": \"; vnx::write(_out, content_hash);\n\t_out << \", \\\"tx_list\\\": \"; vnx::write(_out, tx_list);\n\t_out << \"}\";\n}\n\nvoid Block::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Block::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Block\";\n\t_object[\"version\"] = version;\n\t_object[\"support_flags\"] = support_flags;\n\t_object[\"hash\"] = hash;\n\t_object[\"prev\"] = prev;\n\t_object[\"height\"] = height;\n\t_object[\"vdf_height\"] = vdf_height;\n\t_object[\"nonce\"] = nonce;\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"time_diff\"] = time_diff;\n\t_object[\"space_diff\"] = space_diff;\n\t_object[\"weight\"] = weight;\n\t_object[\"total_weight\"] = total_weight;\n\t_object[\"vdf_count\"] = vdf_count;\n\t_object[\"vdf_iters\"] = vdf_iters;\n\t_object[\"vdf_output\"] = vdf_output;\n\t_object[\"vdf_reward_addr\"] = vdf_reward_addr;\n\t_object[\"vdf_reward_payout\"] = vdf_reward_payout;\n\t_object[\"proof\"] = proof;\n\t_object[\"proof_hash\"] = proof_hash;\n\t_object[\"challenge\"] = challenge;\n\t_object[\"is_space_fork\"] = is_space_fork;\n\t_object[\"space_fork_len\"] = space_fork_len;\n\t_object[\"space_fork_proofs\"] = space_fork_proofs;\n\t_object[\"reward_amount\"] = reward_amount;\n\t_object[\"reward_addr\"] = reward_addr;\n\t_object[\"reward_contract\"] = reward_contract;\n\t_object[\"reward_account\"] = reward_account;\n\t_object[\"reward_vote\"] = reward_vote;\n\t_object[\"reward_vote_sum\"] = reward_vote_sum;\n\t_object[\"reward_vote_count\"] = reward_vote_count;\n\t_object[\"base_reward\"] = base_reward;\n\t_object[\"project_addr\"] = project_addr;\n\t_object[\"static_cost\"] = static_cost;\n\t_object[\"total_cost\"] = total_cost;\n\t_object[\"tx_count\"] = tx_count;\n\t_object[\"tx_fees\"] = tx_fees;\n\t_object[\"txfee_buffer\"] = txfee_buffer;\n\t_object[\"tx_hash\"] = tx_hash;\n\t_object[\"farmer_sig\"] = farmer_sig;\n\t_object[\"content_hash\"] = content_hash;\n\t_object[\"tx_list\"] = tx_list;\n\treturn _object;\n}\n\nvoid Block::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"base_reward\") {\n\t\t\t_entry.second.to(base_reward);\n\t\t} else if(_entry.first == \"challenge\") {\n\t\t\t_entry.second.to(challenge);\n\t\t} else if(_entry.first == \"content_hash\") {\n\t\t\t_entry.second.to(content_hash);\n\t\t} else if(_entry.first == \"farmer_sig\") {\n\t\t\t_entry.second.to(farmer_sig);\n\t\t} else if(_entry.first == \"hash\") {\n\t\t\t_entry.second.to(hash);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"is_space_fork\") {\n\t\t\t_entry.second.to(is_space_fork);\n\t\t} else if(_entry.first == \"nonce\") {\n\t\t\t_entry.second.to(nonce);\n\t\t} else if(_entry.first == \"prev\") {\n\t\t\t_entry.second.to(prev);\n\t\t} else if(_entry.first == \"project_addr\") {\n\t\t\t_entry.second.to(project_addr);\n\t\t} else if(_entry.first == \"proof\") {\n\t\t\t_entry.second.to(proof);\n\t\t} else if(_entry.first == \"proof_hash\") {\n\t\t\t_entry.second.to(proof_hash);\n\t\t} else if(_entry.first == \"reward_account\") {\n\t\t\t_entry.second.to(reward_account);\n\t\t} else if(_entry.first == \"reward_addr\") {\n\t\t\t_entry.second.to(reward_addr);\n\t\t} else if(_entry.first == \"reward_amount\") {\n\t\t\t_entry.second.to(reward_amount);\n\t\t} else if(_entry.first == \"reward_contract\") {\n\t\t\t_entry.second.to(reward_contract);\n\t\t} else if(_entry.first == \"reward_vote\") {\n\t\t\t_entry.second.to(reward_vote);\n\t\t} else if(_entry.first == \"reward_vote_count\") {\n\t\t\t_entry.second.to(reward_vote_count);\n\t\t} else if(_entry.first == \"reward_vote_sum\") {\n\t\t\t_entry.second.to(reward_vote_sum);\n\t\t} else if(_entry.first == \"space_diff\") {\n\t\t\t_entry.second.to(space_diff);\n\t\t} else if(_entry.first == \"space_fork_len\") {\n\t\t\t_entry.second.to(space_fork_len);\n\t\t} else if(_entry.first == \"space_fork_proofs\") {\n\t\t\t_entry.second.to(space_fork_proofs);\n\t\t} else if(_entry.first == \"static_cost\") {\n\t\t\t_entry.second.to(static_cost);\n\t\t} else if(_entry.first == \"support_flags\") {\n\t\t\t_entry.second.to(support_flags);\n\t\t} else if(_entry.first == \"time_diff\") {\n\t\t\t_entry.second.to(time_diff);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t} else if(_entry.first == \"total_cost\") {\n\t\t\t_entry.second.to(total_cost);\n\t\t} else if(_entry.first == \"total_weight\") {\n\t\t\t_entry.second.to(total_weight);\n\t\t} else if(_entry.first == \"tx_count\") {\n\t\t\t_entry.second.to(tx_count);\n\t\t} else if(_entry.first == \"tx_fees\") {\n\t\t\t_entry.second.to(tx_fees);\n\t\t} else if(_entry.first == \"tx_hash\") {\n\t\t\t_entry.second.to(tx_hash);\n\t\t} else if(_entry.first == \"tx_list\") {\n\t\t\t_entry.second.to(tx_list);\n\t\t} else if(_entry.first == \"txfee_buffer\") {\n\t\t\t_entry.second.to(txfee_buffer);\n\t\t} else if(_entry.first == \"vdf_count\") {\n\t\t\t_entry.second.to(vdf_count);\n\t\t} else if(_entry.first == \"vdf_height\") {\n\t\t\t_entry.second.to(vdf_height);\n\t\t} else if(_entry.first == \"vdf_iters\") {\n\t\t\t_entry.second.to(vdf_iters);\n\t\t} else if(_entry.first == \"vdf_output\") {\n\t\t\t_entry.second.to(vdf_output);\n\t\t} else if(_entry.first == \"vdf_reward_addr\") {\n\t\t\t_entry.second.to(vdf_reward_addr);\n\t\t} else if(_entry.first == \"vdf_reward_payout\") {\n\t\t\t_entry.second.to(vdf_reward_payout);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t} else if(_entry.first == \"weight\") {\n\t\t\t_entry.second.to(weight);\n\t\t}\n\t}\n}\n\nvnx::Variant Block::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"support_flags\") {\n\t\treturn vnx::Variant(support_flags);\n\t}\n\tif(_name == \"hash\") {\n\t\treturn vnx::Variant(hash);\n\t}\n\tif(_name == \"prev\") {\n\t\treturn vnx::Variant(prev);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"vdf_height\") {\n\t\treturn vnx::Variant(vdf_height);\n\t}\n\tif(_name == \"nonce\") {\n\t\treturn vnx::Variant(nonce);\n\t}\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"time_diff\") {\n\t\treturn vnx::Variant(time_diff);\n\t}\n\tif(_name == \"space_diff\") {\n\t\treturn vnx::Variant(space_diff);\n\t}\n\tif(_name == \"weight\") {\n\t\treturn vnx::Variant(weight);\n\t}\n\tif(_name == \"total_weight\") {\n\t\treturn vnx::Variant(total_weight);\n\t}\n\tif(_name == \"vdf_count\") {\n\t\treturn vnx::Variant(vdf_count);\n\t}\n\tif(_name == \"vdf_iters\") {\n\t\treturn vnx::Variant(vdf_iters);\n\t}\n\tif(_name == \"vdf_output\") {\n\t\treturn vnx::Variant(vdf_output);\n\t}\n\tif(_name == \"vdf_reward_addr\") {\n\t\treturn vnx::Variant(vdf_reward_addr);\n\t}\n\tif(_name == \"vdf_reward_payout\") {\n\t\treturn vnx::Variant(vdf_reward_payout);\n\t}\n\tif(_name == \"proof\") {\n\t\treturn vnx::Variant(proof);\n\t}\n\tif(_name == \"proof_hash\") {\n\t\treturn vnx::Variant(proof_hash);\n\t}\n\tif(_name == \"challenge\") {\n\t\treturn vnx::Variant(challenge);\n\t}\n\tif(_name == \"is_space_fork\") {\n\t\treturn vnx::Variant(is_space_fork);\n\t}\n\tif(_name == \"space_fork_len\") {\n\t\treturn vnx::Variant(space_fork_len);\n\t}\n\tif(_name == \"space_fork_proofs\") {\n\t\treturn vnx::Variant(space_fork_proofs);\n\t}\n\tif(_name == \"reward_amount\") {\n\t\treturn vnx::Variant(reward_amount);\n\t}\n\tif(_name == \"reward_addr\") {\n\t\treturn vnx::Variant(reward_addr);\n\t}\n\tif(_name == \"reward_contract\") {\n\t\treturn vnx::Variant(reward_contract);\n\t}\n\tif(_name == \"reward_account\") {\n\t\treturn vnx::Variant(reward_account);\n\t}\n\tif(_name == \"reward_vote\") {\n\t\treturn vnx::Variant(reward_vote);\n\t}\n\tif(_name == \"reward_vote_sum\") {\n\t\treturn vnx::Variant(reward_vote_sum);\n\t}\n\tif(_name == \"reward_vote_count\") {\n\t\treturn vnx::Variant(reward_vote_count);\n\t}\n\tif(_name == \"base_reward\") {\n\t\treturn vnx::Variant(base_reward);\n\t}\n\tif(_name == \"project_addr\") {\n\t\treturn vnx::Variant(project_addr);\n\t}\n\tif(_name == \"static_cost\") {\n\t\treturn vnx::Variant(static_cost);\n\t}\n\tif(_name == \"total_cost\") {\n\t\treturn vnx::Variant(total_cost);\n\t}\n\tif(_name == \"tx_count\") {\n\t\treturn vnx::Variant(tx_count);\n\t}\n\tif(_name == \"tx_fees\") {\n\t\treturn vnx::Variant(tx_fees);\n\t}\n\tif(_name == \"txfee_buffer\") {\n\t\treturn vnx::Variant(txfee_buffer);\n\t}\n\tif(_name == \"tx_hash\") {\n\t\treturn vnx::Variant(tx_hash);\n\t}\n\tif(_name == \"farmer_sig\") {\n\t\treturn vnx::Variant(farmer_sig);\n\t}\n\tif(_name == \"content_hash\") {\n\t\treturn vnx::Variant(content_hash);\n\t}\n\tif(_name == \"tx_list\") {\n\t\treturn vnx::Variant(tx_list);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Block::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"support_flags\") {\n\t\t_value.to(support_flags);\n\t} else if(_name == \"hash\") {\n\t\t_value.to(hash);\n\t} else if(_name == \"prev\") {\n\t\t_value.to(prev);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"vdf_height\") {\n\t\t_value.to(vdf_height);\n\t} else if(_name == \"nonce\") {\n\t\t_value.to(nonce);\n\t} else if(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"time_diff\") {\n\t\t_value.to(time_diff);\n\t} else if(_name == \"space_diff\") {\n\t\t_value.to(space_diff);\n\t} else if(_name == \"weight\") {\n\t\t_value.to(weight);\n\t} else if(_name == \"total_weight\") {\n\t\t_value.to(total_weight);\n\t} else if(_name == \"vdf_count\") {\n\t\t_value.to(vdf_count);\n\t} else if(_name == \"vdf_iters\") {\n\t\t_value.to(vdf_iters);\n\t} else if(_name == \"vdf_output\") {\n\t\t_value.to(vdf_output);\n\t} else if(_name == \"vdf_reward_addr\") {\n\t\t_value.to(vdf_reward_addr);\n\t} else if(_name == \"vdf_reward_payout\") {\n\t\t_value.to(vdf_reward_payout);\n\t} else if(_name == \"proof\") {\n\t\t_value.to(proof);\n\t} else if(_name == \"proof_hash\") {\n\t\t_value.to(proof_hash);\n\t} else if(_name == \"challenge\") {\n\t\t_value.to(challenge);\n\t} else if(_name == \"is_space_fork\") {\n\t\t_value.to(is_space_fork);\n\t} else if(_name == \"space_fork_len\") {\n\t\t_value.to(space_fork_len);\n\t} else if(_name == \"space_fork_proofs\") {\n\t\t_value.to(space_fork_proofs);\n\t} else if(_name == \"reward_amount\") {\n\t\t_value.to(reward_amount);\n\t} else if(_name == \"reward_addr\") {\n\t\t_value.to(reward_addr);\n\t} else if(_name == \"reward_contract\") {\n\t\t_value.to(reward_contract);\n\t} else if(_name == \"reward_account\") {\n\t\t_value.to(reward_account);\n\t} else if(_name == \"reward_vote\") {\n\t\t_value.to(reward_vote);\n\t} else if(_name == \"reward_vote_sum\") {\n\t\t_value.to(reward_vote_sum);\n\t} else if(_name == \"reward_vote_count\") {\n\t\t_value.to(reward_vote_count);\n\t} else if(_name == \"base_reward\") {\n\t\t_value.to(base_reward);\n\t} else if(_name == \"project_addr\") {\n\t\t_value.to(project_addr);\n\t} else if(_name == \"static_cost\") {\n\t\t_value.to(static_cost);\n\t} else if(_name == \"total_cost\") {\n\t\t_value.to(total_cost);\n\t} else if(_name == \"tx_count\") {\n\t\t_value.to(tx_count);\n\t} else if(_name == \"tx_fees\") {\n\t\t_value.to(tx_fees);\n\t} else if(_name == \"txfee_buffer\") {\n\t\t_value.to(txfee_buffer);\n\t} else if(_name == \"tx_hash\") {\n\t\t_value.to(tx_hash);\n\t} else if(_name == \"farmer_sig\") {\n\t\t_value.to(farmer_sig);\n\t} else if(_name == \"content_hash\") {\n\t\t_value.to(content_hash);\n\t} else if(_name == \"tx_list\") {\n\t\t_value.to(tx_list);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Block& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Block& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Block::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Block::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Block\";\n\ttype_code->type_hash = vnx::Hash64(0x94965d816d328467ull);\n\ttype_code->code_hash = vnx::Hash64(0x3d36c5edbb8788e3ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::Block);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::BlockHeader::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Block>(); };\n\ttype_code->fields.resize(41);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"support_flags\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"prev\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"nonce\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_diff\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"space_diff\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"weight\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"total_weight\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_count\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"vdf_iters\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"vdf_output\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[15];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"vdf_reward_addr\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[16];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"vdf_reward_payout\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[17];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"proof\";\n\t\tfield.code = {12, 16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[18];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"proof_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[19];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"challenge\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[20];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_space_fork\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[21];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"space_fork_len\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[22];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"space_fork_proofs\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[23];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"reward_amount\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[24];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_addr\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[25];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_contract\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[26];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_account\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[27];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"reward_vote\";\n\t\tfield.code = {5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[28];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"reward_vote_sum\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[29];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"reward_vote_count\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[30];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"base_reward\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[31];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"project_addr\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[32];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"static_cost\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[33];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"total_cost\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[34];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"tx_count\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[35];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"tx_fees\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[36];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"txfee_buffer\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[37];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"tx_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[38];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_sig\";\n\t\tfield.code = {33, 11, 64, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[39];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"content_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[40];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"tx_list\";\n\t\tfield.code = {12, 16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Block::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Block& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.support_flags, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.nonce, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_stamp, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_diff, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[9]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.space_diff, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[12]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_count, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[13]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_iters, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[20]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_space_fork, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[21]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.space_fork_len, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[22]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.space_fork_proofs, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[23]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_amount, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[27]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_vote, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[28]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_vote_sum, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[29]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_vote_count, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[30]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.base_reward, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[32]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.static_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[33]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[34]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.tx_count, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[35]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.tx_fees, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[36]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.txfee_buffer, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 2: vnx::read(in, value.hash, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.prev, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.weight, type_code, _field->code.data()); break;\n\t\t\tcase 11: vnx::read(in, value.total_weight, type_code, _field->code.data()); break;\n\t\t\tcase 14: vnx::read(in, value.vdf_output, type_code, _field->code.data()); break;\n\t\t\tcase 15: vnx::read(in, value.vdf_reward_addr, type_code, _field->code.data()); break;\n\t\t\tcase 16: vnx::read(in, value.vdf_reward_payout, type_code, _field->code.data()); break;\n\t\t\tcase 17: vnx::read(in, value.proof, type_code, _field->code.data()); break;\n\t\t\tcase 18: vnx::read(in, value.proof_hash, type_code, _field->code.data()); break;\n\t\t\tcase 19: vnx::read(in, value.challenge, type_code, _field->code.data()); break;\n\t\t\tcase 24: vnx::read(in, value.reward_addr, type_code, _field->code.data()); break;\n\t\t\tcase 25: vnx::read(in, value.reward_contract, type_code, _field->code.data()); break;\n\t\t\tcase 26: vnx::read(in, value.reward_account, type_code, _field->code.data()); break;\n\t\t\tcase 31: vnx::read(in, value.project_addr, type_code, _field->code.data()); break;\n\t\t\tcase 37: vnx::read(in, value.tx_hash, type_code, _field->code.data()); break;\n\t\t\tcase 38: vnx::read(in, value.farmer_sig, type_code, _field->code.data()); break;\n\t\t\tcase 39: vnx::read(in, value.content_hash, type_code, _field->code.data()); break;\n\t\t\tcase 40: vnx::read(in, value.tx_list, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Block& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Block;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Block>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(130);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.support_flags);\n\tvnx::write_value(_buf + 8, value.height);\n\tvnx::write_value(_buf + 12, value.vdf_height);\n\tvnx::write_value(_buf + 16, value.nonce);\n\tvnx::write_value(_buf + 24, value.time_stamp);\n\tvnx::write_value(_buf + 32, value.time_diff);\n\tvnx::write_value(_buf + 40, value.space_diff);\n\tvnx::write_value(_buf + 48, value.vdf_count);\n\tvnx::write_value(_buf + 52, value.vdf_iters);\n\tvnx::write_value(_buf + 60, value.is_space_fork);\n\tvnx::write_value(_buf + 61, value.space_fork_len);\n\tvnx::write_value(_buf + 65, value.space_fork_proofs);\n\tvnx::write_value(_buf + 69, value.reward_amount);\n\tvnx::write_value(_buf + 77, value.reward_vote);\n\tvnx::write_value(_buf + 78, value.reward_vote_sum);\n\tvnx::write_value(_buf + 82, value.reward_vote_count);\n\tvnx::write_value(_buf + 86, value.base_reward);\n\tvnx::write_value(_buf + 94, value.static_cost);\n\tvnx::write_value(_buf + 102, value.total_cost);\n\tvnx::write_value(_buf + 110, value.tx_count);\n\tvnx::write_value(_buf + 114, value.tx_fees);\n\tvnx::write_value(_buf + 122, value.txfee_buffer);\n\tvnx::write(out, value.hash, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.prev, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.weight, type_code, type_code->fields[10].code.data());\n\tvnx::write(out, value.total_weight, type_code, type_code->fields[11].code.data());\n\tvnx::write(out, value.vdf_output, type_code, type_code->fields[14].code.data());\n\tvnx::write(out, value.vdf_reward_addr, type_code, type_code->fields[15].code.data());\n\tvnx::write(out, value.vdf_reward_payout, type_code, type_code->fields[16].code.data());\n\tvnx::write(out, value.proof, type_code, type_code->fields[17].code.data());\n\tvnx::write(out, value.proof_hash, type_code, type_code->fields[18].code.data());\n\tvnx::write(out, value.challenge, type_code, type_code->fields[19].code.data());\n\tvnx::write(out, value.reward_addr, type_code, type_code->fields[24].code.data());\n\tvnx::write(out, value.reward_contract, type_code, type_code->fields[25].code.data());\n\tvnx::write(out, value.reward_account, type_code, type_code->fields[26].code.data());\n\tvnx::write(out, value.project_addr, type_code, type_code->fields[31].code.data());\n\tvnx::write(out, value.tx_hash, type_code, type_code->fields[37].code.data());\n\tvnx::write(out, value.farmer_sig, type_code, type_code->fields[38].code.data());\n\tvnx::write(out, value.content_hash, type_code, type_code->fields[39].code.data());\n\tvnx::write(out, value.tx_list, type_code, type_code->fields[40].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Block& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Block& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Block& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/BlockHeader.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/block_index_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nconst uint32_t BlockHeader::SUPPORT_HARDFORK1;\n\nconst vnx::Hash64 BlockHeader::VNX_TYPE_HASH(0xcaae941a2fc712a6ull);\nconst vnx::Hash64 BlockHeader::VNX_CODE_HASH(0xa96ccf5d216026e8ull);\n\nvnx::Hash64 BlockHeader::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string BlockHeader::get_type_name() const {\n\treturn \"mmx.BlockHeader\";\n}\n\nconst vnx::TypeCode* BlockHeader::get_type_code() const {\n\treturn mmx::vnx_native_type_code_BlockHeader;\n}\n\nstd::shared_ptr<BlockHeader> BlockHeader::create() {\n\treturn std::make_shared<BlockHeader>();\n}\n\nstd::shared_ptr<vnx::Value> BlockHeader::clone() const {\n\treturn std::make_shared<BlockHeader>(*this);\n}\n\nvoid BlockHeader::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid BlockHeader::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid BlockHeader::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_BlockHeader;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, support_flags);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, hash);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, prev);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, vdf_height);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, nonce);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, time_diff);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, space_diff);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, weight);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, total_weight);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, vdf_count);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, vdf_iters);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, vdf_output);\n\t_visitor.type_field(_type_code->fields[15], 15); vnx::accept(_visitor, vdf_reward_addr);\n\t_visitor.type_field(_type_code->fields[16], 16); vnx::accept(_visitor, vdf_reward_payout);\n\t_visitor.type_field(_type_code->fields[17], 17); vnx::accept(_visitor, proof);\n\t_visitor.type_field(_type_code->fields[18], 18); vnx::accept(_visitor, proof_hash);\n\t_visitor.type_field(_type_code->fields[19], 19); vnx::accept(_visitor, challenge);\n\t_visitor.type_field(_type_code->fields[20], 20); vnx::accept(_visitor, is_space_fork);\n\t_visitor.type_field(_type_code->fields[21], 21); vnx::accept(_visitor, space_fork_len);\n\t_visitor.type_field(_type_code->fields[22], 22); vnx::accept(_visitor, space_fork_proofs);\n\t_visitor.type_field(_type_code->fields[23], 23); vnx::accept(_visitor, reward_amount);\n\t_visitor.type_field(_type_code->fields[24], 24); vnx::accept(_visitor, reward_addr);\n\t_visitor.type_field(_type_code->fields[25], 25); vnx::accept(_visitor, reward_contract);\n\t_visitor.type_field(_type_code->fields[26], 26); vnx::accept(_visitor, reward_account);\n\t_visitor.type_field(_type_code->fields[27], 27); vnx::accept(_visitor, reward_vote);\n\t_visitor.type_field(_type_code->fields[28], 28); vnx::accept(_visitor, reward_vote_sum);\n\t_visitor.type_field(_type_code->fields[29], 29); vnx::accept(_visitor, reward_vote_count);\n\t_visitor.type_field(_type_code->fields[30], 30); vnx::accept(_visitor, base_reward);\n\t_visitor.type_field(_type_code->fields[31], 31); vnx::accept(_visitor, project_addr);\n\t_visitor.type_field(_type_code->fields[32], 32); vnx::accept(_visitor, static_cost);\n\t_visitor.type_field(_type_code->fields[33], 33); vnx::accept(_visitor, total_cost);\n\t_visitor.type_field(_type_code->fields[34], 34); vnx::accept(_visitor, tx_count);\n\t_visitor.type_field(_type_code->fields[35], 35); vnx::accept(_visitor, tx_fees);\n\t_visitor.type_field(_type_code->fields[36], 36); vnx::accept(_visitor, txfee_buffer);\n\t_visitor.type_field(_type_code->fields[37], 37); vnx::accept(_visitor, tx_hash);\n\t_visitor.type_field(_type_code->fields[38], 38); vnx::accept(_visitor, farmer_sig);\n\t_visitor.type_field(_type_code->fields[39], 39); vnx::accept(_visitor, content_hash);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid BlockHeader::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.BlockHeader\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"support_flags\\\": \"; vnx::write(_out, support_flags);\n\t_out << \", \\\"hash\\\": \"; vnx::write(_out, hash);\n\t_out << \", \\\"prev\\\": \"; vnx::write(_out, prev);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"vdf_height\\\": \"; vnx::write(_out, vdf_height);\n\t_out << \", \\\"nonce\\\": \"; vnx::write(_out, nonce);\n\t_out << \", \\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"time_diff\\\": \"; vnx::write(_out, time_diff);\n\t_out << \", \\\"space_diff\\\": \"; vnx::write(_out, space_diff);\n\t_out << \", \\\"weight\\\": \"; vnx::write(_out, weight);\n\t_out << \", \\\"total_weight\\\": \"; vnx::write(_out, total_weight);\n\t_out << \", \\\"vdf_count\\\": \"; vnx::write(_out, vdf_count);\n\t_out << \", \\\"vdf_iters\\\": \"; vnx::write(_out, vdf_iters);\n\t_out << \", \\\"vdf_output\\\": \"; vnx::write(_out, vdf_output);\n\t_out << \", \\\"vdf_reward_addr\\\": \"; vnx::write(_out, vdf_reward_addr);\n\t_out << \", \\\"vdf_reward_payout\\\": \"; vnx::write(_out, vdf_reward_payout);\n\t_out << \", \\\"proof\\\": \"; vnx::write(_out, proof);\n\t_out << \", \\\"proof_hash\\\": \"; vnx::write(_out, proof_hash);\n\t_out << \", \\\"challenge\\\": \"; vnx::write(_out, challenge);\n\t_out << \", \\\"is_space_fork\\\": \"; vnx::write(_out, is_space_fork);\n\t_out << \", \\\"space_fork_len\\\": \"; vnx::write(_out, space_fork_len);\n\t_out << \", \\\"space_fork_proofs\\\": \"; vnx::write(_out, space_fork_proofs);\n\t_out << \", \\\"reward_amount\\\": \"; vnx::write(_out, reward_amount);\n\t_out << \", \\\"reward_addr\\\": \"; vnx::write(_out, reward_addr);\n\t_out << \", \\\"reward_contract\\\": \"; vnx::write(_out, reward_contract);\n\t_out << \", \\\"reward_account\\\": \"; vnx::write(_out, reward_account);\n\t_out << \", \\\"reward_vote\\\": \"; vnx::write(_out, reward_vote);\n\t_out << \", \\\"reward_vote_sum\\\": \"; vnx::write(_out, reward_vote_sum);\n\t_out << \", \\\"reward_vote_count\\\": \"; vnx::write(_out, reward_vote_count);\n\t_out << \", \\\"base_reward\\\": \"; vnx::write(_out, base_reward);\n\t_out << \", \\\"project_addr\\\": \"; vnx::write(_out, project_addr);\n\t_out << \", \\\"static_cost\\\": \"; vnx::write(_out, static_cost);\n\t_out << \", \\\"total_cost\\\": \"; vnx::write(_out, total_cost);\n\t_out << \", \\\"tx_count\\\": \"; vnx::write(_out, tx_count);\n\t_out << \", \\\"tx_fees\\\": \"; vnx::write(_out, tx_fees);\n\t_out << \", \\\"txfee_buffer\\\": \"; vnx::write(_out, txfee_buffer);\n\t_out << \", \\\"tx_hash\\\": \"; vnx::write(_out, tx_hash);\n\t_out << \", \\\"farmer_sig\\\": \"; vnx::write(_out, farmer_sig);\n\t_out << \", \\\"content_hash\\\": \"; vnx::write(_out, content_hash);\n\t_out << \"}\";\n}\n\nvoid BlockHeader::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object BlockHeader::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.BlockHeader\";\n\t_object[\"version\"] = version;\n\t_object[\"support_flags\"] = support_flags;\n\t_object[\"hash\"] = hash;\n\t_object[\"prev\"] = prev;\n\t_object[\"height\"] = height;\n\t_object[\"vdf_height\"] = vdf_height;\n\t_object[\"nonce\"] = nonce;\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"time_diff\"] = time_diff;\n\t_object[\"space_diff\"] = space_diff;\n\t_object[\"weight\"] = weight;\n\t_object[\"total_weight\"] = total_weight;\n\t_object[\"vdf_count\"] = vdf_count;\n\t_object[\"vdf_iters\"] = vdf_iters;\n\t_object[\"vdf_output\"] = vdf_output;\n\t_object[\"vdf_reward_addr\"] = vdf_reward_addr;\n\t_object[\"vdf_reward_payout\"] = vdf_reward_payout;\n\t_object[\"proof\"] = proof;\n\t_object[\"proof_hash\"] = proof_hash;\n\t_object[\"challenge\"] = challenge;\n\t_object[\"is_space_fork\"] = is_space_fork;\n\t_object[\"space_fork_len\"] = space_fork_len;\n\t_object[\"space_fork_proofs\"] = space_fork_proofs;\n\t_object[\"reward_amount\"] = reward_amount;\n\t_object[\"reward_addr\"] = reward_addr;\n\t_object[\"reward_contract\"] = reward_contract;\n\t_object[\"reward_account\"] = reward_account;\n\t_object[\"reward_vote\"] = reward_vote;\n\t_object[\"reward_vote_sum\"] = reward_vote_sum;\n\t_object[\"reward_vote_count\"] = reward_vote_count;\n\t_object[\"base_reward\"] = base_reward;\n\t_object[\"project_addr\"] = project_addr;\n\t_object[\"static_cost\"] = static_cost;\n\t_object[\"total_cost\"] = total_cost;\n\t_object[\"tx_count\"] = tx_count;\n\t_object[\"tx_fees\"] = tx_fees;\n\t_object[\"txfee_buffer\"] = txfee_buffer;\n\t_object[\"tx_hash\"] = tx_hash;\n\t_object[\"farmer_sig\"] = farmer_sig;\n\t_object[\"content_hash\"] = content_hash;\n\treturn _object;\n}\n\nvoid BlockHeader::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"base_reward\") {\n\t\t\t_entry.second.to(base_reward);\n\t\t} else if(_entry.first == \"challenge\") {\n\t\t\t_entry.second.to(challenge);\n\t\t} else if(_entry.first == \"content_hash\") {\n\t\t\t_entry.second.to(content_hash);\n\t\t} else if(_entry.first == \"farmer_sig\") {\n\t\t\t_entry.second.to(farmer_sig);\n\t\t} else if(_entry.first == \"hash\") {\n\t\t\t_entry.second.to(hash);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"is_space_fork\") {\n\t\t\t_entry.second.to(is_space_fork);\n\t\t} else if(_entry.first == \"nonce\") {\n\t\t\t_entry.second.to(nonce);\n\t\t} else if(_entry.first == \"prev\") {\n\t\t\t_entry.second.to(prev);\n\t\t} else if(_entry.first == \"project_addr\") {\n\t\t\t_entry.second.to(project_addr);\n\t\t} else if(_entry.first == \"proof\") {\n\t\t\t_entry.second.to(proof);\n\t\t} else if(_entry.first == \"proof_hash\") {\n\t\t\t_entry.second.to(proof_hash);\n\t\t} else if(_entry.first == \"reward_account\") {\n\t\t\t_entry.second.to(reward_account);\n\t\t} else if(_entry.first == \"reward_addr\") {\n\t\t\t_entry.second.to(reward_addr);\n\t\t} else if(_entry.first == \"reward_amount\") {\n\t\t\t_entry.second.to(reward_amount);\n\t\t} else if(_entry.first == \"reward_contract\") {\n\t\t\t_entry.second.to(reward_contract);\n\t\t} else if(_entry.first == \"reward_vote\") {\n\t\t\t_entry.second.to(reward_vote);\n\t\t} else if(_entry.first == \"reward_vote_count\") {\n\t\t\t_entry.second.to(reward_vote_count);\n\t\t} else if(_entry.first == \"reward_vote_sum\") {\n\t\t\t_entry.second.to(reward_vote_sum);\n\t\t} else if(_entry.first == \"space_diff\") {\n\t\t\t_entry.second.to(space_diff);\n\t\t} else if(_entry.first == \"space_fork_len\") {\n\t\t\t_entry.second.to(space_fork_len);\n\t\t} else if(_entry.first == \"space_fork_proofs\") {\n\t\t\t_entry.second.to(space_fork_proofs);\n\t\t} else if(_entry.first == \"static_cost\") {\n\t\t\t_entry.second.to(static_cost);\n\t\t} else if(_entry.first == \"support_flags\") {\n\t\t\t_entry.second.to(support_flags);\n\t\t} else if(_entry.first == \"time_diff\") {\n\t\t\t_entry.second.to(time_diff);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t} else if(_entry.first == \"total_cost\") {\n\t\t\t_entry.second.to(total_cost);\n\t\t} else if(_entry.first == \"total_weight\") {\n\t\t\t_entry.second.to(total_weight);\n\t\t} else if(_entry.first == \"tx_count\") {\n\t\t\t_entry.second.to(tx_count);\n\t\t} else if(_entry.first == \"tx_fees\") {\n\t\t\t_entry.second.to(tx_fees);\n\t\t} else if(_entry.first == \"tx_hash\") {\n\t\t\t_entry.second.to(tx_hash);\n\t\t} else if(_entry.first == \"txfee_buffer\") {\n\t\t\t_entry.second.to(txfee_buffer);\n\t\t} else if(_entry.first == \"vdf_count\") {\n\t\t\t_entry.second.to(vdf_count);\n\t\t} else if(_entry.first == \"vdf_height\") {\n\t\t\t_entry.second.to(vdf_height);\n\t\t} else if(_entry.first == \"vdf_iters\") {\n\t\t\t_entry.second.to(vdf_iters);\n\t\t} else if(_entry.first == \"vdf_output\") {\n\t\t\t_entry.second.to(vdf_output);\n\t\t} else if(_entry.first == \"vdf_reward_addr\") {\n\t\t\t_entry.second.to(vdf_reward_addr);\n\t\t} else if(_entry.first == \"vdf_reward_payout\") {\n\t\t\t_entry.second.to(vdf_reward_payout);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t} else if(_entry.first == \"weight\") {\n\t\t\t_entry.second.to(weight);\n\t\t}\n\t}\n}\n\nvnx::Variant BlockHeader::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"support_flags\") {\n\t\treturn vnx::Variant(support_flags);\n\t}\n\tif(_name == \"hash\") {\n\t\treturn vnx::Variant(hash);\n\t}\n\tif(_name == \"prev\") {\n\t\treturn vnx::Variant(prev);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"vdf_height\") {\n\t\treturn vnx::Variant(vdf_height);\n\t}\n\tif(_name == \"nonce\") {\n\t\treturn vnx::Variant(nonce);\n\t}\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"time_diff\") {\n\t\treturn vnx::Variant(time_diff);\n\t}\n\tif(_name == \"space_diff\") {\n\t\treturn vnx::Variant(space_diff);\n\t}\n\tif(_name == \"weight\") {\n\t\treturn vnx::Variant(weight);\n\t}\n\tif(_name == \"total_weight\") {\n\t\treturn vnx::Variant(total_weight);\n\t}\n\tif(_name == \"vdf_count\") {\n\t\treturn vnx::Variant(vdf_count);\n\t}\n\tif(_name == \"vdf_iters\") {\n\t\treturn vnx::Variant(vdf_iters);\n\t}\n\tif(_name == \"vdf_output\") {\n\t\treturn vnx::Variant(vdf_output);\n\t}\n\tif(_name == \"vdf_reward_addr\") {\n\t\treturn vnx::Variant(vdf_reward_addr);\n\t}\n\tif(_name == \"vdf_reward_payout\") {\n\t\treturn vnx::Variant(vdf_reward_payout);\n\t}\n\tif(_name == \"proof\") {\n\t\treturn vnx::Variant(proof);\n\t}\n\tif(_name == \"proof_hash\") {\n\t\treturn vnx::Variant(proof_hash);\n\t}\n\tif(_name == \"challenge\") {\n\t\treturn vnx::Variant(challenge);\n\t}\n\tif(_name == \"is_space_fork\") {\n\t\treturn vnx::Variant(is_space_fork);\n\t}\n\tif(_name == \"space_fork_len\") {\n\t\treturn vnx::Variant(space_fork_len);\n\t}\n\tif(_name == \"space_fork_proofs\") {\n\t\treturn vnx::Variant(space_fork_proofs);\n\t}\n\tif(_name == \"reward_amount\") {\n\t\treturn vnx::Variant(reward_amount);\n\t}\n\tif(_name == \"reward_addr\") {\n\t\treturn vnx::Variant(reward_addr);\n\t}\n\tif(_name == \"reward_contract\") {\n\t\treturn vnx::Variant(reward_contract);\n\t}\n\tif(_name == \"reward_account\") {\n\t\treturn vnx::Variant(reward_account);\n\t}\n\tif(_name == \"reward_vote\") {\n\t\treturn vnx::Variant(reward_vote);\n\t}\n\tif(_name == \"reward_vote_sum\") {\n\t\treturn vnx::Variant(reward_vote_sum);\n\t}\n\tif(_name == \"reward_vote_count\") {\n\t\treturn vnx::Variant(reward_vote_count);\n\t}\n\tif(_name == \"base_reward\") {\n\t\treturn vnx::Variant(base_reward);\n\t}\n\tif(_name == \"project_addr\") {\n\t\treturn vnx::Variant(project_addr);\n\t}\n\tif(_name == \"static_cost\") {\n\t\treturn vnx::Variant(static_cost);\n\t}\n\tif(_name == \"total_cost\") {\n\t\treturn vnx::Variant(total_cost);\n\t}\n\tif(_name == \"tx_count\") {\n\t\treturn vnx::Variant(tx_count);\n\t}\n\tif(_name == \"tx_fees\") {\n\t\treturn vnx::Variant(tx_fees);\n\t}\n\tif(_name == \"txfee_buffer\") {\n\t\treturn vnx::Variant(txfee_buffer);\n\t}\n\tif(_name == \"tx_hash\") {\n\t\treturn vnx::Variant(tx_hash);\n\t}\n\tif(_name == \"farmer_sig\") {\n\t\treturn vnx::Variant(farmer_sig);\n\t}\n\tif(_name == \"content_hash\") {\n\t\treturn vnx::Variant(content_hash);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid BlockHeader::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"support_flags\") {\n\t\t_value.to(support_flags);\n\t} else if(_name == \"hash\") {\n\t\t_value.to(hash);\n\t} else if(_name == \"prev\") {\n\t\t_value.to(prev);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"vdf_height\") {\n\t\t_value.to(vdf_height);\n\t} else if(_name == \"nonce\") {\n\t\t_value.to(nonce);\n\t} else if(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"time_diff\") {\n\t\t_value.to(time_diff);\n\t} else if(_name == \"space_diff\") {\n\t\t_value.to(space_diff);\n\t} else if(_name == \"weight\") {\n\t\t_value.to(weight);\n\t} else if(_name == \"total_weight\") {\n\t\t_value.to(total_weight);\n\t} else if(_name == \"vdf_count\") {\n\t\t_value.to(vdf_count);\n\t} else if(_name == \"vdf_iters\") {\n\t\t_value.to(vdf_iters);\n\t} else if(_name == \"vdf_output\") {\n\t\t_value.to(vdf_output);\n\t} else if(_name == \"vdf_reward_addr\") {\n\t\t_value.to(vdf_reward_addr);\n\t} else if(_name == \"vdf_reward_payout\") {\n\t\t_value.to(vdf_reward_payout);\n\t} else if(_name == \"proof\") {\n\t\t_value.to(proof);\n\t} else if(_name == \"proof_hash\") {\n\t\t_value.to(proof_hash);\n\t} else if(_name == \"challenge\") {\n\t\t_value.to(challenge);\n\t} else if(_name == \"is_space_fork\") {\n\t\t_value.to(is_space_fork);\n\t} else if(_name == \"space_fork_len\") {\n\t\t_value.to(space_fork_len);\n\t} else if(_name == \"space_fork_proofs\") {\n\t\t_value.to(space_fork_proofs);\n\t} else if(_name == \"reward_amount\") {\n\t\t_value.to(reward_amount);\n\t} else if(_name == \"reward_addr\") {\n\t\t_value.to(reward_addr);\n\t} else if(_name == \"reward_contract\") {\n\t\t_value.to(reward_contract);\n\t} else if(_name == \"reward_account\") {\n\t\t_value.to(reward_account);\n\t} else if(_name == \"reward_vote\") {\n\t\t_value.to(reward_vote);\n\t} else if(_name == \"reward_vote_sum\") {\n\t\t_value.to(reward_vote_sum);\n\t} else if(_name == \"reward_vote_count\") {\n\t\t_value.to(reward_vote_count);\n\t} else if(_name == \"base_reward\") {\n\t\t_value.to(base_reward);\n\t} else if(_name == \"project_addr\") {\n\t\t_value.to(project_addr);\n\t} else if(_name == \"static_cost\") {\n\t\t_value.to(static_cost);\n\t} else if(_name == \"total_cost\") {\n\t\t_value.to(total_cost);\n\t} else if(_name == \"tx_count\") {\n\t\t_value.to(tx_count);\n\t} else if(_name == \"tx_fees\") {\n\t\t_value.to(tx_fees);\n\t} else if(_name == \"txfee_buffer\") {\n\t\t_value.to(txfee_buffer);\n\t} else if(_name == \"tx_hash\") {\n\t\t_value.to(tx_hash);\n\t} else if(_name == \"farmer_sig\") {\n\t\t_value.to(farmer_sig);\n\t} else if(_name == \"content_hash\") {\n\t\t_value.to(content_hash);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const BlockHeader& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, BlockHeader& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* BlockHeader::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> BlockHeader::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.BlockHeader\";\n\ttype_code->type_hash = vnx::Hash64(0xcaae941a2fc712a6ull);\n\ttype_code->code_hash = vnx::Hash64(0xa96ccf5d216026e8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::BlockHeader);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<BlockHeader>(); };\n\ttype_code->fields.resize(40);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"support_flags\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"prev\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"nonce\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_diff\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"space_diff\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"weight\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"total_weight\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_count\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"vdf_iters\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"vdf_output\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[15];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"vdf_reward_addr\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[16];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"vdf_reward_payout\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[17];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"proof\";\n\t\tfield.code = {12, 16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[18];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"proof_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[19];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"challenge\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[20];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_space_fork\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[21];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"space_fork_len\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[22];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"space_fork_proofs\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[23];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"reward_amount\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[24];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_addr\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[25];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_contract\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[26];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_account\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[27];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"reward_vote\";\n\t\tfield.code = {5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[28];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"reward_vote_sum\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[29];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"reward_vote_count\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[30];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"base_reward\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[31];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"project_addr\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[32];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"static_cost\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[33];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"total_cost\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[34];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"tx_count\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[35];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"tx_fees\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[36];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"txfee_buffer\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[37];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"tx_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[38];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_sig\";\n\t\tfield.code = {33, 11, 64, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[39];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"content_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> BlockHeader::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::BlockHeader& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.support_flags, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.nonce, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_stamp, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_diff, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[9]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.space_diff, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[12]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_count, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[13]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_iters, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[20]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_space_fork, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[21]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.space_fork_len, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[22]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.space_fork_proofs, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[23]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_amount, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[27]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_vote, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[28]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_vote_sum, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[29]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_vote_count, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[30]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.base_reward, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[32]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.static_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[33]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[34]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.tx_count, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[35]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.tx_fees, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[36]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.txfee_buffer, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 2: vnx::read(in, value.hash, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.prev, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.weight, type_code, _field->code.data()); break;\n\t\t\tcase 11: vnx::read(in, value.total_weight, type_code, _field->code.data()); break;\n\t\t\tcase 14: vnx::read(in, value.vdf_output, type_code, _field->code.data()); break;\n\t\t\tcase 15: vnx::read(in, value.vdf_reward_addr, type_code, _field->code.data()); break;\n\t\t\tcase 16: vnx::read(in, value.vdf_reward_payout, type_code, _field->code.data()); break;\n\t\t\tcase 17: vnx::read(in, value.proof, type_code, _field->code.data()); break;\n\t\t\tcase 18: vnx::read(in, value.proof_hash, type_code, _field->code.data()); break;\n\t\t\tcase 19: vnx::read(in, value.challenge, type_code, _field->code.data()); break;\n\t\t\tcase 24: vnx::read(in, value.reward_addr, type_code, _field->code.data()); break;\n\t\t\tcase 25: vnx::read(in, value.reward_contract, type_code, _field->code.data()); break;\n\t\t\tcase 26: vnx::read(in, value.reward_account, type_code, _field->code.data()); break;\n\t\t\tcase 31: vnx::read(in, value.project_addr, type_code, _field->code.data()); break;\n\t\t\tcase 37: vnx::read(in, value.tx_hash, type_code, _field->code.data()); break;\n\t\t\tcase 38: vnx::read(in, value.farmer_sig, type_code, _field->code.data()); break;\n\t\t\tcase 39: vnx::read(in, value.content_hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::BlockHeader& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_BlockHeader;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::BlockHeader>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(130);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.support_flags);\n\tvnx::write_value(_buf + 8, value.height);\n\tvnx::write_value(_buf + 12, value.vdf_height);\n\tvnx::write_value(_buf + 16, value.nonce);\n\tvnx::write_value(_buf + 24, value.time_stamp);\n\tvnx::write_value(_buf + 32, value.time_diff);\n\tvnx::write_value(_buf + 40, value.space_diff);\n\tvnx::write_value(_buf + 48, value.vdf_count);\n\tvnx::write_value(_buf + 52, value.vdf_iters);\n\tvnx::write_value(_buf + 60, value.is_space_fork);\n\tvnx::write_value(_buf + 61, value.space_fork_len);\n\tvnx::write_value(_buf + 65, value.space_fork_proofs);\n\tvnx::write_value(_buf + 69, value.reward_amount);\n\tvnx::write_value(_buf + 77, value.reward_vote);\n\tvnx::write_value(_buf + 78, value.reward_vote_sum);\n\tvnx::write_value(_buf + 82, value.reward_vote_count);\n\tvnx::write_value(_buf + 86, value.base_reward);\n\tvnx::write_value(_buf + 94, value.static_cost);\n\tvnx::write_value(_buf + 102, value.total_cost);\n\tvnx::write_value(_buf + 110, value.tx_count);\n\tvnx::write_value(_buf + 114, value.tx_fees);\n\tvnx::write_value(_buf + 122, value.txfee_buffer);\n\tvnx::write(out, value.hash, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.prev, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.weight, type_code, type_code->fields[10].code.data());\n\tvnx::write(out, value.total_weight, type_code, type_code->fields[11].code.data());\n\tvnx::write(out, value.vdf_output, type_code, type_code->fields[14].code.data());\n\tvnx::write(out, value.vdf_reward_addr, type_code, type_code->fields[15].code.data());\n\tvnx::write(out, value.vdf_reward_payout, type_code, type_code->fields[16].code.data());\n\tvnx::write(out, value.proof, type_code, type_code->fields[17].code.data());\n\tvnx::write(out, value.proof_hash, type_code, type_code->fields[18].code.data());\n\tvnx::write(out, value.challenge, type_code, type_code->fields[19].code.data());\n\tvnx::write(out, value.reward_addr, type_code, type_code->fields[24].code.data());\n\tvnx::write(out, value.reward_contract, type_code, type_code->fields[25].code.data());\n\tvnx::write(out, value.reward_account, type_code, type_code->fields[26].code.data());\n\tvnx::write(out, value.project_addr, type_code, type_code->fields[31].code.data());\n\tvnx::write(out, value.tx_hash, type_code, type_code->fields[37].code.data());\n\tvnx::write(out, value.farmer_sig, type_code, type_code->fields[38].code.data());\n\tvnx::write(out, value.content_hash, type_code, type_code->fields[39].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::BlockHeader& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::BlockHeader& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::BlockHeader& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ChainParams.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint_fraction_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ChainParams::VNX_TYPE_HASH(0x51bba8d28881e8e7ull);\nconst vnx::Hash64 ChainParams::VNX_CODE_HASH(0xc82fa8ec51986073ull);\n\nvnx::Hash64 ChainParams::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ChainParams::get_type_name() const {\n\treturn \"mmx.ChainParams\";\n}\n\nconst vnx::TypeCode* ChainParams::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ChainParams;\n}\n\nstd::shared_ptr<ChainParams> ChainParams::create() {\n\treturn std::make_shared<ChainParams>();\n}\n\nstd::shared_ptr<vnx::Value> ChainParams::clone() const {\n\treturn std::make_shared<ChainParams>(*this);\n}\n\nvoid ChainParams::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid ChainParams::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid ChainParams::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ChainParams;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, port);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, decimals);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, min_ksize);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, max_ksize);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, plot_filter);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, post_filter);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, commit_delay);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, infuse_delay);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, challenge_delay);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, challenge_interval);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, max_diff_adjust);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, max_vdf_count);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, avg_proof_count);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, max_proof_count);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, max_validators);\n\t_visitor.type_field(_type_code->fields[15], 15); vnx::accept(_visitor, min_reward);\n\t_visitor.type_field(_type_code->fields[16], 16); vnx::accept(_visitor, vdf_reward);\n\t_visitor.type_field(_type_code->fields[17], 17); vnx::accept(_visitor, vdf_reward_interval);\n\t_visitor.type_field(_type_code->fields[18], 18); vnx::accept(_visitor, vdf_segment_size);\n\t_visitor.type_field(_type_code->fields[19], 19); vnx::accept(_visitor, reward_adjust_div);\n\t_visitor.type_field(_type_code->fields[20], 20); vnx::accept(_visitor, reward_adjust_tick);\n\t_visitor.type_field(_type_code->fields[21], 21); vnx::accept(_visitor, reward_adjust_interval);\n\t_visitor.type_field(_type_code->fields[22], 22); vnx::accept(_visitor, target_mmx_gold_price);\n\t_visitor.type_field(_type_code->fields[23], 23); vnx::accept(_visitor, time_diff_divider);\n\t_visitor.type_field(_type_code->fields[24], 24); vnx::accept(_visitor, time_diff_constant);\n\t_visitor.type_field(_type_code->fields[25], 25); vnx::accept(_visitor, space_diff_constant);\n\t_visitor.type_field(_type_code->fields[26], 26); vnx::accept(_visitor, initial_time_diff);\n\t_visitor.type_field(_type_code->fields[27], 27); vnx::accept(_visitor, initial_space_diff);\n\t_visitor.type_field(_type_code->fields[28], 28); vnx::accept(_visitor, initial_time_stamp);\n\t_visitor.type_field(_type_code->fields[29], 29); vnx::accept(_visitor, min_txfee);\n\t_visitor.type_field(_type_code->fields[30], 30); vnx::accept(_visitor, min_txfee_io);\n\t_visitor.type_field(_type_code->fields[31], 31); vnx::accept(_visitor, min_txfee_sign);\n\t_visitor.type_field(_type_code->fields[32], 32); vnx::accept(_visitor, min_txfee_memo);\n\t_visitor.type_field(_type_code->fields[33], 33); vnx::accept(_visitor, min_txfee_exec);\n\t_visitor.type_field(_type_code->fields[34], 34); vnx::accept(_visitor, min_txfee_deploy);\n\t_visitor.type_field(_type_code->fields[35], 35); vnx::accept(_visitor, min_txfee_depend);\n\t_visitor.type_field(_type_code->fields[36], 36); vnx::accept(_visitor, min_txfee_byte);\n\t_visitor.type_field(_type_code->fields[37], 37); vnx::accept(_visitor, min_txfee_read);\n\t_visitor.type_field(_type_code->fields[38], 38); vnx::accept(_visitor, min_txfee_read_kbyte);\n\t_visitor.type_field(_type_code->fields[39], 39); vnx::accept(_visitor, max_block_size);\n\t_visitor.type_field(_type_code->fields[40], 40); vnx::accept(_visitor, max_block_cost);\n\t_visitor.type_field(_type_code->fields[41], 41); vnx::accept(_visitor, max_tx_cost);\n\t_visitor.type_field(_type_code->fields[42], 42); vnx::accept(_visitor, max_rcall_depth);\n\t_visitor.type_field(_type_code->fields[43], 43); vnx::accept(_visitor, max_rcall_width);\n\t_visitor.type_field(_type_code->fields[44], 44); vnx::accept(_visitor, min_fee_ratio);\n\t_visitor.type_field(_type_code->fields[45], 45); vnx::accept(_visitor, block_interval_ms);\n\t_visitor.type_field(_type_code->fields[46], 46); vnx::accept(_visitor, network);\n\t_visitor.type_field(_type_code->fields[47], 47); vnx::accept(_visitor, nft_binary);\n\t_visitor.type_field(_type_code->fields[48], 48); vnx::accept(_visitor, swap_binary);\n\t_visitor.type_field(_type_code->fields[49], 49); vnx::accept(_visitor, offer_binary);\n\t_visitor.type_field(_type_code->fields[50], 50); vnx::accept(_visitor, token_binary);\n\t_visitor.type_field(_type_code->fields[51], 51); vnx::accept(_visitor, plot_nft_binary);\n\t_visitor.type_field(_type_code->fields[52], 52); vnx::accept(_visitor, escrow_binary);\n\t_visitor.type_field(_type_code->fields[53], 53); vnx::accept(_visitor, time_lock_binary);\n\t_visitor.type_field(_type_code->fields[54], 54); vnx::accept(_visitor, relay_binary);\n\t_visitor.type_field(_type_code->fields[55], 55); vnx::accept(_visitor, fixed_project_reward);\n\t_visitor.type_field(_type_code->fields[56], 56); vnx::accept(_visitor, project_ratio);\n\t_visitor.type_field(_type_code->fields[57], 57); vnx::accept(_visitor, reward_activation);\n\t_visitor.type_field(_type_code->fields[58], 58); vnx::accept(_visitor, transaction_activation);\n\t_visitor.type_field(_type_code->fields[59], 59); vnx::accept(_visitor, hardfork1_height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ChainParams::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.ChainParams\\\"\";\n\t_out << \", \\\"port\\\": \"; vnx::write(_out, port);\n\t_out << \", \\\"decimals\\\": \"; vnx::write(_out, decimals);\n\t_out << \", \\\"min_ksize\\\": \"; vnx::write(_out, min_ksize);\n\t_out << \", \\\"max_ksize\\\": \"; vnx::write(_out, max_ksize);\n\t_out << \", \\\"plot_filter\\\": \"; vnx::write(_out, plot_filter);\n\t_out << \", \\\"post_filter\\\": \"; vnx::write(_out, post_filter);\n\t_out << \", \\\"commit_delay\\\": \"; vnx::write(_out, commit_delay);\n\t_out << \", \\\"infuse_delay\\\": \"; vnx::write(_out, infuse_delay);\n\t_out << \", \\\"challenge_delay\\\": \"; vnx::write(_out, challenge_delay);\n\t_out << \", \\\"challenge_interval\\\": \"; vnx::write(_out, challenge_interval);\n\t_out << \", \\\"max_diff_adjust\\\": \"; vnx::write(_out, max_diff_adjust);\n\t_out << \", \\\"max_vdf_count\\\": \"; vnx::write(_out, max_vdf_count);\n\t_out << \", \\\"avg_proof_count\\\": \"; vnx::write(_out, avg_proof_count);\n\t_out << \", \\\"max_proof_count\\\": \"; vnx::write(_out, max_proof_count);\n\t_out << \", \\\"max_validators\\\": \"; vnx::write(_out, max_validators);\n\t_out << \", \\\"min_reward\\\": \"; vnx::write(_out, min_reward);\n\t_out << \", \\\"vdf_reward\\\": \"; vnx::write(_out, vdf_reward);\n\t_out << \", \\\"vdf_reward_interval\\\": \"; vnx::write(_out, vdf_reward_interval);\n\t_out << \", \\\"vdf_segment_size\\\": \"; vnx::write(_out, vdf_segment_size);\n\t_out << \", \\\"reward_adjust_div\\\": \"; vnx::write(_out, reward_adjust_div);\n\t_out << \", \\\"reward_adjust_tick\\\": \"; vnx::write(_out, reward_adjust_tick);\n\t_out << \", \\\"reward_adjust_interval\\\": \"; vnx::write(_out, reward_adjust_interval);\n\t_out << \", \\\"target_mmx_gold_price\\\": \"; vnx::write(_out, target_mmx_gold_price);\n\t_out << \", \\\"time_diff_divider\\\": \"; vnx::write(_out, time_diff_divider);\n\t_out << \", \\\"time_diff_constant\\\": \"; vnx::write(_out, time_diff_constant);\n\t_out << \", \\\"space_diff_constant\\\": \"; vnx::write(_out, space_diff_constant);\n\t_out << \", \\\"initial_time_diff\\\": \"; vnx::write(_out, initial_time_diff);\n\t_out << \", \\\"initial_space_diff\\\": \"; vnx::write(_out, initial_space_diff);\n\t_out << \", \\\"initial_time_stamp\\\": \"; vnx::write(_out, initial_time_stamp);\n\t_out << \", \\\"min_txfee\\\": \"; vnx::write(_out, min_txfee);\n\t_out << \", \\\"min_txfee_io\\\": \"; vnx::write(_out, min_txfee_io);\n\t_out << \", \\\"min_txfee_sign\\\": \"; vnx::write(_out, min_txfee_sign);\n\t_out << \", \\\"min_txfee_memo\\\": \"; vnx::write(_out, min_txfee_memo);\n\t_out << \", \\\"min_txfee_exec\\\": \"; vnx::write(_out, min_txfee_exec);\n\t_out << \", \\\"min_txfee_deploy\\\": \"; vnx::write(_out, min_txfee_deploy);\n\t_out << \", \\\"min_txfee_depend\\\": \"; vnx::write(_out, min_txfee_depend);\n\t_out << \", \\\"min_txfee_byte\\\": \"; vnx::write(_out, min_txfee_byte);\n\t_out << \", \\\"min_txfee_read\\\": \"; vnx::write(_out, min_txfee_read);\n\t_out << \", \\\"min_txfee_read_kbyte\\\": \"; vnx::write(_out, min_txfee_read_kbyte);\n\t_out << \", \\\"max_block_size\\\": \"; vnx::write(_out, max_block_size);\n\t_out << \", \\\"max_block_cost\\\": \"; vnx::write(_out, max_block_cost);\n\t_out << \", \\\"max_tx_cost\\\": \"; vnx::write(_out, max_tx_cost);\n\t_out << \", \\\"max_rcall_depth\\\": \"; vnx::write(_out, max_rcall_depth);\n\t_out << \", \\\"max_rcall_width\\\": \"; vnx::write(_out, max_rcall_width);\n\t_out << \", \\\"min_fee_ratio\\\": \"; vnx::write(_out, min_fee_ratio);\n\t_out << \", \\\"block_interval_ms\\\": \"; vnx::write(_out, block_interval_ms);\n\t_out << \", \\\"network\\\": \"; vnx::write(_out, network);\n\t_out << \", \\\"nft_binary\\\": \"; vnx::write(_out, nft_binary);\n\t_out << \", \\\"swap_binary\\\": \"; vnx::write(_out, swap_binary);\n\t_out << \", \\\"offer_binary\\\": \"; vnx::write(_out, offer_binary);\n\t_out << \", \\\"token_binary\\\": \"; vnx::write(_out, token_binary);\n\t_out << \", \\\"plot_nft_binary\\\": \"; vnx::write(_out, plot_nft_binary);\n\t_out << \", \\\"escrow_binary\\\": \"; vnx::write(_out, escrow_binary);\n\t_out << \", \\\"time_lock_binary\\\": \"; vnx::write(_out, time_lock_binary);\n\t_out << \", \\\"relay_binary\\\": \"; vnx::write(_out, relay_binary);\n\t_out << \", \\\"fixed_project_reward\\\": \"; vnx::write(_out, fixed_project_reward);\n\t_out << \", \\\"project_ratio\\\": \"; vnx::write(_out, project_ratio);\n\t_out << \", \\\"reward_activation\\\": \"; vnx::write(_out, reward_activation);\n\t_out << \", \\\"transaction_activation\\\": \"; vnx::write(_out, transaction_activation);\n\t_out << \", \\\"hardfork1_height\\\": \"; vnx::write(_out, hardfork1_height);\n\t_out << \"}\";\n}\n\nvoid ChainParams::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ChainParams::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ChainParams\";\n\t_object[\"port\"] = port;\n\t_object[\"decimals\"] = decimals;\n\t_object[\"min_ksize\"] = min_ksize;\n\t_object[\"max_ksize\"] = max_ksize;\n\t_object[\"plot_filter\"] = plot_filter;\n\t_object[\"post_filter\"] = post_filter;\n\t_object[\"commit_delay\"] = commit_delay;\n\t_object[\"infuse_delay\"] = infuse_delay;\n\t_object[\"challenge_delay\"] = challenge_delay;\n\t_object[\"challenge_interval\"] = challenge_interval;\n\t_object[\"max_diff_adjust\"] = max_diff_adjust;\n\t_object[\"max_vdf_count\"] = max_vdf_count;\n\t_object[\"avg_proof_count\"] = avg_proof_count;\n\t_object[\"max_proof_count\"] = max_proof_count;\n\t_object[\"max_validators\"] = max_validators;\n\t_object[\"min_reward\"] = min_reward;\n\t_object[\"vdf_reward\"] = vdf_reward;\n\t_object[\"vdf_reward_interval\"] = vdf_reward_interval;\n\t_object[\"vdf_segment_size\"] = vdf_segment_size;\n\t_object[\"reward_adjust_div\"] = reward_adjust_div;\n\t_object[\"reward_adjust_tick\"] = reward_adjust_tick;\n\t_object[\"reward_adjust_interval\"] = reward_adjust_interval;\n\t_object[\"target_mmx_gold_price\"] = target_mmx_gold_price;\n\t_object[\"time_diff_divider\"] = time_diff_divider;\n\t_object[\"time_diff_constant\"] = time_diff_constant;\n\t_object[\"space_diff_constant\"] = space_diff_constant;\n\t_object[\"initial_time_diff\"] = initial_time_diff;\n\t_object[\"initial_space_diff\"] = initial_space_diff;\n\t_object[\"initial_time_stamp\"] = initial_time_stamp;\n\t_object[\"min_txfee\"] = min_txfee;\n\t_object[\"min_txfee_io\"] = min_txfee_io;\n\t_object[\"min_txfee_sign\"] = min_txfee_sign;\n\t_object[\"min_txfee_memo\"] = min_txfee_memo;\n\t_object[\"min_txfee_exec\"] = min_txfee_exec;\n\t_object[\"min_txfee_deploy\"] = min_txfee_deploy;\n\t_object[\"min_txfee_depend\"] = min_txfee_depend;\n\t_object[\"min_txfee_byte\"] = min_txfee_byte;\n\t_object[\"min_txfee_read\"] = min_txfee_read;\n\t_object[\"min_txfee_read_kbyte\"] = min_txfee_read_kbyte;\n\t_object[\"max_block_size\"] = max_block_size;\n\t_object[\"max_block_cost\"] = max_block_cost;\n\t_object[\"max_tx_cost\"] = max_tx_cost;\n\t_object[\"max_rcall_depth\"] = max_rcall_depth;\n\t_object[\"max_rcall_width\"] = max_rcall_width;\n\t_object[\"min_fee_ratio\"] = min_fee_ratio;\n\t_object[\"block_interval_ms\"] = block_interval_ms;\n\t_object[\"network\"] = network;\n\t_object[\"nft_binary\"] = nft_binary;\n\t_object[\"swap_binary\"] = swap_binary;\n\t_object[\"offer_binary\"] = offer_binary;\n\t_object[\"token_binary\"] = token_binary;\n\t_object[\"plot_nft_binary\"] = plot_nft_binary;\n\t_object[\"escrow_binary\"] = escrow_binary;\n\t_object[\"time_lock_binary\"] = time_lock_binary;\n\t_object[\"relay_binary\"] = relay_binary;\n\t_object[\"fixed_project_reward\"] = fixed_project_reward;\n\t_object[\"project_ratio\"] = project_ratio;\n\t_object[\"reward_activation\"] = reward_activation;\n\t_object[\"transaction_activation\"] = transaction_activation;\n\t_object[\"hardfork1_height\"] = hardfork1_height;\n\treturn _object;\n}\n\nvoid ChainParams::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"avg_proof_count\") {\n\t\t\t_entry.second.to(avg_proof_count);\n\t\t} else if(_entry.first == \"block_interval_ms\") {\n\t\t\t_entry.second.to(block_interval_ms);\n\t\t} else if(_entry.first == \"challenge_delay\") {\n\t\t\t_entry.second.to(challenge_delay);\n\t\t} else if(_entry.first == \"challenge_interval\") {\n\t\t\t_entry.second.to(challenge_interval);\n\t\t} else if(_entry.first == \"commit_delay\") {\n\t\t\t_entry.second.to(commit_delay);\n\t\t} else if(_entry.first == \"decimals\") {\n\t\t\t_entry.second.to(decimals);\n\t\t} else if(_entry.first == \"escrow_binary\") {\n\t\t\t_entry.second.to(escrow_binary);\n\t\t} else if(_entry.first == \"fixed_project_reward\") {\n\t\t\t_entry.second.to(fixed_project_reward);\n\t\t} else if(_entry.first == \"hardfork1_height\") {\n\t\t\t_entry.second.to(hardfork1_height);\n\t\t} else if(_entry.first == \"infuse_delay\") {\n\t\t\t_entry.second.to(infuse_delay);\n\t\t} else if(_entry.first == \"initial_space_diff\") {\n\t\t\t_entry.second.to(initial_space_diff);\n\t\t} else if(_entry.first == \"initial_time_diff\") {\n\t\t\t_entry.second.to(initial_time_diff);\n\t\t} else if(_entry.first == \"initial_time_stamp\") {\n\t\t\t_entry.second.to(initial_time_stamp);\n\t\t} else if(_entry.first == \"max_block_cost\") {\n\t\t\t_entry.second.to(max_block_cost);\n\t\t} else if(_entry.first == \"max_block_size\") {\n\t\t\t_entry.second.to(max_block_size);\n\t\t} else if(_entry.first == \"max_diff_adjust\") {\n\t\t\t_entry.second.to(max_diff_adjust);\n\t\t} else if(_entry.first == \"max_ksize\") {\n\t\t\t_entry.second.to(max_ksize);\n\t\t} else if(_entry.first == \"max_proof_count\") {\n\t\t\t_entry.second.to(max_proof_count);\n\t\t} else if(_entry.first == \"max_rcall_depth\") {\n\t\t\t_entry.second.to(max_rcall_depth);\n\t\t} else if(_entry.first == \"max_rcall_width\") {\n\t\t\t_entry.second.to(max_rcall_width);\n\t\t} else if(_entry.first == \"max_tx_cost\") {\n\t\t\t_entry.second.to(max_tx_cost);\n\t\t} else if(_entry.first == \"max_validators\") {\n\t\t\t_entry.second.to(max_validators);\n\t\t} else if(_entry.first == \"max_vdf_count\") {\n\t\t\t_entry.second.to(max_vdf_count);\n\t\t} else if(_entry.first == \"min_fee_ratio\") {\n\t\t\t_entry.second.to(min_fee_ratio);\n\t\t} else if(_entry.first == \"min_ksize\") {\n\t\t\t_entry.second.to(min_ksize);\n\t\t} else if(_entry.first == \"min_reward\") {\n\t\t\t_entry.second.to(min_reward);\n\t\t} else if(_entry.first == \"min_txfee\") {\n\t\t\t_entry.second.to(min_txfee);\n\t\t} else if(_entry.first == \"min_txfee_byte\") {\n\t\t\t_entry.second.to(min_txfee_byte);\n\t\t} else if(_entry.first == \"min_txfee_depend\") {\n\t\t\t_entry.second.to(min_txfee_depend);\n\t\t} else if(_entry.first == \"min_txfee_deploy\") {\n\t\t\t_entry.second.to(min_txfee_deploy);\n\t\t} else if(_entry.first == \"min_txfee_exec\") {\n\t\t\t_entry.second.to(min_txfee_exec);\n\t\t} else if(_entry.first == \"min_txfee_io\") {\n\t\t\t_entry.second.to(min_txfee_io);\n\t\t} else if(_entry.first == \"min_txfee_memo\") {\n\t\t\t_entry.second.to(min_txfee_memo);\n\t\t} else if(_entry.first == \"min_txfee_read\") {\n\t\t\t_entry.second.to(min_txfee_read);\n\t\t} else if(_entry.first == \"min_txfee_read_kbyte\") {\n\t\t\t_entry.second.to(min_txfee_read_kbyte);\n\t\t} else if(_entry.first == \"min_txfee_sign\") {\n\t\t\t_entry.second.to(min_txfee_sign);\n\t\t} else if(_entry.first == \"network\") {\n\t\t\t_entry.second.to(network);\n\t\t} else if(_entry.first == \"nft_binary\") {\n\t\t\t_entry.second.to(nft_binary);\n\t\t} else if(_entry.first == \"offer_binary\") {\n\t\t\t_entry.second.to(offer_binary);\n\t\t} else if(_entry.first == \"plot_filter\") {\n\t\t\t_entry.second.to(plot_filter);\n\t\t} else if(_entry.first == \"plot_nft_binary\") {\n\t\t\t_entry.second.to(plot_nft_binary);\n\t\t} else if(_entry.first == \"port\") {\n\t\t\t_entry.second.to(port);\n\t\t} else if(_entry.first == \"post_filter\") {\n\t\t\t_entry.second.to(post_filter);\n\t\t} else if(_entry.first == \"project_ratio\") {\n\t\t\t_entry.second.to(project_ratio);\n\t\t} else if(_entry.first == \"relay_binary\") {\n\t\t\t_entry.second.to(relay_binary);\n\t\t} else if(_entry.first == \"reward_activation\") {\n\t\t\t_entry.second.to(reward_activation);\n\t\t} else if(_entry.first == \"reward_adjust_div\") {\n\t\t\t_entry.second.to(reward_adjust_div);\n\t\t} else if(_entry.first == \"reward_adjust_interval\") {\n\t\t\t_entry.second.to(reward_adjust_interval);\n\t\t} else if(_entry.first == \"reward_adjust_tick\") {\n\t\t\t_entry.second.to(reward_adjust_tick);\n\t\t} else if(_entry.first == \"space_diff_constant\") {\n\t\t\t_entry.second.to(space_diff_constant);\n\t\t} else if(_entry.first == \"swap_binary\") {\n\t\t\t_entry.second.to(swap_binary);\n\t\t} else if(_entry.first == \"target_mmx_gold_price\") {\n\t\t\t_entry.second.to(target_mmx_gold_price);\n\t\t} else if(_entry.first == \"time_diff_constant\") {\n\t\t\t_entry.second.to(time_diff_constant);\n\t\t} else if(_entry.first == \"time_diff_divider\") {\n\t\t\t_entry.second.to(time_diff_divider);\n\t\t} else if(_entry.first == \"time_lock_binary\") {\n\t\t\t_entry.second.to(time_lock_binary);\n\t\t} else if(_entry.first == \"token_binary\") {\n\t\t\t_entry.second.to(token_binary);\n\t\t} else if(_entry.first == \"transaction_activation\") {\n\t\t\t_entry.second.to(transaction_activation);\n\t\t} else if(_entry.first == \"vdf_reward\") {\n\t\t\t_entry.second.to(vdf_reward);\n\t\t} else if(_entry.first == \"vdf_reward_interval\") {\n\t\t\t_entry.second.to(vdf_reward_interval);\n\t\t} else if(_entry.first == \"vdf_segment_size\") {\n\t\t\t_entry.second.to(vdf_segment_size);\n\t\t}\n\t}\n}\n\nvnx::Variant ChainParams::get_field(const std::string& _name) const {\n\tif(_name == \"port\") {\n\t\treturn vnx::Variant(port);\n\t}\n\tif(_name == \"decimals\") {\n\t\treturn vnx::Variant(decimals);\n\t}\n\tif(_name == \"min_ksize\") {\n\t\treturn vnx::Variant(min_ksize);\n\t}\n\tif(_name == \"max_ksize\") {\n\t\treturn vnx::Variant(max_ksize);\n\t}\n\tif(_name == \"plot_filter\") {\n\t\treturn vnx::Variant(plot_filter);\n\t}\n\tif(_name == \"post_filter\") {\n\t\treturn vnx::Variant(post_filter);\n\t}\n\tif(_name == \"commit_delay\") {\n\t\treturn vnx::Variant(commit_delay);\n\t}\n\tif(_name == \"infuse_delay\") {\n\t\treturn vnx::Variant(infuse_delay);\n\t}\n\tif(_name == \"challenge_delay\") {\n\t\treturn vnx::Variant(challenge_delay);\n\t}\n\tif(_name == \"challenge_interval\") {\n\t\treturn vnx::Variant(challenge_interval);\n\t}\n\tif(_name == \"max_diff_adjust\") {\n\t\treturn vnx::Variant(max_diff_adjust);\n\t}\n\tif(_name == \"max_vdf_count\") {\n\t\treturn vnx::Variant(max_vdf_count);\n\t}\n\tif(_name == \"avg_proof_count\") {\n\t\treturn vnx::Variant(avg_proof_count);\n\t}\n\tif(_name == \"max_proof_count\") {\n\t\treturn vnx::Variant(max_proof_count);\n\t}\n\tif(_name == \"max_validators\") {\n\t\treturn vnx::Variant(max_validators);\n\t}\n\tif(_name == \"min_reward\") {\n\t\treturn vnx::Variant(min_reward);\n\t}\n\tif(_name == \"vdf_reward\") {\n\t\treturn vnx::Variant(vdf_reward);\n\t}\n\tif(_name == \"vdf_reward_interval\") {\n\t\treturn vnx::Variant(vdf_reward_interval);\n\t}\n\tif(_name == \"vdf_segment_size\") {\n\t\treturn vnx::Variant(vdf_segment_size);\n\t}\n\tif(_name == \"reward_adjust_div\") {\n\t\treturn vnx::Variant(reward_adjust_div);\n\t}\n\tif(_name == \"reward_adjust_tick\") {\n\t\treturn vnx::Variant(reward_adjust_tick);\n\t}\n\tif(_name == \"reward_adjust_interval\") {\n\t\treturn vnx::Variant(reward_adjust_interval);\n\t}\n\tif(_name == \"target_mmx_gold_price\") {\n\t\treturn vnx::Variant(target_mmx_gold_price);\n\t}\n\tif(_name == \"time_diff_divider\") {\n\t\treturn vnx::Variant(time_diff_divider);\n\t}\n\tif(_name == \"time_diff_constant\") {\n\t\treturn vnx::Variant(time_diff_constant);\n\t}\n\tif(_name == \"space_diff_constant\") {\n\t\treturn vnx::Variant(space_diff_constant);\n\t}\n\tif(_name == \"initial_time_diff\") {\n\t\treturn vnx::Variant(initial_time_diff);\n\t}\n\tif(_name == \"initial_space_diff\") {\n\t\treturn vnx::Variant(initial_space_diff);\n\t}\n\tif(_name == \"initial_time_stamp\") {\n\t\treturn vnx::Variant(initial_time_stamp);\n\t}\n\tif(_name == \"min_txfee\") {\n\t\treturn vnx::Variant(min_txfee);\n\t}\n\tif(_name == \"min_txfee_io\") {\n\t\treturn vnx::Variant(min_txfee_io);\n\t}\n\tif(_name == \"min_txfee_sign\") {\n\t\treturn vnx::Variant(min_txfee_sign);\n\t}\n\tif(_name == \"min_txfee_memo\") {\n\t\treturn vnx::Variant(min_txfee_memo);\n\t}\n\tif(_name == \"min_txfee_exec\") {\n\t\treturn vnx::Variant(min_txfee_exec);\n\t}\n\tif(_name == \"min_txfee_deploy\") {\n\t\treturn vnx::Variant(min_txfee_deploy);\n\t}\n\tif(_name == \"min_txfee_depend\") {\n\t\treturn vnx::Variant(min_txfee_depend);\n\t}\n\tif(_name == \"min_txfee_byte\") {\n\t\treturn vnx::Variant(min_txfee_byte);\n\t}\n\tif(_name == \"min_txfee_read\") {\n\t\treturn vnx::Variant(min_txfee_read);\n\t}\n\tif(_name == \"min_txfee_read_kbyte\") {\n\t\treturn vnx::Variant(min_txfee_read_kbyte);\n\t}\n\tif(_name == \"max_block_size\") {\n\t\treturn vnx::Variant(max_block_size);\n\t}\n\tif(_name == \"max_block_cost\") {\n\t\treturn vnx::Variant(max_block_cost);\n\t}\n\tif(_name == \"max_tx_cost\") {\n\t\treturn vnx::Variant(max_tx_cost);\n\t}\n\tif(_name == \"max_rcall_depth\") {\n\t\treturn vnx::Variant(max_rcall_depth);\n\t}\n\tif(_name == \"max_rcall_width\") {\n\t\treturn vnx::Variant(max_rcall_width);\n\t}\n\tif(_name == \"min_fee_ratio\") {\n\t\treturn vnx::Variant(min_fee_ratio);\n\t}\n\tif(_name == \"block_interval_ms\") {\n\t\treturn vnx::Variant(block_interval_ms);\n\t}\n\tif(_name == \"network\") {\n\t\treturn vnx::Variant(network);\n\t}\n\tif(_name == \"nft_binary\") {\n\t\treturn vnx::Variant(nft_binary);\n\t}\n\tif(_name == \"swap_binary\") {\n\t\treturn vnx::Variant(swap_binary);\n\t}\n\tif(_name == \"offer_binary\") {\n\t\treturn vnx::Variant(offer_binary);\n\t}\n\tif(_name == \"token_binary\") {\n\t\treturn vnx::Variant(token_binary);\n\t}\n\tif(_name == \"plot_nft_binary\") {\n\t\treturn vnx::Variant(plot_nft_binary);\n\t}\n\tif(_name == \"escrow_binary\") {\n\t\treturn vnx::Variant(escrow_binary);\n\t}\n\tif(_name == \"time_lock_binary\") {\n\t\treturn vnx::Variant(time_lock_binary);\n\t}\n\tif(_name == \"relay_binary\") {\n\t\treturn vnx::Variant(relay_binary);\n\t}\n\tif(_name == \"fixed_project_reward\") {\n\t\treturn vnx::Variant(fixed_project_reward);\n\t}\n\tif(_name == \"project_ratio\") {\n\t\treturn vnx::Variant(project_ratio);\n\t}\n\tif(_name == \"reward_activation\") {\n\t\treturn vnx::Variant(reward_activation);\n\t}\n\tif(_name == \"transaction_activation\") {\n\t\treturn vnx::Variant(transaction_activation);\n\t}\n\tif(_name == \"hardfork1_height\") {\n\t\treturn vnx::Variant(hardfork1_height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ChainParams::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"port\") {\n\t\t_value.to(port);\n\t} else if(_name == \"decimals\") {\n\t\t_value.to(decimals);\n\t} else if(_name == \"min_ksize\") {\n\t\t_value.to(min_ksize);\n\t} else if(_name == \"max_ksize\") {\n\t\t_value.to(max_ksize);\n\t} else if(_name == \"plot_filter\") {\n\t\t_value.to(plot_filter);\n\t} else if(_name == \"post_filter\") {\n\t\t_value.to(post_filter);\n\t} else if(_name == \"commit_delay\") {\n\t\t_value.to(commit_delay);\n\t} else if(_name == \"infuse_delay\") {\n\t\t_value.to(infuse_delay);\n\t} else if(_name == \"challenge_delay\") {\n\t\t_value.to(challenge_delay);\n\t} else if(_name == \"challenge_interval\") {\n\t\t_value.to(challenge_interval);\n\t} else if(_name == \"max_diff_adjust\") {\n\t\t_value.to(max_diff_adjust);\n\t} else if(_name == \"max_vdf_count\") {\n\t\t_value.to(max_vdf_count);\n\t} else if(_name == \"avg_proof_count\") {\n\t\t_value.to(avg_proof_count);\n\t} else if(_name == \"max_proof_count\") {\n\t\t_value.to(max_proof_count);\n\t} else if(_name == \"max_validators\") {\n\t\t_value.to(max_validators);\n\t} else if(_name == \"min_reward\") {\n\t\t_value.to(min_reward);\n\t} else if(_name == \"vdf_reward\") {\n\t\t_value.to(vdf_reward);\n\t} else if(_name == \"vdf_reward_interval\") {\n\t\t_value.to(vdf_reward_interval);\n\t} else if(_name == \"vdf_segment_size\") {\n\t\t_value.to(vdf_segment_size);\n\t} else if(_name == \"reward_adjust_div\") {\n\t\t_value.to(reward_adjust_div);\n\t} else if(_name == \"reward_adjust_tick\") {\n\t\t_value.to(reward_adjust_tick);\n\t} else if(_name == \"reward_adjust_interval\") {\n\t\t_value.to(reward_adjust_interval);\n\t} else if(_name == \"target_mmx_gold_price\") {\n\t\t_value.to(target_mmx_gold_price);\n\t} else if(_name == \"time_diff_divider\") {\n\t\t_value.to(time_diff_divider);\n\t} else if(_name == \"time_diff_constant\") {\n\t\t_value.to(time_diff_constant);\n\t} else if(_name == \"space_diff_constant\") {\n\t\t_value.to(space_diff_constant);\n\t} else if(_name == \"initial_time_diff\") {\n\t\t_value.to(initial_time_diff);\n\t} else if(_name == \"initial_space_diff\") {\n\t\t_value.to(initial_space_diff);\n\t} else if(_name == \"initial_time_stamp\") {\n\t\t_value.to(initial_time_stamp);\n\t} else if(_name == \"min_txfee\") {\n\t\t_value.to(min_txfee);\n\t} else if(_name == \"min_txfee_io\") {\n\t\t_value.to(min_txfee_io);\n\t} else if(_name == \"min_txfee_sign\") {\n\t\t_value.to(min_txfee_sign);\n\t} else if(_name == \"min_txfee_memo\") {\n\t\t_value.to(min_txfee_memo);\n\t} else if(_name == \"min_txfee_exec\") {\n\t\t_value.to(min_txfee_exec);\n\t} else if(_name == \"min_txfee_deploy\") {\n\t\t_value.to(min_txfee_deploy);\n\t} else if(_name == \"min_txfee_depend\") {\n\t\t_value.to(min_txfee_depend);\n\t} else if(_name == \"min_txfee_byte\") {\n\t\t_value.to(min_txfee_byte);\n\t} else if(_name == \"min_txfee_read\") {\n\t\t_value.to(min_txfee_read);\n\t} else if(_name == \"min_txfee_read_kbyte\") {\n\t\t_value.to(min_txfee_read_kbyte);\n\t} else if(_name == \"max_block_size\") {\n\t\t_value.to(max_block_size);\n\t} else if(_name == \"max_block_cost\") {\n\t\t_value.to(max_block_cost);\n\t} else if(_name == \"max_tx_cost\") {\n\t\t_value.to(max_tx_cost);\n\t} else if(_name == \"max_rcall_depth\") {\n\t\t_value.to(max_rcall_depth);\n\t} else if(_name == \"max_rcall_width\") {\n\t\t_value.to(max_rcall_width);\n\t} else if(_name == \"min_fee_ratio\") {\n\t\t_value.to(min_fee_ratio);\n\t} else if(_name == \"block_interval_ms\") {\n\t\t_value.to(block_interval_ms);\n\t} else if(_name == \"network\") {\n\t\t_value.to(network);\n\t} else if(_name == \"nft_binary\") {\n\t\t_value.to(nft_binary);\n\t} else if(_name == \"swap_binary\") {\n\t\t_value.to(swap_binary);\n\t} else if(_name == \"offer_binary\") {\n\t\t_value.to(offer_binary);\n\t} else if(_name == \"token_binary\") {\n\t\t_value.to(token_binary);\n\t} else if(_name == \"plot_nft_binary\") {\n\t\t_value.to(plot_nft_binary);\n\t} else if(_name == \"escrow_binary\") {\n\t\t_value.to(escrow_binary);\n\t} else if(_name == \"time_lock_binary\") {\n\t\t_value.to(time_lock_binary);\n\t} else if(_name == \"relay_binary\") {\n\t\t_value.to(relay_binary);\n\t} else if(_name == \"fixed_project_reward\") {\n\t\t_value.to(fixed_project_reward);\n\t} else if(_name == \"project_ratio\") {\n\t\t_value.to(project_ratio);\n\t} else if(_name == \"reward_activation\") {\n\t\t_value.to(reward_activation);\n\t} else if(_name == \"transaction_activation\") {\n\t\t_value.to(transaction_activation);\n\t} else if(_name == \"hardfork1_height\") {\n\t\t_value.to(hardfork1_height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ChainParams& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ChainParams& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ChainParams::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ChainParams::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ChainParams\";\n\ttype_code->type_hash = vnx::Hash64(0x51bba8d28881e8e7ull);\n\ttype_code->code_hash = vnx::Hash64(0xc82fa8ec51986073ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::ChainParams);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<ChainParams>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::uint_fraction_t::static_get_type_code();\n\ttype_code->fields.resize(60);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"port\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"decimals\";\n\t\tfield.value = vnx::to_string(6);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"min_ksize\";\n\t\tfield.value = vnx::to_string(29);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_ksize\";\n\t\tfield.value = vnx::to_string(32);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"plot_filter\";\n\t\tfield.value = vnx::to_string(4);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"post_filter\";\n\t\tfield.value = vnx::to_string(10);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"commit_delay\";\n\t\tfield.value = vnx::to_string(18);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"infuse_delay\";\n\t\tfield.value = vnx::to_string(6);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"challenge_delay\";\n\t\tfield.value = vnx::to_string(9);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"challenge_interval\";\n\t\tfield.value = vnx::to_string(48);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_diff_adjust\";\n\t\tfield.value = vnx::to_string(10);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_vdf_count\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"avg_proof_count\";\n\t\tfield.value = vnx::to_string(3);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_proof_count\";\n\t\tfield.value = vnx::to_string(50);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_validators\";\n\t\tfield.value = vnx::to_string(11);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[15];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"min_reward\";\n\t\tfield.value = vnx::to_string(200000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[16];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"vdf_reward\";\n\t\tfield.value = vnx::to_string(500000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[17];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_reward_interval\";\n\t\tfield.value = vnx::to_string(50);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[18];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_segment_size\";\n\t\tfield.value = vnx::to_string(50000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[19];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"reward_adjust_div\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[20];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"reward_adjust_tick\";\n\t\tfield.value = vnx::to_string(10000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[21];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"reward_adjust_interval\";\n\t\tfield.value = vnx::to_string(8640);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[22];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"target_mmx_gold_price\";\n\t\tfield.value = vnx::to_string(2000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[23];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_diff_divider\";\n\t\tfield.value = vnx::to_string(1000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[24];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_diff_constant\";\n\t\tfield.value = vnx::to_string(1000000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[25];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"space_diff_constant\";\n\t\tfield.value = vnx::to_string(100000000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[26];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"initial_time_diff\";\n\t\tfield.value = vnx::to_string(50);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[27];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"initial_space_diff\";\n\t\tfield.value = vnx::to_string(10);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[28];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"initial_time_stamp\";\n\t\tfield.value = vnx::to_string(0);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[29];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"min_txfee\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[30];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"min_txfee_io\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[31];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"min_txfee_sign\";\n\t\tfield.value = vnx::to_string(1000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[32];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"min_txfee_memo\";\n\t\tfield.value = vnx::to_string(50);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[33];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"min_txfee_exec\";\n\t\tfield.value = vnx::to_string(10000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[34];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"min_txfee_deploy\";\n\t\tfield.value = vnx::to_string(100000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[35];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"min_txfee_depend\";\n\t\tfield.value = vnx::to_string(50000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[36];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"min_txfee_byte\";\n\t\tfield.value = vnx::to_string(10);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[37];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"min_txfee_read\";\n\t\tfield.value = vnx::to_string(1000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[38];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"min_txfee_read_kbyte\";\n\t\tfield.value = vnx::to_string(1000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[39];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"max_block_size\";\n\t\tfield.value = vnx::to_string(10000000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[40];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"max_block_cost\";\n\t\tfield.value = vnx::to_string(100000000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[41];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"max_tx_cost\";\n\t\tfield.value = vnx::to_string(1000000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[42];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_rcall_depth\";\n\t\tfield.value = vnx::to_string(3);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[43];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_rcall_width\";\n\t\tfield.value = vnx::to_string(10);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[44];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"min_fee_ratio\";\n\t\tfield.code = {12, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[45];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"block_interval_ms\";\n\t\tfield.value = vnx::to_string(10000);\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[46];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"network\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[47];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"nft_binary\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[48];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"swap_binary\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[49];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"offer_binary\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[50];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"token_binary\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[51];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"plot_nft_binary\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[52];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"escrow_binary\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[53];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"time_lock_binary\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[54];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"relay_binary\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[55];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"fixed_project_reward\";\n\t\tfield.value = vnx::to_string(50000);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[56];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"project_ratio\";\n\t\tfield.code = {19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[57];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"reward_activation\";\n\t\tfield.value = vnx::to_string(50000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[58];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"transaction_activation\";\n\t\tfield.value = vnx::to_string(100000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[59];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"hardfork1_height\";\n\t\tfield.value = vnx::to_string(1000000);\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> ChainParams::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ChainParams& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.port, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.decimals, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_ksize, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_ksize, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.plot_filter, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.post_filter, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.commit_delay, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.infuse_delay, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.challenge_delay, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[9]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.challenge_interval, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[10]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_diff_adjust, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[11]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_vdf_count, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[12]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.avg_proof_count, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[13]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_proof_count, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[14]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_validators, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[15]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_reward, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[16]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_reward, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[17]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_reward_interval, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[18]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_segment_size, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[19]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_adjust_div, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[20]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_adjust_tick, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[21]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_adjust_interval, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[22]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.target_mmx_gold_price, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[23]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_diff_divider, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[24]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_diff_constant, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[25]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.space_diff_constant, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[26]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.initial_time_diff, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[27]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.initial_space_diff, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[28]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.initial_time_stamp, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[29]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_txfee, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[30]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_txfee_io, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[31]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_txfee_sign, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[32]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_txfee_memo, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[33]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_txfee_exec, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[34]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_txfee_deploy, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[35]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_txfee_depend, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[36]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_txfee_byte, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[37]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_txfee_read, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[38]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_txfee_read_kbyte, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[39]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_block_size, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[40]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_block_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[41]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_tx_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[42]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_rcall_depth, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[43]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_rcall_width, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[45]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.block_interval_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[55]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.fixed_project_reward, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[57]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward_activation, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[58]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.transaction_activation, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[59]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.hardfork1_height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 44: vnx::read(in, value.min_fee_ratio, type_code, _field->code.data()); break;\n\t\t\tcase 46: vnx::read(in, value.network, type_code, _field->code.data()); break;\n\t\t\tcase 47: vnx::read(in, value.nft_binary, type_code, _field->code.data()); break;\n\t\t\tcase 48: vnx::read(in, value.swap_binary, type_code, _field->code.data()); break;\n\t\t\tcase 49: vnx::read(in, value.offer_binary, type_code, _field->code.data()); break;\n\t\t\tcase 50: vnx::read(in, value.token_binary, type_code, _field->code.data()); break;\n\t\t\tcase 51: vnx::read(in, value.plot_nft_binary, type_code, _field->code.data()); break;\n\t\t\tcase 52: vnx::read(in, value.escrow_binary, type_code, _field->code.data()); break;\n\t\t\tcase 53: vnx::read(in, value.time_lock_binary, type_code, _field->code.data()); break;\n\t\t\tcase 54: vnx::read(in, value.relay_binary, type_code, _field->code.data()); break;\n\t\t\tcase 56: vnx::read(in, value.project_ratio, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ChainParams& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ChainParams;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ChainParams>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(288);\n\tvnx::write_value(_buf + 0, value.port);\n\tvnx::write_value(_buf + 4, value.decimals);\n\tvnx::write_value(_buf + 8, value.min_ksize);\n\tvnx::write_value(_buf + 12, value.max_ksize);\n\tvnx::write_value(_buf + 16, value.plot_filter);\n\tvnx::write_value(_buf + 20, value.post_filter);\n\tvnx::write_value(_buf + 24, value.commit_delay);\n\tvnx::write_value(_buf + 28, value.infuse_delay);\n\tvnx::write_value(_buf + 32, value.challenge_delay);\n\tvnx::write_value(_buf + 36, value.challenge_interval);\n\tvnx::write_value(_buf + 40, value.max_diff_adjust);\n\tvnx::write_value(_buf + 44, value.max_vdf_count);\n\tvnx::write_value(_buf + 48, value.avg_proof_count);\n\tvnx::write_value(_buf + 52, value.max_proof_count);\n\tvnx::write_value(_buf + 56, value.max_validators);\n\tvnx::write_value(_buf + 60, value.min_reward);\n\tvnx::write_value(_buf + 68, value.vdf_reward);\n\tvnx::write_value(_buf + 76, value.vdf_reward_interval);\n\tvnx::write_value(_buf + 80, value.vdf_segment_size);\n\tvnx::write_value(_buf + 84, value.reward_adjust_div);\n\tvnx::write_value(_buf + 88, value.reward_adjust_tick);\n\tvnx::write_value(_buf + 92, value.reward_adjust_interval);\n\tvnx::write_value(_buf + 96, value.target_mmx_gold_price);\n\tvnx::write_value(_buf + 100, value.time_diff_divider);\n\tvnx::write_value(_buf + 108, value.time_diff_constant);\n\tvnx::write_value(_buf + 116, value.space_diff_constant);\n\tvnx::write_value(_buf + 124, value.initial_time_diff);\n\tvnx::write_value(_buf + 132, value.initial_space_diff);\n\tvnx::write_value(_buf + 140, value.initial_time_stamp);\n\tvnx::write_value(_buf + 148, value.min_txfee);\n\tvnx::write_value(_buf + 156, value.min_txfee_io);\n\tvnx::write_value(_buf + 164, value.min_txfee_sign);\n\tvnx::write_value(_buf + 172, value.min_txfee_memo);\n\tvnx::write_value(_buf + 180, value.min_txfee_exec);\n\tvnx::write_value(_buf + 188, value.min_txfee_deploy);\n\tvnx::write_value(_buf + 196, value.min_txfee_depend);\n\tvnx::write_value(_buf + 204, value.min_txfee_byte);\n\tvnx::write_value(_buf + 212, value.min_txfee_read);\n\tvnx::write_value(_buf + 220, value.min_txfee_read_kbyte);\n\tvnx::write_value(_buf + 228, value.max_block_size);\n\tvnx::write_value(_buf + 236, value.max_block_cost);\n\tvnx::write_value(_buf + 244, value.max_tx_cost);\n\tvnx::write_value(_buf + 252, value.max_rcall_depth);\n\tvnx::write_value(_buf + 256, value.max_rcall_width);\n\tvnx::write_value(_buf + 260, value.block_interval_ms);\n\tvnx::write_value(_buf + 268, value.fixed_project_reward);\n\tvnx::write_value(_buf + 276, value.reward_activation);\n\tvnx::write_value(_buf + 280, value.transaction_activation);\n\tvnx::write_value(_buf + 284, value.hardfork1_height);\n\tvnx::write(out, value.min_fee_ratio, type_code, type_code->fields[44].code.data());\n\tvnx::write(out, value.network, type_code, type_code->fields[46].code.data());\n\tvnx::write(out, value.nft_binary, type_code, type_code->fields[47].code.data());\n\tvnx::write(out, value.swap_binary, type_code, type_code->fields[48].code.data());\n\tvnx::write(out, value.offer_binary, type_code, type_code->fields[49].code.data());\n\tvnx::write(out, value.token_binary, type_code, type_code->fields[50].code.data());\n\tvnx::write(out, value.plot_nft_binary, type_code, type_code->fields[51].code.data());\n\tvnx::write(out, value.escrow_binary, type_code, type_code->fields[52].code.data());\n\tvnx::write(out, value.time_lock_binary, type_code, type_code->fields[53].code.data());\n\tvnx::write(out, value.relay_binary, type_code, type_code->fields[54].code.data());\n\tvnx::write(out, value.project_ratio, type_code, type_code->fields[56].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::ChainParams& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ChainParams& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ChainParams& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Challenge.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Challenge.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Challenge::VNX_TYPE_HASH(0x4bf49f8022405249ull);\nconst vnx::Hash64 Challenge::VNX_CODE_HASH(0xeb1ddd8570e0e195ull);\n\nvnx::Hash64 Challenge::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Challenge::get_type_name() const {\n\treturn \"mmx.Challenge\";\n}\n\nconst vnx::TypeCode* Challenge::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Challenge;\n}\n\nstd::shared_ptr<Challenge> Challenge::create() {\n\treturn std::make_shared<Challenge>();\n}\n\nstd::shared_ptr<vnx::Value> Challenge::clone() const {\n\treturn std::make_shared<Challenge>(*this);\n}\n\nvoid Challenge::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Challenge::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Challenge::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Challenge;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, vdf_height);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, challenge);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, difficulty);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Challenge::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Challenge\\\"\";\n\t_out << \", \\\"vdf_height\\\": \"; vnx::write(_out, vdf_height);\n\t_out << \", \\\"challenge\\\": \"; vnx::write(_out, challenge);\n\t_out << \", \\\"difficulty\\\": \"; vnx::write(_out, difficulty);\n\t_out << \"}\";\n}\n\nvoid Challenge::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Challenge::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Challenge\";\n\t_object[\"vdf_height\"] = vdf_height;\n\t_object[\"challenge\"] = challenge;\n\t_object[\"difficulty\"] = difficulty;\n\treturn _object;\n}\n\nvoid Challenge::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"challenge\") {\n\t\t\t_entry.second.to(challenge);\n\t\t} else if(_entry.first == \"difficulty\") {\n\t\t\t_entry.second.to(difficulty);\n\t\t} else if(_entry.first == \"vdf_height\") {\n\t\t\t_entry.second.to(vdf_height);\n\t\t}\n\t}\n}\n\nvnx::Variant Challenge::get_field(const std::string& _name) const {\n\tif(_name == \"vdf_height\") {\n\t\treturn vnx::Variant(vdf_height);\n\t}\n\tif(_name == \"challenge\") {\n\t\treturn vnx::Variant(challenge);\n\t}\n\tif(_name == \"difficulty\") {\n\t\treturn vnx::Variant(difficulty);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Challenge::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"vdf_height\") {\n\t\t_value.to(vdf_height);\n\t} else if(_name == \"challenge\") {\n\t\t_value.to(challenge);\n\t} else if(_name == \"difficulty\") {\n\t\t_value.to(difficulty);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Challenge& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Challenge& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Challenge::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Challenge::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Challenge\";\n\ttype_code->type_hash = vnx::Hash64(0x4bf49f8022405249ull);\n\ttype_code->code_hash = vnx::Hash64(0xeb1ddd8570e0e195ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::Challenge);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Challenge>(); };\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"challenge\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"difficulty\";\n\t\tfield.code = {4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Challenge::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Challenge& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.difficulty, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.challenge, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Challenge& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Challenge;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Challenge>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(12);\n\tvnx::write_value(_buf + 0, value.vdf_height);\n\tvnx::write_value(_buf + 4, value.difficulty);\n\tvnx::write(out, value.challenge, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Challenge& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Challenge& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Challenge& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Contract.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Contract::VNX_TYPE_HASH(0x26b896ae8c415285ull);\nconst vnx::Hash64 Contract::VNX_CODE_HASH(0x2fd731fcdf7b88aull);\n\nvnx::Hash64 Contract::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Contract::get_type_name() const {\n\treturn \"mmx.Contract\";\n}\n\nconst vnx::TypeCode* Contract::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Contract;\n}\n\nstd::shared_ptr<Contract> Contract::create() {\n\treturn std::make_shared<Contract>();\n}\n\nstd::shared_ptr<vnx::Value> Contract::clone() const {\n\treturn std::make_shared<Contract>(*this);\n}\n\nvoid Contract::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Contract::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Contract::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Contract;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Contract::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Contract\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \"}\";\n}\n\nvoid Contract::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Contract::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Contract\";\n\t_object[\"version\"] = version;\n\treturn _object;\n}\n\nvoid Contract::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant Contract::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Contract::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Contract& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Contract& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Contract::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Contract::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Contract\";\n\ttype_code->type_hash = vnx::Hash64(0x26b896ae8c415285ull);\n\ttype_code->code_hash = vnx::Hash64(0x2fd731fcdf7b88aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::Contract);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Contract>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Contract::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Contract& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Contract& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Contract;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Contract>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.version);\n}\n\nvoid read(std::istream& in, ::mmx::Contract& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Contract& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Contract& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/FarmInfo.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/pooling_info_t.hxx>\n#include <mmx/pooling_stats_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 FarmInfo::VNX_TYPE_HASH(0xa2701372b9137f0eull);\nconst vnx::Hash64 FarmInfo::VNX_CODE_HASH(0xd67b28eb2cb51c62ull);\n\nvnx::Hash64 FarmInfo::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string FarmInfo::get_type_name() const {\n\treturn \"mmx.FarmInfo\";\n}\n\nconst vnx::TypeCode* FarmInfo::get_type_code() const {\n\treturn mmx::vnx_native_type_code_FarmInfo;\n}\n\nstd::shared_ptr<FarmInfo> FarmInfo::create() {\n\treturn std::make_shared<FarmInfo>();\n}\n\nstd::shared_ptr<vnx::Value> FarmInfo::clone() const {\n\treturn std::make_shared<FarmInfo>(*this);\n}\n\nvoid FarmInfo::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid FarmInfo::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid FarmInfo::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_FarmInfo;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, plot_dirs);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, plot_count);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, harvester_bytes);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, pool_info);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, pool_stats);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, total_bytes);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, total_bytes_effective);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, total_balance);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, harvester);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, harvester_id);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, reward_addr);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid FarmInfo::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.FarmInfo\\\"\";\n\t_out << \", \\\"plot_dirs\\\": \"; vnx::write(_out, plot_dirs);\n\t_out << \", \\\"plot_count\\\": \"; vnx::write(_out, plot_count);\n\t_out << \", \\\"harvester_bytes\\\": \"; vnx::write(_out, harvester_bytes);\n\t_out << \", \\\"pool_info\\\": \"; vnx::write(_out, pool_info);\n\t_out << \", \\\"pool_stats\\\": \"; vnx::write(_out, pool_stats);\n\t_out << \", \\\"total_bytes\\\": \"; vnx::write(_out, total_bytes);\n\t_out << \", \\\"total_bytes_effective\\\": \"; vnx::write(_out, total_bytes_effective);\n\t_out << \", \\\"total_balance\\\": \"; vnx::write(_out, total_balance);\n\t_out << \", \\\"harvester\\\": \"; vnx::write(_out, harvester);\n\t_out << \", \\\"harvester_id\\\": \"; vnx::write(_out, harvester_id);\n\t_out << \", \\\"reward_addr\\\": \"; vnx::write(_out, reward_addr);\n\t_out << \"}\";\n}\n\nvoid FarmInfo::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object FarmInfo::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.FarmInfo\";\n\t_object[\"plot_dirs\"] = plot_dirs;\n\t_object[\"plot_count\"] = plot_count;\n\t_object[\"harvester_bytes\"] = harvester_bytes;\n\t_object[\"pool_info\"] = pool_info;\n\t_object[\"pool_stats\"] = pool_stats;\n\t_object[\"total_bytes\"] = total_bytes;\n\t_object[\"total_bytes_effective\"] = total_bytes_effective;\n\t_object[\"total_balance\"] = total_balance;\n\t_object[\"harvester\"] = harvester;\n\t_object[\"harvester_id\"] = harvester_id;\n\t_object[\"reward_addr\"] = reward_addr;\n\treturn _object;\n}\n\nvoid FarmInfo::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"harvester\") {\n\t\t\t_entry.second.to(harvester);\n\t\t} else if(_entry.first == \"harvester_bytes\") {\n\t\t\t_entry.second.to(harvester_bytes);\n\t\t} else if(_entry.first == \"harvester_id\") {\n\t\t\t_entry.second.to(harvester_id);\n\t\t} else if(_entry.first == \"plot_count\") {\n\t\t\t_entry.second.to(plot_count);\n\t\t} else if(_entry.first == \"plot_dirs\") {\n\t\t\t_entry.second.to(plot_dirs);\n\t\t} else if(_entry.first == \"pool_info\") {\n\t\t\t_entry.second.to(pool_info);\n\t\t} else if(_entry.first == \"pool_stats\") {\n\t\t\t_entry.second.to(pool_stats);\n\t\t} else if(_entry.first == \"reward_addr\") {\n\t\t\t_entry.second.to(reward_addr);\n\t\t} else if(_entry.first == \"total_balance\") {\n\t\t\t_entry.second.to(total_balance);\n\t\t} else if(_entry.first == \"total_bytes\") {\n\t\t\t_entry.second.to(total_bytes);\n\t\t} else if(_entry.first == \"total_bytes_effective\") {\n\t\t\t_entry.second.to(total_bytes_effective);\n\t\t}\n\t}\n}\n\nvnx::Variant FarmInfo::get_field(const std::string& _name) const {\n\tif(_name == \"plot_dirs\") {\n\t\treturn vnx::Variant(plot_dirs);\n\t}\n\tif(_name == \"plot_count\") {\n\t\treturn vnx::Variant(plot_count);\n\t}\n\tif(_name == \"harvester_bytes\") {\n\t\treturn vnx::Variant(harvester_bytes);\n\t}\n\tif(_name == \"pool_info\") {\n\t\treturn vnx::Variant(pool_info);\n\t}\n\tif(_name == \"pool_stats\") {\n\t\treturn vnx::Variant(pool_stats);\n\t}\n\tif(_name == \"total_bytes\") {\n\t\treturn vnx::Variant(total_bytes);\n\t}\n\tif(_name == \"total_bytes_effective\") {\n\t\treturn vnx::Variant(total_bytes_effective);\n\t}\n\tif(_name == \"total_balance\") {\n\t\treturn vnx::Variant(total_balance);\n\t}\n\tif(_name == \"harvester\") {\n\t\treturn vnx::Variant(harvester);\n\t}\n\tif(_name == \"harvester_id\") {\n\t\treturn vnx::Variant(harvester_id);\n\t}\n\tif(_name == \"reward_addr\") {\n\t\treturn vnx::Variant(reward_addr);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid FarmInfo::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"plot_dirs\") {\n\t\t_value.to(plot_dirs);\n\t} else if(_name == \"plot_count\") {\n\t\t_value.to(plot_count);\n\t} else if(_name == \"harvester_bytes\") {\n\t\t_value.to(harvester_bytes);\n\t} else if(_name == \"pool_info\") {\n\t\t_value.to(pool_info);\n\t} else if(_name == \"pool_stats\") {\n\t\t_value.to(pool_stats);\n\t} else if(_name == \"total_bytes\") {\n\t\t_value.to(total_bytes);\n\t} else if(_name == \"total_bytes_effective\") {\n\t\t_value.to(total_bytes_effective);\n\t} else if(_name == \"total_balance\") {\n\t\t_value.to(total_balance);\n\t} else if(_name == \"harvester\") {\n\t\t_value.to(harvester);\n\t} else if(_name == \"harvester_id\") {\n\t\t_value.to(harvester_id);\n\t} else if(_name == \"reward_addr\") {\n\t\t_value.to(reward_addr);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const FarmInfo& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, FarmInfo& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* FarmInfo::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> FarmInfo::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.FarmInfo\";\n\ttype_code->type_hash = vnx::Hash64(0xa2701372b9137f0eull);\n\ttype_code->code_hash = vnx::Hash64(0xd67b28eb2cb51c62ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::FarmInfo);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<FarmInfo>(); };\n\ttype_code->depends.resize(2);\n\ttype_code->depends[0] = ::mmx::pooling_info_t::static_get_type_code();\n\ttype_code->depends[1] = ::mmx::pooling_stats_t::static_get_type_code();\n\ttype_code->fields.resize(11);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"plot_dirs\";\n\t\tfield.code = {12, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"plot_count\";\n\t\tfield.code = {13, 3, 1, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"harvester_bytes\";\n\t\tfield.code = {13, 3, 32, 23, 2, 4, 5, 4, 4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"pool_info\";\n\t\tfield.code = {13, 5, 11, 32, 1, 19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"pool_stats\";\n\t\tfield.code = {13, 5, 11, 32, 1, 19, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"total_bytes\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"total_bytes_effective\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"total_balance\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"harvester\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"harvester_id\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_addr\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> FarmInfo::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::FarmInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_bytes, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_bytes_effective, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_balance, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.plot_dirs, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.plot_count, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.harvester_bytes, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.pool_info, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.pool_stats, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.harvester, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.harvester_id, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.reward_addr, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::FarmInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_FarmInfo;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::FarmInfo>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(24);\n\tvnx::write_value(_buf + 0, value.total_bytes);\n\tvnx::write_value(_buf + 8, value.total_bytes_effective);\n\tvnx::write_value(_buf + 16, value.total_balance);\n\tvnx::write(out, value.plot_dirs, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.plot_count, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.harvester_bytes, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.pool_info, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.pool_stats, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.harvester, type_code, type_code->fields[8].code.data());\n\tvnx::write(out, value.harvester_id, type_code, type_code->fields[9].code.data());\n\tvnx::write(out, value.reward_addr, type_code, type_code->fields[10].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::FarmInfo& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::FarmInfo& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::FarmInfo& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/FarmerAsyncClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/FarmerAsyncClient.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/Farmer_get_farm_info.hxx>\n#include <mmx/Farmer_get_farm_info_return.hxx>\n#include <mmx/Farmer_get_farmer_keys.hxx>\n#include <mmx/Farmer_get_farmer_keys_return.hxx>\n#include <mmx/Farmer_get_mac_addr.hxx>\n#include <mmx/Farmer_get_mac_addr_return.hxx>\n#include <mmx/Farmer_get_partial_diff.hxx>\n#include <mmx/Farmer_get_partial_diff_return.hxx>\n#include <mmx/Farmer_get_partial_diffs.hxx>\n#include <mmx/Farmer_get_partial_diffs_return.hxx>\n#include <mmx/Farmer_sign_block.hxx>\n#include <mmx/Farmer_sign_block_return.hxx>\n#include <mmx/Farmer_sign_vote.hxx>\n#include <mmx/Farmer_sign_vote_return.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Hash64.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nFarmerAsyncClient::FarmerAsyncClient(const std::string& service_name)\n\t:\tAsyncClient::AsyncClient(vnx::Hash64(service_name))\n{\n}\n\nFarmerAsyncClient::FarmerAsyncClient(vnx::Hash64 service_addr)\n\t:\tAsyncClient::AsyncClient(service_addr)\n{\n}\n\nuint64_t FarmerAsyncClient::get_mac_addr(const std::function<void(const ::vnx::Hash64&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Farmer_get_mac_addr::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 0;\n\t\tvnx_queue_get_mac_addr[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::get_partial_diff(const ::mmx::addr_t& plot_nft, const std::function<void(const uint64_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Farmer_get_partial_diff::create();\n\t_method->plot_nft = plot_nft;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 1;\n\t\tvnx_queue_get_partial_diff[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::get_partial_diffs(const std::vector<::mmx::addr_t>& plot_nfts, const std::function<void(const std::map<::mmx::addr_t, uint64_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Farmer_get_partial_diffs::create();\n\t_method->plot_nfts = plot_nfts;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 2;\n\t\tvnx_queue_get_partial_diffs[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::get_farmer_keys(const std::function<void(const std::vector<::mmx::pubkey_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Farmer_get_farmer_keys::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 3;\n\t\tvnx_queue_get_farmer_keys[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::get_farm_info(const std::function<void(std::shared_ptr<const ::mmx::FarmInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Farmer_get_farm_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 4;\n\t\tvnx_queue_get_farm_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::sign_block(std::shared_ptr<const ::mmx::BlockHeader> block, const std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Farmer_sign_block::create();\n\t_method->block = block;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 5;\n\t\tvnx_queue_sign_block[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::sign_vote(std::shared_ptr<const ::mmx::ValidatorVote> vote, const std::function<void(const ::mmx::signature_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Farmer_sign_vote::create();\n\t_method->vote = vote;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 6;\n\t\tvnx_queue_sign_vote[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::vnx_get_config_object(const std::function<void(const ::vnx::Object&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 7;\n\t\tvnx_queue_vnx_get_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::vnx_get_config(const std::string& name, const std::function<void(const ::vnx::Variant&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 8;\n\t\tvnx_queue_vnx_get_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::vnx_set_config_object(const ::vnx::Object& config, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 9;\n\t\tvnx_queue_vnx_set_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 10;\n\t\tvnx_queue_vnx_set_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::vnx_get_type_code(const std::function<void(const ::vnx::TypeCode&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 11;\n\t\tvnx_queue_vnx_get_type_code[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::vnx_get_module_info(const std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 12;\n\t\tvnx_queue_vnx_get_module_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::vnx_restart(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 13;\n\t\tvnx_queue_vnx_restart[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::vnx_stop(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 14;\n\t\tvnx_queue_vnx_stop[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t FarmerAsyncClient::vnx_self_test(const std::function<void(const vnx::bool_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 15;\n\t\tvnx_queue_vnx_self_test[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nint32_t FarmerAsyncClient::vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\treturn -1;\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_get_mac_addr.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_mac_addr.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_mac_addr.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_get_partial_diff.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_partial_diff.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_partial_diff.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_get_partial_diffs.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_partial_diffs.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_partial_diffs.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_get_farmer_keys.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_farmer_keys.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_farmer_keys.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_get_farm_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_farm_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_farm_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_sign_block.find(_request_id);\n\t\t\tif(_iter != vnx_queue_sign_block.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_sign_block.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_sign_vote.find(_request_id);\n\t\t\tif(_iter != vnx_queue_sign_vote.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_sign_vote.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 12: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 13: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_restart.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 14: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_stop.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 15: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_self_test.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn _index;\n}\n\nint32_t FarmerAsyncClient::vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\tthrow std::runtime_error(\"FarmerAsyncClient: received unknown return\");\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_get_mac_addr.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_mac_addr.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_mac_addr.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_get_mac_addr_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Hash64>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_get_partial_diff.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_partial_diff.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_partial_diff.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_get_partial_diff_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<uint64_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_get_partial_diffs.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_partial_diffs.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_partial_diffs.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_get_partial_diffs_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::addr_t, uint64_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_get_farmer_keys.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_farmer_keys.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_farmer_keys.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_get_farmer_keys_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::pubkey_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_get_farm_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_farm_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_farm_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_get_farm_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::FarmInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_sign_block.find(_request_id);\n\t\t\tif(_iter == vnx_queue_sign_block.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_sign_block.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_sign_block_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::BlockHeader>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_sign_vote.find(_request_id);\n\t\t\tif(_iter == vnx_queue_sign_vote.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_sign_vote.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_sign_vote_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::signature_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Object>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Variant>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::TypeCode>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 12: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 13: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_restart.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 14: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_stop.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 15: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_self_test.end()) {\n\t\t\t\tthrow std::runtime_error(\"FarmerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::bool_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif(_index >= 0) {\n\t\t\t\tthrow std::logic_error(\"FarmerAsyncClient: invalid callback index\");\n\t\t\t}\n\t}\n\treturn _index;\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/FarmerBase.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/FarmerBase.hxx>\n#include <vnx/NoSuchMethod.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/Farmer_get_farm_info.hxx>\n#include <mmx/Farmer_get_farm_info_return.hxx>\n#include <mmx/Farmer_get_farmer_keys.hxx>\n#include <mmx/Farmer_get_farmer_keys_return.hxx>\n#include <mmx/Farmer_get_mac_addr.hxx>\n#include <mmx/Farmer_get_mac_addr_return.hxx>\n#include <mmx/Farmer_get_partial_diff.hxx>\n#include <mmx/Farmer_get_partial_diff_return.hxx>\n#include <mmx/Farmer_get_partial_diffs.hxx>\n#include <mmx/Farmer_get_partial_diffs_return.hxx>\n#include <mmx/Farmer_sign_block.hxx>\n#include <mmx/Farmer_sign_block_return.hxx>\n#include <mmx/Farmer_sign_vote.hxx>\n#include <mmx/Farmer_sign_vote_return.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Hash64.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 FarmerBase::VNX_TYPE_HASH(0xff732ba14d9d1abull);\nconst vnx::Hash64 FarmerBase::VNX_CODE_HASH(0x4183adfd55745a8dull);\n\nFarmerBase::FarmerBase(const std::string& _vnx_name)\n\t:\tModule::Module(_vnx_name)\n{\n\tvnx::read_config(vnx_name + \".input_info\", input_info);\n\tvnx::read_config(vnx_name + \".input_proofs\", input_proofs);\n\tvnx::read_config(vnx_name + \".input_partials\", input_partials);\n\tvnx::read_config(vnx_name + \".output_proofs\", output_proofs);\n\tvnx::read_config(vnx_name + \".output_partials\", output_partials);\n\tvnx::read_config(vnx_name + \".harvester_timeout\", harvester_timeout);\n\tvnx::read_config(vnx_name + \".difficulty_interval\", difficulty_interval);\n\tvnx::read_config(vnx_name + \".node_server\", node_server);\n\tvnx::read_config(vnx_name + \".wallet_server\", wallet_server);\n\tvnx::read_config(vnx_name + \".reward_addr\", reward_addr);\n\tvnx::read_config(vnx_name + \".partial_diff\", partial_diff);\n\tvnx::read_config(vnx_name + \".payout_threshold\", payout_threshold);\n}\n\nvnx::Hash64 FarmerBase::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string FarmerBase::get_type_name() const {\n\treturn \"mmx.Farmer\";\n}\n\nconst vnx::TypeCode* FarmerBase::get_type_code() const {\n\treturn mmx::vnx_native_type_code_FarmerBase;\n}\n\nvoid FarmerBase::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_FarmerBase;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, input_info);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, input_proofs);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, input_partials);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, output_proofs);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, output_partials);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, harvester_timeout);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, difficulty_interval);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, node_server);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, wallet_server);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, reward_addr);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, partial_diff);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, payout_threshold);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid FarmerBase::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"input_info\\\": \"; vnx::write(_out, input_info);\n\t_out << \", \\\"input_proofs\\\": \"; vnx::write(_out, input_proofs);\n\t_out << \", \\\"input_partials\\\": \"; vnx::write(_out, input_partials);\n\t_out << \", \\\"output_proofs\\\": \"; vnx::write(_out, output_proofs);\n\t_out << \", \\\"output_partials\\\": \"; vnx::write(_out, output_partials);\n\t_out << \", \\\"harvester_timeout\\\": \"; vnx::write(_out, harvester_timeout);\n\t_out << \", \\\"difficulty_interval\\\": \"; vnx::write(_out, difficulty_interval);\n\t_out << \", \\\"node_server\\\": \"; vnx::write(_out, node_server);\n\t_out << \", \\\"wallet_server\\\": \"; vnx::write(_out, wallet_server);\n\t_out << \", \\\"reward_addr\\\": \"; vnx::write(_out, reward_addr);\n\t_out << \", \\\"partial_diff\\\": \"; vnx::write(_out, partial_diff);\n\t_out << \", \\\"payout_threshold\\\": \"; vnx::write(_out, payout_threshold);\n\t_out << \"}\";\n}\n\nvoid FarmerBase::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object FarmerBase::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer\";\n\t_object[\"input_info\"] = input_info;\n\t_object[\"input_proofs\"] = input_proofs;\n\t_object[\"input_partials\"] = input_partials;\n\t_object[\"output_proofs\"] = output_proofs;\n\t_object[\"output_partials\"] = output_partials;\n\t_object[\"harvester_timeout\"] = harvester_timeout;\n\t_object[\"difficulty_interval\"] = difficulty_interval;\n\t_object[\"node_server\"] = node_server;\n\t_object[\"wallet_server\"] = wallet_server;\n\t_object[\"reward_addr\"] = reward_addr;\n\t_object[\"partial_diff\"] = partial_diff;\n\t_object[\"payout_threshold\"] = payout_threshold;\n\treturn _object;\n}\n\nvoid FarmerBase::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"difficulty_interval\") {\n\t\t\t_entry.second.to(difficulty_interval);\n\t\t} else if(_entry.first == \"harvester_timeout\") {\n\t\t\t_entry.second.to(harvester_timeout);\n\t\t} else if(_entry.first == \"input_info\") {\n\t\t\t_entry.second.to(input_info);\n\t\t} else if(_entry.first == \"input_partials\") {\n\t\t\t_entry.second.to(input_partials);\n\t\t} else if(_entry.first == \"input_proofs\") {\n\t\t\t_entry.second.to(input_proofs);\n\t\t} else if(_entry.first == \"node_server\") {\n\t\t\t_entry.second.to(node_server);\n\t\t} else if(_entry.first == \"output_partials\") {\n\t\t\t_entry.second.to(output_partials);\n\t\t} else if(_entry.first == \"output_proofs\") {\n\t\t\t_entry.second.to(output_proofs);\n\t\t} else if(_entry.first == \"partial_diff\") {\n\t\t\t_entry.second.to(partial_diff);\n\t\t} else if(_entry.first == \"payout_threshold\") {\n\t\t\t_entry.second.to(payout_threshold);\n\t\t} else if(_entry.first == \"reward_addr\") {\n\t\t\t_entry.second.to(reward_addr);\n\t\t} else if(_entry.first == \"wallet_server\") {\n\t\t\t_entry.second.to(wallet_server);\n\t\t}\n\t}\n}\n\nvnx::Variant FarmerBase::get_field(const std::string& _name) const {\n\tif(_name == \"input_info\") {\n\t\treturn vnx::Variant(input_info);\n\t}\n\tif(_name == \"input_proofs\") {\n\t\treturn vnx::Variant(input_proofs);\n\t}\n\tif(_name == \"input_partials\") {\n\t\treturn vnx::Variant(input_partials);\n\t}\n\tif(_name == \"output_proofs\") {\n\t\treturn vnx::Variant(output_proofs);\n\t}\n\tif(_name == \"output_partials\") {\n\t\treturn vnx::Variant(output_partials);\n\t}\n\tif(_name == \"harvester_timeout\") {\n\t\treturn vnx::Variant(harvester_timeout);\n\t}\n\tif(_name == \"difficulty_interval\") {\n\t\treturn vnx::Variant(difficulty_interval);\n\t}\n\tif(_name == \"node_server\") {\n\t\treturn vnx::Variant(node_server);\n\t}\n\tif(_name == \"wallet_server\") {\n\t\treturn vnx::Variant(wallet_server);\n\t}\n\tif(_name == \"reward_addr\") {\n\t\treturn vnx::Variant(reward_addr);\n\t}\n\tif(_name == \"partial_diff\") {\n\t\treturn vnx::Variant(partial_diff);\n\t}\n\tif(_name == \"payout_threshold\") {\n\t\treturn vnx::Variant(payout_threshold);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid FarmerBase::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"input_info\") {\n\t\t_value.to(input_info);\n\t} else if(_name == \"input_proofs\") {\n\t\t_value.to(input_proofs);\n\t} else if(_name == \"input_partials\") {\n\t\t_value.to(input_partials);\n\t} else if(_name == \"output_proofs\") {\n\t\t_value.to(output_proofs);\n\t} else if(_name == \"output_partials\") {\n\t\t_value.to(output_partials);\n\t} else if(_name == \"harvester_timeout\") {\n\t\t_value.to(harvester_timeout);\n\t} else if(_name == \"difficulty_interval\") {\n\t\t_value.to(difficulty_interval);\n\t} else if(_name == \"node_server\") {\n\t\t_value.to(node_server);\n\t} else if(_name == \"wallet_server\") {\n\t\t_value.to(wallet_server);\n\t} else if(_name == \"reward_addr\") {\n\t\t_value.to(reward_addr);\n\t} else if(_name == \"partial_diff\") {\n\t\t_value.to(partial_diff);\n\t} else if(_name == \"payout_threshold\") {\n\t\t_value.to(payout_threshold);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const FarmerBase& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, FarmerBase& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* FarmerBase::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> FarmerBase::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer\";\n\ttype_code->type_hash = vnx::Hash64(0xff732ba14d9d1abull);\n\ttype_code->code_hash = vnx::Hash64(0x4183adfd55745a8dull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::FarmerBase);\n\ttype_code->methods.resize(16);\n\ttype_code->methods[0] = ::mmx::Farmer_get_farm_info::static_get_type_code();\n\ttype_code->methods[1] = ::mmx::Farmer_get_farmer_keys::static_get_type_code();\n\ttype_code->methods[2] = ::mmx::Farmer_get_mac_addr::static_get_type_code();\n\ttype_code->methods[3] = ::mmx::Farmer_get_partial_diff::static_get_type_code();\n\ttype_code->methods[4] = ::mmx::Farmer_get_partial_diffs::static_get_type_code();\n\ttype_code->methods[5] = ::mmx::Farmer_sign_block::static_get_type_code();\n\ttype_code->methods[6] = ::mmx::Farmer_sign_vote::static_get_type_code();\n\ttype_code->methods[7] = ::vnx::ModuleInterface_vnx_get_config::static_get_type_code();\n\ttype_code->methods[8] = ::vnx::ModuleInterface_vnx_get_config_object::static_get_type_code();\n\ttype_code->methods[9] = ::vnx::ModuleInterface_vnx_get_module_info::static_get_type_code();\n\ttype_code->methods[10] = ::vnx::ModuleInterface_vnx_get_type_code::static_get_type_code();\n\ttype_code->methods[11] = ::vnx::ModuleInterface_vnx_restart::static_get_type_code();\n\ttype_code->methods[12] = ::vnx::ModuleInterface_vnx_self_test::static_get_type_code();\n\ttype_code->methods[13] = ::vnx::ModuleInterface_vnx_set_config::static_get_type_code();\n\ttype_code->methods[14] = ::vnx::ModuleInterface_vnx_set_config_object::static_get_type_code();\n\ttype_code->methods[15] = ::vnx::ModuleInterface_vnx_stop::static_get_type_code();\n\ttype_code->fields.resize(12);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_info\";\n\t\tfield.value = vnx::to_string(\"harvester.info\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_proofs\";\n\t\tfield.value = vnx::to_string(\"harvester.proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_partials\";\n\t\tfield.value = vnx::to_string(\"harvester.partials\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_proofs\";\n\t\tfield.value = vnx::to_string(\"farmer.proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_partials\";\n\t\tfield.value = vnx::to_string(\"farmer.partials\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"harvester_timeout\";\n\t\tfield.value = vnx::to_string(60);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"difficulty_interval\";\n\t\tfield.value = vnx::to_string(300);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"node_server\";\n\t\tfield.value = vnx::to_string(\"Node\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"wallet_server\";\n\t\tfield.value = vnx::to_string(\"Wallet\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_addr\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"partial_diff\";\n\t\tfield.code = {33, 4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"payout_threshold\";\n\t\tfield.code = {33, 4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nvoid FarmerBase::vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) {\n\tconst auto* _type_code = _value->get_type_code();\n\twhile(_type_code) {\n\t\tswitch(_type_code->type_hash) {\n\t\t\tcase 0xa2701372b9137f0eull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::FarmInfo>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0x2c849b13a7efd71aull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::Partial>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0x816e898b36befae0ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::ProofResponse>(_value));\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\t_type_code = _type_code->super;\n\t\t}\n\t}\n\thandle(std::static_pointer_cast<const vnx::Value>(_value));\n}\n\nstd::shared_ptr<vnx::Value> FarmerBase::vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) {\n\tswitch(_method->get_type_hash()) {\n\t\tcase 0x7e72655f6f215b5aull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Farmer_get_farm_info>(_method);\n\t\t\tauto _return_value = ::mmx::Farmer_get_farm_info_return::create();\n\t\t\t_return_value->_ret_0 = get_farm_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x784507b4594a776aull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Farmer_get_farmer_keys>(_method);\n\t\t\tauto _return_value = ::mmx::Farmer_get_farmer_keys_return::create();\n\t\t\t_return_value->_ret_0 = get_farmer_keys();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe9ced9f6feb676b3ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Farmer_get_mac_addr>(_method);\n\t\t\tauto _return_value = ::mmx::Farmer_get_mac_addr_return::create();\n\t\t\t_return_value->_ret_0 = get_mac_addr();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x40f08b90e2eb4ca0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Farmer_get_partial_diff>(_method);\n\t\t\tauto _return_value = ::mmx::Farmer_get_partial_diff_return::create();\n\t\t\t_return_value->_ret_0 = get_partial_diff(_args->plot_nft);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x8806f6763215c58bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Farmer_get_partial_diffs>(_method);\n\t\t\tauto _return_value = ::mmx::Farmer_get_partial_diffs_return::create();\n\t\t\t_return_value->_ret_0 = get_partial_diffs(_args->plot_nfts);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6924b10f345eb316ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Farmer_sign_block>(_method);\n\t\t\tauto _return_value = ::mmx::Farmer_sign_block_return::create();\n\t\t\t_return_value->_ret_0 = sign_block(_args->block);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x655117e05d64b5fcull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Farmer_sign_vote>(_method);\n\t\t\tauto _return_value = ::mmx::Farmer_sign_vote_return::create();\n\t\t\t_return_value->_ret_0 = sign_vote(_args->vote);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xbbc7f1a01044d294ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config(_args->name);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x17f58f68bf83abc0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_object_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config_object();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf6d82bdf66d034a1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_module_info_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_module_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x305ec4d628960e5dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_type_code_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_type_code();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9e95dc280cecca1bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_restart>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_restart_return::create();\n\t\t\tvnx_restart();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6ce3775b41a42697ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_self_test_return::create();\n\t\t\t_return_value->_ret_0 = vnx_self_test();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x362aac91373958b7ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_return::create();\n\t\t\tvnx_set_config(_args->name, _args->value);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xca30f814f17f322full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_object_return::create();\n\t\t\tvnx_set_config_object(_args->config);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x7ab49ce3d1bfc0d2ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_stop>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_stop_return::create();\n\t\t\tvnx_stop();\n\t\t\treturn _return_value;\n\t\t}\n\t}\n\tauto _ex = vnx::NoSuchMethod::create();\n\t_ex->method = _method->get_type_name();\n\treturn _ex;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::FarmerBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.harvester_timeout, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.difficulty_interval, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.input_info, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.input_proofs, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.input_partials, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.output_proofs, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.output_partials, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.node_server, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.wallet_server, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.reward_addr, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.partial_diff, type_code, _field->code.data()); break;\n\t\t\tcase 11: vnx::read(in, value.payout_threshold, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::FarmerBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_FarmerBase;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::FarmerBase>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.harvester_timeout);\n\tvnx::write_value(_buf + 4, value.difficulty_interval);\n\tvnx::write(out, value.input_info, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.input_proofs, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.input_partials, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.output_proofs, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.output_partials, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.node_server, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.wallet_server, type_code, type_code->fields[8].code.data());\n\tvnx::write(out, value.reward_addr, type_code, type_code->fields[9].code.data());\n\tvnx::write(out, value.partial_diff, type_code, type_code->fields[10].code.data());\n\tvnx::write(out, value.payout_threshold, type_code, type_code->fields[11].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::FarmerBase& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::FarmerBase& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::FarmerBase& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/FarmerClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/FarmerClient.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/Farmer_get_farm_info.hxx>\n#include <mmx/Farmer_get_farm_info_return.hxx>\n#include <mmx/Farmer_get_farmer_keys.hxx>\n#include <mmx/Farmer_get_farmer_keys_return.hxx>\n#include <mmx/Farmer_get_mac_addr.hxx>\n#include <mmx/Farmer_get_mac_addr_return.hxx>\n#include <mmx/Farmer_get_partial_diff.hxx>\n#include <mmx/Farmer_get_partial_diff_return.hxx>\n#include <mmx/Farmer_get_partial_diffs.hxx>\n#include <mmx/Farmer_get_partial_diffs_return.hxx>\n#include <mmx/Farmer_sign_block.hxx>\n#include <mmx/Farmer_sign_block_return.hxx>\n#include <mmx/Farmer_sign_vote.hxx>\n#include <mmx/Farmer_sign_vote_return.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Hash64.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nFarmerClient::FarmerClient(const std::string& service_name)\n\t:\tClient::Client(vnx::Hash64(service_name))\n{\n}\n\nFarmerClient::FarmerClient(vnx::Hash64 service_addr)\n\t:\tClient::Client(service_addr)\n{\n}\n\n::vnx::Hash64 FarmerClient::get_mac_addr() {\n\tauto _method = ::mmx::Farmer_get_mac_addr::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_get_mac_addr_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Hash64>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\nuint64_t FarmerClient::get_partial_diff(const ::mmx::addr_t& plot_nft) {\n\tauto _method = ::mmx::Farmer_get_partial_diff::create();\n\t_method->plot_nft = plot_nft;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_get_partial_diff_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<uint64_t>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::addr_t, uint64_t> FarmerClient::get_partial_diffs(const std::vector<::mmx::addr_t>& plot_nfts) {\n\tauto _method = ::mmx::Farmer_get_partial_diffs::create();\n\t_method->plot_nfts = plot_nfts;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_get_partial_diffs_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::addr_t, uint64_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::pubkey_t> FarmerClient::get_farmer_keys() {\n\tauto _method = ::mmx::Farmer_get_farmer_keys::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_get_farmer_keys_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::pubkey_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::FarmInfo> FarmerClient::get_farm_info() {\n\tauto _method = ::mmx::Farmer_get_farm_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_get_farm_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::FarmInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::BlockHeader> FarmerClient::sign_block(std::shared_ptr<const ::mmx::BlockHeader> block) {\n\tauto _method = ::mmx::Farmer_sign_block::create();\n\t_method->block = block;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_sign_block_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::BlockHeader>>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\n::mmx::signature_t FarmerClient::sign_vote(std::shared_ptr<const ::mmx::ValidatorVote> vote) {\n\tauto _method = ::mmx::Farmer_sign_vote::create();\n\t_method->vote = vote;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Farmer_sign_vote_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::signature_t>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\n::vnx::Object FarmerClient::vnx_get_config_object() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Object>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\n::vnx::Variant FarmerClient::vnx_get_config(const std::string& name) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Variant>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\nvoid FarmerClient::vnx_set_config_object(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, false);\n}\n\nvoid FarmerClient::vnx_set_config_object_async(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, true);\n}\n\nvoid FarmerClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, false);\n}\n\nvoid FarmerClient::vnx_set_config_async(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, true);\n}\n\n::vnx::TypeCode FarmerClient::vnx_get_type_code() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::TypeCode>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::ModuleInfo> FarmerClient::vnx_get_module_info() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\nvoid FarmerClient::vnx_restart() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, false);\n}\n\nvoid FarmerClient::vnx_restart_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, true);\n}\n\nvoid FarmerClient::vnx_stop() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, false);\n}\n\nvoid FarmerClient::vnx_stop_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, true);\n}\n\nvnx::bool_t FarmerClient::vnx_self_test() {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::bool_t>();\n\t} else {\n\t\tthrow std::logic_error(\"FarmerClient: invalid return value\");\n\t}\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/Farmer_get_farm_info.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_get_farm_info.hxx>\n#include <mmx/Farmer_get_farm_info_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_get_farm_info::VNX_TYPE_HASH(0x7e72655f6f215b5aull);\nconst vnx::Hash64 Farmer_get_farm_info::VNX_CODE_HASH(0xc9fddb65815daabcull);\n\nvnx::Hash64 Farmer_get_farm_info::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_get_farm_info::get_type_name() const {\n\treturn \"mmx.Farmer.get_farm_info\";\n}\n\nconst vnx::TypeCode* Farmer_get_farm_info::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_get_farm_info;\n}\n\nstd::shared_ptr<Farmer_get_farm_info> Farmer_get_farm_info::create() {\n\treturn std::make_shared<Farmer_get_farm_info>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_get_farm_info::clone() const {\n\treturn std::make_shared<Farmer_get_farm_info>(*this);\n}\n\nvoid Farmer_get_farm_info::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_get_farm_info::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_get_farm_info::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_get_farm_info;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_get_farm_info::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.get_farm_info\\\"\";\n\t_out << \"}\";\n}\n\nvoid Farmer_get_farm_info::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_get_farm_info::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.get_farm_info\";\n\treturn _object;\n}\n\nvoid Farmer_get_farm_info::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Farmer_get_farm_info::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Farmer_get_farm_info::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_get_farm_info& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_get_farm_info& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_get_farm_info::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_get_farm_info::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.get_farm_info\";\n\ttype_code->type_hash = vnx::Hash64(0x7e72655f6f215b5aull);\n\ttype_code->code_hash = vnx::Hash64(0xc9fddb65815daabcull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_get_farm_info);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_get_farm_info>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Farmer_get_farm_info_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_get_farm_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_farm_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_get_farm_info;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_get_farm_info>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_get_farm_info& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_get_farm_info& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farm_info& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_get_farm_info_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_get_farm_info_return.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_get_farm_info_return::VNX_TYPE_HASH(0xccf47453b394d3e3ull);\nconst vnx::Hash64 Farmer_get_farm_info_return::VNX_CODE_HASH(0xa46178ce418c5d0full);\n\nvnx::Hash64 Farmer_get_farm_info_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_get_farm_info_return::get_type_name() const {\n\treturn \"mmx.Farmer.get_farm_info.return\";\n}\n\nconst vnx::TypeCode* Farmer_get_farm_info_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_get_farm_info_return;\n}\n\nstd::shared_ptr<Farmer_get_farm_info_return> Farmer_get_farm_info_return::create() {\n\treturn std::make_shared<Farmer_get_farm_info_return>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_get_farm_info_return::clone() const {\n\treturn std::make_shared<Farmer_get_farm_info_return>(*this);\n}\n\nvoid Farmer_get_farm_info_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_get_farm_info_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_get_farm_info_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_get_farm_info_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_get_farm_info_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.get_farm_info.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Farmer_get_farm_info_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_get_farm_info_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.get_farm_info.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Farmer_get_farm_info_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Farmer_get_farm_info_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Farmer_get_farm_info_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_get_farm_info_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_get_farm_info_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_get_farm_info_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_get_farm_info_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.get_farm_info.return\";\n\ttype_code->type_hash = vnx::Hash64(0xccf47453b394d3e3ull);\n\ttype_code->code_hash = vnx::Hash64(0xa46178ce418c5d0full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_get_farm_info_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_get_farm_info_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_get_farm_info_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_get_farm_info_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_get_farm_info_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_get_farm_info_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farm_info_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_get_farmer_keys.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_get_farmer_keys.hxx>\n#include <mmx/Farmer_get_farmer_keys_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_get_farmer_keys::VNX_TYPE_HASH(0x784507b4594a776aull);\nconst vnx::Hash64 Farmer_get_farmer_keys::VNX_CODE_HASH(0xf4ff08aa4b1da8afull);\n\nvnx::Hash64 Farmer_get_farmer_keys::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_get_farmer_keys::get_type_name() const {\n\treturn \"mmx.Farmer.get_farmer_keys\";\n}\n\nconst vnx::TypeCode* Farmer_get_farmer_keys::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_get_farmer_keys;\n}\n\nstd::shared_ptr<Farmer_get_farmer_keys> Farmer_get_farmer_keys::create() {\n\treturn std::make_shared<Farmer_get_farmer_keys>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_get_farmer_keys::clone() const {\n\treturn std::make_shared<Farmer_get_farmer_keys>(*this);\n}\n\nvoid Farmer_get_farmer_keys::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_get_farmer_keys::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_get_farmer_keys::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_get_farmer_keys;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_get_farmer_keys::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.get_farmer_keys\\\"\";\n\t_out << \"}\";\n}\n\nvoid Farmer_get_farmer_keys::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_get_farmer_keys::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.get_farmer_keys\";\n\treturn _object;\n}\n\nvoid Farmer_get_farmer_keys::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Farmer_get_farmer_keys::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Farmer_get_farmer_keys::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_get_farmer_keys& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_get_farmer_keys& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_get_farmer_keys::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_get_farmer_keys::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.get_farmer_keys\";\n\ttype_code->type_hash = vnx::Hash64(0x784507b4594a776aull);\n\ttype_code->code_hash = vnx::Hash64(0xf4ff08aa4b1da8afull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_get_farmer_keys);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_get_farmer_keys>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Farmer_get_farmer_keys_return::static_get_type_code();\n\ttype_code->permission = \"mmx.permission_e.REMOTE\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_get_farmer_keys;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_get_farmer_keys>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_get_farmer_keys& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_get_farmer_keys& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farmer_keys& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_get_farmer_keys_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_get_farmer_keys_return.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_get_farmer_keys_return::VNX_TYPE_HASH(0xdb382c476694095full);\nconst vnx::Hash64 Farmer_get_farmer_keys_return::VNX_CODE_HASH(0x1a7e307cac6ebf2eull);\n\nvnx::Hash64 Farmer_get_farmer_keys_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_get_farmer_keys_return::get_type_name() const {\n\treturn \"mmx.Farmer.get_farmer_keys.return\";\n}\n\nconst vnx::TypeCode* Farmer_get_farmer_keys_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_get_farmer_keys_return;\n}\n\nstd::shared_ptr<Farmer_get_farmer_keys_return> Farmer_get_farmer_keys_return::create() {\n\treturn std::make_shared<Farmer_get_farmer_keys_return>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_get_farmer_keys_return::clone() const {\n\treturn std::make_shared<Farmer_get_farmer_keys_return>(*this);\n}\n\nvoid Farmer_get_farmer_keys_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_get_farmer_keys_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_get_farmer_keys_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_get_farmer_keys_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_get_farmer_keys_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.get_farmer_keys.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Farmer_get_farmer_keys_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_get_farmer_keys_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.get_farmer_keys.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Farmer_get_farmer_keys_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Farmer_get_farmer_keys_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Farmer_get_farmer_keys_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_get_farmer_keys_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_get_farmer_keys_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_get_farmer_keys_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_get_farmer_keys_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.get_farmer_keys.return\";\n\ttype_code->type_hash = vnx::Hash64(0xdb382c476694095full);\n\ttype_code->code_hash = vnx::Hash64(0x1a7e307cac6ebf2eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_get_farmer_keys_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_get_farmer_keys_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 11, 33, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_get_farmer_keys_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_get_farmer_keys_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_get_farmer_keys_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_get_farmer_keys_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_farmer_keys_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_get_mac_addr.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_get_mac_addr.hxx>\n#include <mmx/Farmer_get_mac_addr_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_get_mac_addr::VNX_TYPE_HASH(0xe9ced9f6feb676b3ull);\nconst vnx::Hash64 Farmer_get_mac_addr::VNX_CODE_HASH(0xe3c688375d36cbbaull);\n\nvnx::Hash64 Farmer_get_mac_addr::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_get_mac_addr::get_type_name() const {\n\treturn \"mmx.Farmer.get_mac_addr\";\n}\n\nconst vnx::TypeCode* Farmer_get_mac_addr::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_get_mac_addr;\n}\n\nstd::shared_ptr<Farmer_get_mac_addr> Farmer_get_mac_addr::create() {\n\treturn std::make_shared<Farmer_get_mac_addr>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_get_mac_addr::clone() const {\n\treturn std::make_shared<Farmer_get_mac_addr>(*this);\n}\n\nvoid Farmer_get_mac_addr::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_get_mac_addr::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_get_mac_addr::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_get_mac_addr;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_get_mac_addr::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.get_mac_addr\\\"\";\n\t_out << \"}\";\n}\n\nvoid Farmer_get_mac_addr::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_get_mac_addr::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.get_mac_addr\";\n\treturn _object;\n}\n\nvoid Farmer_get_mac_addr::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Farmer_get_mac_addr::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Farmer_get_mac_addr::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_get_mac_addr& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_get_mac_addr& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_get_mac_addr::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_get_mac_addr::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.get_mac_addr\";\n\ttype_code->type_hash = vnx::Hash64(0xe9ced9f6feb676b3ull);\n\ttype_code->code_hash = vnx::Hash64(0xe3c688375d36cbbaull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_get_mac_addr);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_get_mac_addr>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Farmer_get_mac_addr_return::static_get_type_code();\n\ttype_code->permission = \"mmx.permission_e.REMOTE\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_get_mac_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_mac_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_get_mac_addr;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_get_mac_addr>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_get_mac_addr& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_get_mac_addr& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_mac_addr& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_get_mac_addr_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_get_mac_addr_return.hxx>\n#include <vnx/Hash64.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_get_mac_addr_return::VNX_TYPE_HASH(0x9e4caad2ffaba990ull);\nconst vnx::Hash64 Farmer_get_mac_addr_return::VNX_CODE_HASH(0x9f2ca199df5167e6ull);\n\nvnx::Hash64 Farmer_get_mac_addr_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_get_mac_addr_return::get_type_name() const {\n\treturn \"mmx.Farmer.get_mac_addr.return\";\n}\n\nconst vnx::TypeCode* Farmer_get_mac_addr_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_get_mac_addr_return;\n}\n\nstd::shared_ptr<Farmer_get_mac_addr_return> Farmer_get_mac_addr_return::create() {\n\treturn std::make_shared<Farmer_get_mac_addr_return>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_get_mac_addr_return::clone() const {\n\treturn std::make_shared<Farmer_get_mac_addr_return>(*this);\n}\n\nvoid Farmer_get_mac_addr_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_get_mac_addr_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_get_mac_addr_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_get_mac_addr_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_get_mac_addr_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.get_mac_addr.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Farmer_get_mac_addr_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_get_mac_addr_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.get_mac_addr.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Farmer_get_mac_addr_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Farmer_get_mac_addr_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Farmer_get_mac_addr_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_get_mac_addr_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_get_mac_addr_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_get_mac_addr_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_get_mac_addr_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.get_mac_addr.return\";\n\ttype_code->type_hash = vnx::Hash64(0x9e4caad2ffaba990ull);\n\ttype_code->code_hash = vnx::Hash64(0x9f2ca199df5167e6ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_get_mac_addr_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_get_mac_addr_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_get_mac_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_mac_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_get_mac_addr_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_get_mac_addr_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_get_mac_addr_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_get_mac_addr_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_mac_addr_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_get_partial_diff.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_get_partial_diff.hxx>\n#include <mmx/Farmer_get_partial_diff_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_get_partial_diff::VNX_TYPE_HASH(0x40f08b90e2eb4ca0ull);\nconst vnx::Hash64 Farmer_get_partial_diff::VNX_CODE_HASH(0xd015e85ad9f093aaull);\n\nvnx::Hash64 Farmer_get_partial_diff::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_get_partial_diff::get_type_name() const {\n\treturn \"mmx.Farmer.get_partial_diff\";\n}\n\nconst vnx::TypeCode* Farmer_get_partial_diff::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_get_partial_diff;\n}\n\nstd::shared_ptr<Farmer_get_partial_diff> Farmer_get_partial_diff::create() {\n\treturn std::make_shared<Farmer_get_partial_diff>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_get_partial_diff::clone() const {\n\treturn std::make_shared<Farmer_get_partial_diff>(*this);\n}\n\nvoid Farmer_get_partial_diff::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_get_partial_diff::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_get_partial_diff::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_get_partial_diff;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, plot_nft);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_get_partial_diff::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.get_partial_diff\\\"\";\n\t_out << \", \\\"plot_nft\\\": \"; vnx::write(_out, plot_nft);\n\t_out << \"}\";\n}\n\nvoid Farmer_get_partial_diff::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_get_partial_diff::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.get_partial_diff\";\n\t_object[\"plot_nft\"] = plot_nft;\n\treturn _object;\n}\n\nvoid Farmer_get_partial_diff::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"plot_nft\") {\n\t\t\t_entry.second.to(plot_nft);\n\t\t}\n\t}\n}\n\nvnx::Variant Farmer_get_partial_diff::get_field(const std::string& _name) const {\n\tif(_name == \"plot_nft\") {\n\t\treturn vnx::Variant(plot_nft);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Farmer_get_partial_diff::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"plot_nft\") {\n\t\t_value.to(plot_nft);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_get_partial_diff& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_get_partial_diff& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_get_partial_diff::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_get_partial_diff::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.get_partial_diff\";\n\ttype_code->type_hash = vnx::Hash64(0x40f08b90e2eb4ca0ull);\n\ttype_code->code_hash = vnx::Hash64(0xd015e85ad9f093aaull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_get_partial_diff);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_get_partial_diff>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Farmer_get_partial_diff_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"plot_nft\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.REMOTE\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diff& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.plot_nft, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diff& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_get_partial_diff;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_get_partial_diff>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.plot_nft, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_get_partial_diff& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diff& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diff& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_get_partial_diff_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_get_partial_diff_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_get_partial_diff_return::VNX_TYPE_HASH(0xd5650a69bbe8d978ull);\nconst vnx::Hash64 Farmer_get_partial_diff_return::VNX_CODE_HASH(0xda8258450a2c6f6full);\n\nvnx::Hash64 Farmer_get_partial_diff_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_get_partial_diff_return::get_type_name() const {\n\treturn \"mmx.Farmer.get_partial_diff.return\";\n}\n\nconst vnx::TypeCode* Farmer_get_partial_diff_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_get_partial_diff_return;\n}\n\nstd::shared_ptr<Farmer_get_partial_diff_return> Farmer_get_partial_diff_return::create() {\n\treturn std::make_shared<Farmer_get_partial_diff_return>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_get_partial_diff_return::clone() const {\n\treturn std::make_shared<Farmer_get_partial_diff_return>(*this);\n}\n\nvoid Farmer_get_partial_diff_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_get_partial_diff_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_get_partial_diff_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_get_partial_diff_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_get_partial_diff_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.get_partial_diff.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Farmer_get_partial_diff_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_get_partial_diff_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.get_partial_diff.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Farmer_get_partial_diff_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Farmer_get_partial_diff_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Farmer_get_partial_diff_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_get_partial_diff_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_get_partial_diff_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_get_partial_diff_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_get_partial_diff_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.get_partial_diff.return\";\n\ttype_code->type_hash = vnx::Hash64(0xd5650a69bbe8d978ull);\n\ttype_code->code_hash = vnx::Hash64(0xda8258450a2c6f6full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_get_partial_diff_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_get_partial_diff_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diff_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value._ret_0, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diff_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_get_partial_diff_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_get_partial_diff_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value._ret_0);\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_get_partial_diff_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diff_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diff_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_get_partial_diffs.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_get_partial_diffs.hxx>\n#include <mmx/Farmer_get_partial_diffs_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_get_partial_diffs::VNX_TYPE_HASH(0x8806f6763215c58bull);\nconst vnx::Hash64 Farmer_get_partial_diffs::VNX_CODE_HASH(0xeff9197ef3d645f9ull);\n\nvnx::Hash64 Farmer_get_partial_diffs::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_get_partial_diffs::get_type_name() const {\n\treturn \"mmx.Farmer.get_partial_diffs\";\n}\n\nconst vnx::TypeCode* Farmer_get_partial_diffs::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_get_partial_diffs;\n}\n\nstd::shared_ptr<Farmer_get_partial_diffs> Farmer_get_partial_diffs::create() {\n\treturn std::make_shared<Farmer_get_partial_diffs>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_get_partial_diffs::clone() const {\n\treturn std::make_shared<Farmer_get_partial_diffs>(*this);\n}\n\nvoid Farmer_get_partial_diffs::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_get_partial_diffs::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_get_partial_diffs::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_get_partial_diffs;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, plot_nfts);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_get_partial_diffs::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.get_partial_diffs\\\"\";\n\t_out << \", \\\"plot_nfts\\\": \"; vnx::write(_out, plot_nfts);\n\t_out << \"}\";\n}\n\nvoid Farmer_get_partial_diffs::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_get_partial_diffs::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.get_partial_diffs\";\n\t_object[\"plot_nfts\"] = plot_nfts;\n\treturn _object;\n}\n\nvoid Farmer_get_partial_diffs::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"plot_nfts\") {\n\t\t\t_entry.second.to(plot_nfts);\n\t\t}\n\t}\n}\n\nvnx::Variant Farmer_get_partial_diffs::get_field(const std::string& _name) const {\n\tif(_name == \"plot_nfts\") {\n\t\treturn vnx::Variant(plot_nfts);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Farmer_get_partial_diffs::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"plot_nfts\") {\n\t\t_value.to(plot_nfts);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_get_partial_diffs& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_get_partial_diffs& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_get_partial_diffs::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_get_partial_diffs::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.get_partial_diffs\";\n\ttype_code->type_hash = vnx::Hash64(0x8806f6763215c58bull);\n\ttype_code->code_hash = vnx::Hash64(0xeff9197ef3d645f9ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_get_partial_diffs);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_get_partial_diffs>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Farmer_get_partial_diffs_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"plot_nfts\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.REMOTE\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diffs& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.plot_nfts, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diffs& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_get_partial_diffs;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_get_partial_diffs>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.plot_nfts, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_get_partial_diffs& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diffs& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diffs& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_get_partial_diffs_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_get_partial_diffs_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_get_partial_diffs_return::VNX_TYPE_HASH(0x439549fd31330df6ull);\nconst vnx::Hash64 Farmer_get_partial_diffs_return::VNX_CODE_HASH(0x4263fa634163becdull);\n\nvnx::Hash64 Farmer_get_partial_diffs_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_get_partial_diffs_return::get_type_name() const {\n\treturn \"mmx.Farmer.get_partial_diffs.return\";\n}\n\nconst vnx::TypeCode* Farmer_get_partial_diffs_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_get_partial_diffs_return;\n}\n\nstd::shared_ptr<Farmer_get_partial_diffs_return> Farmer_get_partial_diffs_return::create() {\n\treturn std::make_shared<Farmer_get_partial_diffs_return>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_get_partial_diffs_return::clone() const {\n\treturn std::make_shared<Farmer_get_partial_diffs_return>(*this);\n}\n\nvoid Farmer_get_partial_diffs_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_get_partial_diffs_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_get_partial_diffs_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_get_partial_diffs_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_get_partial_diffs_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.get_partial_diffs.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Farmer_get_partial_diffs_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_get_partial_diffs_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.get_partial_diffs.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Farmer_get_partial_diffs_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Farmer_get_partial_diffs_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Farmer_get_partial_diffs_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_get_partial_diffs_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_get_partial_diffs_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_get_partial_diffs_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_get_partial_diffs_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.get_partial_diffs.return\";\n\ttype_code->type_hash = vnx::Hash64(0x439549fd31330df6ull);\n\ttype_code->code_hash = vnx::Hash64(0x4263fa634163becdull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_get_partial_diffs_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_get_partial_diffs_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 5, 11, 32, 1, 4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_get_partial_diffs_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_get_partial_diffs_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_get_partial_diffs_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_get_partial_diffs_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_get_partial_diffs_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_get_partial_diffs_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_get_partial_diffs_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_sign_block.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_sign_block.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/Farmer_sign_block_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_sign_block::VNX_TYPE_HASH(0x6924b10f345eb316ull);\nconst vnx::Hash64 Farmer_sign_block::VNX_CODE_HASH(0xd84096d5d18122aaull);\n\nvnx::Hash64 Farmer_sign_block::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_sign_block::get_type_name() const {\n\treturn \"mmx.Farmer.sign_block\";\n}\n\nconst vnx::TypeCode* Farmer_sign_block::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_sign_block;\n}\n\nstd::shared_ptr<Farmer_sign_block> Farmer_sign_block::create() {\n\treturn std::make_shared<Farmer_sign_block>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_sign_block::clone() const {\n\treturn std::make_shared<Farmer_sign_block>(*this);\n}\n\nvoid Farmer_sign_block::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_sign_block::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_sign_block::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_sign_block;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, block);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_sign_block::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.sign_block\\\"\";\n\t_out << \", \\\"block\\\": \"; vnx::write(_out, block);\n\t_out << \"}\";\n}\n\nvoid Farmer_sign_block::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_sign_block::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.sign_block\";\n\t_object[\"block\"] = block;\n\treturn _object;\n}\n\nvoid Farmer_sign_block::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"block\") {\n\t\t\t_entry.second.to(block);\n\t\t}\n\t}\n}\n\nvnx::Variant Farmer_sign_block::get_field(const std::string& _name) const {\n\tif(_name == \"block\") {\n\t\treturn vnx::Variant(block);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Farmer_sign_block::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"block\") {\n\t\t_value.to(block);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_sign_block& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_sign_block& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_sign_block::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_sign_block::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.sign_block\";\n\ttype_code->type_hash = vnx::Hash64(0x6924b10f345eb316ull);\n\ttype_code->code_hash = vnx::Hash64(0xd84096d5d18122aaull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_sign_block);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_sign_block>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Farmer_sign_block_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"block\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SIGN_BLOCK\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_sign_block& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.block, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_sign_block& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_sign_block;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_sign_block>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.block, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_sign_block& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_sign_block& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_block& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_sign_block_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_sign_block_return.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_sign_block_return::VNX_TYPE_HASH(0xb8acce9269f91310ull);\nconst vnx::Hash64 Farmer_sign_block_return::VNX_CODE_HASH(0x69a912a2cab09d49ull);\n\nvnx::Hash64 Farmer_sign_block_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_sign_block_return::get_type_name() const {\n\treturn \"mmx.Farmer.sign_block.return\";\n}\n\nconst vnx::TypeCode* Farmer_sign_block_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_sign_block_return;\n}\n\nstd::shared_ptr<Farmer_sign_block_return> Farmer_sign_block_return::create() {\n\treturn std::make_shared<Farmer_sign_block_return>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_sign_block_return::clone() const {\n\treturn std::make_shared<Farmer_sign_block_return>(*this);\n}\n\nvoid Farmer_sign_block_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_sign_block_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_sign_block_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_sign_block_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_sign_block_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.sign_block.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Farmer_sign_block_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_sign_block_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.sign_block.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Farmer_sign_block_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Farmer_sign_block_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Farmer_sign_block_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_sign_block_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_sign_block_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_sign_block_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_sign_block_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.sign_block.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb8acce9269f91310ull);\n\ttype_code->code_hash = vnx::Hash64(0x69a912a2cab09d49ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_sign_block_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_sign_block_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_sign_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_sign_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_sign_block_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_sign_block_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_sign_block_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_sign_block_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_block_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_sign_vote.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_sign_vote.hxx>\n#include <mmx/Farmer_sign_vote_return.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_sign_vote::VNX_TYPE_HASH(0x655117e05d64b5fcull);\nconst vnx::Hash64 Farmer_sign_vote::VNX_CODE_HASH(0x876984d9a19504a8ull);\n\nvnx::Hash64 Farmer_sign_vote::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_sign_vote::get_type_name() const {\n\treturn \"mmx.Farmer.sign_vote\";\n}\n\nconst vnx::TypeCode* Farmer_sign_vote::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_sign_vote;\n}\n\nstd::shared_ptr<Farmer_sign_vote> Farmer_sign_vote::create() {\n\treturn std::make_shared<Farmer_sign_vote>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_sign_vote::clone() const {\n\treturn std::make_shared<Farmer_sign_vote>(*this);\n}\n\nvoid Farmer_sign_vote::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_sign_vote::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_sign_vote::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_sign_vote;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, vote);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_sign_vote::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.sign_vote\\\"\";\n\t_out << \", \\\"vote\\\": \"; vnx::write(_out, vote);\n\t_out << \"}\";\n}\n\nvoid Farmer_sign_vote::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_sign_vote::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.sign_vote\";\n\t_object[\"vote\"] = vote;\n\treturn _object;\n}\n\nvoid Farmer_sign_vote::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"vote\") {\n\t\t\t_entry.second.to(vote);\n\t\t}\n\t}\n}\n\nvnx::Variant Farmer_sign_vote::get_field(const std::string& _name) const {\n\tif(_name == \"vote\") {\n\t\treturn vnx::Variant(vote);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Farmer_sign_vote::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"vote\") {\n\t\t_value.to(vote);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_sign_vote& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_sign_vote& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_sign_vote::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_sign_vote::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.sign_vote\";\n\ttype_code->type_hash = vnx::Hash64(0x655117e05d64b5fcull);\n\ttype_code->code_hash = vnx::Hash64(0x876984d9a19504a8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_sign_vote);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_sign_vote>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Farmer_sign_vote_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"vote\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SIGN_BLOCK\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_sign_vote& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.vote, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_sign_vote& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_sign_vote;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_sign_vote>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.vote, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_sign_vote& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_sign_vote& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_vote& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Farmer_sign_vote_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Farmer_sign_vote_return.hxx>\n#include <mmx/signature_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Farmer_sign_vote_return::VNX_TYPE_HASH(0x40848c38fe18b587ull);\nconst vnx::Hash64 Farmer_sign_vote_return::VNX_CODE_HASH(0x89aefca825f366c5ull);\n\nvnx::Hash64 Farmer_sign_vote_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Farmer_sign_vote_return::get_type_name() const {\n\treturn \"mmx.Farmer.sign_vote.return\";\n}\n\nconst vnx::TypeCode* Farmer_sign_vote_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Farmer_sign_vote_return;\n}\n\nstd::shared_ptr<Farmer_sign_vote_return> Farmer_sign_vote_return::create() {\n\treturn std::make_shared<Farmer_sign_vote_return>();\n}\n\nstd::shared_ptr<vnx::Value> Farmer_sign_vote_return::clone() const {\n\treturn std::make_shared<Farmer_sign_vote_return>(*this);\n}\n\nvoid Farmer_sign_vote_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Farmer_sign_vote_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Farmer_sign_vote_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Farmer_sign_vote_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Farmer_sign_vote_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Farmer.sign_vote.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Farmer_sign_vote_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Farmer_sign_vote_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Farmer.sign_vote.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Farmer_sign_vote_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Farmer_sign_vote_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Farmer_sign_vote_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Farmer_sign_vote_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Farmer_sign_vote_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Farmer_sign_vote_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Farmer_sign_vote_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Farmer.sign_vote.return\";\n\ttype_code->type_hash = vnx::Hash64(0x40848c38fe18b587ull);\n\ttype_code->code_hash = vnx::Hash64(0x89aefca825f366c5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Farmer_sign_vote_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Farmer_sign_vote_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 64, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Farmer_sign_vote_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Farmer_sign_vote_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Farmer_sign_vote_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Farmer_sign_vote_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Farmer_sign_vote_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Farmer_sign_vote_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Farmer_sign_vote_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/HarvesterAsyncClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/HarvesterAsyncClient.hxx>\n#include <mmx/Challenge.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/Harvester_add_plot_dir.hxx>\n#include <mmx/Harvester_add_plot_dir_return.hxx>\n#include <mmx/Harvester_get_farm_info.hxx>\n#include <mmx/Harvester_get_farm_info_return.hxx>\n#include <mmx/Harvester_get_total_bytes.hxx>\n#include <mmx/Harvester_get_total_bytes_return.hxx>\n#include <mmx/Harvester_reload.hxx>\n#include <mmx/Harvester_reload_return.hxx>\n#include <mmx/Harvester_rem_plot_dir.hxx>\n#include <mmx/Harvester_rem_plot_dir_return.hxx>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nHarvesterAsyncClient::HarvesterAsyncClient(const std::string& service_name)\n\t:\tAsyncClient::AsyncClient(vnx::Hash64(service_name))\n{\n}\n\nHarvesterAsyncClient::HarvesterAsyncClient(vnx::Hash64 service_addr)\n\t:\tAsyncClient::AsyncClient(service_addr)\n{\n}\n\nuint64_t HarvesterAsyncClient::reload(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Harvester_reload::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 0;\n\t\tvnx_queue_reload[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::add_plot_dir(const std::string& path, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Harvester_add_plot_dir::create();\n\t_method->path = path;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 1;\n\t\tvnx_queue_add_plot_dir[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::rem_plot_dir(const std::string& path, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Harvester_rem_plot_dir::create();\n\t_method->path = path;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 2;\n\t\tvnx_queue_rem_plot_dir[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::get_farm_info(const std::function<void(std::shared_ptr<const ::mmx::FarmInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Harvester_get_farm_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 3;\n\t\tvnx_queue_get_farm_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::get_total_bytes(const std::function<void(const uint64_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Harvester_get_total_bytes::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 4;\n\t\tvnx_queue_get_total_bytes[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 5;\n\t\tvnx_queue_http_request[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes, const std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request_chunk::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\t_method->offset = offset;\n\t_method->max_bytes = max_bytes;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 6;\n\t\tvnx_queue_http_request_chunk[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::vnx_get_config_object(const std::function<void(const ::vnx::Object&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 7;\n\t\tvnx_queue_vnx_get_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::vnx_get_config(const std::string& name, const std::function<void(const ::vnx::Variant&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 8;\n\t\tvnx_queue_vnx_get_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::vnx_set_config_object(const ::vnx::Object& config, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 9;\n\t\tvnx_queue_vnx_set_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 10;\n\t\tvnx_queue_vnx_set_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::vnx_get_type_code(const std::function<void(const ::vnx::TypeCode&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 11;\n\t\tvnx_queue_vnx_get_type_code[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::vnx_get_module_info(const std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 12;\n\t\tvnx_queue_vnx_get_module_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::vnx_restart(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 13;\n\t\tvnx_queue_vnx_restart[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::vnx_stop(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 14;\n\t\tvnx_queue_vnx_stop[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t HarvesterAsyncClient::vnx_self_test(const std::function<void(const vnx::bool_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 15;\n\t\tvnx_queue_vnx_self_test[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nint32_t HarvesterAsyncClient::vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\treturn -1;\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_reload.find(_request_id);\n\t\t\tif(_iter != vnx_queue_reload.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_reload.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_add_plot_dir.find(_request_id);\n\t\t\tif(_iter != vnx_queue_add_plot_dir.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_add_plot_dir.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_rem_plot_dir.find(_request_id);\n\t\t\tif(_iter != vnx_queue_rem_plot_dir.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_rem_plot_dir.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_get_farm_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_farm_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_farm_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_get_total_bytes.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_total_bytes.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_total_bytes.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_http_request.find(_request_id);\n\t\t\tif(_iter != vnx_queue_http_request.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_http_request.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_http_request_chunk.find(_request_id);\n\t\t\tif(_iter != vnx_queue_http_request_chunk.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_http_request_chunk.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 12: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 13: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_restart.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 14: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_stop.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 15: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_self_test.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn _index;\n}\n\nint32_t HarvesterAsyncClient::vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\tthrow std::runtime_error(\"HarvesterAsyncClient: received unknown return\");\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_reload.find(_request_id);\n\t\t\tif(_iter == vnx_queue_reload.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_reload.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_add_plot_dir.find(_request_id);\n\t\t\tif(_iter == vnx_queue_add_plot_dir.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_add_plot_dir.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_rem_plot_dir.find(_request_id);\n\t\t\tif(_iter == vnx_queue_rem_plot_dir.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_rem_plot_dir.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_get_farm_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_farm_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_farm_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Harvester_get_farm_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::FarmInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"HarvesterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_get_total_bytes.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_total_bytes.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_total_bytes.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Harvester_get_total_bytes_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<uint64_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"HarvesterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_http_request.find(_request_id);\n\t\t\tif(_iter == vnx_queue_http_request.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_http_request.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpResponse>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"HarvesterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_http_request_chunk.find(_request_id);\n\t\t\tif(_iter == vnx_queue_http_request_chunk.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_http_request_chunk.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpData>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"HarvesterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Object>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"HarvesterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Variant>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"HarvesterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::TypeCode>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"HarvesterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 12: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"HarvesterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 13: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_restart.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 14: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_stop.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 15: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_self_test.end()) {\n\t\t\t\tthrow std::runtime_error(\"HarvesterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::bool_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"HarvesterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif(_index >= 0) {\n\t\t\t\tthrow std::logic_error(\"HarvesterAsyncClient: invalid callback index\");\n\t\t\t}\n\t}\n\treturn _index;\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/HarvesterBase.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/HarvesterBase.hxx>\n#include <vnx/NoSuchMethod.hxx>\n#include <mmx/Challenge.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/Harvester_add_plot_dir.hxx>\n#include <mmx/Harvester_add_plot_dir_return.hxx>\n#include <mmx/Harvester_get_farm_info.hxx>\n#include <mmx/Harvester_get_farm_info_return.hxx>\n#include <mmx/Harvester_get_total_bytes.hxx>\n#include <mmx/Harvester_get_total_bytes_return.hxx>\n#include <mmx/Harvester_reload.hxx>\n#include <mmx/Harvester_reload_return.hxx>\n#include <mmx/Harvester_rem_plot_dir.hxx>\n#include <mmx/Harvester_rem_plot_dir_return.hxx>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 HarvesterBase::VNX_TYPE_HASH(0xc17118896cde1555ull);\nconst vnx::Hash64 HarvesterBase::VNX_CODE_HASH(0x58f3117ab806b859ull);\n\nHarvesterBase::HarvesterBase(const std::string& _vnx_name)\n\t:\tModule::Module(_vnx_name)\n{\n\tvnx::read_config(vnx_name + \".input_challenges\", input_challenges);\n\tvnx::read_config(vnx_name + \".output_info\", output_info);\n\tvnx::read_config(vnx_name + \".output_proofs\", output_proofs);\n\tvnx::read_config(vnx_name + \".output_lookups\", output_lookups);\n\tvnx::read_config(vnx_name + \".output_partials\", output_partials);\n\tvnx::read_config(vnx_name + \".plot_dirs\", plot_dirs);\n\tvnx::read_config(vnx_name + \".dir_blacklist\", dir_blacklist);\n\tvnx::read_config(vnx_name + \".node_server\", node_server);\n\tvnx::read_config(vnx_name + \".farmer_server\", farmer_server);\n\tvnx::read_config(vnx_name + \".config_path\", config_path);\n\tvnx::read_config(vnx_name + \".storage_path\", storage_path);\n\tvnx::read_config(vnx_name + \".my_name\", my_name);\n\tvnx::read_config(vnx_name + \".max_queue_ms\", max_queue_ms);\n\tvnx::read_config(vnx_name + \".reload_interval\", reload_interval);\n\tvnx::read_config(vnx_name + \".nft_query_interval\", nft_query_interval);\n\tvnx::read_config(vnx_name + \".num_threads\", num_threads);\n\tvnx::read_config(vnx_name + \".max_recursion\", max_recursion);\n\tvnx::read_config(vnx_name + \".recursive_search\", recursive_search);\n\tvnx::read_config(vnx_name + \".farm_virtual_plots\", farm_virtual_plots);\n}\n\nvnx::Hash64 HarvesterBase::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string HarvesterBase::get_type_name() const {\n\treturn \"mmx.Harvester\";\n}\n\nconst vnx::TypeCode* HarvesterBase::get_type_code() const {\n\treturn mmx::vnx_native_type_code_HarvesterBase;\n}\n\nvoid HarvesterBase::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_HarvesterBase;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, input_challenges);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, output_info);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, output_proofs);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, output_lookups);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, output_partials);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, plot_dirs);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, dir_blacklist);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, node_server);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, farmer_server);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, config_path);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, storage_path);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, my_name);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, max_queue_ms);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, reload_interval);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, nft_query_interval);\n\t_visitor.type_field(_type_code->fields[15], 15); vnx::accept(_visitor, num_threads);\n\t_visitor.type_field(_type_code->fields[16], 16); vnx::accept(_visitor, max_recursion);\n\t_visitor.type_field(_type_code->fields[17], 17); vnx::accept(_visitor, recursive_search);\n\t_visitor.type_field(_type_code->fields[18], 18); vnx::accept(_visitor, farm_virtual_plots);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid HarvesterBase::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"input_challenges\\\": \"; vnx::write(_out, input_challenges);\n\t_out << \", \\\"output_info\\\": \"; vnx::write(_out, output_info);\n\t_out << \", \\\"output_proofs\\\": \"; vnx::write(_out, output_proofs);\n\t_out << \", \\\"output_lookups\\\": \"; vnx::write(_out, output_lookups);\n\t_out << \", \\\"output_partials\\\": \"; vnx::write(_out, output_partials);\n\t_out << \", \\\"plot_dirs\\\": \"; vnx::write(_out, plot_dirs);\n\t_out << \", \\\"dir_blacklist\\\": \"; vnx::write(_out, dir_blacklist);\n\t_out << \", \\\"node_server\\\": \"; vnx::write(_out, node_server);\n\t_out << \", \\\"farmer_server\\\": \"; vnx::write(_out, farmer_server);\n\t_out << \", \\\"config_path\\\": \"; vnx::write(_out, config_path);\n\t_out << \", \\\"storage_path\\\": \"; vnx::write(_out, storage_path);\n\t_out << \", \\\"my_name\\\": \"; vnx::write(_out, my_name);\n\t_out << \", \\\"max_queue_ms\\\": \"; vnx::write(_out, max_queue_ms);\n\t_out << \", \\\"reload_interval\\\": \"; vnx::write(_out, reload_interval);\n\t_out << \", \\\"nft_query_interval\\\": \"; vnx::write(_out, nft_query_interval);\n\t_out << \", \\\"num_threads\\\": \"; vnx::write(_out, num_threads);\n\t_out << \", \\\"max_recursion\\\": \"; vnx::write(_out, max_recursion);\n\t_out << \", \\\"recursive_search\\\": \"; vnx::write(_out, recursive_search);\n\t_out << \", \\\"farm_virtual_plots\\\": \"; vnx::write(_out, farm_virtual_plots);\n\t_out << \"}\";\n}\n\nvoid HarvesterBase::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object HarvesterBase::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Harvester\";\n\t_object[\"input_challenges\"] = input_challenges;\n\t_object[\"output_info\"] = output_info;\n\t_object[\"output_proofs\"] = output_proofs;\n\t_object[\"output_lookups\"] = output_lookups;\n\t_object[\"output_partials\"] = output_partials;\n\t_object[\"plot_dirs\"] = plot_dirs;\n\t_object[\"dir_blacklist\"] = dir_blacklist;\n\t_object[\"node_server\"] = node_server;\n\t_object[\"farmer_server\"] = farmer_server;\n\t_object[\"config_path\"] = config_path;\n\t_object[\"storage_path\"] = storage_path;\n\t_object[\"my_name\"] = my_name;\n\t_object[\"max_queue_ms\"] = max_queue_ms;\n\t_object[\"reload_interval\"] = reload_interval;\n\t_object[\"nft_query_interval\"] = nft_query_interval;\n\t_object[\"num_threads\"] = num_threads;\n\t_object[\"max_recursion\"] = max_recursion;\n\t_object[\"recursive_search\"] = recursive_search;\n\t_object[\"farm_virtual_plots\"] = farm_virtual_plots;\n\treturn _object;\n}\n\nvoid HarvesterBase::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"config_path\") {\n\t\t\t_entry.second.to(config_path);\n\t\t} else if(_entry.first == \"dir_blacklist\") {\n\t\t\t_entry.second.to(dir_blacklist);\n\t\t} else if(_entry.first == \"farm_virtual_plots\") {\n\t\t\t_entry.second.to(farm_virtual_plots);\n\t\t} else if(_entry.first == \"farmer_server\") {\n\t\t\t_entry.second.to(farmer_server);\n\t\t} else if(_entry.first == \"input_challenges\") {\n\t\t\t_entry.second.to(input_challenges);\n\t\t} else if(_entry.first == \"max_queue_ms\") {\n\t\t\t_entry.second.to(max_queue_ms);\n\t\t} else if(_entry.first == \"max_recursion\") {\n\t\t\t_entry.second.to(max_recursion);\n\t\t} else if(_entry.first == \"my_name\") {\n\t\t\t_entry.second.to(my_name);\n\t\t} else if(_entry.first == \"nft_query_interval\") {\n\t\t\t_entry.second.to(nft_query_interval);\n\t\t} else if(_entry.first == \"node_server\") {\n\t\t\t_entry.second.to(node_server);\n\t\t} else if(_entry.first == \"num_threads\") {\n\t\t\t_entry.second.to(num_threads);\n\t\t} else if(_entry.first == \"output_info\") {\n\t\t\t_entry.second.to(output_info);\n\t\t} else if(_entry.first == \"output_lookups\") {\n\t\t\t_entry.second.to(output_lookups);\n\t\t} else if(_entry.first == \"output_partials\") {\n\t\t\t_entry.second.to(output_partials);\n\t\t} else if(_entry.first == \"output_proofs\") {\n\t\t\t_entry.second.to(output_proofs);\n\t\t} else if(_entry.first == \"plot_dirs\") {\n\t\t\t_entry.second.to(plot_dirs);\n\t\t} else if(_entry.first == \"recursive_search\") {\n\t\t\t_entry.second.to(recursive_search);\n\t\t} else if(_entry.first == \"reload_interval\") {\n\t\t\t_entry.second.to(reload_interval);\n\t\t} else if(_entry.first == \"storage_path\") {\n\t\t\t_entry.second.to(storage_path);\n\t\t}\n\t}\n}\n\nvnx::Variant HarvesterBase::get_field(const std::string& _name) const {\n\tif(_name == \"input_challenges\") {\n\t\treturn vnx::Variant(input_challenges);\n\t}\n\tif(_name == \"output_info\") {\n\t\treturn vnx::Variant(output_info);\n\t}\n\tif(_name == \"output_proofs\") {\n\t\treturn vnx::Variant(output_proofs);\n\t}\n\tif(_name == \"output_lookups\") {\n\t\treturn vnx::Variant(output_lookups);\n\t}\n\tif(_name == \"output_partials\") {\n\t\treturn vnx::Variant(output_partials);\n\t}\n\tif(_name == \"plot_dirs\") {\n\t\treturn vnx::Variant(plot_dirs);\n\t}\n\tif(_name == \"dir_blacklist\") {\n\t\treturn vnx::Variant(dir_blacklist);\n\t}\n\tif(_name == \"node_server\") {\n\t\treturn vnx::Variant(node_server);\n\t}\n\tif(_name == \"farmer_server\") {\n\t\treturn vnx::Variant(farmer_server);\n\t}\n\tif(_name == \"config_path\") {\n\t\treturn vnx::Variant(config_path);\n\t}\n\tif(_name == \"storage_path\") {\n\t\treturn vnx::Variant(storage_path);\n\t}\n\tif(_name == \"my_name\") {\n\t\treturn vnx::Variant(my_name);\n\t}\n\tif(_name == \"max_queue_ms\") {\n\t\treturn vnx::Variant(max_queue_ms);\n\t}\n\tif(_name == \"reload_interval\") {\n\t\treturn vnx::Variant(reload_interval);\n\t}\n\tif(_name == \"nft_query_interval\") {\n\t\treturn vnx::Variant(nft_query_interval);\n\t}\n\tif(_name == \"num_threads\") {\n\t\treturn vnx::Variant(num_threads);\n\t}\n\tif(_name == \"max_recursion\") {\n\t\treturn vnx::Variant(max_recursion);\n\t}\n\tif(_name == \"recursive_search\") {\n\t\treturn vnx::Variant(recursive_search);\n\t}\n\tif(_name == \"farm_virtual_plots\") {\n\t\treturn vnx::Variant(farm_virtual_plots);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid HarvesterBase::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"input_challenges\") {\n\t\t_value.to(input_challenges);\n\t} else if(_name == \"output_info\") {\n\t\t_value.to(output_info);\n\t} else if(_name == \"output_proofs\") {\n\t\t_value.to(output_proofs);\n\t} else if(_name == \"output_lookups\") {\n\t\t_value.to(output_lookups);\n\t} else if(_name == \"output_partials\") {\n\t\t_value.to(output_partials);\n\t} else if(_name == \"plot_dirs\") {\n\t\t_value.to(plot_dirs);\n\t} else if(_name == \"dir_blacklist\") {\n\t\t_value.to(dir_blacklist);\n\t} else if(_name == \"node_server\") {\n\t\t_value.to(node_server);\n\t} else if(_name == \"farmer_server\") {\n\t\t_value.to(farmer_server);\n\t} else if(_name == \"config_path\") {\n\t\t_value.to(config_path);\n\t} else if(_name == \"storage_path\") {\n\t\t_value.to(storage_path);\n\t} else if(_name == \"my_name\") {\n\t\t_value.to(my_name);\n\t} else if(_name == \"max_queue_ms\") {\n\t\t_value.to(max_queue_ms);\n\t} else if(_name == \"reload_interval\") {\n\t\t_value.to(reload_interval);\n\t} else if(_name == \"nft_query_interval\") {\n\t\t_value.to(nft_query_interval);\n\t} else if(_name == \"num_threads\") {\n\t\t_value.to(num_threads);\n\t} else if(_name == \"max_recursion\") {\n\t\t_value.to(max_recursion);\n\t} else if(_name == \"recursive_search\") {\n\t\t_value.to(recursive_search);\n\t} else if(_name == \"farm_virtual_plots\") {\n\t\t_value.to(farm_virtual_plots);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const HarvesterBase& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, HarvesterBase& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* HarvesterBase::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> HarvesterBase::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Harvester\";\n\ttype_code->type_hash = vnx::Hash64(0xc17118896cde1555ull);\n\ttype_code->code_hash = vnx::Hash64(0x58f3117ab806b859ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::HarvesterBase);\n\ttype_code->methods.resize(16);\n\ttype_code->methods[0] = ::mmx::Harvester_add_plot_dir::static_get_type_code();\n\ttype_code->methods[1] = ::mmx::Harvester_get_farm_info::static_get_type_code();\n\ttype_code->methods[2] = ::mmx::Harvester_get_total_bytes::static_get_type_code();\n\ttype_code->methods[3] = ::mmx::Harvester_reload::static_get_type_code();\n\ttype_code->methods[4] = ::mmx::Harvester_rem_plot_dir::static_get_type_code();\n\ttype_code->methods[5] = ::vnx::ModuleInterface_vnx_get_config::static_get_type_code();\n\ttype_code->methods[6] = ::vnx::ModuleInterface_vnx_get_config_object::static_get_type_code();\n\ttype_code->methods[7] = ::vnx::ModuleInterface_vnx_get_module_info::static_get_type_code();\n\ttype_code->methods[8] = ::vnx::ModuleInterface_vnx_get_type_code::static_get_type_code();\n\ttype_code->methods[9] = ::vnx::ModuleInterface_vnx_restart::static_get_type_code();\n\ttype_code->methods[10] = ::vnx::ModuleInterface_vnx_self_test::static_get_type_code();\n\ttype_code->methods[11] = ::vnx::ModuleInterface_vnx_set_config::static_get_type_code();\n\ttype_code->methods[12] = ::vnx::ModuleInterface_vnx_set_config_object::static_get_type_code();\n\ttype_code->methods[13] = ::vnx::ModuleInterface_vnx_stop::static_get_type_code();\n\ttype_code->methods[14] = ::vnx::addons::HttpComponent_http_request::static_get_type_code();\n\ttype_code->methods[15] = ::vnx::addons::HttpComponent_http_request_chunk::static_get_type_code();\n\ttype_code->fields.resize(19);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_challenges\";\n\t\tfield.value = vnx::to_string(\"harvester.challenges\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_info\";\n\t\tfield.value = vnx::to_string(\"harvester.info\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_proofs\";\n\t\tfield.value = vnx::to_string(\"harvester.proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_lookups\";\n\t\tfield.value = vnx::to_string(\"harvester.lookups\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_partials\";\n\t\tfield.value = vnx::to_string(\"harvester.partials\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"plot_dirs\";\n\t\tfield.code = {12, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"dir_blacklist\";\n\t\tfield.code = {12, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"node_server\";\n\t\tfield.value = vnx::to_string(\"Node\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_server\";\n\t\tfield.value = vnx::to_string(\"Farmer\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"config_path\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"storage_path\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"my_name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_queue_ms\";\n\t\tfield.value = vnx::to_string(10000);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"reload_interval\";\n\t\tfield.value = vnx::to_string(3600);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"nft_query_interval\";\n\t\tfield.value = vnx::to_string(60);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[15];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_threads\";\n\t\tfield.value = vnx::to_string(32);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[16];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_recursion\";\n\t\tfield.value = vnx::to_string(4);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[17];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"recursive_search\";\n\t\tfield.value = vnx::to_string(true);\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[18];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"farm_virtual_plots\";\n\t\tfield.value = vnx::to_string(true);\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nvoid HarvesterBase::vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) {\n\tconst auto* _type_code = _value->get_type_code();\n\twhile(_type_code) {\n\t\tswitch(_type_code->type_hash) {\n\t\t\tcase 0x4bf49f8022405249ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::Challenge>(_value));\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\t_type_code = _type_code->super;\n\t\t}\n\t}\n\thandle(std::static_pointer_cast<const vnx::Value>(_value));\n}\n\nstd::shared_ptr<vnx::Value> HarvesterBase::vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) {\n\tswitch(_method->get_type_hash()) {\n\t\tcase 0x61714d1c7ecaffddull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Harvester_add_plot_dir>(_method);\n\t\t\tauto _return_value = ::mmx::Harvester_add_plot_dir_return::create();\n\t\t\tadd_plot_dir(_args->path);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x129f91b9ade2891full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Harvester_get_farm_info>(_method);\n\t\t\tauto _return_value = ::mmx::Harvester_get_farm_info_return::create();\n\t\t\t_return_value->_ret_0 = get_farm_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x36f2104b41d9a25cull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Harvester_get_total_bytes>(_method);\n\t\t\tauto _return_value = ::mmx::Harvester_get_total_bytes_return::create();\n\t\t\t_return_value->_ret_0 = get_total_bytes();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xc67a4577de7e85caull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Harvester_reload>(_method);\n\t\t\tauto _return_value = ::mmx::Harvester_reload_return::create();\n\t\t\treload();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x57674e56f3ab6076ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Harvester_rem_plot_dir>(_method);\n\t\t\tauto _return_value = ::mmx::Harvester_rem_plot_dir_return::create();\n\t\t\trem_plot_dir(_args->path);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xbbc7f1a01044d294ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config(_args->name);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x17f58f68bf83abc0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_object_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config_object();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf6d82bdf66d034a1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_module_info_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_module_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x305ec4d628960e5dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_type_code_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_type_code();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9e95dc280cecca1bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_restart>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_restart_return::create();\n\t\t\tvnx_restart();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6ce3775b41a42697ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_self_test_return::create();\n\t\t\t_return_value->_ret_0 = vnx_self_test();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x362aac91373958b7ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_return::create();\n\t\t\tvnx_set_config(_args->name, _args->value);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xca30f814f17f322full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_object_return::create();\n\t\t\tvnx_set_config_object(_args->config);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x7ab49ce3d1bfc0d2ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_stop>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_stop_return::create();\n\t\t\tvnx_stop();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe0b6c38f619bad92ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::addons::HttpComponent_http_request>(_method);\n\t\t\thttp_request_async(_args->request, _args->sub_path, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t\tcase 0x97e79d08440406d5ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk>(_method);\n\t\t\thttp_request_chunk_async(_args->request, _args->sub_path, _args->offset, _args->max_bytes, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t}\n\tauto _ex = vnx::NoSuchMethod::create();\n\t_ex->method = _method->get_type_name();\n\treturn _ex;\n}\n\nvoid HarvesterBase::http_request_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpResponse>& _ret_0) const {\n\tauto _return_value = ::vnx::addons::HttpComponent_http_request_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\nvoid HarvesterBase::http_request_chunk_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpData>& _ret_0) const {\n\tauto _return_value = ::vnx::addons::HttpComponent_http_request_chunk_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::HarvesterBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[12]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_queue_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[13]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reload_interval, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[14]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.nft_query_interval, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[15]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_threads, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[16]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_recursion, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[17]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.recursive_search, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[18]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.farm_virtual_plots, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.input_challenges, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.output_info, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.output_proofs, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.output_lookups, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.output_partials, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.plot_dirs, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.dir_blacklist, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.node_server, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.farmer_server, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.config_path, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.storage_path, type_code, _field->code.data()); break;\n\t\t\tcase 11: vnx::read(in, value.my_name, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::HarvesterBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_HarvesterBase;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::HarvesterBase>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(22);\n\tvnx::write_value(_buf + 0, value.max_queue_ms);\n\tvnx::write_value(_buf + 4, value.reload_interval);\n\tvnx::write_value(_buf + 8, value.nft_query_interval);\n\tvnx::write_value(_buf + 12, value.num_threads);\n\tvnx::write_value(_buf + 16, value.max_recursion);\n\tvnx::write_value(_buf + 20, value.recursive_search);\n\tvnx::write_value(_buf + 21, value.farm_virtual_plots);\n\tvnx::write(out, value.input_challenges, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.output_info, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.output_proofs, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.output_lookups, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.output_partials, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.plot_dirs, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.dir_blacklist, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.node_server, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.farmer_server, type_code, type_code->fields[8].code.data());\n\tvnx::write(out, value.config_path, type_code, type_code->fields[9].code.data());\n\tvnx::write(out, value.storage_path, type_code, type_code->fields[10].code.data());\n\tvnx::write(out, value.my_name, type_code, type_code->fields[11].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::HarvesterBase& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::HarvesterBase& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::HarvesterBase& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/HarvesterClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/HarvesterClient.hxx>\n#include <mmx/Challenge.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/Harvester_add_plot_dir.hxx>\n#include <mmx/Harvester_add_plot_dir_return.hxx>\n#include <mmx/Harvester_get_farm_info.hxx>\n#include <mmx/Harvester_get_farm_info_return.hxx>\n#include <mmx/Harvester_get_total_bytes.hxx>\n#include <mmx/Harvester_get_total_bytes_return.hxx>\n#include <mmx/Harvester_reload.hxx>\n#include <mmx/Harvester_reload_return.hxx>\n#include <mmx/Harvester_rem_plot_dir.hxx>\n#include <mmx/Harvester_rem_plot_dir_return.hxx>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nHarvesterClient::HarvesterClient(const std::string& service_name)\n\t:\tClient::Client(vnx::Hash64(service_name))\n{\n}\n\nHarvesterClient::HarvesterClient(vnx::Hash64 service_addr)\n\t:\tClient::Client(service_addr)\n{\n}\n\nvoid HarvesterClient::reload() {\n\tauto _method = ::mmx::Harvester_reload::create();\n\tvnx_request(_method, false);\n}\n\nvoid HarvesterClient::reload_async() {\n\tauto _method = ::mmx::Harvester_reload::create();\n\tvnx_request(_method, true);\n}\n\nvoid HarvesterClient::add_plot_dir(const std::string& path) {\n\tauto _method = ::mmx::Harvester_add_plot_dir::create();\n\t_method->path = path;\n\tvnx_request(_method, false);\n}\n\nvoid HarvesterClient::add_plot_dir_async(const std::string& path) {\n\tauto _method = ::mmx::Harvester_add_plot_dir::create();\n\t_method->path = path;\n\tvnx_request(_method, true);\n}\n\nvoid HarvesterClient::rem_plot_dir(const std::string& path) {\n\tauto _method = ::mmx::Harvester_rem_plot_dir::create();\n\t_method->path = path;\n\tvnx_request(_method, false);\n}\n\nvoid HarvesterClient::rem_plot_dir_async(const std::string& path) {\n\tauto _method = ::mmx::Harvester_rem_plot_dir::create();\n\t_method->path = path;\n\tvnx_request(_method, true);\n}\n\nstd::shared_ptr<const ::mmx::FarmInfo> HarvesterClient::get_farm_info() {\n\tauto _method = ::mmx::Harvester_get_farm_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Harvester_get_farm_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::FarmInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"HarvesterClient: invalid return value\");\n\t}\n}\n\nuint64_t HarvesterClient::get_total_bytes() {\n\tauto _method = ::mmx::Harvester_get_total_bytes::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Harvester_get_total_bytes_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<uint64_t>();\n\t} else {\n\t\tthrow std::logic_error(\"HarvesterClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::addons::HttpResponse> HarvesterClient::http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpResponse>>();\n\t} else {\n\t\tthrow std::logic_error(\"HarvesterClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::addons::HttpData> HarvesterClient::http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request_chunk::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\t_method->offset = offset;\n\t_method->max_bytes = max_bytes;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpData>>();\n\t} else {\n\t\tthrow std::logic_error(\"HarvesterClient: invalid return value\");\n\t}\n}\n\n::vnx::Object HarvesterClient::vnx_get_config_object() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Object>();\n\t} else {\n\t\tthrow std::logic_error(\"HarvesterClient: invalid return value\");\n\t}\n}\n\n::vnx::Variant HarvesterClient::vnx_get_config(const std::string& name) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Variant>();\n\t} else {\n\t\tthrow std::logic_error(\"HarvesterClient: invalid return value\");\n\t}\n}\n\nvoid HarvesterClient::vnx_set_config_object(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, false);\n}\n\nvoid HarvesterClient::vnx_set_config_object_async(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, true);\n}\n\nvoid HarvesterClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, false);\n}\n\nvoid HarvesterClient::vnx_set_config_async(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, true);\n}\n\n::vnx::TypeCode HarvesterClient::vnx_get_type_code() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::TypeCode>();\n\t} else {\n\t\tthrow std::logic_error(\"HarvesterClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::ModuleInfo> HarvesterClient::vnx_get_module_info() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"HarvesterClient: invalid return value\");\n\t}\n}\n\nvoid HarvesterClient::vnx_restart() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, false);\n}\n\nvoid HarvesterClient::vnx_restart_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, true);\n}\n\nvoid HarvesterClient::vnx_stop() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, false);\n}\n\nvoid HarvesterClient::vnx_stop_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, true);\n}\n\nvnx::bool_t HarvesterClient::vnx_self_test() {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::bool_t>();\n\t} else {\n\t\tthrow std::logic_error(\"HarvesterClient: invalid return value\");\n\t}\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/Harvester_add_plot_dir.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Harvester_add_plot_dir.hxx>\n#include <mmx/Harvester_add_plot_dir_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Harvester_add_plot_dir::VNX_TYPE_HASH(0x61714d1c7ecaffddull);\nconst vnx::Hash64 Harvester_add_plot_dir::VNX_CODE_HASH(0x27700f9e3aa5b127ull);\n\nvnx::Hash64 Harvester_add_plot_dir::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Harvester_add_plot_dir::get_type_name() const {\n\treturn \"mmx.Harvester.add_plot_dir\";\n}\n\nconst vnx::TypeCode* Harvester_add_plot_dir::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Harvester_add_plot_dir;\n}\n\nstd::shared_ptr<Harvester_add_plot_dir> Harvester_add_plot_dir::create() {\n\treturn std::make_shared<Harvester_add_plot_dir>();\n}\n\nstd::shared_ptr<vnx::Value> Harvester_add_plot_dir::clone() const {\n\treturn std::make_shared<Harvester_add_plot_dir>(*this);\n}\n\nvoid Harvester_add_plot_dir::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Harvester_add_plot_dir::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Harvester_add_plot_dir::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Harvester_add_plot_dir;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, path);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Harvester_add_plot_dir::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Harvester.add_plot_dir\\\"\";\n\t_out << \", \\\"path\\\": \"; vnx::write(_out, path);\n\t_out << \"}\";\n}\n\nvoid Harvester_add_plot_dir::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Harvester_add_plot_dir::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Harvester.add_plot_dir\";\n\t_object[\"path\"] = path;\n\treturn _object;\n}\n\nvoid Harvester_add_plot_dir::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"path\") {\n\t\t\t_entry.second.to(path);\n\t\t}\n\t}\n}\n\nvnx::Variant Harvester_add_plot_dir::get_field(const std::string& _name) const {\n\tif(_name == \"path\") {\n\t\treturn vnx::Variant(path);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Harvester_add_plot_dir::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"path\") {\n\t\t_value.to(path);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Harvester_add_plot_dir& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Harvester_add_plot_dir& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Harvester_add_plot_dir::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Harvester_add_plot_dir::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Harvester.add_plot_dir\";\n\ttype_code->type_hash = vnx::Hash64(0x61714d1c7ecaffddull);\n\ttype_code->code_hash = vnx::Hash64(0x27700f9e3aa5b127ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Harvester_add_plot_dir);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Harvester_add_plot_dir>(); };\n\ttype_code->return_type = ::mmx::Harvester_add_plot_dir_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"path\";\n\t\tfield.code = {32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Harvester_add_plot_dir& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.path, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Harvester_add_plot_dir& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Harvester_add_plot_dir;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Harvester_add_plot_dir>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.path, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Harvester_add_plot_dir& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Harvester_add_plot_dir& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Harvester_add_plot_dir& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Harvester_add_plot_dir_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Harvester_add_plot_dir_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Harvester_add_plot_dir_return::VNX_TYPE_HASH(0x8b5f7bc4f34fb5d5ull);\nconst vnx::Hash64 Harvester_add_plot_dir_return::VNX_CODE_HASH(0x6dee0a09bf98e15bull);\n\nvnx::Hash64 Harvester_add_plot_dir_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Harvester_add_plot_dir_return::get_type_name() const {\n\treturn \"mmx.Harvester.add_plot_dir.return\";\n}\n\nconst vnx::TypeCode* Harvester_add_plot_dir_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Harvester_add_plot_dir_return;\n}\n\nstd::shared_ptr<Harvester_add_plot_dir_return> Harvester_add_plot_dir_return::create() {\n\treturn std::make_shared<Harvester_add_plot_dir_return>();\n}\n\nstd::shared_ptr<vnx::Value> Harvester_add_plot_dir_return::clone() const {\n\treturn std::make_shared<Harvester_add_plot_dir_return>(*this);\n}\n\nvoid Harvester_add_plot_dir_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Harvester_add_plot_dir_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Harvester_add_plot_dir_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Harvester_add_plot_dir_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Harvester_add_plot_dir_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Harvester.add_plot_dir.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Harvester_add_plot_dir_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Harvester_add_plot_dir_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Harvester.add_plot_dir.return\";\n\treturn _object;\n}\n\nvoid Harvester_add_plot_dir_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Harvester_add_plot_dir_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Harvester_add_plot_dir_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Harvester_add_plot_dir_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Harvester_add_plot_dir_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Harvester_add_plot_dir_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Harvester_add_plot_dir_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Harvester.add_plot_dir.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8b5f7bc4f34fb5d5ull);\n\ttype_code->code_hash = vnx::Hash64(0x6dee0a09bf98e15bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Harvester_add_plot_dir_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Harvester_add_plot_dir_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Harvester_add_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Harvester_add_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Harvester_add_plot_dir_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Harvester_add_plot_dir_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Harvester_add_plot_dir_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Harvester_add_plot_dir_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Harvester_add_plot_dir_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Harvester_get_farm_info.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Harvester_get_farm_info.hxx>\n#include <mmx/Harvester_get_farm_info_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Harvester_get_farm_info::VNX_TYPE_HASH(0x129f91b9ade2891full);\nconst vnx::Hash64 Harvester_get_farm_info::VNX_CODE_HASH(0xd4167a038fab3753ull);\n\nvnx::Hash64 Harvester_get_farm_info::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Harvester_get_farm_info::get_type_name() const {\n\treturn \"mmx.Harvester.get_farm_info\";\n}\n\nconst vnx::TypeCode* Harvester_get_farm_info::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Harvester_get_farm_info;\n}\n\nstd::shared_ptr<Harvester_get_farm_info> Harvester_get_farm_info::create() {\n\treturn std::make_shared<Harvester_get_farm_info>();\n}\n\nstd::shared_ptr<vnx::Value> Harvester_get_farm_info::clone() const {\n\treturn std::make_shared<Harvester_get_farm_info>(*this);\n}\n\nvoid Harvester_get_farm_info::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Harvester_get_farm_info::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Harvester_get_farm_info::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Harvester_get_farm_info;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Harvester_get_farm_info::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Harvester.get_farm_info\\\"\";\n\t_out << \"}\";\n}\n\nvoid Harvester_get_farm_info::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Harvester_get_farm_info::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Harvester.get_farm_info\";\n\treturn _object;\n}\n\nvoid Harvester_get_farm_info::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Harvester_get_farm_info::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Harvester_get_farm_info::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Harvester_get_farm_info& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Harvester_get_farm_info& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Harvester_get_farm_info::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Harvester_get_farm_info::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Harvester.get_farm_info\";\n\ttype_code->type_hash = vnx::Hash64(0x129f91b9ade2891full);\n\ttype_code->code_hash = vnx::Hash64(0xd4167a038fab3753ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Harvester_get_farm_info);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Harvester_get_farm_info>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Harvester_get_farm_info_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Harvester_get_farm_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Harvester_get_farm_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Harvester_get_farm_info;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Harvester_get_farm_info>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Harvester_get_farm_info& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Harvester_get_farm_info& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Harvester_get_farm_info& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Harvester_get_farm_info_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Harvester_get_farm_info_return.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Harvester_get_farm_info_return::VNX_TYPE_HASH(0x87a91b15ec42441full);\nconst vnx::Hash64 Harvester_get_farm_info_return::VNX_CODE_HASH(0x29322cece6a1e12aull);\n\nvnx::Hash64 Harvester_get_farm_info_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Harvester_get_farm_info_return::get_type_name() const {\n\treturn \"mmx.Harvester.get_farm_info.return\";\n}\n\nconst vnx::TypeCode* Harvester_get_farm_info_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Harvester_get_farm_info_return;\n}\n\nstd::shared_ptr<Harvester_get_farm_info_return> Harvester_get_farm_info_return::create() {\n\treturn std::make_shared<Harvester_get_farm_info_return>();\n}\n\nstd::shared_ptr<vnx::Value> Harvester_get_farm_info_return::clone() const {\n\treturn std::make_shared<Harvester_get_farm_info_return>(*this);\n}\n\nvoid Harvester_get_farm_info_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Harvester_get_farm_info_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Harvester_get_farm_info_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Harvester_get_farm_info_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Harvester_get_farm_info_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Harvester.get_farm_info.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Harvester_get_farm_info_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Harvester_get_farm_info_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Harvester.get_farm_info.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Harvester_get_farm_info_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Harvester_get_farm_info_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Harvester_get_farm_info_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Harvester_get_farm_info_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Harvester_get_farm_info_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Harvester_get_farm_info_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Harvester_get_farm_info_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Harvester.get_farm_info.return\";\n\ttype_code->type_hash = vnx::Hash64(0x87a91b15ec42441full);\n\ttype_code->code_hash = vnx::Hash64(0x29322cece6a1e12aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Harvester_get_farm_info_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Harvester_get_farm_info_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Harvester_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Harvester_get_farm_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Harvester_get_farm_info_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Harvester_get_farm_info_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Harvester_get_farm_info_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Harvester_get_farm_info_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Harvester_get_farm_info_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Harvester_get_total_bytes.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Harvester_get_total_bytes.hxx>\n#include <mmx/Harvester_get_total_bytes_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Harvester_get_total_bytes::VNX_TYPE_HASH(0x36f2104b41d9a25cull);\nconst vnx::Hash64 Harvester_get_total_bytes::VNX_CODE_HASH(0x608650213b31d022ull);\n\nvnx::Hash64 Harvester_get_total_bytes::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Harvester_get_total_bytes::get_type_name() const {\n\treturn \"mmx.Harvester.get_total_bytes\";\n}\n\nconst vnx::TypeCode* Harvester_get_total_bytes::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Harvester_get_total_bytes;\n}\n\nstd::shared_ptr<Harvester_get_total_bytes> Harvester_get_total_bytes::create() {\n\treturn std::make_shared<Harvester_get_total_bytes>();\n}\n\nstd::shared_ptr<vnx::Value> Harvester_get_total_bytes::clone() const {\n\treturn std::make_shared<Harvester_get_total_bytes>(*this);\n}\n\nvoid Harvester_get_total_bytes::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Harvester_get_total_bytes::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Harvester_get_total_bytes::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Harvester_get_total_bytes;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Harvester_get_total_bytes::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Harvester.get_total_bytes\\\"\";\n\t_out << \"}\";\n}\n\nvoid Harvester_get_total_bytes::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Harvester_get_total_bytes::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Harvester.get_total_bytes\";\n\treturn _object;\n}\n\nvoid Harvester_get_total_bytes::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Harvester_get_total_bytes::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Harvester_get_total_bytes::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Harvester_get_total_bytes& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Harvester_get_total_bytes& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Harvester_get_total_bytes::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Harvester_get_total_bytes::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Harvester.get_total_bytes\";\n\ttype_code->type_hash = vnx::Hash64(0x36f2104b41d9a25cull);\n\ttype_code->code_hash = vnx::Hash64(0x608650213b31d022ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Harvester_get_total_bytes);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Harvester_get_total_bytes>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Harvester_get_total_bytes_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Harvester_get_total_bytes& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Harvester_get_total_bytes& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Harvester_get_total_bytes;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Harvester_get_total_bytes>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Harvester_get_total_bytes& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Harvester_get_total_bytes& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Harvester_get_total_bytes& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Harvester_get_total_bytes_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Harvester_get_total_bytes_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Harvester_get_total_bytes_return::VNX_TYPE_HASH(0xd9a9fe83ba7d6918ull);\nconst vnx::Hash64 Harvester_get_total_bytes_return::VNX_CODE_HASH(0x5d9df696f4c3824cull);\n\nvnx::Hash64 Harvester_get_total_bytes_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Harvester_get_total_bytes_return::get_type_name() const {\n\treturn \"mmx.Harvester.get_total_bytes.return\";\n}\n\nconst vnx::TypeCode* Harvester_get_total_bytes_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Harvester_get_total_bytes_return;\n}\n\nstd::shared_ptr<Harvester_get_total_bytes_return> Harvester_get_total_bytes_return::create() {\n\treturn std::make_shared<Harvester_get_total_bytes_return>();\n}\n\nstd::shared_ptr<vnx::Value> Harvester_get_total_bytes_return::clone() const {\n\treturn std::make_shared<Harvester_get_total_bytes_return>(*this);\n}\n\nvoid Harvester_get_total_bytes_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Harvester_get_total_bytes_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Harvester_get_total_bytes_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Harvester_get_total_bytes_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Harvester_get_total_bytes_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Harvester.get_total_bytes.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Harvester_get_total_bytes_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Harvester_get_total_bytes_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Harvester.get_total_bytes.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Harvester_get_total_bytes_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Harvester_get_total_bytes_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Harvester_get_total_bytes_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Harvester_get_total_bytes_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Harvester_get_total_bytes_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Harvester_get_total_bytes_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Harvester_get_total_bytes_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Harvester.get_total_bytes.return\";\n\ttype_code->type_hash = vnx::Hash64(0xd9a9fe83ba7d6918ull);\n\ttype_code->code_hash = vnx::Hash64(0x5d9df696f4c3824cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Harvester_get_total_bytes_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Harvester_get_total_bytes_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Harvester_get_total_bytes_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value._ret_0, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Harvester_get_total_bytes_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Harvester_get_total_bytes_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Harvester_get_total_bytes_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value._ret_0);\n}\n\nvoid read(std::istream& in, ::mmx::Harvester_get_total_bytes_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Harvester_get_total_bytes_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Harvester_get_total_bytes_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Harvester_reload.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Harvester_reload.hxx>\n#include <mmx/Harvester_reload_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Harvester_reload::VNX_TYPE_HASH(0xc67a4577de7e85caull);\nconst vnx::Hash64 Harvester_reload::VNX_CODE_HASH(0xa01f4f9a3b23c380ull);\n\nvnx::Hash64 Harvester_reload::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Harvester_reload::get_type_name() const {\n\treturn \"mmx.Harvester.reload\";\n}\n\nconst vnx::TypeCode* Harvester_reload::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Harvester_reload;\n}\n\nstd::shared_ptr<Harvester_reload> Harvester_reload::create() {\n\treturn std::make_shared<Harvester_reload>();\n}\n\nstd::shared_ptr<vnx::Value> Harvester_reload::clone() const {\n\treturn std::make_shared<Harvester_reload>(*this);\n}\n\nvoid Harvester_reload::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Harvester_reload::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Harvester_reload::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Harvester_reload;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Harvester_reload::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Harvester.reload\\\"\";\n\t_out << \"}\";\n}\n\nvoid Harvester_reload::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Harvester_reload::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Harvester.reload\";\n\treturn _object;\n}\n\nvoid Harvester_reload::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Harvester_reload::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Harvester_reload::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Harvester_reload& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Harvester_reload& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Harvester_reload::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Harvester_reload::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Harvester.reload\";\n\ttype_code->type_hash = vnx::Hash64(0xc67a4577de7e85caull);\n\ttype_code->code_hash = vnx::Hash64(0xa01f4f9a3b23c380ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Harvester_reload);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Harvester_reload>(); };\n\ttype_code->return_type = ::mmx::Harvester_reload_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Harvester_reload& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Harvester_reload& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Harvester_reload;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Harvester_reload>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Harvester_reload& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Harvester_reload& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Harvester_reload& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Harvester_reload_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Harvester_reload_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Harvester_reload_return::VNX_TYPE_HASH(0x39fc8cc53bcf4659ull);\nconst vnx::Hash64 Harvester_reload_return::VNX_CODE_HASH(0xdb56d8b06101b0b3ull);\n\nvnx::Hash64 Harvester_reload_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Harvester_reload_return::get_type_name() const {\n\treturn \"mmx.Harvester.reload.return\";\n}\n\nconst vnx::TypeCode* Harvester_reload_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Harvester_reload_return;\n}\n\nstd::shared_ptr<Harvester_reload_return> Harvester_reload_return::create() {\n\treturn std::make_shared<Harvester_reload_return>();\n}\n\nstd::shared_ptr<vnx::Value> Harvester_reload_return::clone() const {\n\treturn std::make_shared<Harvester_reload_return>(*this);\n}\n\nvoid Harvester_reload_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Harvester_reload_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Harvester_reload_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Harvester_reload_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Harvester_reload_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Harvester.reload.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Harvester_reload_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Harvester_reload_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Harvester.reload.return\";\n\treturn _object;\n}\n\nvoid Harvester_reload_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Harvester_reload_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Harvester_reload_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Harvester_reload_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Harvester_reload_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Harvester_reload_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Harvester_reload_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Harvester.reload.return\";\n\ttype_code->type_hash = vnx::Hash64(0x39fc8cc53bcf4659ull);\n\ttype_code->code_hash = vnx::Hash64(0xdb56d8b06101b0b3ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Harvester_reload_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Harvester_reload_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Harvester_reload_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Harvester_reload_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Harvester_reload_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Harvester_reload_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Harvester_reload_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Harvester_reload_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Harvester_reload_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Harvester_rem_plot_dir.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Harvester_rem_plot_dir.hxx>\n#include <mmx/Harvester_rem_plot_dir_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Harvester_rem_plot_dir::VNX_TYPE_HASH(0x57674e56f3ab6076ull);\nconst vnx::Hash64 Harvester_rem_plot_dir::VNX_CODE_HASH(0xa08c1cef8ea0dc95ull);\n\nvnx::Hash64 Harvester_rem_plot_dir::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Harvester_rem_plot_dir::get_type_name() const {\n\treturn \"mmx.Harvester.rem_plot_dir\";\n}\n\nconst vnx::TypeCode* Harvester_rem_plot_dir::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Harvester_rem_plot_dir;\n}\n\nstd::shared_ptr<Harvester_rem_plot_dir> Harvester_rem_plot_dir::create() {\n\treturn std::make_shared<Harvester_rem_plot_dir>();\n}\n\nstd::shared_ptr<vnx::Value> Harvester_rem_plot_dir::clone() const {\n\treturn std::make_shared<Harvester_rem_plot_dir>(*this);\n}\n\nvoid Harvester_rem_plot_dir::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Harvester_rem_plot_dir::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Harvester_rem_plot_dir::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Harvester_rem_plot_dir;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, path);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Harvester_rem_plot_dir::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Harvester.rem_plot_dir\\\"\";\n\t_out << \", \\\"path\\\": \"; vnx::write(_out, path);\n\t_out << \"}\";\n}\n\nvoid Harvester_rem_plot_dir::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Harvester_rem_plot_dir::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Harvester.rem_plot_dir\";\n\t_object[\"path\"] = path;\n\treturn _object;\n}\n\nvoid Harvester_rem_plot_dir::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"path\") {\n\t\t\t_entry.second.to(path);\n\t\t}\n\t}\n}\n\nvnx::Variant Harvester_rem_plot_dir::get_field(const std::string& _name) const {\n\tif(_name == \"path\") {\n\t\treturn vnx::Variant(path);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Harvester_rem_plot_dir::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"path\") {\n\t\t_value.to(path);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Harvester_rem_plot_dir& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Harvester_rem_plot_dir& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Harvester_rem_plot_dir::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Harvester_rem_plot_dir::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Harvester.rem_plot_dir\";\n\ttype_code->type_hash = vnx::Hash64(0x57674e56f3ab6076ull);\n\ttype_code->code_hash = vnx::Hash64(0xa08c1cef8ea0dc95ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Harvester_rem_plot_dir);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Harvester_rem_plot_dir>(); };\n\ttype_code->return_type = ::mmx::Harvester_rem_plot_dir_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"path\";\n\t\tfield.code = {32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Harvester_rem_plot_dir& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.path, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Harvester_rem_plot_dir& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Harvester_rem_plot_dir;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Harvester_rem_plot_dir>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.path, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Harvester_rem_plot_dir& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Harvester_rem_plot_dir& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Harvester_rem_plot_dir& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Harvester_rem_plot_dir_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Harvester_rem_plot_dir_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Harvester_rem_plot_dir_return::VNX_TYPE_HASH(0xb2a8cfb3633bf358ull);\nconst vnx::Hash64 Harvester_rem_plot_dir_return::VNX_CODE_HASH(0xafc69c65405196eeull);\n\nvnx::Hash64 Harvester_rem_plot_dir_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Harvester_rem_plot_dir_return::get_type_name() const {\n\treturn \"mmx.Harvester.rem_plot_dir.return\";\n}\n\nconst vnx::TypeCode* Harvester_rem_plot_dir_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Harvester_rem_plot_dir_return;\n}\n\nstd::shared_ptr<Harvester_rem_plot_dir_return> Harvester_rem_plot_dir_return::create() {\n\treturn std::make_shared<Harvester_rem_plot_dir_return>();\n}\n\nstd::shared_ptr<vnx::Value> Harvester_rem_plot_dir_return::clone() const {\n\treturn std::make_shared<Harvester_rem_plot_dir_return>(*this);\n}\n\nvoid Harvester_rem_plot_dir_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Harvester_rem_plot_dir_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Harvester_rem_plot_dir_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Harvester_rem_plot_dir_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Harvester_rem_plot_dir_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Harvester.rem_plot_dir.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Harvester_rem_plot_dir_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Harvester_rem_plot_dir_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Harvester.rem_plot_dir.return\";\n\treturn _object;\n}\n\nvoid Harvester_rem_plot_dir_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Harvester_rem_plot_dir_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Harvester_rem_plot_dir_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Harvester_rem_plot_dir_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Harvester_rem_plot_dir_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Harvester_rem_plot_dir_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Harvester_rem_plot_dir_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Harvester.rem_plot_dir.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb2a8cfb3633bf358ull);\n\ttype_code->code_hash = vnx::Hash64(0xafc69c65405196eeull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Harvester_rem_plot_dir_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Harvester_rem_plot_dir_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Harvester_rem_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Harvester_rem_plot_dir_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Harvester_rem_plot_dir_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Harvester_rem_plot_dir_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Harvester_rem_plot_dir_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Harvester_rem_plot_dir_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Harvester_rem_plot_dir_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/IntervalRequest.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/IntervalRequest.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 IntervalRequest::VNX_TYPE_HASH(0xa4e39be061f13d71ull);\nconst vnx::Hash64 IntervalRequest::VNX_CODE_HASH(0x7da3de79e64223a8ull);\n\nvnx::Hash64 IntervalRequest::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string IntervalRequest::get_type_name() const {\n\treturn \"mmx.IntervalRequest\";\n}\n\nconst vnx::TypeCode* IntervalRequest::get_type_code() const {\n\treturn mmx::vnx_native_type_code_IntervalRequest;\n}\n\nstd::shared_ptr<IntervalRequest> IntervalRequest::create() {\n\treturn std::make_shared<IntervalRequest>();\n}\n\nstd::shared_ptr<vnx::Value> IntervalRequest::clone() const {\n\treturn std::make_shared<IntervalRequest>(*this);\n}\n\nvoid IntervalRequest::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid IntervalRequest::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid IntervalRequest::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_IntervalRequest;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, vdf_height);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, start);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, end);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, infuse);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, input);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid IntervalRequest::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.IntervalRequest\\\"\";\n\t_out << \", \\\"vdf_height\\\": \"; vnx::write(_out, vdf_height);\n\t_out << \", \\\"start\\\": \"; vnx::write(_out, start);\n\t_out << \", \\\"end\\\": \"; vnx::write(_out, end);\n\t_out << \", \\\"infuse\\\": \"; vnx::write(_out, infuse);\n\t_out << \", \\\"input\\\": \"; vnx::write(_out, input);\n\t_out << \"}\";\n}\n\nvoid IntervalRequest::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object IntervalRequest::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.IntervalRequest\";\n\t_object[\"vdf_height\"] = vdf_height;\n\t_object[\"start\"] = start;\n\t_object[\"end\"] = end;\n\t_object[\"infuse\"] = infuse;\n\t_object[\"input\"] = input;\n\treturn _object;\n}\n\nvoid IntervalRequest::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"end\") {\n\t\t\t_entry.second.to(end);\n\t\t} else if(_entry.first == \"infuse\") {\n\t\t\t_entry.second.to(infuse);\n\t\t} else if(_entry.first == \"input\") {\n\t\t\t_entry.second.to(input);\n\t\t} else if(_entry.first == \"start\") {\n\t\t\t_entry.second.to(start);\n\t\t} else if(_entry.first == \"vdf_height\") {\n\t\t\t_entry.second.to(vdf_height);\n\t\t}\n\t}\n}\n\nvnx::Variant IntervalRequest::get_field(const std::string& _name) const {\n\tif(_name == \"vdf_height\") {\n\t\treturn vnx::Variant(vdf_height);\n\t}\n\tif(_name == \"start\") {\n\t\treturn vnx::Variant(start);\n\t}\n\tif(_name == \"end\") {\n\t\treturn vnx::Variant(end);\n\t}\n\tif(_name == \"infuse\") {\n\t\treturn vnx::Variant(infuse);\n\t}\n\tif(_name == \"input\") {\n\t\treturn vnx::Variant(input);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid IntervalRequest::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"vdf_height\") {\n\t\t_value.to(vdf_height);\n\t} else if(_name == \"start\") {\n\t\t_value.to(start);\n\t} else if(_name == \"end\") {\n\t\t_value.to(end);\n\t} else if(_name == \"infuse\") {\n\t\t_value.to(infuse);\n\t} else if(_name == \"input\") {\n\t\t_value.to(input);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const IntervalRequest& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, IntervalRequest& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* IntervalRequest::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> IntervalRequest::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.IntervalRequest\";\n\ttype_code->type_hash = vnx::Hash64(0xa4e39be061f13d71ull);\n\ttype_code->code_hash = vnx::Hash64(0x7da3de79e64223a8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::IntervalRequest);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<IntervalRequest>(); };\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"start\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"end\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"infuse\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> IntervalRequest::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::IntervalRequest& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.start, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.end, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 3: vnx::read(in, value.infuse, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.input, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::IntervalRequest& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_IntervalRequest;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::IntervalRequest>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(20);\n\tvnx::write_value(_buf + 0, value.vdf_height);\n\tvnx::write_value(_buf + 4, value.start);\n\tvnx::write_value(_buf + 12, value.end);\n\tvnx::write(out, value.infuse, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.input, type_code, type_code->fields[4].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::IntervalRequest& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::IntervalRequest& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::IntervalRequest& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/KeyFile.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 KeyFile::VNX_TYPE_HASH(0xdf868931a939cba1ull);\nconst vnx::Hash64 KeyFile::VNX_CODE_HASH(0x35062c98e95706b2ull);\n\nvnx::Hash64 KeyFile::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string KeyFile::get_type_name() const {\n\treturn \"mmx.KeyFile\";\n}\n\nconst vnx::TypeCode* KeyFile::get_type_code() const {\n\treturn mmx::vnx_native_type_code_KeyFile;\n}\n\nstd::shared_ptr<KeyFile> KeyFile::create() {\n\treturn std::make_shared<KeyFile>();\n}\n\nstd::shared_ptr<vnx::Value> KeyFile::clone() const {\n\treturn std::make_shared<KeyFile>(*this);\n}\n\nvoid KeyFile::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid KeyFile::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid KeyFile::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_KeyFile;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, seed_value);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, finger_print);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid KeyFile::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.KeyFile\\\"\";\n\t_out << \", \\\"seed_value\\\": \"; vnx::write(_out, seed_value);\n\t_out << \", \\\"finger_print\\\": \"; vnx::write(_out, finger_print);\n\t_out << \"}\";\n}\n\nvoid KeyFile::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object KeyFile::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.KeyFile\";\n\t_object[\"seed_value\"] = seed_value;\n\t_object[\"finger_print\"] = finger_print;\n\treturn _object;\n}\n\nvoid KeyFile::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"finger_print\") {\n\t\t\t_entry.second.to(finger_print);\n\t\t} else if(_entry.first == \"seed_value\") {\n\t\t\t_entry.second.to(seed_value);\n\t\t}\n\t}\n}\n\nvnx::Variant KeyFile::get_field(const std::string& _name) const {\n\tif(_name == \"seed_value\") {\n\t\treturn vnx::Variant(seed_value);\n\t}\n\tif(_name == \"finger_print\") {\n\t\treturn vnx::Variant(finger_print);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid KeyFile::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"seed_value\") {\n\t\t_value.to(seed_value);\n\t} else if(_name == \"finger_print\") {\n\t\t_value.to(finger_print);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const KeyFile& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, KeyFile& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* KeyFile::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> KeyFile::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.KeyFile\";\n\ttype_code->type_hash = vnx::Hash64(0xdf868931a939cba1ull);\n\ttype_code->code_hash = vnx::Hash64(0x35062c98e95706b2ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::KeyFile);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<KeyFile>(); };\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"seed_value\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"finger_print\";\n\t\tfield.code = {33, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> KeyFile::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::KeyFile& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.seed_value, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.finger_print, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::KeyFile& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_KeyFile;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::KeyFile>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.seed_value, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.finger_print, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::KeyFile& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::KeyFile& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::KeyFile& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/LookupInfo.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/LookupInfo.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 LookupInfo::VNX_TYPE_HASH(0xb7b2ff343487dd63ull);\nconst vnx::Hash64 LookupInfo::VNX_CODE_HASH(0x62dcd0e9316eb657ull);\n\nvnx::Hash64 LookupInfo::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string LookupInfo::get_type_name() const {\n\treturn \"mmx.LookupInfo\";\n}\n\nconst vnx::TypeCode* LookupInfo::get_type_code() const {\n\treturn mmx::vnx_native_type_code_LookupInfo;\n}\n\nstd::shared_ptr<LookupInfo> LookupInfo::create() {\n\treturn std::make_shared<LookupInfo>();\n}\n\nstd::shared_ptr<vnx::Value> LookupInfo::clone() const {\n\treturn std::make_shared<LookupInfo>(*this);\n}\n\nvoid LookupInfo::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid LookupInfo::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid LookupInfo::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_LookupInfo;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, id);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, vdf_height);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, num_passed);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, num_total);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, slow_time_ms);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, total_time_ms);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, total_delay_ms);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, slow_plot);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid LookupInfo::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.LookupInfo\\\"\";\n\t_out << \", \\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"vdf_height\\\": \"; vnx::write(_out, vdf_height);\n\t_out << \", \\\"num_passed\\\": \"; vnx::write(_out, num_passed);\n\t_out << \", \\\"num_total\\\": \"; vnx::write(_out, num_total);\n\t_out << \", \\\"slow_time_ms\\\": \"; vnx::write(_out, slow_time_ms);\n\t_out << \", \\\"total_time_ms\\\": \"; vnx::write(_out, total_time_ms);\n\t_out << \", \\\"total_delay_ms\\\": \"; vnx::write(_out, total_delay_ms);\n\t_out << \", \\\"slow_plot\\\": \"; vnx::write(_out, slow_plot);\n\t_out << \"}\";\n}\n\nvoid LookupInfo::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object LookupInfo::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.LookupInfo\";\n\t_object[\"id\"] = id;\n\t_object[\"name\"] = name;\n\t_object[\"vdf_height\"] = vdf_height;\n\t_object[\"num_passed\"] = num_passed;\n\t_object[\"num_total\"] = num_total;\n\t_object[\"slow_time_ms\"] = slow_time_ms;\n\t_object[\"total_time_ms\"] = total_time_ms;\n\t_object[\"total_delay_ms\"] = total_delay_ms;\n\t_object[\"slow_plot\"] = slow_plot;\n\treturn _object;\n}\n\nvoid LookupInfo::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t} else if(_entry.first == \"num_passed\") {\n\t\t\t_entry.second.to(num_passed);\n\t\t} else if(_entry.first == \"num_total\") {\n\t\t\t_entry.second.to(num_total);\n\t\t} else if(_entry.first == \"slow_plot\") {\n\t\t\t_entry.second.to(slow_plot);\n\t\t} else if(_entry.first == \"slow_time_ms\") {\n\t\t\t_entry.second.to(slow_time_ms);\n\t\t} else if(_entry.first == \"total_delay_ms\") {\n\t\t\t_entry.second.to(total_delay_ms);\n\t\t} else if(_entry.first == \"total_time_ms\") {\n\t\t\t_entry.second.to(total_time_ms);\n\t\t} else if(_entry.first == \"vdf_height\") {\n\t\t\t_entry.second.to(vdf_height);\n\t\t}\n\t}\n}\n\nvnx::Variant LookupInfo::get_field(const std::string& _name) const {\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"vdf_height\") {\n\t\treturn vnx::Variant(vdf_height);\n\t}\n\tif(_name == \"num_passed\") {\n\t\treturn vnx::Variant(num_passed);\n\t}\n\tif(_name == \"num_total\") {\n\t\treturn vnx::Variant(num_total);\n\t}\n\tif(_name == \"slow_time_ms\") {\n\t\treturn vnx::Variant(slow_time_ms);\n\t}\n\tif(_name == \"total_time_ms\") {\n\t\treturn vnx::Variant(total_time_ms);\n\t}\n\tif(_name == \"total_delay_ms\") {\n\t\treturn vnx::Variant(total_delay_ms);\n\t}\n\tif(_name == \"slow_plot\") {\n\t\treturn vnx::Variant(slow_plot);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid LookupInfo::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"id\") {\n\t\t_value.to(id);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"vdf_height\") {\n\t\t_value.to(vdf_height);\n\t} else if(_name == \"num_passed\") {\n\t\t_value.to(num_passed);\n\t} else if(_name == \"num_total\") {\n\t\t_value.to(num_total);\n\t} else if(_name == \"slow_time_ms\") {\n\t\t_value.to(slow_time_ms);\n\t} else if(_name == \"total_time_ms\") {\n\t\t_value.to(total_time_ms);\n\t} else if(_name == \"total_delay_ms\") {\n\t\t_value.to(total_delay_ms);\n\t} else if(_name == \"slow_plot\") {\n\t\t_value.to(slow_plot);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const LookupInfo& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, LookupInfo& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* LookupInfo::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> LookupInfo::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.LookupInfo\";\n\ttype_code->type_hash = vnx::Hash64(0xb7b2ff343487dd63ull);\n\ttype_code->code_hash = vnx::Hash64(0x62dcd0e9316eb657ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::LookupInfo);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<LookupInfo>(); };\n\ttype_code->fields.resize(9);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_passed\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_total\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"slow_time_ms\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"total_time_ms\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"total_delay_ms\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"slow_plot\";\n\t\tfield.code = {33, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> LookupInfo::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::LookupInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_passed, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_total, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.slow_time_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_time_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_delay_ms, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.id, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.slow_plot, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::LookupInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_LookupInfo;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::LookupInfo>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(36);\n\tvnx::write_value(_buf + 0, value.vdf_height);\n\tvnx::write_value(_buf + 4, value.num_passed);\n\tvnx::write_value(_buf + 8, value.num_total);\n\tvnx::write_value(_buf + 12, value.slow_time_ms);\n\tvnx::write_value(_buf + 20, value.total_time_ms);\n\tvnx::write_value(_buf + 28, value.total_delay_ms);\n\tvnx::write(out, value.id, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.name, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.slow_plot, type_code, type_code->fields[8].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::LookupInfo& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::LookupInfo& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::LookupInfo& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/NetworkInfo.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/NetworkInfo.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 NetworkInfo::VNX_TYPE_HASH(0xd984018819746101ull);\nconst vnx::Hash64 NetworkInfo::VNX_CODE_HASH(0xb17f3fd89a5445bfull);\n\nvnx::Hash64 NetworkInfo::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string NetworkInfo::get_type_name() const {\n\treturn \"mmx.NetworkInfo\";\n}\n\nconst vnx::TypeCode* NetworkInfo::get_type_code() const {\n\treturn mmx::vnx_native_type_code_NetworkInfo;\n}\n\nstd::shared_ptr<NetworkInfo> NetworkInfo::create() {\n\treturn std::make_shared<NetworkInfo>();\n}\n\nstd::shared_ptr<vnx::Value> NetworkInfo::clone() const {\n\treturn std::make_shared<NetworkInfo>(*this);\n}\n\nvoid NetworkInfo::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid NetworkInfo::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid NetworkInfo::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_NetworkInfo;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, is_synced);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, vdf_height);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, synced_since);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, time_diff);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, space_diff);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, block_reward);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, total_space);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, total_supply);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, address_count);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, vdf_speed);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, block_size);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, average_txfee);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, genesis_hash);\n\t_visitor.type_field(_type_code->fields[15], 15); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[16], 16); vnx::accept(_visitor, node_commit);\n\t_visitor.type_field(_type_code->fields[17], 17); vnx::accept(_visitor, node_version);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid NetworkInfo::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.NetworkInfo\\\"\";\n\t_out << \", \\\"is_synced\\\": \"; vnx::write(_out, is_synced);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"vdf_height\\\": \"; vnx::write(_out, vdf_height);\n\t_out << \", \\\"synced_since\\\": \"; vnx::write(_out, synced_since);\n\t_out << \", \\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"time_diff\\\": \"; vnx::write(_out, time_diff);\n\t_out << \", \\\"space_diff\\\": \"; vnx::write(_out, space_diff);\n\t_out << \", \\\"block_reward\\\": \"; vnx::write(_out, block_reward);\n\t_out << \", \\\"total_space\\\": \"; vnx::write(_out, total_space);\n\t_out << \", \\\"total_supply\\\": \"; vnx::write(_out, total_supply);\n\t_out << \", \\\"address_count\\\": \"; vnx::write(_out, address_count);\n\t_out << \", \\\"vdf_speed\\\": \"; vnx::write(_out, vdf_speed);\n\t_out << \", \\\"block_size\\\": \"; vnx::write(_out, block_size);\n\t_out << \", \\\"average_txfee\\\": \"; vnx::write(_out, average_txfee);\n\t_out << \", \\\"genesis_hash\\\": \"; vnx::write(_out, genesis_hash);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"node_commit\\\": \"; vnx::write(_out, node_commit);\n\t_out << \", \\\"node_version\\\": \"; vnx::write(_out, node_version);\n\t_out << \"}\";\n}\n\nvoid NetworkInfo::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object NetworkInfo::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.NetworkInfo\";\n\t_object[\"is_synced\"] = is_synced;\n\t_object[\"height\"] = height;\n\t_object[\"vdf_height\"] = vdf_height;\n\t_object[\"synced_since\"] = synced_since;\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"time_diff\"] = time_diff;\n\t_object[\"space_diff\"] = space_diff;\n\t_object[\"block_reward\"] = block_reward;\n\t_object[\"total_space\"] = total_space;\n\t_object[\"total_supply\"] = total_supply;\n\t_object[\"address_count\"] = address_count;\n\t_object[\"vdf_speed\"] = vdf_speed;\n\t_object[\"block_size\"] = block_size;\n\t_object[\"average_txfee\"] = average_txfee;\n\t_object[\"genesis_hash\"] = genesis_hash;\n\t_object[\"name\"] = name;\n\t_object[\"node_commit\"] = node_commit;\n\t_object[\"node_version\"] = node_version;\n\treturn _object;\n}\n\nvoid NetworkInfo::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address_count\") {\n\t\t\t_entry.second.to(address_count);\n\t\t} else if(_entry.first == \"average_txfee\") {\n\t\t\t_entry.second.to(average_txfee);\n\t\t} else if(_entry.first == \"block_reward\") {\n\t\t\t_entry.second.to(block_reward);\n\t\t} else if(_entry.first == \"block_size\") {\n\t\t\t_entry.second.to(block_size);\n\t\t} else if(_entry.first == \"genesis_hash\") {\n\t\t\t_entry.second.to(genesis_hash);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"is_synced\") {\n\t\t\t_entry.second.to(is_synced);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t} else if(_entry.first == \"node_commit\") {\n\t\t\t_entry.second.to(node_commit);\n\t\t} else if(_entry.first == \"node_version\") {\n\t\t\t_entry.second.to(node_version);\n\t\t} else if(_entry.first == \"space_diff\") {\n\t\t\t_entry.second.to(space_diff);\n\t\t} else if(_entry.first == \"synced_since\") {\n\t\t\t_entry.second.to(synced_since);\n\t\t} else if(_entry.first == \"time_diff\") {\n\t\t\t_entry.second.to(time_diff);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t} else if(_entry.first == \"total_space\") {\n\t\t\t_entry.second.to(total_space);\n\t\t} else if(_entry.first == \"total_supply\") {\n\t\t\t_entry.second.to(total_supply);\n\t\t} else if(_entry.first == \"vdf_height\") {\n\t\t\t_entry.second.to(vdf_height);\n\t\t} else if(_entry.first == \"vdf_speed\") {\n\t\t\t_entry.second.to(vdf_speed);\n\t\t}\n\t}\n}\n\nvnx::Variant NetworkInfo::get_field(const std::string& _name) const {\n\tif(_name == \"is_synced\") {\n\t\treturn vnx::Variant(is_synced);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"vdf_height\") {\n\t\treturn vnx::Variant(vdf_height);\n\t}\n\tif(_name == \"synced_since\") {\n\t\treturn vnx::Variant(synced_since);\n\t}\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"time_diff\") {\n\t\treturn vnx::Variant(time_diff);\n\t}\n\tif(_name == \"space_diff\") {\n\t\treturn vnx::Variant(space_diff);\n\t}\n\tif(_name == \"block_reward\") {\n\t\treturn vnx::Variant(block_reward);\n\t}\n\tif(_name == \"total_space\") {\n\t\treturn vnx::Variant(total_space);\n\t}\n\tif(_name == \"total_supply\") {\n\t\treturn vnx::Variant(total_supply);\n\t}\n\tif(_name == \"address_count\") {\n\t\treturn vnx::Variant(address_count);\n\t}\n\tif(_name == \"vdf_speed\") {\n\t\treturn vnx::Variant(vdf_speed);\n\t}\n\tif(_name == \"block_size\") {\n\t\treturn vnx::Variant(block_size);\n\t}\n\tif(_name == \"average_txfee\") {\n\t\treturn vnx::Variant(average_txfee);\n\t}\n\tif(_name == \"genesis_hash\") {\n\t\treturn vnx::Variant(genesis_hash);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"node_commit\") {\n\t\treturn vnx::Variant(node_commit);\n\t}\n\tif(_name == \"node_version\") {\n\t\treturn vnx::Variant(node_version);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid NetworkInfo::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"is_synced\") {\n\t\t_value.to(is_synced);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"vdf_height\") {\n\t\t_value.to(vdf_height);\n\t} else if(_name == \"synced_since\") {\n\t\t_value.to(synced_since);\n\t} else if(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"time_diff\") {\n\t\t_value.to(time_diff);\n\t} else if(_name == \"space_diff\") {\n\t\t_value.to(space_diff);\n\t} else if(_name == \"block_reward\") {\n\t\t_value.to(block_reward);\n\t} else if(_name == \"total_space\") {\n\t\t_value.to(total_space);\n\t} else if(_name == \"total_supply\") {\n\t\t_value.to(total_supply);\n\t} else if(_name == \"address_count\") {\n\t\t_value.to(address_count);\n\t} else if(_name == \"vdf_speed\") {\n\t\t_value.to(vdf_speed);\n\t} else if(_name == \"block_size\") {\n\t\t_value.to(block_size);\n\t} else if(_name == \"average_txfee\") {\n\t\t_value.to(average_txfee);\n\t} else if(_name == \"genesis_hash\") {\n\t\t_value.to(genesis_hash);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"node_commit\") {\n\t\t_value.to(node_commit);\n\t} else if(_name == \"node_version\") {\n\t\t_value.to(node_version);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const NetworkInfo& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, NetworkInfo& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* NetworkInfo::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> NetworkInfo::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.NetworkInfo\";\n\ttype_code->type_hash = vnx::Hash64(0xd984018819746101ull);\n\ttype_code->code_hash = vnx::Hash64(0xb17f3fd89a5445bfull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::NetworkInfo);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<NetworkInfo>(); };\n\ttype_code->fields.resize(18);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_synced\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"synced_since\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_diff\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"space_diff\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"block_reward\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"total_space\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"total_supply\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"address_count\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"vdf_speed\";\n\t\tfield.code = {10};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"block_size\";\n\t\tfield.code = {10};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"average_txfee\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"genesis_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[15];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[16];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"node_commit\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[17];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"node_version\";\n\t\tfield.code = {32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> NetworkInfo::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::NetworkInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_synced, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.synced_since, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_stamp, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_diff, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.space_diff, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.block_reward, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_space, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[9]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_supply, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[10]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.address_count, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[11]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_speed, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[12]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.block_size, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[13]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.average_txfee, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 14: vnx::read(in, value.genesis_hash, type_code, _field->code.data()); break;\n\t\t\tcase 15: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 16: vnx::read(in, value.node_commit, type_code, _field->code.data()); break;\n\t\t\tcase 17: vnx::read(in, value.node_version, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::NetworkInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_NetworkInfo;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::NetworkInfo>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(93);\n\tvnx::write_value(_buf + 0, value.is_synced);\n\tvnx::write_value(_buf + 1, value.height);\n\tvnx::write_value(_buf + 5, value.vdf_height);\n\tvnx::write_value(_buf + 9, value.synced_since);\n\tvnx::write_value(_buf + 13, value.time_stamp);\n\tvnx::write_value(_buf + 21, value.time_diff);\n\tvnx::write_value(_buf + 29, value.space_diff);\n\tvnx::write_value(_buf + 37, value.block_reward);\n\tvnx::write_value(_buf + 45, value.total_space);\n\tvnx::write_value(_buf + 53, value.total_supply);\n\tvnx::write_value(_buf + 61, value.address_count);\n\tvnx::write_value(_buf + 69, value.vdf_speed);\n\tvnx::write_value(_buf + 77, value.block_size);\n\tvnx::write_value(_buf + 85, value.average_txfee);\n\tvnx::write(out, value.genesis_hash, type_code, type_code->fields[14].code.data());\n\tvnx::write(out, value.name, type_code, type_code->fields[15].code.data());\n\tvnx::write(out, value.node_commit, type_code, type_code->fields[16].code.data());\n\tvnx::write(out, value.node_version, type_code, type_code->fields[17].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::NetworkInfo& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::NetworkInfo& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::NetworkInfo& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/NodeAsyncClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/NodeAsyncClient.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/NetworkInfo.hxx>\n#include <mmx/Node_add_block.hxx>\n#include <mmx/Node_add_block_return.hxx>\n#include <mmx/Node_add_transaction.hxx>\n#include <mmx/Node_add_transaction_return.hxx>\n#include <mmx/Node_call_contract.hxx>\n#include <mmx/Node_call_contract_return.hxx>\n#include <mmx/Node_dump_storage.hxx>\n#include <mmx/Node_dump_storage_return.hxx>\n#include <mmx/Node_fetch_offers.hxx>\n#include <mmx/Node_fetch_offers_return.hxx>\n#include <mmx/Node_get_all_balances.hxx>\n#include <mmx/Node_get_all_balances_return.hxx>\n#include <mmx/Node_get_balance.hxx>\n#include <mmx/Node_get_balance_return.hxx>\n#include <mmx/Node_get_balances.hxx>\n#include <mmx/Node_get_balances_return.hxx>\n#include <mmx/Node_get_block.hxx>\n#include <mmx/Node_get_block_return.hxx>\n#include <mmx/Node_get_block_at.hxx>\n#include <mmx/Node_get_block_at_return.hxx>\n#include <mmx/Node_get_block_hash.hxx>\n#include <mmx/Node_get_block_hash_return.hxx>\n#include <mmx/Node_get_block_hash_ex.hxx>\n#include <mmx/Node_get_block_hash_ex_return.hxx>\n#include <mmx/Node_get_contract.hxx>\n#include <mmx/Node_get_contract_return.hxx>\n#include <mmx/Node_get_contract_balances.hxx>\n#include <mmx/Node_get_contract_balances_return.hxx>\n#include <mmx/Node_get_contract_for.hxx>\n#include <mmx/Node_get_contract_for_return.hxx>\n#include <mmx/Node_get_contracts.hxx>\n#include <mmx/Node_get_contracts_return.hxx>\n#include <mmx/Node_get_contracts_by.hxx>\n#include <mmx/Node_get_contracts_by_return.hxx>\n#include <mmx/Node_get_contracts_owned_by.hxx>\n#include <mmx/Node_get_contracts_owned_by_return.hxx>\n#include <mmx/Node_get_exec_history.hxx>\n#include <mmx/Node_get_exec_history_return.hxx>\n#include <mmx/Node_get_farmed_block_summary.hxx>\n#include <mmx/Node_get_farmed_block_summary_return.hxx>\n#include <mmx/Node_get_farmed_blocks.hxx>\n#include <mmx/Node_get_farmed_blocks_return.hxx>\n#include <mmx/Node_get_farmer_ranking.hxx>\n#include <mmx/Node_get_farmer_ranking_return.hxx>\n#include <mmx/Node_get_genesis_hash.hxx>\n#include <mmx/Node_get_genesis_hash_return.hxx>\n#include <mmx/Node_get_header.hxx>\n#include <mmx/Node_get_header_return.hxx>\n#include <mmx/Node_get_header_at.hxx>\n#include <mmx/Node_get_header_at_return.hxx>\n#include <mmx/Node_get_height.hxx>\n#include <mmx/Node_get_height_return.hxx>\n#include <mmx/Node_get_history.hxx>\n#include <mmx/Node_get_history_return.hxx>\n#include <mmx/Node_get_history_memo.hxx>\n#include <mmx/Node_get_history_memo_return.hxx>\n#include <mmx/Node_get_network_info.hxx>\n#include <mmx/Node_get_network_info_return.hxx>\n#include <mmx/Node_get_offer.hxx>\n#include <mmx/Node_get_offer_return.hxx>\n#include <mmx/Node_get_offers.hxx>\n#include <mmx/Node_get_offers_return.hxx>\n#include <mmx/Node_get_offers_by.hxx>\n#include <mmx/Node_get_offers_by_return.hxx>\n#include <mmx/Node_get_params.hxx>\n#include <mmx/Node_get_params_return.hxx>\n#include <mmx/Node_get_plot_nft_info.hxx>\n#include <mmx/Node_get_plot_nft_info_return.hxx>\n#include <mmx/Node_get_plot_nft_target.hxx>\n#include <mmx/Node_get_plot_nft_target_return.hxx>\n#include <mmx/Node_get_recent_offers.hxx>\n#include <mmx/Node_get_recent_offers_return.hxx>\n#include <mmx/Node_get_recent_offers_for.hxx>\n#include <mmx/Node_get_recent_offers_for_return.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity_return.hxx>\n#include <mmx/Node_get_swap_fees_earned.hxx>\n#include <mmx/Node_get_swap_fees_earned_return.hxx>\n#include <mmx/Node_get_swap_history.hxx>\n#include <mmx/Node_get_swap_history_return.hxx>\n#include <mmx/Node_get_swap_info.hxx>\n#include <mmx/Node_get_swap_info_return.hxx>\n#include <mmx/Node_get_swap_liquidity_by.hxx>\n#include <mmx/Node_get_swap_liquidity_by_return.hxx>\n#include <mmx/Node_get_swap_trade_estimate.hxx>\n#include <mmx/Node_get_swap_trade_estimate_return.hxx>\n#include <mmx/Node_get_swap_user_info.hxx>\n#include <mmx/Node_get_swap_user_info_return.hxx>\n#include <mmx/Node_get_swaps.hxx>\n#include <mmx/Node_get_swaps_return.hxx>\n#include <mmx/Node_get_synced_height.hxx>\n#include <mmx/Node_get_synced_height_return.hxx>\n#include <mmx/Node_get_synced_vdf_height.hxx>\n#include <mmx/Node_get_synced_vdf_height_return.hxx>\n#include <mmx/Node_get_total_balance.hxx>\n#include <mmx/Node_get_total_balance_return.hxx>\n#include <mmx/Node_get_total_balances.hxx>\n#include <mmx/Node_get_total_balances_return.hxx>\n#include <mmx/Node_get_total_supply.hxx>\n#include <mmx/Node_get_total_supply_return.hxx>\n#include <mmx/Node_get_trade_history.hxx>\n#include <mmx/Node_get_trade_history_return.hxx>\n#include <mmx/Node_get_trade_history_for.hxx>\n#include <mmx/Node_get_trade_history_for_return.hxx>\n#include <mmx/Node_get_transaction.hxx>\n#include <mmx/Node_get_transaction_return.hxx>\n#include <mmx/Node_get_transactions.hxx>\n#include <mmx/Node_get_transactions_return.hxx>\n#include <mmx/Node_get_tx_height.hxx>\n#include <mmx/Node_get_tx_height_return.hxx>\n#include <mmx/Node_get_tx_ids.hxx>\n#include <mmx/Node_get_tx_ids_return.hxx>\n#include <mmx/Node_get_tx_ids_at.hxx>\n#include <mmx/Node_get_tx_ids_at_return.hxx>\n#include <mmx/Node_get_tx_ids_since.hxx>\n#include <mmx/Node_get_tx_ids_since_return.hxx>\n#include <mmx/Node_get_tx_info.hxx>\n#include <mmx/Node_get_tx_info_return.hxx>\n#include <mmx/Node_get_tx_info_for.hxx>\n#include <mmx/Node_get_tx_info_for_return.hxx>\n#include <mmx/Node_get_vdf_height.hxx>\n#include <mmx/Node_get_vdf_height_return.hxx>\n#include <mmx/Node_get_vdf_peak.hxx>\n#include <mmx/Node_get_vdf_peak_return.hxx>\n#include <mmx/Node_read_storage.hxx>\n#include <mmx/Node_read_storage_return.hxx>\n#include <mmx/Node_read_storage_array.hxx>\n#include <mmx/Node_read_storage_array_return.hxx>\n#include <mmx/Node_read_storage_entry_addr.hxx>\n#include <mmx/Node_read_storage_entry_addr_return.hxx>\n#include <mmx/Node_read_storage_entry_string.hxx>\n#include <mmx/Node_read_storage_entry_string_return.hxx>\n#include <mmx/Node_read_storage_entry_var.hxx>\n#include <mmx/Node_read_storage_entry_var_return.hxx>\n#include <mmx/Node_read_storage_field.hxx>\n#include <mmx/Node_read_storage_field_return.hxx>\n#include <mmx/Node_read_storage_map.hxx>\n#include <mmx/Node_read_storage_map_return.hxx>\n#include <mmx/Node_read_storage_object.hxx>\n#include <mmx/Node_read_storage_object_return.hxx>\n#include <mmx/Node_read_storage_var.hxx>\n#include <mmx/Node_read_storage_var_return.hxx>\n#include <mmx/Node_revert_sync.hxx>\n#include <mmx/Node_revert_sync_return.hxx>\n#include <mmx/Node_start_sync.hxx>\n#include <mmx/Node_start_sync_return.hxx>\n#include <mmx/Node_validate.hxx>\n#include <mmx/Node_validate_return.hxx>\n#include <mmx/Node_verify_partial.hxx>\n#include <mmx/Node_verify_partial_return.hxx>\n#include <mmx/Node_verify_plot_nft_target.hxx>\n#include <mmx/Node_verify_plot_nft_target_return.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/exec_entry_t.hxx>\n#include <mmx/exec_result_t.hxx>\n#include <mmx/farmed_block_summary_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/plot_nft_info_t.hxx>\n#include <mmx/pooling_error_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/swap_entry_t.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <mmx/swap_user_info_t.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <mmx/uint128.hpp>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nNodeAsyncClient::NodeAsyncClient(const std::string& service_name)\n\t:\tAsyncClient::AsyncClient(vnx::Hash64(service_name))\n{\n}\n\nNodeAsyncClient::NodeAsyncClient(vnx::Hash64 service_addr)\n\t:\tAsyncClient::AsyncClient(service_addr)\n{\n}\n\nuint64_t NodeAsyncClient::get_params(const std::function<void(std::shared_ptr<const ::mmx::ChainParams>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_params::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 0;\n\t\tvnx_queue_get_params[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_network_info(const std::function<void(std::shared_ptr<const ::mmx::NetworkInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_network_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 1;\n\t\tvnx_queue_get_network_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_genesis_hash(const std::function<void(const ::mmx::hash_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_genesis_hash::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 2;\n\t\tvnx_queue_get_genesis_hash[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_height(const std::function<void(const uint32_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_height::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 3;\n\t\tvnx_queue_get_height[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_vdf_height(const std::function<void(const uint32_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_vdf_height::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 4;\n\t\tvnx_queue_get_vdf_height[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_synced_height(const std::function<void(const vnx::optional<uint32_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_synced_height::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 5;\n\t\tvnx_queue_get_synced_height[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_synced_vdf_height(const std::function<void(const vnx::optional<uint32_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_synced_vdf_height::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 6;\n\t\tvnx_queue_get_synced_vdf_height[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_vdf_peak(const std::function<void(const ::mmx::hash_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_vdf_peak::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 7;\n\t\tvnx_queue_get_vdf_peak[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_block(const ::mmx::hash_t& hash, const std::function<void(std::shared_ptr<const ::mmx::Block>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_block::create();\n\t_method->hash = hash;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 8;\n\t\tvnx_queue_get_block[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_block_at(const uint32_t& height, const std::function<void(std::shared_ptr<const ::mmx::Block>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_block_at::create();\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 9;\n\t\tvnx_queue_get_block_at[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_header(const ::mmx::hash_t& hash, const std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_header::create();\n\t_method->hash = hash;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 10;\n\t\tvnx_queue_get_header[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_header_at(const uint32_t& height, const std::function<void(std::shared_ptr<const ::mmx::BlockHeader>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_header_at::create();\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 11;\n\t\tvnx_queue_get_header_at[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_block_hash(const uint32_t& height, const std::function<void(const vnx::optional<::mmx::hash_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_block_hash::create();\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 12;\n\t\tvnx_queue_get_block_hash[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_block_hash_ex(const uint32_t& height, const std::function<void(const vnx::optional<std::pair<::mmx::hash_t, ::mmx::hash_t>>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_block_hash_ex::create();\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 13;\n\t\tvnx_queue_get_block_hash_ex[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_tx_height(const ::mmx::hash_t& id, const std::function<void(const vnx::optional<uint32_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_tx_height::create();\n\t_method->id = id;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 14;\n\t\tvnx_queue_get_tx_height[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_tx_info(const ::mmx::hash_t& id, const std::function<void(const vnx::optional<::mmx::tx_info_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_tx_info::create();\n\t_method->id = id;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 15;\n\t\tvnx_queue_get_tx_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_tx_info_for(std::shared_ptr<const ::mmx::Transaction> tx, const std::function<void(const vnx::optional<::mmx::tx_info_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_tx_info_for::create();\n\t_method->tx = tx;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 16;\n\t\tvnx_queue_get_tx_info_for[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_tx_ids(const uint32_t& limit, const std::function<void(const std::vector<::mmx::hash_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_tx_ids::create();\n\t_method->limit = limit;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 17;\n\t\tvnx_queue_get_tx_ids[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_tx_ids_at(const uint32_t& height, const std::function<void(const std::vector<::mmx::hash_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_tx_ids_at::create();\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 18;\n\t\tvnx_queue_get_tx_ids_at[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_tx_ids_since(const uint32_t& height, const std::function<void(const std::vector<::mmx::hash_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_tx_ids_since::create();\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 19;\n\t\tvnx_queue_get_tx_ids_since[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::validate(std::shared_ptr<const ::mmx::Transaction> tx, const std::function<void(const ::mmx::exec_result_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_validate::create();\n\t_method->tx = tx;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 20;\n\t\tvnx_queue_validate[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::add_block(std::shared_ptr<const ::mmx::Block> block, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_add_block::create();\n\t_method->block = block;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 21;\n\t\tvnx_queue_add_block[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::add_transaction(std::shared_ptr<const ::mmx::Transaction> tx, const vnx::bool_t& pre_validate, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_add_transaction::create();\n\t_method->tx = tx;\n\t_method->pre_validate = pre_validate;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 22;\n\t\tvnx_queue_add_transaction[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_contract(const ::mmx::addr_t& address, const std::function<void(std::shared_ptr<const ::mmx::Contract>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_contract::create();\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 23;\n\t\tvnx_queue_get_contract[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_contract_for(const ::mmx::addr_t& address, const std::function<void(std::shared_ptr<const ::mmx::Contract>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_contract_for::create();\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 24;\n\t\tvnx_queue_get_contract_for[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_contracts(const std::vector<::mmx::addr_t>& addresses, const std::function<void(const std::vector<std::shared_ptr<const ::mmx::Contract>>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_contracts::create();\n\t_method->addresses = addresses;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 25;\n\t\tvnx_queue_get_contracts[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_contracts_by(const std::vector<::mmx::addr_t>& addresses, const vnx::optional<::mmx::hash_t>& type_hash, const std::function<void(const std::vector<::mmx::addr_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_contracts_by::create();\n\t_method->addresses = addresses;\n\t_method->type_hash = type_hash;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 26;\n\t\tvnx_queue_get_contracts_by[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_contracts_owned_by(const std::vector<::mmx::addr_t>& addresses, const vnx::optional<::mmx::hash_t>& type_hash, const std::function<void(const std::vector<::mmx::addr_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_contracts_owned_by::create();\n\t_method->addresses = addresses;\n\t_method->type_hash = type_hash;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 27;\n\t\tvnx_queue_get_contracts_owned_by[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_transaction(const ::mmx::hash_t& id, const vnx::bool_t& pending, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_transaction::create();\n\t_method->id = id;\n\t_method->pending = pending;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 28;\n\t\tvnx_queue_get_transaction[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_transactions(const std::vector<::mmx::hash_t>& ids, const std::function<void(const std::vector<std::shared_ptr<const ::mmx::Transaction>>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_transactions::create();\n\t_method->ids = ids;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 29;\n\t\tvnx_queue_get_transactions[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_history(const std::vector<::mmx::addr_t>& addresses, const ::mmx::query_filter_t& filter, const std::function<void(const std::vector<::mmx::tx_entry_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_history::create();\n\t_method->addresses = addresses;\n\t_method->filter = filter;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 30;\n\t\tvnx_queue_get_history[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_history_memo(const std::vector<::mmx::addr_t>& addresses, const std::string& memo, const ::mmx::query_filter_t& filter, const std::function<void(const std::vector<::mmx::tx_entry_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_history_memo::create();\n\t_method->addresses = addresses;\n\t_method->memo = memo;\n\t_method->filter = filter;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 31;\n\t\tvnx_queue_get_history_memo[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_balance(const ::mmx::addr_t& address, const ::mmx::addr_t& currency, const std::function<void(const ::mmx::uint128&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_balance::create();\n\t_method->address = address;\n\t_method->currency = currency;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 32;\n\t\tvnx_queue_get_balance[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_balances(const ::mmx::addr_t& address, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit, const std::function<void(const std::map<::mmx::addr_t, ::mmx::uint128>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_balances::create();\n\t_method->address = address;\n\t_method->whitelist = whitelist;\n\t_method->limit = limit;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 33;\n\t\tvnx_queue_get_balances[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_contract_balances(const ::mmx::addr_t& address, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit, const std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_contract_balances::create();\n\t_method->address = address;\n\t_method->whitelist = whitelist;\n\t_method->limit = limit;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 34;\n\t\tvnx_queue_get_contract_balances[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_total_balance(const std::vector<::mmx::addr_t>& addresses, const ::mmx::addr_t& currency, const std::function<void(const ::mmx::uint128&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_total_balance::create();\n\t_method->addresses = addresses;\n\t_method->currency = currency;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 35;\n\t\tvnx_queue_get_total_balance[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_total_balances(const std::vector<::mmx::addr_t>& addresses, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit, const std::function<void(const std::map<::mmx::addr_t, ::mmx::uint128>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_total_balances::create();\n\t_method->addresses = addresses;\n\t_method->whitelist = whitelist;\n\t_method->limit = limit;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 36;\n\t\tvnx_queue_get_total_balances[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_all_balances(const std::vector<::mmx::addr_t>& addresses, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit, const std::function<void(const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_all_balances::create();\n\t_method->addresses = addresses;\n\t_method->whitelist = whitelist;\n\t_method->limit = limit;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 37;\n\t\tvnx_queue_get_all_balances[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_exec_history(const ::mmx::addr_t& address, const int32_t& limit, const vnx::bool_t& recent, const std::function<void(const std::vector<::mmx::exec_entry_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_exec_history::create();\n\t_method->address = address;\n\t_method->limit = limit;\n\t_method->recent = recent;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 38;\n\t\tvnx_queue_get_exec_history[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::read_storage(const ::mmx::addr_t& contract, const uint32_t& height, const std::function<void(const std::map<std::string, ::mmx::vm::varptr_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_read_storage::create();\n\t_method->contract = contract;\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 39;\n\t\tvnx_queue_read_storage[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::dump_storage(const ::mmx::addr_t& contract, const uint32_t& height, const std::function<void(const std::map<uint64_t, ::mmx::vm::varptr_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_dump_storage::create();\n\t_method->contract = contract;\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 40;\n\t\tvnx_queue_dump_storage[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::read_storage_var(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height, const std::function<void(const ::mmx::vm::varptr_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_read_storage_var::create();\n\t_method->contract = contract;\n\t_method->address = address;\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 41;\n\t\tvnx_queue_read_storage_var[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::read_storage_entry_var(const ::mmx::addr_t& contract, const uint64_t& address, const uint64_t& key, const uint32_t& height, const std::function<void(const ::mmx::vm::varptr_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_read_storage_entry_var::create();\n\t_method->contract = contract;\n\t_method->address = address;\n\t_method->key = key;\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 42;\n\t\tvnx_queue_read_storage_entry_var[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::read_storage_field(const ::mmx::addr_t& contract, const std::string& name, const uint32_t& height, const std::function<void(const std::pair<::mmx::vm::varptr_t, uint64_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_read_storage_field::create();\n\t_method->contract = contract;\n\t_method->name = name;\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 43;\n\t\tvnx_queue_read_storage_field[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::read_storage_entry_addr(const ::mmx::addr_t& contract, const std::string& name, const ::mmx::addr_t& key, const uint32_t& height, const std::function<void(const std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_read_storage_entry_addr::create();\n\t_method->contract = contract;\n\t_method->name = name;\n\t_method->key = key;\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 44;\n\t\tvnx_queue_read_storage_entry_addr[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::read_storage_entry_string(const ::mmx::addr_t& contract, const std::string& name, const std::string& key, const uint32_t& height, const std::function<void(const std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_read_storage_entry_string::create();\n\t_method->contract = contract;\n\t_method->name = name;\n\t_method->key = key;\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 45;\n\t\tvnx_queue_read_storage_entry_string[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::read_storage_array(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height, const std::function<void(const std::vector<::mmx::vm::varptr_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_read_storage_array::create();\n\t_method->contract = contract;\n\t_method->address = address;\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 46;\n\t\tvnx_queue_read_storage_array[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::read_storage_map(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height, const std::function<void(const std::map<::mmx::vm::varptr_t, ::mmx::vm::varptr_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_read_storage_map::create();\n\t_method->contract = contract;\n\t_method->address = address;\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 47;\n\t\tvnx_queue_read_storage_map[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::read_storage_object(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height, const std::function<void(const std::map<std::string, ::mmx::vm::varptr_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_read_storage_object::create();\n\t_method->contract = contract;\n\t_method->address = address;\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 48;\n\t\tvnx_queue_read_storage_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::call_contract(const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const vnx::optional<::mmx::addr_t>& user, const vnx::optional<std::pair<::mmx::addr_t, ::mmx::uint128>>& deposit, const std::function<void(const ::vnx::Variant&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_call_contract::create();\n\t_method->address = address;\n\t_method->method = method;\n\t_method->args = args;\n\t_method->user = user;\n\t_method->deposit = deposit;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 49;\n\t\tvnx_queue_call_contract[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_plot_nft_info(const ::mmx::addr_t& address, const std::function<void(const vnx::optional<::mmx::plot_nft_info_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_plot_nft_info::create();\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 50;\n\t\tvnx_queue_get_plot_nft_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_plot_nft_target(const ::mmx::addr_t& address, const vnx::optional<::mmx::addr_t>& farmer_addr, const std::function<void(const ::mmx::addr_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_plot_nft_target::create();\n\t_method->address = address;\n\t_method->farmer_addr = farmer_addr;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 51;\n\t\tvnx_queue_get_plot_nft_target[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_offer(const ::mmx::addr_t& address, const std::function<void(const ::mmx::offer_data_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_offer::create();\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 52;\n\t\tvnx_queue_get_offer[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_offers(const uint32_t& since, const vnx::bool_t& state, const std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_offers::create();\n\t_method->since = since;\n\t_method->state = state;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 53;\n\t\tvnx_queue_get_offers[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_offers_by(const std::vector<::mmx::addr_t>& owners, const vnx::bool_t& state, const std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_offers_by::create();\n\t_method->owners = owners;\n\t_method->state = state;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 54;\n\t\tvnx_queue_get_offers_by[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::fetch_offers(const std::vector<::mmx::addr_t>& addresses, const vnx::bool_t& state, const vnx::bool_t& closed, const std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_fetch_offers::create();\n\t_method->addresses = addresses;\n\t_method->state = state;\n\t_method->closed = closed;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 55;\n\t\tvnx_queue_fetch_offers[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_recent_offers(const int32_t& limit, const vnx::bool_t& state, const std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_recent_offers::create();\n\t_method->limit = limit;\n\t_method->state = state;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 56;\n\t\tvnx_queue_get_recent_offers[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_recent_offers_for(const vnx::optional<::mmx::addr_t>& bid, const vnx::optional<::mmx::addr_t>& ask, const ::mmx::uint128& min_bid, const int32_t& limit, const vnx::bool_t& state, const std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_recent_offers_for::create();\n\t_method->bid = bid;\n\t_method->ask = ask;\n\t_method->min_bid = min_bid;\n\t_method->limit = limit;\n\t_method->state = state;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 57;\n\t\tvnx_queue_get_recent_offers_for[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_trade_history(const int32_t& limit, const uint32_t& since, const std::function<void(const std::vector<::mmx::trade_entry_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_trade_history::create();\n\t_method->limit = limit;\n\t_method->since = since;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 58;\n\t\tvnx_queue_get_trade_history[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_trade_history_for(const vnx::optional<::mmx::addr_t>& bid, const vnx::optional<::mmx::addr_t>& ask, const int32_t& limit, const uint32_t& since, const std::function<void(const std::vector<::mmx::trade_entry_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_trade_history_for::create();\n\t_method->bid = bid;\n\t_method->ask = ask;\n\t_method->limit = limit;\n\t_method->since = since;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 59;\n\t\tvnx_queue_get_trade_history_for[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_swaps(const uint32_t& since, const vnx::optional<::mmx::addr_t>& token, const vnx::optional<::mmx::addr_t>& currency, const int32_t& limit, const std::function<void(const std::vector<::mmx::swap_info_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_swaps::create();\n\t_method->since = since;\n\t_method->token = token;\n\t_method->currency = currency;\n\t_method->limit = limit;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 60;\n\t\tvnx_queue_get_swaps[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_swap_info(const ::mmx::addr_t& address, const std::function<void(const ::mmx::swap_info_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_swap_info::create();\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 61;\n\t\tvnx_queue_get_swap_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_swap_user_info(const ::mmx::addr_t& address, const ::mmx::addr_t& user, const std::function<void(const ::mmx::swap_user_info_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_swap_user_info::create();\n\t_method->address = address;\n\t_method->user = user;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 62;\n\t\tvnx_queue_get_swap_user_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_swap_history(const ::mmx::addr_t& address, const int32_t& limit, const std::function<void(const std::vector<::mmx::swap_entry_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_swap_history::create();\n\t_method->address = address;\n\t_method->limit = limit;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 63;\n\t\tvnx_queue_get_swap_history[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_swap_trade_estimate(const ::mmx::addr_t& address, const uint32_t& i, const ::mmx::uint128& amount, const int32_t& num_iter, const std::function<void(const std::array<::mmx::uint128, 2>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_swap_trade_estimate::create();\n\t_method->address = address;\n\t_method->i = i;\n\t_method->amount = amount;\n\t_method->num_iter = num_iter;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 64;\n\t\tvnx_queue_get_swap_trade_estimate[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_swap_fees_earned(const ::mmx::addr_t& address, const ::mmx::addr_t& user, const std::function<void(const std::array<::mmx::uint128, 2>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_swap_fees_earned::create();\n\t_method->address = address;\n\t_method->user = user;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 65;\n\t\tvnx_queue_get_swap_fees_earned[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_swap_equivalent_liquidity(const ::mmx::addr_t& address, const ::mmx::addr_t& user, const std::function<void(const std::array<::mmx::uint128, 2>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_swap_equivalent_liquidity::create();\n\t_method->address = address;\n\t_method->user = user;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 66;\n\t\tvnx_queue_get_swap_equivalent_liquidity[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_swap_liquidity_by(const std::vector<::mmx::addr_t>& addresses, const std::function<void(const std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_swap_liquidity_by::create();\n\t_method->addresses = addresses;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 67;\n\t\tvnx_queue_get_swap_liquidity_by[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_total_supply(const ::mmx::addr_t& currency, const std::function<void(const ::mmx::uint128&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_total_supply::create();\n\t_method->currency = currency;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 68;\n\t\tvnx_queue_get_total_supply[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_farmed_blocks(const std::vector<::mmx::pubkey_t>& farmer_keys, const vnx::bool_t& full_blocks, const uint32_t& since, const int32_t& limit, const std::function<void(const std::vector<std::shared_ptr<const ::mmx::BlockHeader>>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_farmed_blocks::create();\n\t_method->farmer_keys = farmer_keys;\n\t_method->full_blocks = full_blocks;\n\t_method->since = since;\n\t_method->limit = limit;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 69;\n\t\tvnx_queue_get_farmed_blocks[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_farmed_block_summary(const std::vector<::mmx::pubkey_t>& farmer_keys, const uint32_t& since, const std::function<void(const ::mmx::farmed_block_summary_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_farmed_block_summary::create();\n\t_method->farmer_keys = farmer_keys;\n\t_method->since = since;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 70;\n\t\tvnx_queue_get_farmed_block_summary[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::get_farmer_ranking(const int32_t& limit, const std::function<void(const std::vector<std::pair<::mmx::pubkey_t, uint32_t>>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_get_farmer_ranking::create();\n\t_method->limit = limit;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 71;\n\t\tvnx_queue_get_farmer_ranking[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::verify_plot_nft_target(const ::mmx::addr_t& address, const ::mmx::addr_t& pool_target, const std::function<void(const std::tuple<::mmx::pooling_error_e, std::string>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_verify_plot_nft_target::create();\n\t_method->address = address;\n\t_method->pool_target = pool_target;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 72;\n\t\tvnx_queue_verify_plot_nft_target[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::verify_partial(std::shared_ptr<const ::mmx::Partial> partial, const vnx::optional<::mmx::addr_t>& pool_target, const std::function<void(const std::tuple<::mmx::pooling_error_e, std::string>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_verify_partial::create();\n\t_method->partial = partial;\n\t_method->pool_target = pool_target;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 73;\n\t\tvnx_queue_verify_partial[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::start_sync(const vnx::bool_t& force, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_start_sync::create();\n\t_method->force = force;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 74;\n\t\tvnx_queue_start_sync[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::revert_sync(const uint32_t& height, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Node_revert_sync::create();\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 75;\n\t\tvnx_queue_revert_sync[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 76;\n\t\tvnx_queue_http_request[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes, const std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request_chunk::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\t_method->offset = offset;\n\t_method->max_bytes = max_bytes;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 77;\n\t\tvnx_queue_http_request_chunk[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::vnx_get_config_object(const std::function<void(const ::vnx::Object&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 78;\n\t\tvnx_queue_vnx_get_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::vnx_get_config(const std::string& name, const std::function<void(const ::vnx::Variant&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 79;\n\t\tvnx_queue_vnx_get_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::vnx_set_config_object(const ::vnx::Object& config, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 80;\n\t\tvnx_queue_vnx_set_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 81;\n\t\tvnx_queue_vnx_set_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::vnx_get_type_code(const std::function<void(const ::vnx::TypeCode&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 82;\n\t\tvnx_queue_vnx_get_type_code[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::vnx_get_module_info(const std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 83;\n\t\tvnx_queue_vnx_get_module_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::vnx_restart(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 84;\n\t\tvnx_queue_vnx_restart[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::vnx_stop(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 85;\n\t\tvnx_queue_vnx_stop[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t NodeAsyncClient::vnx_self_test(const std::function<void(const vnx::bool_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 86;\n\t\tvnx_queue_vnx_self_test[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nint32_t NodeAsyncClient::vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\treturn -1;\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_get_params.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_params.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_params.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_get_network_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_network_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_network_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_get_genesis_hash.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_genesis_hash.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_genesis_hash.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_get_height.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_height.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_height.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_get_vdf_height.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_vdf_height.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_vdf_height.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_get_synced_height.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_synced_height.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_synced_height.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_get_synced_vdf_height.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_synced_vdf_height.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_synced_vdf_height.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_get_vdf_peak.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_vdf_peak.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_vdf_peak.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_get_block.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_block.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_block.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_get_block_at.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_block_at.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_block_at.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_get_header.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_header.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_header.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_get_header_at.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_header_at.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_header_at.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 12: {\n\t\t\tconst auto _iter = vnx_queue_get_block_hash.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_block_hash.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_block_hash.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 13: {\n\t\t\tconst auto _iter = vnx_queue_get_block_hash_ex.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_block_hash_ex.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_block_hash_ex.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 14: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_height.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_tx_height.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_tx_height.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 15: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_tx_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_tx_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 16: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_info_for.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_tx_info_for.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_tx_info_for.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 17: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_ids.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_tx_ids.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_tx_ids.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 18: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_ids_at.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_tx_ids_at.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_tx_ids_at.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 19: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_ids_since.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_tx_ids_since.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_tx_ids_since.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 20: {\n\t\t\tconst auto _iter = vnx_queue_validate.find(_request_id);\n\t\t\tif(_iter != vnx_queue_validate.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_validate.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 21: {\n\t\t\tconst auto _iter = vnx_queue_add_block.find(_request_id);\n\t\t\tif(_iter != vnx_queue_add_block.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_add_block.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 22: {\n\t\t\tconst auto _iter = vnx_queue_add_transaction.find(_request_id);\n\t\t\tif(_iter != vnx_queue_add_transaction.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_add_transaction.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 23: {\n\t\t\tconst auto _iter = vnx_queue_get_contract.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_contract.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_contract.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 24: {\n\t\t\tconst auto _iter = vnx_queue_get_contract_for.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_contract_for.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_contract_for.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 25: {\n\t\t\tconst auto _iter = vnx_queue_get_contracts.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_contracts.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_contracts.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 26: {\n\t\t\tconst auto _iter = vnx_queue_get_contracts_by.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_contracts_by.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_contracts_by.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 27: {\n\t\t\tconst auto _iter = vnx_queue_get_contracts_owned_by.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_contracts_owned_by.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_contracts_owned_by.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 28: {\n\t\t\tconst auto _iter = vnx_queue_get_transaction.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_transaction.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_transaction.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 29: {\n\t\t\tconst auto _iter = vnx_queue_get_transactions.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_transactions.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_transactions.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 30: {\n\t\t\tconst auto _iter = vnx_queue_get_history.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_history.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_history.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 31: {\n\t\t\tconst auto _iter = vnx_queue_get_history_memo.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_history_memo.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_history_memo.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 32: {\n\t\t\tconst auto _iter = vnx_queue_get_balance.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_balance.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_balance.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 33: {\n\t\t\tconst auto _iter = vnx_queue_get_balances.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_balances.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_balances.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 34: {\n\t\t\tconst auto _iter = vnx_queue_get_contract_balances.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_contract_balances.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_contract_balances.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 35: {\n\t\t\tconst auto _iter = vnx_queue_get_total_balance.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_total_balance.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_total_balance.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 36: {\n\t\t\tconst auto _iter = vnx_queue_get_total_balances.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_total_balances.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_total_balances.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 37: {\n\t\t\tconst auto _iter = vnx_queue_get_all_balances.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_all_balances.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_all_balances.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 38: {\n\t\t\tconst auto _iter = vnx_queue_get_exec_history.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_exec_history.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_exec_history.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 39: {\n\t\t\tconst auto _iter = vnx_queue_read_storage.find(_request_id);\n\t\t\tif(_iter != vnx_queue_read_storage.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_read_storage.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 40: {\n\t\t\tconst auto _iter = vnx_queue_dump_storage.find(_request_id);\n\t\t\tif(_iter != vnx_queue_dump_storage.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_dump_storage.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 41: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_var.find(_request_id);\n\t\t\tif(_iter != vnx_queue_read_storage_var.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_read_storage_var.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 42: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_entry_var.find(_request_id);\n\t\t\tif(_iter != vnx_queue_read_storage_entry_var.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_read_storage_entry_var.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 43: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_field.find(_request_id);\n\t\t\tif(_iter != vnx_queue_read_storage_field.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_read_storage_field.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 44: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_entry_addr.find(_request_id);\n\t\t\tif(_iter != vnx_queue_read_storage_entry_addr.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_read_storage_entry_addr.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 45: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_entry_string.find(_request_id);\n\t\t\tif(_iter != vnx_queue_read_storage_entry_string.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_read_storage_entry_string.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 46: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_array.find(_request_id);\n\t\t\tif(_iter != vnx_queue_read_storage_array.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_read_storage_array.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 47: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_map.find(_request_id);\n\t\t\tif(_iter != vnx_queue_read_storage_map.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_read_storage_map.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 48: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_read_storage_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_read_storage_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 49: {\n\t\t\tconst auto _iter = vnx_queue_call_contract.find(_request_id);\n\t\t\tif(_iter != vnx_queue_call_contract.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_call_contract.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 50: {\n\t\t\tconst auto _iter = vnx_queue_get_plot_nft_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_plot_nft_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_plot_nft_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 51: {\n\t\t\tconst auto _iter = vnx_queue_get_plot_nft_target.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_plot_nft_target.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_plot_nft_target.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 52: {\n\t\t\tconst auto _iter = vnx_queue_get_offer.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_offer.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_offer.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 53: {\n\t\t\tconst auto _iter = vnx_queue_get_offers.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_offers.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_offers.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 54: {\n\t\t\tconst auto _iter = vnx_queue_get_offers_by.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_offers_by.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_offers_by.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 55: {\n\t\t\tconst auto _iter = vnx_queue_fetch_offers.find(_request_id);\n\t\t\tif(_iter != vnx_queue_fetch_offers.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_fetch_offers.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 56: {\n\t\t\tconst auto _iter = vnx_queue_get_recent_offers.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_recent_offers.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_recent_offers.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 57: {\n\t\t\tconst auto _iter = vnx_queue_get_recent_offers_for.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_recent_offers_for.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_recent_offers_for.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 58: {\n\t\t\tconst auto _iter = vnx_queue_get_trade_history.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_trade_history.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_trade_history.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 59: {\n\t\t\tconst auto _iter = vnx_queue_get_trade_history_for.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_trade_history_for.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_trade_history_for.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 60: {\n\t\t\tconst auto _iter = vnx_queue_get_swaps.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_swaps.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_swaps.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 61: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_swap_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_swap_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 62: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_user_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_swap_user_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_swap_user_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 63: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_history.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_swap_history.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_swap_history.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 64: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_trade_estimate.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_swap_trade_estimate.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_swap_trade_estimate.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 65: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_fees_earned.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_swap_fees_earned.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_swap_fees_earned.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 66: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_equivalent_liquidity.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_swap_equivalent_liquidity.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_swap_equivalent_liquidity.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 67: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_liquidity_by.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_swap_liquidity_by.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_swap_liquidity_by.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 68: {\n\t\t\tconst auto _iter = vnx_queue_get_total_supply.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_total_supply.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_total_supply.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 69: {\n\t\t\tconst auto _iter = vnx_queue_get_farmed_blocks.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_farmed_blocks.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_farmed_blocks.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 70: {\n\t\t\tconst auto _iter = vnx_queue_get_farmed_block_summary.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_farmed_block_summary.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_farmed_block_summary.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 71: {\n\t\t\tconst auto _iter = vnx_queue_get_farmer_ranking.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_farmer_ranking.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_farmer_ranking.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 72: {\n\t\t\tconst auto _iter = vnx_queue_verify_plot_nft_target.find(_request_id);\n\t\t\tif(_iter != vnx_queue_verify_plot_nft_target.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_verify_plot_nft_target.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 73: {\n\t\t\tconst auto _iter = vnx_queue_verify_partial.find(_request_id);\n\t\t\tif(_iter != vnx_queue_verify_partial.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_verify_partial.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 74: {\n\t\t\tconst auto _iter = vnx_queue_start_sync.find(_request_id);\n\t\t\tif(_iter != vnx_queue_start_sync.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_start_sync.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 75: {\n\t\t\tconst auto _iter = vnx_queue_revert_sync.find(_request_id);\n\t\t\tif(_iter != vnx_queue_revert_sync.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_revert_sync.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 76: {\n\t\t\tconst auto _iter = vnx_queue_http_request.find(_request_id);\n\t\t\tif(_iter != vnx_queue_http_request.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_http_request.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 77: {\n\t\t\tconst auto _iter = vnx_queue_http_request_chunk.find(_request_id);\n\t\t\tif(_iter != vnx_queue_http_request_chunk.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_http_request_chunk.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 78: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 79: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 80: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 81: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 82: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 83: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 84: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_restart.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 85: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_stop.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 86: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_self_test.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn _index;\n}\n\nint32_t NodeAsyncClient::vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\tthrow std::runtime_error(\"NodeAsyncClient: received unknown return\");\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_get_params.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_params.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_params.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_params_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::ChainParams>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_get_network_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_network_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_network_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_network_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::NetworkInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_get_genesis_hash.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_genesis_hash.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_genesis_hash.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_genesis_hash_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::hash_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_get_height.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_height.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_height.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_height_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<uint32_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_get_vdf_height.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_vdf_height.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_vdf_height.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_vdf_height_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<uint32_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_get_synced_height.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_synced_height.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_synced_height.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_synced_height_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::optional<uint32_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_get_synced_vdf_height.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_synced_vdf_height.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_synced_vdf_height.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_synced_vdf_height_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::optional<uint32_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_get_vdf_peak.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_vdf_peak.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_vdf_peak.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_vdf_peak_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::hash_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_get_block.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_block.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_block.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_block_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Block>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_get_block_at.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_block_at.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_block_at.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_block_at_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Block>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_get_header.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_header.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_header.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_header_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::BlockHeader>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_get_header_at.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_header_at.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_header_at.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_header_at_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::BlockHeader>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 12: {\n\t\t\tconst auto _iter = vnx_queue_get_block_hash.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_block_hash.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_block_hash.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_block_hash_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::optional<::mmx::hash_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 13: {\n\t\t\tconst auto _iter = vnx_queue_get_block_hash_ex.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_block_hash_ex.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_block_hash_ex.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_block_hash_ex_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::optional<std::pair<::mmx::hash_t, ::mmx::hash_t>>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 14: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_height.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_tx_height.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_tx_height.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_height_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::optional<uint32_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 15: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_tx_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_tx_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::optional<::mmx::tx_info_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 16: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_info_for.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_tx_info_for.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_tx_info_for.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_info_for_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::optional<::mmx::tx_info_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 17: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_ids.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_tx_ids.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_tx_ids.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_ids_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::hash_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 18: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_ids_at.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_tx_ids_at.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_tx_ids_at.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_ids_at_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::hash_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 19: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_ids_since.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_tx_ids_since.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_tx_ids_since.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_ids_since_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::hash_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 20: {\n\t\t\tconst auto _iter = vnx_queue_validate.find(_request_id);\n\t\t\tif(_iter == vnx_queue_validate.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_validate.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_validate_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::exec_result_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 21: {\n\t\t\tconst auto _iter = vnx_queue_add_block.find(_request_id);\n\t\t\tif(_iter == vnx_queue_add_block.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_add_block.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 22: {\n\t\t\tconst auto _iter = vnx_queue_add_transaction.find(_request_id);\n\t\t\tif(_iter == vnx_queue_add_transaction.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_add_transaction.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 23: {\n\t\t\tconst auto _iter = vnx_queue_get_contract.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_contract.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_contract.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contract_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Contract>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 24: {\n\t\t\tconst auto _iter = vnx_queue_get_contract_for.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_contract_for.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_contract_for.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contract_for_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Contract>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 25: {\n\t\t\tconst auto _iter = vnx_queue_get_contracts.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_contracts.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_contracts.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contracts_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<std::shared_ptr<const ::mmx::Contract>>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 26: {\n\t\t\tconst auto _iter = vnx_queue_get_contracts_by.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_contracts_by.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_contracts_by.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contracts_by_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::addr_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 27: {\n\t\t\tconst auto _iter = vnx_queue_get_contracts_owned_by.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_contracts_owned_by.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_contracts_owned_by.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contracts_owned_by_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::addr_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 28: {\n\t\t\tconst auto _iter = vnx_queue_get_transaction.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_transaction.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_transaction.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_transaction_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 29: {\n\t\t\tconst auto _iter = vnx_queue_get_transactions.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_transactions.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_transactions.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_transactions_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<std::shared_ptr<const ::mmx::Transaction>>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 30: {\n\t\t\tconst auto _iter = vnx_queue_get_history.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_history.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_history.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_history_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::tx_entry_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 31: {\n\t\t\tconst auto _iter = vnx_queue_get_history_memo.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_history_memo.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_history_memo.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_history_memo_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::tx_entry_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 32: {\n\t\t\tconst auto _iter = vnx_queue_get_balance.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_balance.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_balance.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_balance_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::uint128>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 33: {\n\t\t\tconst auto _iter = vnx_queue_get_balances.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_balances.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_balances.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_balances_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::uint128>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 34: {\n\t\t\tconst auto _iter = vnx_queue_get_contract_balances.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_contract_balances.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_contract_balances.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contract_balances_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::balance_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 35: {\n\t\t\tconst auto _iter = vnx_queue_get_total_balance.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_total_balance.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_total_balance.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_total_balance_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::uint128>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 36: {\n\t\t\tconst auto _iter = vnx_queue_get_total_balances.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_total_balances.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_total_balances.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_total_balances_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::uint128>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 37: {\n\t\t\tconst auto _iter = vnx_queue_get_all_balances.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_all_balances.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_all_balances.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_all_balances_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 38: {\n\t\t\tconst auto _iter = vnx_queue_get_exec_history.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_exec_history.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_exec_history.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_exec_history_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::exec_entry_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 39: {\n\t\t\tconst auto _iter = vnx_queue_read_storage.find(_request_id);\n\t\t\tif(_iter == vnx_queue_read_storage.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_read_storage.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<std::string, ::mmx::vm::varptr_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 40: {\n\t\t\tconst auto _iter = vnx_queue_dump_storage.find(_request_id);\n\t\t\tif(_iter == vnx_queue_dump_storage.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_dump_storage.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_dump_storage_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<uint64_t, ::mmx::vm::varptr_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 41: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_var.find(_request_id);\n\t\t\tif(_iter == vnx_queue_read_storage_var.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_read_storage_var.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_var_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::vm::varptr_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 42: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_entry_var.find(_request_id);\n\t\t\tif(_iter == vnx_queue_read_storage_entry_var.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_read_storage_entry_var.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_entry_var_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::vm::varptr_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 43: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_field.find(_request_id);\n\t\t\tif(_iter == vnx_queue_read_storage_field.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_read_storage_field.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_field_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::pair<::mmx::vm::varptr_t, uint64_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 44: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_entry_addr.find(_request_id);\n\t\t\tif(_iter == vnx_queue_read_storage_entry_addr.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_read_storage_entry_addr.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_entry_addr_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 45: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_entry_string.find(_request_id);\n\t\t\tif(_iter == vnx_queue_read_storage_entry_string.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_read_storage_entry_string.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_entry_string_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 46: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_array.find(_request_id);\n\t\t\tif(_iter == vnx_queue_read_storage_array.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_read_storage_array.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_array_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::vm::varptr_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 47: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_map.find(_request_id);\n\t\t\tif(_iter == vnx_queue_read_storage_map.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_read_storage_map.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_map_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::vm::varptr_t, ::mmx::vm::varptr_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 48: {\n\t\t\tconst auto _iter = vnx_queue_read_storage_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_read_storage_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_read_storage_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_object_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<std::string, ::mmx::vm::varptr_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 49: {\n\t\t\tconst auto _iter = vnx_queue_call_contract.find(_request_id);\n\t\t\tif(_iter == vnx_queue_call_contract.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_call_contract.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_call_contract_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Variant>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 50: {\n\t\t\tconst auto _iter = vnx_queue_get_plot_nft_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_plot_nft_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_plot_nft_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_plot_nft_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::optional<::mmx::plot_nft_info_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 51: {\n\t\t\tconst auto _iter = vnx_queue_get_plot_nft_target.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_plot_nft_target.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_plot_nft_target.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_plot_nft_target_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::addr_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 52: {\n\t\t\tconst auto _iter = vnx_queue_get_offer.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_offer.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_offer.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_offer_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::offer_data_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 53: {\n\t\t\tconst auto _iter = vnx_queue_get_offers.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_offers.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_offers.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_offers_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 54: {\n\t\t\tconst auto _iter = vnx_queue_get_offers_by.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_offers_by.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_offers_by.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_offers_by_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 55: {\n\t\t\tconst auto _iter = vnx_queue_fetch_offers.find(_request_id);\n\t\t\tif(_iter == vnx_queue_fetch_offers.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_fetch_offers.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_fetch_offers_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 56: {\n\t\t\tconst auto _iter = vnx_queue_get_recent_offers.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_recent_offers.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_recent_offers.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_recent_offers_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 57: {\n\t\t\tconst auto _iter = vnx_queue_get_recent_offers_for.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_recent_offers_for.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_recent_offers_for.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_recent_offers_for_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 58: {\n\t\t\tconst auto _iter = vnx_queue_get_trade_history.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_trade_history.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_trade_history.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_trade_history_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::trade_entry_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 59: {\n\t\t\tconst auto _iter = vnx_queue_get_trade_history_for.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_trade_history_for.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_trade_history_for.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_trade_history_for_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::trade_entry_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 60: {\n\t\t\tconst auto _iter = vnx_queue_get_swaps.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_swaps.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_swaps.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swaps_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::swap_info_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 61: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_swap_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_swap_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::swap_info_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 62: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_user_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_swap_user_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_swap_user_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_user_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::swap_user_info_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 63: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_history.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_swap_history.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_swap_history.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_history_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::swap_entry_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 64: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_trade_estimate.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_swap_trade_estimate.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_swap_trade_estimate.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_trade_estimate_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::array<::mmx::uint128, 2>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 65: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_fees_earned.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_swap_fees_earned.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_swap_fees_earned.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_fees_earned_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::array<::mmx::uint128, 2>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 66: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_equivalent_liquidity.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_swap_equivalent_liquidity.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_swap_equivalent_liquidity.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_equivalent_liquidity_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::array<::mmx::uint128, 2>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 67: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_liquidity_by.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_swap_liquidity_by.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_swap_liquidity_by.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_liquidity_by_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 68: {\n\t\t\tconst auto _iter = vnx_queue_get_total_supply.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_total_supply.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_total_supply.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_total_supply_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::uint128>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 69: {\n\t\t\tconst auto _iter = vnx_queue_get_farmed_blocks.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_farmed_blocks.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_farmed_blocks.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_farmed_blocks_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<std::shared_ptr<const ::mmx::BlockHeader>>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 70: {\n\t\t\tconst auto _iter = vnx_queue_get_farmed_block_summary.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_farmed_block_summary.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_farmed_block_summary.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_farmed_block_summary_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::farmed_block_summary_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 71: {\n\t\t\tconst auto _iter = vnx_queue_get_farmer_ranking.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_farmer_ranking.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_farmer_ranking.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_farmer_ranking_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<std::pair<::mmx::pubkey_t, uint32_t>>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 72: {\n\t\t\tconst auto _iter = vnx_queue_verify_plot_nft_target.find(_request_id);\n\t\t\tif(_iter == vnx_queue_verify_plot_nft_target.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_verify_plot_nft_target.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_verify_plot_nft_target_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::tuple<::mmx::pooling_error_e, std::string>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 73: {\n\t\t\tconst auto _iter = vnx_queue_verify_partial.find(_request_id);\n\t\t\tif(_iter == vnx_queue_verify_partial.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_verify_partial.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_verify_partial_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::tuple<::mmx::pooling_error_e, std::string>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 74: {\n\t\t\tconst auto _iter = vnx_queue_start_sync.find(_request_id);\n\t\t\tif(_iter == vnx_queue_start_sync.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_start_sync.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 75: {\n\t\t\tconst auto _iter = vnx_queue_revert_sync.find(_request_id);\n\t\t\tif(_iter == vnx_queue_revert_sync.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_revert_sync.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 76: {\n\t\t\tconst auto _iter = vnx_queue_http_request.find(_request_id);\n\t\t\tif(_iter == vnx_queue_http_request.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_http_request.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpResponse>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 77: {\n\t\t\tconst auto _iter = vnx_queue_http_request_chunk.find(_request_id);\n\t\t\tif(_iter == vnx_queue_http_request_chunk.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_http_request_chunk.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpData>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 78: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Object>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 79: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Variant>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 80: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 81: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 82: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::TypeCode>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 83: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 84: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_restart.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 85: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_stop.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 86: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_self_test.end()) {\n\t\t\t\tthrow std::runtime_error(\"NodeAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::bool_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif(_index >= 0) {\n\t\t\t\tthrow std::logic_error(\"NodeAsyncClient: invalid callback index\");\n\t\t\t}\n\t}\n\treturn _index;\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/NodeBase.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/NodeBase.hxx>\n#include <vnx/NoSuchMethod.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/NetworkInfo.hxx>\n#include <mmx/Node_add_block.hxx>\n#include <mmx/Node_add_block_return.hxx>\n#include <mmx/Node_add_transaction.hxx>\n#include <mmx/Node_add_transaction_return.hxx>\n#include <mmx/Node_call_contract.hxx>\n#include <mmx/Node_call_contract_return.hxx>\n#include <mmx/Node_dump_storage.hxx>\n#include <mmx/Node_dump_storage_return.hxx>\n#include <mmx/Node_fetch_offers.hxx>\n#include <mmx/Node_fetch_offers_return.hxx>\n#include <mmx/Node_get_all_balances.hxx>\n#include <mmx/Node_get_all_balances_return.hxx>\n#include <mmx/Node_get_balance.hxx>\n#include <mmx/Node_get_balance_return.hxx>\n#include <mmx/Node_get_balances.hxx>\n#include <mmx/Node_get_balances_return.hxx>\n#include <mmx/Node_get_block.hxx>\n#include <mmx/Node_get_block_return.hxx>\n#include <mmx/Node_get_block_at.hxx>\n#include <mmx/Node_get_block_at_return.hxx>\n#include <mmx/Node_get_block_hash.hxx>\n#include <mmx/Node_get_block_hash_return.hxx>\n#include <mmx/Node_get_block_hash_ex.hxx>\n#include <mmx/Node_get_block_hash_ex_return.hxx>\n#include <mmx/Node_get_contract.hxx>\n#include <mmx/Node_get_contract_return.hxx>\n#include <mmx/Node_get_contract_balances.hxx>\n#include <mmx/Node_get_contract_balances_return.hxx>\n#include <mmx/Node_get_contract_for.hxx>\n#include <mmx/Node_get_contract_for_return.hxx>\n#include <mmx/Node_get_contracts.hxx>\n#include <mmx/Node_get_contracts_return.hxx>\n#include <mmx/Node_get_contracts_by.hxx>\n#include <mmx/Node_get_contracts_by_return.hxx>\n#include <mmx/Node_get_contracts_owned_by.hxx>\n#include <mmx/Node_get_contracts_owned_by_return.hxx>\n#include <mmx/Node_get_exec_history.hxx>\n#include <mmx/Node_get_exec_history_return.hxx>\n#include <mmx/Node_get_farmed_block_summary.hxx>\n#include <mmx/Node_get_farmed_block_summary_return.hxx>\n#include <mmx/Node_get_farmed_blocks.hxx>\n#include <mmx/Node_get_farmed_blocks_return.hxx>\n#include <mmx/Node_get_farmer_ranking.hxx>\n#include <mmx/Node_get_farmer_ranking_return.hxx>\n#include <mmx/Node_get_genesis_hash.hxx>\n#include <mmx/Node_get_genesis_hash_return.hxx>\n#include <mmx/Node_get_header.hxx>\n#include <mmx/Node_get_header_return.hxx>\n#include <mmx/Node_get_header_at.hxx>\n#include <mmx/Node_get_header_at_return.hxx>\n#include <mmx/Node_get_height.hxx>\n#include <mmx/Node_get_height_return.hxx>\n#include <mmx/Node_get_history.hxx>\n#include <mmx/Node_get_history_return.hxx>\n#include <mmx/Node_get_history_memo.hxx>\n#include <mmx/Node_get_history_memo_return.hxx>\n#include <mmx/Node_get_network_info.hxx>\n#include <mmx/Node_get_network_info_return.hxx>\n#include <mmx/Node_get_offer.hxx>\n#include <mmx/Node_get_offer_return.hxx>\n#include <mmx/Node_get_offers.hxx>\n#include <mmx/Node_get_offers_return.hxx>\n#include <mmx/Node_get_offers_by.hxx>\n#include <mmx/Node_get_offers_by_return.hxx>\n#include <mmx/Node_get_params.hxx>\n#include <mmx/Node_get_params_return.hxx>\n#include <mmx/Node_get_plot_nft_info.hxx>\n#include <mmx/Node_get_plot_nft_info_return.hxx>\n#include <mmx/Node_get_plot_nft_target.hxx>\n#include <mmx/Node_get_plot_nft_target_return.hxx>\n#include <mmx/Node_get_recent_offers.hxx>\n#include <mmx/Node_get_recent_offers_return.hxx>\n#include <mmx/Node_get_recent_offers_for.hxx>\n#include <mmx/Node_get_recent_offers_for_return.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity_return.hxx>\n#include <mmx/Node_get_swap_fees_earned.hxx>\n#include <mmx/Node_get_swap_fees_earned_return.hxx>\n#include <mmx/Node_get_swap_history.hxx>\n#include <mmx/Node_get_swap_history_return.hxx>\n#include <mmx/Node_get_swap_info.hxx>\n#include <mmx/Node_get_swap_info_return.hxx>\n#include <mmx/Node_get_swap_liquidity_by.hxx>\n#include <mmx/Node_get_swap_liquidity_by_return.hxx>\n#include <mmx/Node_get_swap_trade_estimate.hxx>\n#include <mmx/Node_get_swap_trade_estimate_return.hxx>\n#include <mmx/Node_get_swap_user_info.hxx>\n#include <mmx/Node_get_swap_user_info_return.hxx>\n#include <mmx/Node_get_swaps.hxx>\n#include <mmx/Node_get_swaps_return.hxx>\n#include <mmx/Node_get_synced_height.hxx>\n#include <mmx/Node_get_synced_height_return.hxx>\n#include <mmx/Node_get_synced_vdf_height.hxx>\n#include <mmx/Node_get_synced_vdf_height_return.hxx>\n#include <mmx/Node_get_total_balance.hxx>\n#include <mmx/Node_get_total_balance_return.hxx>\n#include <mmx/Node_get_total_balances.hxx>\n#include <mmx/Node_get_total_balances_return.hxx>\n#include <mmx/Node_get_total_supply.hxx>\n#include <mmx/Node_get_total_supply_return.hxx>\n#include <mmx/Node_get_trade_history.hxx>\n#include <mmx/Node_get_trade_history_return.hxx>\n#include <mmx/Node_get_trade_history_for.hxx>\n#include <mmx/Node_get_trade_history_for_return.hxx>\n#include <mmx/Node_get_transaction.hxx>\n#include <mmx/Node_get_transaction_return.hxx>\n#include <mmx/Node_get_transactions.hxx>\n#include <mmx/Node_get_transactions_return.hxx>\n#include <mmx/Node_get_tx_height.hxx>\n#include <mmx/Node_get_tx_height_return.hxx>\n#include <mmx/Node_get_tx_ids.hxx>\n#include <mmx/Node_get_tx_ids_return.hxx>\n#include <mmx/Node_get_tx_ids_at.hxx>\n#include <mmx/Node_get_tx_ids_at_return.hxx>\n#include <mmx/Node_get_tx_ids_since.hxx>\n#include <mmx/Node_get_tx_ids_since_return.hxx>\n#include <mmx/Node_get_tx_info.hxx>\n#include <mmx/Node_get_tx_info_return.hxx>\n#include <mmx/Node_get_tx_info_for.hxx>\n#include <mmx/Node_get_tx_info_for_return.hxx>\n#include <mmx/Node_get_vdf_height.hxx>\n#include <mmx/Node_get_vdf_height_return.hxx>\n#include <mmx/Node_get_vdf_peak.hxx>\n#include <mmx/Node_get_vdf_peak_return.hxx>\n#include <mmx/Node_read_storage.hxx>\n#include <mmx/Node_read_storage_return.hxx>\n#include <mmx/Node_read_storage_array.hxx>\n#include <mmx/Node_read_storage_array_return.hxx>\n#include <mmx/Node_read_storage_entry_addr.hxx>\n#include <mmx/Node_read_storage_entry_addr_return.hxx>\n#include <mmx/Node_read_storage_entry_string.hxx>\n#include <mmx/Node_read_storage_entry_string_return.hxx>\n#include <mmx/Node_read_storage_entry_var.hxx>\n#include <mmx/Node_read_storage_entry_var_return.hxx>\n#include <mmx/Node_read_storage_field.hxx>\n#include <mmx/Node_read_storage_field_return.hxx>\n#include <mmx/Node_read_storage_map.hxx>\n#include <mmx/Node_read_storage_map_return.hxx>\n#include <mmx/Node_read_storage_object.hxx>\n#include <mmx/Node_read_storage_object_return.hxx>\n#include <mmx/Node_read_storage_var.hxx>\n#include <mmx/Node_read_storage_var_return.hxx>\n#include <mmx/Node_revert_sync.hxx>\n#include <mmx/Node_revert_sync_return.hxx>\n#include <mmx/Node_start_sync.hxx>\n#include <mmx/Node_start_sync_return.hxx>\n#include <mmx/Node_validate.hxx>\n#include <mmx/Node_validate_return.hxx>\n#include <mmx/Node_verify_partial.hxx>\n#include <mmx/Node_verify_partial_return.hxx>\n#include <mmx/Node_verify_plot_nft_target.hxx>\n#include <mmx/Node_verify_plot_nft_target_return.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/exec_entry_t.hxx>\n#include <mmx/exec_result_t.hxx>\n#include <mmx/farmed_block_summary_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/plot_nft_info_t.hxx>\n#include <mmx/pooling_error_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/swap_entry_t.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <mmx/swap_user_info_t.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <mmx/uint128.hpp>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 NodeBase::VNX_TYPE_HASH(0x289d7651582d76a3ull);\nconst vnx::Hash64 NodeBase::VNX_CODE_HASH(0xda70f535dbe8e2eaull);\n\nNodeBase::NodeBase(const std::string& _vnx_name)\n\t:\tModule::Module(_vnx_name)\n{\n\tvnx::read_config(vnx_name + \".input_vdfs\", input_vdfs);\n\tvnx::read_config(vnx_name + \".input_votes\", input_votes);\n\tvnx::read_config(vnx_name + \".input_proof\", input_proof);\n\tvnx::read_config(vnx_name + \".input_blocks\", input_blocks);\n\tvnx::read_config(vnx_name + \".input_transactions\", input_transactions);\n\tvnx::read_config(vnx_name + \".input_timelord_vdfs\", input_timelord_vdfs);\n\tvnx::read_config(vnx_name + \".input_harvester_proof\", input_harvester_proof);\n\tvnx::read_config(vnx_name + \".input_vdf_points\", input_vdf_points);\n\tvnx::read_config(vnx_name + \".output_verified_vdfs\", output_verified_vdfs);\n\tvnx::read_config(vnx_name + \".output_verified_votes\", output_verified_votes);\n\tvnx::read_config(vnx_name + \".output_verified_proof\", output_verified_proof);\n\tvnx::read_config(vnx_name + \".output_verified_blocks\", output_verified_blocks);\n\tvnx::read_config(vnx_name + \".output_verified_transactions\", output_verified_transactions);\n\tvnx::read_config(vnx_name + \".output_committed_blocks\", output_committed_blocks);\n\tvnx::read_config(vnx_name + \".output_transactions\", output_transactions);\n\tvnx::read_config(vnx_name + \".output_interval_request\", output_interval_request);\n\tvnx::read_config(vnx_name + \".output_challenges\", output_challenges);\n\tvnx::read_config(vnx_name + \".output_vdf_points\", output_vdf_points);\n\tvnx::read_config(vnx_name + \".output_votes\", output_votes);\n\tvnx::read_config(vnx_name + \".max_queue_ms\", max_queue_ms);\n\tvnx::read_config(vnx_name + \".update_interval_ms\", update_interval_ms);\n\tvnx::read_config(vnx_name + \".validate_interval_ms\", validate_interval_ms);\n\tvnx::read_config(vnx_name + \".sync_loss_delay\", sync_loss_delay);\n\tvnx::read_config(vnx_name + \".max_history\", max_history);\n\tvnx::read_config(vnx_name + \".max_tx_pool\", max_tx_pool);\n\tvnx::read_config(vnx_name + \".max_tx_queue\", max_tx_queue);\n\tvnx::read_config(vnx_name + \".max_sync_jobs\", max_sync_jobs);\n\tvnx::read_config(vnx_name + \".max_sync_ahead\", max_sync_ahead);\n\tvnx::read_config(vnx_name + \".num_sync_retries\", num_sync_retries);\n\tvnx::read_config(vnx_name + \".revert_height\", revert_height);\n\tvnx::read_config(vnx_name + \".num_threads\", num_threads);\n\tvnx::read_config(vnx_name + \".num_db_threads\", num_db_threads);\n\tvnx::read_config(vnx_name + \".num_api_threads\", num_api_threads);\n\tvnx::read_config(vnx_name + \".commit_threshold\", commit_threshold);\n\tvnx::read_config(vnx_name + \".max_future_sync\", max_future_sync);\n\tvnx::read_config(vnx_name + \".max_vdf_verify_pending\", max_vdf_verify_pending);\n\tvnx::read_config(vnx_name + \".opencl_device\", opencl_device);\n\tvnx::read_config(vnx_name + \".opencl_device_name\", opencl_device_name);\n\tvnx::read_config(vnx_name + \".do_sync\", do_sync);\n\tvnx::read_config(vnx_name + \".show_warnings\", show_warnings);\n\tvnx::read_config(vnx_name + \".vdf_slave_mode\", vdf_slave_mode);\n\tvnx::read_config(vnx_name + \".run_tests\", run_tests);\n\tvnx::read_config(vnx_name + \".exec_debug\", exec_debug);\n\tvnx::read_config(vnx_name + \".exec_profile\", exec_profile);\n\tvnx::read_config(vnx_name + \".exec_trace\", exec_trace);\n\tvnx::read_config(vnx_name + \".storage_path\", storage_path);\n\tvnx::read_config(vnx_name + \".database_path\", database_path);\n\tvnx::read_config(vnx_name + \".router_name\", router_name);\n\tvnx::read_config(vnx_name + \".mmx_usd_swap_addr\", mmx_usd_swap_addr);\n\tvnx::read_config(vnx_name + \".metalsdev_api_key\", metalsdev_api_key);\n}\n\nvnx::Hash64 NodeBase::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string NodeBase::get_type_name() const {\n\treturn \"mmx.Node\";\n}\n\nconst vnx::TypeCode* NodeBase::get_type_code() const {\n\treturn mmx::vnx_native_type_code_NodeBase;\n}\n\nvoid NodeBase::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_NodeBase;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, input_vdfs);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, input_votes);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, input_proof);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, input_blocks);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, input_transactions);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, input_timelord_vdfs);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, input_harvester_proof);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, input_vdf_points);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, output_verified_vdfs);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, output_verified_votes);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, output_verified_proof);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, output_verified_blocks);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, output_verified_transactions);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, output_committed_blocks);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, output_transactions);\n\t_visitor.type_field(_type_code->fields[15], 15); vnx::accept(_visitor, output_interval_request);\n\t_visitor.type_field(_type_code->fields[16], 16); vnx::accept(_visitor, output_challenges);\n\t_visitor.type_field(_type_code->fields[17], 17); vnx::accept(_visitor, output_vdf_points);\n\t_visitor.type_field(_type_code->fields[18], 18); vnx::accept(_visitor, output_votes);\n\t_visitor.type_field(_type_code->fields[19], 19); vnx::accept(_visitor, max_queue_ms);\n\t_visitor.type_field(_type_code->fields[20], 20); vnx::accept(_visitor, update_interval_ms);\n\t_visitor.type_field(_type_code->fields[21], 21); vnx::accept(_visitor, validate_interval_ms);\n\t_visitor.type_field(_type_code->fields[22], 22); vnx::accept(_visitor, sync_loss_delay);\n\t_visitor.type_field(_type_code->fields[23], 23); vnx::accept(_visitor, max_history);\n\t_visitor.type_field(_type_code->fields[24], 24); vnx::accept(_visitor, max_tx_pool);\n\t_visitor.type_field(_type_code->fields[25], 25); vnx::accept(_visitor, max_tx_queue);\n\t_visitor.type_field(_type_code->fields[26], 26); vnx::accept(_visitor, max_sync_jobs);\n\t_visitor.type_field(_type_code->fields[27], 27); vnx::accept(_visitor, max_sync_ahead);\n\t_visitor.type_field(_type_code->fields[28], 28); vnx::accept(_visitor, num_sync_retries);\n\t_visitor.type_field(_type_code->fields[29], 29); vnx::accept(_visitor, revert_height);\n\t_visitor.type_field(_type_code->fields[30], 30); vnx::accept(_visitor, num_threads);\n\t_visitor.type_field(_type_code->fields[31], 31); vnx::accept(_visitor, num_db_threads);\n\t_visitor.type_field(_type_code->fields[32], 32); vnx::accept(_visitor, num_api_threads);\n\t_visitor.type_field(_type_code->fields[33], 33); vnx::accept(_visitor, commit_threshold);\n\t_visitor.type_field(_type_code->fields[34], 34); vnx::accept(_visitor, max_future_sync);\n\t_visitor.type_field(_type_code->fields[35], 35); vnx::accept(_visitor, max_vdf_verify_pending);\n\t_visitor.type_field(_type_code->fields[36], 36); vnx::accept(_visitor, opencl_device);\n\t_visitor.type_field(_type_code->fields[37], 37); vnx::accept(_visitor, opencl_device_name);\n\t_visitor.type_field(_type_code->fields[38], 38); vnx::accept(_visitor, do_sync);\n\t_visitor.type_field(_type_code->fields[39], 39); vnx::accept(_visitor, show_warnings);\n\t_visitor.type_field(_type_code->fields[40], 40); vnx::accept(_visitor, vdf_slave_mode);\n\t_visitor.type_field(_type_code->fields[41], 41); vnx::accept(_visitor, run_tests);\n\t_visitor.type_field(_type_code->fields[42], 42); vnx::accept(_visitor, exec_debug);\n\t_visitor.type_field(_type_code->fields[43], 43); vnx::accept(_visitor, exec_profile);\n\t_visitor.type_field(_type_code->fields[44], 44); vnx::accept(_visitor, exec_trace);\n\t_visitor.type_field(_type_code->fields[45], 45); vnx::accept(_visitor, storage_path);\n\t_visitor.type_field(_type_code->fields[46], 46); vnx::accept(_visitor, database_path);\n\t_visitor.type_field(_type_code->fields[47], 47); vnx::accept(_visitor, router_name);\n\t_visitor.type_field(_type_code->fields[48], 48); vnx::accept(_visitor, mmx_usd_swap_addr);\n\t_visitor.type_field(_type_code->fields[49], 49); vnx::accept(_visitor, metalsdev_api_key);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid NodeBase::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"input_vdfs\\\": \"; vnx::write(_out, input_vdfs);\n\t_out << \", \\\"input_votes\\\": \"; vnx::write(_out, input_votes);\n\t_out << \", \\\"input_proof\\\": \"; vnx::write(_out, input_proof);\n\t_out << \", \\\"input_blocks\\\": \"; vnx::write(_out, input_blocks);\n\t_out << \", \\\"input_transactions\\\": \"; vnx::write(_out, input_transactions);\n\t_out << \", \\\"input_timelord_vdfs\\\": \"; vnx::write(_out, input_timelord_vdfs);\n\t_out << \", \\\"input_harvester_proof\\\": \"; vnx::write(_out, input_harvester_proof);\n\t_out << \", \\\"input_vdf_points\\\": \"; vnx::write(_out, input_vdf_points);\n\t_out << \", \\\"output_verified_vdfs\\\": \"; vnx::write(_out, output_verified_vdfs);\n\t_out << \", \\\"output_verified_votes\\\": \"; vnx::write(_out, output_verified_votes);\n\t_out << \", \\\"output_verified_proof\\\": \"; vnx::write(_out, output_verified_proof);\n\t_out << \", \\\"output_verified_blocks\\\": \"; vnx::write(_out, output_verified_blocks);\n\t_out << \", \\\"output_verified_transactions\\\": \"; vnx::write(_out, output_verified_transactions);\n\t_out << \", \\\"output_committed_blocks\\\": \"; vnx::write(_out, output_committed_blocks);\n\t_out << \", \\\"output_transactions\\\": \"; vnx::write(_out, output_transactions);\n\t_out << \", \\\"output_interval_request\\\": \"; vnx::write(_out, output_interval_request);\n\t_out << \", \\\"output_challenges\\\": \"; vnx::write(_out, output_challenges);\n\t_out << \", \\\"output_vdf_points\\\": \"; vnx::write(_out, output_vdf_points);\n\t_out << \", \\\"output_votes\\\": \"; vnx::write(_out, output_votes);\n\t_out << \", \\\"max_queue_ms\\\": \"; vnx::write(_out, max_queue_ms);\n\t_out << \", \\\"update_interval_ms\\\": \"; vnx::write(_out, update_interval_ms);\n\t_out << \", \\\"validate_interval_ms\\\": \"; vnx::write(_out, validate_interval_ms);\n\t_out << \", \\\"sync_loss_delay\\\": \"; vnx::write(_out, sync_loss_delay);\n\t_out << \", \\\"max_history\\\": \"; vnx::write(_out, max_history);\n\t_out << \", \\\"max_tx_pool\\\": \"; vnx::write(_out, max_tx_pool);\n\t_out << \", \\\"max_tx_queue\\\": \"; vnx::write(_out, max_tx_queue);\n\t_out << \", \\\"max_sync_jobs\\\": \"; vnx::write(_out, max_sync_jobs);\n\t_out << \", \\\"max_sync_ahead\\\": \"; vnx::write(_out, max_sync_ahead);\n\t_out << \", \\\"num_sync_retries\\\": \"; vnx::write(_out, num_sync_retries);\n\t_out << \", \\\"revert_height\\\": \"; vnx::write(_out, revert_height);\n\t_out << \", \\\"num_threads\\\": \"; vnx::write(_out, num_threads);\n\t_out << \", \\\"num_db_threads\\\": \"; vnx::write(_out, num_db_threads);\n\t_out << \", \\\"num_api_threads\\\": \"; vnx::write(_out, num_api_threads);\n\t_out << \", \\\"commit_threshold\\\": \"; vnx::write(_out, commit_threshold);\n\t_out << \", \\\"max_future_sync\\\": \"; vnx::write(_out, max_future_sync);\n\t_out << \", \\\"max_vdf_verify_pending\\\": \"; vnx::write(_out, max_vdf_verify_pending);\n\t_out << \", \\\"opencl_device\\\": \"; vnx::write(_out, opencl_device);\n\t_out << \", \\\"opencl_device_name\\\": \"; vnx::write(_out, opencl_device_name);\n\t_out << \", \\\"do_sync\\\": \"; vnx::write(_out, do_sync);\n\t_out << \", \\\"show_warnings\\\": \"; vnx::write(_out, show_warnings);\n\t_out << \", \\\"vdf_slave_mode\\\": \"; vnx::write(_out, vdf_slave_mode);\n\t_out << \", \\\"run_tests\\\": \"; vnx::write(_out, run_tests);\n\t_out << \", \\\"exec_debug\\\": \"; vnx::write(_out, exec_debug);\n\t_out << \", \\\"exec_profile\\\": \"; vnx::write(_out, exec_profile);\n\t_out << \", \\\"exec_trace\\\": \"; vnx::write(_out, exec_trace);\n\t_out << \", \\\"storage_path\\\": \"; vnx::write(_out, storage_path);\n\t_out << \", \\\"database_path\\\": \"; vnx::write(_out, database_path);\n\t_out << \", \\\"router_name\\\": \"; vnx::write(_out, router_name);\n\t_out << \", \\\"mmx_usd_swap_addr\\\": \"; vnx::write(_out, mmx_usd_swap_addr);\n\t_out << \", \\\"metalsdev_api_key\\\": \"; vnx::write(_out, metalsdev_api_key);\n\t_out << \"}\";\n}\n\nvoid NodeBase::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object NodeBase::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node\";\n\t_object[\"input_vdfs\"] = input_vdfs;\n\t_object[\"input_votes\"] = input_votes;\n\t_object[\"input_proof\"] = input_proof;\n\t_object[\"input_blocks\"] = input_blocks;\n\t_object[\"input_transactions\"] = input_transactions;\n\t_object[\"input_timelord_vdfs\"] = input_timelord_vdfs;\n\t_object[\"input_harvester_proof\"] = input_harvester_proof;\n\t_object[\"input_vdf_points\"] = input_vdf_points;\n\t_object[\"output_verified_vdfs\"] = output_verified_vdfs;\n\t_object[\"output_verified_votes\"] = output_verified_votes;\n\t_object[\"output_verified_proof\"] = output_verified_proof;\n\t_object[\"output_verified_blocks\"] = output_verified_blocks;\n\t_object[\"output_verified_transactions\"] = output_verified_transactions;\n\t_object[\"output_committed_blocks\"] = output_committed_blocks;\n\t_object[\"output_transactions\"] = output_transactions;\n\t_object[\"output_interval_request\"] = output_interval_request;\n\t_object[\"output_challenges\"] = output_challenges;\n\t_object[\"output_vdf_points\"] = output_vdf_points;\n\t_object[\"output_votes\"] = output_votes;\n\t_object[\"max_queue_ms\"] = max_queue_ms;\n\t_object[\"update_interval_ms\"] = update_interval_ms;\n\t_object[\"validate_interval_ms\"] = validate_interval_ms;\n\t_object[\"sync_loss_delay\"] = sync_loss_delay;\n\t_object[\"max_history\"] = max_history;\n\t_object[\"max_tx_pool\"] = max_tx_pool;\n\t_object[\"max_tx_queue\"] = max_tx_queue;\n\t_object[\"max_sync_jobs\"] = max_sync_jobs;\n\t_object[\"max_sync_ahead\"] = max_sync_ahead;\n\t_object[\"num_sync_retries\"] = num_sync_retries;\n\t_object[\"revert_height\"] = revert_height;\n\t_object[\"num_threads\"] = num_threads;\n\t_object[\"num_db_threads\"] = num_db_threads;\n\t_object[\"num_api_threads\"] = num_api_threads;\n\t_object[\"commit_threshold\"] = commit_threshold;\n\t_object[\"max_future_sync\"] = max_future_sync;\n\t_object[\"max_vdf_verify_pending\"] = max_vdf_verify_pending;\n\t_object[\"opencl_device\"] = opencl_device;\n\t_object[\"opencl_device_name\"] = opencl_device_name;\n\t_object[\"do_sync\"] = do_sync;\n\t_object[\"show_warnings\"] = show_warnings;\n\t_object[\"vdf_slave_mode\"] = vdf_slave_mode;\n\t_object[\"run_tests\"] = run_tests;\n\t_object[\"exec_debug\"] = exec_debug;\n\t_object[\"exec_profile\"] = exec_profile;\n\t_object[\"exec_trace\"] = exec_trace;\n\t_object[\"storage_path\"] = storage_path;\n\t_object[\"database_path\"] = database_path;\n\t_object[\"router_name\"] = router_name;\n\t_object[\"mmx_usd_swap_addr\"] = mmx_usd_swap_addr;\n\t_object[\"metalsdev_api_key\"] = metalsdev_api_key;\n\treturn _object;\n}\n\nvoid NodeBase::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"commit_threshold\") {\n\t\t\t_entry.second.to(commit_threshold);\n\t\t} else if(_entry.first == \"database_path\") {\n\t\t\t_entry.second.to(database_path);\n\t\t} else if(_entry.first == \"do_sync\") {\n\t\t\t_entry.second.to(do_sync);\n\t\t} else if(_entry.first == \"exec_debug\") {\n\t\t\t_entry.second.to(exec_debug);\n\t\t} else if(_entry.first == \"exec_profile\") {\n\t\t\t_entry.second.to(exec_profile);\n\t\t} else if(_entry.first == \"exec_trace\") {\n\t\t\t_entry.second.to(exec_trace);\n\t\t} else if(_entry.first == \"input_blocks\") {\n\t\t\t_entry.second.to(input_blocks);\n\t\t} else if(_entry.first == \"input_harvester_proof\") {\n\t\t\t_entry.second.to(input_harvester_proof);\n\t\t} else if(_entry.first == \"input_proof\") {\n\t\t\t_entry.second.to(input_proof);\n\t\t} else if(_entry.first == \"input_timelord_vdfs\") {\n\t\t\t_entry.second.to(input_timelord_vdfs);\n\t\t} else if(_entry.first == \"input_transactions\") {\n\t\t\t_entry.second.to(input_transactions);\n\t\t} else if(_entry.first == \"input_vdf_points\") {\n\t\t\t_entry.second.to(input_vdf_points);\n\t\t} else if(_entry.first == \"input_vdfs\") {\n\t\t\t_entry.second.to(input_vdfs);\n\t\t} else if(_entry.first == \"input_votes\") {\n\t\t\t_entry.second.to(input_votes);\n\t\t} else if(_entry.first == \"max_future_sync\") {\n\t\t\t_entry.second.to(max_future_sync);\n\t\t} else if(_entry.first == \"max_history\") {\n\t\t\t_entry.second.to(max_history);\n\t\t} else if(_entry.first == \"max_queue_ms\") {\n\t\t\t_entry.second.to(max_queue_ms);\n\t\t} else if(_entry.first == \"max_sync_ahead\") {\n\t\t\t_entry.second.to(max_sync_ahead);\n\t\t} else if(_entry.first == \"max_sync_jobs\") {\n\t\t\t_entry.second.to(max_sync_jobs);\n\t\t} else if(_entry.first == \"max_tx_pool\") {\n\t\t\t_entry.second.to(max_tx_pool);\n\t\t} else if(_entry.first == \"max_tx_queue\") {\n\t\t\t_entry.second.to(max_tx_queue);\n\t\t} else if(_entry.first == \"max_vdf_verify_pending\") {\n\t\t\t_entry.second.to(max_vdf_verify_pending);\n\t\t} else if(_entry.first == \"metalsdev_api_key\") {\n\t\t\t_entry.second.to(metalsdev_api_key);\n\t\t} else if(_entry.first == \"mmx_usd_swap_addr\") {\n\t\t\t_entry.second.to(mmx_usd_swap_addr);\n\t\t} else if(_entry.first == \"num_api_threads\") {\n\t\t\t_entry.second.to(num_api_threads);\n\t\t} else if(_entry.first == \"num_db_threads\") {\n\t\t\t_entry.second.to(num_db_threads);\n\t\t} else if(_entry.first == \"num_sync_retries\") {\n\t\t\t_entry.second.to(num_sync_retries);\n\t\t} else if(_entry.first == \"num_threads\") {\n\t\t\t_entry.second.to(num_threads);\n\t\t} else if(_entry.first == \"opencl_device\") {\n\t\t\t_entry.second.to(opencl_device);\n\t\t} else if(_entry.first == \"opencl_device_name\") {\n\t\t\t_entry.second.to(opencl_device_name);\n\t\t} else if(_entry.first == \"output_challenges\") {\n\t\t\t_entry.second.to(output_challenges);\n\t\t} else if(_entry.first == \"output_committed_blocks\") {\n\t\t\t_entry.second.to(output_committed_blocks);\n\t\t} else if(_entry.first == \"output_interval_request\") {\n\t\t\t_entry.second.to(output_interval_request);\n\t\t} else if(_entry.first == \"output_transactions\") {\n\t\t\t_entry.second.to(output_transactions);\n\t\t} else if(_entry.first == \"output_vdf_points\") {\n\t\t\t_entry.second.to(output_vdf_points);\n\t\t} else if(_entry.first == \"output_verified_blocks\") {\n\t\t\t_entry.second.to(output_verified_blocks);\n\t\t} else if(_entry.first == \"output_verified_proof\") {\n\t\t\t_entry.second.to(output_verified_proof);\n\t\t} else if(_entry.first == \"output_verified_transactions\") {\n\t\t\t_entry.second.to(output_verified_transactions);\n\t\t} else if(_entry.first == \"output_verified_vdfs\") {\n\t\t\t_entry.second.to(output_verified_vdfs);\n\t\t} else if(_entry.first == \"output_verified_votes\") {\n\t\t\t_entry.second.to(output_verified_votes);\n\t\t} else if(_entry.first == \"output_votes\") {\n\t\t\t_entry.second.to(output_votes);\n\t\t} else if(_entry.first == \"revert_height\") {\n\t\t\t_entry.second.to(revert_height);\n\t\t} else if(_entry.first == \"router_name\") {\n\t\t\t_entry.second.to(router_name);\n\t\t} else if(_entry.first == \"run_tests\") {\n\t\t\t_entry.second.to(run_tests);\n\t\t} else if(_entry.first == \"show_warnings\") {\n\t\t\t_entry.second.to(show_warnings);\n\t\t} else if(_entry.first == \"storage_path\") {\n\t\t\t_entry.second.to(storage_path);\n\t\t} else if(_entry.first == \"sync_loss_delay\") {\n\t\t\t_entry.second.to(sync_loss_delay);\n\t\t} else if(_entry.first == \"update_interval_ms\") {\n\t\t\t_entry.second.to(update_interval_ms);\n\t\t} else if(_entry.first == \"validate_interval_ms\") {\n\t\t\t_entry.second.to(validate_interval_ms);\n\t\t} else if(_entry.first == \"vdf_slave_mode\") {\n\t\t\t_entry.second.to(vdf_slave_mode);\n\t\t}\n\t}\n}\n\nvnx::Variant NodeBase::get_field(const std::string& _name) const {\n\tif(_name == \"input_vdfs\") {\n\t\treturn vnx::Variant(input_vdfs);\n\t}\n\tif(_name == \"input_votes\") {\n\t\treturn vnx::Variant(input_votes);\n\t}\n\tif(_name == \"input_proof\") {\n\t\treturn vnx::Variant(input_proof);\n\t}\n\tif(_name == \"input_blocks\") {\n\t\treturn vnx::Variant(input_blocks);\n\t}\n\tif(_name == \"input_transactions\") {\n\t\treturn vnx::Variant(input_transactions);\n\t}\n\tif(_name == \"input_timelord_vdfs\") {\n\t\treturn vnx::Variant(input_timelord_vdfs);\n\t}\n\tif(_name == \"input_harvester_proof\") {\n\t\treturn vnx::Variant(input_harvester_proof);\n\t}\n\tif(_name == \"input_vdf_points\") {\n\t\treturn vnx::Variant(input_vdf_points);\n\t}\n\tif(_name == \"output_verified_vdfs\") {\n\t\treturn vnx::Variant(output_verified_vdfs);\n\t}\n\tif(_name == \"output_verified_votes\") {\n\t\treturn vnx::Variant(output_verified_votes);\n\t}\n\tif(_name == \"output_verified_proof\") {\n\t\treturn vnx::Variant(output_verified_proof);\n\t}\n\tif(_name == \"output_verified_blocks\") {\n\t\treturn vnx::Variant(output_verified_blocks);\n\t}\n\tif(_name == \"output_verified_transactions\") {\n\t\treturn vnx::Variant(output_verified_transactions);\n\t}\n\tif(_name == \"output_committed_blocks\") {\n\t\treturn vnx::Variant(output_committed_blocks);\n\t}\n\tif(_name == \"output_transactions\") {\n\t\treturn vnx::Variant(output_transactions);\n\t}\n\tif(_name == \"output_interval_request\") {\n\t\treturn vnx::Variant(output_interval_request);\n\t}\n\tif(_name == \"output_challenges\") {\n\t\treturn vnx::Variant(output_challenges);\n\t}\n\tif(_name == \"output_vdf_points\") {\n\t\treturn vnx::Variant(output_vdf_points);\n\t}\n\tif(_name == \"output_votes\") {\n\t\treturn vnx::Variant(output_votes);\n\t}\n\tif(_name == \"max_queue_ms\") {\n\t\treturn vnx::Variant(max_queue_ms);\n\t}\n\tif(_name == \"update_interval_ms\") {\n\t\treturn vnx::Variant(update_interval_ms);\n\t}\n\tif(_name == \"validate_interval_ms\") {\n\t\treturn vnx::Variant(validate_interval_ms);\n\t}\n\tif(_name == \"sync_loss_delay\") {\n\t\treturn vnx::Variant(sync_loss_delay);\n\t}\n\tif(_name == \"max_history\") {\n\t\treturn vnx::Variant(max_history);\n\t}\n\tif(_name == \"max_tx_pool\") {\n\t\treturn vnx::Variant(max_tx_pool);\n\t}\n\tif(_name == \"max_tx_queue\") {\n\t\treturn vnx::Variant(max_tx_queue);\n\t}\n\tif(_name == \"max_sync_jobs\") {\n\t\treturn vnx::Variant(max_sync_jobs);\n\t}\n\tif(_name == \"max_sync_ahead\") {\n\t\treturn vnx::Variant(max_sync_ahead);\n\t}\n\tif(_name == \"num_sync_retries\") {\n\t\treturn vnx::Variant(num_sync_retries);\n\t}\n\tif(_name == \"revert_height\") {\n\t\treturn vnx::Variant(revert_height);\n\t}\n\tif(_name == \"num_threads\") {\n\t\treturn vnx::Variant(num_threads);\n\t}\n\tif(_name == \"num_db_threads\") {\n\t\treturn vnx::Variant(num_db_threads);\n\t}\n\tif(_name == \"num_api_threads\") {\n\t\treturn vnx::Variant(num_api_threads);\n\t}\n\tif(_name == \"commit_threshold\") {\n\t\treturn vnx::Variant(commit_threshold);\n\t}\n\tif(_name == \"max_future_sync\") {\n\t\treturn vnx::Variant(max_future_sync);\n\t}\n\tif(_name == \"max_vdf_verify_pending\") {\n\t\treturn vnx::Variant(max_vdf_verify_pending);\n\t}\n\tif(_name == \"opencl_device\") {\n\t\treturn vnx::Variant(opencl_device);\n\t}\n\tif(_name == \"opencl_device_name\") {\n\t\treturn vnx::Variant(opencl_device_name);\n\t}\n\tif(_name == \"do_sync\") {\n\t\treturn vnx::Variant(do_sync);\n\t}\n\tif(_name == \"show_warnings\") {\n\t\treturn vnx::Variant(show_warnings);\n\t}\n\tif(_name == \"vdf_slave_mode\") {\n\t\treturn vnx::Variant(vdf_slave_mode);\n\t}\n\tif(_name == \"run_tests\") {\n\t\treturn vnx::Variant(run_tests);\n\t}\n\tif(_name == \"exec_debug\") {\n\t\treturn vnx::Variant(exec_debug);\n\t}\n\tif(_name == \"exec_profile\") {\n\t\treturn vnx::Variant(exec_profile);\n\t}\n\tif(_name == \"exec_trace\") {\n\t\treturn vnx::Variant(exec_trace);\n\t}\n\tif(_name == \"storage_path\") {\n\t\treturn vnx::Variant(storage_path);\n\t}\n\tif(_name == \"database_path\") {\n\t\treturn vnx::Variant(database_path);\n\t}\n\tif(_name == \"router_name\") {\n\t\treturn vnx::Variant(router_name);\n\t}\n\tif(_name == \"mmx_usd_swap_addr\") {\n\t\treturn vnx::Variant(mmx_usd_swap_addr);\n\t}\n\tif(_name == \"metalsdev_api_key\") {\n\t\treturn vnx::Variant(metalsdev_api_key);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid NodeBase::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"input_vdfs\") {\n\t\t_value.to(input_vdfs);\n\t} else if(_name == \"input_votes\") {\n\t\t_value.to(input_votes);\n\t} else if(_name == \"input_proof\") {\n\t\t_value.to(input_proof);\n\t} else if(_name == \"input_blocks\") {\n\t\t_value.to(input_blocks);\n\t} else if(_name == \"input_transactions\") {\n\t\t_value.to(input_transactions);\n\t} else if(_name == \"input_timelord_vdfs\") {\n\t\t_value.to(input_timelord_vdfs);\n\t} else if(_name == \"input_harvester_proof\") {\n\t\t_value.to(input_harvester_proof);\n\t} else if(_name == \"input_vdf_points\") {\n\t\t_value.to(input_vdf_points);\n\t} else if(_name == \"output_verified_vdfs\") {\n\t\t_value.to(output_verified_vdfs);\n\t} else if(_name == \"output_verified_votes\") {\n\t\t_value.to(output_verified_votes);\n\t} else if(_name == \"output_verified_proof\") {\n\t\t_value.to(output_verified_proof);\n\t} else if(_name == \"output_verified_blocks\") {\n\t\t_value.to(output_verified_blocks);\n\t} else if(_name == \"output_verified_transactions\") {\n\t\t_value.to(output_verified_transactions);\n\t} else if(_name == \"output_committed_blocks\") {\n\t\t_value.to(output_committed_blocks);\n\t} else if(_name == \"output_transactions\") {\n\t\t_value.to(output_transactions);\n\t} else if(_name == \"output_interval_request\") {\n\t\t_value.to(output_interval_request);\n\t} else if(_name == \"output_challenges\") {\n\t\t_value.to(output_challenges);\n\t} else if(_name == \"output_vdf_points\") {\n\t\t_value.to(output_vdf_points);\n\t} else if(_name == \"output_votes\") {\n\t\t_value.to(output_votes);\n\t} else if(_name == \"max_queue_ms\") {\n\t\t_value.to(max_queue_ms);\n\t} else if(_name == \"update_interval_ms\") {\n\t\t_value.to(update_interval_ms);\n\t} else if(_name == \"validate_interval_ms\") {\n\t\t_value.to(validate_interval_ms);\n\t} else if(_name == \"sync_loss_delay\") {\n\t\t_value.to(sync_loss_delay);\n\t} else if(_name == \"max_history\") {\n\t\t_value.to(max_history);\n\t} else if(_name == \"max_tx_pool\") {\n\t\t_value.to(max_tx_pool);\n\t} else if(_name == \"max_tx_queue\") {\n\t\t_value.to(max_tx_queue);\n\t} else if(_name == \"max_sync_jobs\") {\n\t\t_value.to(max_sync_jobs);\n\t} else if(_name == \"max_sync_ahead\") {\n\t\t_value.to(max_sync_ahead);\n\t} else if(_name == \"num_sync_retries\") {\n\t\t_value.to(num_sync_retries);\n\t} else if(_name == \"revert_height\") {\n\t\t_value.to(revert_height);\n\t} else if(_name == \"num_threads\") {\n\t\t_value.to(num_threads);\n\t} else if(_name == \"num_db_threads\") {\n\t\t_value.to(num_db_threads);\n\t} else if(_name == \"num_api_threads\") {\n\t\t_value.to(num_api_threads);\n\t} else if(_name == \"commit_threshold\") {\n\t\t_value.to(commit_threshold);\n\t} else if(_name == \"max_future_sync\") {\n\t\t_value.to(max_future_sync);\n\t} else if(_name == \"max_vdf_verify_pending\") {\n\t\t_value.to(max_vdf_verify_pending);\n\t} else if(_name == \"opencl_device\") {\n\t\t_value.to(opencl_device);\n\t} else if(_name == \"opencl_device_name\") {\n\t\t_value.to(opencl_device_name);\n\t} else if(_name == \"do_sync\") {\n\t\t_value.to(do_sync);\n\t} else if(_name == \"show_warnings\") {\n\t\t_value.to(show_warnings);\n\t} else if(_name == \"vdf_slave_mode\") {\n\t\t_value.to(vdf_slave_mode);\n\t} else if(_name == \"run_tests\") {\n\t\t_value.to(run_tests);\n\t} else if(_name == \"exec_debug\") {\n\t\t_value.to(exec_debug);\n\t} else if(_name == \"exec_profile\") {\n\t\t_value.to(exec_profile);\n\t} else if(_name == \"exec_trace\") {\n\t\t_value.to(exec_trace);\n\t} else if(_name == \"storage_path\") {\n\t\t_value.to(storage_path);\n\t} else if(_name == \"database_path\") {\n\t\t_value.to(database_path);\n\t} else if(_name == \"router_name\") {\n\t\t_value.to(router_name);\n\t} else if(_name == \"mmx_usd_swap_addr\") {\n\t\t_value.to(mmx_usd_swap_addr);\n\t} else if(_name == \"metalsdev_api_key\") {\n\t\t_value.to(metalsdev_api_key);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const NodeBase& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, NodeBase& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* NodeBase::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> NodeBase::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node\";\n\ttype_code->type_hash = vnx::Hash64(0x289d7651582d76a3ull);\n\ttype_code->code_hash = vnx::Hash64(0xda70f535dbe8e2eaull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::NodeBase);\n\ttype_code->methods.resize(87);\n\ttype_code->methods[0] = ::mmx::Node_add_block::static_get_type_code();\n\ttype_code->methods[1] = ::mmx::Node_add_transaction::static_get_type_code();\n\ttype_code->methods[2] = ::mmx::Node_call_contract::static_get_type_code();\n\ttype_code->methods[3] = ::mmx::Node_dump_storage::static_get_type_code();\n\ttype_code->methods[4] = ::mmx::Node_fetch_offers::static_get_type_code();\n\ttype_code->methods[5] = ::mmx::Node_get_all_balances::static_get_type_code();\n\ttype_code->methods[6] = ::mmx::Node_get_balance::static_get_type_code();\n\ttype_code->methods[7] = ::mmx::Node_get_balances::static_get_type_code();\n\ttype_code->methods[8] = ::mmx::Node_get_block::static_get_type_code();\n\ttype_code->methods[9] = ::mmx::Node_get_block_at::static_get_type_code();\n\ttype_code->methods[10] = ::mmx::Node_get_block_hash::static_get_type_code();\n\ttype_code->methods[11] = ::mmx::Node_get_block_hash_ex::static_get_type_code();\n\ttype_code->methods[12] = ::mmx::Node_get_contract::static_get_type_code();\n\ttype_code->methods[13] = ::mmx::Node_get_contract_balances::static_get_type_code();\n\ttype_code->methods[14] = ::mmx::Node_get_contract_for::static_get_type_code();\n\ttype_code->methods[15] = ::mmx::Node_get_contracts::static_get_type_code();\n\ttype_code->methods[16] = ::mmx::Node_get_contracts_by::static_get_type_code();\n\ttype_code->methods[17] = ::mmx::Node_get_contracts_owned_by::static_get_type_code();\n\ttype_code->methods[18] = ::mmx::Node_get_exec_history::static_get_type_code();\n\ttype_code->methods[19] = ::mmx::Node_get_farmed_block_summary::static_get_type_code();\n\ttype_code->methods[20] = ::mmx::Node_get_farmed_blocks::static_get_type_code();\n\ttype_code->methods[21] = ::mmx::Node_get_farmer_ranking::static_get_type_code();\n\ttype_code->methods[22] = ::mmx::Node_get_genesis_hash::static_get_type_code();\n\ttype_code->methods[23] = ::mmx::Node_get_header::static_get_type_code();\n\ttype_code->methods[24] = ::mmx::Node_get_header_at::static_get_type_code();\n\ttype_code->methods[25] = ::mmx::Node_get_height::static_get_type_code();\n\ttype_code->methods[26] = ::mmx::Node_get_history::static_get_type_code();\n\ttype_code->methods[27] = ::mmx::Node_get_history_memo::static_get_type_code();\n\ttype_code->methods[28] = ::mmx::Node_get_network_info::static_get_type_code();\n\ttype_code->methods[29] = ::mmx::Node_get_offer::static_get_type_code();\n\ttype_code->methods[30] = ::mmx::Node_get_offers::static_get_type_code();\n\ttype_code->methods[31] = ::mmx::Node_get_offers_by::static_get_type_code();\n\ttype_code->methods[32] = ::mmx::Node_get_params::static_get_type_code();\n\ttype_code->methods[33] = ::mmx::Node_get_plot_nft_info::static_get_type_code();\n\ttype_code->methods[34] = ::mmx::Node_get_plot_nft_target::static_get_type_code();\n\ttype_code->methods[35] = ::mmx::Node_get_recent_offers::static_get_type_code();\n\ttype_code->methods[36] = ::mmx::Node_get_recent_offers_for::static_get_type_code();\n\ttype_code->methods[37] = ::mmx::Node_get_swap_equivalent_liquidity::static_get_type_code();\n\ttype_code->methods[38] = ::mmx::Node_get_swap_fees_earned::static_get_type_code();\n\ttype_code->methods[39] = ::mmx::Node_get_swap_history::static_get_type_code();\n\ttype_code->methods[40] = ::mmx::Node_get_swap_info::static_get_type_code();\n\ttype_code->methods[41] = ::mmx::Node_get_swap_liquidity_by::static_get_type_code();\n\ttype_code->methods[42] = ::mmx::Node_get_swap_trade_estimate::static_get_type_code();\n\ttype_code->methods[43] = ::mmx::Node_get_swap_user_info::static_get_type_code();\n\ttype_code->methods[44] = ::mmx::Node_get_swaps::static_get_type_code();\n\ttype_code->methods[45] = ::mmx::Node_get_synced_height::static_get_type_code();\n\ttype_code->methods[46] = ::mmx::Node_get_synced_vdf_height::static_get_type_code();\n\ttype_code->methods[47] = ::mmx::Node_get_total_balance::static_get_type_code();\n\ttype_code->methods[48] = ::mmx::Node_get_total_balances::static_get_type_code();\n\ttype_code->methods[49] = ::mmx::Node_get_total_supply::static_get_type_code();\n\ttype_code->methods[50] = ::mmx::Node_get_trade_history::static_get_type_code();\n\ttype_code->methods[51] = ::mmx::Node_get_trade_history_for::static_get_type_code();\n\ttype_code->methods[52] = ::mmx::Node_get_transaction::static_get_type_code();\n\ttype_code->methods[53] = ::mmx::Node_get_transactions::static_get_type_code();\n\ttype_code->methods[54] = ::mmx::Node_get_tx_height::static_get_type_code();\n\ttype_code->methods[55] = ::mmx::Node_get_tx_ids::static_get_type_code();\n\ttype_code->methods[56] = ::mmx::Node_get_tx_ids_at::static_get_type_code();\n\ttype_code->methods[57] = ::mmx::Node_get_tx_ids_since::static_get_type_code();\n\ttype_code->methods[58] = ::mmx::Node_get_tx_info::static_get_type_code();\n\ttype_code->methods[59] = ::mmx::Node_get_tx_info_for::static_get_type_code();\n\ttype_code->methods[60] = ::mmx::Node_get_vdf_height::static_get_type_code();\n\ttype_code->methods[61] = ::mmx::Node_get_vdf_peak::static_get_type_code();\n\ttype_code->methods[62] = ::mmx::Node_read_storage::static_get_type_code();\n\ttype_code->methods[63] = ::mmx::Node_read_storage_array::static_get_type_code();\n\ttype_code->methods[64] = ::mmx::Node_read_storage_entry_addr::static_get_type_code();\n\ttype_code->methods[65] = ::mmx::Node_read_storage_entry_string::static_get_type_code();\n\ttype_code->methods[66] = ::mmx::Node_read_storage_entry_var::static_get_type_code();\n\ttype_code->methods[67] = ::mmx::Node_read_storage_field::static_get_type_code();\n\ttype_code->methods[68] = ::mmx::Node_read_storage_map::static_get_type_code();\n\ttype_code->methods[69] = ::mmx::Node_read_storage_object::static_get_type_code();\n\ttype_code->methods[70] = ::mmx::Node_read_storage_var::static_get_type_code();\n\ttype_code->methods[71] = ::mmx::Node_revert_sync::static_get_type_code();\n\ttype_code->methods[72] = ::mmx::Node_start_sync::static_get_type_code();\n\ttype_code->methods[73] = ::mmx::Node_validate::static_get_type_code();\n\ttype_code->methods[74] = ::mmx::Node_verify_partial::static_get_type_code();\n\ttype_code->methods[75] = ::mmx::Node_verify_plot_nft_target::static_get_type_code();\n\ttype_code->methods[76] = ::vnx::ModuleInterface_vnx_get_config::static_get_type_code();\n\ttype_code->methods[77] = ::vnx::ModuleInterface_vnx_get_config_object::static_get_type_code();\n\ttype_code->methods[78] = ::vnx::ModuleInterface_vnx_get_module_info::static_get_type_code();\n\ttype_code->methods[79] = ::vnx::ModuleInterface_vnx_get_type_code::static_get_type_code();\n\ttype_code->methods[80] = ::vnx::ModuleInterface_vnx_restart::static_get_type_code();\n\ttype_code->methods[81] = ::vnx::ModuleInterface_vnx_self_test::static_get_type_code();\n\ttype_code->methods[82] = ::vnx::ModuleInterface_vnx_set_config::static_get_type_code();\n\ttype_code->methods[83] = ::vnx::ModuleInterface_vnx_set_config_object::static_get_type_code();\n\ttype_code->methods[84] = ::vnx::ModuleInterface_vnx_stop::static_get_type_code();\n\ttype_code->methods[85] = ::vnx::addons::HttpComponent_http_request::static_get_type_code();\n\ttype_code->methods[86] = ::vnx::addons::HttpComponent_http_request_chunk::static_get_type_code();\n\ttype_code->fields.resize(50);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_vdfs\";\n\t\tfield.value = vnx::to_string(\"network.vdfs\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_votes\";\n\t\tfield.value = vnx::to_string(\"network.votes\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_proof\";\n\t\tfield.value = vnx::to_string(\"network.proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_blocks\";\n\t\tfield.value = vnx::to_string(\"network.blocks\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_transactions\";\n\t\tfield.value = vnx::to_string(\"network.transactions\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_timelord_vdfs\";\n\t\tfield.value = vnx::to_string(\"timelord.proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_harvester_proof\";\n\t\tfield.value = vnx::to_string(\"farmer.proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_vdf_points\";\n\t\tfield.value = vnx::to_string(\"network.vdf_points\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_verified_vdfs\";\n\t\tfield.value = vnx::to_string(\"node.verified_vdfs\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_verified_votes\";\n\t\tfield.value = vnx::to_string(\"node.verified_votes\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_verified_proof\";\n\t\tfield.value = vnx::to_string(\"node.verified_proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_verified_blocks\";\n\t\tfield.value = vnx::to_string(\"node.verified_blocks\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_verified_transactions\";\n\t\tfield.value = vnx::to_string(\"node.verified_transactions\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_committed_blocks\";\n\t\tfield.value = vnx::to_string(\"node.committed_blocks\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_transactions\";\n\t\tfield.value = vnx::to_string(\"node.transactions\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[15];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_interval_request\";\n\t\tfield.value = vnx::to_string(\"timelord.requests\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[16];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_challenges\";\n\t\tfield.value = vnx::to_string(\"harvester.challenges\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[17];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_vdf_points\";\n\t\tfield.value = vnx::to_string(\"node.vdf_points\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[18];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_votes\";\n\t\tfield.value = vnx::to_string(\"node.votes\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[19];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_queue_ms\";\n\t\tfield.value = vnx::to_string(10000);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[20];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"update_interval_ms\";\n\t\tfield.value = vnx::to_string(1000);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[21];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"validate_interval_ms\";\n\t\tfield.value = vnx::to_string(500);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[22];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"sync_loss_delay\";\n\t\tfield.value = vnx::to_string(60);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[23];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_history\";\n\t\tfield.value = vnx::to_string(1000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[24];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_tx_pool\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[25];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_tx_queue\";\n\t\tfield.value = vnx::to_string(10000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[26];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_sync_jobs\";\n\t\tfield.value = vnx::to_string(64);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[27];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_sync_ahead\";\n\t\tfield.value = vnx::to_string(1000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[28];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_sync_retries\";\n\t\tfield.value = vnx::to_string(3);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[29];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"revert_height\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[30];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_threads\";\n\t\tfield.value = vnx::to_string(24);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[31];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_db_threads\";\n\t\tfield.value = vnx::to_string(8);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[32];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_api_threads\";\n\t\tfield.value = vnx::to_string(8);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[33];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"commit_threshold\";\n\t\tfield.value = vnx::to_string(80);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[34];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_future_sync\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[35];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_vdf_verify_pending\";\n\t\tfield.value = vnx::to_string(2);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[36];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"opencl_device\";\n\t\tfield.value = vnx::to_string(0);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[37];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"opencl_device_name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[38];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"do_sync\";\n\t\tfield.value = vnx::to_string(true);\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[39];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"show_warnings\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[40];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"vdf_slave_mode\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[41];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"run_tests\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[42];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"exec_debug\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[43];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"exec_profile\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[44];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"exec_trace\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[45];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"storage_path\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[46];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"database_path\";\n\t\tfield.value = vnx::to_string(\"db/\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[47];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"router_name\";\n\t\tfield.value = vnx::to_string(\"Router\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[48];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"mmx_usd_swap_addr\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[49];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"metalsdev_api_key\";\n\t\tfield.code = {32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nvoid NodeBase::vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) {\n\tconst auto* _type_code = _value->get_type_code();\n\twhile(_type_code) {\n\t\tswitch(_type_code->type_hash) {\n\t\t\tcase 0x94965d816d328467ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::Block>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0xa84a63942b8e5c6aull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::ProofOfTime>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0x816e898b36befae0ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::ProofResponse>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0xce0462acdceaa5bcull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::Transaction>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0x1671551501b6c956ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::VDF_Point>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0xc056a2ff24cdee25ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::ValidatorVote>(_value));\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\t_type_code = _type_code->super;\n\t\t}\n\t}\n\thandle(std::static_pointer_cast<const vnx::Value>(_value));\n}\n\nstd::shared_ptr<vnx::Value> NodeBase::vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) {\n\tswitch(_method->get_type_hash()) {\n\t\tcase 0x63abca4d23f93894ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_add_block>(_method);\n\t\t\tauto _return_value = ::mmx::Node_add_block_return::create();\n\t\t\tadd_block(_args->block);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xd9782531c0e3f766ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_add_transaction>(_method);\n\t\t\tauto _return_value = ::mmx::Node_add_transaction_return::create();\n\t\t\tadd_transaction(_args->tx, _args->pre_validate);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6a21b0dfe3e541e8ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_call_contract>(_method);\n\t\t\tauto _return_value = ::mmx::Node_call_contract_return::create();\n\t\t\t_return_value->_ret_0 = call_contract(_args->address, _args->method, _args->args, _args->user, _args->deposit);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x8b66a712eea839bbull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_dump_storage>(_method);\n\t\t\tauto _return_value = ::mmx::Node_dump_storage_return::create();\n\t\t\t_return_value->_ret_0 = dump_storage(_args->contract, _args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xfca08ee41b997129ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_fetch_offers>(_method);\n\t\t\tauto _return_value = ::mmx::Node_fetch_offers_return::create();\n\t\t\t_return_value->_ret_0 = fetch_offers(_args->addresses, _args->state, _args->closed);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe099ac5aea49433ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_all_balances>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_all_balances_return::create();\n\t\t\t_return_value->_ret_0 = get_all_balances(_args->addresses, _args->whitelist, _args->limit);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x2e00172d0470479ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_balance>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_balance_return::create();\n\t\t\t_return_value->_ret_0 = get_balance(_args->address, _args->currency);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x1c8af02c41e96460ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_balances>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_balances_return::create();\n\t\t\t_return_value->_ret_0 = get_balances(_args->address, _args->whitelist, _args->limit);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xeb3fabe56dec161aull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_block>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_block_return::create();\n\t\t\t_return_value->_ret_0 = get_block(_args->hash);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xc69c9f876a00e48full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_block_at>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_block_at_return::create();\n\t\t\t_return_value->_ret_0 = get_block_at(_args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x43c5087066b73f38ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_block_hash>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_block_hash_return::create();\n\t\t\t_return_value->_ret_0 = get_block_hash(_args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6024ae54abca18cbull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_block_hash_ex>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_block_hash_ex_return::create();\n\t\t\t_return_value->_ret_0 = get_block_hash_ex(_args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xa28704c65a67a293ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_contract>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_contract_return::create();\n\t\t\t_return_value->_ret_0 = get_contract(_args->address);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xeb1e66155927b13aull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_contract_balances>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_contract_balances_return::create();\n\t\t\t_return_value->_ret_0 = get_contract_balances(_args->address, _args->whitelist, _args->limit);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6a953dcea83b9832ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_contract_for>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_contract_for_return::create();\n\t\t\t_return_value->_ret_0 = get_contract_for(_args->address);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x49e218583c1f1c8aull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_contracts>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_contracts_return::create();\n\t\t\t_return_value->_ret_0 = get_contracts(_args->addresses);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe7c397362a63f57cull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_contracts_by>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_contracts_by_return::create();\n\t\t\t_return_value->_ret_0 = get_contracts_by(_args->addresses, _args->type_hash);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x63989a04fee2fba4ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_contracts_owned_by>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_contracts_owned_by_return::create();\n\t\t\t_return_value->_ret_0 = get_contracts_owned_by(_args->addresses, _args->type_hash);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf17c2f67bedb9df6ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_exec_history>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_exec_history_return::create();\n\t\t\t_return_value->_ret_0 = get_exec_history(_args->address, _args->limit, _args->recent);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xa6cda1247bd4f537ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_farmed_block_summary>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_farmed_block_summary_return::create();\n\t\t\t_return_value->_ret_0 = get_farmed_block_summary(_args->farmer_keys, _args->since);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xfc412d06ff25542eull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_farmed_blocks>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_farmed_blocks_return::create();\n\t\t\t_return_value->_ret_0 = get_farmed_blocks(_args->farmer_keys, _args->full_blocks, _args->since, _args->limit);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x548d571d6384bd43ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_farmer_ranking>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_farmer_ranking_return::create();\n\t\t\t_return_value->_ret_0 = get_farmer_ranking(_args->limit);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xbfab786cb64c5a3ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_genesis_hash>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_genesis_hash_return::create();\n\t\t\t_return_value->_ret_0 = get_genesis_hash();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf17a5d0c180db198ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_header>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_header_return::create();\n\t\t\t_return_value->_ret_0 = get_header(_args->hash);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x52658163d8767c79ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_header_at>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_header_at_return::create();\n\t\t\t_return_value->_ret_0 = get_header_at(_args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x55f0d4ef7a117716ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_height>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_height_return::create();\n\t\t\t_return_value->_ret_0 = get_height();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x8b3db05c6e91011dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_history>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_history_return::create();\n\t\t\t_return_value->_ret_0 = get_history(_args->addresses, _args->filter);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x693c0c791039287cull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_history_memo>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_history_memo_return::create();\n\t\t\t_return_value->_ret_0 = get_history_memo(_args->addresses, _args->memo, _args->filter);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x79cedc8662eeb2e4ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_network_info>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_network_info_return::create();\n\t\t\t_return_value->_ret_0 = get_network_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xd3e336e279686563ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_offer>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_offer_return::create();\n\t\t\t_return_value->_ret_0 = get_offer(_args->address);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x62e5e37dd72d3175ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_offers>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_offers_return::create();\n\t\t\t_return_value->_ret_0 = get_offers(_args->since, _args->state);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf83c55f59e407411ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_offers_by>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_offers_by_return::create();\n\t\t\t_return_value->_ret_0 = get_offers_by(_args->owners, _args->state);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6384b34900c2e465ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_params>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_params_return::create();\n\t\t\t_return_value->_ret_0 = get_params();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x23efbfd355a3741full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_plot_nft_info>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_plot_nft_info_return::create();\n\t\t\t_return_value->_ret_0 = get_plot_nft_info(_args->address);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x14dfd6e2b1f3282eull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_plot_nft_target>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_plot_nft_target_return::create();\n\t\t\t_return_value->_ret_0 = get_plot_nft_target(_args->address, _args->farmer_addr);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xfcd729efd0504fdeull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_recent_offers>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_recent_offers_return::create();\n\t\t\t_return_value->_ret_0 = get_recent_offers(_args->limit, _args->state);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xd89f845556eb17a0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_recent_offers_for>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_recent_offers_for_return::create();\n\t\t\t_return_value->_ret_0 = get_recent_offers_for(_args->bid, _args->ask, _args->min_bid, _args->limit, _args->state);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xc43a3083725aa480ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_swap_equivalent_liquidity>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_swap_equivalent_liquidity_return::create();\n\t\t\t_return_value->_ret_0 = get_swap_equivalent_liquidity(_args->address, _args->user);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x1dae57fb82265b93ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_swap_fees_earned>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_swap_fees_earned_return::create();\n\t\t\t_return_value->_ret_0 = get_swap_fees_earned(_args->address, _args->user);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xc16faaf15fcc9f36ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_swap_history>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_swap_history_return::create();\n\t\t\t_return_value->_ret_0 = get_swap_history(_args->address, _args->limit);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x14f546a807fae18cull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_swap_info>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_swap_info_return::create();\n\t\t\t_return_value->_ret_0 = get_swap_info(_args->address);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x426cded100da751eull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_swap_liquidity_by>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_swap_liquidity_by_return::create();\n\t\t\t_return_value->_ret_0 = get_swap_liquidity_by(_args->addresses);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x1c3d2e0c3a431e9eull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_swap_trade_estimate>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_swap_trade_estimate_return::create();\n\t\t\t_return_value->_ret_0 = get_swap_trade_estimate(_args->address, _args->i, _args->amount, _args->num_iter);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xb92b8fb7df56ec0full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_swap_user_info>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_swap_user_info_return::create();\n\t\t\t_return_value->_ret_0 = get_swap_user_info(_args->address, _args->user);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x219bbb3e5dcd19eaull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_swaps>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_swaps_return::create();\n\t\t\t_return_value->_ret_0 = get_swaps(_args->since, _args->token, _args->currency, _args->limit);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xc4fb44ec3d1a8bb7ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_synced_height>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_synced_height_return::create();\n\t\t\t_return_value->_ret_0 = get_synced_height();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x3c9ce92abd3b42c6ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_synced_vdf_height>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_synced_vdf_height_return::create();\n\t\t\t_return_value->_ret_0 = get_synced_vdf_height();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x91e9019d224db4b0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_total_balance>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_total_balance_return::create();\n\t\t\t_return_value->_ret_0 = get_total_balance(_args->addresses, _args->currency);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf54c4ec46ee6053aull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_total_balances>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_total_balances_return::create();\n\t\t\t_return_value->_ret_0 = get_total_balances(_args->addresses, _args->whitelist, _args->limit);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x17d971db6900bd9dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_total_supply>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_total_supply_return::create();\n\t\t\t_return_value->_ret_0 = get_total_supply(_args->currency);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x62736b035e3995cdull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_trade_history>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_trade_history_return::create();\n\t\t\t_return_value->_ret_0 = get_trade_history(_args->limit, _args->since);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xd55cda633e3dd5b8ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_trade_history_for>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_trade_history_for_return::create();\n\t\t\t_return_value->_ret_0 = get_trade_history_for(_args->bid, _args->ask, _args->limit, _args->since);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9c76ca142292750full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_transaction>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_transaction_return::create();\n\t\t\t_return_value->_ret_0 = get_transaction(_args->id, _args->pending);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x715a5bb668426203ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_transactions>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_transactions_return::create();\n\t\t\t_return_value->_ret_0 = get_transactions(_args->ids);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf6f917fad9361e3aull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_tx_height>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_tx_height_return::create();\n\t\t\t_return_value->_ret_0 = get_tx_height(_args->id);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe268e5bf2a7f22d6ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_tx_ids>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_tx_ids_return::create();\n\t\t\t_return_value->_ret_0 = get_tx_ids(_args->limit);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x904c686b59c101c3ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_tx_ids_at>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_tx_ids_at_return::create();\n\t\t\t_return_value->_ret_0 = get_tx_ids_at(_args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x640af36b555e1606ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_tx_ids_since>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_tx_ids_since_return::create();\n\t\t\t_return_value->_ret_0 = get_tx_ids_since(_args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xb5409a3aaa19d1d2ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_tx_info>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_tx_info_return::create();\n\t\t\t_return_value->_ret_0 = get_tx_info(_args->id);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xba1c6e6eccfe9369ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_tx_info_for>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_tx_info_for_return::create();\n\t\t\t_return_value->_ret_0 = get_tx_info_for(_args->tx);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x33db3aa655c4e5feull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_vdf_height>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_vdf_height_return::create();\n\t\t\t_return_value->_ret_0 = get_vdf_height();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf3449b43830283ddull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_get_vdf_peak>(_method);\n\t\t\tauto _return_value = ::mmx::Node_get_vdf_peak_return::create();\n\t\t\t_return_value->_ret_0 = get_vdf_peak();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xd74cd2b291cb9cd6ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_read_storage>(_method);\n\t\t\tauto _return_value = ::mmx::Node_read_storage_return::create();\n\t\t\t_return_value->_ret_0 = read_storage(_args->contract, _args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe5826950ca0a442bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_read_storage_array>(_method);\n\t\t\tauto _return_value = ::mmx::Node_read_storage_array_return::create();\n\t\t\t_return_value->_ret_0 = read_storage_array(_args->contract, _args->address, _args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xffbf8c4478bb5ab5ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_read_storage_entry_addr>(_method);\n\t\t\tauto _return_value = ::mmx::Node_read_storage_entry_addr_return::create();\n\t\t\t_return_value->_ret_0 = read_storage_entry_addr(_args->contract, _args->name, _args->key, _args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe5b52723a3714e9full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_read_storage_entry_string>(_method);\n\t\t\tauto _return_value = ::mmx::Node_read_storage_entry_string_return::create();\n\t\t\t_return_value->_ret_0 = read_storage_entry_string(_args->contract, _args->name, _args->key, _args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xb0ebcc688396e6dbull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_read_storage_entry_var>(_method);\n\t\t\tauto _return_value = ::mmx::Node_read_storage_entry_var_return::create();\n\t\t\t_return_value->_ret_0 = read_storage_entry_var(_args->contract, _args->address, _args->key, _args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xc9a10c9f7f2cef16ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_read_storage_field>(_method);\n\t\t\tauto _return_value = ::mmx::Node_read_storage_field_return::create();\n\t\t\t_return_value->_ret_0 = read_storage_field(_args->contract, _args->name, _args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x1cc0cc12bc2c1b4eull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_read_storage_map>(_method);\n\t\t\tauto _return_value = ::mmx::Node_read_storage_map_return::create();\n\t\t\t_return_value->_ret_0 = read_storage_map(_args->contract, _args->address, _args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x5930cf36eeb662fbull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_read_storage_object>(_method);\n\t\t\tauto _return_value = ::mmx::Node_read_storage_object_return::create();\n\t\t\t_return_value->_ret_0 = read_storage_object(_args->contract, _args->address, _args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x16d0361bcb359c2full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_read_storage_var>(_method);\n\t\t\tauto _return_value = ::mmx::Node_read_storage_var_return::create();\n\t\t\t_return_value->_ret_0 = read_storage_var(_args->contract, _args->address, _args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x8c1cc38a7a8a6c1dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_revert_sync>(_method);\n\t\t\tauto _return_value = ::mmx::Node_revert_sync_return::create();\n\t\t\trevert_sync(_args->height);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6c5be8aeb25ef3c8ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_start_sync>(_method);\n\t\t\tauto _return_value = ::mmx::Node_start_sync_return::create();\n\t\t\tstart_sync(_args->force);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x95dbbd65f36b618ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_validate>(_method);\n\t\t\tauto _return_value = ::mmx::Node_validate_return::create();\n\t\t\t_return_value->_ret_0 = validate(_args->tx);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xeb15396685387f88ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_verify_partial>(_method);\n\t\t\tauto _return_value = ::mmx::Node_verify_partial_return::create();\n\t\t\t_return_value->_ret_0 = verify_partial(_args->partial, _args->pool_target);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf3ac786edcae50e1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Node_verify_plot_nft_target>(_method);\n\t\t\tauto _return_value = ::mmx::Node_verify_plot_nft_target_return::create();\n\t\t\t_return_value->_ret_0 = verify_plot_nft_target(_args->address, _args->pool_target);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xbbc7f1a01044d294ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config(_args->name);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x17f58f68bf83abc0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_object_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config_object();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf6d82bdf66d034a1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_module_info_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_module_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x305ec4d628960e5dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_type_code_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_type_code();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9e95dc280cecca1bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_restart>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_restart_return::create();\n\t\t\tvnx_restart();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6ce3775b41a42697ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_self_test_return::create();\n\t\t\t_return_value->_ret_0 = vnx_self_test();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x362aac91373958b7ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_return::create();\n\t\t\tvnx_set_config(_args->name, _args->value);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xca30f814f17f322full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_object_return::create();\n\t\t\tvnx_set_config_object(_args->config);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x7ab49ce3d1bfc0d2ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_stop>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_stop_return::create();\n\t\t\tvnx_stop();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe0b6c38f619bad92ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::addons::HttpComponent_http_request>(_method);\n\t\t\thttp_request_async(_args->request, _args->sub_path, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t\tcase 0x97e79d08440406d5ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk>(_method);\n\t\t\thttp_request_chunk_async(_args->request, _args->sub_path, _args->offset, _args->max_bytes, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t}\n\tauto _ex = vnx::NoSuchMethod::create();\n\t_ex->method = _method->get_type_name();\n\treturn _ex;\n}\n\nvoid NodeBase::http_request_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpResponse>& _ret_0) const {\n\tauto _return_value = ::vnx::addons::HttpComponent_http_request_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\nvoid NodeBase::http_request_chunk_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpData>& _ret_0) const {\n\tauto _return_value = ::vnx::addons::HttpComponent_http_request_chunk_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::NodeBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[19]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_queue_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[20]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.update_interval_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[21]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.validate_interval_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[22]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.sync_loss_delay, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[23]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_history, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[24]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_tx_pool, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[25]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_tx_queue, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[26]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_sync_jobs, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[27]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_sync_ahead, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[28]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_sync_retries, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[29]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.revert_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[30]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_threads, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[31]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_db_threads, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[32]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_api_threads, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[33]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.commit_threshold, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[34]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_future_sync, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[35]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_vdf_verify_pending, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[36]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.opencl_device, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[38]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.do_sync, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[39]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.show_warnings, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[40]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_slave_mode, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[41]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.run_tests, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[42]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.exec_debug, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[43]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.exec_profile, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[44]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.exec_trace, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.input_vdfs, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.input_votes, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.input_proof, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.input_blocks, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.input_transactions, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.input_timelord_vdfs, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.input_harvester_proof, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.input_vdf_points, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.output_verified_vdfs, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.output_verified_votes, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.output_verified_proof, type_code, _field->code.data()); break;\n\t\t\tcase 11: vnx::read(in, value.output_verified_blocks, type_code, _field->code.data()); break;\n\t\t\tcase 12: vnx::read(in, value.output_verified_transactions, type_code, _field->code.data()); break;\n\t\t\tcase 13: vnx::read(in, value.output_committed_blocks, type_code, _field->code.data()); break;\n\t\t\tcase 14: vnx::read(in, value.output_transactions, type_code, _field->code.data()); break;\n\t\t\tcase 15: vnx::read(in, value.output_interval_request, type_code, _field->code.data()); break;\n\t\t\tcase 16: vnx::read(in, value.output_challenges, type_code, _field->code.data()); break;\n\t\t\tcase 17: vnx::read(in, value.output_vdf_points, type_code, _field->code.data()); break;\n\t\t\tcase 18: vnx::read(in, value.output_votes, type_code, _field->code.data()); break;\n\t\t\tcase 37: vnx::read(in, value.opencl_device_name, type_code, _field->code.data()); break;\n\t\t\tcase 45: vnx::read(in, value.storage_path, type_code, _field->code.data()); break;\n\t\t\tcase 46: vnx::read(in, value.database_path, type_code, _field->code.data()); break;\n\t\t\tcase 47: vnx::read(in, value.router_name, type_code, _field->code.data()); break;\n\t\t\tcase 48: vnx::read(in, value.mmx_usd_swap_addr, type_code, _field->code.data()); break;\n\t\t\tcase 49: vnx::read(in, value.metalsdev_api_key, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::NodeBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_NodeBase;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::NodeBase>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(79);\n\tvnx::write_value(_buf + 0, value.max_queue_ms);\n\tvnx::write_value(_buf + 4, value.update_interval_ms);\n\tvnx::write_value(_buf + 8, value.validate_interval_ms);\n\tvnx::write_value(_buf + 12, value.sync_loss_delay);\n\tvnx::write_value(_buf + 16, value.max_history);\n\tvnx::write_value(_buf + 20, value.max_tx_pool);\n\tvnx::write_value(_buf + 24, value.max_tx_queue);\n\tvnx::write_value(_buf + 28, value.max_sync_jobs);\n\tvnx::write_value(_buf + 32, value.max_sync_ahead);\n\tvnx::write_value(_buf + 36, value.num_sync_retries);\n\tvnx::write_value(_buf + 40, value.revert_height);\n\tvnx::write_value(_buf + 44, value.num_threads);\n\tvnx::write_value(_buf + 48, value.num_db_threads);\n\tvnx::write_value(_buf + 52, value.num_api_threads);\n\tvnx::write_value(_buf + 56, value.commit_threshold);\n\tvnx::write_value(_buf + 60, value.max_future_sync);\n\tvnx::write_value(_buf + 64, value.max_vdf_verify_pending);\n\tvnx::write_value(_buf + 68, value.opencl_device);\n\tvnx::write_value(_buf + 72, value.do_sync);\n\tvnx::write_value(_buf + 73, value.show_warnings);\n\tvnx::write_value(_buf + 74, value.vdf_slave_mode);\n\tvnx::write_value(_buf + 75, value.run_tests);\n\tvnx::write_value(_buf + 76, value.exec_debug);\n\tvnx::write_value(_buf + 77, value.exec_profile);\n\tvnx::write_value(_buf + 78, value.exec_trace);\n\tvnx::write(out, value.input_vdfs, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.input_votes, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.input_proof, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.input_blocks, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.input_transactions, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.input_timelord_vdfs, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.input_harvester_proof, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.input_vdf_points, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.output_verified_vdfs, type_code, type_code->fields[8].code.data());\n\tvnx::write(out, value.output_verified_votes, type_code, type_code->fields[9].code.data());\n\tvnx::write(out, value.output_verified_proof, type_code, type_code->fields[10].code.data());\n\tvnx::write(out, value.output_verified_blocks, type_code, type_code->fields[11].code.data());\n\tvnx::write(out, value.output_verified_transactions, type_code, type_code->fields[12].code.data());\n\tvnx::write(out, value.output_committed_blocks, type_code, type_code->fields[13].code.data());\n\tvnx::write(out, value.output_transactions, type_code, type_code->fields[14].code.data());\n\tvnx::write(out, value.output_interval_request, type_code, type_code->fields[15].code.data());\n\tvnx::write(out, value.output_challenges, type_code, type_code->fields[16].code.data());\n\tvnx::write(out, value.output_vdf_points, type_code, type_code->fields[17].code.data());\n\tvnx::write(out, value.output_votes, type_code, type_code->fields[18].code.data());\n\tvnx::write(out, value.opencl_device_name, type_code, type_code->fields[37].code.data());\n\tvnx::write(out, value.storage_path, type_code, type_code->fields[45].code.data());\n\tvnx::write(out, value.database_path, type_code, type_code->fields[46].code.data());\n\tvnx::write(out, value.router_name, type_code, type_code->fields[47].code.data());\n\tvnx::write(out, value.mmx_usd_swap_addr, type_code, type_code->fields[48].code.data());\n\tvnx::write(out, value.metalsdev_api_key, type_code, type_code->fields[49].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::NodeBase& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::NodeBase& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::NodeBase& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/NodeClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/NodeClient.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/NetworkInfo.hxx>\n#include <mmx/Node_add_block.hxx>\n#include <mmx/Node_add_block_return.hxx>\n#include <mmx/Node_add_transaction.hxx>\n#include <mmx/Node_add_transaction_return.hxx>\n#include <mmx/Node_call_contract.hxx>\n#include <mmx/Node_call_contract_return.hxx>\n#include <mmx/Node_dump_storage.hxx>\n#include <mmx/Node_dump_storage_return.hxx>\n#include <mmx/Node_fetch_offers.hxx>\n#include <mmx/Node_fetch_offers_return.hxx>\n#include <mmx/Node_get_all_balances.hxx>\n#include <mmx/Node_get_all_balances_return.hxx>\n#include <mmx/Node_get_balance.hxx>\n#include <mmx/Node_get_balance_return.hxx>\n#include <mmx/Node_get_balances.hxx>\n#include <mmx/Node_get_balances_return.hxx>\n#include <mmx/Node_get_block.hxx>\n#include <mmx/Node_get_block_return.hxx>\n#include <mmx/Node_get_block_at.hxx>\n#include <mmx/Node_get_block_at_return.hxx>\n#include <mmx/Node_get_block_hash.hxx>\n#include <mmx/Node_get_block_hash_return.hxx>\n#include <mmx/Node_get_block_hash_ex.hxx>\n#include <mmx/Node_get_block_hash_ex_return.hxx>\n#include <mmx/Node_get_contract.hxx>\n#include <mmx/Node_get_contract_return.hxx>\n#include <mmx/Node_get_contract_balances.hxx>\n#include <mmx/Node_get_contract_balances_return.hxx>\n#include <mmx/Node_get_contract_for.hxx>\n#include <mmx/Node_get_contract_for_return.hxx>\n#include <mmx/Node_get_contracts.hxx>\n#include <mmx/Node_get_contracts_return.hxx>\n#include <mmx/Node_get_contracts_by.hxx>\n#include <mmx/Node_get_contracts_by_return.hxx>\n#include <mmx/Node_get_contracts_owned_by.hxx>\n#include <mmx/Node_get_contracts_owned_by_return.hxx>\n#include <mmx/Node_get_exec_history.hxx>\n#include <mmx/Node_get_exec_history_return.hxx>\n#include <mmx/Node_get_farmed_block_summary.hxx>\n#include <mmx/Node_get_farmed_block_summary_return.hxx>\n#include <mmx/Node_get_farmed_blocks.hxx>\n#include <mmx/Node_get_farmed_blocks_return.hxx>\n#include <mmx/Node_get_farmer_ranking.hxx>\n#include <mmx/Node_get_farmer_ranking_return.hxx>\n#include <mmx/Node_get_genesis_hash.hxx>\n#include <mmx/Node_get_genesis_hash_return.hxx>\n#include <mmx/Node_get_header.hxx>\n#include <mmx/Node_get_header_return.hxx>\n#include <mmx/Node_get_header_at.hxx>\n#include <mmx/Node_get_header_at_return.hxx>\n#include <mmx/Node_get_height.hxx>\n#include <mmx/Node_get_height_return.hxx>\n#include <mmx/Node_get_history.hxx>\n#include <mmx/Node_get_history_return.hxx>\n#include <mmx/Node_get_history_memo.hxx>\n#include <mmx/Node_get_history_memo_return.hxx>\n#include <mmx/Node_get_network_info.hxx>\n#include <mmx/Node_get_network_info_return.hxx>\n#include <mmx/Node_get_offer.hxx>\n#include <mmx/Node_get_offer_return.hxx>\n#include <mmx/Node_get_offers.hxx>\n#include <mmx/Node_get_offers_return.hxx>\n#include <mmx/Node_get_offers_by.hxx>\n#include <mmx/Node_get_offers_by_return.hxx>\n#include <mmx/Node_get_params.hxx>\n#include <mmx/Node_get_params_return.hxx>\n#include <mmx/Node_get_plot_nft_info.hxx>\n#include <mmx/Node_get_plot_nft_info_return.hxx>\n#include <mmx/Node_get_plot_nft_target.hxx>\n#include <mmx/Node_get_plot_nft_target_return.hxx>\n#include <mmx/Node_get_recent_offers.hxx>\n#include <mmx/Node_get_recent_offers_return.hxx>\n#include <mmx/Node_get_recent_offers_for.hxx>\n#include <mmx/Node_get_recent_offers_for_return.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity_return.hxx>\n#include <mmx/Node_get_swap_fees_earned.hxx>\n#include <mmx/Node_get_swap_fees_earned_return.hxx>\n#include <mmx/Node_get_swap_history.hxx>\n#include <mmx/Node_get_swap_history_return.hxx>\n#include <mmx/Node_get_swap_info.hxx>\n#include <mmx/Node_get_swap_info_return.hxx>\n#include <mmx/Node_get_swap_liquidity_by.hxx>\n#include <mmx/Node_get_swap_liquidity_by_return.hxx>\n#include <mmx/Node_get_swap_trade_estimate.hxx>\n#include <mmx/Node_get_swap_trade_estimate_return.hxx>\n#include <mmx/Node_get_swap_user_info.hxx>\n#include <mmx/Node_get_swap_user_info_return.hxx>\n#include <mmx/Node_get_swaps.hxx>\n#include <mmx/Node_get_swaps_return.hxx>\n#include <mmx/Node_get_synced_height.hxx>\n#include <mmx/Node_get_synced_height_return.hxx>\n#include <mmx/Node_get_synced_vdf_height.hxx>\n#include <mmx/Node_get_synced_vdf_height_return.hxx>\n#include <mmx/Node_get_total_balance.hxx>\n#include <mmx/Node_get_total_balance_return.hxx>\n#include <mmx/Node_get_total_balances.hxx>\n#include <mmx/Node_get_total_balances_return.hxx>\n#include <mmx/Node_get_total_supply.hxx>\n#include <mmx/Node_get_total_supply_return.hxx>\n#include <mmx/Node_get_trade_history.hxx>\n#include <mmx/Node_get_trade_history_return.hxx>\n#include <mmx/Node_get_trade_history_for.hxx>\n#include <mmx/Node_get_trade_history_for_return.hxx>\n#include <mmx/Node_get_transaction.hxx>\n#include <mmx/Node_get_transaction_return.hxx>\n#include <mmx/Node_get_transactions.hxx>\n#include <mmx/Node_get_transactions_return.hxx>\n#include <mmx/Node_get_tx_height.hxx>\n#include <mmx/Node_get_tx_height_return.hxx>\n#include <mmx/Node_get_tx_ids.hxx>\n#include <mmx/Node_get_tx_ids_return.hxx>\n#include <mmx/Node_get_tx_ids_at.hxx>\n#include <mmx/Node_get_tx_ids_at_return.hxx>\n#include <mmx/Node_get_tx_ids_since.hxx>\n#include <mmx/Node_get_tx_ids_since_return.hxx>\n#include <mmx/Node_get_tx_info.hxx>\n#include <mmx/Node_get_tx_info_return.hxx>\n#include <mmx/Node_get_tx_info_for.hxx>\n#include <mmx/Node_get_tx_info_for_return.hxx>\n#include <mmx/Node_get_vdf_height.hxx>\n#include <mmx/Node_get_vdf_height_return.hxx>\n#include <mmx/Node_get_vdf_peak.hxx>\n#include <mmx/Node_get_vdf_peak_return.hxx>\n#include <mmx/Node_read_storage.hxx>\n#include <mmx/Node_read_storage_return.hxx>\n#include <mmx/Node_read_storage_array.hxx>\n#include <mmx/Node_read_storage_array_return.hxx>\n#include <mmx/Node_read_storage_entry_addr.hxx>\n#include <mmx/Node_read_storage_entry_addr_return.hxx>\n#include <mmx/Node_read_storage_entry_string.hxx>\n#include <mmx/Node_read_storage_entry_string_return.hxx>\n#include <mmx/Node_read_storage_entry_var.hxx>\n#include <mmx/Node_read_storage_entry_var_return.hxx>\n#include <mmx/Node_read_storage_field.hxx>\n#include <mmx/Node_read_storage_field_return.hxx>\n#include <mmx/Node_read_storage_map.hxx>\n#include <mmx/Node_read_storage_map_return.hxx>\n#include <mmx/Node_read_storage_object.hxx>\n#include <mmx/Node_read_storage_object_return.hxx>\n#include <mmx/Node_read_storage_var.hxx>\n#include <mmx/Node_read_storage_var_return.hxx>\n#include <mmx/Node_revert_sync.hxx>\n#include <mmx/Node_revert_sync_return.hxx>\n#include <mmx/Node_start_sync.hxx>\n#include <mmx/Node_start_sync_return.hxx>\n#include <mmx/Node_validate.hxx>\n#include <mmx/Node_validate_return.hxx>\n#include <mmx/Node_verify_partial.hxx>\n#include <mmx/Node_verify_partial_return.hxx>\n#include <mmx/Node_verify_plot_nft_target.hxx>\n#include <mmx/Node_verify_plot_nft_target_return.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/exec_entry_t.hxx>\n#include <mmx/exec_result_t.hxx>\n#include <mmx/farmed_block_summary_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/plot_nft_info_t.hxx>\n#include <mmx/pooling_error_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/swap_entry_t.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <mmx/swap_user_info_t.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <mmx/uint128.hpp>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nNodeClient::NodeClient(const std::string& service_name)\n\t:\tClient::Client(vnx::Hash64(service_name))\n{\n}\n\nNodeClient::NodeClient(vnx::Hash64 service_addr)\n\t:\tClient::Client(service_addr)\n{\n}\n\nstd::shared_ptr<const ::mmx::ChainParams> NodeClient::get_params() {\n\tauto _method = ::mmx::Node_get_params::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_params_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::ChainParams>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::NetworkInfo> NodeClient::get_network_info() {\n\tauto _method = ::mmx::Node_get_network_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_network_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::NetworkInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::hash_t NodeClient::get_genesis_hash() {\n\tauto _method = ::mmx::Node_get_genesis_hash::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_genesis_hash_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::hash_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nuint32_t NodeClient::get_height() {\n\tauto _method = ::mmx::Node_get_height::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_height_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<uint32_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nuint32_t NodeClient::get_vdf_height() {\n\tauto _method = ::mmx::Node_get_vdf_height::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_vdf_height_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<uint32_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvnx::optional<uint32_t> NodeClient::get_synced_height() {\n\tauto _method = ::mmx::Node_get_synced_height::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_synced_height_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::optional<uint32_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvnx::optional<uint32_t> NodeClient::get_synced_vdf_height() {\n\tauto _method = ::mmx::Node_get_synced_vdf_height::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_synced_vdf_height_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::optional<uint32_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::hash_t NodeClient::get_vdf_peak() {\n\tauto _method = ::mmx::Node_get_vdf_peak::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_vdf_peak_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::hash_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Block> NodeClient::get_block(const ::mmx::hash_t& hash) {\n\tauto _method = ::mmx::Node_get_block::create();\n\t_method->hash = hash;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_block_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Block>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Block> NodeClient::get_block_at(const uint32_t& height) {\n\tauto _method = ::mmx::Node_get_block_at::create();\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_block_at_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Block>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::BlockHeader> NodeClient::get_header(const ::mmx::hash_t& hash) {\n\tauto _method = ::mmx::Node_get_header::create();\n\t_method->hash = hash;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_header_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::BlockHeader>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::BlockHeader> NodeClient::get_header_at(const uint32_t& height) {\n\tauto _method = ::mmx::Node_get_header_at::create();\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_header_at_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::BlockHeader>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvnx::optional<::mmx::hash_t> NodeClient::get_block_hash(const uint32_t& height) {\n\tauto _method = ::mmx::Node_get_block_hash::create();\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_block_hash_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::optional<::mmx::hash_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvnx::optional<std::pair<::mmx::hash_t, ::mmx::hash_t>> NodeClient::get_block_hash_ex(const uint32_t& height) {\n\tauto _method = ::mmx::Node_get_block_hash_ex::create();\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_block_hash_ex_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::optional<std::pair<::mmx::hash_t, ::mmx::hash_t>>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvnx::optional<uint32_t> NodeClient::get_tx_height(const ::mmx::hash_t& id) {\n\tauto _method = ::mmx::Node_get_tx_height::create();\n\t_method->id = id;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_height_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::optional<uint32_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvnx::optional<::mmx::tx_info_t> NodeClient::get_tx_info(const ::mmx::hash_t& id) {\n\tauto _method = ::mmx::Node_get_tx_info::create();\n\t_method->id = id;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::optional<::mmx::tx_info_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvnx::optional<::mmx::tx_info_t> NodeClient::get_tx_info_for(std::shared_ptr<const ::mmx::Transaction> tx) {\n\tauto _method = ::mmx::Node_get_tx_info_for::create();\n\t_method->tx = tx;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_info_for_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::optional<::mmx::tx_info_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::hash_t> NodeClient::get_tx_ids(const uint32_t& limit) {\n\tauto _method = ::mmx::Node_get_tx_ids::create();\n\t_method->limit = limit;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_ids_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::hash_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::hash_t> NodeClient::get_tx_ids_at(const uint32_t& height) {\n\tauto _method = ::mmx::Node_get_tx_ids_at::create();\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_ids_at_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::hash_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::hash_t> NodeClient::get_tx_ids_since(const uint32_t& height) {\n\tauto _method = ::mmx::Node_get_tx_ids_since::create();\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_tx_ids_since_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::hash_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::exec_result_t NodeClient::validate(std::shared_ptr<const ::mmx::Transaction> tx) {\n\tauto _method = ::mmx::Node_validate::create();\n\t_method->tx = tx;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_validate_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::exec_result_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvoid NodeClient::add_block(std::shared_ptr<const ::mmx::Block> block) {\n\tauto _method = ::mmx::Node_add_block::create();\n\t_method->block = block;\n\tvnx_request(_method, false);\n}\n\nvoid NodeClient::add_block_async(std::shared_ptr<const ::mmx::Block> block) {\n\tauto _method = ::mmx::Node_add_block::create();\n\t_method->block = block;\n\tvnx_request(_method, true);\n}\n\nvoid NodeClient::add_transaction(std::shared_ptr<const ::mmx::Transaction> tx, const vnx::bool_t& pre_validate) {\n\tauto _method = ::mmx::Node_add_transaction::create();\n\t_method->tx = tx;\n\t_method->pre_validate = pre_validate;\n\tvnx_request(_method, false);\n}\n\nvoid NodeClient::add_transaction_async(std::shared_ptr<const ::mmx::Transaction> tx, const vnx::bool_t& pre_validate) {\n\tauto _method = ::mmx::Node_add_transaction::create();\n\t_method->tx = tx;\n\t_method->pre_validate = pre_validate;\n\tvnx_request(_method, true);\n}\n\nstd::shared_ptr<const ::mmx::Contract> NodeClient::get_contract(const ::mmx::addr_t& address) {\n\tauto _method = ::mmx::Node_get_contract::create();\n\t_method->address = address;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contract_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Contract>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Contract> NodeClient::get_contract_for(const ::mmx::addr_t& address) {\n\tauto _method = ::mmx::Node_get_contract_for::create();\n\t_method->address = address;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contract_for_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Contract>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<std::shared_ptr<const ::mmx::Contract>> NodeClient::get_contracts(const std::vector<::mmx::addr_t>& addresses) {\n\tauto _method = ::mmx::Node_get_contracts::create();\n\t_method->addresses = addresses;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contracts_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<std::shared_ptr<const ::mmx::Contract>>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::addr_t> NodeClient::get_contracts_by(const std::vector<::mmx::addr_t>& addresses, const vnx::optional<::mmx::hash_t>& type_hash) {\n\tauto _method = ::mmx::Node_get_contracts_by::create();\n\t_method->addresses = addresses;\n\t_method->type_hash = type_hash;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contracts_by_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::addr_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::addr_t> NodeClient::get_contracts_owned_by(const std::vector<::mmx::addr_t>& addresses, const vnx::optional<::mmx::hash_t>& type_hash) {\n\tauto _method = ::mmx::Node_get_contracts_owned_by::create();\n\t_method->addresses = addresses;\n\t_method->type_hash = type_hash;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contracts_owned_by_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::addr_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> NodeClient::get_transaction(const ::mmx::hash_t& id, const vnx::bool_t& pending) {\n\tauto _method = ::mmx::Node_get_transaction::create();\n\t_method->id = id;\n\t_method->pending = pending;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_transaction_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<std::shared_ptr<const ::mmx::Transaction>> NodeClient::get_transactions(const std::vector<::mmx::hash_t>& ids) {\n\tauto _method = ::mmx::Node_get_transactions::create();\n\t_method->ids = ids;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_transactions_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<std::shared_ptr<const ::mmx::Transaction>>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::tx_entry_t> NodeClient::get_history(const std::vector<::mmx::addr_t>& addresses, const ::mmx::query_filter_t& filter) {\n\tauto _method = ::mmx::Node_get_history::create();\n\t_method->addresses = addresses;\n\t_method->filter = filter;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_history_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::tx_entry_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::tx_entry_t> NodeClient::get_history_memo(const std::vector<::mmx::addr_t>& addresses, const std::string& memo, const ::mmx::query_filter_t& filter) {\n\tauto _method = ::mmx::Node_get_history_memo::create();\n\t_method->addresses = addresses;\n\t_method->memo = memo;\n\t_method->filter = filter;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_history_memo_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::tx_entry_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::uint128 NodeClient::get_balance(const ::mmx::addr_t& address, const ::mmx::addr_t& currency) {\n\tauto _method = ::mmx::Node_get_balance::create();\n\t_method->address = address;\n\t_method->currency = currency;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_balance_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::uint128>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::addr_t, ::mmx::uint128> NodeClient::get_balances(const ::mmx::addr_t& address, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit) {\n\tauto _method = ::mmx::Node_get_balances::create();\n\t_method->address = address;\n\t_method->whitelist = whitelist;\n\t_method->limit = limit;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_balances_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::uint128>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::addr_t, ::mmx::balance_t> NodeClient::get_contract_balances(const ::mmx::addr_t& address, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit) {\n\tauto _method = ::mmx::Node_get_contract_balances::create();\n\t_method->address = address;\n\t_method->whitelist = whitelist;\n\t_method->limit = limit;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_contract_balances_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::balance_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::uint128 NodeClient::get_total_balance(const std::vector<::mmx::addr_t>& addresses, const ::mmx::addr_t& currency) {\n\tauto _method = ::mmx::Node_get_total_balance::create();\n\t_method->addresses = addresses;\n\t_method->currency = currency;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_total_balance_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::uint128>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::addr_t, ::mmx::uint128> NodeClient::get_total_balances(const std::vector<::mmx::addr_t>& addresses, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit) {\n\tauto _method = ::mmx::Node_get_total_balances::create();\n\t_method->addresses = addresses;\n\t_method->whitelist = whitelist;\n\t_method->limit = limit;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_total_balances_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::uint128>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128> NodeClient::get_all_balances(const std::vector<::mmx::addr_t>& addresses, const std::set<::mmx::addr_t>& whitelist, const int32_t& limit) {\n\tauto _method = ::mmx::Node_get_all_balances::create();\n\t_method->addresses = addresses;\n\t_method->whitelist = whitelist;\n\t_method->limit = limit;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_all_balances_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::exec_entry_t> NodeClient::get_exec_history(const ::mmx::addr_t& address, const int32_t& limit, const vnx::bool_t& recent) {\n\tauto _method = ::mmx::Node_get_exec_history::create();\n\t_method->address = address;\n\t_method->limit = limit;\n\t_method->recent = recent;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_exec_history_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::exec_entry_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::map<std::string, ::mmx::vm::varptr_t> NodeClient::read_storage(const ::mmx::addr_t& contract, const uint32_t& height) {\n\tauto _method = ::mmx::Node_read_storage::create();\n\t_method->contract = contract;\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<std::string, ::mmx::vm::varptr_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::map<uint64_t, ::mmx::vm::varptr_t> NodeClient::dump_storage(const ::mmx::addr_t& contract, const uint32_t& height) {\n\tauto _method = ::mmx::Node_dump_storage::create();\n\t_method->contract = contract;\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_dump_storage_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<uint64_t, ::mmx::vm::varptr_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::vm::varptr_t NodeClient::read_storage_var(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height) {\n\tauto _method = ::mmx::Node_read_storage_var::create();\n\t_method->contract = contract;\n\t_method->address = address;\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_var_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::vm::varptr_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::vm::varptr_t NodeClient::read_storage_entry_var(const ::mmx::addr_t& contract, const uint64_t& address, const uint64_t& key, const uint32_t& height) {\n\tauto _method = ::mmx::Node_read_storage_entry_var::create();\n\t_method->contract = contract;\n\t_method->address = address;\n\t_method->key = key;\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_entry_var_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::vm::varptr_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::pair<::mmx::vm::varptr_t, uint64_t> NodeClient::read_storage_field(const ::mmx::addr_t& contract, const std::string& name, const uint32_t& height) {\n\tauto _method = ::mmx::Node_read_storage_field::create();\n\t_method->contract = contract;\n\t_method->name = name;\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_field_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::pair<::mmx::vm::varptr_t, uint64_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t> NodeClient::read_storage_entry_addr(const ::mmx::addr_t& contract, const std::string& name, const ::mmx::addr_t& key, const uint32_t& height) {\n\tauto _method = ::mmx::Node_read_storage_entry_addr::create();\n\t_method->contract = contract;\n\t_method->name = name;\n\t_method->key = key;\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_entry_addr_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t> NodeClient::read_storage_entry_string(const ::mmx::addr_t& contract, const std::string& name, const std::string& key, const uint32_t& height) {\n\tauto _method = ::mmx::Node_read_storage_entry_string::create();\n\t_method->contract = contract;\n\t_method->name = name;\n\t_method->key = key;\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_entry_string_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::tuple<::mmx::vm::varptr_t, uint64_t, uint64_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::vm::varptr_t> NodeClient::read_storage_array(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height) {\n\tauto _method = ::mmx::Node_read_storage_array::create();\n\t_method->contract = contract;\n\t_method->address = address;\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_array_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::vm::varptr_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::vm::varptr_t, ::mmx::vm::varptr_t> NodeClient::read_storage_map(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height) {\n\tauto _method = ::mmx::Node_read_storage_map::create();\n\t_method->contract = contract;\n\t_method->address = address;\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_map_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::vm::varptr_t, ::mmx::vm::varptr_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::map<std::string, ::mmx::vm::varptr_t> NodeClient::read_storage_object(const ::mmx::addr_t& contract, const uint64_t& address, const uint32_t& height) {\n\tauto _method = ::mmx::Node_read_storage_object::create();\n\t_method->contract = contract;\n\t_method->address = address;\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_read_storage_object_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<std::string, ::mmx::vm::varptr_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::vnx::Variant NodeClient::call_contract(const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const vnx::optional<::mmx::addr_t>& user, const vnx::optional<std::pair<::mmx::addr_t, ::mmx::uint128>>& deposit) {\n\tauto _method = ::mmx::Node_call_contract::create();\n\t_method->address = address;\n\t_method->method = method;\n\t_method->args = args;\n\t_method->user = user;\n\t_method->deposit = deposit;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_call_contract_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Variant>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvnx::optional<::mmx::plot_nft_info_t> NodeClient::get_plot_nft_info(const ::mmx::addr_t& address) {\n\tauto _method = ::mmx::Node_get_plot_nft_info::create();\n\t_method->address = address;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_plot_nft_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::optional<::mmx::plot_nft_info_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::addr_t NodeClient::get_plot_nft_target(const ::mmx::addr_t& address, const vnx::optional<::mmx::addr_t>& farmer_addr) {\n\tauto _method = ::mmx::Node_get_plot_nft_target::create();\n\t_method->address = address;\n\t_method->farmer_addr = farmer_addr;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_plot_nft_target_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::addr_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::offer_data_t NodeClient::get_offer(const ::mmx::addr_t& address) {\n\tauto _method = ::mmx::Node_get_offer::create();\n\t_method->address = address;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_offer_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::offer_data_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::offer_data_t> NodeClient::get_offers(const uint32_t& since, const vnx::bool_t& state) {\n\tauto _method = ::mmx::Node_get_offers::create();\n\t_method->since = since;\n\t_method->state = state;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_offers_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::offer_data_t> NodeClient::get_offers_by(const std::vector<::mmx::addr_t>& owners, const vnx::bool_t& state) {\n\tauto _method = ::mmx::Node_get_offers_by::create();\n\t_method->owners = owners;\n\t_method->state = state;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_offers_by_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::offer_data_t> NodeClient::fetch_offers(const std::vector<::mmx::addr_t>& addresses, const vnx::bool_t& state, const vnx::bool_t& closed) {\n\tauto _method = ::mmx::Node_fetch_offers::create();\n\t_method->addresses = addresses;\n\t_method->state = state;\n\t_method->closed = closed;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_fetch_offers_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::offer_data_t> NodeClient::get_recent_offers(const int32_t& limit, const vnx::bool_t& state) {\n\tauto _method = ::mmx::Node_get_recent_offers::create();\n\t_method->limit = limit;\n\t_method->state = state;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_recent_offers_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::offer_data_t> NodeClient::get_recent_offers_for(const vnx::optional<::mmx::addr_t>& bid, const vnx::optional<::mmx::addr_t>& ask, const ::mmx::uint128& min_bid, const int32_t& limit, const vnx::bool_t& state) {\n\tauto _method = ::mmx::Node_get_recent_offers_for::create();\n\t_method->bid = bid;\n\t_method->ask = ask;\n\t_method->min_bid = min_bid;\n\t_method->limit = limit;\n\t_method->state = state;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_recent_offers_for_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::trade_entry_t> NodeClient::get_trade_history(const int32_t& limit, const uint32_t& since) {\n\tauto _method = ::mmx::Node_get_trade_history::create();\n\t_method->limit = limit;\n\t_method->since = since;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_trade_history_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::trade_entry_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::trade_entry_t> NodeClient::get_trade_history_for(const vnx::optional<::mmx::addr_t>& bid, const vnx::optional<::mmx::addr_t>& ask, const int32_t& limit, const uint32_t& since) {\n\tauto _method = ::mmx::Node_get_trade_history_for::create();\n\t_method->bid = bid;\n\t_method->ask = ask;\n\t_method->limit = limit;\n\t_method->since = since;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_trade_history_for_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::trade_entry_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::swap_info_t> NodeClient::get_swaps(const uint32_t& since, const vnx::optional<::mmx::addr_t>& token, const vnx::optional<::mmx::addr_t>& currency, const int32_t& limit) {\n\tauto _method = ::mmx::Node_get_swaps::create();\n\t_method->since = since;\n\t_method->token = token;\n\t_method->currency = currency;\n\t_method->limit = limit;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swaps_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::swap_info_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::swap_info_t NodeClient::get_swap_info(const ::mmx::addr_t& address) {\n\tauto _method = ::mmx::Node_get_swap_info::create();\n\t_method->address = address;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::swap_info_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::swap_user_info_t NodeClient::get_swap_user_info(const ::mmx::addr_t& address, const ::mmx::addr_t& user) {\n\tauto _method = ::mmx::Node_get_swap_user_info::create();\n\t_method->address = address;\n\t_method->user = user;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_user_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::swap_user_info_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::swap_entry_t> NodeClient::get_swap_history(const ::mmx::addr_t& address, const int32_t& limit) {\n\tauto _method = ::mmx::Node_get_swap_history::create();\n\t_method->address = address;\n\t_method->limit = limit;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_history_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::swap_entry_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::array<::mmx::uint128, 2> NodeClient::get_swap_trade_estimate(const ::mmx::addr_t& address, const uint32_t& i, const ::mmx::uint128& amount, const int32_t& num_iter) {\n\tauto _method = ::mmx::Node_get_swap_trade_estimate::create();\n\t_method->address = address;\n\t_method->i = i;\n\t_method->amount = amount;\n\t_method->num_iter = num_iter;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_trade_estimate_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::array<::mmx::uint128, 2>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::array<::mmx::uint128, 2> NodeClient::get_swap_fees_earned(const ::mmx::addr_t& address, const ::mmx::addr_t& user) {\n\tauto _method = ::mmx::Node_get_swap_fees_earned::create();\n\t_method->address = address;\n\t_method->user = user;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_fees_earned_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::array<::mmx::uint128, 2>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::array<::mmx::uint128, 2> NodeClient::get_swap_equivalent_liquidity(const ::mmx::addr_t& address, const ::mmx::addr_t& user) {\n\tauto _method = ::mmx::Node_get_swap_equivalent_liquidity::create();\n\t_method->address = address;\n\t_method->user = user;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_equivalent_liquidity_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::array<::mmx::uint128, 2>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>> NodeClient::get_swap_liquidity_by(const std::vector<::mmx::addr_t>& addresses) {\n\tauto _method = ::mmx::Node_get_swap_liquidity_by::create();\n\t_method->addresses = addresses;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_swap_liquidity_by_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::uint128 NodeClient::get_total_supply(const ::mmx::addr_t& currency) {\n\tauto _method = ::mmx::Node_get_total_supply::create();\n\t_method->currency = currency;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_total_supply_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::uint128>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<std::shared_ptr<const ::mmx::BlockHeader>> NodeClient::get_farmed_blocks(const std::vector<::mmx::pubkey_t>& farmer_keys, const vnx::bool_t& full_blocks, const uint32_t& since, const int32_t& limit) {\n\tauto _method = ::mmx::Node_get_farmed_blocks::create();\n\t_method->farmer_keys = farmer_keys;\n\t_method->full_blocks = full_blocks;\n\t_method->since = since;\n\t_method->limit = limit;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_farmed_blocks_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<std::shared_ptr<const ::mmx::BlockHeader>>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::mmx::farmed_block_summary_t NodeClient::get_farmed_block_summary(const std::vector<::mmx::pubkey_t>& farmer_keys, const uint32_t& since) {\n\tauto _method = ::mmx::Node_get_farmed_block_summary::create();\n\t_method->farmer_keys = farmer_keys;\n\t_method->since = since;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_farmed_block_summary_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::farmed_block_summary_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::vector<std::pair<::mmx::pubkey_t, uint32_t>> NodeClient::get_farmer_ranking(const int32_t& limit) {\n\tauto _method = ::mmx::Node_get_farmer_ranking::create();\n\t_method->limit = limit;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_get_farmer_ranking_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<std::pair<::mmx::pubkey_t, uint32_t>>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::tuple<::mmx::pooling_error_e, std::string> NodeClient::verify_plot_nft_target(const ::mmx::addr_t& address, const ::mmx::addr_t& pool_target) {\n\tauto _method = ::mmx::Node_verify_plot_nft_target::create();\n\t_method->address = address;\n\t_method->pool_target = pool_target;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_verify_plot_nft_target_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::tuple<::mmx::pooling_error_e, std::string>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::tuple<::mmx::pooling_error_e, std::string> NodeClient::verify_partial(std::shared_ptr<const ::mmx::Partial> partial, const vnx::optional<::mmx::addr_t>& pool_target) {\n\tauto _method = ::mmx::Node_verify_partial::create();\n\t_method->partial = partial;\n\t_method->pool_target = pool_target;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Node_verify_partial_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::tuple<::mmx::pooling_error_e, std::string>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvoid NodeClient::start_sync(const vnx::bool_t& force) {\n\tauto _method = ::mmx::Node_start_sync::create();\n\t_method->force = force;\n\tvnx_request(_method, false);\n}\n\nvoid NodeClient::start_sync_async(const vnx::bool_t& force) {\n\tauto _method = ::mmx::Node_start_sync::create();\n\t_method->force = force;\n\tvnx_request(_method, true);\n}\n\nvoid NodeClient::revert_sync(const uint32_t& height) {\n\tauto _method = ::mmx::Node_revert_sync::create();\n\t_method->height = height;\n\tvnx_request(_method, false);\n}\n\nvoid NodeClient::revert_sync_async(const uint32_t& height) {\n\tauto _method = ::mmx::Node_revert_sync::create();\n\t_method->height = height;\n\tvnx_request(_method, true);\n}\n\nstd::shared_ptr<const ::vnx::addons::HttpResponse> NodeClient::http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpResponse>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::addons::HttpData> NodeClient::http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request_chunk::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\t_method->offset = offset;\n\t_method->max_bytes = max_bytes;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpData>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::vnx::Object NodeClient::vnx_get_config_object() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Object>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n::vnx::Variant NodeClient::vnx_get_config(const std::string& name) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Variant>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvoid NodeClient::vnx_set_config_object(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, false);\n}\n\nvoid NodeClient::vnx_set_config_object_async(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, true);\n}\n\nvoid NodeClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, false);\n}\n\nvoid NodeClient::vnx_set_config_async(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, true);\n}\n\n::vnx::TypeCode NodeClient::vnx_get_type_code() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::TypeCode>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::ModuleInfo> NodeClient::vnx_get_module_info() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\nvoid NodeClient::vnx_restart() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, false);\n}\n\nvoid NodeClient::vnx_restart_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, true);\n}\n\nvoid NodeClient::vnx_stop() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, false);\n}\n\nvoid NodeClient::vnx_stop_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, true);\n}\n\nvnx::bool_t NodeClient::vnx_self_test() {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::bool_t>();\n\t} else {\n\t\tthrow std::logic_error(\"NodeClient: invalid return value\");\n\t}\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/Node_add_block.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_add_block.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/Node_add_block_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_add_block::VNX_TYPE_HASH(0x63abca4d23f93894ull);\nconst vnx::Hash64 Node_add_block::VNX_CODE_HASH(0x99de46a219d8c44eull);\n\nvnx::Hash64 Node_add_block::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_add_block::get_type_name() const {\n\treturn \"mmx.Node.add_block\";\n}\n\nconst vnx::TypeCode* Node_add_block::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_add_block;\n}\n\nstd::shared_ptr<Node_add_block> Node_add_block::create() {\n\treturn std::make_shared<Node_add_block>();\n}\n\nstd::shared_ptr<vnx::Value> Node_add_block::clone() const {\n\treturn std::make_shared<Node_add_block>(*this);\n}\n\nvoid Node_add_block::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_add_block::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_add_block::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_add_block;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, block);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_add_block::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.add_block\\\"\";\n\t_out << \", \\\"block\\\": \"; vnx::write(_out, block);\n\t_out << \"}\";\n}\n\nvoid Node_add_block::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_add_block::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.add_block\";\n\t_object[\"block\"] = block;\n\treturn _object;\n}\n\nvoid Node_add_block::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"block\") {\n\t\t\t_entry.second.to(block);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_add_block::get_field(const std::string& _name) const {\n\tif(_name == \"block\") {\n\t\treturn vnx::Variant(block);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_add_block::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"block\") {\n\t\t_value.to(block);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_add_block& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_add_block& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_add_block::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_add_block::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.add_block\";\n\ttype_code->type_hash = vnx::Hash64(0x63abca4d23f93894ull);\n\ttype_code->code_hash = vnx::Hash64(0x99de46a219d8c44eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_add_block);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_add_block>(); };\n\ttype_code->return_type = ::mmx::Node_add_block_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"block\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->permission = \"vnx.permission_e.PUBLISH\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_add_block& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.block, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_add_block& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_add_block;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_add_block>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.block, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_add_block& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_add_block& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_add_block& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_add_block_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_add_block_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_add_block_return::VNX_TYPE_HASH(0xb6d1115db03a6d6aull);\nconst vnx::Hash64 Node_add_block_return::VNX_CODE_HASH(0x2eafd3f9c9f22a3bull);\n\nvnx::Hash64 Node_add_block_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_add_block_return::get_type_name() const {\n\treturn \"mmx.Node.add_block.return\";\n}\n\nconst vnx::TypeCode* Node_add_block_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_add_block_return;\n}\n\nstd::shared_ptr<Node_add_block_return> Node_add_block_return::create() {\n\treturn std::make_shared<Node_add_block_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_add_block_return::clone() const {\n\treturn std::make_shared<Node_add_block_return>(*this);\n}\n\nvoid Node_add_block_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_add_block_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_add_block_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_add_block_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_add_block_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.add_block.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_add_block_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_add_block_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.add_block.return\";\n\treturn _object;\n}\n\nvoid Node_add_block_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_add_block_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_add_block_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_add_block_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_add_block_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_add_block_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_add_block_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.add_block.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb6d1115db03a6d6aull);\n\ttype_code->code_hash = vnx::Hash64(0x2eafd3f9c9f22a3bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_add_block_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_add_block_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_add_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_add_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_add_block_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_add_block_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_add_block_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_add_block_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_add_block_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_add_transaction.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_add_transaction.hxx>\n#include <mmx/Node_add_transaction_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_add_transaction::VNX_TYPE_HASH(0xd9782531c0e3f766ull);\nconst vnx::Hash64 Node_add_transaction::VNX_CODE_HASH(0xe79464bfffb7995bull);\n\nvnx::Hash64 Node_add_transaction::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_add_transaction::get_type_name() const {\n\treturn \"mmx.Node.add_transaction\";\n}\n\nconst vnx::TypeCode* Node_add_transaction::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_add_transaction;\n}\n\nstd::shared_ptr<Node_add_transaction> Node_add_transaction::create() {\n\treturn std::make_shared<Node_add_transaction>();\n}\n\nstd::shared_ptr<vnx::Value> Node_add_transaction::clone() const {\n\treturn std::make_shared<Node_add_transaction>(*this);\n}\n\nvoid Node_add_transaction::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_add_transaction::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_add_transaction::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_add_transaction;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, tx);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, pre_validate);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_add_transaction::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.add_transaction\\\"\";\n\t_out << \", \\\"tx\\\": \"; vnx::write(_out, tx);\n\t_out << \", \\\"pre_validate\\\": \"; vnx::write(_out, pre_validate);\n\t_out << \"}\";\n}\n\nvoid Node_add_transaction::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_add_transaction::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.add_transaction\";\n\t_object[\"tx\"] = tx;\n\t_object[\"pre_validate\"] = pre_validate;\n\treturn _object;\n}\n\nvoid Node_add_transaction::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"pre_validate\") {\n\t\t\t_entry.second.to(pre_validate);\n\t\t} else if(_entry.first == \"tx\") {\n\t\t\t_entry.second.to(tx);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_add_transaction::get_field(const std::string& _name) const {\n\tif(_name == \"tx\") {\n\t\treturn vnx::Variant(tx);\n\t}\n\tif(_name == \"pre_validate\") {\n\t\treturn vnx::Variant(pre_validate);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_add_transaction::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"tx\") {\n\t\t_value.to(tx);\n\t} else if(_name == \"pre_validate\") {\n\t\t_value.to(pre_validate);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_add_transaction& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_add_transaction& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_add_transaction::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_add_transaction::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.add_transaction\";\n\ttype_code->type_hash = vnx::Hash64(0xd9782531c0e3f766ull);\n\ttype_code->code_hash = vnx::Hash64(0xe79464bfffb7995bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_add_transaction);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_add_transaction>(); };\n\ttype_code->return_type = ::mmx::Node_add_transaction_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"tx\";\n\t\tfield.code = {16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"pre_validate\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->permission = \"vnx.permission_e.PUBLISH\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_add_transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.pre_validate, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.tx, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_add_transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_add_transaction;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_add_transaction>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(1);\n\tvnx::write_value(_buf + 0, value.pre_validate);\n\tvnx::write(out, value.tx, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_add_transaction& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_add_transaction& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_add_transaction& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_add_transaction_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_add_transaction_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_add_transaction_return::VNX_TYPE_HASH(0x2ded8c10e1721ba8ull);\nconst vnx::Hash64 Node_add_transaction_return::VNX_CODE_HASH(0x90f6d45cc2a14813ull);\n\nvnx::Hash64 Node_add_transaction_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_add_transaction_return::get_type_name() const {\n\treturn \"mmx.Node.add_transaction.return\";\n}\n\nconst vnx::TypeCode* Node_add_transaction_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_add_transaction_return;\n}\n\nstd::shared_ptr<Node_add_transaction_return> Node_add_transaction_return::create() {\n\treturn std::make_shared<Node_add_transaction_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_add_transaction_return::clone() const {\n\treturn std::make_shared<Node_add_transaction_return>(*this);\n}\n\nvoid Node_add_transaction_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_add_transaction_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_add_transaction_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_add_transaction_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_add_transaction_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.add_transaction.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_add_transaction_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_add_transaction_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.add_transaction.return\";\n\treturn _object;\n}\n\nvoid Node_add_transaction_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_add_transaction_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_add_transaction_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_add_transaction_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_add_transaction_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_add_transaction_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_add_transaction_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.add_transaction.return\";\n\ttype_code->type_hash = vnx::Hash64(0x2ded8c10e1721ba8ull);\n\ttype_code->code_hash = vnx::Hash64(0x90f6d45cc2a14813ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_add_transaction_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_add_transaction_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_add_transaction_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_add_transaction_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_add_transaction_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_add_transaction_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_add_transaction_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_add_transaction_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_add_transaction_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_call_contract.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_call_contract.hxx>\n#include <mmx/Node_call_contract_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_call_contract::VNX_TYPE_HASH(0x6a21b0dfe3e541e8ull);\nconst vnx::Hash64 Node_call_contract::VNX_CODE_HASH(0x66777d15263b1ed3ull);\n\nvnx::Hash64 Node_call_contract::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_call_contract::get_type_name() const {\n\treturn \"mmx.Node.call_contract\";\n}\n\nconst vnx::TypeCode* Node_call_contract::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_call_contract;\n}\n\nstd::shared_ptr<Node_call_contract> Node_call_contract::create() {\n\treturn std::make_shared<Node_call_contract>();\n}\n\nstd::shared_ptr<vnx::Value> Node_call_contract::clone() const {\n\treturn std::make_shared<Node_call_contract>(*this);\n}\n\nvoid Node_call_contract::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_call_contract::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_call_contract::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_call_contract;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, method);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, args);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, user);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, deposit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_call_contract::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.call_contract\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"method\\\": \"; vnx::write(_out, method);\n\t_out << \", \\\"args\\\": \"; vnx::write(_out, args);\n\t_out << \", \\\"user\\\": \"; vnx::write(_out, user);\n\t_out << \", \\\"deposit\\\": \"; vnx::write(_out, deposit);\n\t_out << \"}\";\n}\n\nvoid Node_call_contract::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_call_contract::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.call_contract\";\n\t_object[\"address\"] = address;\n\t_object[\"method\"] = method;\n\t_object[\"args\"] = args;\n\t_object[\"user\"] = user;\n\t_object[\"deposit\"] = deposit;\n\treturn _object;\n}\n\nvoid Node_call_contract::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"args\") {\n\t\t\t_entry.second.to(args);\n\t\t} else if(_entry.first == \"deposit\") {\n\t\t\t_entry.second.to(deposit);\n\t\t} else if(_entry.first == \"method\") {\n\t\t\t_entry.second.to(method);\n\t\t} else if(_entry.first == \"user\") {\n\t\t\t_entry.second.to(user);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_call_contract::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"method\") {\n\t\treturn vnx::Variant(method);\n\t}\n\tif(_name == \"args\") {\n\t\treturn vnx::Variant(args);\n\t}\n\tif(_name == \"user\") {\n\t\treturn vnx::Variant(user);\n\t}\n\tif(_name == \"deposit\") {\n\t\treturn vnx::Variant(deposit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_call_contract::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"method\") {\n\t\t_value.to(method);\n\t} else if(_name == \"args\") {\n\t\t_value.to(args);\n\t} else if(_name == \"user\") {\n\t\t_value.to(user);\n\t} else if(_name == \"deposit\") {\n\t\t_value.to(deposit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_call_contract& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_call_contract& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_call_contract::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_call_contract::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.call_contract\";\n\ttype_code->type_hash = vnx::Hash64(0x6a21b0dfe3e541e8ull);\n\ttype_code->code_hash = vnx::Hash64(0x66777d15263b1ed3ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_call_contract);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_call_contract>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_call_contract_return::static_get_type_code();\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"method\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"args\";\n\t\tfield.code = {12, 17};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"deposit\";\n\t\tfield.code = {33, 23, 2, 4, 7, 11, 32, 1, 11, 16, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_call_contract& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.method, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.args, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.user, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.deposit, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_call_contract& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_call_contract;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_call_contract>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.method, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.args, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.user, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.deposit, type_code, type_code->fields[4].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_call_contract& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_call_contract& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_call_contract& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_call_contract_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_call_contract_return.hxx>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_call_contract_return::VNX_TYPE_HASH(0x8449f6656a89f7aeull);\nconst vnx::Hash64 Node_call_contract_return::VNX_CODE_HASH(0x209e4899b64e81b0ull);\n\nvnx::Hash64 Node_call_contract_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_call_contract_return::get_type_name() const {\n\treturn \"mmx.Node.call_contract.return\";\n}\n\nconst vnx::TypeCode* Node_call_contract_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_call_contract_return;\n}\n\nstd::shared_ptr<Node_call_contract_return> Node_call_contract_return::create() {\n\treturn std::make_shared<Node_call_contract_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_call_contract_return::clone() const {\n\treturn std::make_shared<Node_call_contract_return>(*this);\n}\n\nvoid Node_call_contract_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_call_contract_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_call_contract_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_call_contract_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_call_contract_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.call_contract.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_call_contract_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_call_contract_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.call_contract.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_call_contract_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_call_contract_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_call_contract_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_call_contract_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_call_contract_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_call_contract_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_call_contract_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.call_contract.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8449f6656a89f7aeull);\n\ttype_code->code_hash = vnx::Hash64(0x209e4899b64e81b0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_call_contract_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_call_contract_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {17};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_call_contract_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_call_contract_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_call_contract_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_call_contract_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_call_contract_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_call_contract_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_call_contract_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_dump_storage.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_dump_storage.hxx>\n#include <mmx/Node_dump_storage_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_dump_storage::VNX_TYPE_HASH(0x8b66a712eea839bbull);\nconst vnx::Hash64 Node_dump_storage::VNX_CODE_HASH(0x78f82c80cd112c97ull);\n\nvnx::Hash64 Node_dump_storage::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_dump_storage::get_type_name() const {\n\treturn \"mmx.Node.dump_storage\";\n}\n\nconst vnx::TypeCode* Node_dump_storage::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_dump_storage;\n}\n\nstd::shared_ptr<Node_dump_storage> Node_dump_storage::create() {\n\treturn std::make_shared<Node_dump_storage>();\n}\n\nstd::shared_ptr<vnx::Value> Node_dump_storage::clone() const {\n\treturn std::make_shared<Node_dump_storage>(*this);\n}\n\nvoid Node_dump_storage::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_dump_storage::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_dump_storage::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_dump_storage;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_dump_storage::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.dump_storage\\\"\";\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_dump_storage::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_dump_storage::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.dump_storage\";\n\t_object[\"contract\"] = contract;\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_dump_storage::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_dump_storage::get_field(const std::string& _name) const {\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_dump_storage::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_dump_storage& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_dump_storage& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_dump_storage::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_dump_storage::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.dump_storage\";\n\ttype_code->type_hash = vnx::Hash64(0x8b66a712eea839bbull);\n\ttype_code->code_hash = vnx::Hash64(0x78f82c80cd112c97ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_dump_storage);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_dump_storage>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_dump_storage_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_dump_storage& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_dump_storage& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_dump_storage;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_dump_storage>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write(out, value.contract, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_dump_storage& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_dump_storage& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_dump_storage& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_dump_storage_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_dump_storage_return.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_dump_storage_return::VNX_TYPE_HASH(0xbc8c0b1ce37def41ull);\nconst vnx::Hash64 Node_dump_storage_return::VNX_CODE_HASH(0xaba46c2d9c40f3baull);\n\nvnx::Hash64 Node_dump_storage_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_dump_storage_return::get_type_name() const {\n\treturn \"mmx.Node.dump_storage.return\";\n}\n\nconst vnx::TypeCode* Node_dump_storage_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_dump_storage_return;\n}\n\nstd::shared_ptr<Node_dump_storage_return> Node_dump_storage_return::create() {\n\treturn std::make_shared<Node_dump_storage_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_dump_storage_return::clone() const {\n\treturn std::make_shared<Node_dump_storage_return>(*this);\n}\n\nvoid Node_dump_storage_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_dump_storage_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_dump_storage_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_dump_storage_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_dump_storage_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.dump_storage.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_dump_storage_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_dump_storage_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.dump_storage.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_dump_storage_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_dump_storage_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_dump_storage_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_dump_storage_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_dump_storage_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_dump_storage_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_dump_storage_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.dump_storage.return\";\n\ttype_code->type_hash = vnx::Hash64(0xbc8c0b1ce37def41ull);\n\ttype_code->code_hash = vnx::Hash64(0xaba46c2d9c40f3baull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_dump_storage_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_dump_storage_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 3, 4, 12, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_dump_storage_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_dump_storage_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_dump_storage_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_dump_storage_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_dump_storage_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_dump_storage_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_dump_storage_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_fetch_offers.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_fetch_offers.hxx>\n#include <mmx/Node_fetch_offers_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_fetch_offers::VNX_TYPE_HASH(0xfca08ee41b997129ull);\nconst vnx::Hash64 Node_fetch_offers::VNX_CODE_HASH(0xb399f3337f3d628cull);\n\nvnx::Hash64 Node_fetch_offers::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_fetch_offers::get_type_name() const {\n\treturn \"mmx.Node.fetch_offers\";\n}\n\nconst vnx::TypeCode* Node_fetch_offers::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_fetch_offers;\n}\n\nstd::shared_ptr<Node_fetch_offers> Node_fetch_offers::create() {\n\treturn std::make_shared<Node_fetch_offers>();\n}\n\nstd::shared_ptr<vnx::Value> Node_fetch_offers::clone() const {\n\treturn std::make_shared<Node_fetch_offers>(*this);\n}\n\nvoid Node_fetch_offers::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_fetch_offers::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_fetch_offers::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_fetch_offers;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, state);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, closed);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_fetch_offers::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.fetch_offers\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \", \\\"state\\\": \"; vnx::write(_out, state);\n\t_out << \", \\\"closed\\\": \"; vnx::write(_out, closed);\n\t_out << \"}\";\n}\n\nvoid Node_fetch_offers::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_fetch_offers::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.fetch_offers\";\n\t_object[\"addresses\"] = addresses;\n\t_object[\"state\"] = state;\n\t_object[\"closed\"] = closed;\n\treturn _object;\n}\n\nvoid Node_fetch_offers::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t} else if(_entry.first == \"closed\") {\n\t\t\t_entry.second.to(closed);\n\t\t} else if(_entry.first == \"state\") {\n\t\t\t_entry.second.to(state);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_fetch_offers::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\tif(_name == \"state\") {\n\t\treturn vnx::Variant(state);\n\t}\n\tif(_name == \"closed\") {\n\t\treturn vnx::Variant(closed);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_fetch_offers::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t} else if(_name == \"state\") {\n\t\t_value.to(state);\n\t} else if(_name == \"closed\") {\n\t\t_value.to(closed);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_fetch_offers& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_fetch_offers& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_fetch_offers::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_fetch_offers::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.fetch_offers\";\n\ttype_code->type_hash = vnx::Hash64(0xfca08ee41b997129ull);\n\ttype_code->code_hash = vnx::Hash64(0xb399f3337f3d628cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_fetch_offers);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_fetch_offers>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_fetch_offers_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"state\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"closed\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_fetch_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.state, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.closed, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_fetch_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_fetch_offers;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_fetch_offers>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(2);\n\tvnx::write_value(_buf + 0, value.state);\n\tvnx::write_value(_buf + 1, value.closed);\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_fetch_offers& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_fetch_offers& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_fetch_offers& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_fetch_offers_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_fetch_offers_return.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_fetch_offers_return::VNX_TYPE_HASH(0x8c5cc826b759938bull);\nconst vnx::Hash64 Node_fetch_offers_return::VNX_CODE_HASH(0xc9709dc276485c1cull);\n\nvnx::Hash64 Node_fetch_offers_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_fetch_offers_return::get_type_name() const {\n\treturn \"mmx.Node.fetch_offers.return\";\n}\n\nconst vnx::TypeCode* Node_fetch_offers_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_fetch_offers_return;\n}\n\nstd::shared_ptr<Node_fetch_offers_return> Node_fetch_offers_return::create() {\n\treturn std::make_shared<Node_fetch_offers_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_fetch_offers_return::clone() const {\n\treturn std::make_shared<Node_fetch_offers_return>(*this);\n}\n\nvoid Node_fetch_offers_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_fetch_offers_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_fetch_offers_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_fetch_offers_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_fetch_offers_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.fetch_offers.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_fetch_offers_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_fetch_offers_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.fetch_offers.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_fetch_offers_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_fetch_offers_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_fetch_offers_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_fetch_offers_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_fetch_offers_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_fetch_offers_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_fetch_offers_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.fetch_offers.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8c5cc826b759938bull);\n\ttype_code->code_hash = vnx::Hash64(0xc9709dc276485c1cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_fetch_offers_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_fetch_offers_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::offer_data_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_fetch_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_fetch_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_fetch_offers_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_fetch_offers_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_fetch_offers_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_fetch_offers_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_fetch_offers_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_all_balances.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_all_balances.hxx>\n#include <mmx/Node_get_all_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_all_balances::VNX_TYPE_HASH(0xe099ac5aea49433ull);\nconst vnx::Hash64 Node_get_all_balances::VNX_CODE_HASH(0x4a545872440ce967ull);\n\nvnx::Hash64 Node_get_all_balances::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_all_balances::get_type_name() const {\n\treturn \"mmx.Node.get_all_balances\";\n}\n\nconst vnx::TypeCode* Node_get_all_balances::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_all_balances;\n}\n\nstd::shared_ptr<Node_get_all_balances> Node_get_all_balances::create() {\n\treturn std::make_shared<Node_get_all_balances>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_all_balances::clone() const {\n\treturn std::make_shared<Node_get_all_balances>(*this);\n}\n\nvoid Node_get_all_balances::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_all_balances::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_all_balances::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_all_balances;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, whitelist);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, limit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_all_balances::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_all_balances\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \", \\\"whitelist\\\": \"; vnx::write(_out, whitelist);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \"}\";\n}\n\nvoid Node_get_all_balances::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_all_balances::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_all_balances\";\n\t_object[\"addresses\"] = addresses;\n\t_object[\"whitelist\"] = whitelist;\n\t_object[\"limit\"] = limit;\n\treturn _object;\n}\n\nvoid Node_get_all_balances::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"whitelist\") {\n\t\t\t_entry.second.to(whitelist);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_all_balances::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\tif(_name == \"whitelist\") {\n\t\treturn vnx::Variant(whitelist);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_all_balances::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t} else if(_name == \"whitelist\") {\n\t\t_value.to(whitelist);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_all_balances& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_all_balances& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_all_balances::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_all_balances::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_all_balances\";\n\ttype_code->type_hash = vnx::Hash64(0xe099ac5aea49433ull);\n\ttype_code->code_hash = vnx::Hash64(0x4a545872440ce967ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_all_balances);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_all_balances>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_all_balances_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"whitelist\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_all_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.whitelist, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_all_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_all_balances;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_all_balances>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.limit);\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.whitelist, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_all_balances& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_all_balances& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_all_balances& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_all_balances_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_all_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_all_balances_return::VNX_TYPE_HASH(0x80800e710295b3c1ull);\nconst vnx::Hash64 Node_get_all_balances_return::VNX_CODE_HASH(0x1458e4d3d10c2c64ull);\n\nvnx::Hash64 Node_get_all_balances_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_all_balances_return::get_type_name() const {\n\treturn \"mmx.Node.get_all_balances.return\";\n}\n\nconst vnx::TypeCode* Node_get_all_balances_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_all_balances_return;\n}\n\nstd::shared_ptr<Node_get_all_balances_return> Node_get_all_balances_return::create() {\n\treturn std::make_shared<Node_get_all_balances_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_all_balances_return::clone() const {\n\treturn std::make_shared<Node_get_all_balances_return>(*this);\n}\n\nvoid Node_get_all_balances_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_all_balances_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_all_balances_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_all_balances_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_all_balances_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_all_balances.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_all_balances_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_all_balances_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_all_balances.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_all_balances_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_all_balances_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_all_balances_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_all_balances_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_all_balances_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_all_balances_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_all_balances_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_all_balances.return\";\n\ttype_code->type_hash = vnx::Hash64(0x80800e710295b3c1ull);\n\ttype_code->code_hash = vnx::Hash64(0x1458e4d3d10c2c64ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_all_balances_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_all_balances_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 12, 23, 2, 4, 7, 11, 32, 1, 11, 32, 1, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_all_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_all_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_all_balances_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_all_balances_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_all_balances_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_all_balances_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_all_balances_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_balance.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_balance.hxx>\n#include <mmx/Node_get_balance_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_balance::VNX_TYPE_HASH(0x2e00172d0470479ull);\nconst vnx::Hash64 Node_get_balance::VNX_CODE_HASH(0x602c957f083c231eull);\n\nvnx::Hash64 Node_get_balance::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_balance::get_type_name() const {\n\treturn \"mmx.Node.get_balance\";\n}\n\nconst vnx::TypeCode* Node_get_balance::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_balance;\n}\n\nstd::shared_ptr<Node_get_balance> Node_get_balance::create() {\n\treturn std::make_shared<Node_get_balance>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_balance::clone() const {\n\treturn std::make_shared<Node_get_balance>(*this);\n}\n\nvoid Node_get_balance::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_balance::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_balance::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_balance;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, currency);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_balance::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_balance\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \"}\";\n}\n\nvoid Node_get_balance::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_balance::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_balance\";\n\t_object[\"address\"] = address;\n\t_object[\"currency\"] = currency;\n\treturn _object;\n}\n\nvoid Node_get_balance::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_balance::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_balance::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_balance& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_balance& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_balance::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_balance::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_balance\";\n\ttype_code->type_hash = vnx::Hash64(0x2e00172d0470479ull);\n\ttype_code->code_hash = vnx::Hash64(0x602c957f083c231eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_balance);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_balance>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_balance_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_balance;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_balance>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.currency, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_balance& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_balance& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_balance& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_balance_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_balance_return.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_balance_return::VNX_TYPE_HASH(0xe29d98f8f1ab3e21ull);\nconst vnx::Hash64 Node_get_balance_return::VNX_CODE_HASH(0x9fbe383c7e960d4aull);\n\nvnx::Hash64 Node_get_balance_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_balance_return::get_type_name() const {\n\treturn \"mmx.Node.get_balance.return\";\n}\n\nconst vnx::TypeCode* Node_get_balance_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_balance_return;\n}\n\nstd::shared_ptr<Node_get_balance_return> Node_get_balance_return::create() {\n\treturn std::make_shared<Node_get_balance_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_balance_return::clone() const {\n\treturn std::make_shared<Node_get_balance_return>(*this);\n}\n\nvoid Node_get_balance_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_balance_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_balance_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_balance_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_balance_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_balance.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_balance_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_balance_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_balance.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_balance_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_balance_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_balance_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_balance_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_balance_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_balance_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_balance_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_balance.return\";\n\ttype_code->type_hash = vnx::Hash64(0xe29d98f8f1ab3e21ull);\n\ttype_code->code_hash = vnx::Hash64(0x9fbe383c7e960d4aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_balance_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_balance_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_balance_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_balance_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_balance_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_balance_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_balance_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_balances.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_balances.hxx>\n#include <mmx/Node_get_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_balances::VNX_TYPE_HASH(0x1c8af02c41e96460ull);\nconst vnx::Hash64 Node_get_balances::VNX_CODE_HASH(0x59617d62fbeb0b88ull);\n\nvnx::Hash64 Node_get_balances::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_balances::get_type_name() const {\n\treturn \"mmx.Node.get_balances\";\n}\n\nconst vnx::TypeCode* Node_get_balances::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_balances;\n}\n\nstd::shared_ptr<Node_get_balances> Node_get_balances::create() {\n\treturn std::make_shared<Node_get_balances>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_balances::clone() const {\n\treturn std::make_shared<Node_get_balances>(*this);\n}\n\nvoid Node_get_balances::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_balances::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_balances::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_balances;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, whitelist);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, limit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_balances::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_balances\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"whitelist\\\": \"; vnx::write(_out, whitelist);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \"}\";\n}\n\nvoid Node_get_balances::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_balances::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_balances\";\n\t_object[\"address\"] = address;\n\t_object[\"whitelist\"] = whitelist;\n\t_object[\"limit\"] = limit;\n\treturn _object;\n}\n\nvoid Node_get_balances::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"whitelist\") {\n\t\t\t_entry.second.to(whitelist);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_balances::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"whitelist\") {\n\t\treturn vnx::Variant(whitelist);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_balances::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"whitelist\") {\n\t\t_value.to(whitelist);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_balances& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_balances& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_balances::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_balances::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_balances\";\n\ttype_code->type_hash = vnx::Hash64(0x1c8af02c41e96460ull);\n\ttype_code->code_hash = vnx::Hash64(0x59617d62fbeb0b88ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_balances);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_balances>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_balances_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"whitelist\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.whitelist, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_balances;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_balances>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.limit);\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.whitelist, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_balances& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_balances& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_balances& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_balances_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_balances_return::VNX_TYPE_HASH(0x1e00f02ae6304cf0ull);\nconst vnx::Hash64 Node_get_balances_return::VNX_CODE_HASH(0xb7eab443c12e8da1ull);\n\nvnx::Hash64 Node_get_balances_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_balances_return::get_type_name() const {\n\treturn \"mmx.Node.get_balances.return\";\n}\n\nconst vnx::TypeCode* Node_get_balances_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_balances_return;\n}\n\nstd::shared_ptr<Node_get_balances_return> Node_get_balances_return::create() {\n\treturn std::make_shared<Node_get_balances_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_balances_return::clone() const {\n\treturn std::make_shared<Node_get_balances_return>(*this);\n}\n\nvoid Node_get_balances_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_balances_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_balances_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_balances_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_balances_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_balances.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_balances_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_balances_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_balances.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_balances_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_balances_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_balances_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_balances_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_balances_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_balances_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_balances_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_balances.return\";\n\ttype_code->type_hash = vnx::Hash64(0x1e00f02ae6304cf0ull);\n\ttype_code->code_hash = vnx::Hash64(0xb7eab443c12e8da1ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_balances_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_balances_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 5, 11, 32, 1, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_balances_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_balances_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_balances_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_balances_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_balances_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_block.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_block.hxx>\n#include <mmx/Node_get_block_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_block::VNX_TYPE_HASH(0xeb3fabe56dec161aull);\nconst vnx::Hash64 Node_get_block::VNX_CODE_HASH(0x98f014c6378b9296ull);\n\nvnx::Hash64 Node_get_block::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_block::get_type_name() const {\n\treturn \"mmx.Node.get_block\";\n}\n\nconst vnx::TypeCode* Node_get_block::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_block;\n}\n\nstd::shared_ptr<Node_get_block> Node_get_block::create() {\n\treturn std::make_shared<Node_get_block>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_block::clone() const {\n\treturn std::make_shared<Node_get_block>(*this);\n}\n\nvoid Node_get_block::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_block::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_block::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_block;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, hash);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_block::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_block\\\"\";\n\t_out << \", \\\"hash\\\": \"; vnx::write(_out, hash);\n\t_out << \"}\";\n}\n\nvoid Node_get_block::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_block::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_block\";\n\t_object[\"hash\"] = hash;\n\treturn _object;\n}\n\nvoid Node_get_block::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"hash\") {\n\t\t\t_entry.second.to(hash);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_block::get_field(const std::string& _name) const {\n\tif(_name == \"hash\") {\n\t\treturn vnx::Variant(hash);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_block::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"hash\") {\n\t\t_value.to(hash);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_block& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_block& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_block::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_block::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_block\";\n\ttype_code->type_hash = vnx::Hash64(0xeb3fabe56dec161aull);\n\ttype_code->code_hash = vnx::Hash64(0x98f014c6378b9296ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_block);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_block>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_block_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_block& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_block& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_block;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_block>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.hash, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_block& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_block& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_block_at.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_block_at.hxx>\n#include <mmx/Node_get_block_at_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_block_at::VNX_TYPE_HASH(0xc69c9f876a00e48full);\nconst vnx::Hash64 Node_get_block_at::VNX_CODE_HASH(0x14763538443c364cull);\n\nvnx::Hash64 Node_get_block_at::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_block_at::get_type_name() const {\n\treturn \"mmx.Node.get_block_at\";\n}\n\nconst vnx::TypeCode* Node_get_block_at::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_block_at;\n}\n\nstd::shared_ptr<Node_get_block_at> Node_get_block_at::create() {\n\treturn std::make_shared<Node_get_block_at>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_block_at::clone() const {\n\treturn std::make_shared<Node_get_block_at>(*this);\n}\n\nvoid Node_get_block_at::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_block_at::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_block_at::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_block_at;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_block_at::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_block_at\\\"\";\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_get_block_at::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_block_at::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_block_at\";\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_get_block_at::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_block_at::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_block_at::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_block_at& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_block_at& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_block_at::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_block_at::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_block_at\";\n\ttype_code->type_hash = vnx::Hash64(0xc69c9f876a00e48full);\n\ttype_code->code_hash = vnx::Hash64(0x14763538443c364cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_block_at);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_block_at>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_block_at_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_block_at& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_at& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_block_at;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_block_at>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_block_at& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_block_at& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_at& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_block_at_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_block_at_return.hxx>\n#include <mmx/Block.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_block_at_return::VNX_TYPE_HASH(0x6e3c22a7391c5491ull);\nconst vnx::Hash64 Node_get_block_at_return::VNX_CODE_HASH(0x541af1ed8f1d70eeull);\n\nvnx::Hash64 Node_get_block_at_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_block_at_return::get_type_name() const {\n\treturn \"mmx.Node.get_block_at.return\";\n}\n\nconst vnx::TypeCode* Node_get_block_at_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_block_at_return;\n}\n\nstd::shared_ptr<Node_get_block_at_return> Node_get_block_at_return::create() {\n\treturn std::make_shared<Node_get_block_at_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_block_at_return::clone() const {\n\treturn std::make_shared<Node_get_block_at_return>(*this);\n}\n\nvoid Node_get_block_at_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_block_at_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_block_at_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_block_at_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_block_at_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_block_at.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_block_at_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_block_at_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_block_at.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_block_at_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_block_at_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_block_at_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_block_at_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_block_at_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_block_at_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_block_at_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_block_at.return\";\n\ttype_code->type_hash = vnx::Hash64(0x6e3c22a7391c5491ull);\n\ttype_code->code_hash = vnx::Hash64(0x541af1ed8f1d70eeull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_block_at_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_block_at_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_block_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_block_at_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_block_at_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_block_at_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_block_at_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_at_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_block_hash.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_block_hash.hxx>\n#include <mmx/Node_get_block_hash_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_block_hash::VNX_TYPE_HASH(0x43c5087066b73f38ull);\nconst vnx::Hash64 Node_get_block_hash::VNX_CODE_HASH(0xecdc9ef8cf113e98ull);\n\nvnx::Hash64 Node_get_block_hash::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_block_hash::get_type_name() const {\n\treturn \"mmx.Node.get_block_hash\";\n}\n\nconst vnx::TypeCode* Node_get_block_hash::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_block_hash;\n}\n\nstd::shared_ptr<Node_get_block_hash> Node_get_block_hash::create() {\n\treturn std::make_shared<Node_get_block_hash>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_block_hash::clone() const {\n\treturn std::make_shared<Node_get_block_hash>(*this);\n}\n\nvoid Node_get_block_hash::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_block_hash::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_block_hash::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_block_hash;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_block_hash::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_block_hash\\\"\";\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_get_block_hash::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_block_hash::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_block_hash\";\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_get_block_hash::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_block_hash::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_block_hash::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_block_hash& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_block_hash& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_block_hash::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_block_hash::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_block_hash\";\n\ttype_code->type_hash = vnx::Hash64(0x43c5087066b73f38ull);\n\ttype_code->code_hash = vnx::Hash64(0xecdc9ef8cf113e98ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_block_hash);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_block_hash>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_block_hash_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_block_hash& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_block_hash;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_block_hash>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_block_hash& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_block_hash& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_block_hash_ex.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_block_hash_ex.hxx>\n#include <mmx/Node_get_block_hash_ex_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_block_hash_ex::VNX_TYPE_HASH(0x6024ae54abca18cbull);\nconst vnx::Hash64 Node_get_block_hash_ex::VNX_CODE_HASH(0xbc6b607e8965d0a5ull);\n\nvnx::Hash64 Node_get_block_hash_ex::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_block_hash_ex::get_type_name() const {\n\treturn \"mmx.Node.get_block_hash_ex\";\n}\n\nconst vnx::TypeCode* Node_get_block_hash_ex::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_block_hash_ex;\n}\n\nstd::shared_ptr<Node_get_block_hash_ex> Node_get_block_hash_ex::create() {\n\treturn std::make_shared<Node_get_block_hash_ex>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_block_hash_ex::clone() const {\n\treturn std::make_shared<Node_get_block_hash_ex>(*this);\n}\n\nvoid Node_get_block_hash_ex::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_block_hash_ex::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_block_hash_ex::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_block_hash_ex;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_block_hash_ex::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_block_hash_ex\\\"\";\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_get_block_hash_ex::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_block_hash_ex::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_block_hash_ex\";\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_get_block_hash_ex::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_block_hash_ex::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_block_hash_ex::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_block_hash_ex& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_block_hash_ex& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_block_hash_ex::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_block_hash_ex::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_block_hash_ex\";\n\ttype_code->type_hash = vnx::Hash64(0x6024ae54abca18cbull);\n\ttype_code->code_hash = vnx::Hash64(0xbc6b607e8965d0a5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_block_hash_ex);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_block_hash_ex>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_block_hash_ex_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_block_hash_ex& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash_ex& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_block_hash_ex;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_block_hash_ex>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_block_hash_ex& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_block_hash_ex& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash_ex& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_block_hash_ex_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_block_hash_ex_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_block_hash_ex_return::VNX_TYPE_HASH(0x8d82a7b11dfd7a4ull);\nconst vnx::Hash64 Node_get_block_hash_ex_return::VNX_CODE_HASH(0x7149243d306e1b87ull);\n\nvnx::Hash64 Node_get_block_hash_ex_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_block_hash_ex_return::get_type_name() const {\n\treturn \"mmx.Node.get_block_hash_ex.return\";\n}\n\nconst vnx::TypeCode* Node_get_block_hash_ex_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_block_hash_ex_return;\n}\n\nstd::shared_ptr<Node_get_block_hash_ex_return> Node_get_block_hash_ex_return::create() {\n\treturn std::make_shared<Node_get_block_hash_ex_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_block_hash_ex_return::clone() const {\n\treturn std::make_shared<Node_get_block_hash_ex_return>(*this);\n}\n\nvoid Node_get_block_hash_ex_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_block_hash_ex_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_block_hash_ex_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_block_hash_ex_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_block_hash_ex_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_block_hash_ex.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_block_hash_ex_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_block_hash_ex_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_block_hash_ex.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_block_hash_ex_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_block_hash_ex_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_block_hash_ex_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_block_hash_ex_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_block_hash_ex_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_block_hash_ex_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_block_hash_ex_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_block_hash_ex.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8d82a7b11dfd7a4ull);\n\ttype_code->code_hash = vnx::Hash64(0x7149243d306e1b87ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_block_hash_ex_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_block_hash_ex_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {33, 23, 2, 4, 7, 11, 32, 1, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_block_hash_ex_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash_ex_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_block_hash_ex_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_block_hash_ex_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_block_hash_ex_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_block_hash_ex_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash_ex_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_block_hash_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_block_hash_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_block_hash_return::VNX_TYPE_HASH(0x47877c5597b978dfull);\nconst vnx::Hash64 Node_get_block_hash_return::VNX_CODE_HASH(0xe1654fd1b770769eull);\n\nvnx::Hash64 Node_get_block_hash_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_block_hash_return::get_type_name() const {\n\treturn \"mmx.Node.get_block_hash.return\";\n}\n\nconst vnx::TypeCode* Node_get_block_hash_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_block_hash_return;\n}\n\nstd::shared_ptr<Node_get_block_hash_return> Node_get_block_hash_return::create() {\n\treturn std::make_shared<Node_get_block_hash_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_block_hash_return::clone() const {\n\treturn std::make_shared<Node_get_block_hash_return>(*this);\n}\n\nvoid Node_get_block_hash_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_block_hash_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_block_hash_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_block_hash_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_block_hash_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_block_hash.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_block_hash_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_block_hash_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_block_hash.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_block_hash_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_block_hash_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_block_hash_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_block_hash_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_block_hash_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_block_hash_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_block_hash_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_block_hash.return\";\n\ttype_code->type_hash = vnx::Hash64(0x47877c5597b978dfull);\n\ttype_code->code_hash = vnx::Hash64(0xe1654fd1b770769eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_block_hash_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_block_hash_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_block_hash_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_hash_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_block_hash_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_block_hash_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_block_hash_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_block_hash_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_hash_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_block_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_block_return.hxx>\n#include <mmx/Block.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_block_return::VNX_TYPE_HASH(0x6d9abdbf20c4b4d2ull);\nconst vnx::Hash64 Node_get_block_return::VNX_CODE_HASH(0x3c4f375e2ec18519ull);\n\nvnx::Hash64 Node_get_block_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_block_return::get_type_name() const {\n\treturn \"mmx.Node.get_block.return\";\n}\n\nconst vnx::TypeCode* Node_get_block_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_block_return;\n}\n\nstd::shared_ptr<Node_get_block_return> Node_get_block_return::create() {\n\treturn std::make_shared<Node_get_block_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_block_return::clone() const {\n\treturn std::make_shared<Node_get_block_return>(*this);\n}\n\nvoid Node_get_block_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_block_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_block_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_block_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_block_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_block.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_block_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_block_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_block.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_block_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_block_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_block_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_block_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_block_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_block_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_block_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_block.return\";\n\ttype_code->type_hash = vnx::Hash64(0x6d9abdbf20c4b4d2ull);\n\ttype_code->code_hash = vnx::Hash64(0x3c4f375e2ec18519ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_block_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_block_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_block_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_block_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_block_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_block_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_block_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contract.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contract.hxx>\n#include <mmx/Node_get_contract_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contract::VNX_TYPE_HASH(0xa28704c65a67a293ull);\nconst vnx::Hash64 Node_get_contract::VNX_CODE_HASH(0x90eece2458f6c3aaull);\n\nvnx::Hash64 Node_get_contract::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contract::get_type_name() const {\n\treturn \"mmx.Node.get_contract\";\n}\n\nconst vnx::TypeCode* Node_get_contract::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contract;\n}\n\nstd::shared_ptr<Node_get_contract> Node_get_contract::create() {\n\treturn std::make_shared<Node_get_contract>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contract::clone() const {\n\treturn std::make_shared<Node_get_contract>(*this);\n}\n\nvoid Node_get_contract::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contract::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contract::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contract;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contract::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contract\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Node_get_contract::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contract::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contract\";\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Node_get_contract::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contract::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contract::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contract& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contract& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contract::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contract::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contract\";\n\ttype_code->type_hash = vnx::Hash64(0xa28704c65a67a293ull);\n\ttype_code->code_hash = vnx::Hash64(0x90eece2458f6c3aaull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contract);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contract>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_contract_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contract& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contract;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contract>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contract& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contract& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contract_balances.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contract_balances.hxx>\n#include <mmx/Node_get_contract_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contract_balances::VNX_TYPE_HASH(0xeb1e66155927b13aull);\nconst vnx::Hash64 Node_get_contract_balances::VNX_CODE_HASH(0x4b1dcdad815b80d4ull);\n\nvnx::Hash64 Node_get_contract_balances::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contract_balances::get_type_name() const {\n\treturn \"mmx.Node.get_contract_balances\";\n}\n\nconst vnx::TypeCode* Node_get_contract_balances::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contract_balances;\n}\n\nstd::shared_ptr<Node_get_contract_balances> Node_get_contract_balances::create() {\n\treturn std::make_shared<Node_get_contract_balances>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contract_balances::clone() const {\n\treturn std::make_shared<Node_get_contract_balances>(*this);\n}\n\nvoid Node_get_contract_balances::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contract_balances::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contract_balances::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contract_balances;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, whitelist);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, limit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contract_balances::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contract_balances\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"whitelist\\\": \"; vnx::write(_out, whitelist);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \"}\";\n}\n\nvoid Node_get_contract_balances::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contract_balances::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contract_balances\";\n\t_object[\"address\"] = address;\n\t_object[\"whitelist\"] = whitelist;\n\t_object[\"limit\"] = limit;\n\treturn _object;\n}\n\nvoid Node_get_contract_balances::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"whitelist\") {\n\t\t\t_entry.second.to(whitelist);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contract_balances::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"whitelist\") {\n\t\treturn vnx::Variant(whitelist);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contract_balances::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"whitelist\") {\n\t\t_value.to(whitelist);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contract_balances& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contract_balances& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contract_balances::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contract_balances::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contract_balances\";\n\ttype_code->type_hash = vnx::Hash64(0xeb1e66155927b13aull);\n\ttype_code->code_hash = vnx::Hash64(0x4b1dcdad815b80d4ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contract_balances);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contract_balances>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_contract_balances_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"whitelist\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.whitelist, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contract_balances;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contract_balances>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.limit);\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.whitelist, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contract_balances& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contract_balances& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_balances& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contract_balances_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contract_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contract_balances_return::VNX_TYPE_HASH(0x4974c6093398e264ull);\nconst vnx::Hash64 Node_get_contract_balances_return::VNX_CODE_HASH(0x58929f206c4bc64eull);\n\nvnx::Hash64 Node_get_contract_balances_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contract_balances_return::get_type_name() const {\n\treturn \"mmx.Node.get_contract_balances.return\";\n}\n\nconst vnx::TypeCode* Node_get_contract_balances_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contract_balances_return;\n}\n\nstd::shared_ptr<Node_get_contract_balances_return> Node_get_contract_balances_return::create() {\n\treturn std::make_shared<Node_get_contract_balances_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contract_balances_return::clone() const {\n\treturn std::make_shared<Node_get_contract_balances_return>(*this);\n}\n\nvoid Node_get_contract_balances_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contract_balances_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contract_balances_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contract_balances_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contract_balances_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contract_balances.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_contract_balances_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contract_balances_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contract_balances.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_contract_balances_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contract_balances_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contract_balances_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contract_balances_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contract_balances_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contract_balances_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contract_balances_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contract_balances.return\";\n\ttype_code->type_hash = vnx::Hash64(0x4974c6093398e264ull);\n\ttype_code->code_hash = vnx::Hash64(0x58929f206c4bc64eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contract_balances_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contract_balances_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::balance_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 5, 11, 32, 1, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contract_balances_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contract_balances_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contract_balances_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contract_balances_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_balances_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contract_for.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contract_for.hxx>\n#include <mmx/Node_get_contract_for_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contract_for::VNX_TYPE_HASH(0x6a953dcea83b9832ull);\nconst vnx::Hash64 Node_get_contract_for::VNX_CODE_HASH(0x13ce713d9592bfb0ull);\n\nvnx::Hash64 Node_get_contract_for::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contract_for::get_type_name() const {\n\treturn \"mmx.Node.get_contract_for\";\n}\n\nconst vnx::TypeCode* Node_get_contract_for::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contract_for;\n}\n\nstd::shared_ptr<Node_get_contract_for> Node_get_contract_for::create() {\n\treturn std::make_shared<Node_get_contract_for>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contract_for::clone() const {\n\treturn std::make_shared<Node_get_contract_for>(*this);\n}\n\nvoid Node_get_contract_for::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contract_for::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contract_for::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contract_for;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contract_for::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contract_for\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Node_get_contract_for::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contract_for::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contract_for\";\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Node_get_contract_for::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contract_for::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contract_for::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contract_for& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contract_for& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contract_for::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contract_for::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contract_for\";\n\ttype_code->type_hash = vnx::Hash64(0x6a953dcea83b9832ull);\n\ttype_code->code_hash = vnx::Hash64(0x13ce713d9592bfb0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contract_for);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contract_for>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_contract_for_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contract_for& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract_for& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contract_for;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contract_for>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contract_for& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contract_for& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_for& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contract_for_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contract_for_return.hxx>\n#include <mmx/Contract.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contract_for_return::VNX_TYPE_HASH(0xde97319367a6d647ull);\nconst vnx::Hash64 Node_get_contract_for_return::VNX_CODE_HASH(0x49bb2d66b673b330ull);\n\nvnx::Hash64 Node_get_contract_for_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contract_for_return::get_type_name() const {\n\treturn \"mmx.Node.get_contract_for.return\";\n}\n\nconst vnx::TypeCode* Node_get_contract_for_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contract_for_return;\n}\n\nstd::shared_ptr<Node_get_contract_for_return> Node_get_contract_for_return::create() {\n\treturn std::make_shared<Node_get_contract_for_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contract_for_return::clone() const {\n\treturn std::make_shared<Node_get_contract_for_return>(*this);\n}\n\nvoid Node_get_contract_for_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contract_for_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contract_for_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contract_for_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contract_for_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contract_for.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_contract_for_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contract_for_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contract_for.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_contract_for_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contract_for_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contract_for_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contract_for_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contract_for_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contract_for_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contract_for_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contract_for.return\";\n\ttype_code->type_hash = vnx::Hash64(0xde97319367a6d647ull);\n\ttype_code->code_hash = vnx::Hash64(0x49bb2d66b673b330ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contract_for_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contract_for_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contract_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contract_for_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contract_for_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contract_for_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contract_for_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_for_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contract_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contract_return.hxx>\n#include <mmx/Contract.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contract_return::VNX_TYPE_HASH(0x314d0901de362f8cull);\nconst vnx::Hash64 Node_get_contract_return::VNX_CODE_HASH(0x7fe622a32db785feull);\n\nvnx::Hash64 Node_get_contract_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contract_return::get_type_name() const {\n\treturn \"mmx.Node.get_contract.return\";\n}\n\nconst vnx::TypeCode* Node_get_contract_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contract_return;\n}\n\nstd::shared_ptr<Node_get_contract_return> Node_get_contract_return::create() {\n\treturn std::make_shared<Node_get_contract_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contract_return::clone() const {\n\treturn std::make_shared<Node_get_contract_return>(*this);\n}\n\nvoid Node_get_contract_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contract_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contract_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contract_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contract_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contract.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_contract_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contract_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contract.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_contract_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contract_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contract_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contract_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contract_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contract_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contract_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contract.return\";\n\ttype_code->type_hash = vnx::Hash64(0x314d0901de362f8cull);\n\ttype_code->code_hash = vnx::Hash64(0x7fe622a32db785feull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contract_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contract_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contract_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contract_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contract_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contract_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contract_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contract_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contract_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contracts.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contracts.hxx>\n#include <mmx/Node_get_contracts_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contracts::VNX_TYPE_HASH(0x49e218583c1f1c8aull);\nconst vnx::Hash64 Node_get_contracts::VNX_CODE_HASH(0x2bb16bda13254959ull);\n\nvnx::Hash64 Node_get_contracts::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contracts::get_type_name() const {\n\treturn \"mmx.Node.get_contracts\";\n}\n\nconst vnx::TypeCode* Node_get_contracts::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contracts;\n}\n\nstd::shared_ptr<Node_get_contracts> Node_get_contracts::create() {\n\treturn std::make_shared<Node_get_contracts>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contracts::clone() const {\n\treturn std::make_shared<Node_get_contracts>(*this);\n}\n\nvoid Node_get_contracts::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contracts;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contracts::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contracts\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \"}\";\n}\n\nvoid Node_get_contracts::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contracts::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contracts\";\n\t_object[\"addresses\"] = addresses;\n\treturn _object;\n}\n\nvoid Node_get_contracts::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contracts::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contracts::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contracts& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contracts& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contracts::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contracts::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contracts\";\n\ttype_code->type_hash = vnx::Hash64(0x49e218583c1f1c8aull);\n\ttype_code->code_hash = vnx::Hash64(0x2bb16bda13254959ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contracts);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contracts>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_contracts_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contracts& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contracts;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contracts>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contracts& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contracts_by.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contracts_by.hxx>\n#include <mmx/Node_get_contracts_by_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contracts_by::VNX_TYPE_HASH(0xe7c397362a63f57cull);\nconst vnx::Hash64 Node_get_contracts_by::VNX_CODE_HASH(0xedce701da3cb498ull);\n\nvnx::Hash64 Node_get_contracts_by::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contracts_by::get_type_name() const {\n\treturn \"mmx.Node.get_contracts_by\";\n}\n\nconst vnx::TypeCode* Node_get_contracts_by::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contracts_by;\n}\n\nstd::shared_ptr<Node_get_contracts_by> Node_get_contracts_by::create() {\n\treturn std::make_shared<Node_get_contracts_by>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contracts_by::clone() const {\n\treturn std::make_shared<Node_get_contracts_by>(*this);\n}\n\nvoid Node_get_contracts_by::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts_by::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts_by::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contracts_by;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, type_hash);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contracts_by::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contracts_by\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \", \\\"type_hash\\\": \"; vnx::write(_out, type_hash);\n\t_out << \"}\";\n}\n\nvoid Node_get_contracts_by::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contracts_by::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contracts_by\";\n\t_object[\"addresses\"] = addresses;\n\t_object[\"type_hash\"] = type_hash;\n\treturn _object;\n}\n\nvoid Node_get_contracts_by::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t} else if(_entry.first == \"type_hash\") {\n\t\t\t_entry.second.to(type_hash);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contracts_by::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\tif(_name == \"type_hash\") {\n\t\treturn vnx::Variant(type_hash);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contracts_by::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t} else if(_name == \"type_hash\") {\n\t\t_value.to(type_hash);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contracts_by& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contracts_by& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contracts_by::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contracts_by::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contracts_by\";\n\ttype_code->type_hash = vnx::Hash64(0xe7c397362a63f57cull);\n\ttype_code->code_hash = vnx::Hash64(0xedce701da3cb498ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contracts_by);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contracts_by>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_contracts_by_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type_hash\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contracts_by& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.type_hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_by& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contracts_by;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contracts_by>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.type_hash, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contracts_by& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts_by& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_by& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contracts_by_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contracts_by_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contracts_by_return::VNX_TYPE_HASH(0x9ad1099f1adf2565ull);\nconst vnx::Hash64 Node_get_contracts_by_return::VNX_CODE_HASH(0xe941428eb0174d80ull);\n\nvnx::Hash64 Node_get_contracts_by_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contracts_by_return::get_type_name() const {\n\treturn \"mmx.Node.get_contracts_by.return\";\n}\n\nconst vnx::TypeCode* Node_get_contracts_by_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contracts_by_return;\n}\n\nstd::shared_ptr<Node_get_contracts_by_return> Node_get_contracts_by_return::create() {\n\treturn std::make_shared<Node_get_contracts_by_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contracts_by_return::clone() const {\n\treturn std::make_shared<Node_get_contracts_by_return>(*this);\n}\n\nvoid Node_get_contracts_by_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts_by_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts_by_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contracts_by_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contracts_by_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contracts_by.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_contracts_by_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contracts_by_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contracts_by.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_contracts_by_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contracts_by_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contracts_by_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contracts_by_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contracts_by_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contracts_by_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contracts_by_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contracts_by.return\";\n\ttype_code->type_hash = vnx::Hash64(0x9ad1099f1adf2565ull);\n\ttype_code->code_hash = vnx::Hash64(0xe941428eb0174d80ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contracts_by_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contracts_by_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contracts_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contracts_by_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contracts_by_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contracts_by_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts_by_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_by_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contracts_owned_by.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contracts_owned_by.hxx>\n#include <mmx/Node_get_contracts_owned_by_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contracts_owned_by::VNX_TYPE_HASH(0x63989a04fee2fba4ull);\nconst vnx::Hash64 Node_get_contracts_owned_by::VNX_CODE_HASH(0xaa522ba8023d6d2dull);\n\nvnx::Hash64 Node_get_contracts_owned_by::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contracts_owned_by::get_type_name() const {\n\treturn \"mmx.Node.get_contracts_owned_by\";\n}\n\nconst vnx::TypeCode* Node_get_contracts_owned_by::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contracts_owned_by;\n}\n\nstd::shared_ptr<Node_get_contracts_owned_by> Node_get_contracts_owned_by::create() {\n\treturn std::make_shared<Node_get_contracts_owned_by>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contracts_owned_by::clone() const {\n\treturn std::make_shared<Node_get_contracts_owned_by>(*this);\n}\n\nvoid Node_get_contracts_owned_by::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts_owned_by::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts_owned_by::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contracts_owned_by;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, type_hash);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contracts_owned_by::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contracts_owned_by\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \", \\\"type_hash\\\": \"; vnx::write(_out, type_hash);\n\t_out << \"}\";\n}\n\nvoid Node_get_contracts_owned_by::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contracts_owned_by::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contracts_owned_by\";\n\t_object[\"addresses\"] = addresses;\n\t_object[\"type_hash\"] = type_hash;\n\treturn _object;\n}\n\nvoid Node_get_contracts_owned_by::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t} else if(_entry.first == \"type_hash\") {\n\t\t\t_entry.second.to(type_hash);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contracts_owned_by::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\tif(_name == \"type_hash\") {\n\t\treturn vnx::Variant(type_hash);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contracts_owned_by::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t} else if(_name == \"type_hash\") {\n\t\t_value.to(type_hash);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contracts_owned_by& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contracts_owned_by& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contracts_owned_by::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contracts_owned_by::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contracts_owned_by\";\n\ttype_code->type_hash = vnx::Hash64(0x63989a04fee2fba4ull);\n\ttype_code->code_hash = vnx::Hash64(0xaa522ba8023d6d2dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contracts_owned_by);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contracts_owned_by>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_contracts_owned_by_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type_hash\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contracts_owned_by& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.type_hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_owned_by& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contracts_owned_by;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contracts_owned_by>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.type_hash, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contracts_owned_by& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts_owned_by& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_owned_by& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contracts_owned_by_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contracts_owned_by_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contracts_owned_by_return::VNX_TYPE_HASH(0x3b9dbec85ee482bfull);\nconst vnx::Hash64 Node_get_contracts_owned_by_return::VNX_CODE_HASH(0x45e72fce6f12a876ull);\n\nvnx::Hash64 Node_get_contracts_owned_by_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contracts_owned_by_return::get_type_name() const {\n\treturn \"mmx.Node.get_contracts_owned_by.return\";\n}\n\nconst vnx::TypeCode* Node_get_contracts_owned_by_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contracts_owned_by_return;\n}\n\nstd::shared_ptr<Node_get_contracts_owned_by_return> Node_get_contracts_owned_by_return::create() {\n\treturn std::make_shared<Node_get_contracts_owned_by_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contracts_owned_by_return::clone() const {\n\treturn std::make_shared<Node_get_contracts_owned_by_return>(*this);\n}\n\nvoid Node_get_contracts_owned_by_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts_owned_by_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts_owned_by_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contracts_owned_by_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contracts_owned_by_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contracts_owned_by.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_contracts_owned_by_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contracts_owned_by_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contracts_owned_by.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_contracts_owned_by_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contracts_owned_by_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contracts_owned_by_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contracts_owned_by_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contracts_owned_by_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contracts_owned_by_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contracts_owned_by_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contracts_owned_by.return\";\n\ttype_code->type_hash = vnx::Hash64(0x3b9dbec85ee482bfull);\n\ttype_code->code_hash = vnx::Hash64(0x45e72fce6f12a876ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contracts_owned_by_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contracts_owned_by_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contracts_owned_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_owned_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contracts_owned_by_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contracts_owned_by_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contracts_owned_by_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts_owned_by_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_owned_by_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_contracts_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_contracts_return.hxx>\n#include <mmx/Contract.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_contracts_return::VNX_TYPE_HASH(0x13d73d6d69c8af0bull);\nconst vnx::Hash64 Node_get_contracts_return::VNX_CODE_HASH(0x533d930be83fb901ull);\n\nvnx::Hash64 Node_get_contracts_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_contracts_return::get_type_name() const {\n\treturn \"mmx.Node.get_contracts.return\";\n}\n\nconst vnx::TypeCode* Node_get_contracts_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_contracts_return;\n}\n\nstd::shared_ptr<Node_get_contracts_return> Node_get_contracts_return::create() {\n\treturn std::make_shared<Node_get_contracts_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_contracts_return::clone() const {\n\treturn std::make_shared<Node_get_contracts_return>(*this);\n}\n\nvoid Node_get_contracts_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_contracts_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_contracts_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_contracts_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_contracts.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_contracts_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_contracts_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_contracts.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_contracts_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_contracts_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_contracts_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_contracts_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_contracts_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_contracts_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_contracts_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_contracts.return\";\n\ttype_code->type_hash = vnx::Hash64(0x13d73d6d69c8af0bull);\n\ttype_code->code_hash = vnx::Hash64(0x533d930be83fb901ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_contracts_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_contracts_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_contracts_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_contracts_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_contracts_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_contracts_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_contracts_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_exec_history.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_exec_history.hxx>\n#include <mmx/Node_get_exec_history_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_exec_history::VNX_TYPE_HASH(0xf17c2f67bedb9df6ull);\nconst vnx::Hash64 Node_get_exec_history::VNX_CODE_HASH(0xa0daf9cb8db71849ull);\n\nvnx::Hash64 Node_get_exec_history::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_exec_history::get_type_name() const {\n\treturn \"mmx.Node.get_exec_history\";\n}\n\nconst vnx::TypeCode* Node_get_exec_history::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_exec_history;\n}\n\nstd::shared_ptr<Node_get_exec_history> Node_get_exec_history::create() {\n\treturn std::make_shared<Node_get_exec_history>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_exec_history::clone() const {\n\treturn std::make_shared<Node_get_exec_history>(*this);\n}\n\nvoid Node_get_exec_history::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_exec_history::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_exec_history::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_exec_history;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, limit);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, recent);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_exec_history::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_exec_history\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \", \\\"recent\\\": \"; vnx::write(_out, recent);\n\t_out << \"}\";\n}\n\nvoid Node_get_exec_history::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_exec_history::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_exec_history\";\n\t_object[\"address\"] = address;\n\t_object[\"limit\"] = limit;\n\t_object[\"recent\"] = recent;\n\treturn _object;\n}\n\nvoid Node_get_exec_history::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"recent\") {\n\t\t\t_entry.second.to(recent);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_exec_history::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\tif(_name == \"recent\") {\n\t\treturn vnx::Variant(recent);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_exec_history::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t} else if(_name == \"recent\") {\n\t\t_value.to(recent);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_exec_history& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_exec_history& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_exec_history::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_exec_history::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_exec_history\";\n\ttype_code->type_hash = vnx::Hash64(0xf17c2f67bedb9df6ull);\n\ttype_code->code_hash = vnx::Hash64(0xa0daf9cb8db71849ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_exec_history);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_exec_history>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_exec_history_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"recent\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_exec_history& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.recent, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_exec_history& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_exec_history;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_exec_history>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(5);\n\tvnx::write_value(_buf + 0, value.limit);\n\tvnx::write_value(_buf + 4, value.recent);\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_exec_history& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_exec_history& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_exec_history& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_exec_history_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_exec_history_return.hxx>\n#include <mmx/exec_entry_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_exec_history_return::VNX_TYPE_HASH(0x17079d265ede8785ull);\nconst vnx::Hash64 Node_get_exec_history_return::VNX_CODE_HASH(0xee63e8a91963ce51ull);\n\nvnx::Hash64 Node_get_exec_history_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_exec_history_return::get_type_name() const {\n\treturn \"mmx.Node.get_exec_history.return\";\n}\n\nconst vnx::TypeCode* Node_get_exec_history_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_exec_history_return;\n}\n\nstd::shared_ptr<Node_get_exec_history_return> Node_get_exec_history_return::create() {\n\treturn std::make_shared<Node_get_exec_history_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_exec_history_return::clone() const {\n\treturn std::make_shared<Node_get_exec_history_return>(*this);\n}\n\nvoid Node_get_exec_history_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_exec_history_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_exec_history_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_exec_history_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_exec_history_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_exec_history.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_exec_history_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_exec_history_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_exec_history.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_exec_history_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_exec_history_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_exec_history_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_exec_history_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_exec_history_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_exec_history_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_exec_history_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_exec_history.return\";\n\ttype_code->type_hash = vnx::Hash64(0x17079d265ede8785ull);\n\ttype_code->code_hash = vnx::Hash64(0xee63e8a91963ce51ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_exec_history_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_exec_history_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::exec_entry_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_exec_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_exec_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_exec_history_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_exec_history_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_exec_history_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_exec_history_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_exec_history_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_farmed_block_summary.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_farmed_block_summary.hxx>\n#include <mmx/Node_get_farmed_block_summary_return.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_farmed_block_summary::VNX_TYPE_HASH(0xa6cda1247bd4f537ull);\nconst vnx::Hash64 Node_get_farmed_block_summary::VNX_CODE_HASH(0x260bc08d7455f24aull);\n\nvnx::Hash64 Node_get_farmed_block_summary::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_farmed_block_summary::get_type_name() const {\n\treturn \"mmx.Node.get_farmed_block_summary\";\n}\n\nconst vnx::TypeCode* Node_get_farmed_block_summary::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_farmed_block_summary;\n}\n\nstd::shared_ptr<Node_get_farmed_block_summary> Node_get_farmed_block_summary::create() {\n\treturn std::make_shared<Node_get_farmed_block_summary>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_farmed_block_summary::clone() const {\n\treturn std::make_shared<Node_get_farmed_block_summary>(*this);\n}\n\nvoid Node_get_farmed_block_summary::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_farmed_block_summary::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_farmed_block_summary::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_farmed_block_summary;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, farmer_keys);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, since);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_farmed_block_summary::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_farmed_block_summary\\\"\";\n\t_out << \", \\\"farmer_keys\\\": \"; vnx::write(_out, farmer_keys);\n\t_out << \", \\\"since\\\": \"; vnx::write(_out, since);\n\t_out << \"}\";\n}\n\nvoid Node_get_farmed_block_summary::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_farmed_block_summary::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_farmed_block_summary\";\n\t_object[\"farmer_keys\"] = farmer_keys;\n\t_object[\"since\"] = since;\n\treturn _object;\n}\n\nvoid Node_get_farmed_block_summary::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"farmer_keys\") {\n\t\t\t_entry.second.to(farmer_keys);\n\t\t} else if(_entry.first == \"since\") {\n\t\t\t_entry.second.to(since);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_farmed_block_summary::get_field(const std::string& _name) const {\n\tif(_name == \"farmer_keys\") {\n\t\treturn vnx::Variant(farmer_keys);\n\t}\n\tif(_name == \"since\") {\n\t\treturn vnx::Variant(since);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_farmed_block_summary::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"farmer_keys\") {\n\t\t_value.to(farmer_keys);\n\t} else if(_name == \"since\") {\n\t\t_value.to(since);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_farmed_block_summary& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_farmed_block_summary& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_farmed_block_summary::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_farmed_block_summary::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_farmed_block_summary\";\n\ttype_code->type_hash = vnx::Hash64(0xa6cda1247bd4f537ull);\n\ttype_code->code_hash = vnx::Hash64(0x260bc08d7455f24aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_farmed_block_summary);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_farmed_block_summary>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_farmed_block_summary_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_keys\";\n\t\tfield.code = {12, 11, 33, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"since\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_farmed_block_summary& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.since, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.farmer_keys, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_block_summary& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_farmed_block_summary;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_farmed_block_summary>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.since);\n\tvnx::write(out, value.farmer_keys, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_farmed_block_summary& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_farmed_block_summary& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_block_summary& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_farmed_block_summary_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_farmed_block_summary_return.hxx>\n#include <mmx/farmed_block_summary_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_farmed_block_summary_return::VNX_TYPE_HASH(0xef3dcd5d4d2a58e3ull);\nconst vnx::Hash64 Node_get_farmed_block_summary_return::VNX_CODE_HASH(0xbf8a9578cfe585faull);\n\nvnx::Hash64 Node_get_farmed_block_summary_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_farmed_block_summary_return::get_type_name() const {\n\treturn \"mmx.Node.get_farmed_block_summary.return\";\n}\n\nconst vnx::TypeCode* Node_get_farmed_block_summary_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_farmed_block_summary_return;\n}\n\nstd::shared_ptr<Node_get_farmed_block_summary_return> Node_get_farmed_block_summary_return::create() {\n\treturn std::make_shared<Node_get_farmed_block_summary_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_farmed_block_summary_return::clone() const {\n\treturn std::make_shared<Node_get_farmed_block_summary_return>(*this);\n}\n\nvoid Node_get_farmed_block_summary_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_farmed_block_summary_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_farmed_block_summary_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_farmed_block_summary_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_farmed_block_summary_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_farmed_block_summary.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_farmed_block_summary_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_farmed_block_summary_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_farmed_block_summary.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_farmed_block_summary_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_farmed_block_summary_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_farmed_block_summary_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_farmed_block_summary_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_farmed_block_summary_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_farmed_block_summary_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_farmed_block_summary_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_farmed_block_summary.return\";\n\ttype_code->type_hash = vnx::Hash64(0xef3dcd5d4d2a58e3ull);\n\ttype_code->code_hash = vnx::Hash64(0xbf8a9578cfe585faull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_farmed_block_summary_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_farmed_block_summary_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::farmed_block_summary_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_farmed_block_summary_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_block_summary_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_farmed_block_summary_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_farmed_block_summary_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_farmed_block_summary_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_farmed_block_summary_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_block_summary_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_farmed_blocks.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_farmed_blocks.hxx>\n#include <mmx/Node_get_farmed_blocks_return.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_farmed_blocks::VNX_TYPE_HASH(0xfc412d06ff25542eull);\nconst vnx::Hash64 Node_get_farmed_blocks::VNX_CODE_HASH(0x892cc978e87809c9ull);\n\nvnx::Hash64 Node_get_farmed_blocks::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_farmed_blocks::get_type_name() const {\n\treturn \"mmx.Node.get_farmed_blocks\";\n}\n\nconst vnx::TypeCode* Node_get_farmed_blocks::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_farmed_blocks;\n}\n\nstd::shared_ptr<Node_get_farmed_blocks> Node_get_farmed_blocks::create() {\n\treturn std::make_shared<Node_get_farmed_blocks>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_farmed_blocks::clone() const {\n\treturn std::make_shared<Node_get_farmed_blocks>(*this);\n}\n\nvoid Node_get_farmed_blocks::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_farmed_blocks::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_farmed_blocks::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_farmed_blocks;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, farmer_keys);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, full_blocks);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, since);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, limit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_farmed_blocks::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_farmed_blocks\\\"\";\n\t_out << \", \\\"farmer_keys\\\": \"; vnx::write(_out, farmer_keys);\n\t_out << \", \\\"full_blocks\\\": \"; vnx::write(_out, full_blocks);\n\t_out << \", \\\"since\\\": \"; vnx::write(_out, since);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \"}\";\n}\n\nvoid Node_get_farmed_blocks::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_farmed_blocks::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_farmed_blocks\";\n\t_object[\"farmer_keys\"] = farmer_keys;\n\t_object[\"full_blocks\"] = full_blocks;\n\t_object[\"since\"] = since;\n\t_object[\"limit\"] = limit;\n\treturn _object;\n}\n\nvoid Node_get_farmed_blocks::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"farmer_keys\") {\n\t\t\t_entry.second.to(farmer_keys);\n\t\t} else if(_entry.first == \"full_blocks\") {\n\t\t\t_entry.second.to(full_blocks);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"since\") {\n\t\t\t_entry.second.to(since);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_farmed_blocks::get_field(const std::string& _name) const {\n\tif(_name == \"farmer_keys\") {\n\t\treturn vnx::Variant(farmer_keys);\n\t}\n\tif(_name == \"full_blocks\") {\n\t\treturn vnx::Variant(full_blocks);\n\t}\n\tif(_name == \"since\") {\n\t\treturn vnx::Variant(since);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_farmed_blocks::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"farmer_keys\") {\n\t\t_value.to(farmer_keys);\n\t} else if(_name == \"full_blocks\") {\n\t\t_value.to(full_blocks);\n\t} else if(_name == \"since\") {\n\t\t_value.to(since);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_farmed_blocks& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_farmed_blocks& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_farmed_blocks::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_farmed_blocks::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_farmed_blocks\";\n\ttype_code->type_hash = vnx::Hash64(0xfc412d06ff25542eull);\n\ttype_code->code_hash = vnx::Hash64(0x892cc978e87809c9ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_farmed_blocks);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_farmed_blocks>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_farmed_blocks_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_keys\";\n\t\tfield.code = {12, 11, 33, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"full_blocks\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"since\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_farmed_blocks& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.full_blocks, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.since, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.farmer_keys, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_blocks& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_farmed_blocks;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_farmed_blocks>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(9);\n\tvnx::write_value(_buf + 0, value.full_blocks);\n\tvnx::write_value(_buf + 1, value.since);\n\tvnx::write_value(_buf + 5, value.limit);\n\tvnx::write(out, value.farmer_keys, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_farmed_blocks& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_farmed_blocks& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_blocks& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_farmed_blocks_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_farmed_blocks_return.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_farmed_blocks_return::VNX_TYPE_HASH(0xe8697ffd381616baull);\nconst vnx::Hash64 Node_get_farmed_blocks_return::VNX_CODE_HASH(0xf9eb27cd51e0215full);\n\nvnx::Hash64 Node_get_farmed_blocks_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_farmed_blocks_return::get_type_name() const {\n\treturn \"mmx.Node.get_farmed_blocks.return\";\n}\n\nconst vnx::TypeCode* Node_get_farmed_blocks_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_farmed_blocks_return;\n}\n\nstd::shared_ptr<Node_get_farmed_blocks_return> Node_get_farmed_blocks_return::create() {\n\treturn std::make_shared<Node_get_farmed_blocks_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_farmed_blocks_return::clone() const {\n\treturn std::make_shared<Node_get_farmed_blocks_return>(*this);\n}\n\nvoid Node_get_farmed_blocks_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_farmed_blocks_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_farmed_blocks_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_farmed_blocks_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_farmed_blocks_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_farmed_blocks.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_farmed_blocks_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_farmed_blocks_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_farmed_blocks.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_farmed_blocks_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_farmed_blocks_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_farmed_blocks_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_farmed_blocks_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_farmed_blocks_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_farmed_blocks_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_farmed_blocks_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_farmed_blocks.return\";\n\ttype_code->type_hash = vnx::Hash64(0xe8697ffd381616baull);\n\ttype_code->code_hash = vnx::Hash64(0xf9eb27cd51e0215full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_farmed_blocks_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_farmed_blocks_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_farmed_blocks_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmed_blocks_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_farmed_blocks_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_farmed_blocks_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_farmed_blocks_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_farmed_blocks_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmed_blocks_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_farmer_ranking.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_farmer_ranking.hxx>\n#include <mmx/Node_get_farmer_ranking_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_farmer_ranking::VNX_TYPE_HASH(0x548d571d6384bd43ull);\nconst vnx::Hash64 Node_get_farmer_ranking::VNX_CODE_HASH(0xaacf04386b3588f1ull);\n\nvnx::Hash64 Node_get_farmer_ranking::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_farmer_ranking::get_type_name() const {\n\treturn \"mmx.Node.get_farmer_ranking\";\n}\n\nconst vnx::TypeCode* Node_get_farmer_ranking::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_farmer_ranking;\n}\n\nstd::shared_ptr<Node_get_farmer_ranking> Node_get_farmer_ranking::create() {\n\treturn std::make_shared<Node_get_farmer_ranking>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_farmer_ranking::clone() const {\n\treturn std::make_shared<Node_get_farmer_ranking>(*this);\n}\n\nvoid Node_get_farmer_ranking::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_farmer_ranking::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_farmer_ranking::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_farmer_ranking;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, limit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_farmer_ranking::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_farmer_ranking\\\"\";\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \"}\";\n}\n\nvoid Node_get_farmer_ranking::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_farmer_ranking::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_farmer_ranking\";\n\t_object[\"limit\"] = limit;\n\treturn _object;\n}\n\nvoid Node_get_farmer_ranking::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_farmer_ranking::get_field(const std::string& _name) const {\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_farmer_ranking::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"limit\") {\n\t\t_value.to(limit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_farmer_ranking& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_farmer_ranking& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_farmer_ranking::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_farmer_ranking::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_farmer_ranking\";\n\ttype_code->type_hash = vnx::Hash64(0x548d571d6384bd43ull);\n\ttype_code->code_hash = vnx::Hash64(0xaacf04386b3588f1ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_farmer_ranking);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_farmer_ranking>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_farmer_ranking_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {7};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_farmer_ranking& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmer_ranking& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_farmer_ranking;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_farmer_ranking>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.limit);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_farmer_ranking& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_farmer_ranking& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmer_ranking& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_farmer_ranking_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_farmer_ranking_return.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_farmer_ranking_return::VNX_TYPE_HASH(0xb74e7f1a70a60ecdull);\nconst vnx::Hash64 Node_get_farmer_ranking_return::VNX_CODE_HASH(0xadc8868359295353ull);\n\nvnx::Hash64 Node_get_farmer_ranking_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_farmer_ranking_return::get_type_name() const {\n\treturn \"mmx.Node.get_farmer_ranking.return\";\n}\n\nconst vnx::TypeCode* Node_get_farmer_ranking_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_farmer_ranking_return;\n}\n\nstd::shared_ptr<Node_get_farmer_ranking_return> Node_get_farmer_ranking_return::create() {\n\treturn std::make_shared<Node_get_farmer_ranking_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_farmer_ranking_return::clone() const {\n\treturn std::make_shared<Node_get_farmer_ranking_return>(*this);\n}\n\nvoid Node_get_farmer_ranking_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_farmer_ranking_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_farmer_ranking_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_farmer_ranking_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_farmer_ranking_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_farmer_ranking.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_farmer_ranking_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_farmer_ranking_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_farmer_ranking.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_farmer_ranking_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_farmer_ranking_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_farmer_ranking_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_farmer_ranking_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_farmer_ranking_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_farmer_ranking_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_farmer_ranking_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_farmer_ranking.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb74e7f1a70a60ecdull);\n\ttype_code->code_hash = vnx::Hash64(0xadc8868359295353ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_farmer_ranking_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_farmer_ranking_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 23, 2, 4, 7, 11, 33, 1, 3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_farmer_ranking_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_farmer_ranking_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_farmer_ranking_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_farmer_ranking_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_farmer_ranking_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_farmer_ranking_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_farmer_ranking_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_genesis_hash.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_genesis_hash.hxx>\n#include <mmx/Node_get_genesis_hash_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_genesis_hash::VNX_TYPE_HASH(0xbfab786cb64c5a3ull);\nconst vnx::Hash64 Node_get_genesis_hash::VNX_CODE_HASH(0xb26bf026996c20efull);\n\nvnx::Hash64 Node_get_genesis_hash::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_genesis_hash::get_type_name() const {\n\treturn \"mmx.Node.get_genesis_hash\";\n}\n\nconst vnx::TypeCode* Node_get_genesis_hash::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_genesis_hash;\n}\n\nstd::shared_ptr<Node_get_genesis_hash> Node_get_genesis_hash::create() {\n\treturn std::make_shared<Node_get_genesis_hash>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_genesis_hash::clone() const {\n\treturn std::make_shared<Node_get_genesis_hash>(*this);\n}\n\nvoid Node_get_genesis_hash::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_genesis_hash::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_genesis_hash::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_genesis_hash;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_genesis_hash::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_genesis_hash\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_get_genesis_hash::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_genesis_hash::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_genesis_hash\";\n\treturn _object;\n}\n\nvoid Node_get_genesis_hash::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_get_genesis_hash::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_get_genesis_hash::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_genesis_hash& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_genesis_hash& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_genesis_hash::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_genesis_hash::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_genesis_hash\";\n\ttype_code->type_hash = vnx::Hash64(0xbfab786cb64c5a3ull);\n\ttype_code->code_hash = vnx::Hash64(0xb26bf026996c20efull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_genesis_hash);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_genesis_hash>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_genesis_hash_return::static_get_type_code();\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_genesis_hash& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_genesis_hash& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_genesis_hash;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_genesis_hash>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_genesis_hash& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_genesis_hash& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_genesis_hash& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_genesis_hash_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_genesis_hash_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_genesis_hash_return::VNX_TYPE_HASH(0x5c5ea53e3163fd5ull);\nconst vnx::Hash64 Node_get_genesis_hash_return::VNX_CODE_HASH(0xcd04b5801dce80eull);\n\nvnx::Hash64 Node_get_genesis_hash_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_genesis_hash_return::get_type_name() const {\n\treturn \"mmx.Node.get_genesis_hash.return\";\n}\n\nconst vnx::TypeCode* Node_get_genesis_hash_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_genesis_hash_return;\n}\n\nstd::shared_ptr<Node_get_genesis_hash_return> Node_get_genesis_hash_return::create() {\n\treturn std::make_shared<Node_get_genesis_hash_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_genesis_hash_return::clone() const {\n\treturn std::make_shared<Node_get_genesis_hash_return>(*this);\n}\n\nvoid Node_get_genesis_hash_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_genesis_hash_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_genesis_hash_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_genesis_hash_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_genesis_hash_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_genesis_hash.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_genesis_hash_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_genesis_hash_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_genesis_hash.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_genesis_hash_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_genesis_hash_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_genesis_hash_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_genesis_hash_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_genesis_hash_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_genesis_hash_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_genesis_hash_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_genesis_hash.return\";\n\ttype_code->type_hash = vnx::Hash64(0x5c5ea53e3163fd5ull);\n\ttype_code->code_hash = vnx::Hash64(0xcd04b5801dce80eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_genesis_hash_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_genesis_hash_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_genesis_hash_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_genesis_hash_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_genesis_hash_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_genesis_hash_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_genesis_hash_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_genesis_hash_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_genesis_hash_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_header.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_header.hxx>\n#include <mmx/Node_get_header_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_header::VNX_TYPE_HASH(0xf17a5d0c180db198ull);\nconst vnx::Hash64 Node_get_header::VNX_CODE_HASH(0x9cda80dd1421da61ull);\n\nvnx::Hash64 Node_get_header::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_header::get_type_name() const {\n\treturn \"mmx.Node.get_header\";\n}\n\nconst vnx::TypeCode* Node_get_header::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_header;\n}\n\nstd::shared_ptr<Node_get_header> Node_get_header::create() {\n\treturn std::make_shared<Node_get_header>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_header::clone() const {\n\treturn std::make_shared<Node_get_header>(*this);\n}\n\nvoid Node_get_header::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_header::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_header::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_header;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, hash);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_header::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_header\\\"\";\n\t_out << \", \\\"hash\\\": \"; vnx::write(_out, hash);\n\t_out << \"}\";\n}\n\nvoid Node_get_header::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_header::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_header\";\n\t_object[\"hash\"] = hash;\n\treturn _object;\n}\n\nvoid Node_get_header::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"hash\") {\n\t\t\t_entry.second.to(hash);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_header::get_field(const std::string& _name) const {\n\tif(_name == \"hash\") {\n\t\treturn vnx::Variant(hash);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_header::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"hash\") {\n\t\t_value.to(hash);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_header& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_header& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_header::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_header::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_header\";\n\ttype_code->type_hash = vnx::Hash64(0xf17a5d0c180db198ull);\n\ttype_code->code_hash = vnx::Hash64(0x9cda80dd1421da61ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_header);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_header>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_header_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_header& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_header& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_header;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_header>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.hash, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_header& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_header& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_header& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_header_at.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_header_at.hxx>\n#include <mmx/Node_get_header_at_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_header_at::VNX_TYPE_HASH(0x52658163d8767c79ull);\nconst vnx::Hash64 Node_get_header_at::VNX_CODE_HASH(0x76550b37e2e1f741ull);\n\nvnx::Hash64 Node_get_header_at::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_header_at::get_type_name() const {\n\treturn \"mmx.Node.get_header_at\";\n}\n\nconst vnx::TypeCode* Node_get_header_at::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_header_at;\n}\n\nstd::shared_ptr<Node_get_header_at> Node_get_header_at::create() {\n\treturn std::make_shared<Node_get_header_at>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_header_at::clone() const {\n\treturn std::make_shared<Node_get_header_at>(*this);\n}\n\nvoid Node_get_header_at::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_header_at::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_header_at::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_header_at;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_header_at::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_header_at\\\"\";\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_get_header_at::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_header_at::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_header_at\";\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_get_header_at::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_header_at::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_header_at::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_header_at& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_header_at& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_header_at::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_header_at::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_header_at\";\n\ttype_code->type_hash = vnx::Hash64(0x52658163d8767c79ull);\n\ttype_code->code_hash = vnx::Hash64(0x76550b37e2e1f741ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_header_at);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_header_at>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_header_at_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_header_at& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_header_at& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_header_at;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_header_at>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_header_at& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_header_at& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_header_at& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_header_at_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_header_at_return.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_header_at_return::VNX_TYPE_HASH(0x4efc6897885ee521ull);\nconst vnx::Hash64 Node_get_header_at_return::VNX_CODE_HASH(0xd550ebdc3bceb8c3ull);\n\nvnx::Hash64 Node_get_header_at_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_header_at_return::get_type_name() const {\n\treturn \"mmx.Node.get_header_at.return\";\n}\n\nconst vnx::TypeCode* Node_get_header_at_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_header_at_return;\n}\n\nstd::shared_ptr<Node_get_header_at_return> Node_get_header_at_return::create() {\n\treturn std::make_shared<Node_get_header_at_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_header_at_return::clone() const {\n\treturn std::make_shared<Node_get_header_at_return>(*this);\n}\n\nvoid Node_get_header_at_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_header_at_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_header_at_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_header_at_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_header_at_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_header_at.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_header_at_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_header_at_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_header_at.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_header_at_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_header_at_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_header_at_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_header_at_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_header_at_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_header_at_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_header_at_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_header_at.return\";\n\ttype_code->type_hash = vnx::Hash64(0x4efc6897885ee521ull);\n\ttype_code->code_hash = vnx::Hash64(0xd550ebdc3bceb8c3ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_header_at_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_header_at_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_header_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_header_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_header_at_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_header_at_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_header_at_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_header_at_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_header_at_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_header_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_header_return.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_header_return::VNX_TYPE_HASH(0xeffae31958103da7ull);\nconst vnx::Hash64 Node_get_header_return::VNX_CODE_HASH(0x1de7b17f139f2757ull);\n\nvnx::Hash64 Node_get_header_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_header_return::get_type_name() const {\n\treturn \"mmx.Node.get_header.return\";\n}\n\nconst vnx::TypeCode* Node_get_header_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_header_return;\n}\n\nstd::shared_ptr<Node_get_header_return> Node_get_header_return::create() {\n\treturn std::make_shared<Node_get_header_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_header_return::clone() const {\n\treturn std::make_shared<Node_get_header_return>(*this);\n}\n\nvoid Node_get_header_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_header_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_header_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_header_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_header_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_header.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_header_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_header_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_header.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_header_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_header_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_header_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_header_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_header_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_header_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_header_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_header.return\";\n\ttype_code->type_hash = vnx::Hash64(0xeffae31958103da7ull);\n\ttype_code->code_hash = vnx::Hash64(0x1de7b17f139f2757ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_header_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_header_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_header_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_header_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_header_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_header_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_header_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_header_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_header_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_height.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_height.hxx>\n#include <mmx/Node_get_height_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_height::VNX_TYPE_HASH(0x55f0d4ef7a117716ull);\nconst vnx::Hash64 Node_get_height::VNX_CODE_HASH(0x335c00dfad151370ull);\n\nvnx::Hash64 Node_get_height::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_height::get_type_name() const {\n\treturn \"mmx.Node.get_height\";\n}\n\nconst vnx::TypeCode* Node_get_height::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_height;\n}\n\nstd::shared_ptr<Node_get_height> Node_get_height::create() {\n\treturn std::make_shared<Node_get_height>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_height::clone() const {\n\treturn std::make_shared<Node_get_height>(*this);\n}\n\nvoid Node_get_height::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_height::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_height::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_height;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_height::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_height\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_get_height::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_height::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_height\";\n\treturn _object;\n}\n\nvoid Node_get_height::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_get_height::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_get_height::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_height& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_height& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_height::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_height::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_height\";\n\ttype_code->type_hash = vnx::Hash64(0x55f0d4ef7a117716ull);\n\ttype_code->code_hash = vnx::Hash64(0x335c00dfad151370ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_height);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_height>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_height_return::static_get_type_code();\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_height& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_height& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_height;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_height>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_height& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_height& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_height& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_height_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_height_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_height_return::VNX_TYPE_HASH(0x5fb0ff1e11add033ull);\nconst vnx::Hash64 Node_get_height_return::VNX_CODE_HASH(0xbcdb9cb9df806e51ull);\n\nvnx::Hash64 Node_get_height_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_height_return::get_type_name() const {\n\treturn \"mmx.Node.get_height.return\";\n}\n\nconst vnx::TypeCode* Node_get_height_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_height_return;\n}\n\nstd::shared_ptr<Node_get_height_return> Node_get_height_return::create() {\n\treturn std::make_shared<Node_get_height_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_height_return::clone() const {\n\treturn std::make_shared<Node_get_height_return>(*this);\n}\n\nvoid Node_get_height_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_height_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_height_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_height_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_height_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_height.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_height_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_height_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_height.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_height_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_height_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_height_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_height_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_height_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_height_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_height_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_height.return\";\n\ttype_code->type_hash = vnx::Hash64(0x5fb0ff1e11add033ull);\n\ttype_code->code_hash = vnx::Hash64(0xbcdb9cb9df806e51ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_height_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_height_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value._ret_0, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_height_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_height_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value._ret_0);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_height_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_height_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_height_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_history.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_history.hxx>\n#include <mmx/Node_get_history_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_history::VNX_TYPE_HASH(0x8b3db05c6e91011dull);\nconst vnx::Hash64 Node_get_history::VNX_CODE_HASH(0xc53b4b83f465b5aaull);\n\nvnx::Hash64 Node_get_history::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_history::get_type_name() const {\n\treturn \"mmx.Node.get_history\";\n}\n\nconst vnx::TypeCode* Node_get_history::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_history;\n}\n\nstd::shared_ptr<Node_get_history> Node_get_history::create() {\n\treturn std::make_shared<Node_get_history>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_history::clone() const {\n\treturn std::make_shared<Node_get_history>(*this);\n}\n\nvoid Node_get_history::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_history::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_history::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_history;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, filter);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_history::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_history\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \", \\\"filter\\\": \"; vnx::write(_out, filter);\n\t_out << \"}\";\n}\n\nvoid Node_get_history::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_history::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_history\";\n\t_object[\"addresses\"] = addresses;\n\t_object[\"filter\"] = filter;\n\treturn _object;\n}\n\nvoid Node_get_history::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t} else if(_entry.first == \"filter\") {\n\t\t\t_entry.second.to(filter);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_history::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\tif(_name == \"filter\") {\n\t\treturn vnx::Variant(filter);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_history::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t} else if(_name == \"filter\") {\n\t\t_value.to(filter);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_history& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_history& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_history::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_history::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_history\";\n\ttype_code->type_hash = vnx::Hash64(0x8b3db05c6e91011dull);\n\ttype_code->code_hash = vnx::Hash64(0xc53b4b83f465b5aaull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_history);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_history>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::query_filter_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_history_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"filter\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_history& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.filter, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_history& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_history;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_history>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.filter, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_history& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_history& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_history& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_history_memo.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_history_memo.hxx>\n#include <mmx/Node_get_history_memo_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_history_memo::VNX_TYPE_HASH(0x693c0c791039287cull);\nconst vnx::Hash64 Node_get_history_memo::VNX_CODE_HASH(0xdb209bb81b50135aull);\n\nvnx::Hash64 Node_get_history_memo::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_history_memo::get_type_name() const {\n\treturn \"mmx.Node.get_history_memo\";\n}\n\nconst vnx::TypeCode* Node_get_history_memo::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_history_memo;\n}\n\nstd::shared_ptr<Node_get_history_memo> Node_get_history_memo::create() {\n\treturn std::make_shared<Node_get_history_memo>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_history_memo::clone() const {\n\treturn std::make_shared<Node_get_history_memo>(*this);\n}\n\nvoid Node_get_history_memo::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_history_memo::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_history_memo::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_history_memo;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, memo);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, filter);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_history_memo::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_history_memo\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \", \\\"memo\\\": \"; vnx::write(_out, memo);\n\t_out << \", \\\"filter\\\": \"; vnx::write(_out, filter);\n\t_out << \"}\";\n}\n\nvoid Node_get_history_memo::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_history_memo::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_history_memo\";\n\t_object[\"addresses\"] = addresses;\n\t_object[\"memo\"] = memo;\n\t_object[\"filter\"] = filter;\n\treturn _object;\n}\n\nvoid Node_get_history_memo::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t} else if(_entry.first == \"filter\") {\n\t\t\t_entry.second.to(filter);\n\t\t} else if(_entry.first == \"memo\") {\n\t\t\t_entry.second.to(memo);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_history_memo::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\tif(_name == \"memo\") {\n\t\treturn vnx::Variant(memo);\n\t}\n\tif(_name == \"filter\") {\n\t\treturn vnx::Variant(filter);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_history_memo::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t} else if(_name == \"memo\") {\n\t\t_value.to(memo);\n\t} else if(_name == \"filter\") {\n\t\t_value.to(filter);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_history_memo& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_history_memo& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_history_memo::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_history_memo::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_history_memo\";\n\ttype_code->type_hash = vnx::Hash64(0x693c0c791039287cull);\n\ttype_code->code_hash = vnx::Hash64(0xdb209bb81b50135aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_history_memo);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_history_memo>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::query_filter_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_history_memo_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"memo\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"filter\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_history_memo& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.memo, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.filter, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_history_memo& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_history_memo;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_history_memo>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.memo, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.filter, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_history_memo& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_history_memo& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_history_memo& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_history_memo_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_history_memo_return.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_history_memo_return::VNX_TYPE_HASH(0x3bba2b40c2e82885ull);\nconst vnx::Hash64 Node_get_history_memo_return::VNX_CODE_HASH(0xab2058cf95194c83ull);\n\nvnx::Hash64 Node_get_history_memo_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_history_memo_return::get_type_name() const {\n\treturn \"mmx.Node.get_history_memo.return\";\n}\n\nconst vnx::TypeCode* Node_get_history_memo_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_history_memo_return;\n}\n\nstd::shared_ptr<Node_get_history_memo_return> Node_get_history_memo_return::create() {\n\treturn std::make_shared<Node_get_history_memo_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_history_memo_return::clone() const {\n\treturn std::make_shared<Node_get_history_memo_return>(*this);\n}\n\nvoid Node_get_history_memo_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_history_memo_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_history_memo_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_history_memo_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_history_memo_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_history_memo.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_history_memo_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_history_memo_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_history_memo.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_history_memo_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_history_memo_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_history_memo_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_history_memo_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_history_memo_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_history_memo_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_history_memo_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_history_memo.return\";\n\ttype_code->type_hash = vnx::Hash64(0x3bba2b40c2e82885ull);\n\ttype_code->code_hash = vnx::Hash64(0xab2058cf95194c83ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_history_memo_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_history_memo_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::tx_entry_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_history_memo_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_history_memo_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_history_memo_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_history_memo_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_history_memo_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_history_memo_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_history_memo_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_history_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_history_return.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_history_return::VNX_TYPE_HASH(0xa925b7aa92603121ull);\nconst vnx::Hash64 Node_get_history_return::VNX_CODE_HASH(0x3f37957f2aaa562aull);\n\nvnx::Hash64 Node_get_history_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_history_return::get_type_name() const {\n\treturn \"mmx.Node.get_history.return\";\n}\n\nconst vnx::TypeCode* Node_get_history_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_history_return;\n}\n\nstd::shared_ptr<Node_get_history_return> Node_get_history_return::create() {\n\treturn std::make_shared<Node_get_history_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_history_return::clone() const {\n\treturn std::make_shared<Node_get_history_return>(*this);\n}\n\nvoid Node_get_history_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_history_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_history_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_history_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_history_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_history.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_history_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_history_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_history.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_history_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_history_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_history_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_history_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_history_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_history_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_history_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_history.return\";\n\ttype_code->type_hash = vnx::Hash64(0xa925b7aa92603121ull);\n\ttype_code->code_hash = vnx::Hash64(0x3f37957f2aaa562aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_history_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_history_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::tx_entry_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_history_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_history_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_history_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_history_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_history_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_network_info.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_network_info.hxx>\n#include <mmx/Node_get_network_info_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_network_info::VNX_TYPE_HASH(0x79cedc8662eeb2e4ull);\nconst vnx::Hash64 Node_get_network_info::VNX_CODE_HASH(0xd20c41513f58de86ull);\n\nvnx::Hash64 Node_get_network_info::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_network_info::get_type_name() const {\n\treturn \"mmx.Node.get_network_info\";\n}\n\nconst vnx::TypeCode* Node_get_network_info::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_network_info;\n}\n\nstd::shared_ptr<Node_get_network_info> Node_get_network_info::create() {\n\treturn std::make_shared<Node_get_network_info>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_network_info::clone() const {\n\treturn std::make_shared<Node_get_network_info>(*this);\n}\n\nvoid Node_get_network_info::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_network_info::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_network_info::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_network_info;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_network_info::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_network_info\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_get_network_info::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_network_info::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_network_info\";\n\treturn _object;\n}\n\nvoid Node_get_network_info::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_get_network_info::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_get_network_info::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_network_info& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_network_info& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_network_info::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_network_info::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_network_info\";\n\ttype_code->type_hash = vnx::Hash64(0x79cedc8662eeb2e4ull);\n\ttype_code->code_hash = vnx::Hash64(0xd20c41513f58de86ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_network_info);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_network_info>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_network_info_return::static_get_type_code();\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_network_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_network_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_network_info;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_network_info>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_network_info& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_network_info& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_network_info& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_network_info_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_network_info_return.hxx>\n#include <mmx/NetworkInfo.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_network_info_return::VNX_TYPE_HASH(0x28541acc5945ae0eull);\nconst vnx::Hash64 Node_get_network_info_return::VNX_CODE_HASH(0xd033cff0ce21f65eull);\n\nvnx::Hash64 Node_get_network_info_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_network_info_return::get_type_name() const {\n\treturn \"mmx.Node.get_network_info.return\";\n}\n\nconst vnx::TypeCode* Node_get_network_info_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_network_info_return;\n}\n\nstd::shared_ptr<Node_get_network_info_return> Node_get_network_info_return::create() {\n\treturn std::make_shared<Node_get_network_info_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_network_info_return::clone() const {\n\treturn std::make_shared<Node_get_network_info_return>(*this);\n}\n\nvoid Node_get_network_info_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_network_info_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_network_info_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_network_info_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_network_info_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_network_info.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_network_info_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_network_info_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_network_info.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_network_info_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_network_info_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_network_info_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_network_info_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_network_info_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_network_info_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_network_info_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_network_info.return\";\n\ttype_code->type_hash = vnx::Hash64(0x28541acc5945ae0eull);\n\ttype_code->code_hash = vnx::Hash64(0xd033cff0ce21f65eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_network_info_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_network_info_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_network_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_network_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_network_info_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_network_info_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_network_info_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_network_info_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_network_info_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_offer.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_offer.hxx>\n#include <mmx/Node_get_offer_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_offer::VNX_TYPE_HASH(0xd3e336e279686563ull);\nconst vnx::Hash64 Node_get_offer::VNX_CODE_HASH(0x4eb1c869fea18518ull);\n\nvnx::Hash64 Node_get_offer::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_offer::get_type_name() const {\n\treturn \"mmx.Node.get_offer\";\n}\n\nconst vnx::TypeCode* Node_get_offer::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_offer;\n}\n\nstd::shared_ptr<Node_get_offer> Node_get_offer::create() {\n\treturn std::make_shared<Node_get_offer>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_offer::clone() const {\n\treturn std::make_shared<Node_get_offer>(*this);\n}\n\nvoid Node_get_offer::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_offer::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_offer::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_offer;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_offer::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_offer\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Node_get_offer::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_offer::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_offer\";\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Node_get_offer::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_offer::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_offer::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_offer& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_offer& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_offer::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_offer::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_offer\";\n\ttype_code->type_hash = vnx::Hash64(0xd3e336e279686563ull);\n\ttype_code->code_hash = vnx::Hash64(0x4eb1c869fea18518ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_offer);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_offer>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_offer_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_offer;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_offer>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_offer& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_offer& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offer& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_offer_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_offer_return.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_offer_return::VNX_TYPE_HASH(0xa92bb7b910e3424full);\nconst vnx::Hash64 Node_get_offer_return::VNX_CODE_HASH(0xe5b919c7f3fef6edull);\n\nvnx::Hash64 Node_get_offer_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_offer_return::get_type_name() const {\n\treturn \"mmx.Node.get_offer.return\";\n}\n\nconst vnx::TypeCode* Node_get_offer_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_offer_return;\n}\n\nstd::shared_ptr<Node_get_offer_return> Node_get_offer_return::create() {\n\treturn std::make_shared<Node_get_offer_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_offer_return::clone() const {\n\treturn std::make_shared<Node_get_offer_return>(*this);\n}\n\nvoid Node_get_offer_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_offer_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_offer_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_offer_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_offer_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_offer.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_offer_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_offer_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_offer.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_offer_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_offer_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_offer_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_offer_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_offer_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_offer_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_offer_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_offer.return\";\n\ttype_code->type_hash = vnx::Hash64(0xa92bb7b910e3424full);\n\ttype_code->code_hash = vnx::Hash64(0xe5b919c7f3fef6edull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_offer_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_offer_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::offer_data_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_offer_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_offer_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_offer_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_offer_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offer_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_offers.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_offers.hxx>\n#include <mmx/Node_get_offers_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_offers::VNX_TYPE_HASH(0x62e5e37dd72d3175ull);\nconst vnx::Hash64 Node_get_offers::VNX_CODE_HASH(0x29db8eeca4efb7eeull);\n\nvnx::Hash64 Node_get_offers::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_offers::get_type_name() const {\n\treturn \"mmx.Node.get_offers\";\n}\n\nconst vnx::TypeCode* Node_get_offers::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_offers;\n}\n\nstd::shared_ptr<Node_get_offers> Node_get_offers::create() {\n\treturn std::make_shared<Node_get_offers>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_offers::clone() const {\n\treturn std::make_shared<Node_get_offers>(*this);\n}\n\nvoid Node_get_offers::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_offers::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_offers::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_offers;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, since);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, state);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_offers::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_offers\\\"\";\n\t_out << \", \\\"since\\\": \"; vnx::write(_out, since);\n\t_out << \", \\\"state\\\": \"; vnx::write(_out, state);\n\t_out << \"}\";\n}\n\nvoid Node_get_offers::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_offers::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_offers\";\n\t_object[\"since\"] = since;\n\t_object[\"state\"] = state;\n\treturn _object;\n}\n\nvoid Node_get_offers::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"since\") {\n\t\t\t_entry.second.to(since);\n\t\t} else if(_entry.first == \"state\") {\n\t\t\t_entry.second.to(state);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_offers::get_field(const std::string& _name) const {\n\tif(_name == \"since\") {\n\t\treturn vnx::Variant(since);\n\t}\n\tif(_name == \"state\") {\n\t\treturn vnx::Variant(state);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_offers::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"since\") {\n\t\t_value.to(since);\n\t} else if(_name == \"state\") {\n\t\t_value.to(state);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_offers& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_offers& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_offers::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_offers::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_offers\";\n\ttype_code->type_hash = vnx::Hash64(0x62e5e37dd72d3175ull);\n\ttype_code->code_hash = vnx::Hash64(0x29db8eeca4efb7eeull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_offers);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_offers>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_offers_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"since\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"state\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.since, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.state, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_offers;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_offers>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(5);\n\tvnx::write_value(_buf + 0, value.since);\n\tvnx::write_value(_buf + 4, value.state);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_offers& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_offers& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offers& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_offers_by.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_offers_by.hxx>\n#include <mmx/Node_get_offers_by_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_offers_by::VNX_TYPE_HASH(0xf83c55f59e407411ull);\nconst vnx::Hash64 Node_get_offers_by::VNX_CODE_HASH(0xb1cf30bf9bcb8ea3ull);\n\nvnx::Hash64 Node_get_offers_by::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_offers_by::get_type_name() const {\n\treturn \"mmx.Node.get_offers_by\";\n}\n\nconst vnx::TypeCode* Node_get_offers_by::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_offers_by;\n}\n\nstd::shared_ptr<Node_get_offers_by> Node_get_offers_by::create() {\n\treturn std::make_shared<Node_get_offers_by>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_offers_by::clone() const {\n\treturn std::make_shared<Node_get_offers_by>(*this);\n}\n\nvoid Node_get_offers_by::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_offers_by::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_offers_by::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_offers_by;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, owners);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, state);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_offers_by::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_offers_by\\\"\";\n\t_out << \", \\\"owners\\\": \"; vnx::write(_out, owners);\n\t_out << \", \\\"state\\\": \"; vnx::write(_out, state);\n\t_out << \"}\";\n}\n\nvoid Node_get_offers_by::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_offers_by::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_offers_by\";\n\t_object[\"owners\"] = owners;\n\t_object[\"state\"] = state;\n\treturn _object;\n}\n\nvoid Node_get_offers_by::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"owners\") {\n\t\t\t_entry.second.to(owners);\n\t\t} else if(_entry.first == \"state\") {\n\t\t\t_entry.second.to(state);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_offers_by::get_field(const std::string& _name) const {\n\tif(_name == \"owners\") {\n\t\treturn vnx::Variant(owners);\n\t}\n\tif(_name == \"state\") {\n\t\treturn vnx::Variant(state);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_offers_by::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"owners\") {\n\t\t_value.to(owners);\n\t} else if(_name == \"state\") {\n\t\t_value.to(state);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_offers_by& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_offers_by& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_offers_by::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_offers_by::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_offers_by\";\n\ttype_code->type_hash = vnx::Hash64(0xf83c55f59e407411ull);\n\ttype_code->code_hash = vnx::Hash64(0xb1cf30bf9bcb8ea3ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_offers_by);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_offers_by>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_offers_by_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"owners\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"state\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_offers_by& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.state, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.owners, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_offers_by& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_offers_by;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_offers_by>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(1);\n\tvnx::write_value(_buf + 0, value.state);\n\tvnx::write(out, value.owners, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_offers_by& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_offers_by& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offers_by& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_offers_by_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_offers_by_return.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_offers_by_return::VNX_TYPE_HASH(0x59efe1350028d6f4ull);\nconst vnx::Hash64 Node_get_offers_by_return::VNX_CODE_HASH(0x5134fde4dccc8851ull);\n\nvnx::Hash64 Node_get_offers_by_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_offers_by_return::get_type_name() const {\n\treturn \"mmx.Node.get_offers_by.return\";\n}\n\nconst vnx::TypeCode* Node_get_offers_by_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_offers_by_return;\n}\n\nstd::shared_ptr<Node_get_offers_by_return> Node_get_offers_by_return::create() {\n\treturn std::make_shared<Node_get_offers_by_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_offers_by_return::clone() const {\n\treturn std::make_shared<Node_get_offers_by_return>(*this);\n}\n\nvoid Node_get_offers_by_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_offers_by_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_offers_by_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_offers_by_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_offers_by_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_offers_by.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_offers_by_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_offers_by_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_offers_by.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_offers_by_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_offers_by_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_offers_by_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_offers_by_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_offers_by_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_offers_by_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_offers_by_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_offers_by.return\";\n\ttype_code->type_hash = vnx::Hash64(0x59efe1350028d6f4ull);\n\ttype_code->code_hash = vnx::Hash64(0x5134fde4dccc8851ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_offers_by_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_offers_by_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::offer_data_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_offers_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_offers_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_offers_by_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_offers_by_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_offers_by_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_offers_by_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offers_by_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_offers_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_offers_return.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_offers_return::VNX_TYPE_HASH(0xf93f5d6546a50db1ull);\nconst vnx::Hash64 Node_get_offers_return::VNX_CODE_HASH(0x3a29b226c4b60eafull);\n\nvnx::Hash64 Node_get_offers_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_offers_return::get_type_name() const {\n\treturn \"mmx.Node.get_offers.return\";\n}\n\nconst vnx::TypeCode* Node_get_offers_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_offers_return;\n}\n\nstd::shared_ptr<Node_get_offers_return> Node_get_offers_return::create() {\n\treturn std::make_shared<Node_get_offers_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_offers_return::clone() const {\n\treturn std::make_shared<Node_get_offers_return>(*this);\n}\n\nvoid Node_get_offers_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_offers_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_offers_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_offers_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_offers_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_offers.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_offers_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_offers_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_offers.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_offers_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_offers_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_offers_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_offers_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_offers_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_offers_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_offers_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_offers.return\";\n\ttype_code->type_hash = vnx::Hash64(0xf93f5d6546a50db1ull);\n\ttype_code->code_hash = vnx::Hash64(0x3a29b226c4b60eafull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_offers_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_offers_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::offer_data_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_offers_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_offers_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_offers_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_offers_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_offers_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_params.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_params.hxx>\n#include <mmx/Node_get_params_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_params::VNX_TYPE_HASH(0x6384b34900c2e465ull);\nconst vnx::Hash64 Node_get_params::VNX_CODE_HASH(0x3bb9d800cedce77cull);\n\nvnx::Hash64 Node_get_params::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_params::get_type_name() const {\n\treturn \"mmx.Node.get_params\";\n}\n\nconst vnx::TypeCode* Node_get_params::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_params;\n}\n\nstd::shared_ptr<Node_get_params> Node_get_params::create() {\n\treturn std::make_shared<Node_get_params>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_params::clone() const {\n\treturn std::make_shared<Node_get_params>(*this);\n}\n\nvoid Node_get_params::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_params::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_params::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_params;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_params::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_params\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_get_params::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_params::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_params\";\n\treturn _object;\n}\n\nvoid Node_get_params::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_get_params::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_get_params::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_params& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_params& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_params::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_params::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_params\";\n\ttype_code->type_hash = vnx::Hash64(0x6384b34900c2e465ull);\n\ttype_code->code_hash = vnx::Hash64(0x3bb9d800cedce77cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_params);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_params>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_params_return::static_get_type_code();\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_params& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_params& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_params;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_params>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_params& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_params& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_params& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_params_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_params_return.hxx>\n#include <mmx/ChainParams.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_params_return::VNX_TYPE_HASH(0xd0a614f2ed037180ull);\nconst vnx::Hash64 Node_get_params_return::VNX_CODE_HASH(0x854cb8ac309ae157ull);\n\nvnx::Hash64 Node_get_params_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_params_return::get_type_name() const {\n\treturn \"mmx.Node.get_params.return\";\n}\n\nconst vnx::TypeCode* Node_get_params_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_params_return;\n}\n\nstd::shared_ptr<Node_get_params_return> Node_get_params_return::create() {\n\treturn std::make_shared<Node_get_params_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_params_return::clone() const {\n\treturn std::make_shared<Node_get_params_return>(*this);\n}\n\nvoid Node_get_params_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_params_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_params_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_params_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_params_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_params.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_params_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_params_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_params.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_params_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_params_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_params_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_params_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_params_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_params_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_params_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_params.return\";\n\ttype_code->type_hash = vnx::Hash64(0xd0a614f2ed037180ull);\n\ttype_code->code_hash = vnx::Hash64(0x854cb8ac309ae157ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_params_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_params_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_params_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_params_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_params_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_params_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_params_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_params_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_params_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_plot_nft_info.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_plot_nft_info.hxx>\n#include <mmx/Node_get_plot_nft_info_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_plot_nft_info::VNX_TYPE_HASH(0x23efbfd355a3741full);\nconst vnx::Hash64 Node_get_plot_nft_info::VNX_CODE_HASH(0xa3ac66201fe30af9ull);\n\nvnx::Hash64 Node_get_plot_nft_info::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_plot_nft_info::get_type_name() const {\n\treturn \"mmx.Node.get_plot_nft_info\";\n}\n\nconst vnx::TypeCode* Node_get_plot_nft_info::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_plot_nft_info;\n}\n\nstd::shared_ptr<Node_get_plot_nft_info> Node_get_plot_nft_info::create() {\n\treturn std::make_shared<Node_get_plot_nft_info>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_plot_nft_info::clone() const {\n\treturn std::make_shared<Node_get_plot_nft_info>(*this);\n}\n\nvoid Node_get_plot_nft_info::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_plot_nft_info::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_plot_nft_info::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_plot_nft_info;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_plot_nft_info::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_plot_nft_info\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Node_get_plot_nft_info::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_plot_nft_info::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_plot_nft_info\";\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Node_get_plot_nft_info::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_plot_nft_info::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_plot_nft_info::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_plot_nft_info& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_plot_nft_info& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_plot_nft_info::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_plot_nft_info::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_plot_nft_info\";\n\ttype_code->type_hash = vnx::Hash64(0x23efbfd355a3741full);\n\ttype_code->code_hash = vnx::Hash64(0xa3ac66201fe30af9ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_plot_nft_info);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_plot_nft_info>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_plot_nft_info_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_plot_nft_info;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_plot_nft_info>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_plot_nft_info& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_info& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_info& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_plot_nft_info_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_plot_nft_info_return.hxx>\n#include <mmx/plot_nft_info_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_plot_nft_info_return::VNX_TYPE_HASH(0x4d3661c719d8496bull);\nconst vnx::Hash64 Node_get_plot_nft_info_return::VNX_CODE_HASH(0x26113e260e20e7acull);\n\nvnx::Hash64 Node_get_plot_nft_info_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_plot_nft_info_return::get_type_name() const {\n\treturn \"mmx.Node.get_plot_nft_info.return\";\n}\n\nconst vnx::TypeCode* Node_get_plot_nft_info_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_plot_nft_info_return;\n}\n\nstd::shared_ptr<Node_get_plot_nft_info_return> Node_get_plot_nft_info_return::create() {\n\treturn std::make_shared<Node_get_plot_nft_info_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_plot_nft_info_return::clone() const {\n\treturn std::make_shared<Node_get_plot_nft_info_return>(*this);\n}\n\nvoid Node_get_plot_nft_info_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_plot_nft_info_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_plot_nft_info_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_plot_nft_info_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_plot_nft_info_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_plot_nft_info.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_plot_nft_info_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_plot_nft_info_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_plot_nft_info.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_plot_nft_info_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_plot_nft_info_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_plot_nft_info_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_plot_nft_info_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_plot_nft_info_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_plot_nft_info_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_plot_nft_info_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_plot_nft_info.return\";\n\ttype_code->type_hash = vnx::Hash64(0x4d3661c719d8496bull);\n\ttype_code->code_hash = vnx::Hash64(0x26113e260e20e7acull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_plot_nft_info_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_plot_nft_info_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::plot_nft_info_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {33, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_plot_nft_info_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_plot_nft_info_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_plot_nft_info_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_info_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_info_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_plot_nft_target.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_plot_nft_target.hxx>\n#include <mmx/Node_get_plot_nft_target_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_plot_nft_target::VNX_TYPE_HASH(0x14dfd6e2b1f3282eull);\nconst vnx::Hash64 Node_get_plot_nft_target::VNX_CODE_HASH(0x5fdab24f83715353ull);\n\nvnx::Hash64 Node_get_plot_nft_target::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_plot_nft_target::get_type_name() const {\n\treturn \"mmx.Node.get_plot_nft_target\";\n}\n\nconst vnx::TypeCode* Node_get_plot_nft_target::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_plot_nft_target;\n}\n\nstd::shared_ptr<Node_get_plot_nft_target> Node_get_plot_nft_target::create() {\n\treturn std::make_shared<Node_get_plot_nft_target>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_plot_nft_target::clone() const {\n\treturn std::make_shared<Node_get_plot_nft_target>(*this);\n}\n\nvoid Node_get_plot_nft_target::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_plot_nft_target::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_plot_nft_target::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_plot_nft_target;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, farmer_addr);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_plot_nft_target::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_plot_nft_target\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"farmer_addr\\\": \"; vnx::write(_out, farmer_addr);\n\t_out << \"}\";\n}\n\nvoid Node_get_plot_nft_target::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_plot_nft_target::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_plot_nft_target\";\n\t_object[\"address\"] = address;\n\t_object[\"farmer_addr\"] = farmer_addr;\n\treturn _object;\n}\n\nvoid Node_get_plot_nft_target::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"farmer_addr\") {\n\t\t\t_entry.second.to(farmer_addr);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_plot_nft_target::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"farmer_addr\") {\n\t\treturn vnx::Variant(farmer_addr);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_plot_nft_target::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"farmer_addr\") {\n\t\t_value.to(farmer_addr);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_plot_nft_target& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_plot_nft_target& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_plot_nft_target::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_plot_nft_target::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_plot_nft_target\";\n\ttype_code->type_hash = vnx::Hash64(0x14dfd6e2b1f3282eull);\n\ttype_code->code_hash = vnx::Hash64(0x5fdab24f83715353ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_plot_nft_target);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_plot_nft_target>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_plot_nft_target_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_addr\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.farmer_addr, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_plot_nft_target;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_plot_nft_target>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.farmer_addr, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_plot_nft_target& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_target& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_target& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_plot_nft_target_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_plot_nft_target_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_plot_nft_target_return::VNX_TYPE_HASH(0x6d6444fd1b89732ull);\nconst vnx::Hash64 Node_get_plot_nft_target_return::VNX_CODE_HASH(0xaa1f56659aa198ull);\n\nvnx::Hash64 Node_get_plot_nft_target_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_plot_nft_target_return::get_type_name() const {\n\treturn \"mmx.Node.get_plot_nft_target.return\";\n}\n\nconst vnx::TypeCode* Node_get_plot_nft_target_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_plot_nft_target_return;\n}\n\nstd::shared_ptr<Node_get_plot_nft_target_return> Node_get_plot_nft_target_return::create() {\n\treturn std::make_shared<Node_get_plot_nft_target_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_plot_nft_target_return::clone() const {\n\treturn std::make_shared<Node_get_plot_nft_target_return>(*this);\n}\n\nvoid Node_get_plot_nft_target_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_plot_nft_target_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_plot_nft_target_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_plot_nft_target_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_plot_nft_target_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_plot_nft_target.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_plot_nft_target_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_plot_nft_target_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_plot_nft_target.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_plot_nft_target_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_plot_nft_target_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_plot_nft_target_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_plot_nft_target_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_plot_nft_target_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_plot_nft_target_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_plot_nft_target_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_plot_nft_target.return\";\n\ttype_code->type_hash = vnx::Hash64(0x6d6444fd1b89732ull);\n\ttype_code->code_hash = vnx::Hash64(0xaa1f56659aa198ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_plot_nft_target_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_plot_nft_target_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_plot_nft_target_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_plot_nft_target_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_plot_nft_target_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_plot_nft_target_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_plot_nft_target_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_recent_offers.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_recent_offers.hxx>\n#include <mmx/Node_get_recent_offers_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_recent_offers::VNX_TYPE_HASH(0xfcd729efd0504fdeull);\nconst vnx::Hash64 Node_get_recent_offers::VNX_CODE_HASH(0x349317a0a5d82726ull);\n\nvnx::Hash64 Node_get_recent_offers::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_recent_offers::get_type_name() const {\n\treturn \"mmx.Node.get_recent_offers\";\n}\n\nconst vnx::TypeCode* Node_get_recent_offers::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_recent_offers;\n}\n\nstd::shared_ptr<Node_get_recent_offers> Node_get_recent_offers::create() {\n\treturn std::make_shared<Node_get_recent_offers>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_recent_offers::clone() const {\n\treturn std::make_shared<Node_get_recent_offers>(*this);\n}\n\nvoid Node_get_recent_offers::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_recent_offers::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_recent_offers::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_recent_offers;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, limit);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, state);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_recent_offers::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_recent_offers\\\"\";\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \", \\\"state\\\": \"; vnx::write(_out, state);\n\t_out << \"}\";\n}\n\nvoid Node_get_recent_offers::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_recent_offers::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_recent_offers\";\n\t_object[\"limit\"] = limit;\n\t_object[\"state\"] = state;\n\treturn _object;\n}\n\nvoid Node_get_recent_offers::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"state\") {\n\t\t\t_entry.second.to(state);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_recent_offers::get_field(const std::string& _name) const {\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\tif(_name == \"state\") {\n\t\treturn vnx::Variant(state);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_recent_offers::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"limit\") {\n\t\t_value.to(limit);\n\t} else if(_name == \"state\") {\n\t\t_value.to(state);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_recent_offers& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_recent_offers& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_recent_offers::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_recent_offers::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_recent_offers\";\n\ttype_code->type_hash = vnx::Hash64(0xfcd729efd0504fdeull);\n\ttype_code->code_hash = vnx::Hash64(0x349317a0a5d82726ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_recent_offers);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_recent_offers>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_recent_offers_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"state\";\n\t\tfield.value = vnx::to_string(true);\n\t\tfield.code = {31};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_recent_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.state, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_recent_offers;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_recent_offers>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(5);\n\tvnx::write_value(_buf + 0, value.limit);\n\tvnx::write_value(_buf + 4, value.state);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_recent_offers& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_recent_offers_for.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_recent_offers_for.hxx>\n#include <mmx/Node_get_recent_offers_for_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_recent_offers_for::VNX_TYPE_HASH(0xd89f845556eb17a0ull);\nconst vnx::Hash64 Node_get_recent_offers_for::VNX_CODE_HASH(0x257e50ef372250f1ull);\n\nvnx::Hash64 Node_get_recent_offers_for::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_recent_offers_for::get_type_name() const {\n\treturn \"mmx.Node.get_recent_offers_for\";\n}\n\nconst vnx::TypeCode* Node_get_recent_offers_for::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_recent_offers_for;\n}\n\nstd::shared_ptr<Node_get_recent_offers_for> Node_get_recent_offers_for::create() {\n\treturn std::make_shared<Node_get_recent_offers_for>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_recent_offers_for::clone() const {\n\treturn std::make_shared<Node_get_recent_offers_for>(*this);\n}\n\nvoid Node_get_recent_offers_for::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_recent_offers_for::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_recent_offers_for::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_recent_offers_for;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, bid);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, ask);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, min_bid);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, limit);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, state);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_recent_offers_for::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_recent_offers_for\\\"\";\n\t_out << \", \\\"bid\\\": \"; vnx::write(_out, bid);\n\t_out << \", \\\"ask\\\": \"; vnx::write(_out, ask);\n\t_out << \", \\\"min_bid\\\": \"; vnx::write(_out, min_bid);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \", \\\"state\\\": \"; vnx::write(_out, state);\n\t_out << \"}\";\n}\n\nvoid Node_get_recent_offers_for::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_recent_offers_for::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_recent_offers_for\";\n\t_object[\"bid\"] = bid;\n\t_object[\"ask\"] = ask;\n\t_object[\"min_bid\"] = min_bid;\n\t_object[\"limit\"] = limit;\n\t_object[\"state\"] = state;\n\treturn _object;\n}\n\nvoid Node_get_recent_offers_for::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"ask\") {\n\t\t\t_entry.second.to(ask);\n\t\t} else if(_entry.first == \"bid\") {\n\t\t\t_entry.second.to(bid);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"min_bid\") {\n\t\t\t_entry.second.to(min_bid);\n\t\t} else if(_entry.first == \"state\") {\n\t\t\t_entry.second.to(state);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_recent_offers_for::get_field(const std::string& _name) const {\n\tif(_name == \"bid\") {\n\t\treturn vnx::Variant(bid);\n\t}\n\tif(_name == \"ask\") {\n\t\treturn vnx::Variant(ask);\n\t}\n\tif(_name == \"min_bid\") {\n\t\treturn vnx::Variant(min_bid);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\tif(_name == \"state\") {\n\t\treturn vnx::Variant(state);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_recent_offers_for::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"bid\") {\n\t\t_value.to(bid);\n\t} else if(_name == \"ask\") {\n\t\t_value.to(ask);\n\t} else if(_name == \"min_bid\") {\n\t\t_value.to(min_bid);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t} else if(_name == \"state\") {\n\t\t_value.to(state);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_recent_offers_for& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_recent_offers_for& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_recent_offers_for::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_recent_offers_for::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_recent_offers_for\";\n\ttype_code->type_hash = vnx::Hash64(0xd89f845556eb17a0ull);\n\ttype_code->code_hash = vnx::Hash64(0x257e50ef372250f1ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_recent_offers_for);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_recent_offers_for>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_recent_offers_for_return::static_get_type_code();\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"bid\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"ask\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"min_bid\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"state\";\n\t\tfield.value = vnx::to_string(true);\n\t\tfield.code = {31};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_recent_offers_for& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.state, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.bid, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.ask, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.min_bid, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers_for& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_recent_offers_for;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_recent_offers_for>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(5);\n\tvnx::write_value(_buf + 0, value.limit);\n\tvnx::write_value(_buf + 4, value.state);\n\tvnx::write(out, value.bid, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.ask, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.min_bid, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_recent_offers_for& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers_for& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers_for& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_recent_offers_for_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_recent_offers_for_return.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_recent_offers_for_return::VNX_TYPE_HASH(0x8fbaa054b954ea7bull);\nconst vnx::Hash64 Node_get_recent_offers_for_return::VNX_CODE_HASH(0x7fa3e9a6745ba583ull);\n\nvnx::Hash64 Node_get_recent_offers_for_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_recent_offers_for_return::get_type_name() const {\n\treturn \"mmx.Node.get_recent_offers_for.return\";\n}\n\nconst vnx::TypeCode* Node_get_recent_offers_for_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_recent_offers_for_return;\n}\n\nstd::shared_ptr<Node_get_recent_offers_for_return> Node_get_recent_offers_for_return::create() {\n\treturn std::make_shared<Node_get_recent_offers_for_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_recent_offers_for_return::clone() const {\n\treturn std::make_shared<Node_get_recent_offers_for_return>(*this);\n}\n\nvoid Node_get_recent_offers_for_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_recent_offers_for_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_recent_offers_for_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_recent_offers_for_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_recent_offers_for_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_recent_offers_for.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_recent_offers_for_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_recent_offers_for_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_recent_offers_for.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_recent_offers_for_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_recent_offers_for_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_recent_offers_for_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_recent_offers_for_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_recent_offers_for_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_recent_offers_for_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_recent_offers_for_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_recent_offers_for.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8fbaa054b954ea7bull);\n\ttype_code->code_hash = vnx::Hash64(0x7fa3e9a6745ba583ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_recent_offers_for_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_recent_offers_for_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::offer_data_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_recent_offers_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_recent_offers_for_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_recent_offers_for_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_recent_offers_for_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers_for_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers_for_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_recent_offers_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_recent_offers_return.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_recent_offers_return::VNX_TYPE_HASH(0x15933813d284d584ull);\nconst vnx::Hash64 Node_get_recent_offers_return::VNX_CODE_HASH(0xb758ab600a6d96d5ull);\n\nvnx::Hash64 Node_get_recent_offers_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_recent_offers_return::get_type_name() const {\n\treturn \"mmx.Node.get_recent_offers.return\";\n}\n\nconst vnx::TypeCode* Node_get_recent_offers_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_recent_offers_return;\n}\n\nstd::shared_ptr<Node_get_recent_offers_return> Node_get_recent_offers_return::create() {\n\treturn std::make_shared<Node_get_recent_offers_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_recent_offers_return::clone() const {\n\treturn std::make_shared<Node_get_recent_offers_return>(*this);\n}\n\nvoid Node_get_recent_offers_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_recent_offers_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_recent_offers_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_recent_offers_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_recent_offers_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_recent_offers.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_recent_offers_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_recent_offers_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_recent_offers.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_recent_offers_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_recent_offers_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_recent_offers_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_recent_offers_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_recent_offers_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_recent_offers_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_recent_offers_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_recent_offers.return\";\n\ttype_code->type_hash = vnx::Hash64(0x15933813d284d584ull);\n\ttype_code->code_hash = vnx::Hash64(0xb758ab600a6d96d5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_recent_offers_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_recent_offers_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::offer_data_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_recent_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_recent_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_recent_offers_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_recent_offers_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_recent_offers_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_recent_offers_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_recent_offers_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_equivalent_liquidity.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_equivalent_liquidity::VNX_TYPE_HASH(0xc43a3083725aa480ull);\nconst vnx::Hash64 Node_get_swap_equivalent_liquidity::VNX_CODE_HASH(0x37a2dc4c2ca169eull);\n\nvnx::Hash64 Node_get_swap_equivalent_liquidity::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_equivalent_liquidity::get_type_name() const {\n\treturn \"mmx.Node.get_swap_equivalent_liquidity\";\n}\n\nconst vnx::TypeCode* Node_get_swap_equivalent_liquidity::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_equivalent_liquidity;\n}\n\nstd::shared_ptr<Node_get_swap_equivalent_liquidity> Node_get_swap_equivalent_liquidity::create() {\n\treturn std::make_shared<Node_get_swap_equivalent_liquidity>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_equivalent_liquidity::clone() const {\n\treturn std::make_shared<Node_get_swap_equivalent_liquidity>(*this);\n}\n\nvoid Node_get_swap_equivalent_liquidity::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_equivalent_liquidity::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_equivalent_liquidity::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_equivalent_liquidity;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, user);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_equivalent_liquidity::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_equivalent_liquidity\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"user\\\": \"; vnx::write(_out, user);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_equivalent_liquidity::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_equivalent_liquidity::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_equivalent_liquidity\";\n\t_object[\"address\"] = address;\n\t_object[\"user\"] = user;\n\treturn _object;\n}\n\nvoid Node_get_swap_equivalent_liquidity::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"user\") {\n\t\t\t_entry.second.to(user);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_equivalent_liquidity::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"user\") {\n\t\treturn vnx::Variant(user);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_equivalent_liquidity::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"user\") {\n\t\t_value.to(user);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_equivalent_liquidity& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_equivalent_liquidity& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_equivalent_liquidity::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_equivalent_liquidity::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_equivalent_liquidity\";\n\ttype_code->type_hash = vnx::Hash64(0xc43a3083725aa480ull);\n\ttype_code->code_hash = vnx::Hash64(0x37a2dc4c2ca169eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_equivalent_liquidity);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_equivalent_liquidity>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_swap_equivalent_liquidity_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_equivalent_liquidity& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.user, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_equivalent_liquidity& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_equivalent_liquidity;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_equivalent_liquidity>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.user, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_equivalent_liquidity& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_equivalent_liquidity& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_equivalent_liquidity& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_equivalent_liquidity_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity_return.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_equivalent_liquidity_return::VNX_TYPE_HASH(0x8222183b679ab5f4ull);\nconst vnx::Hash64 Node_get_swap_equivalent_liquidity_return::VNX_CODE_HASH(0xa9a47d30b9554b73ull);\n\nvnx::Hash64 Node_get_swap_equivalent_liquidity_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_equivalent_liquidity_return::get_type_name() const {\n\treturn \"mmx.Node.get_swap_equivalent_liquidity.return\";\n}\n\nconst vnx::TypeCode* Node_get_swap_equivalent_liquidity_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_equivalent_liquidity_return;\n}\n\nstd::shared_ptr<Node_get_swap_equivalent_liquidity_return> Node_get_swap_equivalent_liquidity_return::create() {\n\treturn std::make_shared<Node_get_swap_equivalent_liquidity_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_equivalent_liquidity_return::clone() const {\n\treturn std::make_shared<Node_get_swap_equivalent_liquidity_return>(*this);\n}\n\nvoid Node_get_swap_equivalent_liquidity_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_equivalent_liquidity_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_equivalent_liquidity_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_equivalent_liquidity_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_equivalent_liquidity_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_equivalent_liquidity.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_equivalent_liquidity_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_equivalent_liquidity_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_equivalent_liquidity.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_swap_equivalent_liquidity_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_equivalent_liquidity_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_equivalent_liquidity_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_equivalent_liquidity_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_equivalent_liquidity_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_equivalent_liquidity_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_equivalent_liquidity_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_equivalent_liquidity.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8222183b679ab5f4ull);\n\ttype_code->code_hash = vnx::Hash64(0xa9a47d30b9554b73ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_equivalent_liquidity_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_equivalent_liquidity_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_equivalent_liquidity_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_equivalent_liquidity_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_equivalent_liquidity_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_equivalent_liquidity_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_equivalent_liquidity_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_equivalent_liquidity_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_equivalent_liquidity_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_fees_earned.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_fees_earned.hxx>\n#include <mmx/Node_get_swap_fees_earned_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_fees_earned::VNX_TYPE_HASH(0x1dae57fb82265b93ull);\nconst vnx::Hash64 Node_get_swap_fees_earned::VNX_CODE_HASH(0x90e2c4fd714377b5ull);\n\nvnx::Hash64 Node_get_swap_fees_earned::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_fees_earned::get_type_name() const {\n\treturn \"mmx.Node.get_swap_fees_earned\";\n}\n\nconst vnx::TypeCode* Node_get_swap_fees_earned::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_fees_earned;\n}\n\nstd::shared_ptr<Node_get_swap_fees_earned> Node_get_swap_fees_earned::create() {\n\treturn std::make_shared<Node_get_swap_fees_earned>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_fees_earned::clone() const {\n\treturn std::make_shared<Node_get_swap_fees_earned>(*this);\n}\n\nvoid Node_get_swap_fees_earned::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_fees_earned::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_fees_earned::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_fees_earned;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, user);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_fees_earned::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_fees_earned\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"user\\\": \"; vnx::write(_out, user);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_fees_earned::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_fees_earned::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_fees_earned\";\n\t_object[\"address\"] = address;\n\t_object[\"user\"] = user;\n\treturn _object;\n}\n\nvoid Node_get_swap_fees_earned::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"user\") {\n\t\t\t_entry.second.to(user);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_fees_earned::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"user\") {\n\t\treturn vnx::Variant(user);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_fees_earned::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"user\") {\n\t\t_value.to(user);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_fees_earned& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_fees_earned& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_fees_earned::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_fees_earned::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_fees_earned\";\n\ttype_code->type_hash = vnx::Hash64(0x1dae57fb82265b93ull);\n\ttype_code->code_hash = vnx::Hash64(0x90e2c4fd714377b5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_fees_earned);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_fees_earned>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_swap_fees_earned_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_fees_earned& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.user, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_fees_earned& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_fees_earned;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_fees_earned>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.user, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_fees_earned& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_fees_earned& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_fees_earned& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_fees_earned_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_fees_earned_return.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_fees_earned_return::VNX_TYPE_HASH(0x57002afc89a8db98ull);\nconst vnx::Hash64 Node_get_swap_fees_earned_return::VNX_CODE_HASH(0x26e18797ed0fa73bull);\n\nvnx::Hash64 Node_get_swap_fees_earned_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_fees_earned_return::get_type_name() const {\n\treturn \"mmx.Node.get_swap_fees_earned.return\";\n}\n\nconst vnx::TypeCode* Node_get_swap_fees_earned_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_fees_earned_return;\n}\n\nstd::shared_ptr<Node_get_swap_fees_earned_return> Node_get_swap_fees_earned_return::create() {\n\treturn std::make_shared<Node_get_swap_fees_earned_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_fees_earned_return::clone() const {\n\treturn std::make_shared<Node_get_swap_fees_earned_return>(*this);\n}\n\nvoid Node_get_swap_fees_earned_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_fees_earned_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_fees_earned_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_fees_earned_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_fees_earned_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_fees_earned.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_fees_earned_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_fees_earned_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_fees_earned.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_swap_fees_earned_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_fees_earned_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_fees_earned_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_fees_earned_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_fees_earned_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_fees_earned_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_fees_earned_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_fees_earned.return\";\n\ttype_code->type_hash = vnx::Hash64(0x57002afc89a8db98ull);\n\ttype_code->code_hash = vnx::Hash64(0x26e18797ed0fa73bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_fees_earned_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_fees_earned_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_fees_earned_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_fees_earned_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_fees_earned_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_fees_earned_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_fees_earned_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_fees_earned_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_fees_earned_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_history.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_history.hxx>\n#include <mmx/Node_get_swap_history_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_history::VNX_TYPE_HASH(0xc16faaf15fcc9f36ull);\nconst vnx::Hash64 Node_get_swap_history::VNX_CODE_HASH(0xf6187067c518204bull);\n\nvnx::Hash64 Node_get_swap_history::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_history::get_type_name() const {\n\treturn \"mmx.Node.get_swap_history\";\n}\n\nconst vnx::TypeCode* Node_get_swap_history::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_history;\n}\n\nstd::shared_ptr<Node_get_swap_history> Node_get_swap_history::create() {\n\treturn std::make_shared<Node_get_swap_history>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_history::clone() const {\n\treturn std::make_shared<Node_get_swap_history>(*this);\n}\n\nvoid Node_get_swap_history::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_history::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_history::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_history;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, limit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_history::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_history\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_history::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_history::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_history\";\n\t_object[\"address\"] = address;\n\t_object[\"limit\"] = limit;\n\treturn _object;\n}\n\nvoid Node_get_swap_history::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_history::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_history::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_history& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_history& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_history::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_history::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_history\";\n\ttype_code->type_hash = vnx::Hash64(0xc16faaf15fcc9f36ull);\n\ttype_code->code_hash = vnx::Hash64(0xf6187067c518204bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_history);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_history>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_swap_history_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_history& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_history& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_history;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_history>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.limit);\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_history& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_history& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_history& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_history_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_history_return.hxx>\n#include <mmx/swap_entry_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_history_return::VNX_TYPE_HASH(0xe5d18002a6793518ull);\nconst vnx::Hash64 Node_get_swap_history_return::VNX_CODE_HASH(0x5992d6f04a91c899ull);\n\nvnx::Hash64 Node_get_swap_history_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_history_return::get_type_name() const {\n\treturn \"mmx.Node.get_swap_history.return\";\n}\n\nconst vnx::TypeCode* Node_get_swap_history_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_history_return;\n}\n\nstd::shared_ptr<Node_get_swap_history_return> Node_get_swap_history_return::create() {\n\treturn std::make_shared<Node_get_swap_history_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_history_return::clone() const {\n\treturn std::make_shared<Node_get_swap_history_return>(*this);\n}\n\nvoid Node_get_swap_history_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_history_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_history_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_history_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_history_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_history.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_history_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_history_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_history.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_swap_history_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_history_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_history_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_history_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_history_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_history_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_history_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_history.return\";\n\ttype_code->type_hash = vnx::Hash64(0xe5d18002a6793518ull);\n\ttype_code->code_hash = vnx::Hash64(0x5992d6f04a91c899ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_history_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_history_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::swap_entry_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_history_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_history_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_history_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_history_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_history_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_info.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_info.hxx>\n#include <mmx/Node_get_swap_info_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_info::VNX_TYPE_HASH(0x14f546a807fae18cull);\nconst vnx::Hash64 Node_get_swap_info::VNX_CODE_HASH(0x209e3ab45f0cbb44ull);\n\nvnx::Hash64 Node_get_swap_info::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_info::get_type_name() const {\n\treturn \"mmx.Node.get_swap_info\";\n}\n\nconst vnx::TypeCode* Node_get_swap_info::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_info;\n}\n\nstd::shared_ptr<Node_get_swap_info> Node_get_swap_info::create() {\n\treturn std::make_shared<Node_get_swap_info>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_info::clone() const {\n\treturn std::make_shared<Node_get_swap_info>(*this);\n}\n\nvoid Node_get_swap_info::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_info::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_info::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_info;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_info::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_info\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_info::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_info::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_info\";\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Node_get_swap_info::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_info::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_info::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_info& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_info& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_info::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_info::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_info\";\n\ttype_code->type_hash = vnx::Hash64(0x14f546a807fae18cull);\n\ttype_code->code_hash = vnx::Hash64(0x209e3ab45f0cbb44ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_info);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_info>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_swap_info_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_info;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_info>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_info& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_info& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_info& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_info_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_info_return.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_info_return::VNX_TYPE_HASH(0x302116742171428ull);\nconst vnx::Hash64 Node_get_swap_info_return::VNX_CODE_HASH(0xae9c868fbe0e8b4aull);\n\nvnx::Hash64 Node_get_swap_info_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_info_return::get_type_name() const {\n\treturn \"mmx.Node.get_swap_info.return\";\n}\n\nconst vnx::TypeCode* Node_get_swap_info_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_info_return;\n}\n\nstd::shared_ptr<Node_get_swap_info_return> Node_get_swap_info_return::create() {\n\treturn std::make_shared<Node_get_swap_info_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_info_return::clone() const {\n\treturn std::make_shared<Node_get_swap_info_return>(*this);\n}\n\nvoid Node_get_swap_info_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_info_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_info_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_info_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_info_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_info.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_info_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_info_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_info.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_swap_info_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_info_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_info_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_info_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_info_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_info_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_info_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_info.return\";\n\ttype_code->type_hash = vnx::Hash64(0x302116742171428ull);\n\ttype_code->code_hash = vnx::Hash64(0xae9c868fbe0e8b4aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_info_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_info_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::swap_info_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_info_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_info_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_info_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_info_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_info_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_liquidity_by.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_liquidity_by.hxx>\n#include <mmx/Node_get_swap_liquidity_by_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_liquidity_by::VNX_TYPE_HASH(0x426cded100da751eull);\nconst vnx::Hash64 Node_get_swap_liquidity_by::VNX_CODE_HASH(0xcaafc5d8fba2d9b3ull);\n\nvnx::Hash64 Node_get_swap_liquidity_by::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_liquidity_by::get_type_name() const {\n\treturn \"mmx.Node.get_swap_liquidity_by\";\n}\n\nconst vnx::TypeCode* Node_get_swap_liquidity_by::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_liquidity_by;\n}\n\nstd::shared_ptr<Node_get_swap_liquidity_by> Node_get_swap_liquidity_by::create() {\n\treturn std::make_shared<Node_get_swap_liquidity_by>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_liquidity_by::clone() const {\n\treturn std::make_shared<Node_get_swap_liquidity_by>(*this);\n}\n\nvoid Node_get_swap_liquidity_by::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_liquidity_by::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_liquidity_by::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_liquidity_by;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_liquidity_by::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_liquidity_by\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_liquidity_by::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_liquidity_by::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_liquidity_by\";\n\t_object[\"addresses\"] = addresses;\n\treturn _object;\n}\n\nvoid Node_get_swap_liquidity_by::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_liquidity_by::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_liquidity_by::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_liquidity_by& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_liquidity_by& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_liquidity_by::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_liquidity_by::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_liquidity_by\";\n\ttype_code->type_hash = vnx::Hash64(0x426cded100da751eull);\n\ttype_code->code_hash = vnx::Hash64(0xcaafc5d8fba2d9b3ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_liquidity_by);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_liquidity_by>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_swap_liquidity_by_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_liquidity_by& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_liquidity_by& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_liquidity_by;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_liquidity_by>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_liquidity_by& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_liquidity_by& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_liquidity_by& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_liquidity_by_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_liquidity_by_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_liquidity_by_return::VNX_TYPE_HASH(0x8401973e1930a6c0ull);\nconst vnx::Hash64 Node_get_swap_liquidity_by_return::VNX_CODE_HASH(0xb684484e073bc385ull);\n\nvnx::Hash64 Node_get_swap_liquidity_by_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_liquidity_by_return::get_type_name() const {\n\treturn \"mmx.Node.get_swap_liquidity_by.return\";\n}\n\nconst vnx::TypeCode* Node_get_swap_liquidity_by_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_liquidity_by_return;\n}\n\nstd::shared_ptr<Node_get_swap_liquidity_by_return> Node_get_swap_liquidity_by_return::create() {\n\treturn std::make_shared<Node_get_swap_liquidity_by_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_liquidity_by_return::clone() const {\n\treturn std::make_shared<Node_get_swap_liquidity_by_return>(*this);\n}\n\nvoid Node_get_swap_liquidity_by_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_liquidity_by_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_liquidity_by_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_liquidity_by_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_liquidity_by_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_liquidity_by.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_liquidity_by_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_liquidity_by_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_liquidity_by.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_swap_liquidity_by_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_liquidity_by_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_liquidity_by_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_liquidity_by_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_liquidity_by_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_liquidity_by_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_liquidity_by_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_liquidity_by.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8401973e1930a6c0ull);\n\ttype_code->code_hash = vnx::Hash64(0xb684484e073bc385ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_liquidity_by_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_liquidity_by_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 5, 11, 32, 1, 11, 2, 23, 2, 4, 7, 11, 32, 1, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_liquidity_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_liquidity_by_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_liquidity_by_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_liquidity_by_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_liquidity_by_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_liquidity_by_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_liquidity_by_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_trade_estimate.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_trade_estimate.hxx>\n#include <mmx/Node_get_swap_trade_estimate_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_trade_estimate::VNX_TYPE_HASH(0x1c3d2e0c3a431e9eull);\nconst vnx::Hash64 Node_get_swap_trade_estimate::VNX_CODE_HASH(0x59ac243a11f8e99dull);\n\nvnx::Hash64 Node_get_swap_trade_estimate::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_trade_estimate::get_type_name() const {\n\treturn \"mmx.Node.get_swap_trade_estimate\";\n}\n\nconst vnx::TypeCode* Node_get_swap_trade_estimate::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_trade_estimate;\n}\n\nstd::shared_ptr<Node_get_swap_trade_estimate> Node_get_swap_trade_estimate::create() {\n\treturn std::make_shared<Node_get_swap_trade_estimate>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_trade_estimate::clone() const {\n\treturn std::make_shared<Node_get_swap_trade_estimate>(*this);\n}\n\nvoid Node_get_swap_trade_estimate::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_trade_estimate::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_trade_estimate::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_trade_estimate;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, i);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, num_iter);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_trade_estimate::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_trade_estimate\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"i\\\": \"; vnx::write(_out, i);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"num_iter\\\": \"; vnx::write(_out, num_iter);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_trade_estimate::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_trade_estimate::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_trade_estimate\";\n\t_object[\"address\"] = address;\n\t_object[\"i\"] = i;\n\t_object[\"amount\"] = amount;\n\t_object[\"num_iter\"] = num_iter;\n\treturn _object;\n}\n\nvoid Node_get_swap_trade_estimate::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"i\") {\n\t\t\t_entry.second.to(i);\n\t\t} else if(_entry.first == \"num_iter\") {\n\t\t\t_entry.second.to(num_iter);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_trade_estimate::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"i\") {\n\t\treturn vnx::Variant(i);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"num_iter\") {\n\t\treturn vnx::Variant(num_iter);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_trade_estimate::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"i\") {\n\t\t_value.to(i);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"num_iter\") {\n\t\t_value.to(num_iter);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_trade_estimate& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_trade_estimate& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_trade_estimate::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_trade_estimate::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_trade_estimate\";\n\ttype_code->type_hash = vnx::Hash64(0x1c3d2e0c3a431e9eull);\n\ttype_code->code_hash = vnx::Hash64(0x59ac243a11f8e99dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_trade_estimate);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_trade_estimate>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_swap_trade_estimate_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"i\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_iter\";\n\t\tfield.value = vnx::to_string(20);\n\t\tfield.code = {7};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_trade_estimate& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.i, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_iter, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_trade_estimate& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_trade_estimate;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_trade_estimate>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.i);\n\tvnx::write_value(_buf + 4, value.num_iter);\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_trade_estimate& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_trade_estimate& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_trade_estimate& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_trade_estimate_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_trade_estimate_return.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_trade_estimate_return::VNX_TYPE_HASH(0xdad9da7cd6d250a8ull);\nconst vnx::Hash64 Node_get_swap_trade_estimate_return::VNX_CODE_HASH(0x18e5c28b0e63af60ull);\n\nvnx::Hash64 Node_get_swap_trade_estimate_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_trade_estimate_return::get_type_name() const {\n\treturn \"mmx.Node.get_swap_trade_estimate.return\";\n}\n\nconst vnx::TypeCode* Node_get_swap_trade_estimate_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_trade_estimate_return;\n}\n\nstd::shared_ptr<Node_get_swap_trade_estimate_return> Node_get_swap_trade_estimate_return::create() {\n\treturn std::make_shared<Node_get_swap_trade_estimate_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_trade_estimate_return::clone() const {\n\treturn std::make_shared<Node_get_swap_trade_estimate_return>(*this);\n}\n\nvoid Node_get_swap_trade_estimate_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_trade_estimate_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_trade_estimate_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_trade_estimate_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_trade_estimate_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_trade_estimate.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_trade_estimate_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_trade_estimate_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_trade_estimate.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_swap_trade_estimate_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_trade_estimate_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_trade_estimate_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_trade_estimate_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_trade_estimate_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_trade_estimate_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_trade_estimate_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_trade_estimate.return\";\n\ttype_code->type_hash = vnx::Hash64(0xdad9da7cd6d250a8ull);\n\ttype_code->code_hash = vnx::Hash64(0x18e5c28b0e63af60ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_trade_estimate_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_trade_estimate_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_trade_estimate_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_trade_estimate_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_trade_estimate_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_trade_estimate_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_trade_estimate_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_trade_estimate_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_trade_estimate_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_user_info.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_user_info.hxx>\n#include <mmx/Node_get_swap_user_info_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_user_info::VNX_TYPE_HASH(0xb92b8fb7df56ec0full);\nconst vnx::Hash64 Node_get_swap_user_info::VNX_CODE_HASH(0xf7e2a3665d4104cfull);\n\nvnx::Hash64 Node_get_swap_user_info::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_user_info::get_type_name() const {\n\treturn \"mmx.Node.get_swap_user_info\";\n}\n\nconst vnx::TypeCode* Node_get_swap_user_info::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_user_info;\n}\n\nstd::shared_ptr<Node_get_swap_user_info> Node_get_swap_user_info::create() {\n\treturn std::make_shared<Node_get_swap_user_info>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_user_info::clone() const {\n\treturn std::make_shared<Node_get_swap_user_info>(*this);\n}\n\nvoid Node_get_swap_user_info::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_user_info::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_user_info::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_user_info;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, user);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_user_info::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_user_info\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"user\\\": \"; vnx::write(_out, user);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_user_info::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_user_info::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_user_info\";\n\t_object[\"address\"] = address;\n\t_object[\"user\"] = user;\n\treturn _object;\n}\n\nvoid Node_get_swap_user_info::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"user\") {\n\t\t\t_entry.second.to(user);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_user_info::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"user\") {\n\t\treturn vnx::Variant(user);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_user_info::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"user\") {\n\t\t_value.to(user);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_user_info& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_user_info& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_user_info::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_user_info::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_user_info\";\n\ttype_code->type_hash = vnx::Hash64(0xb92b8fb7df56ec0full);\n\ttype_code->code_hash = vnx::Hash64(0xf7e2a3665d4104cfull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_user_info);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_user_info>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_swap_user_info_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_user_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.user, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_user_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_user_info;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_user_info>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.user, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_user_info& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_user_info& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_user_info& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swap_user_info_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swap_user_info_return.hxx>\n#include <mmx/swap_user_info_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swap_user_info_return::VNX_TYPE_HASH(0x50fb0bab9551a420ull);\nconst vnx::Hash64 Node_get_swap_user_info_return::VNX_CODE_HASH(0xed728cdf39ccbb56ull);\n\nvnx::Hash64 Node_get_swap_user_info_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swap_user_info_return::get_type_name() const {\n\treturn \"mmx.Node.get_swap_user_info.return\";\n}\n\nconst vnx::TypeCode* Node_get_swap_user_info_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swap_user_info_return;\n}\n\nstd::shared_ptr<Node_get_swap_user_info_return> Node_get_swap_user_info_return::create() {\n\treturn std::make_shared<Node_get_swap_user_info_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swap_user_info_return::clone() const {\n\treturn std::make_shared<Node_get_swap_user_info_return>(*this);\n}\n\nvoid Node_get_swap_user_info_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_user_info_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swap_user_info_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swap_user_info_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swap_user_info_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swap_user_info.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_swap_user_info_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swap_user_info_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swap_user_info.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_swap_user_info_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swap_user_info_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swap_user_info_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swap_user_info_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swap_user_info_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swap_user_info_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swap_user_info_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swap_user_info.return\";\n\ttype_code->type_hash = vnx::Hash64(0x50fb0bab9551a420ull);\n\ttype_code->code_hash = vnx::Hash64(0xed728cdf39ccbb56ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swap_user_info_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swap_user_info_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::swap_user_info_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swap_user_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swap_user_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swap_user_info_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swap_user_info_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swap_user_info_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swap_user_info_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swap_user_info_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swaps.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swaps.hxx>\n#include <mmx/Node_get_swaps_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swaps::VNX_TYPE_HASH(0x219bbb3e5dcd19eaull);\nconst vnx::Hash64 Node_get_swaps::VNX_CODE_HASH(0x7e2b02fa5105020full);\n\nvnx::Hash64 Node_get_swaps::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swaps::get_type_name() const {\n\treturn \"mmx.Node.get_swaps\";\n}\n\nconst vnx::TypeCode* Node_get_swaps::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swaps;\n}\n\nstd::shared_ptr<Node_get_swaps> Node_get_swaps::create() {\n\treturn std::make_shared<Node_get_swaps>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swaps::clone() const {\n\treturn std::make_shared<Node_get_swaps>(*this);\n}\n\nvoid Node_get_swaps::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swaps::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swaps::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swaps;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, since);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, token);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, currency);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, limit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swaps::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swaps\\\"\";\n\t_out << \", \\\"since\\\": \"; vnx::write(_out, since);\n\t_out << \", \\\"token\\\": \"; vnx::write(_out, token);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \"}\";\n}\n\nvoid Node_get_swaps::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swaps::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swaps\";\n\t_object[\"since\"] = since;\n\t_object[\"token\"] = token;\n\t_object[\"currency\"] = currency;\n\t_object[\"limit\"] = limit;\n\treturn _object;\n}\n\nvoid Node_get_swaps::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"since\") {\n\t\t\t_entry.second.to(since);\n\t\t} else if(_entry.first == \"token\") {\n\t\t\t_entry.second.to(token);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swaps::get_field(const std::string& _name) const {\n\tif(_name == \"since\") {\n\t\treturn vnx::Variant(since);\n\t}\n\tif(_name == \"token\") {\n\t\treturn vnx::Variant(token);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swaps::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"since\") {\n\t\t_value.to(since);\n\t} else if(_name == \"token\") {\n\t\t_value.to(token);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swaps& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swaps& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swaps::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swaps::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swaps\";\n\ttype_code->type_hash = vnx::Hash64(0x219bbb3e5dcd19eaull);\n\ttype_code->code_hash = vnx::Hash64(0x7e2b02fa5105020full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swaps);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swaps>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_swaps_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"since\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"token\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swaps& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.since, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.token, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swaps& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swaps;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swaps>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.since);\n\tvnx::write_value(_buf + 4, value.limit);\n\tvnx::write(out, value.token, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.currency, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swaps& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swaps& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swaps& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_swaps_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_swaps_return.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_swaps_return::VNX_TYPE_HASH(0x6c94172788fc0d28ull);\nconst vnx::Hash64 Node_get_swaps_return::VNX_CODE_HASH(0x202bfdbb7557dd36ull);\n\nvnx::Hash64 Node_get_swaps_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_swaps_return::get_type_name() const {\n\treturn \"mmx.Node.get_swaps.return\";\n}\n\nconst vnx::TypeCode* Node_get_swaps_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_swaps_return;\n}\n\nstd::shared_ptr<Node_get_swaps_return> Node_get_swaps_return::create() {\n\treturn std::make_shared<Node_get_swaps_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_swaps_return::clone() const {\n\treturn std::make_shared<Node_get_swaps_return>(*this);\n}\n\nvoid Node_get_swaps_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_swaps_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_swaps_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_swaps_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_swaps_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_swaps.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_swaps_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_swaps_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_swaps.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_swaps_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_swaps_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_swaps_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_swaps_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_swaps_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_swaps_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_swaps_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_swaps.return\";\n\ttype_code->type_hash = vnx::Hash64(0x6c94172788fc0d28ull);\n\ttype_code->code_hash = vnx::Hash64(0x202bfdbb7557dd36ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_swaps_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_swaps_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::swap_info_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_swaps_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_swaps_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_swaps_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_swaps_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_swaps_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_swaps_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_swaps_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_synced_height.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_synced_height.hxx>\n#include <mmx/Node_get_synced_height_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_synced_height::VNX_TYPE_HASH(0xc4fb44ec3d1a8bb7ull);\nconst vnx::Hash64 Node_get_synced_height::VNX_CODE_HASH(0x464cc259b6a2d63eull);\n\nvnx::Hash64 Node_get_synced_height::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_synced_height::get_type_name() const {\n\treturn \"mmx.Node.get_synced_height\";\n}\n\nconst vnx::TypeCode* Node_get_synced_height::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_synced_height;\n}\n\nstd::shared_ptr<Node_get_synced_height> Node_get_synced_height::create() {\n\treturn std::make_shared<Node_get_synced_height>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_synced_height::clone() const {\n\treturn std::make_shared<Node_get_synced_height>(*this);\n}\n\nvoid Node_get_synced_height::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_synced_height::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_synced_height::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_synced_height;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_synced_height::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_synced_height\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_get_synced_height::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_synced_height::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_synced_height\";\n\treturn _object;\n}\n\nvoid Node_get_synced_height::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_get_synced_height::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_get_synced_height::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_synced_height& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_synced_height& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_synced_height::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_synced_height::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_synced_height\";\n\ttype_code->type_hash = vnx::Hash64(0xc4fb44ec3d1a8bb7ull);\n\ttype_code->code_hash = vnx::Hash64(0x464cc259b6a2d63eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_synced_height);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_synced_height>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_synced_height_return::static_get_type_code();\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_synced_height& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_synced_height& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_synced_height;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_synced_height>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_synced_height& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_synced_height& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_height& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_synced_height_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_synced_height_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_synced_height_return::VNX_TYPE_HASH(0xd466ce92d1bbe9dbull);\nconst vnx::Hash64 Node_get_synced_height_return::VNX_CODE_HASH(0x7d7b9560128347f5ull);\n\nvnx::Hash64 Node_get_synced_height_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_synced_height_return::get_type_name() const {\n\treturn \"mmx.Node.get_synced_height.return\";\n}\n\nconst vnx::TypeCode* Node_get_synced_height_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_synced_height_return;\n}\n\nstd::shared_ptr<Node_get_synced_height_return> Node_get_synced_height_return::create() {\n\treturn std::make_shared<Node_get_synced_height_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_synced_height_return::clone() const {\n\treturn std::make_shared<Node_get_synced_height_return>(*this);\n}\n\nvoid Node_get_synced_height_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_synced_height_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_synced_height_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_synced_height_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_synced_height_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_synced_height.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_synced_height_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_synced_height_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_synced_height.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_synced_height_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_synced_height_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_synced_height_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_synced_height_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_synced_height_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_synced_height_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_synced_height_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_synced_height.return\";\n\ttype_code->type_hash = vnx::Hash64(0xd466ce92d1bbe9dbull);\n\ttype_code->code_hash = vnx::Hash64(0x7d7b9560128347f5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_synced_height_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_synced_height_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {33, 3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_synced_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_synced_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_synced_height_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_synced_height_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_synced_height_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_synced_height_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_height_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_synced_vdf_height.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_synced_vdf_height.hxx>\n#include <mmx/Node_get_synced_vdf_height_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_synced_vdf_height::VNX_TYPE_HASH(0x3c9ce92abd3b42c6ull);\nconst vnx::Hash64 Node_get_synced_vdf_height::VNX_CODE_HASH(0x82b1484b9ecd3657ull);\n\nvnx::Hash64 Node_get_synced_vdf_height::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_synced_vdf_height::get_type_name() const {\n\treturn \"mmx.Node.get_synced_vdf_height\";\n}\n\nconst vnx::TypeCode* Node_get_synced_vdf_height::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_synced_vdf_height;\n}\n\nstd::shared_ptr<Node_get_synced_vdf_height> Node_get_synced_vdf_height::create() {\n\treturn std::make_shared<Node_get_synced_vdf_height>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_synced_vdf_height::clone() const {\n\treturn std::make_shared<Node_get_synced_vdf_height>(*this);\n}\n\nvoid Node_get_synced_vdf_height::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_synced_vdf_height::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_synced_vdf_height::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_synced_vdf_height;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_synced_vdf_height::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_synced_vdf_height\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_get_synced_vdf_height::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_synced_vdf_height::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_synced_vdf_height\";\n\treturn _object;\n}\n\nvoid Node_get_synced_vdf_height::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_get_synced_vdf_height::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_get_synced_vdf_height::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_synced_vdf_height& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_synced_vdf_height& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_synced_vdf_height::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_synced_vdf_height::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_synced_vdf_height\";\n\ttype_code->type_hash = vnx::Hash64(0x3c9ce92abd3b42c6ull);\n\ttype_code->code_hash = vnx::Hash64(0x82b1484b9ecd3657ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_synced_vdf_height);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_synced_vdf_height>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_synced_vdf_height_return::static_get_type_code();\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_synced_vdf_height& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_synced_vdf_height& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_synced_vdf_height;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_synced_vdf_height>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_synced_vdf_height& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_synced_vdf_height& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_vdf_height& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_synced_vdf_height_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_synced_vdf_height_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_synced_vdf_height_return::VNX_TYPE_HASH(0x1122764a35c86b4ull);\nconst vnx::Hash64 Node_get_synced_vdf_height_return::VNX_CODE_HASH(0x474b1ca5fcfb3b7dull);\n\nvnx::Hash64 Node_get_synced_vdf_height_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_synced_vdf_height_return::get_type_name() const {\n\treturn \"mmx.Node.get_synced_vdf_height.return\";\n}\n\nconst vnx::TypeCode* Node_get_synced_vdf_height_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_synced_vdf_height_return;\n}\n\nstd::shared_ptr<Node_get_synced_vdf_height_return> Node_get_synced_vdf_height_return::create() {\n\treturn std::make_shared<Node_get_synced_vdf_height_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_synced_vdf_height_return::clone() const {\n\treturn std::make_shared<Node_get_synced_vdf_height_return>(*this);\n}\n\nvoid Node_get_synced_vdf_height_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_synced_vdf_height_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_synced_vdf_height_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_synced_vdf_height_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_synced_vdf_height_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_synced_vdf_height.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_synced_vdf_height_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_synced_vdf_height_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_synced_vdf_height.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_synced_vdf_height_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_synced_vdf_height_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_synced_vdf_height_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_synced_vdf_height_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_synced_vdf_height_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_synced_vdf_height_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_synced_vdf_height_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_synced_vdf_height.return\";\n\ttype_code->type_hash = vnx::Hash64(0x1122764a35c86b4ull);\n\ttype_code->code_hash = vnx::Hash64(0x474b1ca5fcfb3b7dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_synced_vdf_height_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_synced_vdf_height_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {33, 3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_synced_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_synced_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_synced_vdf_height_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_synced_vdf_height_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_synced_vdf_height_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_synced_vdf_height_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_synced_vdf_height_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_total_balance.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_total_balance.hxx>\n#include <mmx/Node_get_total_balance_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_total_balance::VNX_TYPE_HASH(0x91e9019d224db4b0ull);\nconst vnx::Hash64 Node_get_total_balance::VNX_CODE_HASH(0x17c673627fde8469ull);\n\nvnx::Hash64 Node_get_total_balance::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_total_balance::get_type_name() const {\n\treturn \"mmx.Node.get_total_balance\";\n}\n\nconst vnx::TypeCode* Node_get_total_balance::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_total_balance;\n}\n\nstd::shared_ptr<Node_get_total_balance> Node_get_total_balance::create() {\n\treturn std::make_shared<Node_get_total_balance>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_total_balance::clone() const {\n\treturn std::make_shared<Node_get_total_balance>(*this);\n}\n\nvoid Node_get_total_balance::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_total_balance::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_total_balance::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_total_balance;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, currency);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_total_balance::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_total_balance\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \"}\";\n}\n\nvoid Node_get_total_balance::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_total_balance::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_total_balance\";\n\t_object[\"addresses\"] = addresses;\n\t_object[\"currency\"] = currency;\n\treturn _object;\n}\n\nvoid Node_get_total_balance::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t} else if(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_total_balance::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_total_balance::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_total_balance& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_total_balance& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_total_balance::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_total_balance::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_total_balance\";\n\ttype_code->type_hash = vnx::Hash64(0x91e9019d224db4b0ull);\n\ttype_code->code_hash = vnx::Hash64(0x17c673627fde8469ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_total_balance);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_total_balance>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_total_balance_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_total_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_total_balance;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_total_balance>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.currency, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_total_balance& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_total_balance& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balance& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_total_balance_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_total_balance_return.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_total_balance_return::VNX_TYPE_HASH(0x3336380a894f52a8ull);\nconst vnx::Hash64 Node_get_total_balance_return::VNX_CODE_HASH(0x69d274a0a8cade7full);\n\nvnx::Hash64 Node_get_total_balance_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_total_balance_return::get_type_name() const {\n\treturn \"mmx.Node.get_total_balance.return\";\n}\n\nconst vnx::TypeCode* Node_get_total_balance_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_total_balance_return;\n}\n\nstd::shared_ptr<Node_get_total_balance_return> Node_get_total_balance_return::create() {\n\treturn std::make_shared<Node_get_total_balance_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_total_balance_return::clone() const {\n\treturn std::make_shared<Node_get_total_balance_return>(*this);\n}\n\nvoid Node_get_total_balance_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_total_balance_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_total_balance_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_total_balance_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_total_balance_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_total_balance.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_total_balance_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_total_balance_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_total_balance.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_total_balance_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_total_balance_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_total_balance_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_total_balance_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_total_balance_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_total_balance_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_total_balance_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_total_balance.return\";\n\ttype_code->type_hash = vnx::Hash64(0x3336380a894f52a8ull);\n\ttype_code->code_hash = vnx::Hash64(0x69d274a0a8cade7full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_total_balance_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_total_balance_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_total_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_total_balance_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_total_balance_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_total_balance_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_total_balance_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balance_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_total_balances.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_total_balances.hxx>\n#include <mmx/Node_get_total_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_total_balances::VNX_TYPE_HASH(0xf54c4ec46ee6053aull);\nconst vnx::Hash64 Node_get_total_balances::VNX_CODE_HASH(0xd2aad71eec31d2baull);\n\nvnx::Hash64 Node_get_total_balances::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_total_balances::get_type_name() const {\n\treturn \"mmx.Node.get_total_balances\";\n}\n\nconst vnx::TypeCode* Node_get_total_balances::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_total_balances;\n}\n\nstd::shared_ptr<Node_get_total_balances> Node_get_total_balances::create() {\n\treturn std::make_shared<Node_get_total_balances>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_total_balances::clone() const {\n\treturn std::make_shared<Node_get_total_balances>(*this);\n}\n\nvoid Node_get_total_balances::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_total_balances::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_total_balances::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_total_balances;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, whitelist);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, limit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_total_balances::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_total_balances\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \", \\\"whitelist\\\": \"; vnx::write(_out, whitelist);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \"}\";\n}\n\nvoid Node_get_total_balances::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_total_balances::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_total_balances\";\n\t_object[\"addresses\"] = addresses;\n\t_object[\"whitelist\"] = whitelist;\n\t_object[\"limit\"] = limit;\n\treturn _object;\n}\n\nvoid Node_get_total_balances::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"whitelist\") {\n\t\t\t_entry.second.to(whitelist);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_total_balances::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\tif(_name == \"whitelist\") {\n\t\treturn vnx::Variant(whitelist);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_total_balances::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t} else if(_name == \"whitelist\") {\n\t\t_value.to(whitelist);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_total_balances& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_total_balances& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_total_balances::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_total_balances::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_total_balances\";\n\ttype_code->type_hash = vnx::Hash64(0xf54c4ec46ee6053aull);\n\ttype_code->code_hash = vnx::Hash64(0xd2aad71eec31d2baull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_total_balances);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_total_balances>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_total_balances_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"whitelist\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_total_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.whitelist, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_total_balances;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_total_balances>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.limit);\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.whitelist, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_total_balances& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_total_balances& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balances& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_total_balances_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_total_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_total_balances_return::VNX_TYPE_HASH(0x9332c7a83f7644d7ull);\nconst vnx::Hash64 Node_get_total_balances_return::VNX_CODE_HASH(0xf94eb47d52857af5ull);\n\nvnx::Hash64 Node_get_total_balances_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_total_balances_return::get_type_name() const {\n\treturn \"mmx.Node.get_total_balances.return\";\n}\n\nconst vnx::TypeCode* Node_get_total_balances_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_total_balances_return;\n}\n\nstd::shared_ptr<Node_get_total_balances_return> Node_get_total_balances_return::create() {\n\treturn std::make_shared<Node_get_total_balances_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_total_balances_return::clone() const {\n\treturn std::make_shared<Node_get_total_balances_return>(*this);\n}\n\nvoid Node_get_total_balances_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_total_balances_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_total_balances_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_total_balances_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_total_balances_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_total_balances.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_total_balances_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_total_balances_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_total_balances.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_total_balances_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_total_balances_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_total_balances_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_total_balances_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_total_balances_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_total_balances_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_total_balances_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_total_balances.return\";\n\ttype_code->type_hash = vnx::Hash64(0x9332c7a83f7644d7ull);\n\ttype_code->code_hash = vnx::Hash64(0xf94eb47d52857af5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_total_balances_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_total_balances_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 5, 11, 32, 1, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_total_balances_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_total_balances_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_total_balances_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_total_balances_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_balances_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_total_supply.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_total_supply.hxx>\n#include <mmx/Node_get_total_supply_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_total_supply::VNX_TYPE_HASH(0x17d971db6900bd9dull);\nconst vnx::Hash64 Node_get_total_supply::VNX_CODE_HASH(0x165f215d915fdca0ull);\n\nvnx::Hash64 Node_get_total_supply::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_total_supply::get_type_name() const {\n\treturn \"mmx.Node.get_total_supply\";\n}\n\nconst vnx::TypeCode* Node_get_total_supply::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_total_supply;\n}\n\nstd::shared_ptr<Node_get_total_supply> Node_get_total_supply::create() {\n\treturn std::make_shared<Node_get_total_supply>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_total_supply::clone() const {\n\treturn std::make_shared<Node_get_total_supply>(*this);\n}\n\nvoid Node_get_total_supply::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_total_supply::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_total_supply::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_total_supply;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, currency);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_total_supply::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_total_supply\\\"\";\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \"}\";\n}\n\nvoid Node_get_total_supply::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_total_supply::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_total_supply\";\n\t_object[\"currency\"] = currency;\n\treturn _object;\n}\n\nvoid Node_get_total_supply::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_total_supply::get_field(const std::string& _name) const {\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_total_supply::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"currency\") {\n\t\t_value.to(currency);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_total_supply& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_total_supply& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_total_supply::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_total_supply::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_total_supply\";\n\ttype_code->type_hash = vnx::Hash64(0x17d971db6900bd9dull);\n\ttype_code->code_hash = vnx::Hash64(0x165f215d915fdca0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_total_supply);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_total_supply>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_total_supply_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_total_supply& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_supply& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_total_supply;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_total_supply>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.currency, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_total_supply& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_total_supply& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_supply& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_total_supply_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_total_supply_return.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_total_supply_return::VNX_TYPE_HASH(0xe69f15a0766eaf27ull);\nconst vnx::Hash64 Node_get_total_supply_return::VNX_CODE_HASH(0x655bdc70148efe9bull);\n\nvnx::Hash64 Node_get_total_supply_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_total_supply_return::get_type_name() const {\n\treturn \"mmx.Node.get_total_supply.return\";\n}\n\nconst vnx::TypeCode* Node_get_total_supply_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_total_supply_return;\n}\n\nstd::shared_ptr<Node_get_total_supply_return> Node_get_total_supply_return::create() {\n\treturn std::make_shared<Node_get_total_supply_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_total_supply_return::clone() const {\n\treturn std::make_shared<Node_get_total_supply_return>(*this);\n}\n\nvoid Node_get_total_supply_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_total_supply_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_total_supply_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_total_supply_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_total_supply_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_total_supply.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_total_supply_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_total_supply_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_total_supply.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_total_supply_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_total_supply_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_total_supply_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_total_supply_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_total_supply_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_total_supply_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_total_supply_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_total_supply.return\";\n\ttype_code->type_hash = vnx::Hash64(0xe69f15a0766eaf27ull);\n\ttype_code->code_hash = vnx::Hash64(0x655bdc70148efe9bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_total_supply_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_total_supply_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_total_supply_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_total_supply_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_total_supply_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_total_supply_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_total_supply_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_total_supply_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_total_supply_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_trade_history.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_trade_history.hxx>\n#include <mmx/Node_get_trade_history_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_trade_history::VNX_TYPE_HASH(0x62736b035e3995cdull);\nconst vnx::Hash64 Node_get_trade_history::VNX_CODE_HASH(0xd38814ee5dd93feeull);\n\nvnx::Hash64 Node_get_trade_history::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_trade_history::get_type_name() const {\n\treturn \"mmx.Node.get_trade_history\";\n}\n\nconst vnx::TypeCode* Node_get_trade_history::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_trade_history;\n}\n\nstd::shared_ptr<Node_get_trade_history> Node_get_trade_history::create() {\n\treturn std::make_shared<Node_get_trade_history>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_trade_history::clone() const {\n\treturn std::make_shared<Node_get_trade_history>(*this);\n}\n\nvoid Node_get_trade_history::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_trade_history::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_trade_history::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_trade_history;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, limit);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, since);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_trade_history::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_trade_history\\\"\";\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \", \\\"since\\\": \"; vnx::write(_out, since);\n\t_out << \"}\";\n}\n\nvoid Node_get_trade_history::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_trade_history::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_trade_history\";\n\t_object[\"limit\"] = limit;\n\t_object[\"since\"] = since;\n\treturn _object;\n}\n\nvoid Node_get_trade_history::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"since\") {\n\t\t\t_entry.second.to(since);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_trade_history::get_field(const std::string& _name) const {\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\tif(_name == \"since\") {\n\t\treturn vnx::Variant(since);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_trade_history::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"limit\") {\n\t\t_value.to(limit);\n\t} else if(_name == \"since\") {\n\t\t_value.to(since);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_trade_history& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_trade_history& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_trade_history::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_trade_history::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_trade_history\";\n\ttype_code->type_hash = vnx::Hash64(0x62736b035e3995cdull);\n\ttype_code->code_hash = vnx::Hash64(0xd38814ee5dd93feeull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_trade_history);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_trade_history>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_trade_history_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"since\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_trade_history& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.since, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_trade_history;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_trade_history>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.limit);\n\tvnx::write_value(_buf + 4, value.since);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_trade_history& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_trade_history& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_trade_history_for.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_trade_history_for.hxx>\n#include <mmx/Node_get_trade_history_for_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_trade_history_for::VNX_TYPE_HASH(0xd55cda633e3dd5b8ull);\nconst vnx::Hash64 Node_get_trade_history_for::VNX_CODE_HASH(0x2acc677d65d4b58full);\n\nvnx::Hash64 Node_get_trade_history_for::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_trade_history_for::get_type_name() const {\n\treturn \"mmx.Node.get_trade_history_for\";\n}\n\nconst vnx::TypeCode* Node_get_trade_history_for::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_trade_history_for;\n}\n\nstd::shared_ptr<Node_get_trade_history_for> Node_get_trade_history_for::create() {\n\treturn std::make_shared<Node_get_trade_history_for>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_trade_history_for::clone() const {\n\treturn std::make_shared<Node_get_trade_history_for>(*this);\n}\n\nvoid Node_get_trade_history_for::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_trade_history_for::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_trade_history_for::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_trade_history_for;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, bid);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, ask);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, limit);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, since);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_trade_history_for::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_trade_history_for\\\"\";\n\t_out << \", \\\"bid\\\": \"; vnx::write(_out, bid);\n\t_out << \", \\\"ask\\\": \"; vnx::write(_out, ask);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \", \\\"since\\\": \"; vnx::write(_out, since);\n\t_out << \"}\";\n}\n\nvoid Node_get_trade_history_for::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_trade_history_for::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_trade_history_for\";\n\t_object[\"bid\"] = bid;\n\t_object[\"ask\"] = ask;\n\t_object[\"limit\"] = limit;\n\t_object[\"since\"] = since;\n\treturn _object;\n}\n\nvoid Node_get_trade_history_for::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"ask\") {\n\t\t\t_entry.second.to(ask);\n\t\t} else if(_entry.first == \"bid\") {\n\t\t\t_entry.second.to(bid);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"since\") {\n\t\t\t_entry.second.to(since);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_trade_history_for::get_field(const std::string& _name) const {\n\tif(_name == \"bid\") {\n\t\treturn vnx::Variant(bid);\n\t}\n\tif(_name == \"ask\") {\n\t\treturn vnx::Variant(ask);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\tif(_name == \"since\") {\n\t\treturn vnx::Variant(since);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_trade_history_for::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"bid\") {\n\t\t_value.to(bid);\n\t} else if(_name == \"ask\") {\n\t\t_value.to(ask);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t} else if(_name == \"since\") {\n\t\t_value.to(since);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_trade_history_for& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_trade_history_for& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_trade_history_for::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_trade_history_for::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_trade_history_for\";\n\ttype_code->type_hash = vnx::Hash64(0xd55cda633e3dd5b8ull);\n\ttype_code->code_hash = vnx::Hash64(0x2acc677d65d4b58full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_trade_history_for);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_trade_history_for>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_trade_history_for_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"bid\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"ask\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"since\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_trade_history_for& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.since, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.bid, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.ask, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history_for& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_trade_history_for;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_trade_history_for>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.limit);\n\tvnx::write_value(_buf + 4, value.since);\n\tvnx::write(out, value.bid, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.ask, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_trade_history_for& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_trade_history_for& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history_for& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_trade_history_for_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_trade_history_for_return.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_trade_history_for_return::VNX_TYPE_HASH(0xd61154789cdb246bull);\nconst vnx::Hash64 Node_get_trade_history_for_return::VNX_CODE_HASH(0x9b5ee5e05738a9b7ull);\n\nvnx::Hash64 Node_get_trade_history_for_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_trade_history_for_return::get_type_name() const {\n\treturn \"mmx.Node.get_trade_history_for.return\";\n}\n\nconst vnx::TypeCode* Node_get_trade_history_for_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_trade_history_for_return;\n}\n\nstd::shared_ptr<Node_get_trade_history_for_return> Node_get_trade_history_for_return::create() {\n\treturn std::make_shared<Node_get_trade_history_for_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_trade_history_for_return::clone() const {\n\treturn std::make_shared<Node_get_trade_history_for_return>(*this);\n}\n\nvoid Node_get_trade_history_for_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_trade_history_for_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_trade_history_for_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_trade_history_for_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_trade_history_for_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_trade_history_for.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_trade_history_for_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_trade_history_for_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_trade_history_for.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_trade_history_for_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_trade_history_for_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_trade_history_for_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_trade_history_for_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_trade_history_for_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_trade_history_for_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_trade_history_for_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_trade_history_for.return\";\n\ttype_code->type_hash = vnx::Hash64(0xd61154789cdb246bull);\n\ttype_code->code_hash = vnx::Hash64(0x9b5ee5e05738a9b7ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_trade_history_for_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_trade_history_for_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::trade_entry_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_trade_history_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_trade_history_for_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_trade_history_for_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_trade_history_for_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_trade_history_for_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history_for_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_trade_history_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_trade_history_return.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_trade_history_return::VNX_TYPE_HASH(0x4d3692b594dd7f9eull);\nconst vnx::Hash64 Node_get_trade_history_return::VNX_CODE_HASH(0x14c2bb44baa9254cull);\n\nvnx::Hash64 Node_get_trade_history_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_trade_history_return::get_type_name() const {\n\treturn \"mmx.Node.get_trade_history.return\";\n}\n\nconst vnx::TypeCode* Node_get_trade_history_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_trade_history_return;\n}\n\nstd::shared_ptr<Node_get_trade_history_return> Node_get_trade_history_return::create() {\n\treturn std::make_shared<Node_get_trade_history_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_trade_history_return::clone() const {\n\treturn std::make_shared<Node_get_trade_history_return>(*this);\n}\n\nvoid Node_get_trade_history_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_trade_history_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_trade_history_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_trade_history_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_trade_history_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_trade_history.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_trade_history_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_trade_history_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_trade_history.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_trade_history_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_trade_history_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_trade_history_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_trade_history_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_trade_history_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_trade_history_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_trade_history_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_trade_history.return\";\n\ttype_code->type_hash = vnx::Hash64(0x4d3692b594dd7f9eull);\n\ttype_code->code_hash = vnx::Hash64(0x14c2bb44baa9254cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_trade_history_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_trade_history_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::trade_entry_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_trade_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_trade_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_trade_history_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_trade_history_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_trade_history_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_trade_history_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_trade_history_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_transaction.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_transaction.hxx>\n#include <mmx/Node_get_transaction_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_transaction::VNX_TYPE_HASH(0x9c76ca142292750full);\nconst vnx::Hash64 Node_get_transaction::VNX_CODE_HASH(0xf4e68de74cf1ce0dull);\n\nvnx::Hash64 Node_get_transaction::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_transaction::get_type_name() const {\n\treturn \"mmx.Node.get_transaction\";\n}\n\nconst vnx::TypeCode* Node_get_transaction::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_transaction;\n}\n\nstd::shared_ptr<Node_get_transaction> Node_get_transaction::create() {\n\treturn std::make_shared<Node_get_transaction>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_transaction::clone() const {\n\treturn std::make_shared<Node_get_transaction>(*this);\n}\n\nvoid Node_get_transaction::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_transaction::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_transaction::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_transaction;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, id);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, pending);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_transaction::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_transaction\\\"\";\n\t_out << \", \\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \", \\\"pending\\\": \"; vnx::write(_out, pending);\n\t_out << \"}\";\n}\n\nvoid Node_get_transaction::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_transaction::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_transaction\";\n\t_object[\"id\"] = id;\n\t_object[\"pending\"] = pending;\n\treturn _object;\n}\n\nvoid Node_get_transaction::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t} else if(_entry.first == \"pending\") {\n\t\t\t_entry.second.to(pending);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_transaction::get_field(const std::string& _name) const {\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\tif(_name == \"pending\") {\n\t\treturn vnx::Variant(pending);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_transaction::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"id\") {\n\t\t_value.to(id);\n\t} else if(_name == \"pending\") {\n\t\t_value.to(pending);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_transaction& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_transaction& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_transaction::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_transaction::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_transaction\";\n\ttype_code->type_hash = vnx::Hash64(0x9c76ca142292750full);\n\ttype_code->code_hash = vnx::Hash64(0xf4e68de74cf1ce0dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_transaction);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_transaction>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_transaction_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"pending\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.pending, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.id, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_transaction;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_transaction>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(1);\n\tvnx::write_value(_buf + 0, value.pending);\n\tvnx::write(out, value.id, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_transaction& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_transaction& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_transaction& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_transaction_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_transaction_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_transaction_return::VNX_TYPE_HASH(0x3848f078ff4024dull);\nconst vnx::Hash64 Node_get_transaction_return::VNX_CODE_HASH(0x778b0b9b87e7ec84ull);\n\nvnx::Hash64 Node_get_transaction_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_transaction_return::get_type_name() const {\n\treturn \"mmx.Node.get_transaction.return\";\n}\n\nconst vnx::TypeCode* Node_get_transaction_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_transaction_return;\n}\n\nstd::shared_ptr<Node_get_transaction_return> Node_get_transaction_return::create() {\n\treturn std::make_shared<Node_get_transaction_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_transaction_return::clone() const {\n\treturn std::make_shared<Node_get_transaction_return>(*this);\n}\n\nvoid Node_get_transaction_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_transaction_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_transaction_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_transaction_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_transaction_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_transaction.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_transaction_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_transaction_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_transaction.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_transaction_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_transaction_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_transaction_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_transaction_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_transaction_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_transaction_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_transaction_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_transaction.return\";\n\ttype_code->type_hash = vnx::Hash64(0x3848f078ff4024dull);\n\ttype_code->code_hash = vnx::Hash64(0x778b0b9b87e7ec84ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_transaction_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_transaction_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_transaction_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_transaction_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_transaction_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_transaction_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_transaction_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_transaction_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_transaction_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_transactions.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_transactions.hxx>\n#include <mmx/Node_get_transactions_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_transactions::VNX_TYPE_HASH(0x715a5bb668426203ull);\nconst vnx::Hash64 Node_get_transactions::VNX_CODE_HASH(0x883c3632c9e10142ull);\n\nvnx::Hash64 Node_get_transactions::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_transactions::get_type_name() const {\n\treturn \"mmx.Node.get_transactions\";\n}\n\nconst vnx::TypeCode* Node_get_transactions::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_transactions;\n}\n\nstd::shared_ptr<Node_get_transactions> Node_get_transactions::create() {\n\treturn std::make_shared<Node_get_transactions>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_transactions::clone() const {\n\treturn std::make_shared<Node_get_transactions>(*this);\n}\n\nvoid Node_get_transactions::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_transactions::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_transactions::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_transactions;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, ids);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_transactions::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_transactions\\\"\";\n\t_out << \", \\\"ids\\\": \"; vnx::write(_out, ids);\n\t_out << \"}\";\n}\n\nvoid Node_get_transactions::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_transactions::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_transactions\";\n\t_object[\"ids\"] = ids;\n\treturn _object;\n}\n\nvoid Node_get_transactions::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"ids\") {\n\t\t\t_entry.second.to(ids);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_transactions::get_field(const std::string& _name) const {\n\tif(_name == \"ids\") {\n\t\treturn vnx::Variant(ids);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_transactions::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"ids\") {\n\t\t_value.to(ids);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_transactions& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_transactions& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_transactions::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_transactions::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_transactions\";\n\ttype_code->type_hash = vnx::Hash64(0x715a5bb668426203ull);\n\ttype_code->code_hash = vnx::Hash64(0x883c3632c9e10142ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_transactions);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_transactions>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_transactions_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"ids\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_transactions& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.ids, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_transactions& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_transactions;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_transactions>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.ids, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_transactions& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_transactions& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_transactions& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_transactions_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_transactions_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_transactions_return::VNX_TYPE_HASH(0xd11c40a507abaaaull);\nconst vnx::Hash64 Node_get_transactions_return::VNX_CODE_HASH(0xb20a87fe9f5dd82full);\n\nvnx::Hash64 Node_get_transactions_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_transactions_return::get_type_name() const {\n\treturn \"mmx.Node.get_transactions.return\";\n}\n\nconst vnx::TypeCode* Node_get_transactions_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_transactions_return;\n}\n\nstd::shared_ptr<Node_get_transactions_return> Node_get_transactions_return::create() {\n\treturn std::make_shared<Node_get_transactions_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_transactions_return::clone() const {\n\treturn std::make_shared<Node_get_transactions_return>(*this);\n}\n\nvoid Node_get_transactions_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_transactions_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_transactions_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_transactions_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_transactions_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_transactions.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_transactions_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_transactions_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_transactions.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_transactions_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_transactions_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_transactions_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_transactions_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_transactions_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_transactions_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_transactions_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_transactions.return\";\n\ttype_code->type_hash = vnx::Hash64(0xd11c40a507abaaaull);\n\ttype_code->code_hash = vnx::Hash64(0xb20a87fe9f5dd82full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_transactions_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_transactions_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_transactions_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_transactions_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_transactions_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_transactions_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_transactions_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_transactions_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_transactions_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_height.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_height.hxx>\n#include <mmx/Node_get_tx_height_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_height::VNX_TYPE_HASH(0xf6f917fad9361e3aull);\nconst vnx::Hash64 Node_get_tx_height::VNX_CODE_HASH(0xd5a4a7ab514e26f4ull);\n\nvnx::Hash64 Node_get_tx_height::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_height::get_type_name() const {\n\treturn \"mmx.Node.get_tx_height\";\n}\n\nconst vnx::TypeCode* Node_get_tx_height::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_height;\n}\n\nstd::shared_ptr<Node_get_tx_height> Node_get_tx_height::create() {\n\treturn std::make_shared<Node_get_tx_height>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_height::clone() const {\n\treturn std::make_shared<Node_get_tx_height>(*this);\n}\n\nvoid Node_get_tx_height::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_height::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_height::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_height;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, id);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_height::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_height\\\"\";\n\t_out << \", \\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_height::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_height::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_height\";\n\t_object[\"id\"] = id;\n\treturn _object;\n}\n\nvoid Node_get_tx_height::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_height::get_field(const std::string& _name) const {\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_height::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"id\") {\n\t\t_value.to(id);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_height& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_height& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_height::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_height::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_height\";\n\ttype_code->type_hash = vnx::Hash64(0xf6f917fad9361e3aull);\n\ttype_code->code_hash = vnx::Hash64(0xd5a4a7ab514e26f4ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_height);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_height>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_tx_height_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_height& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.id, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_height& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_height;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_height>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.id, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_height& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_height& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_height& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_height_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_height_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_height_return::VNX_TYPE_HASH(0xda69a0d06f4b5c3eull);\nconst vnx::Hash64 Node_get_tx_height_return::VNX_CODE_HASH(0x611605734f60f271ull);\n\nvnx::Hash64 Node_get_tx_height_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_height_return::get_type_name() const {\n\treturn \"mmx.Node.get_tx_height.return\";\n}\n\nconst vnx::TypeCode* Node_get_tx_height_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_height_return;\n}\n\nstd::shared_ptr<Node_get_tx_height_return> Node_get_tx_height_return::create() {\n\treturn std::make_shared<Node_get_tx_height_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_height_return::clone() const {\n\treturn std::make_shared<Node_get_tx_height_return>(*this);\n}\n\nvoid Node_get_tx_height_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_height_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_height_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_height_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_height_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_height.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_height_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_height_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_height.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_tx_height_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_height_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_height_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_height_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_height_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_height_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_height_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_height.return\";\n\ttype_code->type_hash = vnx::Hash64(0xda69a0d06f4b5c3eull);\n\ttype_code->code_hash = vnx::Hash64(0x611605734f60f271ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_height_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_height_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {33, 3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_height_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_height_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_height_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_height_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_height_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_ids.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_ids.hxx>\n#include <mmx/Node_get_tx_ids_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_ids::VNX_TYPE_HASH(0xe268e5bf2a7f22d6ull);\nconst vnx::Hash64 Node_get_tx_ids::VNX_CODE_HASH(0x52587393ccc5b088ull);\n\nvnx::Hash64 Node_get_tx_ids::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_ids::get_type_name() const {\n\treturn \"mmx.Node.get_tx_ids\";\n}\n\nconst vnx::TypeCode* Node_get_tx_ids::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids;\n}\n\nstd::shared_ptr<Node_get_tx_ids> Node_get_tx_ids::create() {\n\treturn std::make_shared<Node_get_tx_ids>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_ids::clone() const {\n\treturn std::make_shared<Node_get_tx_ids>(*this);\n}\n\nvoid Node_get_tx_ids::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_ids;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, limit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_ids::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_ids\\\"\";\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_ids::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_ids::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_ids\";\n\t_object[\"limit\"] = limit;\n\treturn _object;\n}\n\nvoid Node_get_tx_ids::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_ids::get_field(const std::string& _name) const {\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_ids::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"limit\") {\n\t\t_value.to(limit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_ids& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_ids::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_ids::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_ids\";\n\ttype_code->type_hash = vnx::Hash64(0xe268e5bf2a7f22d6ull);\n\ttype_code->code_hash = vnx::Hash64(0x52587393ccc5b088ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_ids);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_ids>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_tx_ids_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_ids;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_ids>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.limit);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_ids_at.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_ids_at.hxx>\n#include <mmx/Node_get_tx_ids_at_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_ids_at::VNX_TYPE_HASH(0x904c686b59c101c3ull);\nconst vnx::Hash64 Node_get_tx_ids_at::VNX_CODE_HASH(0xb30fab713035031cull);\n\nvnx::Hash64 Node_get_tx_ids_at::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_ids_at::get_type_name() const {\n\treturn \"mmx.Node.get_tx_ids_at\";\n}\n\nconst vnx::TypeCode* Node_get_tx_ids_at::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids_at;\n}\n\nstd::shared_ptr<Node_get_tx_ids_at> Node_get_tx_ids_at::create() {\n\treturn std::make_shared<Node_get_tx_ids_at>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_ids_at::clone() const {\n\treturn std::make_shared<Node_get_tx_ids_at>(*this);\n}\n\nvoid Node_get_tx_ids_at::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids_at::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids_at::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_ids_at;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_ids_at::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_ids_at\\\"\";\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_ids_at::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_ids_at::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_ids_at\";\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_get_tx_ids_at::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_ids_at::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_ids_at::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids_at& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_ids_at& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_ids_at::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_ids_at::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_ids_at\";\n\ttype_code->type_hash = vnx::Hash64(0x904c686b59c101c3ull);\n\ttype_code->code_hash = vnx::Hash64(0xb30fab713035031cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_ids_at);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_ids_at>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_tx_ids_at_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_at& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_at& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_ids_at;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_ids_at>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids_at& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_at& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_at& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_ids_at_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_ids_at_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_ids_at_return::VNX_TYPE_HASH(0x945565d9cbfadc31ull);\nconst vnx::Hash64 Node_get_tx_ids_at_return::VNX_CODE_HASH(0x83f0f1b8eaec29f6ull);\n\nvnx::Hash64 Node_get_tx_ids_at_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_ids_at_return::get_type_name() const {\n\treturn \"mmx.Node.get_tx_ids_at.return\";\n}\n\nconst vnx::TypeCode* Node_get_tx_ids_at_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids_at_return;\n}\n\nstd::shared_ptr<Node_get_tx_ids_at_return> Node_get_tx_ids_at_return::create() {\n\treturn std::make_shared<Node_get_tx_ids_at_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_ids_at_return::clone() const {\n\treturn std::make_shared<Node_get_tx_ids_at_return>(*this);\n}\n\nvoid Node_get_tx_ids_at_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids_at_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids_at_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_ids_at_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_ids_at_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_ids_at.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_ids_at_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_ids_at_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_ids_at.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_tx_ids_at_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_ids_at_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_ids_at_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids_at_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_ids_at_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_ids_at_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_ids_at_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_ids_at.return\";\n\ttype_code->type_hash = vnx::Hash64(0x945565d9cbfadc31ull);\n\ttype_code->code_hash = vnx::Hash64(0x83f0f1b8eaec29f6ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_ids_at_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_ids_at_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_ids_at_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_ids_at_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids_at_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_at_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_at_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_ids_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_ids_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_ids_return::VNX_TYPE_HASH(0xba3ffcf776e64920ull);\nconst vnx::Hash64 Node_get_tx_ids_return::VNX_CODE_HASH(0x7fb080108cc316f0ull);\n\nvnx::Hash64 Node_get_tx_ids_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_ids_return::get_type_name() const {\n\treturn \"mmx.Node.get_tx_ids.return\";\n}\n\nconst vnx::TypeCode* Node_get_tx_ids_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids_return;\n}\n\nstd::shared_ptr<Node_get_tx_ids_return> Node_get_tx_ids_return::create() {\n\treturn std::make_shared<Node_get_tx_ids_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_ids_return::clone() const {\n\treturn std::make_shared<Node_get_tx_ids_return>(*this);\n}\n\nvoid Node_get_tx_ids_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_ids_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_ids_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_ids.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_ids_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_ids_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_ids.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_tx_ids_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_ids_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_ids_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_ids_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_ids_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_ids_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_ids.return\";\n\ttype_code->type_hash = vnx::Hash64(0xba3ffcf776e64920ull);\n\ttype_code->code_hash = vnx::Hash64(0x7fb080108cc316f0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_ids_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_ids_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_ids_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_ids_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_ids_since.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_ids_since.hxx>\n#include <mmx/Node_get_tx_ids_since_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_ids_since::VNX_TYPE_HASH(0x640af36b555e1606ull);\nconst vnx::Hash64 Node_get_tx_ids_since::VNX_CODE_HASH(0xe15b1c0e819add94ull);\n\nvnx::Hash64 Node_get_tx_ids_since::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_ids_since::get_type_name() const {\n\treturn \"mmx.Node.get_tx_ids_since\";\n}\n\nconst vnx::TypeCode* Node_get_tx_ids_since::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids_since;\n}\n\nstd::shared_ptr<Node_get_tx_ids_since> Node_get_tx_ids_since::create() {\n\treturn std::make_shared<Node_get_tx_ids_since>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_ids_since::clone() const {\n\treturn std::make_shared<Node_get_tx_ids_since>(*this);\n}\n\nvoid Node_get_tx_ids_since::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids_since::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids_since::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_ids_since;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_ids_since::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_ids_since\\\"\";\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_ids_since::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_ids_since::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_ids_since\";\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_get_tx_ids_since::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_ids_since::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_ids_since::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids_since& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_ids_since& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_ids_since::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_ids_since::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_ids_since\";\n\ttype_code->type_hash = vnx::Hash64(0x640af36b555e1606ull);\n\ttype_code->code_hash = vnx::Hash64(0xe15b1c0e819add94ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_ids_since);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_ids_since>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_tx_ids_since_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_since& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_since& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_ids_since;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_ids_since>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids_since& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_since& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_since& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_ids_since_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_ids_since_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_ids_since_return::VNX_TYPE_HASH(0xe5c1511a48d2d288ull);\nconst vnx::Hash64 Node_get_tx_ids_since_return::VNX_CODE_HASH(0x58d83a738b72f1bull);\n\nvnx::Hash64 Node_get_tx_ids_since_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_ids_since_return::get_type_name() const {\n\treturn \"mmx.Node.get_tx_ids_since.return\";\n}\n\nconst vnx::TypeCode* Node_get_tx_ids_since_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids_since_return;\n}\n\nstd::shared_ptr<Node_get_tx_ids_since_return> Node_get_tx_ids_since_return::create() {\n\treturn std::make_shared<Node_get_tx_ids_since_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_ids_since_return::clone() const {\n\treturn std::make_shared<Node_get_tx_ids_since_return>(*this);\n}\n\nvoid Node_get_tx_ids_since_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids_since_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_ids_since_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_ids_since_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_ids_since_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_ids_since.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_ids_since_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_ids_since_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_ids_since.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_tx_ids_since_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_ids_since_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_ids_since_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_ids_since_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_ids_since_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_ids_since_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_ids_since_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_ids_since.return\";\n\ttype_code->type_hash = vnx::Hash64(0xe5c1511a48d2d288ull);\n\ttype_code->code_hash = vnx::Hash64(0x58d83a738b72f1bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_ids_since_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_ids_since_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_ids_since_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_ids_since_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_ids_since_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_ids_since_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_ids_since_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_ids_since_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_ids_since_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_info.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_info.hxx>\n#include <mmx/Node_get_tx_info_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_info::VNX_TYPE_HASH(0xb5409a3aaa19d1d2ull);\nconst vnx::Hash64 Node_get_tx_info::VNX_CODE_HASH(0x6c7239b4a1b9afe6ull);\n\nvnx::Hash64 Node_get_tx_info::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_info::get_type_name() const {\n\treturn \"mmx.Node.get_tx_info\";\n}\n\nconst vnx::TypeCode* Node_get_tx_info::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_info;\n}\n\nstd::shared_ptr<Node_get_tx_info> Node_get_tx_info::create() {\n\treturn std::make_shared<Node_get_tx_info>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_info::clone() const {\n\treturn std::make_shared<Node_get_tx_info>(*this);\n}\n\nvoid Node_get_tx_info::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_info::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_info::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_info;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, id);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_info::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_info\\\"\";\n\t_out << \", \\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_info::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_info::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_info\";\n\t_object[\"id\"] = id;\n\treturn _object;\n}\n\nvoid Node_get_tx_info::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_info::get_field(const std::string& _name) const {\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_info::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"id\") {\n\t\t_value.to(id);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_info& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_info& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_info::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_info::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_info\";\n\ttype_code->type_hash = vnx::Hash64(0xb5409a3aaa19d1d2ull);\n\ttype_code->code_hash = vnx::Hash64(0x6c7239b4a1b9afe6ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_info);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_info>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_tx_info_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.id, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_info;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_info>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.id, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_info& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_info& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_info_for.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_info_for.hxx>\n#include <mmx/Node_get_tx_info_for_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_info_for::VNX_TYPE_HASH(0xba1c6e6eccfe9369ull);\nconst vnx::Hash64 Node_get_tx_info_for::VNX_CODE_HASH(0x9d742398e0eb6c68ull);\n\nvnx::Hash64 Node_get_tx_info_for::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_info_for::get_type_name() const {\n\treturn \"mmx.Node.get_tx_info_for\";\n}\n\nconst vnx::TypeCode* Node_get_tx_info_for::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_info_for;\n}\n\nstd::shared_ptr<Node_get_tx_info_for> Node_get_tx_info_for::create() {\n\treturn std::make_shared<Node_get_tx_info_for>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_info_for::clone() const {\n\treturn std::make_shared<Node_get_tx_info_for>(*this);\n}\n\nvoid Node_get_tx_info_for::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_info_for::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_info_for::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_info_for;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, tx);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_info_for::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_info_for\\\"\";\n\t_out << \", \\\"tx\\\": \"; vnx::write(_out, tx);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_info_for::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_info_for::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_info_for\";\n\t_object[\"tx\"] = tx;\n\treturn _object;\n}\n\nvoid Node_get_tx_info_for::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"tx\") {\n\t\t\t_entry.second.to(tx);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_info_for::get_field(const std::string& _name) const {\n\tif(_name == \"tx\") {\n\t\treturn vnx::Variant(tx);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_info_for::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"tx\") {\n\t\t_value.to(tx);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_info_for& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_info_for& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_info_for::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_info_for::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_info_for\";\n\ttype_code->type_hash = vnx::Hash64(0xba1c6e6eccfe9369ull);\n\ttype_code->code_hash = vnx::Hash64(0x9d742398e0eb6c68ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_info_for);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_info_for>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_tx_info_for_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"tx\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_info_for& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.tx, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info_for& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_info_for;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_info_for>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.tx, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_info_for& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_info_for& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info_for& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_info_for_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_info_for_return.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_info_for_return::VNX_TYPE_HASH(0xfd527dc84681a04ull);\nconst vnx::Hash64 Node_get_tx_info_for_return::VNX_CODE_HASH(0x56e8525c5a462bd7ull);\n\nvnx::Hash64 Node_get_tx_info_for_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_info_for_return::get_type_name() const {\n\treturn \"mmx.Node.get_tx_info_for.return\";\n}\n\nconst vnx::TypeCode* Node_get_tx_info_for_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_info_for_return;\n}\n\nstd::shared_ptr<Node_get_tx_info_for_return> Node_get_tx_info_for_return::create() {\n\treturn std::make_shared<Node_get_tx_info_for_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_info_for_return::clone() const {\n\treturn std::make_shared<Node_get_tx_info_for_return>(*this);\n}\n\nvoid Node_get_tx_info_for_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_info_for_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_info_for_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_info_for_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_info_for_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_info_for.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_info_for_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_info_for_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_info_for.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_tx_info_for_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_info_for_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_info_for_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_info_for_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_info_for_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_info_for_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_info_for_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_info_for.return\";\n\ttype_code->type_hash = vnx::Hash64(0xfd527dc84681a04ull);\n\ttype_code->code_hash = vnx::Hash64(0x56e8525c5a462bd7ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_info_for_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_info_for_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::tx_info_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {33, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_info_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_info_for_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_info_for_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_info_for_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_info_for_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info_for_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_tx_info_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_tx_info_return.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_tx_info_return::VNX_TYPE_HASH(0x3668f41cc643227full);\nconst vnx::Hash64 Node_get_tx_info_return::VNX_CODE_HASH(0x4b9ac7b37b187db2ull);\n\nvnx::Hash64 Node_get_tx_info_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_tx_info_return::get_type_name() const {\n\treturn \"mmx.Node.get_tx_info.return\";\n}\n\nconst vnx::TypeCode* Node_get_tx_info_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_tx_info_return;\n}\n\nstd::shared_ptr<Node_get_tx_info_return> Node_get_tx_info_return::create() {\n\treturn std::make_shared<Node_get_tx_info_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_tx_info_return::clone() const {\n\treturn std::make_shared<Node_get_tx_info_return>(*this);\n}\n\nvoid Node_get_tx_info_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_info_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_tx_info_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_tx_info_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_tx_info_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_tx_info.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_tx_info_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_tx_info_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_tx_info.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_tx_info_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_tx_info_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_tx_info_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_tx_info_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_tx_info_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_tx_info_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_tx_info_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_tx_info.return\";\n\ttype_code->type_hash = vnx::Hash64(0x3668f41cc643227full);\n\ttype_code->code_hash = vnx::Hash64(0x4b9ac7b37b187db2ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_tx_info_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_tx_info_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::tx_info_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {33, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_tx_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_tx_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_tx_info_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_tx_info_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_tx_info_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_tx_info_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_tx_info_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_vdf_height.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_vdf_height.hxx>\n#include <mmx/Node_get_vdf_height_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_vdf_height::VNX_TYPE_HASH(0x33db3aa655c4e5feull);\nconst vnx::Hash64 Node_get_vdf_height::VNX_CODE_HASH(0xd3eb3b4364498fb3ull);\n\nvnx::Hash64 Node_get_vdf_height::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_vdf_height::get_type_name() const {\n\treturn \"mmx.Node.get_vdf_height\";\n}\n\nconst vnx::TypeCode* Node_get_vdf_height::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_vdf_height;\n}\n\nstd::shared_ptr<Node_get_vdf_height> Node_get_vdf_height::create() {\n\treturn std::make_shared<Node_get_vdf_height>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_vdf_height::clone() const {\n\treturn std::make_shared<Node_get_vdf_height>(*this);\n}\n\nvoid Node_get_vdf_height::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_vdf_height::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_vdf_height::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_vdf_height;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_vdf_height::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_vdf_height\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_get_vdf_height::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_vdf_height::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_vdf_height\";\n\treturn _object;\n}\n\nvoid Node_get_vdf_height::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_get_vdf_height::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_get_vdf_height::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_vdf_height& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_vdf_height& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_vdf_height::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_vdf_height::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_vdf_height\";\n\ttype_code->type_hash = vnx::Hash64(0x33db3aa655c4e5feull);\n\ttype_code->code_hash = vnx::Hash64(0xd3eb3b4364498fb3ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_vdf_height);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_vdf_height>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_vdf_height_return::static_get_type_code();\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_vdf_height& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_height& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_vdf_height;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_vdf_height>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_vdf_height& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_vdf_height& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_height& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_vdf_height_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_vdf_height_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_vdf_height_return::VNX_TYPE_HASH(0x5f83cae2903e53bfull);\nconst vnx::Hash64 Node_get_vdf_height_return::VNX_CODE_HASH(0x2fd2eaec1d1f6b7ull);\n\nvnx::Hash64 Node_get_vdf_height_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_vdf_height_return::get_type_name() const {\n\treturn \"mmx.Node.get_vdf_height.return\";\n}\n\nconst vnx::TypeCode* Node_get_vdf_height_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_vdf_height_return;\n}\n\nstd::shared_ptr<Node_get_vdf_height_return> Node_get_vdf_height_return::create() {\n\treturn std::make_shared<Node_get_vdf_height_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_vdf_height_return::clone() const {\n\treturn std::make_shared<Node_get_vdf_height_return>(*this);\n}\n\nvoid Node_get_vdf_height_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_vdf_height_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_vdf_height_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_vdf_height_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_vdf_height_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_vdf_height.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_vdf_height_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_vdf_height_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_vdf_height.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_vdf_height_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_vdf_height_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_vdf_height_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_vdf_height_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_vdf_height_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_vdf_height_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_vdf_height_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_vdf_height.return\";\n\ttype_code->type_hash = vnx::Hash64(0x5f83cae2903e53bfull);\n\ttype_code->code_hash = vnx::Hash64(0x2fd2eaec1d1f6b7ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_vdf_height_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_vdf_height_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value._ret_0, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_height_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_vdf_height_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_vdf_height_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value._ret_0);\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_vdf_height_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_vdf_height_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_height_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_vdf_peak.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_vdf_peak.hxx>\n#include <mmx/Node_get_vdf_peak_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_vdf_peak::VNX_TYPE_HASH(0xf3449b43830283ddull);\nconst vnx::Hash64 Node_get_vdf_peak::VNX_CODE_HASH(0x145dbb4bcecc205cull);\n\nvnx::Hash64 Node_get_vdf_peak::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_vdf_peak::get_type_name() const {\n\treturn \"mmx.Node.get_vdf_peak\";\n}\n\nconst vnx::TypeCode* Node_get_vdf_peak::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_vdf_peak;\n}\n\nstd::shared_ptr<Node_get_vdf_peak> Node_get_vdf_peak::create() {\n\treturn std::make_shared<Node_get_vdf_peak>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_vdf_peak::clone() const {\n\treturn std::make_shared<Node_get_vdf_peak>(*this);\n}\n\nvoid Node_get_vdf_peak::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_vdf_peak::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_vdf_peak::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_vdf_peak;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_vdf_peak::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_vdf_peak\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_get_vdf_peak::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_vdf_peak::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_vdf_peak\";\n\treturn _object;\n}\n\nvoid Node_get_vdf_peak::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_get_vdf_peak::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_get_vdf_peak::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_vdf_peak& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_vdf_peak& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_vdf_peak::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_vdf_peak::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_vdf_peak\";\n\ttype_code->type_hash = vnx::Hash64(0xf3449b43830283ddull);\n\ttype_code->code_hash = vnx::Hash64(0x145dbb4bcecc205cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_vdf_peak);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_vdf_peak>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_get_vdf_peak_return::static_get_type_code();\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_vdf_peak& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_peak& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_vdf_peak;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_vdf_peak>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_vdf_peak& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_vdf_peak& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_peak& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_get_vdf_peak_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_get_vdf_peak_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_get_vdf_peak_return::VNX_TYPE_HASH(0x837f2b6433a274a1ull);\nconst vnx::Hash64 Node_get_vdf_peak_return::VNX_CODE_HASH(0x9c5893f748786b13ull);\n\nvnx::Hash64 Node_get_vdf_peak_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_get_vdf_peak_return::get_type_name() const {\n\treturn \"mmx.Node.get_vdf_peak.return\";\n}\n\nconst vnx::TypeCode* Node_get_vdf_peak_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_get_vdf_peak_return;\n}\n\nstd::shared_ptr<Node_get_vdf_peak_return> Node_get_vdf_peak_return::create() {\n\treturn std::make_shared<Node_get_vdf_peak_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_get_vdf_peak_return::clone() const {\n\treturn std::make_shared<Node_get_vdf_peak_return>(*this);\n}\n\nvoid Node_get_vdf_peak_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_get_vdf_peak_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_get_vdf_peak_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_get_vdf_peak_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_get_vdf_peak_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.get_vdf_peak.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_get_vdf_peak_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_get_vdf_peak_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.get_vdf_peak.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_get_vdf_peak_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_get_vdf_peak_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_get_vdf_peak_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_get_vdf_peak_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_get_vdf_peak_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_get_vdf_peak_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_get_vdf_peak_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.get_vdf_peak.return\";\n\ttype_code->type_hash = vnx::Hash64(0x837f2b6433a274a1ull);\n\ttype_code->code_hash = vnx::Hash64(0x9c5893f748786b13ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_get_vdf_peak_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_get_vdf_peak_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_get_vdf_peak_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_get_vdf_peak_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_get_vdf_peak_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_get_vdf_peak_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_get_vdf_peak_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_get_vdf_peak_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_get_vdf_peak_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage.hxx>\n#include <mmx/Node_read_storage_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage::VNX_TYPE_HASH(0xd74cd2b291cb9cd6ull);\nconst vnx::Hash64 Node_read_storage::VNX_CODE_HASH(0xee7bddca64e3d007ull);\n\nvnx::Hash64 Node_read_storage::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage::get_type_name() const {\n\treturn \"mmx.Node.read_storage\";\n}\n\nconst vnx::TypeCode* Node_read_storage::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage;\n}\n\nstd::shared_ptr<Node_read_storage> Node_read_storage::create() {\n\treturn std::make_shared<Node_read_storage>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage::clone() const {\n\treturn std::make_shared<Node_read_storage>(*this);\n}\n\nvoid Node_read_storage::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage\\\"\";\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage\";\n\t_object[\"contract\"] = contract;\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_read_storage::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage::get_field(const std::string& _name) const {\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage\";\n\ttype_code->type_hash = vnx::Hash64(0xd74cd2b291cb9cd6ull);\n\ttype_code->code_hash = vnx::Hash64(0xee7bddca64e3d007ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_read_storage_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write(out, value.contract, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_array.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_array.hxx>\n#include <mmx/Node_read_storage_array_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_array::VNX_TYPE_HASH(0xe5826950ca0a442bull);\nconst vnx::Hash64 Node_read_storage_array::VNX_CODE_HASH(0xc625d1719b9ec16cull);\n\nvnx::Hash64 Node_read_storage_array::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_array::get_type_name() const {\n\treturn \"mmx.Node.read_storage_array\";\n}\n\nconst vnx::TypeCode* Node_read_storage_array::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_array;\n}\n\nstd::shared_ptr<Node_read_storage_array> Node_read_storage_array::create() {\n\treturn std::make_shared<Node_read_storage_array>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_array::clone() const {\n\treturn std::make_shared<Node_read_storage_array>(*this);\n}\n\nvoid Node_read_storage_array::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_array::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_array::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_array;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_array::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_array\\\"\";\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_array::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_array::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_array\";\n\t_object[\"contract\"] = contract;\n\t_object[\"address\"] = address;\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_read_storage_array::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_array::get_field(const std::string& _name) const {\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_array::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_array& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_array& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_array::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_array::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_array\";\n\ttype_code->type_hash = vnx::Hash64(0xe5826950ca0a442bull);\n\ttype_code->code_hash = vnx::Hash64(0xc625d1719b9ec16cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_array);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_array>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_read_storage_array_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"address\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_array& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.address, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_array& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_array;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_array>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(12);\n\tvnx::write_value(_buf + 0, value.address);\n\tvnx::write_value(_buf + 8, value.height);\n\tvnx::write(out, value.contract, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_array& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_array& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_array& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_array_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_array_return.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_array_return::VNX_TYPE_HASH(0xba7fed069216454dull);\nconst vnx::Hash64 Node_read_storage_array_return::VNX_CODE_HASH(0x7f7a40a888346341ull);\n\nvnx::Hash64 Node_read_storage_array_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_array_return::get_type_name() const {\n\treturn \"mmx.Node.read_storage_array.return\";\n}\n\nconst vnx::TypeCode* Node_read_storage_array_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_array_return;\n}\n\nstd::shared_ptr<Node_read_storage_array_return> Node_read_storage_array_return::create() {\n\treturn std::make_shared<Node_read_storage_array_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_array_return::clone() const {\n\treturn std::make_shared<Node_read_storage_array_return>(*this);\n}\n\nvoid Node_read_storage_array_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_array_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_array_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_array_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_array_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_array.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_array_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_array_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_array.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_read_storage_array_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_array_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_array_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_array_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_array_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_array_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_array_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_array.return\";\n\ttype_code->type_hash = vnx::Hash64(0xba7fed069216454dull);\n\ttype_code->code_hash = vnx::Hash64(0x7f7a40a888346341ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_array_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_array_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 12, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_array_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_array_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_array_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_array_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_array_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_array_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_array_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_entry_addr.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_entry_addr.hxx>\n#include <mmx/Node_read_storage_entry_addr_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_entry_addr::VNX_TYPE_HASH(0xffbf8c4478bb5ab5ull);\nconst vnx::Hash64 Node_read_storage_entry_addr::VNX_CODE_HASH(0x3d1c0b58a99f9dd6ull);\n\nvnx::Hash64 Node_read_storage_entry_addr::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_entry_addr::get_type_name() const {\n\treturn \"mmx.Node.read_storage_entry_addr\";\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_addr::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_addr;\n}\n\nstd::shared_ptr<Node_read_storage_entry_addr> Node_read_storage_entry_addr::create() {\n\treturn std::make_shared<Node_read_storage_entry_addr>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_entry_addr::clone() const {\n\treturn std::make_shared<Node_read_storage_entry_addr>(*this);\n}\n\nvoid Node_read_storage_entry_addr::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_addr::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_addr::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_entry_addr;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, key);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_entry_addr::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_entry_addr\\\"\";\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"key\\\": \"; vnx::write(_out, key);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_entry_addr::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_entry_addr::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_entry_addr\";\n\t_object[\"contract\"] = contract;\n\t_object[\"name\"] = name;\n\t_object[\"key\"] = key;\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_read_storage_entry_addr::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"key\") {\n\t\t\t_entry.second.to(key);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_entry_addr::get_field(const std::string& _name) const {\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"key\") {\n\t\treturn vnx::Variant(key);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_entry_addr::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"key\") {\n\t\t_value.to(key);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_addr& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_entry_addr& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_addr::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_entry_addr::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_entry_addr\";\n\ttype_code->type_hash = vnx::Hash64(0xffbf8c4478bb5ab5ull);\n\ttype_code->code_hash = vnx::Hash64(0x3d1c0b58a99f9dd6ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_entry_addr);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_entry_addr>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_read_storage_entry_addr_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"key\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.key, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_entry_addr;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_entry_addr>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write(out, value.contract, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.name, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.key, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_addr& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_addr& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_addr& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_entry_addr_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_entry_addr_return.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_entry_addr_return::VNX_TYPE_HASH(0xacd2f58f1ca8df54ull);\nconst vnx::Hash64 Node_read_storage_entry_addr_return::VNX_CODE_HASH(0xa5dce7e1b437462aull);\n\nvnx::Hash64 Node_read_storage_entry_addr_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_entry_addr_return::get_type_name() const {\n\treturn \"mmx.Node.read_storage_entry_addr.return\";\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_addr_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_addr_return;\n}\n\nstd::shared_ptr<Node_read_storage_entry_addr_return> Node_read_storage_entry_addr_return::create() {\n\treturn std::make_shared<Node_read_storage_entry_addr_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_entry_addr_return::clone() const {\n\treturn std::make_shared<Node_read_storage_entry_addr_return>(*this);\n}\n\nvoid Node_read_storage_entry_addr_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_addr_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_addr_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_entry_addr_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_entry_addr_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_entry_addr.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_entry_addr_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_entry_addr_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_entry_addr.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_read_storage_entry_addr_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_entry_addr_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_entry_addr_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_addr_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_entry_addr_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_addr_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_entry_addr_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_entry_addr.return\";\n\ttype_code->type_hash = vnx::Hash64(0xacd2f58f1ca8df54ull);\n\ttype_code->code_hash = vnx::Hash64(0xa5dce7e1b437462aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_entry_addr_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_entry_addr_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {23, 3, 5, 7, 8, 12, 1, 4, 4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_entry_addr_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_entry_addr_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_addr_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_addr_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_addr_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_entry_string.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_entry_string.hxx>\n#include <mmx/Node_read_storage_entry_string_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_entry_string::VNX_TYPE_HASH(0xe5b52723a3714e9full);\nconst vnx::Hash64 Node_read_storage_entry_string::VNX_CODE_HASH(0xd8b7928d16ca7083ull);\n\nvnx::Hash64 Node_read_storage_entry_string::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_entry_string::get_type_name() const {\n\treturn \"mmx.Node.read_storage_entry_string\";\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_string::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_string;\n}\n\nstd::shared_ptr<Node_read_storage_entry_string> Node_read_storage_entry_string::create() {\n\treturn std::make_shared<Node_read_storage_entry_string>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_entry_string::clone() const {\n\treturn std::make_shared<Node_read_storage_entry_string>(*this);\n}\n\nvoid Node_read_storage_entry_string::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_string::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_string::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_entry_string;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, key);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_entry_string::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_entry_string\\\"\";\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"key\\\": \"; vnx::write(_out, key);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_entry_string::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_entry_string::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_entry_string\";\n\t_object[\"contract\"] = contract;\n\t_object[\"name\"] = name;\n\t_object[\"key\"] = key;\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_read_storage_entry_string::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"key\") {\n\t\t\t_entry.second.to(key);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_entry_string::get_field(const std::string& _name) const {\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"key\") {\n\t\treturn vnx::Variant(key);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_entry_string::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"key\") {\n\t\t_value.to(key);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_string& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_entry_string& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_string::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_entry_string::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_entry_string\";\n\ttype_code->type_hash = vnx::Hash64(0xe5b52723a3714e9full);\n\ttype_code->code_hash = vnx::Hash64(0xd8b7928d16ca7083ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_entry_string);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_entry_string>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_read_storage_entry_string_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"key\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_string& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.key, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_string& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_entry_string;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_entry_string>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write(out, value.contract, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.name, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.key, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_string& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_string& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_string& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_entry_string_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_entry_string_return.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_entry_string_return::VNX_TYPE_HASH(0x56c6103ea03d7ceaull);\nconst vnx::Hash64 Node_read_storage_entry_string_return::VNX_CODE_HASH(0xee66e73f9ce588b5ull);\n\nvnx::Hash64 Node_read_storage_entry_string_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_entry_string_return::get_type_name() const {\n\treturn \"mmx.Node.read_storage_entry_string.return\";\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_string_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_string_return;\n}\n\nstd::shared_ptr<Node_read_storage_entry_string_return> Node_read_storage_entry_string_return::create() {\n\treturn std::make_shared<Node_read_storage_entry_string_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_entry_string_return::clone() const {\n\treturn std::make_shared<Node_read_storage_entry_string_return>(*this);\n}\n\nvoid Node_read_storage_entry_string_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_string_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_string_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_entry_string_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_entry_string_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_entry_string.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_entry_string_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_entry_string_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_entry_string.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_read_storage_entry_string_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_entry_string_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_entry_string_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_string_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_entry_string_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_string_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_entry_string_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_entry_string.return\";\n\ttype_code->type_hash = vnx::Hash64(0x56c6103ea03d7ceaull);\n\ttype_code->code_hash = vnx::Hash64(0xee66e73f9ce588b5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_entry_string_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_entry_string_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {23, 3, 5, 7, 8, 12, 1, 4, 4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_string_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_string_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_entry_string_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_entry_string_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_string_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_string_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_string_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_entry_var.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_entry_var.hxx>\n#include <mmx/Node_read_storage_entry_var_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_entry_var::VNX_TYPE_HASH(0xb0ebcc688396e6dbull);\nconst vnx::Hash64 Node_read_storage_entry_var::VNX_CODE_HASH(0xff0492dfcc10bf8bull);\n\nvnx::Hash64 Node_read_storage_entry_var::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_entry_var::get_type_name() const {\n\treturn \"mmx.Node.read_storage_entry_var\";\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_var::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_var;\n}\n\nstd::shared_ptr<Node_read_storage_entry_var> Node_read_storage_entry_var::create() {\n\treturn std::make_shared<Node_read_storage_entry_var>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_entry_var::clone() const {\n\treturn std::make_shared<Node_read_storage_entry_var>(*this);\n}\n\nvoid Node_read_storage_entry_var::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_var::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_var::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_entry_var;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, key);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_entry_var::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_entry_var\\\"\";\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"key\\\": \"; vnx::write(_out, key);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_entry_var::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_entry_var::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_entry_var\";\n\t_object[\"contract\"] = contract;\n\t_object[\"address\"] = address;\n\t_object[\"key\"] = key;\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_read_storage_entry_var::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"key\") {\n\t\t\t_entry.second.to(key);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_entry_var::get_field(const std::string& _name) const {\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"key\") {\n\t\treturn vnx::Variant(key);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_entry_var::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"key\") {\n\t\t_value.to(key);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_var& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_entry_var& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_var::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_entry_var::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_entry_var\";\n\ttype_code->type_hash = vnx::Hash64(0xb0ebcc688396e6dbull);\n\ttype_code->code_hash = vnx::Hash64(0xff0492dfcc10bf8bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_entry_var);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_entry_var>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_read_storage_entry_var_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"address\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"key\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_var& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.address, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.key, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_var& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_entry_var;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_entry_var>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(20);\n\tvnx::write_value(_buf + 0, value.address);\n\tvnx::write_value(_buf + 8, value.key);\n\tvnx::write_value(_buf + 16, value.height);\n\tvnx::write(out, value.contract, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_var& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_var& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_var& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_entry_var_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_entry_var_return.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_entry_var_return::VNX_TYPE_HASH(0x773a90b50f714a11ull);\nconst vnx::Hash64 Node_read_storage_entry_var_return::VNX_CODE_HASH(0xdaf6db48074b7f8eull);\n\nvnx::Hash64 Node_read_storage_entry_var_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_entry_var_return::get_type_name() const {\n\treturn \"mmx.Node.read_storage_entry_var.return\";\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_var_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_var_return;\n}\n\nstd::shared_ptr<Node_read_storage_entry_var_return> Node_read_storage_entry_var_return::create() {\n\treturn std::make_shared<Node_read_storage_entry_var_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_entry_var_return::clone() const {\n\treturn std::make_shared<Node_read_storage_entry_var_return>(*this);\n}\n\nvoid Node_read_storage_entry_var_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_var_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_entry_var_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_entry_var_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_entry_var_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_entry_var.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_entry_var_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_entry_var_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_entry_var.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_read_storage_entry_var_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_entry_var_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_entry_var_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_entry_var_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_entry_var_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_entry_var_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_entry_var_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_entry_var.return\";\n\ttype_code->type_hash = vnx::Hash64(0x773a90b50f714a11ull);\n\ttype_code->code_hash = vnx::Hash64(0xdaf6db48074b7f8eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_entry_var_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_entry_var_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_entry_var_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_entry_var_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_entry_var_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_entry_var_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_entry_var_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_entry_var_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_entry_var_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_field.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_field.hxx>\n#include <mmx/Node_read_storage_field_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_field::VNX_TYPE_HASH(0xc9a10c9f7f2cef16ull);\nconst vnx::Hash64 Node_read_storage_field::VNX_CODE_HASH(0x12be0da5568852a7ull);\n\nvnx::Hash64 Node_read_storage_field::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_field::get_type_name() const {\n\treturn \"mmx.Node.read_storage_field\";\n}\n\nconst vnx::TypeCode* Node_read_storage_field::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_field;\n}\n\nstd::shared_ptr<Node_read_storage_field> Node_read_storage_field::create() {\n\treturn std::make_shared<Node_read_storage_field>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_field::clone() const {\n\treturn std::make_shared<Node_read_storage_field>(*this);\n}\n\nvoid Node_read_storage_field::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_field::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_field::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_field;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_field::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_field\\\"\";\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_field::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_field::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_field\";\n\t_object[\"contract\"] = contract;\n\t_object[\"name\"] = name;\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_read_storage_field::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_field::get_field(const std::string& _name) const {\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_field::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_field& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_field& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_field::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_field::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_field\";\n\ttype_code->type_hash = vnx::Hash64(0xc9a10c9f7f2cef16ull);\n\ttype_code->code_hash = vnx::Hash64(0x12be0da5568852a7ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_field);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_field>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_read_storage_field_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_field& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_field& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_field;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_field>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write(out, value.contract, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.name, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_field& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_field& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_field& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_field_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_field_return.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_field_return::VNX_TYPE_HASH(0xf817bcace12b9ef3ull);\nconst vnx::Hash64 Node_read_storage_field_return::VNX_CODE_HASH(0xa2b5f90f585accefull);\n\nvnx::Hash64 Node_read_storage_field_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_field_return::get_type_name() const {\n\treturn \"mmx.Node.read_storage_field.return\";\n}\n\nconst vnx::TypeCode* Node_read_storage_field_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_field_return;\n}\n\nstd::shared_ptr<Node_read_storage_field_return> Node_read_storage_field_return::create() {\n\treturn std::make_shared<Node_read_storage_field_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_field_return::clone() const {\n\treturn std::make_shared<Node_read_storage_field_return>(*this);\n}\n\nvoid Node_read_storage_field_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_field_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_field_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_field_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_field_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_field.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_field_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_field_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_field.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_read_storage_field_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_field_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_field_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_field_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_field_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_field_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_field_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_field.return\";\n\ttype_code->type_hash = vnx::Hash64(0xf817bcace12b9ef3ull);\n\ttype_code->code_hash = vnx::Hash64(0xa2b5f90f585accefull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_field_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_field_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {23, 2, 4, 6, 12, 1, 4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_field_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_field_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_field_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_field_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_field_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_field_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_field_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_map.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_map.hxx>\n#include <mmx/Node_read_storage_map_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_map::VNX_TYPE_HASH(0x1cc0cc12bc2c1b4eull);\nconst vnx::Hash64 Node_read_storage_map::VNX_CODE_HASH(0xbca4481ae8eb52d7ull);\n\nvnx::Hash64 Node_read_storage_map::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_map::get_type_name() const {\n\treturn \"mmx.Node.read_storage_map\";\n}\n\nconst vnx::TypeCode* Node_read_storage_map::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_map;\n}\n\nstd::shared_ptr<Node_read_storage_map> Node_read_storage_map::create() {\n\treturn std::make_shared<Node_read_storage_map>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_map::clone() const {\n\treturn std::make_shared<Node_read_storage_map>(*this);\n}\n\nvoid Node_read_storage_map::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_map::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_map::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_map;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_map::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_map\\\"\";\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_map::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_map::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_map\";\n\t_object[\"contract\"] = contract;\n\t_object[\"address\"] = address;\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_read_storage_map::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_map::get_field(const std::string& _name) const {\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_map::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_map& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_map& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_map::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_map::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_map\";\n\ttype_code->type_hash = vnx::Hash64(0x1cc0cc12bc2c1b4eull);\n\ttype_code->code_hash = vnx::Hash64(0xbca4481ae8eb52d7ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_map);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_map>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_read_storage_map_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"address\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_map& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.address, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_map& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_map;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_map>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(12);\n\tvnx::write_value(_buf + 0, value.address);\n\tvnx::write_value(_buf + 8, value.height);\n\tvnx::write(out, value.contract, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_map& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_map& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_map& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_map_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_map_return.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_map_return::VNX_TYPE_HASH(0x1d56300164b3e79ull);\nconst vnx::Hash64 Node_read_storage_map_return::VNX_CODE_HASH(0x29897104566e1692ull);\n\nvnx::Hash64 Node_read_storage_map_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_map_return::get_type_name() const {\n\treturn \"mmx.Node.read_storage_map.return\";\n}\n\nconst vnx::TypeCode* Node_read_storage_map_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_map_return;\n}\n\nstd::shared_ptr<Node_read_storage_map_return> Node_read_storage_map_return::create() {\n\treturn std::make_shared<Node_read_storage_map_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_map_return::clone() const {\n\treturn std::make_shared<Node_read_storage_map_return>(*this);\n}\n\nvoid Node_read_storage_map_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_map_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_map_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_map_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_map_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_map.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_map_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_map_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_map.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_read_storage_map_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_map_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_map_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_map_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_map_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_map_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_map_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_map.return\";\n\ttype_code->type_hash = vnx::Hash64(0x1d56300164b3e79ull);\n\ttype_code->code_hash = vnx::Hash64(0x29897104566e1692ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_map_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_map_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 4, 12, 1, 12, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_map_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_map_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_map_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_map_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_map_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_map_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_map_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_object.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_object.hxx>\n#include <mmx/Node_read_storage_object_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_object::VNX_TYPE_HASH(0x5930cf36eeb662fbull);\nconst vnx::Hash64 Node_read_storage_object::VNX_CODE_HASH(0x5ef65e944c0346c4ull);\n\nvnx::Hash64 Node_read_storage_object::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_object::get_type_name() const {\n\treturn \"mmx.Node.read_storage_object\";\n}\n\nconst vnx::TypeCode* Node_read_storage_object::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_object;\n}\n\nstd::shared_ptr<Node_read_storage_object> Node_read_storage_object::create() {\n\treturn std::make_shared<Node_read_storage_object>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_object::clone() const {\n\treturn std::make_shared<Node_read_storage_object>(*this);\n}\n\nvoid Node_read_storage_object::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_object::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_object::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_object;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_object::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_object\\\"\";\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_object::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_object::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_object\";\n\t_object[\"contract\"] = contract;\n\t_object[\"address\"] = address;\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_read_storage_object::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_object::get_field(const std::string& _name) const {\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_object::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_object& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_object& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_object::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_object::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_object\";\n\ttype_code->type_hash = vnx::Hash64(0x5930cf36eeb662fbull);\n\ttype_code->code_hash = vnx::Hash64(0x5ef65e944c0346c4ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_object);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_object>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_read_storage_object_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"address\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_object& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.address, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_object& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_object;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_object>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(12);\n\tvnx::write_value(_buf + 0, value.address);\n\tvnx::write_value(_buf + 8, value.height);\n\tvnx::write(out, value.contract, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_object& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_object& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_object& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_object_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_object_return.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_object_return::VNX_TYPE_HASH(0x48c9a69123ef41afull);\nconst vnx::Hash64 Node_read_storage_object_return::VNX_CODE_HASH(0xfd09fed56174472bull);\n\nvnx::Hash64 Node_read_storage_object_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_object_return::get_type_name() const {\n\treturn \"mmx.Node.read_storage_object.return\";\n}\n\nconst vnx::TypeCode* Node_read_storage_object_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_object_return;\n}\n\nstd::shared_ptr<Node_read_storage_object_return> Node_read_storage_object_return::create() {\n\treturn std::make_shared<Node_read_storage_object_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_object_return::clone() const {\n\treturn std::make_shared<Node_read_storage_object_return>(*this);\n}\n\nvoid Node_read_storage_object_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_object_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_object_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_object_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_object_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_object.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_object_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_object_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_object.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_read_storage_object_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_object_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_object_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_object_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_object_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_object_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_object_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_object.return\";\n\ttype_code->type_hash = vnx::Hash64(0x48c9a69123ef41afull);\n\ttype_code->code_hash = vnx::Hash64(0xfd09fed56174472bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_object_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_object_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 3, 32, 12, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_object_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_object_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_object_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_object_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_object_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_object_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_object_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_return.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_return::VNX_TYPE_HASH(0xab73866ba23ed19aull);\nconst vnx::Hash64 Node_read_storage_return::VNX_CODE_HASH(0x4fa7c7a994334440ull);\n\nvnx::Hash64 Node_read_storage_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_return::get_type_name() const {\n\treturn \"mmx.Node.read_storage.return\";\n}\n\nconst vnx::TypeCode* Node_read_storage_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_return;\n}\n\nstd::shared_ptr<Node_read_storage_return> Node_read_storage_return::create() {\n\treturn std::make_shared<Node_read_storage_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_return::clone() const {\n\treturn std::make_shared<Node_read_storage_return>(*this);\n}\n\nvoid Node_read_storage_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_read_storage_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage.return\";\n\ttype_code->type_hash = vnx::Hash64(0xab73866ba23ed19aull);\n\ttype_code->code_hash = vnx::Hash64(0x4fa7c7a994334440ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 3, 32, 12, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_var.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_var.hxx>\n#include <mmx/Node_read_storage_var_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_var::VNX_TYPE_HASH(0x16d0361bcb359c2full);\nconst vnx::Hash64 Node_read_storage_var::VNX_CODE_HASH(0xc1eb698909ec56e7ull);\n\nvnx::Hash64 Node_read_storage_var::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_var::get_type_name() const {\n\treturn \"mmx.Node.read_storage_var\";\n}\n\nconst vnx::TypeCode* Node_read_storage_var::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_var;\n}\n\nstd::shared_ptr<Node_read_storage_var> Node_read_storage_var::create() {\n\treturn std::make_shared<Node_read_storage_var>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_var::clone() const {\n\treturn std::make_shared<Node_read_storage_var>(*this);\n}\n\nvoid Node_read_storage_var::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_var::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_var::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_var;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_var::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_var\\\"\";\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_var::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_var::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_var\";\n\t_object[\"contract\"] = contract;\n\t_object[\"address\"] = address;\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_read_storage_var::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_var::get_field(const std::string& _name) const {\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_var::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_var& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_var& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_var::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_var::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_var\";\n\ttype_code->type_hash = vnx::Hash64(0x16d0361bcb359c2full);\n\ttype_code->code_hash = vnx::Hash64(0xc1eb698909ec56e7ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_var);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_var>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_read_storage_var_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"address\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_var& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.address, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_var& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_var;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_var>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(12);\n\tvnx::write_value(_buf + 0, value.address);\n\tvnx::write_value(_buf + 8, value.height);\n\tvnx::write(out, value.contract, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_var& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_var& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_var& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_read_storage_var_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_read_storage_var_return.hxx>\n#include <mmx/vm/varptr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_read_storage_var_return::VNX_TYPE_HASH(0xaaa6685b20943467ull);\nconst vnx::Hash64 Node_read_storage_var_return::VNX_CODE_HASH(0x18923231c38952a6ull);\n\nvnx::Hash64 Node_read_storage_var_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_read_storage_var_return::get_type_name() const {\n\treturn \"mmx.Node.read_storage_var.return\";\n}\n\nconst vnx::TypeCode* Node_read_storage_var_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_read_storage_var_return;\n}\n\nstd::shared_ptr<Node_read_storage_var_return> Node_read_storage_var_return::create() {\n\treturn std::make_shared<Node_read_storage_var_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_read_storage_var_return::clone() const {\n\treturn std::make_shared<Node_read_storage_var_return>(*this);\n}\n\nvoid Node_read_storage_var_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_var_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_read_storage_var_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_read_storage_var_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_read_storage_var_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.read_storage_var.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_read_storage_var_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_read_storage_var_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.read_storage_var.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_read_storage_var_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_read_storage_var_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_read_storage_var_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_read_storage_var_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_read_storage_var_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_read_storage_var_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_read_storage_var_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.read_storage_var.return\";\n\ttype_code->type_hash = vnx::Hash64(0xaaa6685b20943467ull);\n\ttype_code->code_hash = vnx::Hash64(0x18923231c38952a6ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_read_storage_var_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_read_storage_var_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_read_storage_var_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_read_storage_var_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_read_storage_var_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_read_storage_var_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_read_storage_var_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_read_storage_var_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_read_storage_var_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_revert_sync.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_revert_sync.hxx>\n#include <mmx/Node_revert_sync_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_revert_sync::VNX_TYPE_HASH(0x8c1cc38a7a8a6c1dull);\nconst vnx::Hash64 Node_revert_sync::VNX_CODE_HASH(0x98a352c8989e46fbull);\n\nvnx::Hash64 Node_revert_sync::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_revert_sync::get_type_name() const {\n\treturn \"mmx.Node.revert_sync\";\n}\n\nconst vnx::TypeCode* Node_revert_sync::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_revert_sync;\n}\n\nstd::shared_ptr<Node_revert_sync> Node_revert_sync::create() {\n\treturn std::make_shared<Node_revert_sync>();\n}\n\nstd::shared_ptr<vnx::Value> Node_revert_sync::clone() const {\n\treturn std::make_shared<Node_revert_sync>(*this);\n}\n\nvoid Node_revert_sync::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_revert_sync::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_revert_sync::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_revert_sync;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_revert_sync::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.revert_sync\\\"\";\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Node_revert_sync::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_revert_sync::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.revert_sync\";\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Node_revert_sync::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_revert_sync::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_revert_sync::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_revert_sync& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_revert_sync& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_revert_sync::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_revert_sync::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.revert_sync\";\n\ttype_code->type_hash = vnx::Hash64(0x8c1cc38a7a8a6c1dull);\n\ttype_code->code_hash = vnx::Hash64(0x98a352c8989e46fbull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_revert_sync);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_revert_sync>(); };\n\ttype_code->return_type = ::mmx::Node_revert_sync_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_revert_sync& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_revert_sync& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_revert_sync;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_revert_sync>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n}\n\nvoid read(std::istream& in, ::mmx::Node_revert_sync& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_revert_sync& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_revert_sync& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_revert_sync_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_revert_sync_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_revert_sync_return::VNX_TYPE_HASH(0x3962a4b86b203e0aull);\nconst vnx::Hash64 Node_revert_sync_return::VNX_CODE_HASH(0xe647bf22bec5a2ddull);\n\nvnx::Hash64 Node_revert_sync_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_revert_sync_return::get_type_name() const {\n\treturn \"mmx.Node.revert_sync.return\";\n}\n\nconst vnx::TypeCode* Node_revert_sync_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_revert_sync_return;\n}\n\nstd::shared_ptr<Node_revert_sync_return> Node_revert_sync_return::create() {\n\treturn std::make_shared<Node_revert_sync_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_revert_sync_return::clone() const {\n\treturn std::make_shared<Node_revert_sync_return>(*this);\n}\n\nvoid Node_revert_sync_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_revert_sync_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_revert_sync_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_revert_sync_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_revert_sync_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.revert_sync.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_revert_sync_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_revert_sync_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.revert_sync.return\";\n\treturn _object;\n}\n\nvoid Node_revert_sync_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_revert_sync_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_revert_sync_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_revert_sync_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_revert_sync_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_revert_sync_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_revert_sync_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.revert_sync.return\";\n\ttype_code->type_hash = vnx::Hash64(0x3962a4b86b203e0aull);\n\ttype_code->code_hash = vnx::Hash64(0xe647bf22bec5a2ddull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_revert_sync_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_revert_sync_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_revert_sync_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_revert_sync_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_revert_sync_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_revert_sync_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_revert_sync_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_revert_sync_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_revert_sync_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_start_sync.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_start_sync.hxx>\n#include <mmx/Node_start_sync_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_start_sync::VNX_TYPE_HASH(0x6c5be8aeb25ef3c8ull);\nconst vnx::Hash64 Node_start_sync::VNX_CODE_HASH(0x4dd801a35570131cull);\n\nvnx::Hash64 Node_start_sync::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_start_sync::get_type_name() const {\n\treturn \"mmx.Node.start_sync\";\n}\n\nconst vnx::TypeCode* Node_start_sync::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_start_sync;\n}\n\nstd::shared_ptr<Node_start_sync> Node_start_sync::create() {\n\treturn std::make_shared<Node_start_sync>();\n}\n\nstd::shared_ptr<vnx::Value> Node_start_sync::clone() const {\n\treturn std::make_shared<Node_start_sync>(*this);\n}\n\nvoid Node_start_sync::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_start_sync::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_start_sync::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_start_sync;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, force);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_start_sync::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.start_sync\\\"\";\n\t_out << \", \\\"force\\\": \"; vnx::write(_out, force);\n\t_out << \"}\";\n}\n\nvoid Node_start_sync::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_start_sync::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.start_sync\";\n\t_object[\"force\"] = force;\n\treturn _object;\n}\n\nvoid Node_start_sync::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"force\") {\n\t\t\t_entry.second.to(force);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_start_sync::get_field(const std::string& _name) const {\n\tif(_name == \"force\") {\n\t\treturn vnx::Variant(force);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_start_sync::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"force\") {\n\t\t_value.to(force);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_start_sync& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_start_sync& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_start_sync::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_start_sync::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.start_sync\";\n\ttype_code->type_hash = vnx::Hash64(0x6c5be8aeb25ef3c8ull);\n\ttype_code->code_hash = vnx::Hash64(0x4dd801a35570131cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_start_sync);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_start_sync>(); };\n\ttype_code->return_type = ::mmx::Node_start_sync_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"force\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_start_sync& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.force, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_start_sync& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_start_sync;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_start_sync>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(1);\n\tvnx::write_value(_buf + 0, value.force);\n}\n\nvoid read(std::istream& in, ::mmx::Node_start_sync& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_start_sync& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_start_sync& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_start_sync_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_start_sync_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_start_sync_return::VNX_TYPE_HASH(0xe75b8e6a62d7e744ull);\nconst vnx::Hash64 Node_start_sync_return::VNX_CODE_HASH(0x990ff8389f58e786ull);\n\nvnx::Hash64 Node_start_sync_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_start_sync_return::get_type_name() const {\n\treturn \"mmx.Node.start_sync.return\";\n}\n\nconst vnx::TypeCode* Node_start_sync_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_start_sync_return;\n}\n\nstd::shared_ptr<Node_start_sync_return> Node_start_sync_return::create() {\n\treturn std::make_shared<Node_start_sync_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_start_sync_return::clone() const {\n\treturn std::make_shared<Node_start_sync_return>(*this);\n}\n\nvoid Node_start_sync_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_start_sync_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_start_sync_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_start_sync_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_start_sync_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.start_sync.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Node_start_sync_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_start_sync_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.start_sync.return\";\n\treturn _object;\n}\n\nvoid Node_start_sync_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Node_start_sync_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Node_start_sync_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_start_sync_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_start_sync_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_start_sync_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_start_sync_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.start_sync.return\";\n\ttype_code->type_hash = vnx::Hash64(0xe75b8e6a62d7e744ull);\n\ttype_code->code_hash = vnx::Hash64(0x990ff8389f58e786ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_start_sync_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_start_sync_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_start_sync_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_start_sync_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_start_sync_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_start_sync_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Node_start_sync_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_start_sync_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_start_sync_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_validate.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_validate.hxx>\n#include <mmx/Node_validate_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_validate::VNX_TYPE_HASH(0x95dbbd65f36b618ull);\nconst vnx::Hash64 Node_validate::VNX_CODE_HASH(0xcbfd5553a1d05472ull);\n\nvnx::Hash64 Node_validate::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_validate::get_type_name() const {\n\treturn \"mmx.Node.validate\";\n}\n\nconst vnx::TypeCode* Node_validate::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_validate;\n}\n\nstd::shared_ptr<Node_validate> Node_validate::create() {\n\treturn std::make_shared<Node_validate>();\n}\n\nstd::shared_ptr<vnx::Value> Node_validate::clone() const {\n\treturn std::make_shared<Node_validate>(*this);\n}\n\nvoid Node_validate::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_validate::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_validate::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_validate;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, tx);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_validate::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.validate\\\"\";\n\t_out << \", \\\"tx\\\": \"; vnx::write(_out, tx);\n\t_out << \"}\";\n}\n\nvoid Node_validate::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_validate::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.validate\";\n\t_object[\"tx\"] = tx;\n\treturn _object;\n}\n\nvoid Node_validate::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"tx\") {\n\t\t\t_entry.second.to(tx);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_validate::get_field(const std::string& _name) const {\n\tif(_name == \"tx\") {\n\t\treturn vnx::Variant(tx);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_validate::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"tx\") {\n\t\t_value.to(tx);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_validate& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_validate& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_validate::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_validate::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.validate\";\n\ttype_code->type_hash = vnx::Hash64(0x95dbbd65f36b618ull);\n\ttype_code->code_hash = vnx::Hash64(0xcbfd5553a1d05472ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_validate);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_validate>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_validate_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"tx\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_validate& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.tx, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_validate& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_validate;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_validate>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.tx, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_validate& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_validate& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_validate& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_validate_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_validate_return.hxx>\n#include <mmx/exec_result_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_validate_return::VNX_TYPE_HASH(0xe3c465d0fc0c4a4cull);\nconst vnx::Hash64 Node_validate_return::VNX_CODE_HASH(0x7cf4e0ff5a08461ull);\n\nvnx::Hash64 Node_validate_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_validate_return::get_type_name() const {\n\treturn \"mmx.Node.validate.return\";\n}\n\nconst vnx::TypeCode* Node_validate_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_validate_return;\n}\n\nstd::shared_ptr<Node_validate_return> Node_validate_return::create() {\n\treturn std::make_shared<Node_validate_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_validate_return::clone() const {\n\treturn std::make_shared<Node_validate_return>(*this);\n}\n\nvoid Node_validate_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_validate_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_validate_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_validate_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_validate_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.validate.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_validate_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_validate_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.validate.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_validate_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_validate_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_validate_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_validate_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_validate_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_validate_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_validate_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.validate.return\";\n\ttype_code->type_hash = vnx::Hash64(0xe3c465d0fc0c4a4cull);\n\ttype_code->code_hash = vnx::Hash64(0x7cf4e0ff5a08461ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_validate_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_validate_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::exec_result_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_validate_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_validate_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_validate_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_validate_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_validate_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_validate_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_validate_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_verify_partial.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_verify_partial.hxx>\n#include <mmx/Node_verify_partial_return.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_verify_partial::VNX_TYPE_HASH(0xeb15396685387f88ull);\nconst vnx::Hash64 Node_verify_partial::VNX_CODE_HASH(0xd1cc40cb65850bf9ull);\n\nvnx::Hash64 Node_verify_partial::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_verify_partial::get_type_name() const {\n\treturn \"mmx.Node.verify_partial\";\n}\n\nconst vnx::TypeCode* Node_verify_partial::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_verify_partial;\n}\n\nstd::shared_ptr<Node_verify_partial> Node_verify_partial::create() {\n\treturn std::make_shared<Node_verify_partial>();\n}\n\nstd::shared_ptr<vnx::Value> Node_verify_partial::clone() const {\n\treturn std::make_shared<Node_verify_partial>(*this);\n}\n\nvoid Node_verify_partial::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_verify_partial::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_verify_partial::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_verify_partial;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, partial);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, pool_target);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_verify_partial::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.verify_partial\\\"\";\n\t_out << \", \\\"partial\\\": \"; vnx::write(_out, partial);\n\t_out << \", \\\"pool_target\\\": \"; vnx::write(_out, pool_target);\n\t_out << \"}\";\n}\n\nvoid Node_verify_partial::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_verify_partial::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.verify_partial\";\n\t_object[\"partial\"] = partial;\n\t_object[\"pool_target\"] = pool_target;\n\treturn _object;\n}\n\nvoid Node_verify_partial::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"partial\") {\n\t\t\t_entry.second.to(partial);\n\t\t} else if(_entry.first == \"pool_target\") {\n\t\t\t_entry.second.to(pool_target);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_verify_partial::get_field(const std::string& _name) const {\n\tif(_name == \"partial\") {\n\t\treturn vnx::Variant(partial);\n\t}\n\tif(_name == \"pool_target\") {\n\t\treturn vnx::Variant(pool_target);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_verify_partial::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"partial\") {\n\t\t_value.to(partial);\n\t} else if(_name == \"pool_target\") {\n\t\t_value.to(pool_target);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_verify_partial& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_verify_partial& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_verify_partial::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_verify_partial::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.verify_partial\";\n\ttype_code->type_hash = vnx::Hash64(0xeb15396685387f88ull);\n\ttype_code->code_hash = vnx::Hash64(0xd1cc40cb65850bf9ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_verify_partial);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_verify_partial>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_verify_partial_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"partial\";\n\t\tfield.code = {16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"pool_target\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_verify_partial& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.partial, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.pool_target, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_verify_partial& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_verify_partial;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_verify_partial>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.partial, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.pool_target, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_verify_partial& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_verify_partial& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_verify_partial& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_verify_partial_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_verify_partial_return.hxx>\n#include <mmx/pooling_error_e.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_verify_partial_return::VNX_TYPE_HASH(0xb64fb769c6ffcf36ull);\nconst vnx::Hash64 Node_verify_partial_return::VNX_CODE_HASH(0x55984c727f1c2234ull);\n\nvnx::Hash64 Node_verify_partial_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_verify_partial_return::get_type_name() const {\n\treturn \"mmx.Node.verify_partial.return\";\n}\n\nconst vnx::TypeCode* Node_verify_partial_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_verify_partial_return;\n}\n\nstd::shared_ptr<Node_verify_partial_return> Node_verify_partial_return::create() {\n\treturn std::make_shared<Node_verify_partial_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_verify_partial_return::clone() const {\n\treturn std::make_shared<Node_verify_partial_return>(*this);\n}\n\nvoid Node_verify_partial_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_verify_partial_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_verify_partial_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_verify_partial_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_verify_partial_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.verify_partial.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_verify_partial_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_verify_partial_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.verify_partial.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_verify_partial_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_verify_partial_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_verify_partial_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_verify_partial_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_verify_partial_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_verify_partial_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_verify_partial_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.verify_partial.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb64fb769c6ffcf36ull);\n\ttype_code->code_hash = vnx::Hash64(0x55984c727f1c2234ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_verify_partial_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_verify_partial_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::pooling_error_e::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {23, 2, 4, 6, 19, 0, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_verify_partial_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_verify_partial_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_verify_partial_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_verify_partial_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_verify_partial_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_verify_partial_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_verify_partial_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_verify_plot_nft_target.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_verify_plot_nft_target.hxx>\n#include <mmx/Node_verify_plot_nft_target_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_verify_plot_nft_target::VNX_TYPE_HASH(0xf3ac786edcae50e1ull);\nconst vnx::Hash64 Node_verify_plot_nft_target::VNX_CODE_HASH(0xf5349444ccd84317ull);\n\nvnx::Hash64 Node_verify_plot_nft_target::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_verify_plot_nft_target::get_type_name() const {\n\treturn \"mmx.Node.verify_plot_nft_target\";\n}\n\nconst vnx::TypeCode* Node_verify_plot_nft_target::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_verify_plot_nft_target;\n}\n\nstd::shared_ptr<Node_verify_plot_nft_target> Node_verify_plot_nft_target::create() {\n\treturn std::make_shared<Node_verify_plot_nft_target>();\n}\n\nstd::shared_ptr<vnx::Value> Node_verify_plot_nft_target::clone() const {\n\treturn std::make_shared<Node_verify_plot_nft_target>(*this);\n}\n\nvoid Node_verify_plot_nft_target::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_verify_plot_nft_target::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_verify_plot_nft_target::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_verify_plot_nft_target;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, pool_target);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_verify_plot_nft_target::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.verify_plot_nft_target\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"pool_target\\\": \"; vnx::write(_out, pool_target);\n\t_out << \"}\";\n}\n\nvoid Node_verify_plot_nft_target::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_verify_plot_nft_target::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.verify_plot_nft_target\";\n\t_object[\"address\"] = address;\n\t_object[\"pool_target\"] = pool_target;\n\treturn _object;\n}\n\nvoid Node_verify_plot_nft_target::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"pool_target\") {\n\t\t\t_entry.second.to(pool_target);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_verify_plot_nft_target::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"pool_target\") {\n\t\treturn vnx::Variant(pool_target);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_verify_plot_nft_target::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"pool_target\") {\n\t\t_value.to(pool_target);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_verify_plot_nft_target& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_verify_plot_nft_target& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_verify_plot_nft_target::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_verify_plot_nft_target::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.verify_plot_nft_target\";\n\ttype_code->type_hash = vnx::Hash64(0xf3ac786edcae50e1ull);\n\ttype_code->code_hash = vnx::Hash64(0xf5349444ccd84317ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Node_verify_plot_nft_target);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_verify_plot_nft_target>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Node_verify_plot_nft_target_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"pool_target\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.PUBLIC\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_verify_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.pool_target, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_verify_plot_nft_target& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_verify_plot_nft_target;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_verify_plot_nft_target>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.pool_target, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_verify_plot_nft_target& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_verify_plot_nft_target& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_verify_plot_nft_target& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Node_verify_plot_nft_target_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Node_verify_plot_nft_target_return.hxx>\n#include <mmx/pooling_error_e.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Node_verify_plot_nft_target_return::VNX_TYPE_HASH(0x82f0f6ed43a0c4bull);\nconst vnx::Hash64 Node_verify_plot_nft_target_return::VNX_CODE_HASH(0x1a5ec07d47b9aeaaull);\n\nvnx::Hash64 Node_verify_plot_nft_target_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Node_verify_plot_nft_target_return::get_type_name() const {\n\treturn \"mmx.Node.verify_plot_nft_target.return\";\n}\n\nconst vnx::TypeCode* Node_verify_plot_nft_target_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Node_verify_plot_nft_target_return;\n}\n\nstd::shared_ptr<Node_verify_plot_nft_target_return> Node_verify_plot_nft_target_return::create() {\n\treturn std::make_shared<Node_verify_plot_nft_target_return>();\n}\n\nstd::shared_ptr<vnx::Value> Node_verify_plot_nft_target_return::clone() const {\n\treturn std::make_shared<Node_verify_plot_nft_target_return>(*this);\n}\n\nvoid Node_verify_plot_nft_target_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Node_verify_plot_nft_target_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Node_verify_plot_nft_target_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Node_verify_plot_nft_target_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Node_verify_plot_nft_target_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Node.verify_plot_nft_target.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Node_verify_plot_nft_target_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Node_verify_plot_nft_target_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Node.verify_plot_nft_target.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Node_verify_plot_nft_target_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Node_verify_plot_nft_target_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Node_verify_plot_nft_target_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Node_verify_plot_nft_target_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Node_verify_plot_nft_target_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Node_verify_plot_nft_target_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Node_verify_plot_nft_target_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Node.verify_plot_nft_target.return\";\n\ttype_code->type_hash = vnx::Hash64(0x82f0f6ed43a0c4bull);\n\ttype_code->code_hash = vnx::Hash64(0x1a5ec07d47b9aeaaull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Node_verify_plot_nft_target_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Node_verify_plot_nft_target_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::pooling_error_e::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {23, 2, 4, 6, 19, 0, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Node_verify_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Node_verify_plot_nft_target_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Node_verify_plot_nft_target_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Node_verify_plot_nft_target_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Node_verify_plot_nft_target_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Node_verify_plot_nft_target_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Node_verify_plot_nft_target_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Operation.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Operation.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nconst uint16_t Operation::NO_SOLUTION;\n\nconst vnx::Hash64 Operation::VNX_TYPE_HASH(0xfd69dd82e906e619ull);\nconst vnx::Hash64 Operation::VNX_CODE_HASH(0xeb820061b22c3c4bull);\n\nvnx::Hash64 Operation::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Operation::get_type_name() const {\n\treturn \"mmx.Operation\";\n}\n\nconst vnx::TypeCode* Operation::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Operation;\n}\n\nstd::shared_ptr<Operation> Operation::create() {\n\treturn std::make_shared<Operation>();\n}\n\nstd::shared_ptr<vnx::Value> Operation::clone() const {\n\treturn std::make_shared<Operation>(*this);\n}\n\nvoid Operation::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Operation::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Operation::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Operation;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, solution);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Operation::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Operation\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"solution\\\": \"; vnx::write(_out, solution);\n\t_out << \"}\";\n}\n\nvoid Operation::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Operation::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Operation\";\n\t_object[\"version\"] = version;\n\t_object[\"address\"] = address;\n\t_object[\"solution\"] = solution;\n\treturn _object;\n}\n\nvoid Operation::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"solution\") {\n\t\t\t_entry.second.to(solution);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant Operation::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"solution\") {\n\t\treturn vnx::Variant(solution);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Operation::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"solution\") {\n\t\t_value.to(solution);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Operation& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Operation& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Operation::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Operation::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Operation\";\n\ttype_code->type_hash = vnx::Hash64(0xfd69dd82e906e619ull);\n\ttype_code->code_hash = vnx::Hash64(0xeb820061b22c3c4bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::Operation);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Operation>(); };\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 2;\n\t\tfield.name = \"solution\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {2};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Operation::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Operation& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.solution, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Operation& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Operation;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Operation>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(6);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.solution);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Operation& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Operation& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Operation& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Partial.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Partial::VNX_TYPE_HASH(0x2c849b13a7efd71aull);\nconst vnx::Hash64 Partial::VNX_CODE_HASH(0xca1340c22c20b48full);\n\nvnx::Hash64 Partial::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Partial::get_type_name() const {\n\treturn \"mmx.Partial\";\n}\n\nconst vnx::TypeCode* Partial::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Partial;\n}\n\nstd::shared_ptr<Partial> Partial::create() {\n\treturn std::make_shared<Partial>();\n}\n\nstd::shared_ptr<vnx::Value> Partial::clone() const {\n\treturn std::make_shared<Partial>(*this);\n}\n\nvoid Partial::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Partial::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Partial::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Partial;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, vdf_height);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, hash);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, account);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, pool_url);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, harvester);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, lookup_time_ms);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, proof);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, farmer_sig);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Partial::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Partial\\\"\";\n\t_out << \", \\\"vdf_height\\\": \"; vnx::write(_out, vdf_height);\n\t_out << \", \\\"hash\\\": \"; vnx::write(_out, hash);\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"account\\\": \"; vnx::write(_out, account);\n\t_out << \", \\\"pool_url\\\": \"; vnx::write(_out, pool_url);\n\t_out << \", \\\"harvester\\\": \"; vnx::write(_out, harvester);\n\t_out << \", \\\"lookup_time_ms\\\": \"; vnx::write(_out, lookup_time_ms);\n\t_out << \", \\\"proof\\\": \"; vnx::write(_out, proof);\n\t_out << \", \\\"farmer_sig\\\": \"; vnx::write(_out, farmer_sig);\n\t_out << \"}\";\n}\n\nvoid Partial::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Partial::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Partial\";\n\t_object[\"vdf_height\"] = vdf_height;\n\t_object[\"hash\"] = hash;\n\t_object[\"contract\"] = contract;\n\t_object[\"account\"] = account;\n\t_object[\"pool_url\"] = pool_url;\n\t_object[\"harvester\"] = harvester;\n\t_object[\"lookup_time_ms\"] = lookup_time_ms;\n\t_object[\"proof\"] = proof;\n\t_object[\"farmer_sig\"] = farmer_sig;\n\treturn _object;\n}\n\nvoid Partial::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"account\") {\n\t\t\t_entry.second.to(account);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"farmer_sig\") {\n\t\t\t_entry.second.to(farmer_sig);\n\t\t} else if(_entry.first == \"harvester\") {\n\t\t\t_entry.second.to(harvester);\n\t\t} else if(_entry.first == \"hash\") {\n\t\t\t_entry.second.to(hash);\n\t\t} else if(_entry.first == \"lookup_time_ms\") {\n\t\t\t_entry.second.to(lookup_time_ms);\n\t\t} else if(_entry.first == \"pool_url\") {\n\t\t\t_entry.second.to(pool_url);\n\t\t} else if(_entry.first == \"proof\") {\n\t\t\t_entry.second.to(proof);\n\t\t} else if(_entry.first == \"vdf_height\") {\n\t\t\t_entry.second.to(vdf_height);\n\t\t}\n\t}\n}\n\nvnx::Variant Partial::get_field(const std::string& _name) const {\n\tif(_name == \"vdf_height\") {\n\t\treturn vnx::Variant(vdf_height);\n\t}\n\tif(_name == \"hash\") {\n\t\treturn vnx::Variant(hash);\n\t}\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"account\") {\n\t\treturn vnx::Variant(account);\n\t}\n\tif(_name == \"pool_url\") {\n\t\treturn vnx::Variant(pool_url);\n\t}\n\tif(_name == \"harvester\") {\n\t\treturn vnx::Variant(harvester);\n\t}\n\tif(_name == \"lookup_time_ms\") {\n\t\treturn vnx::Variant(lookup_time_ms);\n\t}\n\tif(_name == \"proof\") {\n\t\treturn vnx::Variant(proof);\n\t}\n\tif(_name == \"farmer_sig\") {\n\t\treturn vnx::Variant(farmer_sig);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Partial::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"vdf_height\") {\n\t\t_value.to(vdf_height);\n\t} else if(_name == \"hash\") {\n\t\t_value.to(hash);\n\t} else if(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"account\") {\n\t\t_value.to(account);\n\t} else if(_name == \"pool_url\") {\n\t\t_value.to(pool_url);\n\t} else if(_name == \"harvester\") {\n\t\t_value.to(harvester);\n\t} else if(_name == \"lookup_time_ms\") {\n\t\t_value.to(lookup_time_ms);\n\t} else if(_name == \"proof\") {\n\t\t_value.to(proof);\n\t} else if(_name == \"farmer_sig\") {\n\t\t_value.to(farmer_sig);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Partial& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Partial& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Partial::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Partial::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Partial\";\n\ttype_code->type_hash = vnx::Hash64(0x2c849b13a7efd71aull);\n\ttype_code->code_hash = vnx::Hash64(0xca1340c22c20b48full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::Partial);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Partial>(); };\n\ttype_code->fields.resize(9);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"account\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"pool_url\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"harvester\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"lookup_time_ms\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"proof\";\n\t\tfield.code = {16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_sig\";\n\t\tfield.code = {33, 11, 64, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Partial::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Partial& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.lookup_time_ms, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.hash, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.account, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.pool_url, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.harvester, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.proof, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.farmer_sig, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Partial& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Partial;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Partial>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.vdf_height);\n\tvnx::write_value(_buf + 4, value.lookup_time_ms);\n\tvnx::write(out, value.hash, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.contract, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.account, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.pool_url, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.harvester, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.proof, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.farmer_sig, type_code, type_code->fields[8].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Partial& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Partial& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Partial& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/PeerInfo.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/PeerInfo.hxx>\n#include <mmx/peer_info_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 PeerInfo::VNX_TYPE_HASH(0xf7a37f624c94a121ull);\nconst vnx::Hash64 PeerInfo::VNX_CODE_HASH(0xb1eed7c9e87a2725ull);\n\nvnx::Hash64 PeerInfo::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string PeerInfo::get_type_name() const {\n\treturn \"mmx.PeerInfo\";\n}\n\nconst vnx::TypeCode* PeerInfo::get_type_code() const {\n\treturn mmx::vnx_native_type_code_PeerInfo;\n}\n\nstd::shared_ptr<PeerInfo> PeerInfo::create() {\n\treturn std::make_shared<PeerInfo>();\n}\n\nstd::shared_ptr<vnx::Value> PeerInfo::clone() const {\n\treturn std::make_shared<PeerInfo>(*this);\n}\n\nvoid PeerInfo::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid PeerInfo::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid PeerInfo::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_PeerInfo;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, peers);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid PeerInfo::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.PeerInfo\\\"\";\n\t_out << \", \\\"peers\\\": \"; vnx::write(_out, peers);\n\t_out << \"}\";\n}\n\nvoid PeerInfo::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object PeerInfo::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.PeerInfo\";\n\t_object[\"peers\"] = peers;\n\treturn _object;\n}\n\nvoid PeerInfo::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"peers\") {\n\t\t\t_entry.second.to(peers);\n\t\t}\n\t}\n}\n\nvnx::Variant PeerInfo::get_field(const std::string& _name) const {\n\tif(_name == \"peers\") {\n\t\treturn vnx::Variant(peers);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid PeerInfo::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"peers\") {\n\t\t_value.to(peers);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const PeerInfo& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, PeerInfo& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* PeerInfo::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> PeerInfo::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.PeerInfo\";\n\ttype_code->type_hash = vnx::Hash64(0xf7a37f624c94a121ull);\n\ttype_code->code_hash = vnx::Hash64(0xb1eed7c9e87a2725ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::PeerInfo);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<PeerInfo>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::peer_info_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"peers\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> PeerInfo::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::PeerInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.peers, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::PeerInfo& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_PeerInfo;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::PeerInfo>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.peers, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::PeerInfo& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::PeerInfo& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::PeerInfo& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/PlotHeader.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/PlotHeader.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 PlotHeader::VNX_TYPE_HASH(0x299c5790983c47b6ull);\nconst vnx::Hash64 PlotHeader::VNX_CODE_HASH(0x7b8ddf3d002be0f0ull);\n\nvnx::Hash64 PlotHeader::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string PlotHeader::get_type_name() const {\n\treturn \"mmx.PlotHeader\";\n}\n\nconst vnx::TypeCode* PlotHeader::get_type_code() const {\n\treturn mmx::vnx_native_type_code_PlotHeader;\n}\n\nstd::shared_ptr<PlotHeader> PlotHeader::create() {\n\treturn std::make_shared<PlotHeader>();\n}\n\nstd::shared_ptr<vnx::Value> PlotHeader::clone() const {\n\treturn std::make_shared<PlotHeader>(*this);\n}\n\nvoid PlotHeader::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid PlotHeader::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid PlotHeader::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_PlotHeader;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, ksize);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, xbits);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, has_meta);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, seed);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, plot_id);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, farmer_key);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, plot_size);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, park_size_x);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, park_size_y);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, park_size_pd);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, park_size_meta);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, park_bytes_x);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, park_bytes_y);\n\t_visitor.type_field(_type_code->fields[15], 15); vnx::accept(_visitor, park_bytes_pd);\n\t_visitor.type_field(_type_code->fields[16], 16); vnx::accept(_visitor, park_bytes_meta);\n\t_visitor.type_field(_type_code->fields[17], 17); vnx::accept(_visitor, entry_bits_x);\n\t_visitor.type_field(_type_code->fields[18], 18); vnx::accept(_visitor, num_entries_y);\n\t_visitor.type_field(_type_code->fields[19], 19); vnx::accept(_visitor, table_offset_x);\n\t_visitor.type_field(_type_code->fields[20], 20); vnx::accept(_visitor, table_offset_y);\n\t_visitor.type_field(_type_code->fields[21], 21); vnx::accept(_visitor, table_offset_meta);\n\t_visitor.type_field(_type_code->fields[22], 22); vnx::accept(_visitor, table_offset_pd);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid PlotHeader::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.PlotHeader\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"ksize\\\": \"; vnx::write(_out, ksize);\n\t_out << \", \\\"xbits\\\": \"; vnx::write(_out, xbits);\n\t_out << \", \\\"has_meta\\\": \"; vnx::write(_out, has_meta);\n\t_out << \", \\\"seed\\\": \"; vnx::write(_out, seed);\n\t_out << \", \\\"plot_id\\\": \"; vnx::write(_out, plot_id);\n\t_out << \", \\\"farmer_key\\\": \"; vnx::write(_out, farmer_key);\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"plot_size\\\": \"; vnx::write(_out, plot_size);\n\t_out << \", \\\"park_size_x\\\": \"; vnx::write(_out, park_size_x);\n\t_out << \", \\\"park_size_y\\\": \"; vnx::write(_out, park_size_y);\n\t_out << \", \\\"park_size_pd\\\": \"; vnx::write(_out, park_size_pd);\n\t_out << \", \\\"park_size_meta\\\": \"; vnx::write(_out, park_size_meta);\n\t_out << \", \\\"park_bytes_x\\\": \"; vnx::write(_out, park_bytes_x);\n\t_out << \", \\\"park_bytes_y\\\": \"; vnx::write(_out, park_bytes_y);\n\t_out << \", \\\"park_bytes_pd\\\": \"; vnx::write(_out, park_bytes_pd);\n\t_out << \", \\\"park_bytes_meta\\\": \"; vnx::write(_out, park_bytes_meta);\n\t_out << \", \\\"entry_bits_x\\\": \"; vnx::write(_out, entry_bits_x);\n\t_out << \", \\\"num_entries_y\\\": \"; vnx::write(_out, num_entries_y);\n\t_out << \", \\\"table_offset_x\\\": \"; vnx::write(_out, table_offset_x);\n\t_out << \", \\\"table_offset_y\\\": \"; vnx::write(_out, table_offset_y);\n\t_out << \", \\\"table_offset_meta\\\": \"; vnx::write(_out, table_offset_meta);\n\t_out << \", \\\"table_offset_pd\\\": \"; vnx::write(_out, table_offset_pd);\n\t_out << \"}\";\n}\n\nvoid PlotHeader::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object PlotHeader::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.PlotHeader\";\n\t_object[\"version\"] = version;\n\t_object[\"ksize\"] = ksize;\n\t_object[\"xbits\"] = xbits;\n\t_object[\"has_meta\"] = has_meta;\n\t_object[\"seed\"] = seed;\n\t_object[\"plot_id\"] = plot_id;\n\t_object[\"farmer_key\"] = farmer_key;\n\t_object[\"contract\"] = contract;\n\t_object[\"plot_size\"] = plot_size;\n\t_object[\"park_size_x\"] = park_size_x;\n\t_object[\"park_size_y\"] = park_size_y;\n\t_object[\"park_size_pd\"] = park_size_pd;\n\t_object[\"park_size_meta\"] = park_size_meta;\n\t_object[\"park_bytes_x\"] = park_bytes_x;\n\t_object[\"park_bytes_y\"] = park_bytes_y;\n\t_object[\"park_bytes_pd\"] = park_bytes_pd;\n\t_object[\"park_bytes_meta\"] = park_bytes_meta;\n\t_object[\"entry_bits_x\"] = entry_bits_x;\n\t_object[\"num_entries_y\"] = num_entries_y;\n\t_object[\"table_offset_x\"] = table_offset_x;\n\t_object[\"table_offset_y\"] = table_offset_y;\n\t_object[\"table_offset_meta\"] = table_offset_meta;\n\t_object[\"table_offset_pd\"] = table_offset_pd;\n\treturn _object;\n}\n\nvoid PlotHeader::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"entry_bits_x\") {\n\t\t\t_entry.second.to(entry_bits_x);\n\t\t} else if(_entry.first == \"farmer_key\") {\n\t\t\t_entry.second.to(farmer_key);\n\t\t} else if(_entry.first == \"has_meta\") {\n\t\t\t_entry.second.to(has_meta);\n\t\t} else if(_entry.first == \"ksize\") {\n\t\t\t_entry.second.to(ksize);\n\t\t} else if(_entry.first == \"num_entries_y\") {\n\t\t\t_entry.second.to(num_entries_y);\n\t\t} else if(_entry.first == \"park_bytes_meta\") {\n\t\t\t_entry.second.to(park_bytes_meta);\n\t\t} else if(_entry.first == \"park_bytes_pd\") {\n\t\t\t_entry.second.to(park_bytes_pd);\n\t\t} else if(_entry.first == \"park_bytes_x\") {\n\t\t\t_entry.second.to(park_bytes_x);\n\t\t} else if(_entry.first == \"park_bytes_y\") {\n\t\t\t_entry.second.to(park_bytes_y);\n\t\t} else if(_entry.first == \"park_size_meta\") {\n\t\t\t_entry.second.to(park_size_meta);\n\t\t} else if(_entry.first == \"park_size_pd\") {\n\t\t\t_entry.second.to(park_size_pd);\n\t\t} else if(_entry.first == \"park_size_x\") {\n\t\t\t_entry.second.to(park_size_x);\n\t\t} else if(_entry.first == \"park_size_y\") {\n\t\t\t_entry.second.to(park_size_y);\n\t\t} else if(_entry.first == \"plot_id\") {\n\t\t\t_entry.second.to(plot_id);\n\t\t} else if(_entry.first == \"plot_size\") {\n\t\t\t_entry.second.to(plot_size);\n\t\t} else if(_entry.first == \"seed\") {\n\t\t\t_entry.second.to(seed);\n\t\t} else if(_entry.first == \"table_offset_meta\") {\n\t\t\t_entry.second.to(table_offset_meta);\n\t\t} else if(_entry.first == \"table_offset_pd\") {\n\t\t\t_entry.second.to(table_offset_pd);\n\t\t} else if(_entry.first == \"table_offset_x\") {\n\t\t\t_entry.second.to(table_offset_x);\n\t\t} else if(_entry.first == \"table_offset_y\") {\n\t\t\t_entry.second.to(table_offset_y);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t} else if(_entry.first == \"xbits\") {\n\t\t\t_entry.second.to(xbits);\n\t\t}\n\t}\n}\n\nvnx::Variant PlotHeader::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"ksize\") {\n\t\treturn vnx::Variant(ksize);\n\t}\n\tif(_name == \"xbits\") {\n\t\treturn vnx::Variant(xbits);\n\t}\n\tif(_name == \"has_meta\") {\n\t\treturn vnx::Variant(has_meta);\n\t}\n\tif(_name == \"seed\") {\n\t\treturn vnx::Variant(seed);\n\t}\n\tif(_name == \"plot_id\") {\n\t\treturn vnx::Variant(plot_id);\n\t}\n\tif(_name == \"farmer_key\") {\n\t\treturn vnx::Variant(farmer_key);\n\t}\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"plot_size\") {\n\t\treturn vnx::Variant(plot_size);\n\t}\n\tif(_name == \"park_size_x\") {\n\t\treturn vnx::Variant(park_size_x);\n\t}\n\tif(_name == \"park_size_y\") {\n\t\treturn vnx::Variant(park_size_y);\n\t}\n\tif(_name == \"park_size_pd\") {\n\t\treturn vnx::Variant(park_size_pd);\n\t}\n\tif(_name == \"park_size_meta\") {\n\t\treturn vnx::Variant(park_size_meta);\n\t}\n\tif(_name == \"park_bytes_x\") {\n\t\treturn vnx::Variant(park_bytes_x);\n\t}\n\tif(_name == \"park_bytes_y\") {\n\t\treturn vnx::Variant(park_bytes_y);\n\t}\n\tif(_name == \"park_bytes_pd\") {\n\t\treturn vnx::Variant(park_bytes_pd);\n\t}\n\tif(_name == \"park_bytes_meta\") {\n\t\treturn vnx::Variant(park_bytes_meta);\n\t}\n\tif(_name == \"entry_bits_x\") {\n\t\treturn vnx::Variant(entry_bits_x);\n\t}\n\tif(_name == \"num_entries_y\") {\n\t\treturn vnx::Variant(num_entries_y);\n\t}\n\tif(_name == \"table_offset_x\") {\n\t\treturn vnx::Variant(table_offset_x);\n\t}\n\tif(_name == \"table_offset_y\") {\n\t\treturn vnx::Variant(table_offset_y);\n\t}\n\tif(_name == \"table_offset_meta\") {\n\t\treturn vnx::Variant(table_offset_meta);\n\t}\n\tif(_name == \"table_offset_pd\") {\n\t\treturn vnx::Variant(table_offset_pd);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid PlotHeader::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"ksize\") {\n\t\t_value.to(ksize);\n\t} else if(_name == \"xbits\") {\n\t\t_value.to(xbits);\n\t} else if(_name == \"has_meta\") {\n\t\t_value.to(has_meta);\n\t} else if(_name == \"seed\") {\n\t\t_value.to(seed);\n\t} else if(_name == \"plot_id\") {\n\t\t_value.to(plot_id);\n\t} else if(_name == \"farmer_key\") {\n\t\t_value.to(farmer_key);\n\t} else if(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"plot_size\") {\n\t\t_value.to(plot_size);\n\t} else if(_name == \"park_size_x\") {\n\t\t_value.to(park_size_x);\n\t} else if(_name == \"park_size_y\") {\n\t\t_value.to(park_size_y);\n\t} else if(_name == \"park_size_pd\") {\n\t\t_value.to(park_size_pd);\n\t} else if(_name == \"park_size_meta\") {\n\t\t_value.to(park_size_meta);\n\t} else if(_name == \"park_bytes_x\") {\n\t\t_value.to(park_bytes_x);\n\t} else if(_name == \"park_bytes_y\") {\n\t\t_value.to(park_bytes_y);\n\t} else if(_name == \"park_bytes_pd\") {\n\t\t_value.to(park_bytes_pd);\n\t} else if(_name == \"park_bytes_meta\") {\n\t\t_value.to(park_bytes_meta);\n\t} else if(_name == \"entry_bits_x\") {\n\t\t_value.to(entry_bits_x);\n\t} else if(_name == \"num_entries_y\") {\n\t\t_value.to(num_entries_y);\n\t} else if(_name == \"table_offset_x\") {\n\t\t_value.to(table_offset_x);\n\t} else if(_name == \"table_offset_y\") {\n\t\t_value.to(table_offset_y);\n\t} else if(_name == \"table_offset_meta\") {\n\t\t_value.to(table_offset_meta);\n\t} else if(_name == \"table_offset_pd\") {\n\t\t_value.to(table_offset_pd);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const PlotHeader& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, PlotHeader& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* PlotHeader::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> PlotHeader::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.PlotHeader\";\n\ttype_code->type_hash = vnx::Hash64(0x299c5790983c47b6ull);\n\ttype_code->code_hash = vnx::Hash64(0x7b8ddf3d002be0f0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::PlotHeader);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<PlotHeader>(); };\n\ttype_code->fields.resize(23);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"ksize\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"xbits\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"has_meta\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"seed\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"plot_id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_key\";\n\t\tfield.code = {11, 33, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"plot_size\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"park_size_x\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"park_size_y\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"park_size_pd\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"park_size_meta\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"park_bytes_x\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"park_bytes_y\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[15];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"park_bytes_pd\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[16];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"park_bytes_meta\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[17];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"entry_bits_x\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[18];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"num_entries_y\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[19];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"table_offset_x\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[20];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"table_offset_y\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[21];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"table_offset_meta\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[22];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"table_offset_pd\";\n\t\tfield.code = {12, 4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> PlotHeader::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::PlotHeader& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.ksize, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.xbits, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.has_meta, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.plot_size, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[9]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.park_size_x, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[10]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.park_size_y, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[11]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.park_size_pd, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[12]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.park_size_meta, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[13]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.park_bytes_x, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[14]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.park_bytes_y, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[15]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.park_bytes_pd, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[16]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.park_bytes_meta, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[17]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.entry_bits_x, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[18]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_entries_y, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[19]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.table_offset_x, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[20]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.table_offset_y, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[21]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.table_offset_meta, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 4: vnx::read(in, value.seed, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.plot_id, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.farmer_key, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 22: vnx::read(in, value.table_offset_pd, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::PlotHeader& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_PlotHeader;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::PlotHeader>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(89);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.ksize);\n\tvnx::write_value(_buf + 8, value.xbits);\n\tvnx::write_value(_buf + 12, value.has_meta);\n\tvnx::write_value(_buf + 13, value.plot_size);\n\tvnx::write_value(_buf + 21, value.park_size_x);\n\tvnx::write_value(_buf + 25, value.park_size_y);\n\tvnx::write_value(_buf + 29, value.park_size_pd);\n\tvnx::write_value(_buf + 33, value.park_size_meta);\n\tvnx::write_value(_buf + 37, value.park_bytes_x);\n\tvnx::write_value(_buf + 41, value.park_bytes_y);\n\tvnx::write_value(_buf + 45, value.park_bytes_pd);\n\tvnx::write_value(_buf + 49, value.park_bytes_meta);\n\tvnx::write_value(_buf + 53, value.entry_bits_x);\n\tvnx::write_value(_buf + 57, value.num_entries_y);\n\tvnx::write_value(_buf + 65, value.table_offset_x);\n\tvnx::write_value(_buf + 73, value.table_offset_y);\n\tvnx::write_value(_buf + 81, value.table_offset_meta);\n\tvnx::write(out, value.seed, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.plot_id, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.farmer_key, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.contract, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.table_offset_pd, type_code, type_code->fields[22].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::PlotHeader& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::PlotHeader& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::PlotHeader& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ProofOfSpace.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ProofOfSpace::VNX_TYPE_HASH(0x9269760ad5fd0058ull);\nconst vnx::Hash64 ProofOfSpace::VNX_CODE_HASH(0x912ddf3fa6db3763ull);\n\nvnx::Hash64 ProofOfSpace::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ProofOfSpace::get_type_name() const {\n\treturn \"mmx.ProofOfSpace\";\n}\n\nconst vnx::TypeCode* ProofOfSpace::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ProofOfSpace;\n}\n\nstd::shared_ptr<ProofOfSpace> ProofOfSpace::create() {\n\treturn std::make_shared<ProofOfSpace>();\n}\n\nstd::shared_ptr<vnx::Value> ProofOfSpace::clone() const {\n\treturn std::make_shared<ProofOfSpace>(*this);\n}\n\nvoid ProofOfSpace::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid ProofOfSpace::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid ProofOfSpace::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ProofOfSpace;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, score);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, plot_id);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, challenge);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, difficulty);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, farmer_key);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ProofOfSpace::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.ProofOfSpace\\\"\";\n\t_out << \", \\\"score\\\": \"; vnx::write(_out, score);\n\t_out << \", \\\"plot_id\\\": \"; vnx::write(_out, plot_id);\n\t_out << \", \\\"challenge\\\": \"; vnx::write(_out, challenge);\n\t_out << \", \\\"difficulty\\\": \"; vnx::write(_out, difficulty);\n\t_out << \", \\\"farmer_key\\\": \"; vnx::write(_out, farmer_key);\n\t_out << \"}\";\n}\n\nvoid ProofOfSpace::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ProofOfSpace::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ProofOfSpace\";\n\t_object[\"score\"] = score;\n\t_object[\"plot_id\"] = plot_id;\n\t_object[\"challenge\"] = challenge;\n\t_object[\"difficulty\"] = difficulty;\n\t_object[\"farmer_key\"] = farmer_key;\n\treturn _object;\n}\n\nvoid ProofOfSpace::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"challenge\") {\n\t\t\t_entry.second.to(challenge);\n\t\t} else if(_entry.first == \"difficulty\") {\n\t\t\t_entry.second.to(difficulty);\n\t\t} else if(_entry.first == \"farmer_key\") {\n\t\t\t_entry.second.to(farmer_key);\n\t\t} else if(_entry.first == \"plot_id\") {\n\t\t\t_entry.second.to(plot_id);\n\t\t} else if(_entry.first == \"score\") {\n\t\t\t_entry.second.to(score);\n\t\t}\n\t}\n}\n\nvnx::Variant ProofOfSpace::get_field(const std::string& _name) const {\n\tif(_name == \"score\") {\n\t\treturn vnx::Variant(score);\n\t}\n\tif(_name == \"plot_id\") {\n\t\treturn vnx::Variant(plot_id);\n\t}\n\tif(_name == \"challenge\") {\n\t\treturn vnx::Variant(challenge);\n\t}\n\tif(_name == \"difficulty\") {\n\t\treturn vnx::Variant(difficulty);\n\t}\n\tif(_name == \"farmer_key\") {\n\t\treturn vnx::Variant(farmer_key);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ProofOfSpace::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"score\") {\n\t\t_value.to(score);\n\t} else if(_name == \"plot_id\") {\n\t\t_value.to(plot_id);\n\t} else if(_name == \"challenge\") {\n\t\t_value.to(challenge);\n\t} else if(_name == \"difficulty\") {\n\t\t_value.to(difficulty);\n\t} else if(_name == \"farmer_key\") {\n\t\t_value.to(farmer_key);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ProofOfSpace& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ProofOfSpace& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ProofOfSpace::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ProofOfSpace::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ProofOfSpace\";\n\ttype_code->type_hash = vnx::Hash64(0x9269760ad5fd0058ull);\n\ttype_code->code_hash = vnx::Hash64(0x912ddf3fa6db3763ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::ProofOfSpace);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<ProofOfSpace>(); };\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 2;\n\t\tfield.name = \"score\";\n\t\tfield.code = {2};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"plot_id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"challenge\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"difficulty\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_key\";\n\t\tfield.code = {11, 33, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> ProofOfSpace::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ProofOfSpace& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.score, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.difficulty, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.plot_id, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.challenge, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.farmer_key, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ProofOfSpace& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ProofOfSpace;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ProofOfSpace>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(10);\n\tvnx::write_value(_buf + 0, value.score);\n\tvnx::write_value(_buf + 2, value.difficulty);\n\tvnx::write(out, value.plot_id, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.challenge, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.farmer_key, type_code, type_code->fields[4].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::ProofOfSpace& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ProofOfSpace& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ProofOfSpace& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ProofOfSpaceNFT.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ProofOfSpaceNFT.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ProofOfSpaceNFT::VNX_TYPE_HASH(0x22a4d97166711bd9ull);\nconst vnx::Hash64 ProofOfSpaceNFT::VNX_CODE_HASH(0x66efabbcbb12ab5dull);\n\nvnx::Hash64 ProofOfSpaceNFT::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ProofOfSpaceNFT::get_type_name() const {\n\treturn \"mmx.ProofOfSpaceNFT\";\n}\n\nconst vnx::TypeCode* ProofOfSpaceNFT::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ProofOfSpaceNFT;\n}\n\nstd::shared_ptr<ProofOfSpaceNFT> ProofOfSpaceNFT::create() {\n\treturn std::make_shared<ProofOfSpaceNFT>();\n}\n\nstd::shared_ptr<vnx::Value> ProofOfSpaceNFT::clone() const {\n\treturn std::make_shared<ProofOfSpaceNFT>(*this);\n}\n\nvoid ProofOfSpaceNFT::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid ProofOfSpaceNFT::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid ProofOfSpaceNFT::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ProofOfSpaceNFT;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, score);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, plot_id);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, challenge);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, difficulty);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, farmer_key);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, ksize);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, seed);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, proof_xs);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, contract);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ProofOfSpaceNFT::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.ProofOfSpaceNFT\\\"\";\n\t_out << \", \\\"score\\\": \"; vnx::write(_out, score);\n\t_out << \", \\\"plot_id\\\": \"; vnx::write(_out, plot_id);\n\t_out << \", \\\"challenge\\\": \"; vnx::write(_out, challenge);\n\t_out << \", \\\"difficulty\\\": \"; vnx::write(_out, difficulty);\n\t_out << \", \\\"farmer_key\\\": \"; vnx::write(_out, farmer_key);\n\t_out << \", \\\"ksize\\\": \"; vnx::write(_out, ksize);\n\t_out << \", \\\"seed\\\": \"; vnx::write(_out, seed);\n\t_out << \", \\\"proof_xs\\\": \"; vnx::write(_out, proof_xs);\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \"}\";\n}\n\nvoid ProofOfSpaceNFT::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ProofOfSpaceNFT::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ProofOfSpaceNFT\";\n\t_object[\"score\"] = score;\n\t_object[\"plot_id\"] = plot_id;\n\t_object[\"challenge\"] = challenge;\n\t_object[\"difficulty\"] = difficulty;\n\t_object[\"farmer_key\"] = farmer_key;\n\t_object[\"ksize\"] = ksize;\n\t_object[\"seed\"] = seed;\n\t_object[\"proof_xs\"] = proof_xs;\n\t_object[\"contract\"] = contract;\n\treturn _object;\n}\n\nvoid ProofOfSpaceNFT::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"challenge\") {\n\t\t\t_entry.second.to(challenge);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"difficulty\") {\n\t\t\t_entry.second.to(difficulty);\n\t\t} else if(_entry.first == \"farmer_key\") {\n\t\t\t_entry.second.to(farmer_key);\n\t\t} else if(_entry.first == \"ksize\") {\n\t\t\t_entry.second.to(ksize);\n\t\t} else if(_entry.first == \"plot_id\") {\n\t\t\t_entry.second.to(plot_id);\n\t\t} else if(_entry.first == \"proof_xs\") {\n\t\t\t_entry.second.to(proof_xs);\n\t\t} else if(_entry.first == \"score\") {\n\t\t\t_entry.second.to(score);\n\t\t} else if(_entry.first == \"seed\") {\n\t\t\t_entry.second.to(seed);\n\t\t}\n\t}\n}\n\nvnx::Variant ProofOfSpaceNFT::get_field(const std::string& _name) const {\n\tif(_name == \"score\") {\n\t\treturn vnx::Variant(score);\n\t}\n\tif(_name == \"plot_id\") {\n\t\treturn vnx::Variant(plot_id);\n\t}\n\tif(_name == \"challenge\") {\n\t\treturn vnx::Variant(challenge);\n\t}\n\tif(_name == \"difficulty\") {\n\t\treturn vnx::Variant(difficulty);\n\t}\n\tif(_name == \"farmer_key\") {\n\t\treturn vnx::Variant(farmer_key);\n\t}\n\tif(_name == \"ksize\") {\n\t\treturn vnx::Variant(ksize);\n\t}\n\tif(_name == \"seed\") {\n\t\treturn vnx::Variant(seed);\n\t}\n\tif(_name == \"proof_xs\") {\n\t\treturn vnx::Variant(proof_xs);\n\t}\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ProofOfSpaceNFT::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"score\") {\n\t\t_value.to(score);\n\t} else if(_name == \"plot_id\") {\n\t\t_value.to(plot_id);\n\t} else if(_name == \"challenge\") {\n\t\t_value.to(challenge);\n\t} else if(_name == \"difficulty\") {\n\t\t_value.to(difficulty);\n\t} else if(_name == \"farmer_key\") {\n\t\t_value.to(farmer_key);\n\t} else if(_name == \"ksize\") {\n\t\t_value.to(ksize);\n\t} else if(_name == \"seed\") {\n\t\t_value.to(seed);\n\t} else if(_name == \"proof_xs\") {\n\t\t_value.to(proof_xs);\n\t} else if(_name == \"contract\") {\n\t\t_value.to(contract);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ProofOfSpaceNFT& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ProofOfSpaceNFT& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ProofOfSpaceNFT::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ProofOfSpaceNFT::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ProofOfSpaceNFT\";\n\ttype_code->type_hash = vnx::Hash64(0x22a4d97166711bd9ull);\n\ttype_code->code_hash = vnx::Hash64(0x66efabbcbb12ab5dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::ProofOfSpaceNFT);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::ProofOfSpace::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<ProofOfSpaceNFT>(); };\n\ttype_code->fields.resize(9);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 2;\n\t\tfield.name = \"score\";\n\t\tfield.code = {2};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"plot_id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"challenge\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"difficulty\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_key\";\n\t\tfield.code = {11, 33, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"ksize\";\n\t\tfield.code = {1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"seed\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"proof_xs\";\n\t\tfield.code = {12, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> ProofOfSpaceNFT::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ProofOfSpaceNFT& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.score, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.difficulty, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.ksize, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.plot_id, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.challenge, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.farmer_key, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.seed, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.proof_xs, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ProofOfSpaceNFT& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ProofOfSpaceNFT;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ProofOfSpaceNFT>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(11);\n\tvnx::write_value(_buf + 0, value.score);\n\tvnx::write_value(_buf + 2, value.difficulty);\n\tvnx::write_value(_buf + 10, value.ksize);\n\tvnx::write(out, value.plot_id, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.challenge, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.farmer_key, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.seed, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.proof_xs, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.contract, type_code, type_code->fields[8].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::ProofOfSpaceNFT& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ProofOfSpaceNFT& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ProofOfSpaceNFT& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ProofOfSpaceOG.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/hash_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ProofOfSpaceOG::VNX_TYPE_HASH(0x6def5518efc37b4ull);\nconst vnx::Hash64 ProofOfSpaceOG::VNX_CODE_HASH(0x2b9bf9e319831974ull);\n\nvnx::Hash64 ProofOfSpaceOG::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ProofOfSpaceOG::get_type_name() const {\n\treturn \"mmx.ProofOfSpaceOG\";\n}\n\nconst vnx::TypeCode* ProofOfSpaceOG::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ProofOfSpaceOG;\n}\n\nstd::shared_ptr<ProofOfSpaceOG> ProofOfSpaceOG::create() {\n\treturn std::make_shared<ProofOfSpaceOG>();\n}\n\nstd::shared_ptr<vnx::Value> ProofOfSpaceOG::clone() const {\n\treturn std::make_shared<ProofOfSpaceOG>(*this);\n}\n\nvoid ProofOfSpaceOG::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid ProofOfSpaceOG::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid ProofOfSpaceOG::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ProofOfSpaceOG;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, score);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, plot_id);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, challenge);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, difficulty);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, farmer_key);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, ksize);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, seed);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, proof_xs);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ProofOfSpaceOG::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.ProofOfSpaceOG\\\"\";\n\t_out << \", \\\"score\\\": \"; vnx::write(_out, score);\n\t_out << \", \\\"plot_id\\\": \"; vnx::write(_out, plot_id);\n\t_out << \", \\\"challenge\\\": \"; vnx::write(_out, challenge);\n\t_out << \", \\\"difficulty\\\": \"; vnx::write(_out, difficulty);\n\t_out << \", \\\"farmer_key\\\": \"; vnx::write(_out, farmer_key);\n\t_out << \", \\\"ksize\\\": \"; vnx::write(_out, ksize);\n\t_out << \", \\\"seed\\\": \"; vnx::write(_out, seed);\n\t_out << \", \\\"proof_xs\\\": \"; vnx::write(_out, proof_xs);\n\t_out << \"}\";\n}\n\nvoid ProofOfSpaceOG::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ProofOfSpaceOG::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ProofOfSpaceOG\";\n\t_object[\"score\"] = score;\n\t_object[\"plot_id\"] = plot_id;\n\t_object[\"challenge\"] = challenge;\n\t_object[\"difficulty\"] = difficulty;\n\t_object[\"farmer_key\"] = farmer_key;\n\t_object[\"ksize\"] = ksize;\n\t_object[\"seed\"] = seed;\n\t_object[\"proof_xs\"] = proof_xs;\n\treturn _object;\n}\n\nvoid ProofOfSpaceOG::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"challenge\") {\n\t\t\t_entry.second.to(challenge);\n\t\t} else if(_entry.first == \"difficulty\") {\n\t\t\t_entry.second.to(difficulty);\n\t\t} else if(_entry.first == \"farmer_key\") {\n\t\t\t_entry.second.to(farmer_key);\n\t\t} else if(_entry.first == \"ksize\") {\n\t\t\t_entry.second.to(ksize);\n\t\t} else if(_entry.first == \"plot_id\") {\n\t\t\t_entry.second.to(plot_id);\n\t\t} else if(_entry.first == \"proof_xs\") {\n\t\t\t_entry.second.to(proof_xs);\n\t\t} else if(_entry.first == \"score\") {\n\t\t\t_entry.second.to(score);\n\t\t} else if(_entry.first == \"seed\") {\n\t\t\t_entry.second.to(seed);\n\t\t}\n\t}\n}\n\nvnx::Variant ProofOfSpaceOG::get_field(const std::string& _name) const {\n\tif(_name == \"score\") {\n\t\treturn vnx::Variant(score);\n\t}\n\tif(_name == \"plot_id\") {\n\t\treturn vnx::Variant(plot_id);\n\t}\n\tif(_name == \"challenge\") {\n\t\treturn vnx::Variant(challenge);\n\t}\n\tif(_name == \"difficulty\") {\n\t\treturn vnx::Variant(difficulty);\n\t}\n\tif(_name == \"farmer_key\") {\n\t\treturn vnx::Variant(farmer_key);\n\t}\n\tif(_name == \"ksize\") {\n\t\treturn vnx::Variant(ksize);\n\t}\n\tif(_name == \"seed\") {\n\t\treturn vnx::Variant(seed);\n\t}\n\tif(_name == \"proof_xs\") {\n\t\treturn vnx::Variant(proof_xs);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ProofOfSpaceOG::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"score\") {\n\t\t_value.to(score);\n\t} else if(_name == \"plot_id\") {\n\t\t_value.to(plot_id);\n\t} else if(_name == \"challenge\") {\n\t\t_value.to(challenge);\n\t} else if(_name == \"difficulty\") {\n\t\t_value.to(difficulty);\n\t} else if(_name == \"farmer_key\") {\n\t\t_value.to(farmer_key);\n\t} else if(_name == \"ksize\") {\n\t\t_value.to(ksize);\n\t} else if(_name == \"seed\") {\n\t\t_value.to(seed);\n\t} else if(_name == \"proof_xs\") {\n\t\t_value.to(proof_xs);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ProofOfSpaceOG& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ProofOfSpaceOG& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ProofOfSpaceOG::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ProofOfSpaceOG::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ProofOfSpaceOG\";\n\ttype_code->type_hash = vnx::Hash64(0x6def5518efc37b4ull);\n\ttype_code->code_hash = vnx::Hash64(0x2b9bf9e319831974ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::ProofOfSpaceOG);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::ProofOfSpace::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<ProofOfSpaceOG>(); };\n\ttype_code->fields.resize(8);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 2;\n\t\tfield.name = \"score\";\n\t\tfield.code = {2};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"plot_id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"challenge\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"difficulty\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_key\";\n\t\tfield.code = {11, 33, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"ksize\";\n\t\tfield.code = {1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"seed\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"proof_xs\";\n\t\tfield.code = {12, 3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> ProofOfSpaceOG::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ProofOfSpaceOG& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.score, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.difficulty, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.ksize, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.plot_id, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.challenge, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.farmer_key, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.seed, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.proof_xs, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ProofOfSpaceOG& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ProofOfSpaceOG;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ProofOfSpaceOG>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(11);\n\tvnx::write_value(_buf + 0, value.score);\n\tvnx::write_value(_buf + 2, value.difficulty);\n\tvnx::write_value(_buf + 10, value.ksize);\n\tvnx::write(out, value.plot_id, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.challenge, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.farmer_key, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.seed, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.proof_xs, type_code, type_code->fields[7].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::ProofOfSpaceOG& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ProofOfSpaceOG& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ProofOfSpaceOG& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ProofOfTime.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ProofOfTime::VNX_TYPE_HASH(0xa84a63942b8e5c6aull);\nconst vnx::Hash64 ProofOfTime::VNX_CODE_HASH(0x969604802b05b4cdull);\n\nvnx::Hash64 ProofOfTime::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ProofOfTime::get_type_name() const {\n\treturn \"mmx.ProofOfTime\";\n}\n\nconst vnx::TypeCode* ProofOfTime::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ProofOfTime;\n}\n\nstd::shared_ptr<ProofOfTime> ProofOfTime::create() {\n\treturn std::make_shared<ProofOfTime>();\n}\n\nstd::shared_ptr<vnx::Value> ProofOfTime::clone() const {\n\treturn std::make_shared<ProofOfTime>(*this);\n}\n\nvoid ProofOfTime::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid ProofOfTime::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid ProofOfTime::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ProofOfTime;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, hash);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, vdf_height);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, start);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, num_iters);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, segment_size);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, input);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, prev);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, reward_addr);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, segments);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, timelord_key);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, timelord_sig);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, content_hash);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ProofOfTime::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.ProofOfTime\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"hash\\\": \"; vnx::write(_out, hash);\n\t_out << \", \\\"vdf_height\\\": \"; vnx::write(_out, vdf_height);\n\t_out << \", \\\"start\\\": \"; vnx::write(_out, start);\n\t_out << \", \\\"num_iters\\\": \"; vnx::write(_out, num_iters);\n\t_out << \", \\\"segment_size\\\": \"; vnx::write(_out, segment_size);\n\t_out << \", \\\"input\\\": \"; vnx::write(_out, input);\n\t_out << \", \\\"prev\\\": \"; vnx::write(_out, prev);\n\t_out << \", \\\"reward_addr\\\": \"; vnx::write(_out, reward_addr);\n\t_out << \", \\\"segments\\\": \"; vnx::write(_out, segments);\n\t_out << \", \\\"timelord_key\\\": \"; vnx::write(_out, timelord_key);\n\t_out << \", \\\"timelord_sig\\\": \"; vnx::write(_out, timelord_sig);\n\t_out << \", \\\"content_hash\\\": \"; vnx::write(_out, content_hash);\n\t_out << \"}\";\n}\n\nvoid ProofOfTime::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ProofOfTime::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ProofOfTime\";\n\t_object[\"version\"] = version;\n\t_object[\"hash\"] = hash;\n\t_object[\"vdf_height\"] = vdf_height;\n\t_object[\"start\"] = start;\n\t_object[\"num_iters\"] = num_iters;\n\t_object[\"segment_size\"] = segment_size;\n\t_object[\"input\"] = input;\n\t_object[\"prev\"] = prev;\n\t_object[\"reward_addr\"] = reward_addr;\n\t_object[\"segments\"] = segments;\n\t_object[\"timelord_key\"] = timelord_key;\n\t_object[\"timelord_sig\"] = timelord_sig;\n\t_object[\"content_hash\"] = content_hash;\n\treturn _object;\n}\n\nvoid ProofOfTime::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"content_hash\") {\n\t\t\t_entry.second.to(content_hash);\n\t\t} else if(_entry.first == \"hash\") {\n\t\t\t_entry.second.to(hash);\n\t\t} else if(_entry.first == \"input\") {\n\t\t\t_entry.second.to(input);\n\t\t} else if(_entry.first == \"num_iters\") {\n\t\t\t_entry.second.to(num_iters);\n\t\t} else if(_entry.first == \"prev\") {\n\t\t\t_entry.second.to(prev);\n\t\t} else if(_entry.first == \"reward_addr\") {\n\t\t\t_entry.second.to(reward_addr);\n\t\t} else if(_entry.first == \"segment_size\") {\n\t\t\t_entry.second.to(segment_size);\n\t\t} else if(_entry.first == \"segments\") {\n\t\t\t_entry.second.to(segments);\n\t\t} else if(_entry.first == \"start\") {\n\t\t\t_entry.second.to(start);\n\t\t} else if(_entry.first == \"timelord_key\") {\n\t\t\t_entry.second.to(timelord_key);\n\t\t} else if(_entry.first == \"timelord_sig\") {\n\t\t\t_entry.second.to(timelord_sig);\n\t\t} else if(_entry.first == \"vdf_height\") {\n\t\t\t_entry.second.to(vdf_height);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant ProofOfTime::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"hash\") {\n\t\treturn vnx::Variant(hash);\n\t}\n\tif(_name == \"vdf_height\") {\n\t\treturn vnx::Variant(vdf_height);\n\t}\n\tif(_name == \"start\") {\n\t\treturn vnx::Variant(start);\n\t}\n\tif(_name == \"num_iters\") {\n\t\treturn vnx::Variant(num_iters);\n\t}\n\tif(_name == \"segment_size\") {\n\t\treturn vnx::Variant(segment_size);\n\t}\n\tif(_name == \"input\") {\n\t\treturn vnx::Variant(input);\n\t}\n\tif(_name == \"prev\") {\n\t\treturn vnx::Variant(prev);\n\t}\n\tif(_name == \"reward_addr\") {\n\t\treturn vnx::Variant(reward_addr);\n\t}\n\tif(_name == \"segments\") {\n\t\treturn vnx::Variant(segments);\n\t}\n\tif(_name == \"timelord_key\") {\n\t\treturn vnx::Variant(timelord_key);\n\t}\n\tif(_name == \"timelord_sig\") {\n\t\treturn vnx::Variant(timelord_sig);\n\t}\n\tif(_name == \"content_hash\") {\n\t\treturn vnx::Variant(content_hash);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ProofOfTime::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"hash\") {\n\t\t_value.to(hash);\n\t} else if(_name == \"vdf_height\") {\n\t\t_value.to(vdf_height);\n\t} else if(_name == \"start\") {\n\t\t_value.to(start);\n\t} else if(_name == \"num_iters\") {\n\t\t_value.to(num_iters);\n\t} else if(_name == \"segment_size\") {\n\t\t_value.to(segment_size);\n\t} else if(_name == \"input\") {\n\t\t_value.to(input);\n\t} else if(_name == \"prev\") {\n\t\t_value.to(prev);\n\t} else if(_name == \"reward_addr\") {\n\t\t_value.to(reward_addr);\n\t} else if(_name == \"segments\") {\n\t\t_value.to(segments);\n\t} else if(_name == \"timelord_key\") {\n\t\t_value.to(timelord_key);\n\t} else if(_name == \"timelord_sig\") {\n\t\t_value.to(timelord_sig);\n\t} else if(_name == \"content_hash\") {\n\t\t_value.to(content_hash);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ProofOfTime& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ProofOfTime& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ProofOfTime::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ProofOfTime::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ProofOfTime\";\n\ttype_code->type_hash = vnx::Hash64(0xa84a63942b8e5c6aull);\n\ttype_code->code_hash = vnx::Hash64(0x969604802b05b4cdull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::ProofOfTime);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<ProofOfTime>(); };\n\ttype_code->fields.resize(13);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"start\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"num_iters\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"segment_size\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"prev\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_addr\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"segments\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"timelord_key\";\n\t\tfield.code = {11, 33, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"timelord_sig\";\n\t\tfield.code = {11, 64, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"content_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> ProofOfTime::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ProofOfTime& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.start, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_iters, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.segment_size, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.hash, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.input, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.prev, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.reward_addr, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.segments, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.timelord_key, type_code, _field->code.data()); break;\n\t\t\tcase 11: vnx::read(in, value.timelord_sig, type_code, _field->code.data()); break;\n\t\t\tcase 12: vnx::read(in, value.content_hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ProofOfTime& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ProofOfTime;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ProofOfTime>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(28);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.vdf_height);\n\tvnx::write_value(_buf + 8, value.start);\n\tvnx::write_value(_buf + 16, value.num_iters);\n\tvnx::write_value(_buf + 24, value.segment_size);\n\tvnx::write(out, value.hash, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.input, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.prev, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.reward_addr, type_code, type_code->fields[8].code.data());\n\tvnx::write(out, value.segments, type_code, type_code->fields[9].code.data());\n\tvnx::write(out, value.timelord_key, type_code, type_code->fields[10].code.data());\n\tvnx::write(out, value.timelord_sig, type_code, type_code->fields[11].code.data());\n\tvnx::write(out, value.content_hash, type_code, type_code->fields[12].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::ProofOfTime& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ProofOfTime& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ProofOfTime& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ProofResponse.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Hash64.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ProofResponse::VNX_TYPE_HASH(0x816e898b36befae0ull);\nconst vnx::Hash64 ProofResponse::VNX_CODE_HASH(0xa92d883d47260f22ull);\n\nvnx::Hash64 ProofResponse::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ProofResponse::get_type_name() const {\n\treturn \"mmx.ProofResponse\";\n}\n\nconst vnx::TypeCode* ProofResponse::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ProofResponse;\n}\n\nstd::shared_ptr<ProofResponse> ProofResponse::create() {\n\treturn std::make_shared<ProofResponse>();\n}\n\nstd::shared_ptr<vnx::Value> ProofResponse::clone() const {\n\treturn std::make_shared<ProofResponse>(*this);\n}\n\nvoid ProofResponse::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid ProofResponse::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid ProofResponse::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ProofResponse;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, hash);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, vdf_height);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, proof);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, farmer_sig);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, content_hash);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, farmer_addr);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, harvester);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, lookup_time_ms);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ProofResponse::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.ProofResponse\\\"\";\n\t_out << \", \\\"hash\\\": \"; vnx::write(_out, hash);\n\t_out << \", \\\"vdf_height\\\": \"; vnx::write(_out, vdf_height);\n\t_out << \", \\\"proof\\\": \"; vnx::write(_out, proof);\n\t_out << \", \\\"farmer_sig\\\": \"; vnx::write(_out, farmer_sig);\n\t_out << \", \\\"content_hash\\\": \"; vnx::write(_out, content_hash);\n\t_out << \", \\\"farmer_addr\\\": \"; vnx::write(_out, farmer_addr);\n\t_out << \", \\\"harvester\\\": \"; vnx::write(_out, harvester);\n\t_out << \", \\\"lookup_time_ms\\\": \"; vnx::write(_out, lookup_time_ms);\n\t_out << \"}\";\n}\n\nvoid ProofResponse::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ProofResponse::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ProofResponse\";\n\t_object[\"hash\"] = hash;\n\t_object[\"vdf_height\"] = vdf_height;\n\t_object[\"proof\"] = proof;\n\t_object[\"farmer_sig\"] = farmer_sig;\n\t_object[\"content_hash\"] = content_hash;\n\t_object[\"farmer_addr\"] = farmer_addr;\n\t_object[\"harvester\"] = harvester;\n\t_object[\"lookup_time_ms\"] = lookup_time_ms;\n\treturn _object;\n}\n\nvoid ProofResponse::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"content_hash\") {\n\t\t\t_entry.second.to(content_hash);\n\t\t} else if(_entry.first == \"farmer_addr\") {\n\t\t\t_entry.second.to(farmer_addr);\n\t\t} else if(_entry.first == \"farmer_sig\") {\n\t\t\t_entry.second.to(farmer_sig);\n\t\t} else if(_entry.first == \"harvester\") {\n\t\t\t_entry.second.to(harvester);\n\t\t} else if(_entry.first == \"hash\") {\n\t\t\t_entry.second.to(hash);\n\t\t} else if(_entry.first == \"lookup_time_ms\") {\n\t\t\t_entry.second.to(lookup_time_ms);\n\t\t} else if(_entry.first == \"proof\") {\n\t\t\t_entry.second.to(proof);\n\t\t} else if(_entry.first == \"vdf_height\") {\n\t\t\t_entry.second.to(vdf_height);\n\t\t}\n\t}\n}\n\nvnx::Variant ProofResponse::get_field(const std::string& _name) const {\n\tif(_name == \"hash\") {\n\t\treturn vnx::Variant(hash);\n\t}\n\tif(_name == \"vdf_height\") {\n\t\treturn vnx::Variant(vdf_height);\n\t}\n\tif(_name == \"proof\") {\n\t\treturn vnx::Variant(proof);\n\t}\n\tif(_name == \"farmer_sig\") {\n\t\treturn vnx::Variant(farmer_sig);\n\t}\n\tif(_name == \"content_hash\") {\n\t\treturn vnx::Variant(content_hash);\n\t}\n\tif(_name == \"farmer_addr\") {\n\t\treturn vnx::Variant(farmer_addr);\n\t}\n\tif(_name == \"harvester\") {\n\t\treturn vnx::Variant(harvester);\n\t}\n\tif(_name == \"lookup_time_ms\") {\n\t\treturn vnx::Variant(lookup_time_ms);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ProofResponse::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"hash\") {\n\t\t_value.to(hash);\n\t} else if(_name == \"vdf_height\") {\n\t\t_value.to(vdf_height);\n\t} else if(_name == \"proof\") {\n\t\t_value.to(proof);\n\t} else if(_name == \"farmer_sig\") {\n\t\t_value.to(farmer_sig);\n\t} else if(_name == \"content_hash\") {\n\t\t_value.to(content_hash);\n\t} else if(_name == \"farmer_addr\") {\n\t\t_value.to(farmer_addr);\n\t} else if(_name == \"harvester\") {\n\t\t_value.to(harvester);\n\t} else if(_name == \"lookup_time_ms\") {\n\t\t_value.to(lookup_time_ms);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ProofResponse& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ProofResponse& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ProofResponse::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ProofResponse::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ProofResponse\";\n\ttype_code->type_hash = vnx::Hash64(0x816e898b36befae0ull);\n\ttype_code->code_hash = vnx::Hash64(0xa92d883d47260f22ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::ProofResponse);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<ProofResponse>(); };\n\ttype_code->fields.resize(8);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"proof\";\n\t\tfield.code = {16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_sig\";\n\t\tfield.code = {11, 64, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"content_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_addr\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"harvester\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"lookup_time_ms\";\n\t\tfield.code = {8};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> ProofResponse::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ProofResponse& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.lookup_time_ms, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.hash, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.proof, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.farmer_sig, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.content_hash, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.farmer_addr, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.harvester, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ProofResponse& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ProofResponse;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ProofResponse>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(12);\n\tvnx::write_value(_buf + 0, value.vdf_height);\n\tvnx::write_value(_buf + 4, value.lookup_time_ms);\n\tvnx::write(out, value.hash, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.proof, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.farmer_sig, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.content_hash, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.farmer_addr, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.harvester, type_code, type_code->fields[6].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::ProofResponse& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ProofResponse& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ProofResponse& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ProofServerAsyncClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ProofServerAsyncClient.hxx>\n#include <mmx/ProofServer_compute.hxx>\n#include <mmx/ProofServer_compute_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/table_entry_t.hxx>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nProofServerAsyncClient::ProofServerAsyncClient(const std::string& service_name)\n\t:\tAsyncClient::AsyncClient(vnx::Hash64(service_name))\n{\n}\n\nProofServerAsyncClient::ProofServerAsyncClient(vnx::Hash64 service_addr)\n\t:\tAsyncClient::AsyncClient(service_addr)\n{\n}\n\nuint64_t ProofServerAsyncClient::compute(const std::vector<uint32_t>& X_values, const ::mmx::hash_t& id, const int32_t& ksize, const int32_t& xbits, const std::function<void(const std::vector<::mmx::table_entry_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::ProofServer_compute::create();\n\t_method->X_values = X_values;\n\t_method->id = id;\n\t_method->ksize = ksize;\n\t_method->xbits = xbits;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 0;\n\t\tvnx_queue_compute[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t ProofServerAsyncClient::vnx_get_config_object(const std::function<void(const ::vnx::Object&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 1;\n\t\tvnx_queue_vnx_get_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t ProofServerAsyncClient::vnx_get_config(const std::string& name, const std::function<void(const ::vnx::Variant&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 2;\n\t\tvnx_queue_vnx_get_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t ProofServerAsyncClient::vnx_set_config_object(const ::vnx::Object& config, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 3;\n\t\tvnx_queue_vnx_set_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t ProofServerAsyncClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 4;\n\t\tvnx_queue_vnx_set_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t ProofServerAsyncClient::vnx_get_type_code(const std::function<void(const ::vnx::TypeCode&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 5;\n\t\tvnx_queue_vnx_get_type_code[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t ProofServerAsyncClient::vnx_get_module_info(const std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 6;\n\t\tvnx_queue_vnx_get_module_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t ProofServerAsyncClient::vnx_restart(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 7;\n\t\tvnx_queue_vnx_restart[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t ProofServerAsyncClient::vnx_stop(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 8;\n\t\tvnx_queue_vnx_stop[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t ProofServerAsyncClient::vnx_self_test(const std::function<void(const vnx::bool_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 9;\n\t\tvnx_queue_vnx_self_test[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nint32_t ProofServerAsyncClient::vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\treturn -1;\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_compute.find(_request_id);\n\t\t\tif(_iter != vnx_queue_compute.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_compute.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_restart.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_stop.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_self_test.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn _index;\n}\n\nint32_t ProofServerAsyncClient::vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\tthrow std::runtime_error(\"ProofServerAsyncClient: received unknown return\");\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_compute.find(_request_id);\n\t\t\tif(_iter == vnx_queue_compute.end()) {\n\t\t\t\tthrow std::runtime_error(\"ProofServerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_compute.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::ProofServer_compute_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::table_entry_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"ProofServerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"ProofServerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Object>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"ProofServerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"ProofServerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Variant>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"ProofServerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"ProofServerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"ProofServerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tthrow std::runtime_error(\"ProofServerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::TypeCode>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"ProofServerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"ProofServerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"ProofServerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_restart.end()) {\n\t\t\t\tthrow std::runtime_error(\"ProofServerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_stop.end()) {\n\t\t\t\tthrow std::runtime_error(\"ProofServerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_self_test.end()) {\n\t\t\t\tthrow std::runtime_error(\"ProofServerAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::bool_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"ProofServerAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif(_index >= 0) {\n\t\t\t\tthrow std::logic_error(\"ProofServerAsyncClient: invalid callback index\");\n\t\t\t}\n\t}\n\treturn _index;\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/ProofServerBase.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ProofServerBase.hxx>\n#include <vnx/NoSuchMethod.hxx>\n#include <mmx/ProofServer_compute.hxx>\n#include <mmx/ProofServer_compute_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/table_entry_t.hxx>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ProofServerBase::VNX_TYPE_HASH(0xa531590f144986a6ull);\nconst vnx::Hash64 ProofServerBase::VNX_CODE_HASH(0xa1d320beaac9efc5ull);\n\nProofServerBase::ProofServerBase(const std::string& _vnx_name)\n\t:\tModule::Module(_vnx_name)\n{\n\tvnx::read_config(vnx_name + \".num_threads\", num_threads);\n}\n\nvnx::Hash64 ProofServerBase::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ProofServerBase::get_type_name() const {\n\treturn \"mmx.ProofServer\";\n}\n\nconst vnx::TypeCode* ProofServerBase::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ProofServerBase;\n}\n\nvoid ProofServerBase::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ProofServerBase;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, num_threads);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ProofServerBase::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"num_threads\\\": \"; vnx::write(_out, num_threads);\n\t_out << \"}\";\n}\n\nvoid ProofServerBase::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ProofServerBase::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ProofServer\";\n\t_object[\"num_threads\"] = num_threads;\n\treturn _object;\n}\n\nvoid ProofServerBase::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"num_threads\") {\n\t\t\t_entry.second.to(num_threads);\n\t\t}\n\t}\n}\n\nvnx::Variant ProofServerBase::get_field(const std::string& _name) const {\n\tif(_name == \"num_threads\") {\n\t\treturn vnx::Variant(num_threads);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ProofServerBase::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"num_threads\") {\n\t\t_value.to(num_threads);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ProofServerBase& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ProofServerBase& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ProofServerBase::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ProofServerBase::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ProofServer\";\n\ttype_code->type_hash = vnx::Hash64(0xa531590f144986a6ull);\n\ttype_code->code_hash = vnx::Hash64(0xa1d320beaac9efc5ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::ProofServerBase);\n\ttype_code->methods.resize(10);\n\ttype_code->methods[0] = ::mmx::ProofServer_compute::static_get_type_code();\n\ttype_code->methods[1] = ::vnx::ModuleInterface_vnx_get_config::static_get_type_code();\n\ttype_code->methods[2] = ::vnx::ModuleInterface_vnx_get_config_object::static_get_type_code();\n\ttype_code->methods[3] = ::vnx::ModuleInterface_vnx_get_module_info::static_get_type_code();\n\ttype_code->methods[4] = ::vnx::ModuleInterface_vnx_get_type_code::static_get_type_code();\n\ttype_code->methods[5] = ::vnx::ModuleInterface_vnx_restart::static_get_type_code();\n\ttype_code->methods[6] = ::vnx::ModuleInterface_vnx_self_test::static_get_type_code();\n\ttype_code->methods[7] = ::vnx::ModuleInterface_vnx_set_config::static_get_type_code();\n\ttype_code->methods[8] = ::vnx::ModuleInterface_vnx_set_config_object::static_get_type_code();\n\ttype_code->methods[9] = ::vnx::ModuleInterface_vnx_stop::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_threads\";\n\t\tfield.value = vnx::to_string(32);\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nvoid ProofServerBase::vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) {\n\tconst auto* _type_code = _value->get_type_code();\n\twhile(_type_code) {\n\t\tswitch(_type_code->type_hash) {\n\t\t\tdefault:\n\t\t\t\t_type_code = _type_code->super;\n\t\t}\n\t}\n\thandle(std::static_pointer_cast<const vnx::Value>(_value));\n}\n\nstd::shared_ptr<vnx::Value> ProofServerBase::vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) {\n\tswitch(_method->get_type_hash()) {\n\t\tcase 0x1565fa29d1604750ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::ProofServer_compute>(_method);\n\t\t\tcompute_async(_args->X_values, _args->id, _args->ksize, _args->xbits, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t\tcase 0xbbc7f1a01044d294ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config(_args->name);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x17f58f68bf83abc0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_object_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config_object();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf6d82bdf66d034a1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_module_info_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_module_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x305ec4d628960e5dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_type_code_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_type_code();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9e95dc280cecca1bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_restart>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_restart_return::create();\n\t\t\tvnx_restart();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6ce3775b41a42697ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_self_test_return::create();\n\t\t\t_return_value->_ret_0 = vnx_self_test();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x362aac91373958b7ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_return::create();\n\t\t\tvnx_set_config(_args->name, _args->value);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xca30f814f17f322full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_object_return::create();\n\t\t\tvnx_set_config_object(_args->config);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x7ab49ce3d1bfc0d2ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_stop>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_stop_return::create();\n\t\t\tvnx_stop();\n\t\t\treturn _return_value;\n\t\t}\n\t}\n\tauto _ex = vnx::NoSuchMethod::create();\n\t_ex->method = _method->get_type_name();\n\treturn _ex;\n}\n\nvoid ProofServerBase::compute_async_return(const vnx::request_id_t& _request_id, const std::vector<::mmx::table_entry_t>& _ret_0) const {\n\tauto _return_value = ::mmx::ProofServer_compute_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ProofServerBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_threads, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ProofServerBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ProofServerBase;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ProofServerBase>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.num_threads);\n}\n\nvoid read(std::istream& in, ::mmx::ProofServerBase& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ProofServerBase& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ProofServerBase& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ProofServerClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ProofServerClient.hxx>\n#include <mmx/ProofServer_compute.hxx>\n#include <mmx/ProofServer_compute_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/table_entry_t.hxx>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nProofServerClient::ProofServerClient(const std::string& service_name)\n\t:\tClient::Client(vnx::Hash64(service_name))\n{\n}\n\nProofServerClient::ProofServerClient(vnx::Hash64 service_addr)\n\t:\tClient::Client(service_addr)\n{\n}\n\nstd::vector<::mmx::table_entry_t> ProofServerClient::compute(const std::vector<uint32_t>& X_values, const ::mmx::hash_t& id, const int32_t& ksize, const int32_t& xbits) {\n\tauto _method = ::mmx::ProofServer_compute::create();\n\t_method->X_values = X_values;\n\t_method->id = id;\n\t_method->ksize = ksize;\n\t_method->xbits = xbits;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::ProofServer_compute_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::table_entry_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"ProofServerClient: invalid return value\");\n\t}\n}\n\n::vnx::Object ProofServerClient::vnx_get_config_object() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Object>();\n\t} else {\n\t\tthrow std::logic_error(\"ProofServerClient: invalid return value\");\n\t}\n}\n\n::vnx::Variant ProofServerClient::vnx_get_config(const std::string& name) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Variant>();\n\t} else {\n\t\tthrow std::logic_error(\"ProofServerClient: invalid return value\");\n\t}\n}\n\nvoid ProofServerClient::vnx_set_config_object(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, false);\n}\n\nvoid ProofServerClient::vnx_set_config_object_async(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, true);\n}\n\nvoid ProofServerClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, false);\n}\n\nvoid ProofServerClient::vnx_set_config_async(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, true);\n}\n\n::vnx::TypeCode ProofServerClient::vnx_get_type_code() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::TypeCode>();\n\t} else {\n\t\tthrow std::logic_error(\"ProofServerClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::ModuleInfo> ProofServerClient::vnx_get_module_info() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"ProofServerClient: invalid return value\");\n\t}\n}\n\nvoid ProofServerClient::vnx_restart() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, false);\n}\n\nvoid ProofServerClient::vnx_restart_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, true);\n}\n\nvoid ProofServerClient::vnx_stop() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, false);\n}\n\nvoid ProofServerClient::vnx_stop_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, true);\n}\n\nvnx::bool_t ProofServerClient::vnx_self_test() {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::bool_t>();\n\t} else {\n\t\tthrow std::logic_error(\"ProofServerClient: invalid return value\");\n\t}\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/ProofServer_compute.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ProofServer_compute.hxx>\n#include <mmx/ProofServer_compute_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ProofServer_compute::VNX_TYPE_HASH(0x1565fa29d1604750ull);\nconst vnx::Hash64 ProofServer_compute::VNX_CODE_HASH(0x6b0c2ecdc3bfbf8full);\n\nvnx::Hash64 ProofServer_compute::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ProofServer_compute::get_type_name() const {\n\treturn \"mmx.ProofServer.compute\";\n}\n\nconst vnx::TypeCode* ProofServer_compute::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ProofServer_compute;\n}\n\nstd::shared_ptr<ProofServer_compute> ProofServer_compute::create() {\n\treturn std::make_shared<ProofServer_compute>();\n}\n\nstd::shared_ptr<vnx::Value> ProofServer_compute::clone() const {\n\treturn std::make_shared<ProofServer_compute>(*this);\n}\n\nvoid ProofServer_compute::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid ProofServer_compute::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid ProofServer_compute::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ProofServer_compute;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, X_values);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, id);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, ksize);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, xbits);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ProofServer_compute::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.ProofServer.compute\\\"\";\n\t_out << \", \\\"X_values\\\": \"; vnx::write(_out, X_values);\n\t_out << \", \\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \", \\\"ksize\\\": \"; vnx::write(_out, ksize);\n\t_out << \", \\\"xbits\\\": \"; vnx::write(_out, xbits);\n\t_out << \"}\";\n}\n\nvoid ProofServer_compute::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ProofServer_compute::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ProofServer.compute\";\n\t_object[\"X_values\"] = X_values;\n\t_object[\"id\"] = id;\n\t_object[\"ksize\"] = ksize;\n\t_object[\"xbits\"] = xbits;\n\treturn _object;\n}\n\nvoid ProofServer_compute::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"X_values\") {\n\t\t\t_entry.second.to(X_values);\n\t\t} else if(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t} else if(_entry.first == \"ksize\") {\n\t\t\t_entry.second.to(ksize);\n\t\t} else if(_entry.first == \"xbits\") {\n\t\t\t_entry.second.to(xbits);\n\t\t}\n\t}\n}\n\nvnx::Variant ProofServer_compute::get_field(const std::string& _name) const {\n\tif(_name == \"X_values\") {\n\t\treturn vnx::Variant(X_values);\n\t}\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\tif(_name == \"ksize\") {\n\t\treturn vnx::Variant(ksize);\n\t}\n\tif(_name == \"xbits\") {\n\t\treturn vnx::Variant(xbits);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ProofServer_compute::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"X_values\") {\n\t\t_value.to(X_values);\n\t} else if(_name == \"id\") {\n\t\t_value.to(id);\n\t} else if(_name == \"ksize\") {\n\t\t_value.to(ksize);\n\t} else if(_name == \"xbits\") {\n\t\t_value.to(xbits);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ProofServer_compute& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ProofServer_compute& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ProofServer_compute::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ProofServer_compute::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ProofServer.compute\";\n\ttype_code->type_hash = vnx::Hash64(0x1565fa29d1604750ull);\n\ttype_code->code_hash = vnx::Hash64(0x6b0c2ecdc3bfbf8full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::ProofServer_compute);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<ProofServer_compute>(); };\n\ttype_code->is_const = true;\n\ttype_code->is_async = true;\n\ttype_code->return_type = ::mmx::ProofServer_compute_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"X_values\";\n\t\tfield.code = {12, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"ksize\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"xbits\";\n\t\tfield.code = {7};\n\t}\n\ttype_code->permission = \"mmx.permission_e.REMOTE\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ProofServer_compute& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.ksize, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.xbits, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.X_values, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.id, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ProofServer_compute& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ProofServer_compute;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ProofServer_compute>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.ksize);\n\tvnx::write_value(_buf + 4, value.xbits);\n\tvnx::write(out, value.X_values, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.id, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::ProofServer_compute& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ProofServer_compute& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ProofServer_compute& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ProofServer_compute_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ProofServer_compute_return.hxx>\n#include <mmx/table_entry_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ProofServer_compute_return::VNX_TYPE_HASH(0x5b42e049360ce028ull);\nconst vnx::Hash64 ProofServer_compute_return::VNX_CODE_HASH(0x14cf73a9abf3b403ull);\n\nvnx::Hash64 ProofServer_compute_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ProofServer_compute_return::get_type_name() const {\n\treturn \"mmx.ProofServer.compute.return\";\n}\n\nconst vnx::TypeCode* ProofServer_compute_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ProofServer_compute_return;\n}\n\nstd::shared_ptr<ProofServer_compute_return> ProofServer_compute_return::create() {\n\treturn std::make_shared<ProofServer_compute_return>();\n}\n\nstd::shared_ptr<vnx::Value> ProofServer_compute_return::clone() const {\n\treturn std::make_shared<ProofServer_compute_return>(*this);\n}\n\nvoid ProofServer_compute_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid ProofServer_compute_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid ProofServer_compute_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ProofServer_compute_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ProofServer_compute_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.ProofServer.compute.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid ProofServer_compute_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ProofServer_compute_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ProofServer.compute.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid ProofServer_compute_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant ProofServer_compute_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ProofServer_compute_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ProofServer_compute_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ProofServer_compute_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ProofServer_compute_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ProofServer_compute_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ProofServer.compute.return\";\n\ttype_code->type_hash = vnx::Hash64(0x5b42e049360ce028ull);\n\ttype_code->code_hash = vnx::Hash64(0x14cf73a9abf3b403ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::ProofServer_compute_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<ProofServer_compute_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::table_entry_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ProofServer_compute_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ProofServer_compute_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ProofServer_compute_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ProofServer_compute_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::ProofServer_compute_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ProofServer_compute_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ProofServer_compute_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ReceiveNote.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ReceiveNote.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ReceiveNote::VNX_TYPE_HASH(0x30439468cf29fa4bull);\nconst vnx::Hash64 ReceiveNote::VNX_CODE_HASH(0x4ae70215dd9d27cfull);\n\nvnx::Hash64 ReceiveNote::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ReceiveNote::get_type_name() const {\n\treturn \"mmx.ReceiveNote\";\n}\n\nconst vnx::TypeCode* ReceiveNote::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ReceiveNote;\n}\n\nstd::shared_ptr<ReceiveNote> ReceiveNote::create() {\n\treturn std::make_shared<ReceiveNote>();\n}\n\nstd::shared_ptr<vnx::Value> ReceiveNote::clone() const {\n\treturn std::make_shared<ReceiveNote>(*this);\n}\n\nvoid ReceiveNote::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid ReceiveNote::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid ReceiveNote::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ReceiveNote;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, time);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, hash);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ReceiveNote::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.ReceiveNote\\\"\";\n\t_out << \", \\\"time\\\": \"; vnx::write(_out, time);\n\t_out << \", \\\"hash\\\": \"; vnx::write(_out, hash);\n\t_out << \"}\";\n}\n\nvoid ReceiveNote::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ReceiveNote::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ReceiveNote\";\n\t_object[\"time\"] = time;\n\t_object[\"hash\"] = hash;\n\treturn _object;\n}\n\nvoid ReceiveNote::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"hash\") {\n\t\t\t_entry.second.to(hash);\n\t\t} else if(_entry.first == \"time\") {\n\t\t\t_entry.second.to(time);\n\t\t}\n\t}\n}\n\nvnx::Variant ReceiveNote::get_field(const std::string& _name) const {\n\tif(_name == \"time\") {\n\t\treturn vnx::Variant(time);\n\t}\n\tif(_name == \"hash\") {\n\t\treturn vnx::Variant(hash);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ReceiveNote::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"time\") {\n\t\t_value.to(time);\n\t} else if(_name == \"hash\") {\n\t\t_value.to(hash);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ReceiveNote& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ReceiveNote& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ReceiveNote::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ReceiveNote::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ReceiveNote\";\n\ttype_code->type_hash = vnx::Hash64(0x30439468cf29fa4bull);\n\ttype_code->code_hash = vnx::Hash64(0x4ae70215dd9d27cfull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::ReceiveNote);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<ReceiveNote>(); };\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> ReceiveNote::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ReceiveNote& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ReceiveNote& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ReceiveNote;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ReceiveNote>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.time);\n\tvnx::write(out, value.hash, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::ReceiveNote& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ReceiveNote& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ReceiveNote& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Request.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Request.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Request::VNX_TYPE_HASH(0x110ce6958669f66bull);\nconst vnx::Hash64 Request::VNX_CODE_HASH(0xded028a5ef7d79e5ull);\n\nvnx::Hash64 Request::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Request::get_type_name() const {\n\treturn \"mmx.Request\";\n}\n\nconst vnx::TypeCode* Request::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Request;\n}\n\nstd::shared_ptr<Request> Request::create() {\n\treturn std::make_shared<Request>();\n}\n\nstd::shared_ptr<vnx::Value> Request::clone() const {\n\treturn std::make_shared<Request>(*this);\n}\n\nvoid Request::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Request::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Request::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Request;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, id);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, method);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Request::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Request\\\"\";\n\t_out << \", \\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \", \\\"method\\\": \"; vnx::write(_out, method);\n\t_out << \"}\";\n}\n\nvoid Request::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Request::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Request\";\n\t_object[\"id\"] = id;\n\t_object[\"method\"] = method;\n\treturn _object;\n}\n\nvoid Request::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t} else if(_entry.first == \"method\") {\n\t\t\t_entry.second.to(method);\n\t\t}\n\t}\n}\n\nvnx::Variant Request::get_field(const std::string& _name) const {\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\tif(_name == \"method\") {\n\t\treturn vnx::Variant(method);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Request::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"id\") {\n\t\t_value.to(id);\n\t} else if(_name == \"method\") {\n\t\t_value.to(method);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Request& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Request& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Request::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Request::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Request\";\n\ttype_code->type_hash = vnx::Hash64(0x110ce6958669f66bull);\n\ttype_code->code_hash = vnx::Hash64(0xded028a5ef7d79e5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::Request);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Request>(); };\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"id\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"method\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Request::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Request& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.id, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.method, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Request& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Request;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Request>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.id);\n\tvnx::write(out, value.method, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Request& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Request& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Request& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Return::VNX_TYPE_HASH(0xb479dce669278664ull);\nconst vnx::Hash64 Return::VNX_CODE_HASH(0xfa5ff041fedec1dcull);\n\nvnx::Hash64 Return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Return::get_type_name() const {\n\treturn \"mmx.Return\";\n}\n\nconst vnx::TypeCode* Return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Return;\n}\n\nstd::shared_ptr<Return> Return::create() {\n\treturn std::make_shared<Return>();\n}\n\nstd::shared_ptr<vnx::Value> Return::clone() const {\n\treturn std::make_shared<Return>(*this);\n}\n\nvoid Return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, id);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, result);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Return\\\"\";\n\t_out << \", \\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \", \\\"result\\\": \"; vnx::write(_out, result);\n\t_out << \"}\";\n}\n\nvoid Return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Return\";\n\t_object[\"id\"] = id;\n\t_object[\"result\"] = result;\n\treturn _object;\n}\n\nvoid Return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t} else if(_entry.first == \"result\") {\n\t\t\t_entry.second.to(result);\n\t\t}\n\t}\n}\n\nvnx::Variant Return::get_field(const std::string& _name) const {\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\tif(_name == \"result\") {\n\t\treturn vnx::Variant(result);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"id\") {\n\t\t_value.to(id);\n\t} else if(_name == \"result\") {\n\t\t_value.to(result);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Return\";\n\ttype_code->type_hash = vnx::Hash64(0xb479dce669278664ull);\n\ttype_code->code_hash = vnx::Hash64(0xfa5ff041fedec1dcull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::Return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Return>(); };\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"id\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"result\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Return::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.id, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.result, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.id);\n\tvnx::write(out, value.result, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/RouterAsyncClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/RouterAsyncClient.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/PeerInfo.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Router_discover.hxx>\n#include <mmx/Router_discover_return.hxx>\n#include <mmx/Router_fetch_block.hxx>\n#include <mmx/Router_fetch_block_return.hxx>\n#include <mmx/Router_fetch_block_at.hxx>\n#include <mmx/Router_fetch_block_at_return.hxx>\n#include <mmx/Router_get_blocks_at.hxx>\n#include <mmx/Router_get_blocks_at_return.hxx>\n#include <mmx/Router_get_connected_peers.hxx>\n#include <mmx/Router_get_connected_peers_return.hxx>\n#include <mmx/Router_get_id.hxx>\n#include <mmx/Router_get_id_return.hxx>\n#include <mmx/Router_get_info.hxx>\n#include <mmx/Router_get_info_return.hxx>\n#include <mmx/Router_get_known_peers.hxx>\n#include <mmx/Router_get_known_peers_return.hxx>\n#include <mmx/Router_get_peer_info.hxx>\n#include <mmx/Router_get_peer_info_return.hxx>\n#include <mmx/Router_get_peers.hxx>\n#include <mmx/Router_get_peers_return.hxx>\n#include <mmx/Router_kick_peer.hxx>\n#include <mmx/Router_kick_peer_return.hxx>\n#include <mmx/Router_sign_msg.hxx>\n#include <mmx/Router_sign_msg_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/node_info_t.hxx>\n#include <mmx/node_type_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n#include <vnx/addons/MsgServer.h>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nRouterAsyncClient::RouterAsyncClient(const std::string& service_name)\n\t:\tAsyncClient::AsyncClient(vnx::Hash64(service_name))\n{\n}\n\nRouterAsyncClient::RouterAsyncClient(vnx::Hash64 service_addr)\n\t:\tAsyncClient::AsyncClient(service_addr)\n{\n}\n\nuint64_t RouterAsyncClient::discover(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_discover::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 0;\n\t\tvnx_queue_discover[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::get_id(const std::function<void(const ::mmx::hash_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_get_id::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 1;\n\t\tvnx_queue_get_id[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::get_info(const std::function<void(const ::mmx::node_info_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_get_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 2;\n\t\tvnx_queue_get_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::sign_msg(const ::mmx::hash_t& msg, const std::function<void(const std::pair<::mmx::pubkey_t, ::mmx::signature_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_sign_msg::create();\n\t_method->msg = msg;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 3;\n\t\tvnx_queue_sign_msg[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::get_peers(const uint32_t& max_count, const std::function<void(const std::vector<std::string>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_get_peers::create();\n\t_method->max_count = max_count;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 4;\n\t\tvnx_queue_get_peers[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::get_known_peers(const std::function<void(const std::vector<std::string>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_get_known_peers::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 5;\n\t\tvnx_queue_get_known_peers[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::get_connected_peers(const std::function<void(const std::vector<std::string>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_get_connected_peers::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 6;\n\t\tvnx_queue_get_connected_peers[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::get_peer_info(const std::function<void(std::shared_ptr<const ::mmx::PeerInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_get_peer_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 7;\n\t\tvnx_queue_get_peer_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::kick_peer(const std::string& address, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_kick_peer::create();\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 8;\n\t\tvnx_queue_kick_peer[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::get_blocks_at(const uint32_t& height, const std::function<void(const std::vector<std::shared_ptr<const ::mmx::Block>>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_get_blocks_at::create();\n\t_method->height = height;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 9;\n\t\tvnx_queue_get_blocks_at[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::fetch_block(const ::mmx::hash_t& hash, const vnx::optional<std::string>& address, const std::function<void(std::shared_ptr<const ::mmx::Block>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_fetch_block::create();\n\t_method->hash = hash;\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 10;\n\t\tvnx_queue_fetch_block[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::fetch_block_at(const uint32_t& height, const std::string& address, const std::function<void(std::shared_ptr<const ::mmx::Block>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Router_fetch_block_at::create();\n\t_method->height = height;\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 11;\n\t\tvnx_queue_fetch_block_at[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 12;\n\t\tvnx_queue_http_request[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes, const std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request_chunk::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\t_method->offset = offset;\n\t_method->max_bytes = max_bytes;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 13;\n\t\tvnx_queue_http_request_chunk[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::vnx_get_config_object(const std::function<void(const ::vnx::Object&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 14;\n\t\tvnx_queue_vnx_get_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::vnx_get_config(const std::string& name, const std::function<void(const ::vnx::Variant&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 15;\n\t\tvnx_queue_vnx_get_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::vnx_set_config_object(const ::vnx::Object& config, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 16;\n\t\tvnx_queue_vnx_set_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 17;\n\t\tvnx_queue_vnx_set_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::vnx_get_type_code(const std::function<void(const ::vnx::TypeCode&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 18;\n\t\tvnx_queue_vnx_get_type_code[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::vnx_get_module_info(const std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 19;\n\t\tvnx_queue_vnx_get_module_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::vnx_restart(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 20;\n\t\tvnx_queue_vnx_restart[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::vnx_stop(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 21;\n\t\tvnx_queue_vnx_stop[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t RouterAsyncClient::vnx_self_test(const std::function<void(const vnx::bool_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 22;\n\t\tvnx_queue_vnx_self_test[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nint32_t RouterAsyncClient::vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\treturn -1;\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_discover.find(_request_id);\n\t\t\tif(_iter != vnx_queue_discover.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_discover.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_get_id.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_id.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_id.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_get_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_sign_msg.find(_request_id);\n\t\t\tif(_iter != vnx_queue_sign_msg.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_sign_msg.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_get_peers.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_peers.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_peers.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_get_known_peers.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_known_peers.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_known_peers.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_get_connected_peers.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_connected_peers.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_connected_peers.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_get_peer_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_peer_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_peer_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_kick_peer.find(_request_id);\n\t\t\tif(_iter != vnx_queue_kick_peer.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_kick_peer.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_get_blocks_at.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_blocks_at.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_blocks_at.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_fetch_block.find(_request_id);\n\t\t\tif(_iter != vnx_queue_fetch_block.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_fetch_block.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_fetch_block_at.find(_request_id);\n\t\t\tif(_iter != vnx_queue_fetch_block_at.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_fetch_block_at.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 12: {\n\t\t\tconst auto _iter = vnx_queue_http_request.find(_request_id);\n\t\t\tif(_iter != vnx_queue_http_request.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_http_request.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 13: {\n\t\t\tconst auto _iter = vnx_queue_http_request_chunk.find(_request_id);\n\t\t\tif(_iter != vnx_queue_http_request_chunk.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_http_request_chunk.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 14: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 15: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 16: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 17: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 18: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 19: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 20: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_restart.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 21: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_stop.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 22: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_self_test.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn _index;\n}\n\nint32_t RouterAsyncClient::vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\tthrow std::runtime_error(\"RouterAsyncClient: received unknown return\");\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_discover.find(_request_id);\n\t\t\tif(_iter == vnx_queue_discover.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_discover.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_get_id.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_id.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_id.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_id_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::hash_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_get_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::node_info_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_sign_msg.find(_request_id);\n\t\t\tif(_iter == vnx_queue_sign_msg.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_sign_msg.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_sign_msg_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::pair<::mmx::pubkey_t, ::mmx::signature_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_get_peers.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_peers.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_peers.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_peers_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<std::string>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_get_known_peers.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_known_peers.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_known_peers.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_known_peers_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<std::string>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_get_connected_peers.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_connected_peers.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_connected_peers.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_connected_peers_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<std::string>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_get_peer_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_peer_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_peer_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_peer_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::PeerInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_kick_peer.find(_request_id);\n\t\t\tif(_iter == vnx_queue_kick_peer.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_kick_peer.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_get_blocks_at.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_blocks_at.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_blocks_at.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_blocks_at_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<std::shared_ptr<const ::mmx::Block>>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_fetch_block.find(_request_id);\n\t\t\tif(_iter == vnx_queue_fetch_block.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_fetch_block.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_fetch_block_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Block>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_fetch_block_at.find(_request_id);\n\t\t\tif(_iter == vnx_queue_fetch_block_at.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_fetch_block_at.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_fetch_block_at_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Block>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 12: {\n\t\t\tconst auto _iter = vnx_queue_http_request.find(_request_id);\n\t\t\tif(_iter == vnx_queue_http_request.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_http_request.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpResponse>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 13: {\n\t\t\tconst auto _iter = vnx_queue_http_request_chunk.find(_request_id);\n\t\t\tif(_iter == vnx_queue_http_request_chunk.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_http_request_chunk.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpData>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 14: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Object>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 15: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Variant>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 16: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 17: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 18: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::TypeCode>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 19: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 20: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_restart.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 21: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_stop.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 22: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_self_test.end()) {\n\t\t\t\tthrow std::runtime_error(\"RouterAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::bool_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif(_index >= 0) {\n\t\t\t\tthrow std::logic_error(\"RouterAsyncClient: invalid callback index\");\n\t\t\t}\n\t}\n\treturn _index;\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/RouterBase.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/RouterBase.hxx>\n#include <vnx/NoSuchMethod.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/PeerInfo.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Router_discover.hxx>\n#include <mmx/Router_discover_return.hxx>\n#include <mmx/Router_fetch_block.hxx>\n#include <mmx/Router_fetch_block_return.hxx>\n#include <mmx/Router_fetch_block_at.hxx>\n#include <mmx/Router_fetch_block_at_return.hxx>\n#include <mmx/Router_get_blocks_at.hxx>\n#include <mmx/Router_get_blocks_at_return.hxx>\n#include <mmx/Router_get_connected_peers.hxx>\n#include <mmx/Router_get_connected_peers_return.hxx>\n#include <mmx/Router_get_id.hxx>\n#include <mmx/Router_get_id_return.hxx>\n#include <mmx/Router_get_info.hxx>\n#include <mmx/Router_get_info_return.hxx>\n#include <mmx/Router_get_known_peers.hxx>\n#include <mmx/Router_get_known_peers_return.hxx>\n#include <mmx/Router_get_peer_info.hxx>\n#include <mmx/Router_get_peer_info_return.hxx>\n#include <mmx/Router_get_peers.hxx>\n#include <mmx/Router_get_peers_return.hxx>\n#include <mmx/Router_kick_peer.hxx>\n#include <mmx/Router_kick_peer_return.hxx>\n#include <mmx/Router_sign_msg.hxx>\n#include <mmx/Router_sign_msg_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/node_info_t.hxx>\n#include <mmx/node_type_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n#include <vnx/addons/MsgServer.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 RouterBase::VNX_TYPE_HASH(0x952c4ef2956f31c4ull);\nconst vnx::Hash64 RouterBase::VNX_CODE_HASH(0x3e3476f20c4870c1ull);\n\nRouterBase::RouterBase(const std::string& _vnx_name)\n\t:\tMsgServer::MsgServer(_vnx_name)\n{\n\tvnx::read_config(vnx_name + \".input_verified_vdfs\", input_verified_vdfs);\n\tvnx::read_config(vnx_name + \".input_verified_votes\", input_verified_votes);\n\tvnx::read_config(vnx_name + \".input_verified_proof\", input_verified_proof);\n\tvnx::read_config(vnx_name + \".input_verified_blocks\", input_verified_blocks);\n\tvnx::read_config(vnx_name + \".input_verified_transactions\", input_verified_transactions);\n\tvnx::read_config(vnx_name + \".input_transactions\", input_transactions);\n\tvnx::read_config(vnx_name + \".input_vdf_points\", input_vdf_points);\n\tvnx::read_config(vnx_name + \".input_vdfs\", input_vdfs);\n\tvnx::read_config(vnx_name + \".output_vdfs\", output_vdfs);\n\tvnx::read_config(vnx_name + \".output_votes\", output_votes);\n\tvnx::read_config(vnx_name + \".output_proof\", output_proof);\n\tvnx::read_config(vnx_name + \".output_blocks\", output_blocks);\n\tvnx::read_config(vnx_name + \".output_transactions\", output_transactions);\n\tvnx::read_config(vnx_name + \".output_vdf_points\", output_vdf_points);\n\tvnx::read_config(vnx_name + \".max_queue_ms\", max_queue_ms);\n\tvnx::read_config(vnx_name + \".send_interval_ms\", send_interval_ms);\n\tvnx::read_config(vnx_name + \".query_interval_ms\", query_interval_ms);\n\tvnx::read_config(vnx_name + \".update_interval_ms\", update_interval_ms);\n\tvnx::read_config(vnx_name + \".connect_interval_ms\", connect_interval_ms);\n\tvnx::read_config(vnx_name + \".fetch_timeout_ms\", fetch_timeout_ms);\n\tvnx::read_config(vnx_name + \".relay_target_ms\", relay_target_ms);\n\tvnx::read_config(vnx_name + \".sync_loss_delay\", sync_loss_delay);\n\tvnx::read_config(vnx_name + \".discover_interval\", discover_interval);\n\tvnx::read_config(vnx_name + \".disconnect_interval\", disconnect_interval);\n\tvnx::read_config(vnx_name + \".peer_retry_interval\", peer_retry_interval);\n\tvnx::read_config(vnx_name + \".num_peers_out\", num_peers_out);\n\tvnx::read_config(vnx_name + \".min_sync_peers\", min_sync_peers);\n\tvnx::read_config(vnx_name + \".max_peer_set\", max_peer_set);\n\tvnx::read_config(vnx_name + \".max_sent_cache\", max_sent_cache);\n\tvnx::read_config(vnx_name + \".max_hash_cache\", max_hash_cache);\n\tvnx::read_config(vnx_name + \".max_vdf_segments\", max_vdf_segments);\n\tvnx::read_config(vnx_name + \".node_version\", node_version);\n\tvnx::read_config(vnx_name + \".mode\", mode);\n\tvnx::read_config(vnx_name + \".do_relay\", do_relay);\n\tvnx::read_config(vnx_name + \".open_port\", open_port);\n\tvnx::read_config(vnx_name + \".max_tx_upload\", max_tx_upload);\n\tvnx::read_config(vnx_name + \".max_pending_cost\", max_pending_cost);\n\tvnx::read_config(vnx_name + \".priority_queue_size\", priority_queue_size);\n\tvnx::read_config(vnx_name + \".seed_peers\", seed_peers);\n\tvnx::read_config(vnx_name + \".fixed_peers\", fixed_peers);\n\tvnx::read_config(vnx_name + \".block_peers\", block_peers);\n\tvnx::read_config(vnx_name + \".master_nodes\", master_nodes);\n\tvnx::read_config(vnx_name + \".storage_path\", storage_path);\n\tvnx::read_config(vnx_name + \".node_server\", node_server);\n}\n\nvnx::Hash64 RouterBase::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string RouterBase::get_type_name() const {\n\treturn \"mmx.Router\";\n}\n\nconst vnx::TypeCode* RouterBase::get_type_code() const {\n\treturn mmx::vnx_native_type_code_RouterBase;\n}\n\nvoid RouterBase::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_RouterBase;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, port);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, host);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, max_connections);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, listen_queue_size);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, stats_interval_ms);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, connection_timeout_ms);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, send_buffer_size);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, receive_buffer_size);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, tcp_no_delay);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, tcp_keepalive);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, show_warnings);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, compress_level);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, max_msg_size);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, max_write_queue);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, input_verified_vdfs);\n\t_visitor.type_field(_type_code->fields[15], 15); vnx::accept(_visitor, input_verified_votes);\n\t_visitor.type_field(_type_code->fields[16], 16); vnx::accept(_visitor, input_verified_proof);\n\t_visitor.type_field(_type_code->fields[17], 17); vnx::accept(_visitor, input_verified_blocks);\n\t_visitor.type_field(_type_code->fields[18], 18); vnx::accept(_visitor, input_verified_transactions);\n\t_visitor.type_field(_type_code->fields[19], 19); vnx::accept(_visitor, input_transactions);\n\t_visitor.type_field(_type_code->fields[20], 20); vnx::accept(_visitor, input_vdf_points);\n\t_visitor.type_field(_type_code->fields[21], 21); vnx::accept(_visitor, input_vdfs);\n\t_visitor.type_field(_type_code->fields[22], 22); vnx::accept(_visitor, output_vdfs);\n\t_visitor.type_field(_type_code->fields[23], 23); vnx::accept(_visitor, output_votes);\n\t_visitor.type_field(_type_code->fields[24], 24); vnx::accept(_visitor, output_proof);\n\t_visitor.type_field(_type_code->fields[25], 25); vnx::accept(_visitor, output_blocks);\n\t_visitor.type_field(_type_code->fields[26], 26); vnx::accept(_visitor, output_transactions);\n\t_visitor.type_field(_type_code->fields[27], 27); vnx::accept(_visitor, output_vdf_points);\n\t_visitor.type_field(_type_code->fields[28], 28); vnx::accept(_visitor, max_queue_ms);\n\t_visitor.type_field(_type_code->fields[29], 29); vnx::accept(_visitor, send_interval_ms);\n\t_visitor.type_field(_type_code->fields[30], 30); vnx::accept(_visitor, query_interval_ms);\n\t_visitor.type_field(_type_code->fields[31], 31); vnx::accept(_visitor, update_interval_ms);\n\t_visitor.type_field(_type_code->fields[32], 32); vnx::accept(_visitor, connect_interval_ms);\n\t_visitor.type_field(_type_code->fields[33], 33); vnx::accept(_visitor, fetch_timeout_ms);\n\t_visitor.type_field(_type_code->fields[34], 34); vnx::accept(_visitor, relay_target_ms);\n\t_visitor.type_field(_type_code->fields[35], 35); vnx::accept(_visitor, sync_loss_delay);\n\t_visitor.type_field(_type_code->fields[36], 36); vnx::accept(_visitor, discover_interval);\n\t_visitor.type_field(_type_code->fields[37], 37); vnx::accept(_visitor, disconnect_interval);\n\t_visitor.type_field(_type_code->fields[38], 38); vnx::accept(_visitor, peer_retry_interval);\n\t_visitor.type_field(_type_code->fields[39], 39); vnx::accept(_visitor, num_peers_out);\n\t_visitor.type_field(_type_code->fields[40], 40); vnx::accept(_visitor, min_sync_peers);\n\t_visitor.type_field(_type_code->fields[41], 41); vnx::accept(_visitor, max_peer_set);\n\t_visitor.type_field(_type_code->fields[42], 42); vnx::accept(_visitor, max_sent_cache);\n\t_visitor.type_field(_type_code->fields[43], 43); vnx::accept(_visitor, max_hash_cache);\n\t_visitor.type_field(_type_code->fields[44], 44); vnx::accept(_visitor, max_vdf_segments);\n\t_visitor.type_field(_type_code->fields[45], 45); vnx::accept(_visitor, node_version);\n\t_visitor.type_field(_type_code->fields[46], 46); vnx::accept(_visitor, mode);\n\t_visitor.type_field(_type_code->fields[47], 47); vnx::accept(_visitor, do_relay);\n\t_visitor.type_field(_type_code->fields[48], 48); vnx::accept(_visitor, open_port);\n\t_visitor.type_field(_type_code->fields[49], 49); vnx::accept(_visitor, max_tx_upload);\n\t_visitor.type_field(_type_code->fields[50], 50); vnx::accept(_visitor, max_pending_cost);\n\t_visitor.type_field(_type_code->fields[51], 51); vnx::accept(_visitor, priority_queue_size);\n\t_visitor.type_field(_type_code->fields[52], 52); vnx::accept(_visitor, seed_peers);\n\t_visitor.type_field(_type_code->fields[53], 53); vnx::accept(_visitor, fixed_peers);\n\t_visitor.type_field(_type_code->fields[54], 54); vnx::accept(_visitor, block_peers);\n\t_visitor.type_field(_type_code->fields[55], 55); vnx::accept(_visitor, master_nodes);\n\t_visitor.type_field(_type_code->fields[56], 56); vnx::accept(_visitor, storage_path);\n\t_visitor.type_field(_type_code->fields[57], 57); vnx::accept(_visitor, node_server);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid RouterBase::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"port\\\": \"; vnx::write(_out, port);\n\t_out << \", \\\"host\\\": \"; vnx::write(_out, host);\n\t_out << \", \\\"max_connections\\\": \"; vnx::write(_out, max_connections);\n\t_out << \", \\\"listen_queue_size\\\": \"; vnx::write(_out, listen_queue_size);\n\t_out << \", \\\"stats_interval_ms\\\": \"; vnx::write(_out, stats_interval_ms);\n\t_out << \", \\\"connection_timeout_ms\\\": \"; vnx::write(_out, connection_timeout_ms);\n\t_out << \", \\\"send_buffer_size\\\": \"; vnx::write(_out, send_buffer_size);\n\t_out << \", \\\"receive_buffer_size\\\": \"; vnx::write(_out, receive_buffer_size);\n\t_out << \", \\\"tcp_no_delay\\\": \"; vnx::write(_out, tcp_no_delay);\n\t_out << \", \\\"tcp_keepalive\\\": \"; vnx::write(_out, tcp_keepalive);\n\t_out << \", \\\"show_warnings\\\": \"; vnx::write(_out, show_warnings);\n\t_out << \", \\\"compress_level\\\": \"; vnx::write(_out, compress_level);\n\t_out << \", \\\"max_msg_size\\\": \"; vnx::write(_out, max_msg_size);\n\t_out << \", \\\"max_write_queue\\\": \"; vnx::write(_out, max_write_queue);\n\t_out << \", \\\"input_verified_vdfs\\\": \"; vnx::write(_out, input_verified_vdfs);\n\t_out << \", \\\"input_verified_votes\\\": \"; vnx::write(_out, input_verified_votes);\n\t_out << \", \\\"input_verified_proof\\\": \"; vnx::write(_out, input_verified_proof);\n\t_out << \", \\\"input_verified_blocks\\\": \"; vnx::write(_out, input_verified_blocks);\n\t_out << \", \\\"input_verified_transactions\\\": \"; vnx::write(_out, input_verified_transactions);\n\t_out << \", \\\"input_transactions\\\": \"; vnx::write(_out, input_transactions);\n\t_out << \", \\\"input_vdf_points\\\": \"; vnx::write(_out, input_vdf_points);\n\t_out << \", \\\"input_vdfs\\\": \"; vnx::write(_out, input_vdfs);\n\t_out << \", \\\"output_vdfs\\\": \"; vnx::write(_out, output_vdfs);\n\t_out << \", \\\"output_votes\\\": \"; vnx::write(_out, output_votes);\n\t_out << \", \\\"output_proof\\\": \"; vnx::write(_out, output_proof);\n\t_out << \", \\\"output_blocks\\\": \"; vnx::write(_out, output_blocks);\n\t_out << \", \\\"output_transactions\\\": \"; vnx::write(_out, output_transactions);\n\t_out << \", \\\"output_vdf_points\\\": \"; vnx::write(_out, output_vdf_points);\n\t_out << \", \\\"max_queue_ms\\\": \"; vnx::write(_out, max_queue_ms);\n\t_out << \", \\\"send_interval_ms\\\": \"; vnx::write(_out, send_interval_ms);\n\t_out << \", \\\"query_interval_ms\\\": \"; vnx::write(_out, query_interval_ms);\n\t_out << \", \\\"update_interval_ms\\\": \"; vnx::write(_out, update_interval_ms);\n\t_out << \", \\\"connect_interval_ms\\\": \"; vnx::write(_out, connect_interval_ms);\n\t_out << \", \\\"fetch_timeout_ms\\\": \"; vnx::write(_out, fetch_timeout_ms);\n\t_out << \", \\\"relay_target_ms\\\": \"; vnx::write(_out, relay_target_ms);\n\t_out << \", \\\"sync_loss_delay\\\": \"; vnx::write(_out, sync_loss_delay);\n\t_out << \", \\\"discover_interval\\\": \"; vnx::write(_out, discover_interval);\n\t_out << \", \\\"disconnect_interval\\\": \"; vnx::write(_out, disconnect_interval);\n\t_out << \", \\\"peer_retry_interval\\\": \"; vnx::write(_out, peer_retry_interval);\n\t_out << \", \\\"num_peers_out\\\": \"; vnx::write(_out, num_peers_out);\n\t_out << \", \\\"min_sync_peers\\\": \"; vnx::write(_out, min_sync_peers);\n\t_out << \", \\\"max_peer_set\\\": \"; vnx::write(_out, max_peer_set);\n\t_out << \", \\\"max_sent_cache\\\": \"; vnx::write(_out, max_sent_cache);\n\t_out << \", \\\"max_hash_cache\\\": \"; vnx::write(_out, max_hash_cache);\n\t_out << \", \\\"max_vdf_segments\\\": \"; vnx::write(_out, max_vdf_segments);\n\t_out << \", \\\"node_version\\\": \"; vnx::write(_out, node_version);\n\t_out << \", \\\"mode\\\": \"; vnx::write(_out, mode);\n\t_out << \", \\\"do_relay\\\": \"; vnx::write(_out, do_relay);\n\t_out << \", \\\"open_port\\\": \"; vnx::write(_out, open_port);\n\t_out << \", \\\"max_tx_upload\\\": \"; vnx::write(_out, max_tx_upload);\n\t_out << \", \\\"max_pending_cost\\\": \"; vnx::write(_out, max_pending_cost);\n\t_out << \", \\\"priority_queue_size\\\": \"; vnx::write(_out, priority_queue_size);\n\t_out << \", \\\"seed_peers\\\": \"; vnx::write(_out, seed_peers);\n\t_out << \", \\\"fixed_peers\\\": \"; vnx::write(_out, fixed_peers);\n\t_out << \", \\\"block_peers\\\": \"; vnx::write(_out, block_peers);\n\t_out << \", \\\"master_nodes\\\": \"; vnx::write(_out, master_nodes);\n\t_out << \", \\\"storage_path\\\": \"; vnx::write(_out, storage_path);\n\t_out << \", \\\"node_server\\\": \"; vnx::write(_out, node_server);\n\t_out << \"}\";\n}\n\nvoid RouterBase::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object RouterBase::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router\";\n\t_object[\"port\"] = port;\n\t_object[\"host\"] = host;\n\t_object[\"max_connections\"] = max_connections;\n\t_object[\"listen_queue_size\"] = listen_queue_size;\n\t_object[\"stats_interval_ms\"] = stats_interval_ms;\n\t_object[\"connection_timeout_ms\"] = connection_timeout_ms;\n\t_object[\"send_buffer_size\"] = send_buffer_size;\n\t_object[\"receive_buffer_size\"] = receive_buffer_size;\n\t_object[\"tcp_no_delay\"] = tcp_no_delay;\n\t_object[\"tcp_keepalive\"] = tcp_keepalive;\n\t_object[\"show_warnings\"] = show_warnings;\n\t_object[\"compress_level\"] = compress_level;\n\t_object[\"max_msg_size\"] = max_msg_size;\n\t_object[\"max_write_queue\"] = max_write_queue;\n\t_object[\"input_verified_vdfs\"] = input_verified_vdfs;\n\t_object[\"input_verified_votes\"] = input_verified_votes;\n\t_object[\"input_verified_proof\"] = input_verified_proof;\n\t_object[\"input_verified_blocks\"] = input_verified_blocks;\n\t_object[\"input_verified_transactions\"] = input_verified_transactions;\n\t_object[\"input_transactions\"] = input_transactions;\n\t_object[\"input_vdf_points\"] = input_vdf_points;\n\t_object[\"input_vdfs\"] = input_vdfs;\n\t_object[\"output_vdfs\"] = output_vdfs;\n\t_object[\"output_votes\"] = output_votes;\n\t_object[\"output_proof\"] = output_proof;\n\t_object[\"output_blocks\"] = output_blocks;\n\t_object[\"output_transactions\"] = output_transactions;\n\t_object[\"output_vdf_points\"] = output_vdf_points;\n\t_object[\"max_queue_ms\"] = max_queue_ms;\n\t_object[\"send_interval_ms\"] = send_interval_ms;\n\t_object[\"query_interval_ms\"] = query_interval_ms;\n\t_object[\"update_interval_ms\"] = update_interval_ms;\n\t_object[\"connect_interval_ms\"] = connect_interval_ms;\n\t_object[\"fetch_timeout_ms\"] = fetch_timeout_ms;\n\t_object[\"relay_target_ms\"] = relay_target_ms;\n\t_object[\"sync_loss_delay\"] = sync_loss_delay;\n\t_object[\"discover_interval\"] = discover_interval;\n\t_object[\"disconnect_interval\"] = disconnect_interval;\n\t_object[\"peer_retry_interval\"] = peer_retry_interval;\n\t_object[\"num_peers_out\"] = num_peers_out;\n\t_object[\"min_sync_peers\"] = min_sync_peers;\n\t_object[\"max_peer_set\"] = max_peer_set;\n\t_object[\"max_sent_cache\"] = max_sent_cache;\n\t_object[\"max_hash_cache\"] = max_hash_cache;\n\t_object[\"max_vdf_segments\"] = max_vdf_segments;\n\t_object[\"node_version\"] = node_version;\n\t_object[\"mode\"] = mode;\n\t_object[\"do_relay\"] = do_relay;\n\t_object[\"open_port\"] = open_port;\n\t_object[\"max_tx_upload\"] = max_tx_upload;\n\t_object[\"max_pending_cost\"] = max_pending_cost;\n\t_object[\"priority_queue_size\"] = priority_queue_size;\n\t_object[\"seed_peers\"] = seed_peers;\n\t_object[\"fixed_peers\"] = fixed_peers;\n\t_object[\"block_peers\"] = block_peers;\n\t_object[\"master_nodes\"] = master_nodes;\n\t_object[\"storage_path\"] = storage_path;\n\t_object[\"node_server\"] = node_server;\n\treturn _object;\n}\n\nvoid RouterBase::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"block_peers\") {\n\t\t\t_entry.second.to(block_peers);\n\t\t} else if(_entry.first == \"compress_level\") {\n\t\t\t_entry.second.to(compress_level);\n\t\t} else if(_entry.first == \"connect_interval_ms\") {\n\t\t\t_entry.second.to(connect_interval_ms);\n\t\t} else if(_entry.first == \"connection_timeout_ms\") {\n\t\t\t_entry.second.to(connection_timeout_ms);\n\t\t} else if(_entry.first == \"disconnect_interval\") {\n\t\t\t_entry.second.to(disconnect_interval);\n\t\t} else if(_entry.first == \"discover_interval\") {\n\t\t\t_entry.second.to(discover_interval);\n\t\t} else if(_entry.first == \"do_relay\") {\n\t\t\t_entry.second.to(do_relay);\n\t\t} else if(_entry.first == \"fetch_timeout_ms\") {\n\t\t\t_entry.second.to(fetch_timeout_ms);\n\t\t} else if(_entry.first == \"fixed_peers\") {\n\t\t\t_entry.second.to(fixed_peers);\n\t\t} else if(_entry.first == \"host\") {\n\t\t\t_entry.second.to(host);\n\t\t} else if(_entry.first == \"input_transactions\") {\n\t\t\t_entry.second.to(input_transactions);\n\t\t} else if(_entry.first == \"input_vdf_points\") {\n\t\t\t_entry.second.to(input_vdf_points);\n\t\t} else if(_entry.first == \"input_vdfs\") {\n\t\t\t_entry.second.to(input_vdfs);\n\t\t} else if(_entry.first == \"input_verified_blocks\") {\n\t\t\t_entry.second.to(input_verified_blocks);\n\t\t} else if(_entry.first == \"input_verified_proof\") {\n\t\t\t_entry.second.to(input_verified_proof);\n\t\t} else if(_entry.first == \"input_verified_transactions\") {\n\t\t\t_entry.second.to(input_verified_transactions);\n\t\t} else if(_entry.first == \"input_verified_vdfs\") {\n\t\t\t_entry.second.to(input_verified_vdfs);\n\t\t} else if(_entry.first == \"input_verified_votes\") {\n\t\t\t_entry.second.to(input_verified_votes);\n\t\t} else if(_entry.first == \"listen_queue_size\") {\n\t\t\t_entry.second.to(listen_queue_size);\n\t\t} else if(_entry.first == \"master_nodes\") {\n\t\t\t_entry.second.to(master_nodes);\n\t\t} else if(_entry.first == \"max_connections\") {\n\t\t\t_entry.second.to(max_connections);\n\t\t} else if(_entry.first == \"max_hash_cache\") {\n\t\t\t_entry.second.to(max_hash_cache);\n\t\t} else if(_entry.first == \"max_msg_size\") {\n\t\t\t_entry.second.to(max_msg_size);\n\t\t} else if(_entry.first == \"max_peer_set\") {\n\t\t\t_entry.second.to(max_peer_set);\n\t\t} else if(_entry.first == \"max_pending_cost\") {\n\t\t\t_entry.second.to(max_pending_cost);\n\t\t} else if(_entry.first == \"max_queue_ms\") {\n\t\t\t_entry.second.to(max_queue_ms);\n\t\t} else if(_entry.first == \"max_sent_cache\") {\n\t\t\t_entry.second.to(max_sent_cache);\n\t\t} else if(_entry.first == \"max_tx_upload\") {\n\t\t\t_entry.second.to(max_tx_upload);\n\t\t} else if(_entry.first == \"max_vdf_segments\") {\n\t\t\t_entry.second.to(max_vdf_segments);\n\t\t} else if(_entry.first == \"max_write_queue\") {\n\t\t\t_entry.second.to(max_write_queue);\n\t\t} else if(_entry.first == \"min_sync_peers\") {\n\t\t\t_entry.second.to(min_sync_peers);\n\t\t} else if(_entry.first == \"mode\") {\n\t\t\t_entry.second.to(mode);\n\t\t} else if(_entry.first == \"node_server\") {\n\t\t\t_entry.second.to(node_server);\n\t\t} else if(_entry.first == \"node_version\") {\n\t\t\t_entry.second.to(node_version);\n\t\t} else if(_entry.first == \"num_peers_out\") {\n\t\t\t_entry.second.to(num_peers_out);\n\t\t} else if(_entry.first == \"open_port\") {\n\t\t\t_entry.second.to(open_port);\n\t\t} else if(_entry.first == \"output_blocks\") {\n\t\t\t_entry.second.to(output_blocks);\n\t\t} else if(_entry.first == \"output_proof\") {\n\t\t\t_entry.second.to(output_proof);\n\t\t} else if(_entry.first == \"output_transactions\") {\n\t\t\t_entry.second.to(output_transactions);\n\t\t} else if(_entry.first == \"output_vdf_points\") {\n\t\t\t_entry.second.to(output_vdf_points);\n\t\t} else if(_entry.first == \"output_vdfs\") {\n\t\t\t_entry.second.to(output_vdfs);\n\t\t} else if(_entry.first == \"output_votes\") {\n\t\t\t_entry.second.to(output_votes);\n\t\t} else if(_entry.first == \"peer_retry_interval\") {\n\t\t\t_entry.second.to(peer_retry_interval);\n\t\t} else if(_entry.first == \"port\") {\n\t\t\t_entry.second.to(port);\n\t\t} else if(_entry.first == \"priority_queue_size\") {\n\t\t\t_entry.second.to(priority_queue_size);\n\t\t} else if(_entry.first == \"query_interval_ms\") {\n\t\t\t_entry.second.to(query_interval_ms);\n\t\t} else if(_entry.first == \"receive_buffer_size\") {\n\t\t\t_entry.second.to(receive_buffer_size);\n\t\t} else if(_entry.first == \"relay_target_ms\") {\n\t\t\t_entry.second.to(relay_target_ms);\n\t\t} else if(_entry.first == \"seed_peers\") {\n\t\t\t_entry.second.to(seed_peers);\n\t\t} else if(_entry.first == \"send_buffer_size\") {\n\t\t\t_entry.second.to(send_buffer_size);\n\t\t} else if(_entry.first == \"send_interval_ms\") {\n\t\t\t_entry.second.to(send_interval_ms);\n\t\t} else if(_entry.first == \"show_warnings\") {\n\t\t\t_entry.second.to(show_warnings);\n\t\t} else if(_entry.first == \"stats_interval_ms\") {\n\t\t\t_entry.second.to(stats_interval_ms);\n\t\t} else if(_entry.first == \"storage_path\") {\n\t\t\t_entry.second.to(storage_path);\n\t\t} else if(_entry.first == \"sync_loss_delay\") {\n\t\t\t_entry.second.to(sync_loss_delay);\n\t\t} else if(_entry.first == \"tcp_keepalive\") {\n\t\t\t_entry.second.to(tcp_keepalive);\n\t\t} else if(_entry.first == \"tcp_no_delay\") {\n\t\t\t_entry.second.to(tcp_no_delay);\n\t\t} else if(_entry.first == \"update_interval_ms\") {\n\t\t\t_entry.second.to(update_interval_ms);\n\t\t}\n\t}\n}\n\nvnx::Variant RouterBase::get_field(const std::string& _name) const {\n\tif(_name == \"port\") {\n\t\treturn vnx::Variant(port);\n\t}\n\tif(_name == \"host\") {\n\t\treturn vnx::Variant(host);\n\t}\n\tif(_name == \"max_connections\") {\n\t\treturn vnx::Variant(max_connections);\n\t}\n\tif(_name == \"listen_queue_size\") {\n\t\treturn vnx::Variant(listen_queue_size);\n\t}\n\tif(_name == \"stats_interval_ms\") {\n\t\treturn vnx::Variant(stats_interval_ms);\n\t}\n\tif(_name == \"connection_timeout_ms\") {\n\t\treturn vnx::Variant(connection_timeout_ms);\n\t}\n\tif(_name == \"send_buffer_size\") {\n\t\treturn vnx::Variant(send_buffer_size);\n\t}\n\tif(_name == \"receive_buffer_size\") {\n\t\treturn vnx::Variant(receive_buffer_size);\n\t}\n\tif(_name == \"tcp_no_delay\") {\n\t\treturn vnx::Variant(tcp_no_delay);\n\t}\n\tif(_name == \"tcp_keepalive\") {\n\t\treturn vnx::Variant(tcp_keepalive);\n\t}\n\tif(_name == \"show_warnings\") {\n\t\treturn vnx::Variant(show_warnings);\n\t}\n\tif(_name == \"compress_level\") {\n\t\treturn vnx::Variant(compress_level);\n\t}\n\tif(_name == \"max_msg_size\") {\n\t\treturn vnx::Variant(max_msg_size);\n\t}\n\tif(_name == \"max_write_queue\") {\n\t\treturn vnx::Variant(max_write_queue);\n\t}\n\tif(_name == \"input_verified_vdfs\") {\n\t\treturn vnx::Variant(input_verified_vdfs);\n\t}\n\tif(_name == \"input_verified_votes\") {\n\t\treturn vnx::Variant(input_verified_votes);\n\t}\n\tif(_name == \"input_verified_proof\") {\n\t\treturn vnx::Variant(input_verified_proof);\n\t}\n\tif(_name == \"input_verified_blocks\") {\n\t\treturn vnx::Variant(input_verified_blocks);\n\t}\n\tif(_name == \"input_verified_transactions\") {\n\t\treturn vnx::Variant(input_verified_transactions);\n\t}\n\tif(_name == \"input_transactions\") {\n\t\treturn vnx::Variant(input_transactions);\n\t}\n\tif(_name == \"input_vdf_points\") {\n\t\treturn vnx::Variant(input_vdf_points);\n\t}\n\tif(_name == \"input_vdfs\") {\n\t\treturn vnx::Variant(input_vdfs);\n\t}\n\tif(_name == \"output_vdfs\") {\n\t\treturn vnx::Variant(output_vdfs);\n\t}\n\tif(_name == \"output_votes\") {\n\t\treturn vnx::Variant(output_votes);\n\t}\n\tif(_name == \"output_proof\") {\n\t\treturn vnx::Variant(output_proof);\n\t}\n\tif(_name == \"output_blocks\") {\n\t\treturn vnx::Variant(output_blocks);\n\t}\n\tif(_name == \"output_transactions\") {\n\t\treturn vnx::Variant(output_transactions);\n\t}\n\tif(_name == \"output_vdf_points\") {\n\t\treturn vnx::Variant(output_vdf_points);\n\t}\n\tif(_name == \"max_queue_ms\") {\n\t\treturn vnx::Variant(max_queue_ms);\n\t}\n\tif(_name == \"send_interval_ms\") {\n\t\treturn vnx::Variant(send_interval_ms);\n\t}\n\tif(_name == \"query_interval_ms\") {\n\t\treturn vnx::Variant(query_interval_ms);\n\t}\n\tif(_name == \"update_interval_ms\") {\n\t\treturn vnx::Variant(update_interval_ms);\n\t}\n\tif(_name == \"connect_interval_ms\") {\n\t\treturn vnx::Variant(connect_interval_ms);\n\t}\n\tif(_name == \"fetch_timeout_ms\") {\n\t\treturn vnx::Variant(fetch_timeout_ms);\n\t}\n\tif(_name == \"relay_target_ms\") {\n\t\treturn vnx::Variant(relay_target_ms);\n\t}\n\tif(_name == \"sync_loss_delay\") {\n\t\treturn vnx::Variant(sync_loss_delay);\n\t}\n\tif(_name == \"discover_interval\") {\n\t\treturn vnx::Variant(discover_interval);\n\t}\n\tif(_name == \"disconnect_interval\") {\n\t\treturn vnx::Variant(disconnect_interval);\n\t}\n\tif(_name == \"peer_retry_interval\") {\n\t\treturn vnx::Variant(peer_retry_interval);\n\t}\n\tif(_name == \"num_peers_out\") {\n\t\treturn vnx::Variant(num_peers_out);\n\t}\n\tif(_name == \"min_sync_peers\") {\n\t\treturn vnx::Variant(min_sync_peers);\n\t}\n\tif(_name == \"max_peer_set\") {\n\t\treturn vnx::Variant(max_peer_set);\n\t}\n\tif(_name == \"max_sent_cache\") {\n\t\treturn vnx::Variant(max_sent_cache);\n\t}\n\tif(_name == \"max_hash_cache\") {\n\t\treturn vnx::Variant(max_hash_cache);\n\t}\n\tif(_name == \"max_vdf_segments\") {\n\t\treturn vnx::Variant(max_vdf_segments);\n\t}\n\tif(_name == \"node_version\") {\n\t\treturn vnx::Variant(node_version);\n\t}\n\tif(_name == \"mode\") {\n\t\treturn vnx::Variant(mode);\n\t}\n\tif(_name == \"do_relay\") {\n\t\treturn vnx::Variant(do_relay);\n\t}\n\tif(_name == \"open_port\") {\n\t\treturn vnx::Variant(open_port);\n\t}\n\tif(_name == \"max_tx_upload\") {\n\t\treturn vnx::Variant(max_tx_upload);\n\t}\n\tif(_name == \"max_pending_cost\") {\n\t\treturn vnx::Variant(max_pending_cost);\n\t}\n\tif(_name == \"priority_queue_size\") {\n\t\treturn vnx::Variant(priority_queue_size);\n\t}\n\tif(_name == \"seed_peers\") {\n\t\treturn vnx::Variant(seed_peers);\n\t}\n\tif(_name == \"fixed_peers\") {\n\t\treturn vnx::Variant(fixed_peers);\n\t}\n\tif(_name == \"block_peers\") {\n\t\treturn vnx::Variant(block_peers);\n\t}\n\tif(_name == \"master_nodes\") {\n\t\treturn vnx::Variant(master_nodes);\n\t}\n\tif(_name == \"storage_path\") {\n\t\treturn vnx::Variant(storage_path);\n\t}\n\tif(_name == \"node_server\") {\n\t\treturn vnx::Variant(node_server);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid RouterBase::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"port\") {\n\t\t_value.to(port);\n\t} else if(_name == \"host\") {\n\t\t_value.to(host);\n\t} else if(_name == \"max_connections\") {\n\t\t_value.to(max_connections);\n\t} else if(_name == \"listen_queue_size\") {\n\t\t_value.to(listen_queue_size);\n\t} else if(_name == \"stats_interval_ms\") {\n\t\t_value.to(stats_interval_ms);\n\t} else if(_name == \"connection_timeout_ms\") {\n\t\t_value.to(connection_timeout_ms);\n\t} else if(_name == \"send_buffer_size\") {\n\t\t_value.to(send_buffer_size);\n\t} else if(_name == \"receive_buffer_size\") {\n\t\t_value.to(receive_buffer_size);\n\t} else if(_name == \"tcp_no_delay\") {\n\t\t_value.to(tcp_no_delay);\n\t} else if(_name == \"tcp_keepalive\") {\n\t\t_value.to(tcp_keepalive);\n\t} else if(_name == \"show_warnings\") {\n\t\t_value.to(show_warnings);\n\t} else if(_name == \"compress_level\") {\n\t\t_value.to(compress_level);\n\t} else if(_name == \"max_msg_size\") {\n\t\t_value.to(max_msg_size);\n\t} else if(_name == \"max_write_queue\") {\n\t\t_value.to(max_write_queue);\n\t} else if(_name == \"input_verified_vdfs\") {\n\t\t_value.to(input_verified_vdfs);\n\t} else if(_name == \"input_verified_votes\") {\n\t\t_value.to(input_verified_votes);\n\t} else if(_name == \"input_verified_proof\") {\n\t\t_value.to(input_verified_proof);\n\t} else if(_name == \"input_verified_blocks\") {\n\t\t_value.to(input_verified_blocks);\n\t} else if(_name == \"input_verified_transactions\") {\n\t\t_value.to(input_verified_transactions);\n\t} else if(_name == \"input_transactions\") {\n\t\t_value.to(input_transactions);\n\t} else if(_name == \"input_vdf_points\") {\n\t\t_value.to(input_vdf_points);\n\t} else if(_name == \"input_vdfs\") {\n\t\t_value.to(input_vdfs);\n\t} else if(_name == \"output_vdfs\") {\n\t\t_value.to(output_vdfs);\n\t} else if(_name == \"output_votes\") {\n\t\t_value.to(output_votes);\n\t} else if(_name == \"output_proof\") {\n\t\t_value.to(output_proof);\n\t} else if(_name == \"output_blocks\") {\n\t\t_value.to(output_blocks);\n\t} else if(_name == \"output_transactions\") {\n\t\t_value.to(output_transactions);\n\t} else if(_name == \"output_vdf_points\") {\n\t\t_value.to(output_vdf_points);\n\t} else if(_name == \"max_queue_ms\") {\n\t\t_value.to(max_queue_ms);\n\t} else if(_name == \"send_interval_ms\") {\n\t\t_value.to(send_interval_ms);\n\t} else if(_name == \"query_interval_ms\") {\n\t\t_value.to(query_interval_ms);\n\t} else if(_name == \"update_interval_ms\") {\n\t\t_value.to(update_interval_ms);\n\t} else if(_name == \"connect_interval_ms\") {\n\t\t_value.to(connect_interval_ms);\n\t} else if(_name == \"fetch_timeout_ms\") {\n\t\t_value.to(fetch_timeout_ms);\n\t} else if(_name == \"relay_target_ms\") {\n\t\t_value.to(relay_target_ms);\n\t} else if(_name == \"sync_loss_delay\") {\n\t\t_value.to(sync_loss_delay);\n\t} else if(_name == \"discover_interval\") {\n\t\t_value.to(discover_interval);\n\t} else if(_name == \"disconnect_interval\") {\n\t\t_value.to(disconnect_interval);\n\t} else if(_name == \"peer_retry_interval\") {\n\t\t_value.to(peer_retry_interval);\n\t} else if(_name == \"num_peers_out\") {\n\t\t_value.to(num_peers_out);\n\t} else if(_name == \"min_sync_peers\") {\n\t\t_value.to(min_sync_peers);\n\t} else if(_name == \"max_peer_set\") {\n\t\t_value.to(max_peer_set);\n\t} else if(_name == \"max_sent_cache\") {\n\t\t_value.to(max_sent_cache);\n\t} else if(_name == \"max_hash_cache\") {\n\t\t_value.to(max_hash_cache);\n\t} else if(_name == \"max_vdf_segments\") {\n\t\t_value.to(max_vdf_segments);\n\t} else if(_name == \"node_version\") {\n\t\t_value.to(node_version);\n\t} else if(_name == \"mode\") {\n\t\t_value.to(mode);\n\t} else if(_name == \"do_relay\") {\n\t\t_value.to(do_relay);\n\t} else if(_name == \"open_port\") {\n\t\t_value.to(open_port);\n\t} else if(_name == \"max_tx_upload\") {\n\t\t_value.to(max_tx_upload);\n\t} else if(_name == \"max_pending_cost\") {\n\t\t_value.to(max_pending_cost);\n\t} else if(_name == \"priority_queue_size\") {\n\t\t_value.to(priority_queue_size);\n\t} else if(_name == \"seed_peers\") {\n\t\t_value.to(seed_peers);\n\t} else if(_name == \"fixed_peers\") {\n\t\t_value.to(fixed_peers);\n\t} else if(_name == \"block_peers\") {\n\t\t_value.to(block_peers);\n\t} else if(_name == \"master_nodes\") {\n\t\t_value.to(master_nodes);\n\t} else if(_name == \"storage_path\") {\n\t\t_value.to(storage_path);\n\t} else if(_name == \"node_server\") {\n\t\t_value.to(node_server);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const RouterBase& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, RouterBase& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* RouterBase::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> RouterBase::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router\";\n\ttype_code->type_hash = vnx::Hash64(0x952c4ef2956f31c4ull);\n\ttype_code->code_hash = vnx::Hash64(0x3e3476f20c4870c1ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::RouterBase);\n\ttype_code->parents.resize(2);\n\ttype_code->parents[0] = ::vnx::addons::MsgServerBase::static_get_type_code();\n\ttype_code->parents[1] = ::vnx::addons::TcpServerBase::static_get_type_code();\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::node_type_e::static_get_type_code();\n\ttype_code->methods.resize(23);\n\ttype_code->methods[0] = ::mmx::Router_discover::static_get_type_code();\n\ttype_code->methods[1] = ::mmx::Router_fetch_block::static_get_type_code();\n\ttype_code->methods[2] = ::mmx::Router_fetch_block_at::static_get_type_code();\n\ttype_code->methods[3] = ::mmx::Router_get_blocks_at::static_get_type_code();\n\ttype_code->methods[4] = ::mmx::Router_get_connected_peers::static_get_type_code();\n\ttype_code->methods[5] = ::mmx::Router_get_id::static_get_type_code();\n\ttype_code->methods[6] = ::mmx::Router_get_info::static_get_type_code();\n\ttype_code->methods[7] = ::mmx::Router_get_known_peers::static_get_type_code();\n\ttype_code->methods[8] = ::mmx::Router_get_peer_info::static_get_type_code();\n\ttype_code->methods[9] = ::mmx::Router_get_peers::static_get_type_code();\n\ttype_code->methods[10] = ::mmx::Router_kick_peer::static_get_type_code();\n\ttype_code->methods[11] = ::mmx::Router_sign_msg::static_get_type_code();\n\ttype_code->methods[12] = ::vnx::ModuleInterface_vnx_get_config::static_get_type_code();\n\ttype_code->methods[13] = ::vnx::ModuleInterface_vnx_get_config_object::static_get_type_code();\n\ttype_code->methods[14] = ::vnx::ModuleInterface_vnx_get_module_info::static_get_type_code();\n\ttype_code->methods[15] = ::vnx::ModuleInterface_vnx_get_type_code::static_get_type_code();\n\ttype_code->methods[16] = ::vnx::ModuleInterface_vnx_restart::static_get_type_code();\n\ttype_code->methods[17] = ::vnx::ModuleInterface_vnx_self_test::static_get_type_code();\n\ttype_code->methods[18] = ::vnx::ModuleInterface_vnx_set_config::static_get_type_code();\n\ttype_code->methods[19] = ::vnx::ModuleInterface_vnx_set_config_object::static_get_type_code();\n\ttype_code->methods[20] = ::vnx::ModuleInterface_vnx_stop::static_get_type_code();\n\ttype_code->methods[21] = ::vnx::addons::HttpComponent_http_request::static_get_type_code();\n\ttype_code->methods[22] = ::vnx::addons::HttpComponent_http_request_chunk::static_get_type_code();\n\ttype_code->fields.resize(58);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"port\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"host\";\n\t\tfield.value = vnx::to_string(\"localhost\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_connections\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"listen_queue_size\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"stats_interval_ms\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"connection_timeout_ms\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"send_buffer_size\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"receive_buffer_size\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"tcp_no_delay\";\n\t\tfield.value = vnx::to_string(false);\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"tcp_keepalive\";\n\t\tfield.value = vnx::to_string(true);\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"show_warnings\";\n\t\tfield.value = vnx::to_string(false);\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"compress_level\";\n\t\tfield.value = vnx::to_string(0);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_msg_size\";\n\t\tfield.value = vnx::to_string(67108864);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"max_write_queue\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_verified_vdfs\";\n\t\tfield.value = vnx::to_string(\"node.verified_vdfs\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[15];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_verified_votes\";\n\t\tfield.value = vnx::to_string(\"node.verified_votes\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[16];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_verified_proof\";\n\t\tfield.value = vnx::to_string(\"node.verified_proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[17];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_verified_blocks\";\n\t\tfield.value = vnx::to_string(\"node.verified_blocks\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[18];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_verified_transactions\";\n\t\tfield.value = vnx::to_string(\"node.verified_transactions\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[19];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_transactions\";\n\t\tfield.value = vnx::to_string(\"node.transactions\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[20];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_vdf_points\";\n\t\tfield.value = vnx::to_string(\"node.vdf_points\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[21];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_vdfs\";\n\t\tfield.value = vnx::to_string(\"timelord.proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[22];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_vdfs\";\n\t\tfield.value = vnx::to_string(\"network.vdfs\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[23];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_votes\";\n\t\tfield.value = vnx::to_string(\"network.votes\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[24];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_proof\";\n\t\tfield.value = vnx::to_string(\"network.proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[25];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_blocks\";\n\t\tfield.value = vnx::to_string(\"network.blocks\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[26];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_transactions\";\n\t\tfield.value = vnx::to_string(\"network.transactions\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[27];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_vdf_points\";\n\t\tfield.value = vnx::to_string(\"network.vdf_points\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[28];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_queue_ms\";\n\t\tfield.value = vnx::to_string(1000);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[29];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"send_interval_ms\";\n\t\tfield.value = vnx::to_string(20);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[30];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"query_interval_ms\";\n\t\tfield.value = vnx::to_string(10000);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[31];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"update_interval_ms\";\n\t\tfield.value = vnx::to_string(1000);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[32];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"connect_interval_ms\";\n\t\tfield.value = vnx::to_string(10000);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[33];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"fetch_timeout_ms\";\n\t\tfield.value = vnx::to_string(10000);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[34];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"relay_target_ms\";\n\t\tfield.value = vnx::to_string(5000);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[35];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"sync_loss_delay\";\n\t\tfield.value = vnx::to_string(60);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[36];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"discover_interval\";\n\t\tfield.value = vnx::to_string(60);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[37];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"disconnect_interval\";\n\t\tfield.value = vnx::to_string(0);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[38];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"peer_retry_interval\";\n\t\tfield.value = vnx::to_string(360);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[39];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_peers_out\";\n\t\tfield.value = vnx::to_string(8);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[40];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"min_sync_peers\";\n\t\tfield.value = vnx::to_string(2);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[41];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_peer_set\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[42];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_sent_cache\";\n\t\tfield.value = vnx::to_string(20000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[43];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_hash_cache\";\n\t\tfield.value = vnx::to_string(100000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[44];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_vdf_segments\";\n\t\tfield.value = vnx::to_string(65536);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[45];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"node_version\";\n\t\tfield.value = vnx::to_string(103);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[46];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"mode\";\n\t\tfield.value = vnx::to_string(\"FULL_NODE\");\n\t\tfield.code = {19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[47];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"do_relay\";\n\t\tfield.value = vnx::to_string(true);\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[48];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"open_port\";\n\t\tfield.value = vnx::to_string(false);\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[49];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"max_tx_upload\";\n\t\tfield.value = vnx::to_string(2);\n\t\tfield.code = {10};\n\t}\n\t{\n\t\tauto& field = type_code->fields[50];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"max_pending_cost\";\n\t\tfield.value = vnx::to_string(0.2);\n\t\tfield.code = {10};\n\t}\n\t{\n\t\tauto& field = type_code->fields[51];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"priority_queue_size\";\n\t\tfield.value = vnx::to_string(262144);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[52];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"seed_peers\";\n\t\tfield.code = {12, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[53];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"fixed_peers\";\n\t\tfield.code = {12, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[54];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"block_peers\";\n\t\tfield.code = {12, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[55];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"master_nodes\";\n\t\tfield.code = {12, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[56];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"storage_path\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[57];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"node_server\";\n\t\tfield.value = vnx::to_string(\"Node\");\n\t\tfield.code = {32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nvoid RouterBase::vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) {\n\tconst auto* _type_code = _value->get_type_code();\n\twhile(_type_code) {\n\t\tswitch(_type_code->type_hash) {\n\t\t\tcase 0x94965d816d328467ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::Block>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0xa84a63942b8e5c6aull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::ProofOfTime>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0x816e898b36befae0ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::ProofResponse>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0xce0462acdceaa5bcull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::Transaction>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0x1671551501b6c956ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::VDF_Point>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0xc056a2ff24cdee25ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::ValidatorVote>(_value));\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\t_type_code = _type_code->super;\n\t\t}\n\t}\n\thandle(std::static_pointer_cast<const vnx::Value>(_value));\n}\n\nstd::shared_ptr<vnx::Value> RouterBase::vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) {\n\tswitch(_method->get_type_hash()) {\n\t\tcase 0xeda51767d96e246cull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_discover>(_method);\n\t\t\tauto _return_value = ::mmx::Router_discover_return::create();\n\t\t\tdiscover();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x7c2f762681e7cc51ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_fetch_block>(_method);\n\t\t\tfetch_block_async(_args->hash, _args->address, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t\tcase 0xa4deba522ed6f8adull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_fetch_block_at>(_method);\n\t\t\tfetch_block_at_async(_args->height, _args->address, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t\tcase 0x1eb0c0d7eae3c33aull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_get_blocks_at>(_method);\n\t\t\tget_blocks_at_async(_args->height, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t\tcase 0x8682feb65fbb77feull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_get_connected_peers>(_method);\n\t\t\tauto _return_value = ::mmx::Router_get_connected_peers_return::create();\n\t\t\t_return_value->_ret_0 = get_connected_peers();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xb9f7168b5ae94cd9ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_get_id>(_method);\n\t\t\tauto _return_value = ::mmx::Router_get_id_return::create();\n\t\t\t_return_value->_ret_0 = get_id();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x364ea887c149a265ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_get_info>(_method);\n\t\t\tauto _return_value = ::mmx::Router_get_info_return::create();\n\t\t\t_return_value->_ret_0 = get_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xaa408b6bf4e8168dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_get_known_peers>(_method);\n\t\t\tauto _return_value = ::mmx::Router_get_known_peers_return::create();\n\t\t\t_return_value->_ret_0 = get_known_peers();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x520a467ef9324cb3ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_get_peer_info>(_method);\n\t\t\tauto _return_value = ::mmx::Router_get_peer_info_return::create();\n\t\t\t_return_value->_ret_0 = get_peer_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x66d68bd91b462049ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_get_peers>(_method);\n\t\t\tauto _return_value = ::mmx::Router_get_peers_return::create();\n\t\t\t_return_value->_ret_0 = get_peers(_args->max_count);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x359a21379021beedull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_kick_peer>(_method);\n\t\t\tauto _return_value = ::mmx::Router_kick_peer_return::create();\n\t\t\tkick_peer(_args->address);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x88ede2fbb99ab63eull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Router_sign_msg>(_method);\n\t\t\tauto _return_value = ::mmx::Router_sign_msg_return::create();\n\t\t\t_return_value->_ret_0 = sign_msg(_args->msg);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xbbc7f1a01044d294ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config(_args->name);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x17f58f68bf83abc0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_object_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config_object();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf6d82bdf66d034a1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_module_info_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_module_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x305ec4d628960e5dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_type_code_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_type_code();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9e95dc280cecca1bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_restart>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_restart_return::create();\n\t\t\tvnx_restart();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6ce3775b41a42697ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_self_test_return::create();\n\t\t\t_return_value->_ret_0 = vnx_self_test();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x362aac91373958b7ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_return::create();\n\t\t\tvnx_set_config(_args->name, _args->value);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xca30f814f17f322full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_object_return::create();\n\t\t\tvnx_set_config_object(_args->config);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x7ab49ce3d1bfc0d2ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_stop>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_stop_return::create();\n\t\t\tvnx_stop();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe0b6c38f619bad92ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::addons::HttpComponent_http_request>(_method);\n\t\t\thttp_request_async(_args->request, _args->sub_path, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t\tcase 0x97e79d08440406d5ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk>(_method);\n\t\t\thttp_request_chunk_async(_args->request, _args->sub_path, _args->offset, _args->max_bytes, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t}\n\tauto _ex = vnx::NoSuchMethod::create();\n\t_ex->method = _method->get_type_name();\n\treturn _ex;\n}\n\nvoid RouterBase::get_blocks_at_async_return(const vnx::request_id_t& _request_id, const std::vector<std::shared_ptr<const ::mmx::Block>>& _ret_0) const {\n\tauto _return_value = ::mmx::Router_get_blocks_at_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\nvoid RouterBase::fetch_block_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::mmx::Block>& _ret_0) const {\n\tauto _return_value = ::mmx::Router_fetch_block_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\nvoid RouterBase::fetch_block_at_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::mmx::Block>& _ret_0) const {\n\tauto _return_value = ::mmx::Router_fetch_block_at_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\nvoid RouterBase::http_request_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpResponse>& _ret_0) const {\n\tauto _return_value = ::vnx::addons::HttpComponent_http_request_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\nvoid RouterBase::http_request_chunk_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpData>& _ret_0) const {\n\tauto _return_value = ::vnx::addons::HttpComponent_http_request_chunk_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::RouterBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.port, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_connections, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.listen_queue_size, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.stats_interval_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.connection_timeout_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.send_buffer_size, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.receive_buffer_size, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.tcp_no_delay, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[9]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.tcp_keepalive, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[10]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.show_warnings, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[11]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.compress_level, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[12]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_msg_size, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[13]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_write_queue, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[28]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_queue_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[29]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.send_interval_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[30]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.query_interval_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[31]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.update_interval_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[32]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.connect_interval_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[33]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.fetch_timeout_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[34]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.relay_target_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[35]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.sync_loss_delay, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[36]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.discover_interval, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[37]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.disconnect_interval, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[38]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.peer_retry_interval, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[39]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_peers_out, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[40]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.min_sync_peers, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[41]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_peer_set, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[42]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_sent_cache, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[43]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_hash_cache, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[44]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_vdf_segments, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[45]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.node_version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[47]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.do_relay, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[48]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.open_port, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[49]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_tx_upload, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[50]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_pending_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[51]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.priority_queue_size, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.host, type_code, _field->code.data()); break;\n\t\t\tcase 14: vnx::read(in, value.input_verified_vdfs, type_code, _field->code.data()); break;\n\t\t\tcase 15: vnx::read(in, value.input_verified_votes, type_code, _field->code.data()); break;\n\t\t\tcase 16: vnx::read(in, value.input_verified_proof, type_code, _field->code.data()); break;\n\t\t\tcase 17: vnx::read(in, value.input_verified_blocks, type_code, _field->code.data()); break;\n\t\t\tcase 18: vnx::read(in, value.input_verified_transactions, type_code, _field->code.data()); break;\n\t\t\tcase 19: vnx::read(in, value.input_transactions, type_code, _field->code.data()); break;\n\t\t\tcase 20: vnx::read(in, value.input_vdf_points, type_code, _field->code.data()); break;\n\t\t\tcase 21: vnx::read(in, value.input_vdfs, type_code, _field->code.data()); break;\n\t\t\tcase 22: vnx::read(in, value.output_vdfs, type_code, _field->code.data()); break;\n\t\t\tcase 23: vnx::read(in, value.output_votes, type_code, _field->code.data()); break;\n\t\t\tcase 24: vnx::read(in, value.output_proof, type_code, _field->code.data()); break;\n\t\t\tcase 25: vnx::read(in, value.output_blocks, type_code, _field->code.data()); break;\n\t\t\tcase 26: vnx::read(in, value.output_transactions, type_code, _field->code.data()); break;\n\t\t\tcase 27: vnx::read(in, value.output_vdf_points, type_code, _field->code.data()); break;\n\t\t\tcase 46: vnx::read(in, value.mode, type_code, _field->code.data()); break;\n\t\t\tcase 52: vnx::read(in, value.seed_peers, type_code, _field->code.data()); break;\n\t\t\tcase 53: vnx::read(in, value.fixed_peers, type_code, _field->code.data()); break;\n\t\t\tcase 54: vnx::read(in, value.block_peers, type_code, _field->code.data()); break;\n\t\t\tcase 55: vnx::read(in, value.master_nodes, type_code, _field->code.data()); break;\n\t\t\tcase 56: vnx::read(in, value.storage_path, type_code, _field->code.data()); break;\n\t\t\tcase 57: vnx::read(in, value.node_server, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::RouterBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_RouterBase;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::RouterBase>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(141);\n\tvnx::write_value(_buf + 0, value.port);\n\tvnx::write_value(_buf + 4, value.max_connections);\n\tvnx::write_value(_buf + 8, value.listen_queue_size);\n\tvnx::write_value(_buf + 12, value.stats_interval_ms);\n\tvnx::write_value(_buf + 16, value.connection_timeout_ms);\n\tvnx::write_value(_buf + 20, value.send_buffer_size);\n\tvnx::write_value(_buf + 24, value.receive_buffer_size);\n\tvnx::write_value(_buf + 28, value.tcp_no_delay);\n\tvnx::write_value(_buf + 29, value.tcp_keepalive);\n\tvnx::write_value(_buf + 30, value.show_warnings);\n\tvnx::write_value(_buf + 31, value.compress_level);\n\tvnx::write_value(_buf + 35, value.max_msg_size);\n\tvnx::write_value(_buf + 39, value.max_write_queue);\n\tvnx::write_value(_buf + 47, value.max_queue_ms);\n\tvnx::write_value(_buf + 51, value.send_interval_ms);\n\tvnx::write_value(_buf + 55, value.query_interval_ms);\n\tvnx::write_value(_buf + 59, value.update_interval_ms);\n\tvnx::write_value(_buf + 63, value.connect_interval_ms);\n\tvnx::write_value(_buf + 67, value.fetch_timeout_ms);\n\tvnx::write_value(_buf + 71, value.relay_target_ms);\n\tvnx::write_value(_buf + 75, value.sync_loss_delay);\n\tvnx::write_value(_buf + 79, value.discover_interval);\n\tvnx::write_value(_buf + 83, value.disconnect_interval);\n\tvnx::write_value(_buf + 87, value.peer_retry_interval);\n\tvnx::write_value(_buf + 91, value.num_peers_out);\n\tvnx::write_value(_buf + 95, value.min_sync_peers);\n\tvnx::write_value(_buf + 99, value.max_peer_set);\n\tvnx::write_value(_buf + 103, value.max_sent_cache);\n\tvnx::write_value(_buf + 107, value.max_hash_cache);\n\tvnx::write_value(_buf + 111, value.max_vdf_segments);\n\tvnx::write_value(_buf + 115, value.node_version);\n\tvnx::write_value(_buf + 119, value.do_relay);\n\tvnx::write_value(_buf + 120, value.open_port);\n\tvnx::write_value(_buf + 121, value.max_tx_upload);\n\tvnx::write_value(_buf + 129, value.max_pending_cost);\n\tvnx::write_value(_buf + 137, value.priority_queue_size);\n\tvnx::write(out, value.host, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.input_verified_vdfs, type_code, type_code->fields[14].code.data());\n\tvnx::write(out, value.input_verified_votes, type_code, type_code->fields[15].code.data());\n\tvnx::write(out, value.input_verified_proof, type_code, type_code->fields[16].code.data());\n\tvnx::write(out, value.input_verified_blocks, type_code, type_code->fields[17].code.data());\n\tvnx::write(out, value.input_verified_transactions, type_code, type_code->fields[18].code.data());\n\tvnx::write(out, value.input_transactions, type_code, type_code->fields[19].code.data());\n\tvnx::write(out, value.input_vdf_points, type_code, type_code->fields[20].code.data());\n\tvnx::write(out, value.input_vdfs, type_code, type_code->fields[21].code.data());\n\tvnx::write(out, value.output_vdfs, type_code, type_code->fields[22].code.data());\n\tvnx::write(out, value.output_votes, type_code, type_code->fields[23].code.data());\n\tvnx::write(out, value.output_proof, type_code, type_code->fields[24].code.data());\n\tvnx::write(out, value.output_blocks, type_code, type_code->fields[25].code.data());\n\tvnx::write(out, value.output_transactions, type_code, type_code->fields[26].code.data());\n\tvnx::write(out, value.output_vdf_points, type_code, type_code->fields[27].code.data());\n\tvnx::write(out, value.mode, type_code, type_code->fields[46].code.data());\n\tvnx::write(out, value.seed_peers, type_code, type_code->fields[52].code.data());\n\tvnx::write(out, value.fixed_peers, type_code, type_code->fields[53].code.data());\n\tvnx::write(out, value.block_peers, type_code, type_code->fields[54].code.data());\n\tvnx::write(out, value.master_nodes, type_code, type_code->fields[55].code.data());\n\tvnx::write(out, value.storage_path, type_code, type_code->fields[56].code.data());\n\tvnx::write(out, value.node_server, type_code, type_code->fields[57].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::RouterBase& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::RouterBase& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::RouterBase& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/RouterClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/RouterClient.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/PeerInfo.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/Router_discover.hxx>\n#include <mmx/Router_discover_return.hxx>\n#include <mmx/Router_fetch_block.hxx>\n#include <mmx/Router_fetch_block_return.hxx>\n#include <mmx/Router_fetch_block_at.hxx>\n#include <mmx/Router_fetch_block_at_return.hxx>\n#include <mmx/Router_get_blocks_at.hxx>\n#include <mmx/Router_get_blocks_at_return.hxx>\n#include <mmx/Router_get_connected_peers.hxx>\n#include <mmx/Router_get_connected_peers_return.hxx>\n#include <mmx/Router_get_id.hxx>\n#include <mmx/Router_get_id_return.hxx>\n#include <mmx/Router_get_info.hxx>\n#include <mmx/Router_get_info_return.hxx>\n#include <mmx/Router_get_known_peers.hxx>\n#include <mmx/Router_get_known_peers_return.hxx>\n#include <mmx/Router_get_peer_info.hxx>\n#include <mmx/Router_get_peer_info_return.hxx>\n#include <mmx/Router_get_peers.hxx>\n#include <mmx/Router_get_peers_return.hxx>\n#include <mmx/Router_kick_peer.hxx>\n#include <mmx/Router_kick_peer_return.hxx>\n#include <mmx/Router_sign_msg.hxx>\n#include <mmx/Router_sign_msg_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/node_info_t.hxx>\n#include <mmx/node_type_e.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n#include <vnx/addons/MsgServer.h>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nRouterClient::RouterClient(const std::string& service_name)\n\t:\tClient::Client(vnx::Hash64(service_name))\n{\n}\n\nRouterClient::RouterClient(vnx::Hash64 service_addr)\n\t:\tClient::Client(service_addr)\n{\n}\n\nvoid RouterClient::discover() {\n\tauto _method = ::mmx::Router_discover::create();\n\tvnx_request(_method, false);\n}\n\nvoid RouterClient::discover_async() {\n\tauto _method = ::mmx::Router_discover::create();\n\tvnx_request(_method, true);\n}\n\n::mmx::hash_t RouterClient::get_id() {\n\tauto _method = ::mmx::Router_get_id::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_id_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::hash_t>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\n::mmx::node_info_t RouterClient::get_info() {\n\tauto _method = ::mmx::Router_get_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::node_info_t>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nstd::pair<::mmx::pubkey_t, ::mmx::signature_t> RouterClient::sign_msg(const ::mmx::hash_t& msg) {\n\tauto _method = ::mmx::Router_sign_msg::create();\n\t_method->msg = msg;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_sign_msg_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::pair<::mmx::pubkey_t, ::mmx::signature_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nstd::vector<std::string> RouterClient::get_peers(const uint32_t& max_count) {\n\tauto _method = ::mmx::Router_get_peers::create();\n\t_method->max_count = max_count;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_peers_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<std::string>>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nstd::vector<std::string> RouterClient::get_known_peers() {\n\tauto _method = ::mmx::Router_get_known_peers::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_known_peers_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<std::string>>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nstd::vector<std::string> RouterClient::get_connected_peers() {\n\tauto _method = ::mmx::Router_get_connected_peers::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_connected_peers_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<std::string>>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::PeerInfo> RouterClient::get_peer_info() {\n\tauto _method = ::mmx::Router_get_peer_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_peer_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::PeerInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nvoid RouterClient::kick_peer(const std::string& address) {\n\tauto _method = ::mmx::Router_kick_peer::create();\n\t_method->address = address;\n\tvnx_request(_method, false);\n}\n\nvoid RouterClient::kick_peer_async(const std::string& address) {\n\tauto _method = ::mmx::Router_kick_peer::create();\n\t_method->address = address;\n\tvnx_request(_method, true);\n}\n\nstd::vector<std::shared_ptr<const ::mmx::Block>> RouterClient::get_blocks_at(const uint32_t& height) {\n\tauto _method = ::mmx::Router_get_blocks_at::create();\n\t_method->height = height;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_get_blocks_at_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<std::shared_ptr<const ::mmx::Block>>>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Block> RouterClient::fetch_block(const ::mmx::hash_t& hash, const vnx::optional<std::string>& address) {\n\tauto _method = ::mmx::Router_fetch_block::create();\n\t_method->hash = hash;\n\t_method->address = address;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_fetch_block_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Block>>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Block> RouterClient::fetch_block_at(const uint32_t& height, const std::string& address) {\n\tauto _method = ::mmx::Router_fetch_block_at::create();\n\t_method->height = height;\n\t_method->address = address;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Router_fetch_block_at_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Block>>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::addons::HttpResponse> RouterClient::http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpResponse>>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::addons::HttpData> RouterClient::http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request_chunk::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\t_method->offset = offset;\n\t_method->max_bytes = max_bytes;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpData>>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\n::vnx::Object RouterClient::vnx_get_config_object() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Object>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\n::vnx::Variant RouterClient::vnx_get_config(const std::string& name) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Variant>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nvoid RouterClient::vnx_set_config_object(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, false);\n}\n\nvoid RouterClient::vnx_set_config_object_async(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, true);\n}\n\nvoid RouterClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, false);\n}\n\nvoid RouterClient::vnx_set_config_async(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, true);\n}\n\n::vnx::TypeCode RouterClient::vnx_get_type_code() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::TypeCode>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::ModuleInfo> RouterClient::vnx_get_module_info() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\nvoid RouterClient::vnx_restart() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, false);\n}\n\nvoid RouterClient::vnx_restart_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, true);\n}\n\nvoid RouterClient::vnx_stop() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, false);\n}\n\nvoid RouterClient::vnx_stop_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, true);\n}\n\nvnx::bool_t RouterClient::vnx_self_test() {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::bool_t>();\n\t} else {\n\t\tthrow std::logic_error(\"RouterClient: invalid return value\");\n\t}\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/Router_discover.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_discover.hxx>\n#include <mmx/Router_discover_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_discover::VNX_TYPE_HASH(0xeda51767d96e246cull);\nconst vnx::Hash64 Router_discover::VNX_CODE_HASH(0x3d96f8d693a2fa38ull);\n\nvnx::Hash64 Router_discover::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_discover::get_type_name() const {\n\treturn \"mmx.Router.discover\";\n}\n\nconst vnx::TypeCode* Router_discover::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_discover;\n}\n\nstd::shared_ptr<Router_discover> Router_discover::create() {\n\treturn std::make_shared<Router_discover>();\n}\n\nstd::shared_ptr<vnx::Value> Router_discover::clone() const {\n\treturn std::make_shared<Router_discover>(*this);\n}\n\nvoid Router_discover::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_discover::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_discover::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_discover;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_discover::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.discover\\\"\";\n\t_out << \"}\";\n}\n\nvoid Router_discover::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_discover::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.discover\";\n\treturn _object;\n}\n\nvoid Router_discover::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Router_discover::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Router_discover::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_discover& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_discover& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_discover::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_discover::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.discover\";\n\ttype_code->type_hash = vnx::Hash64(0xeda51767d96e246cull);\n\ttype_code->code_hash = vnx::Hash64(0x3d96f8d693a2fa38ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_discover);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_discover>(); };\n\ttype_code->return_type = ::mmx::Router_discover_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_discover& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_discover& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_discover;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_discover>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Router_discover& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_discover& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_discover& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_discover_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_discover_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_discover_return::VNX_TYPE_HASH(0xb4e47e012f264f94ull);\nconst vnx::Hash64 Router_discover_return::VNX_CODE_HASH(0xbeb58a41b8d53d38ull);\n\nvnx::Hash64 Router_discover_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_discover_return::get_type_name() const {\n\treturn \"mmx.Router.discover.return\";\n}\n\nconst vnx::TypeCode* Router_discover_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_discover_return;\n}\n\nstd::shared_ptr<Router_discover_return> Router_discover_return::create() {\n\treturn std::make_shared<Router_discover_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_discover_return::clone() const {\n\treturn std::make_shared<Router_discover_return>(*this);\n}\n\nvoid Router_discover_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_discover_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_discover_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_discover_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_discover_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.discover.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Router_discover_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_discover_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.discover.return\";\n\treturn _object;\n}\n\nvoid Router_discover_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Router_discover_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Router_discover_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_discover_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_discover_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_discover_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_discover_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.discover.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb4e47e012f264f94ull);\n\ttype_code->code_hash = vnx::Hash64(0xbeb58a41b8d53d38ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_discover_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_discover_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_discover_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_discover_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_discover_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_discover_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Router_discover_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_discover_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_discover_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_fetch_block.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_fetch_block.hxx>\n#include <mmx/Router_fetch_block_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_fetch_block::VNX_TYPE_HASH(0x7c2f762681e7cc51ull);\nconst vnx::Hash64 Router_fetch_block::VNX_CODE_HASH(0x61cd31e11aef92dfull);\n\nvnx::Hash64 Router_fetch_block::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_fetch_block::get_type_name() const {\n\treturn \"mmx.Router.fetch_block\";\n}\n\nconst vnx::TypeCode* Router_fetch_block::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_fetch_block;\n}\n\nstd::shared_ptr<Router_fetch_block> Router_fetch_block::create() {\n\treturn std::make_shared<Router_fetch_block>();\n}\n\nstd::shared_ptr<vnx::Value> Router_fetch_block::clone() const {\n\treturn std::make_shared<Router_fetch_block>(*this);\n}\n\nvoid Router_fetch_block::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_fetch_block::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_fetch_block::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_fetch_block;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, hash);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_fetch_block::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.fetch_block\\\"\";\n\t_out << \", \\\"hash\\\": \"; vnx::write(_out, hash);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Router_fetch_block::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_fetch_block::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.fetch_block\";\n\t_object[\"hash\"] = hash;\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Router_fetch_block::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"hash\") {\n\t\t\t_entry.second.to(hash);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_fetch_block::get_field(const std::string& _name) const {\n\tif(_name == \"hash\") {\n\t\treturn vnx::Variant(hash);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_fetch_block::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"hash\") {\n\t\t_value.to(hash);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_fetch_block& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_fetch_block& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_fetch_block::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_fetch_block::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.fetch_block\";\n\ttype_code->type_hash = vnx::Hash64(0x7c2f762681e7cc51ull);\n\ttype_code->code_hash = vnx::Hash64(0x61cd31e11aef92dfull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_fetch_block);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_fetch_block>(); };\n\ttype_code->is_const = true;\n\ttype_code->is_async = true;\n\ttype_code->return_type = ::mmx::Router_fetch_block_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {33, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_fetch_block& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.hash, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_fetch_block& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_fetch_block;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_fetch_block>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.hash, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_fetch_block& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_fetch_block& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_fetch_block_at.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_fetch_block_at.hxx>\n#include <mmx/Router_fetch_block_at_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_fetch_block_at::VNX_TYPE_HASH(0xa4deba522ed6f8adull);\nconst vnx::Hash64 Router_fetch_block_at::VNX_CODE_HASH(0x611fcd29266eedc5ull);\n\nvnx::Hash64 Router_fetch_block_at::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_fetch_block_at::get_type_name() const {\n\treturn \"mmx.Router.fetch_block_at\";\n}\n\nconst vnx::TypeCode* Router_fetch_block_at::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_fetch_block_at;\n}\n\nstd::shared_ptr<Router_fetch_block_at> Router_fetch_block_at::create() {\n\treturn std::make_shared<Router_fetch_block_at>();\n}\n\nstd::shared_ptr<vnx::Value> Router_fetch_block_at::clone() const {\n\treturn std::make_shared<Router_fetch_block_at>(*this);\n}\n\nvoid Router_fetch_block_at::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_fetch_block_at::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_fetch_block_at::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_fetch_block_at;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_fetch_block_at::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.fetch_block_at\\\"\";\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Router_fetch_block_at::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_fetch_block_at::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.fetch_block_at\";\n\t_object[\"height\"] = height;\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Router_fetch_block_at::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_fetch_block_at::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_fetch_block_at::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_fetch_block_at& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_fetch_block_at& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_fetch_block_at::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_fetch_block_at::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.fetch_block_at\";\n\ttype_code->type_hash = vnx::Hash64(0xa4deba522ed6f8adull);\n\ttype_code->code_hash = vnx::Hash64(0x611fcd29266eedc5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_fetch_block_at);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_fetch_block_at>(); };\n\ttype_code->is_const = true;\n\ttype_code->is_async = true;\n\ttype_code->return_type = ::mmx::Router_fetch_block_at_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_fetch_block_at& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_fetch_block_at& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_fetch_block_at;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_fetch_block_at>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_fetch_block_at& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_fetch_block_at& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block_at& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_fetch_block_at_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_fetch_block_at_return.hxx>\n#include <mmx/Block.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_fetch_block_at_return::VNX_TYPE_HASH(0xff711a762d6f885ull);\nconst vnx::Hash64 Router_fetch_block_at_return::VNX_CODE_HASH(0xe000edfc8af5ce89ull);\n\nvnx::Hash64 Router_fetch_block_at_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_fetch_block_at_return::get_type_name() const {\n\treturn \"mmx.Router.fetch_block_at.return\";\n}\n\nconst vnx::TypeCode* Router_fetch_block_at_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_fetch_block_at_return;\n}\n\nstd::shared_ptr<Router_fetch_block_at_return> Router_fetch_block_at_return::create() {\n\treturn std::make_shared<Router_fetch_block_at_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_fetch_block_at_return::clone() const {\n\treturn std::make_shared<Router_fetch_block_at_return>(*this);\n}\n\nvoid Router_fetch_block_at_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_fetch_block_at_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_fetch_block_at_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_fetch_block_at_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_fetch_block_at_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.fetch_block_at.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Router_fetch_block_at_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_fetch_block_at_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.fetch_block_at.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Router_fetch_block_at_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_fetch_block_at_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_fetch_block_at_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_fetch_block_at_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_fetch_block_at_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_fetch_block_at_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_fetch_block_at_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.fetch_block_at.return\";\n\ttype_code->type_hash = vnx::Hash64(0xff711a762d6f885ull);\n\ttype_code->code_hash = vnx::Hash64(0xe000edfc8af5ce89ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_fetch_block_at_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_fetch_block_at_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_fetch_block_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_fetch_block_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_fetch_block_at_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_fetch_block_at_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_fetch_block_at_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_fetch_block_at_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block_at_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_fetch_block_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_fetch_block_return.hxx>\n#include <mmx/Block.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_fetch_block_return::VNX_TYPE_HASH(0xcbe76155006bbb44ull);\nconst vnx::Hash64 Router_fetch_block_return::VNX_CODE_HASH(0x6a18dd40a937ba81ull);\n\nvnx::Hash64 Router_fetch_block_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_fetch_block_return::get_type_name() const {\n\treturn \"mmx.Router.fetch_block.return\";\n}\n\nconst vnx::TypeCode* Router_fetch_block_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_fetch_block_return;\n}\n\nstd::shared_ptr<Router_fetch_block_return> Router_fetch_block_return::create() {\n\treturn std::make_shared<Router_fetch_block_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_fetch_block_return::clone() const {\n\treturn std::make_shared<Router_fetch_block_return>(*this);\n}\n\nvoid Router_fetch_block_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_fetch_block_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_fetch_block_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_fetch_block_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_fetch_block_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.fetch_block.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Router_fetch_block_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_fetch_block_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.fetch_block.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Router_fetch_block_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_fetch_block_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_fetch_block_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_fetch_block_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_fetch_block_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_fetch_block_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_fetch_block_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.fetch_block.return\";\n\ttype_code->type_hash = vnx::Hash64(0xcbe76155006bbb44ull);\n\ttype_code->code_hash = vnx::Hash64(0x6a18dd40a937ba81ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_fetch_block_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_fetch_block_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_fetch_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_fetch_block_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_fetch_block_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_fetch_block_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_fetch_block_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_fetch_block_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_fetch_block_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_blocks_at.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_blocks_at.hxx>\n#include <mmx/Router_get_blocks_at_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_blocks_at::VNX_TYPE_HASH(0x1eb0c0d7eae3c33aull);\nconst vnx::Hash64 Router_get_blocks_at::VNX_CODE_HASH(0x258cf68611e58fe8ull);\n\nvnx::Hash64 Router_get_blocks_at::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_blocks_at::get_type_name() const {\n\treturn \"mmx.Router.get_blocks_at\";\n}\n\nconst vnx::TypeCode* Router_get_blocks_at::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_blocks_at;\n}\n\nstd::shared_ptr<Router_get_blocks_at> Router_get_blocks_at::create() {\n\treturn std::make_shared<Router_get_blocks_at>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_blocks_at::clone() const {\n\treturn std::make_shared<Router_get_blocks_at>(*this);\n}\n\nvoid Router_get_blocks_at::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_blocks_at::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_blocks_at::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_blocks_at;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_blocks_at::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_blocks_at\\\"\";\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \"}\";\n}\n\nvoid Router_get_blocks_at::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_blocks_at::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_blocks_at\";\n\t_object[\"height\"] = height;\n\treturn _object;\n}\n\nvoid Router_get_blocks_at::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_get_blocks_at::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_get_blocks_at::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_blocks_at& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_blocks_at& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_blocks_at::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_blocks_at::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_blocks_at\";\n\ttype_code->type_hash = vnx::Hash64(0x1eb0c0d7eae3c33aull);\n\ttype_code->code_hash = vnx::Hash64(0x258cf68611e58fe8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_blocks_at);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_blocks_at>(); };\n\ttype_code->is_const = true;\n\ttype_code->is_async = true;\n\ttype_code->return_type = ::mmx::Router_get_blocks_at_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_blocks_at& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_blocks_at& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_blocks_at;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_blocks_at>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.height);\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_blocks_at& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_blocks_at& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_blocks_at& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_blocks_at_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_blocks_at_return.hxx>\n#include <mmx/Block.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_blocks_at_return::VNX_TYPE_HASH(0x70f0e9e7aa72b810ull);\nconst vnx::Hash64 Router_get_blocks_at_return::VNX_CODE_HASH(0xf2cd401ba9e551e3ull);\n\nvnx::Hash64 Router_get_blocks_at_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_blocks_at_return::get_type_name() const {\n\treturn \"mmx.Router.get_blocks_at.return\";\n}\n\nconst vnx::TypeCode* Router_get_blocks_at_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_blocks_at_return;\n}\n\nstd::shared_ptr<Router_get_blocks_at_return> Router_get_blocks_at_return::create() {\n\treturn std::make_shared<Router_get_blocks_at_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_blocks_at_return::clone() const {\n\treturn std::make_shared<Router_get_blocks_at_return>(*this);\n}\n\nvoid Router_get_blocks_at_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_blocks_at_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_blocks_at_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_blocks_at_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_blocks_at_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_blocks_at.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Router_get_blocks_at_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_blocks_at_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_blocks_at.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Router_get_blocks_at_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_get_blocks_at_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_get_blocks_at_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_blocks_at_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_blocks_at_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_blocks_at_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_blocks_at_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_blocks_at.return\";\n\ttype_code->type_hash = vnx::Hash64(0x70f0e9e7aa72b810ull);\n\ttype_code->code_hash = vnx::Hash64(0xf2cd401ba9e551e3ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_blocks_at_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_blocks_at_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_blocks_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_blocks_at_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_blocks_at_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_blocks_at_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_blocks_at_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_blocks_at_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_blocks_at_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_connected_peers.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_connected_peers.hxx>\n#include <mmx/Router_get_connected_peers_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_connected_peers::VNX_TYPE_HASH(0x8682feb65fbb77feull);\nconst vnx::Hash64 Router_get_connected_peers::VNX_CODE_HASH(0xc4d46e93242548d5ull);\n\nvnx::Hash64 Router_get_connected_peers::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_connected_peers::get_type_name() const {\n\treturn \"mmx.Router.get_connected_peers\";\n}\n\nconst vnx::TypeCode* Router_get_connected_peers::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_connected_peers;\n}\n\nstd::shared_ptr<Router_get_connected_peers> Router_get_connected_peers::create() {\n\treturn std::make_shared<Router_get_connected_peers>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_connected_peers::clone() const {\n\treturn std::make_shared<Router_get_connected_peers>(*this);\n}\n\nvoid Router_get_connected_peers::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_connected_peers::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_connected_peers::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_connected_peers;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_connected_peers::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_connected_peers\\\"\";\n\t_out << \"}\";\n}\n\nvoid Router_get_connected_peers::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_connected_peers::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_connected_peers\";\n\treturn _object;\n}\n\nvoid Router_get_connected_peers::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Router_get_connected_peers::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Router_get_connected_peers::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_connected_peers& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_connected_peers& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_connected_peers::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_connected_peers::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_connected_peers\";\n\ttype_code->type_hash = vnx::Hash64(0x8682feb65fbb77feull);\n\ttype_code->code_hash = vnx::Hash64(0xc4d46e93242548d5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_connected_peers);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_connected_peers>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Router_get_connected_peers_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_connected_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_connected_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_connected_peers;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_connected_peers>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_connected_peers& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_connected_peers& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_connected_peers& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_connected_peers_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_connected_peers_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_connected_peers_return::VNX_TYPE_HASH(0x5c96b95e03d32e32ull);\nconst vnx::Hash64 Router_get_connected_peers_return::VNX_CODE_HASH(0xae7af13523d31da8ull);\n\nvnx::Hash64 Router_get_connected_peers_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_connected_peers_return::get_type_name() const {\n\treturn \"mmx.Router.get_connected_peers.return\";\n}\n\nconst vnx::TypeCode* Router_get_connected_peers_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_connected_peers_return;\n}\n\nstd::shared_ptr<Router_get_connected_peers_return> Router_get_connected_peers_return::create() {\n\treturn std::make_shared<Router_get_connected_peers_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_connected_peers_return::clone() const {\n\treturn std::make_shared<Router_get_connected_peers_return>(*this);\n}\n\nvoid Router_get_connected_peers_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_connected_peers_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_connected_peers_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_connected_peers_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_connected_peers_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_connected_peers.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Router_get_connected_peers_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_connected_peers_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_connected_peers.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Router_get_connected_peers_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_get_connected_peers_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_get_connected_peers_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_connected_peers_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_connected_peers_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_connected_peers_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_connected_peers_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_connected_peers.return\";\n\ttype_code->type_hash = vnx::Hash64(0x5c96b95e03d32e32ull);\n\ttype_code->code_hash = vnx::Hash64(0xae7af13523d31da8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_connected_peers_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_connected_peers_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_connected_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_connected_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_connected_peers_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_connected_peers_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_connected_peers_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_connected_peers_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_connected_peers_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_id.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_id.hxx>\n#include <mmx/Router_get_id_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_id::VNX_TYPE_HASH(0xb9f7168b5ae94cd9ull);\nconst vnx::Hash64 Router_get_id::VNX_CODE_HASH(0xbb27b1ab7ee8c69dull);\n\nvnx::Hash64 Router_get_id::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_id::get_type_name() const {\n\treturn \"mmx.Router.get_id\";\n}\n\nconst vnx::TypeCode* Router_get_id::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_id;\n}\n\nstd::shared_ptr<Router_get_id> Router_get_id::create() {\n\treturn std::make_shared<Router_get_id>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_id::clone() const {\n\treturn std::make_shared<Router_get_id>(*this);\n}\n\nvoid Router_get_id::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_id::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_id::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_id;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_id::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_id\\\"\";\n\t_out << \"}\";\n}\n\nvoid Router_get_id::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_id::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_id\";\n\treturn _object;\n}\n\nvoid Router_get_id::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Router_get_id::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Router_get_id::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_id& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_id& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_id::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_id::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_id\";\n\ttype_code->type_hash = vnx::Hash64(0xb9f7168b5ae94cd9ull);\n\ttype_code->code_hash = vnx::Hash64(0xbb27b1ab7ee8c69dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_id);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_id>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Router_get_id_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_id& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_id& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_id;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_id>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_id& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_id& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_id& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_id_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_id_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_id_return::VNX_TYPE_HASH(0x3924146b7a803806ull);\nconst vnx::Hash64 Router_get_id_return::VNX_CODE_HASH(0xf39def51a6cf1026ull);\n\nvnx::Hash64 Router_get_id_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_id_return::get_type_name() const {\n\treturn \"mmx.Router.get_id.return\";\n}\n\nconst vnx::TypeCode* Router_get_id_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_id_return;\n}\n\nstd::shared_ptr<Router_get_id_return> Router_get_id_return::create() {\n\treturn std::make_shared<Router_get_id_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_id_return::clone() const {\n\treturn std::make_shared<Router_get_id_return>(*this);\n}\n\nvoid Router_get_id_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_id_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_id_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_id_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_id_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_id.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Router_get_id_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_id_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_id.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Router_get_id_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_get_id_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_get_id_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_id_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_id_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_id_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_id_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_id.return\";\n\ttype_code->type_hash = vnx::Hash64(0x3924146b7a803806ull);\n\ttype_code->code_hash = vnx::Hash64(0xf39def51a6cf1026ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_id_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_id_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_id_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_id_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_id_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_id_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_id_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_id_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_id_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_info.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_info.hxx>\n#include <mmx/Router_get_info_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_info::VNX_TYPE_HASH(0x364ea887c149a265ull);\nconst vnx::Hash64 Router_get_info::VNX_CODE_HASH(0x84c4e0df1324599full);\n\nvnx::Hash64 Router_get_info::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_info::get_type_name() const {\n\treturn \"mmx.Router.get_info\";\n}\n\nconst vnx::TypeCode* Router_get_info::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_info;\n}\n\nstd::shared_ptr<Router_get_info> Router_get_info::create() {\n\treturn std::make_shared<Router_get_info>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_info::clone() const {\n\treturn std::make_shared<Router_get_info>(*this);\n}\n\nvoid Router_get_info::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_info::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_info::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_info;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_info::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_info\\\"\";\n\t_out << \"}\";\n}\n\nvoid Router_get_info::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_info::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_info\";\n\treturn _object;\n}\n\nvoid Router_get_info::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Router_get_info::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Router_get_info::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_info& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_info& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_info::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_info::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_info\";\n\ttype_code->type_hash = vnx::Hash64(0x364ea887c149a265ull);\n\ttype_code->code_hash = vnx::Hash64(0x84c4e0df1324599full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_info);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_info>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Router_get_info_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_info;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_info>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_info& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_info& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_info& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_info_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_info_return.hxx>\n#include <mmx/node_info_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_info_return::VNX_TYPE_HASH(0x15170c71ca9209a9ull);\nconst vnx::Hash64 Router_get_info_return::VNX_CODE_HASH(0xd5570290d072503full);\n\nvnx::Hash64 Router_get_info_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_info_return::get_type_name() const {\n\treturn \"mmx.Router.get_info.return\";\n}\n\nconst vnx::TypeCode* Router_get_info_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_info_return;\n}\n\nstd::shared_ptr<Router_get_info_return> Router_get_info_return::create() {\n\treturn std::make_shared<Router_get_info_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_info_return::clone() const {\n\treturn std::make_shared<Router_get_info_return>(*this);\n}\n\nvoid Router_get_info_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_info_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_info_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_info_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_info_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_info.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Router_get_info_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_info_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_info.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Router_get_info_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_get_info_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_get_info_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_info_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_info_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_info_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_info_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_info.return\";\n\ttype_code->type_hash = vnx::Hash64(0x15170c71ca9209a9ull);\n\ttype_code->code_hash = vnx::Hash64(0xd5570290d072503full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_info_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_info_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::node_info_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_info_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_info_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_info_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_info_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_info_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_known_peers.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_known_peers.hxx>\n#include <mmx/Router_get_known_peers_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_known_peers::VNX_TYPE_HASH(0xaa408b6bf4e8168dull);\nconst vnx::Hash64 Router_get_known_peers::VNX_CODE_HASH(0xe5a3f89e7601f8c9ull);\n\nvnx::Hash64 Router_get_known_peers::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_known_peers::get_type_name() const {\n\treturn \"mmx.Router.get_known_peers\";\n}\n\nconst vnx::TypeCode* Router_get_known_peers::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_known_peers;\n}\n\nstd::shared_ptr<Router_get_known_peers> Router_get_known_peers::create() {\n\treturn std::make_shared<Router_get_known_peers>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_known_peers::clone() const {\n\treturn std::make_shared<Router_get_known_peers>(*this);\n}\n\nvoid Router_get_known_peers::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_known_peers::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_known_peers::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_known_peers;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_known_peers::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_known_peers\\\"\";\n\t_out << \"}\";\n}\n\nvoid Router_get_known_peers::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_known_peers::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_known_peers\";\n\treturn _object;\n}\n\nvoid Router_get_known_peers::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Router_get_known_peers::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Router_get_known_peers::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_known_peers& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_known_peers& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_known_peers::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_known_peers::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_known_peers\";\n\ttype_code->type_hash = vnx::Hash64(0xaa408b6bf4e8168dull);\n\ttype_code->code_hash = vnx::Hash64(0xe5a3f89e7601f8c9ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_known_peers);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_known_peers>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Router_get_known_peers_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_known_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_known_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_known_peers;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_known_peers>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_known_peers& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_known_peers& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_known_peers& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_known_peers_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_known_peers_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_known_peers_return::VNX_TYPE_HASH(0xc08cde4fbf7f2abcull);\nconst vnx::Hash64 Router_get_known_peers_return::VNX_CODE_HASH(0x6ee4ed4813644374ull);\n\nvnx::Hash64 Router_get_known_peers_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_known_peers_return::get_type_name() const {\n\treturn \"mmx.Router.get_known_peers.return\";\n}\n\nconst vnx::TypeCode* Router_get_known_peers_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_known_peers_return;\n}\n\nstd::shared_ptr<Router_get_known_peers_return> Router_get_known_peers_return::create() {\n\treturn std::make_shared<Router_get_known_peers_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_known_peers_return::clone() const {\n\treturn std::make_shared<Router_get_known_peers_return>(*this);\n}\n\nvoid Router_get_known_peers_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_known_peers_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_known_peers_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_known_peers_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_known_peers_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_known_peers.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Router_get_known_peers_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_known_peers_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_known_peers.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Router_get_known_peers_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_get_known_peers_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_get_known_peers_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_known_peers_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_known_peers_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_known_peers_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_known_peers_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_known_peers.return\";\n\ttype_code->type_hash = vnx::Hash64(0xc08cde4fbf7f2abcull);\n\ttype_code->code_hash = vnx::Hash64(0x6ee4ed4813644374ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_known_peers_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_known_peers_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_known_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_known_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_known_peers_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_known_peers_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_known_peers_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_known_peers_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_known_peers_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_peer_info.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_peer_info.hxx>\n#include <mmx/Router_get_peer_info_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_peer_info::VNX_TYPE_HASH(0x520a467ef9324cb3ull);\nconst vnx::Hash64 Router_get_peer_info::VNX_CODE_HASH(0x5fb7af7adff5636eull);\n\nvnx::Hash64 Router_get_peer_info::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_peer_info::get_type_name() const {\n\treturn \"mmx.Router.get_peer_info\";\n}\n\nconst vnx::TypeCode* Router_get_peer_info::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_peer_info;\n}\n\nstd::shared_ptr<Router_get_peer_info> Router_get_peer_info::create() {\n\treturn std::make_shared<Router_get_peer_info>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_peer_info::clone() const {\n\treturn std::make_shared<Router_get_peer_info>(*this);\n}\n\nvoid Router_get_peer_info::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_peer_info::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_peer_info::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_peer_info;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_peer_info::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_peer_info\\\"\";\n\t_out << \"}\";\n}\n\nvoid Router_get_peer_info::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_peer_info::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_peer_info\";\n\treturn _object;\n}\n\nvoid Router_get_peer_info::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Router_get_peer_info::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Router_get_peer_info::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_peer_info& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_peer_info& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_peer_info::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_peer_info::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_peer_info\";\n\ttype_code->type_hash = vnx::Hash64(0x520a467ef9324cb3ull);\n\ttype_code->code_hash = vnx::Hash64(0x5fb7af7adff5636eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_peer_info);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_peer_info>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Router_get_peer_info_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_peer_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_peer_info& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_peer_info;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_peer_info>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_peer_info& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_peer_info& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_peer_info& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_peer_info_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_peer_info_return.hxx>\n#include <mmx/PeerInfo.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_peer_info_return::VNX_TYPE_HASH(0xffff4ae0244281b5ull);\nconst vnx::Hash64 Router_get_peer_info_return::VNX_CODE_HASH(0x78a6bf8b8201108bull);\n\nvnx::Hash64 Router_get_peer_info_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_peer_info_return::get_type_name() const {\n\treturn \"mmx.Router.get_peer_info.return\";\n}\n\nconst vnx::TypeCode* Router_get_peer_info_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_peer_info_return;\n}\n\nstd::shared_ptr<Router_get_peer_info_return> Router_get_peer_info_return::create() {\n\treturn std::make_shared<Router_get_peer_info_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_peer_info_return::clone() const {\n\treturn std::make_shared<Router_get_peer_info_return>(*this);\n}\n\nvoid Router_get_peer_info_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_peer_info_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_peer_info_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_peer_info_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_peer_info_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_peer_info.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Router_get_peer_info_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_peer_info_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_peer_info.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Router_get_peer_info_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_get_peer_info_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_get_peer_info_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_peer_info_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_peer_info_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_peer_info_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_peer_info_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_peer_info.return\";\n\ttype_code->type_hash = vnx::Hash64(0xffff4ae0244281b5ull);\n\ttype_code->code_hash = vnx::Hash64(0x78a6bf8b8201108bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_peer_info_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_peer_info_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_peer_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_peer_info_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_peer_info_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_peer_info_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_peer_info_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_peer_info_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_peer_info_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_peers.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_peers.hxx>\n#include <mmx/Router_get_peers_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_peers::VNX_TYPE_HASH(0x66d68bd91b462049ull);\nconst vnx::Hash64 Router_get_peers::VNX_CODE_HASH(0xa49d54aad6f88ed8ull);\n\nvnx::Hash64 Router_get_peers::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_peers::get_type_name() const {\n\treturn \"mmx.Router.get_peers\";\n}\n\nconst vnx::TypeCode* Router_get_peers::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_peers;\n}\n\nstd::shared_ptr<Router_get_peers> Router_get_peers::create() {\n\treturn std::make_shared<Router_get_peers>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_peers::clone() const {\n\treturn std::make_shared<Router_get_peers>(*this);\n}\n\nvoid Router_get_peers::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_peers::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_peers::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_peers;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, max_count);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_peers::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_peers\\\"\";\n\t_out << \", \\\"max_count\\\": \"; vnx::write(_out, max_count);\n\t_out << \"}\";\n}\n\nvoid Router_get_peers::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_peers::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_peers\";\n\t_object[\"max_count\"] = max_count;\n\treturn _object;\n}\n\nvoid Router_get_peers::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"max_count\") {\n\t\t\t_entry.second.to(max_count);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_get_peers::get_field(const std::string& _name) const {\n\tif(_name == \"max_count\") {\n\t\treturn vnx::Variant(max_count);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_get_peers::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"max_count\") {\n\t\t_value.to(max_count);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_peers& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_peers& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_peers::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_peers::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_peers\";\n\ttype_code->type_hash = vnx::Hash64(0x66d68bd91b462049ull);\n\ttype_code->code_hash = vnx::Hash64(0xa49d54aad6f88ed8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_peers);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_peers>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Router_get_peers_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_count\";\n\t\tfield.value = vnx::to_string(10);\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_count, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_peers& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_peers;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_peers>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.max_count);\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_peers& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_peers& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_peers& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_get_peers_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_get_peers_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_get_peers_return::VNX_TYPE_HASH(0x595714f80f272d86ull);\nconst vnx::Hash64 Router_get_peers_return::VNX_CODE_HASH(0x1ddb67085e58bab8ull);\n\nvnx::Hash64 Router_get_peers_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_get_peers_return::get_type_name() const {\n\treturn \"mmx.Router.get_peers.return\";\n}\n\nconst vnx::TypeCode* Router_get_peers_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_get_peers_return;\n}\n\nstd::shared_ptr<Router_get_peers_return> Router_get_peers_return::create() {\n\treturn std::make_shared<Router_get_peers_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_get_peers_return::clone() const {\n\treturn std::make_shared<Router_get_peers_return>(*this);\n}\n\nvoid Router_get_peers_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_get_peers_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_get_peers_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_get_peers_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_get_peers_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.get_peers.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Router_get_peers_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_get_peers_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.get_peers.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Router_get_peers_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_get_peers_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_get_peers_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_get_peers_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_get_peers_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_get_peers_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_get_peers_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.get_peers.return\";\n\ttype_code->type_hash = vnx::Hash64(0x595714f80f272d86ull);\n\ttype_code->code_hash = vnx::Hash64(0x1ddb67085e58bab8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_get_peers_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_get_peers_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_get_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_get_peers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_get_peers_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_get_peers_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_get_peers_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_get_peers_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_get_peers_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_kick_peer.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_kick_peer.hxx>\n#include <mmx/Router_kick_peer_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_kick_peer::VNX_TYPE_HASH(0x359a21379021beedull);\nconst vnx::Hash64 Router_kick_peer::VNX_CODE_HASH(0x10c42f572627bd33ull);\n\nvnx::Hash64 Router_kick_peer::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_kick_peer::get_type_name() const {\n\treturn \"mmx.Router.kick_peer\";\n}\n\nconst vnx::TypeCode* Router_kick_peer::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_kick_peer;\n}\n\nstd::shared_ptr<Router_kick_peer> Router_kick_peer::create() {\n\treturn std::make_shared<Router_kick_peer>();\n}\n\nstd::shared_ptr<vnx::Value> Router_kick_peer::clone() const {\n\treturn std::make_shared<Router_kick_peer>(*this);\n}\n\nvoid Router_kick_peer::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_kick_peer::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_kick_peer::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_kick_peer;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_kick_peer::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.kick_peer\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Router_kick_peer::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_kick_peer::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.kick_peer\";\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Router_kick_peer::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_kick_peer::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_kick_peer::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_kick_peer& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_kick_peer& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_kick_peer::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_kick_peer::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.kick_peer\";\n\ttype_code->type_hash = vnx::Hash64(0x359a21379021beedull);\n\ttype_code->code_hash = vnx::Hash64(0x10c42f572627bd33ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_kick_peer);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_kick_peer>(); };\n\ttype_code->return_type = ::mmx::Router_kick_peer_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_kick_peer& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_kick_peer& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_kick_peer;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_kick_peer>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_kick_peer& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_kick_peer& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_kick_peer& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_kick_peer_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_kick_peer_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_kick_peer_return::VNX_TYPE_HASH(0xd7189e110cc3a50full);\nconst vnx::Hash64 Router_kick_peer_return::VNX_CODE_HASH(0x3414f125382967daull);\n\nvnx::Hash64 Router_kick_peer_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_kick_peer_return::get_type_name() const {\n\treturn \"mmx.Router.kick_peer.return\";\n}\n\nconst vnx::TypeCode* Router_kick_peer_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_kick_peer_return;\n}\n\nstd::shared_ptr<Router_kick_peer_return> Router_kick_peer_return::create() {\n\treturn std::make_shared<Router_kick_peer_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_kick_peer_return::clone() const {\n\treturn std::make_shared<Router_kick_peer_return>(*this);\n}\n\nvoid Router_kick_peer_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_kick_peer_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_kick_peer_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_kick_peer_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_kick_peer_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.kick_peer.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Router_kick_peer_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_kick_peer_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.kick_peer.return\";\n\treturn _object;\n}\n\nvoid Router_kick_peer_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Router_kick_peer_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Router_kick_peer_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_kick_peer_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_kick_peer_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_kick_peer_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_kick_peer_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.kick_peer.return\";\n\ttype_code->type_hash = vnx::Hash64(0xd7189e110cc3a50full);\n\ttype_code->code_hash = vnx::Hash64(0x3414f125382967daull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_kick_peer_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_kick_peer_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_kick_peer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_kick_peer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_kick_peer_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_kick_peer_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Router_kick_peer_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_kick_peer_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_kick_peer_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_sign_msg.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_sign_msg.hxx>\n#include <mmx/Router_sign_msg_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_sign_msg::VNX_TYPE_HASH(0x88ede2fbb99ab63eull);\nconst vnx::Hash64 Router_sign_msg::VNX_CODE_HASH(0x994b29aed2a3d558ull);\n\nvnx::Hash64 Router_sign_msg::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_sign_msg::get_type_name() const {\n\treturn \"mmx.Router.sign_msg\";\n}\n\nconst vnx::TypeCode* Router_sign_msg::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_sign_msg;\n}\n\nstd::shared_ptr<Router_sign_msg> Router_sign_msg::create() {\n\treturn std::make_shared<Router_sign_msg>();\n}\n\nstd::shared_ptr<vnx::Value> Router_sign_msg::clone() const {\n\treturn std::make_shared<Router_sign_msg>(*this);\n}\n\nvoid Router_sign_msg::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_sign_msg::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_sign_msg::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_sign_msg;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, msg);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_sign_msg::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.sign_msg\\\"\";\n\t_out << \", \\\"msg\\\": \"; vnx::write(_out, msg);\n\t_out << \"}\";\n}\n\nvoid Router_sign_msg::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_sign_msg::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.sign_msg\";\n\t_object[\"msg\"] = msg;\n\treturn _object;\n}\n\nvoid Router_sign_msg::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"msg\") {\n\t\t\t_entry.second.to(msg);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_sign_msg::get_field(const std::string& _name) const {\n\tif(_name == \"msg\") {\n\t\treturn vnx::Variant(msg);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_sign_msg::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"msg\") {\n\t\t_value.to(msg);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_sign_msg& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_sign_msg& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_sign_msg::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_sign_msg::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.sign_msg\";\n\ttype_code->type_hash = vnx::Hash64(0x88ede2fbb99ab63eull);\n\ttype_code->code_hash = vnx::Hash64(0x994b29aed2a3d558ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Router_sign_msg);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_sign_msg>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Router_sign_msg_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"msg\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_sign_msg& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.msg, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_sign_msg& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_sign_msg;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_sign_msg>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.msg, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_sign_msg& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_sign_msg& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_sign_msg& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Router_sign_msg_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Router_sign_msg_return.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Router_sign_msg_return::VNX_TYPE_HASH(0x67c8c37a7b5fc991ull);\nconst vnx::Hash64 Router_sign_msg_return::VNX_CODE_HASH(0x5d66b369eec09800ull);\n\nvnx::Hash64 Router_sign_msg_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Router_sign_msg_return::get_type_name() const {\n\treturn \"mmx.Router.sign_msg.return\";\n}\n\nconst vnx::TypeCode* Router_sign_msg_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Router_sign_msg_return;\n}\n\nstd::shared_ptr<Router_sign_msg_return> Router_sign_msg_return::create() {\n\treturn std::make_shared<Router_sign_msg_return>();\n}\n\nstd::shared_ptr<vnx::Value> Router_sign_msg_return::clone() const {\n\treturn std::make_shared<Router_sign_msg_return>(*this);\n}\n\nvoid Router_sign_msg_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Router_sign_msg_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Router_sign_msg_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Router_sign_msg_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Router_sign_msg_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Router.sign_msg.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Router_sign_msg_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Router_sign_msg_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Router.sign_msg.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Router_sign_msg_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Router_sign_msg_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Router_sign_msg_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Router_sign_msg_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Router_sign_msg_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Router_sign_msg_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Router_sign_msg_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Router.sign_msg.return\";\n\ttype_code->type_hash = vnx::Hash64(0x67c8c37a7b5fc991ull);\n\ttype_code->code_hash = vnx::Hash64(0x5d66b369eec09800ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Router_sign_msg_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Router_sign_msg_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {23, 2, 4, 7, 11, 33, 1, 11, 64, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Router_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Router_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Router_sign_msg_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Router_sign_msg_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Router_sign_msg_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Router_sign_msg_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Router_sign_msg_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Solution.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Solution::VNX_TYPE_HASH(0x9f693babd1a91ccdull);\nconst vnx::Hash64 Solution::VNX_CODE_HASH(0x94524a146af7f5e7ull);\n\nvnx::Hash64 Solution::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Solution::get_type_name() const {\n\treturn \"mmx.Solution\";\n}\n\nconst vnx::TypeCode* Solution::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Solution;\n}\n\nstd::shared_ptr<Solution> Solution::create() {\n\treturn std::make_shared<Solution>();\n}\n\nstd::shared_ptr<vnx::Value> Solution::clone() const {\n\treturn std::make_shared<Solution>(*this);\n}\n\nvoid Solution::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Solution::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Solution::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Solution;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, version);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Solution::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Solution\\\"\";\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \"}\";\n}\n\nvoid Solution::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Solution::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Solution\";\n\t_object[\"version\"] = version;\n\treturn _object;\n}\n\nvoid Solution::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant Solution::get_field(const std::string& _name) const {\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Solution::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"version\") {\n\t\t_value.to(version);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Solution& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Solution& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Solution::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Solution::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Solution\";\n\ttype_code->type_hash = vnx::Hash64(0x9f693babd1a91ccdull);\n\ttype_code->code_hash = vnx::Hash64(0x94524a146af7f5e7ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::Solution);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Solution>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Solution::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Solution& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Solution& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Solution;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Solution>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.version);\n}\n\nvoid read(std::istream& in, ::mmx::Solution& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Solution& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Solution& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/TimeLordAsyncClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/TimeLordAsyncClient.hxx>\n#include <mmx/IntervalRequest.hxx>\n#include <mmx/TimeLord_stop_vdf.hxx>\n#include <mmx/TimeLord_stop_vdf_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nTimeLordAsyncClient::TimeLordAsyncClient(const std::string& service_name)\n\t:\tAsyncClient::AsyncClient(vnx::Hash64(service_name))\n{\n}\n\nTimeLordAsyncClient::TimeLordAsyncClient(vnx::Hash64 service_addr)\n\t:\tAsyncClient::AsyncClient(service_addr)\n{\n}\n\nuint64_t TimeLordAsyncClient::stop_vdf(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::TimeLord_stop_vdf::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 0;\n\t\tvnx_queue_stop_vdf[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t TimeLordAsyncClient::vnx_get_config_object(const std::function<void(const ::vnx::Object&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 1;\n\t\tvnx_queue_vnx_get_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t TimeLordAsyncClient::vnx_get_config(const std::string& name, const std::function<void(const ::vnx::Variant&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 2;\n\t\tvnx_queue_vnx_get_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t TimeLordAsyncClient::vnx_set_config_object(const ::vnx::Object& config, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 3;\n\t\tvnx_queue_vnx_set_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t TimeLordAsyncClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 4;\n\t\tvnx_queue_vnx_set_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t TimeLordAsyncClient::vnx_get_type_code(const std::function<void(const ::vnx::TypeCode&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 5;\n\t\tvnx_queue_vnx_get_type_code[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t TimeLordAsyncClient::vnx_get_module_info(const std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 6;\n\t\tvnx_queue_vnx_get_module_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t TimeLordAsyncClient::vnx_restart(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 7;\n\t\tvnx_queue_vnx_restart[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t TimeLordAsyncClient::vnx_stop(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 8;\n\t\tvnx_queue_vnx_stop[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t TimeLordAsyncClient::vnx_self_test(const std::function<void(const vnx::bool_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 9;\n\t\tvnx_queue_vnx_self_test[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nint32_t TimeLordAsyncClient::vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\treturn -1;\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_stop_vdf.find(_request_id);\n\t\t\tif(_iter != vnx_queue_stop_vdf.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_stop_vdf.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_restart.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_stop.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_self_test.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn _index;\n}\n\nint32_t TimeLordAsyncClient::vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\tthrow std::runtime_error(\"TimeLordAsyncClient: received unknown return\");\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_stop_vdf.find(_request_id);\n\t\t\tif(_iter == vnx_queue_stop_vdf.end()) {\n\t\t\t\tthrow std::runtime_error(\"TimeLordAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_stop_vdf.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"TimeLordAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Object>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"TimeLordAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"TimeLordAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Variant>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"TimeLordAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"TimeLordAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"TimeLordAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tthrow std::runtime_error(\"TimeLordAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::TypeCode>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"TimeLordAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"TimeLordAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"TimeLordAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_restart.end()) {\n\t\t\t\tthrow std::runtime_error(\"TimeLordAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_stop.end()) {\n\t\t\t\tthrow std::runtime_error(\"TimeLordAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_self_test.end()) {\n\t\t\t\tthrow std::runtime_error(\"TimeLordAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::bool_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"TimeLordAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif(_index >= 0) {\n\t\t\t\tthrow std::logic_error(\"TimeLordAsyncClient: invalid callback index\");\n\t\t\t}\n\t}\n\treturn _index;\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/TimeLordBase.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/TimeLordBase.hxx>\n#include <vnx/NoSuchMethod.hxx>\n#include <mmx/IntervalRequest.hxx>\n#include <mmx/TimeLord_stop_vdf.hxx>\n#include <mmx/TimeLord_stop_vdf_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 TimeLordBase::VNX_TYPE_HASH(0x311081636f6570efull);\nconst vnx::Hash64 TimeLordBase::VNX_CODE_HASH(0xeaba05bc99f7eb7full);\n\nTimeLordBase::TimeLordBase(const std::string& _vnx_name)\n\t:\tModule::Module(_vnx_name)\n{\n\tvnx::read_config(vnx_name + \".input_request\", input_request);\n\tvnx::read_config(vnx_name + \".output_proofs\", output_proofs);\n\tvnx::read_config(vnx_name + \".max_history\", max_history);\n\tvnx::read_config(vnx_name + \".node_server\", node_server);\n\tvnx::read_config(vnx_name + \".wallet_server\", wallet_server);\n\tvnx::read_config(vnx_name + \".storage_path\", storage_path);\n\tvnx::read_config(vnx_name + \".reward_addr\", reward_addr);\n}\n\nvnx::Hash64 TimeLordBase::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string TimeLordBase::get_type_name() const {\n\treturn \"mmx.TimeLord\";\n}\n\nconst vnx::TypeCode* TimeLordBase::get_type_code() const {\n\treturn mmx::vnx_native_type_code_TimeLordBase;\n}\n\nvoid TimeLordBase::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_TimeLordBase;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, input_request);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, output_proofs);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, max_history);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, node_server);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, wallet_server);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, storage_path);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, reward_addr);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid TimeLordBase::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"input_request\\\": \"; vnx::write(_out, input_request);\n\t_out << \", \\\"output_proofs\\\": \"; vnx::write(_out, output_proofs);\n\t_out << \", \\\"max_history\\\": \"; vnx::write(_out, max_history);\n\t_out << \", \\\"node_server\\\": \"; vnx::write(_out, node_server);\n\t_out << \", \\\"wallet_server\\\": \"; vnx::write(_out, wallet_server);\n\t_out << \", \\\"storage_path\\\": \"; vnx::write(_out, storage_path);\n\t_out << \", \\\"reward_addr\\\": \"; vnx::write(_out, reward_addr);\n\t_out << \"}\";\n}\n\nvoid TimeLordBase::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object TimeLordBase::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.TimeLord\";\n\t_object[\"input_request\"] = input_request;\n\t_object[\"output_proofs\"] = output_proofs;\n\t_object[\"max_history\"] = max_history;\n\t_object[\"node_server\"] = node_server;\n\t_object[\"wallet_server\"] = wallet_server;\n\t_object[\"storage_path\"] = storage_path;\n\t_object[\"reward_addr\"] = reward_addr;\n\treturn _object;\n}\n\nvoid TimeLordBase::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"input_request\") {\n\t\t\t_entry.second.to(input_request);\n\t\t} else if(_entry.first == \"max_history\") {\n\t\t\t_entry.second.to(max_history);\n\t\t} else if(_entry.first == \"node_server\") {\n\t\t\t_entry.second.to(node_server);\n\t\t} else if(_entry.first == \"output_proofs\") {\n\t\t\t_entry.second.to(output_proofs);\n\t\t} else if(_entry.first == \"reward_addr\") {\n\t\t\t_entry.second.to(reward_addr);\n\t\t} else if(_entry.first == \"storage_path\") {\n\t\t\t_entry.second.to(storage_path);\n\t\t} else if(_entry.first == \"wallet_server\") {\n\t\t\t_entry.second.to(wallet_server);\n\t\t}\n\t}\n}\n\nvnx::Variant TimeLordBase::get_field(const std::string& _name) const {\n\tif(_name == \"input_request\") {\n\t\treturn vnx::Variant(input_request);\n\t}\n\tif(_name == \"output_proofs\") {\n\t\treturn vnx::Variant(output_proofs);\n\t}\n\tif(_name == \"max_history\") {\n\t\treturn vnx::Variant(max_history);\n\t}\n\tif(_name == \"node_server\") {\n\t\treturn vnx::Variant(node_server);\n\t}\n\tif(_name == \"wallet_server\") {\n\t\treturn vnx::Variant(wallet_server);\n\t}\n\tif(_name == \"storage_path\") {\n\t\treturn vnx::Variant(storage_path);\n\t}\n\tif(_name == \"reward_addr\") {\n\t\treturn vnx::Variant(reward_addr);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid TimeLordBase::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"input_request\") {\n\t\t_value.to(input_request);\n\t} else if(_name == \"output_proofs\") {\n\t\t_value.to(output_proofs);\n\t} else if(_name == \"max_history\") {\n\t\t_value.to(max_history);\n\t} else if(_name == \"node_server\") {\n\t\t_value.to(node_server);\n\t} else if(_name == \"wallet_server\") {\n\t\t_value.to(wallet_server);\n\t} else if(_name == \"storage_path\") {\n\t\t_value.to(storage_path);\n\t} else if(_name == \"reward_addr\") {\n\t\t_value.to(reward_addr);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const TimeLordBase& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, TimeLordBase& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* TimeLordBase::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> TimeLordBase::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.TimeLord\";\n\ttype_code->type_hash = vnx::Hash64(0x311081636f6570efull);\n\ttype_code->code_hash = vnx::Hash64(0xeaba05bc99f7eb7full);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::TimeLordBase);\n\ttype_code->methods.resize(10);\n\ttype_code->methods[0] = ::mmx::TimeLord_stop_vdf::static_get_type_code();\n\ttype_code->methods[1] = ::vnx::ModuleInterface_vnx_get_config::static_get_type_code();\n\ttype_code->methods[2] = ::vnx::ModuleInterface_vnx_get_config_object::static_get_type_code();\n\ttype_code->methods[3] = ::vnx::ModuleInterface_vnx_get_module_info::static_get_type_code();\n\ttype_code->methods[4] = ::vnx::ModuleInterface_vnx_get_type_code::static_get_type_code();\n\ttype_code->methods[5] = ::vnx::ModuleInterface_vnx_restart::static_get_type_code();\n\ttype_code->methods[6] = ::vnx::ModuleInterface_vnx_self_test::static_get_type_code();\n\ttype_code->methods[7] = ::vnx::ModuleInterface_vnx_set_config::static_get_type_code();\n\ttype_code->methods[8] = ::vnx::ModuleInterface_vnx_set_config_object::static_get_type_code();\n\ttype_code->methods[9] = ::vnx::ModuleInterface_vnx_stop::static_get_type_code();\n\ttype_code->fields.resize(7);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_request\";\n\t\tfield.value = vnx::to_string(\"timelord.requests\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_proofs\";\n\t\tfield.value = vnx::to_string(\"timelord.proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_history\";\n\t\tfield.value = vnx::to_string(1000000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"node_server\";\n\t\tfield.value = vnx::to_string(\"Node\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"wallet_server\";\n\t\tfield.value = vnx::to_string(\"Wallet\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"storage_path\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_addr\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nvoid TimeLordBase::vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) {\n\tconst auto* _type_code = _value->get_type_code();\n\twhile(_type_code) {\n\t\tswitch(_type_code->type_hash) {\n\t\t\tcase 0xa4e39be061f13d71ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::IntervalRequest>(_value));\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\t_type_code = _type_code->super;\n\t\t}\n\t}\n\thandle(std::static_pointer_cast<const vnx::Value>(_value));\n}\n\nstd::shared_ptr<vnx::Value> TimeLordBase::vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) {\n\tswitch(_method->get_type_hash()) {\n\t\tcase 0xf7f78eb9f371e6e7ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::TimeLord_stop_vdf>(_method);\n\t\t\tauto _return_value = ::mmx::TimeLord_stop_vdf_return::create();\n\t\t\tstop_vdf();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xbbc7f1a01044d294ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config(_args->name);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x17f58f68bf83abc0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_object_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config_object();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf6d82bdf66d034a1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_module_info_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_module_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x305ec4d628960e5dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_type_code_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_type_code();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9e95dc280cecca1bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_restart>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_restart_return::create();\n\t\t\tvnx_restart();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6ce3775b41a42697ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_self_test_return::create();\n\t\t\t_return_value->_ret_0 = vnx_self_test();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x362aac91373958b7ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_return::create();\n\t\t\tvnx_set_config(_args->name, _args->value);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xca30f814f17f322full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_object_return::create();\n\t\t\tvnx_set_config_object(_args->config);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x7ab49ce3d1bfc0d2ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_stop>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_stop_return::create();\n\t\t\tvnx_stop();\n\t\t\treturn _return_value;\n\t\t}\n\t}\n\tauto _ex = vnx::NoSuchMethod::create();\n\t_ex->method = _method->get_type_name();\n\treturn _ex;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::TimeLordBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_history, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.input_request, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.output_proofs, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.node_server, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.wallet_server, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.storage_path, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.reward_addr, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::TimeLordBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_TimeLordBase;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::TimeLordBase>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.max_history);\n\tvnx::write(out, value.input_request, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.output_proofs, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.node_server, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.wallet_server, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.storage_path, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.reward_addr, type_code, type_code->fields[6].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::TimeLordBase& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::TimeLordBase& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::TimeLordBase& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/TimeLordClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/TimeLordClient.hxx>\n#include <mmx/IntervalRequest.hxx>\n#include <mmx/TimeLord_stop_vdf.hxx>\n#include <mmx/TimeLord_stop_vdf_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nTimeLordClient::TimeLordClient(const std::string& service_name)\n\t:\tClient::Client(vnx::Hash64(service_name))\n{\n}\n\nTimeLordClient::TimeLordClient(vnx::Hash64 service_addr)\n\t:\tClient::Client(service_addr)\n{\n}\n\nvoid TimeLordClient::stop_vdf() {\n\tauto _method = ::mmx::TimeLord_stop_vdf::create();\n\tvnx_request(_method, false);\n}\n\nvoid TimeLordClient::stop_vdf_async() {\n\tauto _method = ::mmx::TimeLord_stop_vdf::create();\n\tvnx_request(_method, true);\n}\n\n::vnx::Object TimeLordClient::vnx_get_config_object() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Object>();\n\t} else {\n\t\tthrow std::logic_error(\"TimeLordClient: invalid return value\");\n\t}\n}\n\n::vnx::Variant TimeLordClient::vnx_get_config(const std::string& name) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Variant>();\n\t} else {\n\t\tthrow std::logic_error(\"TimeLordClient: invalid return value\");\n\t}\n}\n\nvoid TimeLordClient::vnx_set_config_object(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, false);\n}\n\nvoid TimeLordClient::vnx_set_config_object_async(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, true);\n}\n\nvoid TimeLordClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, false);\n}\n\nvoid TimeLordClient::vnx_set_config_async(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, true);\n}\n\n::vnx::TypeCode TimeLordClient::vnx_get_type_code() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::TypeCode>();\n\t} else {\n\t\tthrow std::logic_error(\"TimeLordClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::ModuleInfo> TimeLordClient::vnx_get_module_info() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"TimeLordClient: invalid return value\");\n\t}\n}\n\nvoid TimeLordClient::vnx_restart() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, false);\n}\n\nvoid TimeLordClient::vnx_restart_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, true);\n}\n\nvoid TimeLordClient::vnx_stop() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, false);\n}\n\nvoid TimeLordClient::vnx_stop_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, true);\n}\n\nvnx::bool_t TimeLordClient::vnx_self_test() {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::bool_t>();\n\t} else {\n\t\tthrow std::logic_error(\"TimeLordClient: invalid return value\");\n\t}\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/TimeLord_stop_vdf.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/TimeLord_stop_vdf.hxx>\n#include <mmx/TimeLord_stop_vdf_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 TimeLord_stop_vdf::VNX_TYPE_HASH(0xf7f78eb9f371e6e7ull);\nconst vnx::Hash64 TimeLord_stop_vdf::VNX_CODE_HASH(0xead4b68d447b80c7ull);\n\nvnx::Hash64 TimeLord_stop_vdf::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string TimeLord_stop_vdf::get_type_name() const {\n\treturn \"mmx.TimeLord.stop_vdf\";\n}\n\nconst vnx::TypeCode* TimeLord_stop_vdf::get_type_code() const {\n\treturn mmx::vnx_native_type_code_TimeLord_stop_vdf;\n}\n\nstd::shared_ptr<TimeLord_stop_vdf> TimeLord_stop_vdf::create() {\n\treturn std::make_shared<TimeLord_stop_vdf>();\n}\n\nstd::shared_ptr<vnx::Value> TimeLord_stop_vdf::clone() const {\n\treturn std::make_shared<TimeLord_stop_vdf>(*this);\n}\n\nvoid TimeLord_stop_vdf::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid TimeLord_stop_vdf::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid TimeLord_stop_vdf::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_TimeLord_stop_vdf;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid TimeLord_stop_vdf::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.TimeLord.stop_vdf\\\"\";\n\t_out << \"}\";\n}\n\nvoid TimeLord_stop_vdf::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object TimeLord_stop_vdf::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.TimeLord.stop_vdf\";\n\treturn _object;\n}\n\nvoid TimeLord_stop_vdf::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant TimeLord_stop_vdf::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid TimeLord_stop_vdf::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const TimeLord_stop_vdf& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, TimeLord_stop_vdf& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* TimeLord_stop_vdf::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> TimeLord_stop_vdf::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.TimeLord.stop_vdf\";\n\ttype_code->type_hash = vnx::Hash64(0xf7f78eb9f371e6e7ull);\n\ttype_code->code_hash = vnx::Hash64(0xead4b68d447b80c7ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::TimeLord_stop_vdf);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<TimeLord_stop_vdf>(); };\n\ttype_code->return_type = ::mmx::TimeLord_stop_vdf_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::TimeLord_stop_vdf& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::TimeLord_stop_vdf& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_TimeLord_stop_vdf;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::TimeLord_stop_vdf>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::TimeLord_stop_vdf& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::TimeLord_stop_vdf& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::TimeLord_stop_vdf& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/TimeLord_stop_vdf_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/TimeLord_stop_vdf_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 TimeLord_stop_vdf_return::VNX_TYPE_HASH(0x53e37fb500ea3a9full);\nconst vnx::Hash64 TimeLord_stop_vdf_return::VNX_CODE_HASH(0xeff4d46be753f782ull);\n\nvnx::Hash64 TimeLord_stop_vdf_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string TimeLord_stop_vdf_return::get_type_name() const {\n\treturn \"mmx.TimeLord.stop_vdf.return\";\n}\n\nconst vnx::TypeCode* TimeLord_stop_vdf_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_TimeLord_stop_vdf_return;\n}\n\nstd::shared_ptr<TimeLord_stop_vdf_return> TimeLord_stop_vdf_return::create() {\n\treturn std::make_shared<TimeLord_stop_vdf_return>();\n}\n\nstd::shared_ptr<vnx::Value> TimeLord_stop_vdf_return::clone() const {\n\treturn std::make_shared<TimeLord_stop_vdf_return>(*this);\n}\n\nvoid TimeLord_stop_vdf_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid TimeLord_stop_vdf_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid TimeLord_stop_vdf_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_TimeLord_stop_vdf_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid TimeLord_stop_vdf_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.TimeLord.stop_vdf.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid TimeLord_stop_vdf_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object TimeLord_stop_vdf_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.TimeLord.stop_vdf.return\";\n\treturn _object;\n}\n\nvoid TimeLord_stop_vdf_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant TimeLord_stop_vdf_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid TimeLord_stop_vdf_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const TimeLord_stop_vdf_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, TimeLord_stop_vdf_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* TimeLord_stop_vdf_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> TimeLord_stop_vdf_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.TimeLord.stop_vdf.return\";\n\ttype_code->type_hash = vnx::Hash64(0x53e37fb500ea3a9full);\n\ttype_code->code_hash = vnx::Hash64(0xeff4d46be753f782ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::TimeLord_stop_vdf_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<TimeLord_stop_vdf_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::TimeLord_stop_vdf_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::TimeLord_stop_vdf_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_TimeLord_stop_vdf_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::TimeLord_stop_vdf_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::TimeLord_stop_vdf_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::TimeLord_stop_vdf_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::TimeLord_stop_vdf_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Transaction.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/Operation.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/TransactionBase.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/exec_result_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/tx_index_t.hxx>\n#include <mmx/tx_note_e.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/txout_t.hxx>\n#include <mmx/uint128.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nconst uint32_t Transaction::MAX_SOLUTIONS;\n\nconst vnx::Hash64 Transaction::VNX_TYPE_HASH(0xce0462acdceaa5bcull);\nconst vnx::Hash64 Transaction::VNX_CODE_HASH(0x6b823c733d9eab23ull);\n\nvnx::Hash64 Transaction::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Transaction::get_type_name() const {\n\treturn \"mmx.Transaction\";\n}\n\nconst vnx::TypeCode* Transaction::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Transaction;\n}\n\nstd::shared_ptr<Transaction> Transaction::create() {\n\treturn std::make_shared<Transaction>();\n}\n\nstd::shared_ptr<vnx::Value> Transaction::clone() const {\n\treturn std::make_shared<Transaction>(*this);\n}\n\nvoid Transaction::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Transaction::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Transaction::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Transaction;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, id);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, expires);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, fee_ratio);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, static_cost);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, max_fee_amount);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, note);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, nonce);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, network);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, sender);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, inputs);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, outputs);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, execute);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, solutions);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, deploy);\n\t_visitor.type_field(_type_code->fields[15], 15); vnx::accept(_visitor, exec_result);\n\t_visitor.type_field(_type_code->fields[16], 16); vnx::accept(_visitor, content_hash);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Transaction::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Transaction\\\"\";\n\t_out << \", \\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"expires\\\": \"; vnx::write(_out, expires);\n\t_out << \", \\\"fee_ratio\\\": \"; vnx::write(_out, fee_ratio);\n\t_out << \", \\\"static_cost\\\": \"; vnx::write(_out, static_cost);\n\t_out << \", \\\"max_fee_amount\\\": \"; vnx::write(_out, max_fee_amount);\n\t_out << \", \\\"note\\\": \"; vnx::write(_out, note);\n\t_out << \", \\\"nonce\\\": \"; vnx::write(_out, nonce);\n\t_out << \", \\\"network\\\": \"; vnx::write(_out, network);\n\t_out << \", \\\"sender\\\": \"; vnx::write(_out, sender);\n\t_out << \", \\\"inputs\\\": \"; vnx::write(_out, inputs);\n\t_out << \", \\\"outputs\\\": \"; vnx::write(_out, outputs);\n\t_out << \", \\\"execute\\\": \"; vnx::write(_out, execute);\n\t_out << \", \\\"solutions\\\": \"; vnx::write(_out, solutions);\n\t_out << \", \\\"deploy\\\": \"; vnx::write(_out, deploy);\n\t_out << \", \\\"exec_result\\\": \"; vnx::write(_out, exec_result);\n\t_out << \", \\\"content_hash\\\": \"; vnx::write(_out, content_hash);\n\t_out << \"}\";\n}\n\nvoid Transaction::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Transaction::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Transaction\";\n\t_object[\"id\"] = id;\n\t_object[\"version\"] = version;\n\t_object[\"expires\"] = expires;\n\t_object[\"fee_ratio\"] = fee_ratio;\n\t_object[\"static_cost\"] = static_cost;\n\t_object[\"max_fee_amount\"] = max_fee_amount;\n\t_object[\"note\"] = note;\n\t_object[\"nonce\"] = nonce;\n\t_object[\"network\"] = network;\n\t_object[\"sender\"] = sender;\n\t_object[\"inputs\"] = inputs;\n\t_object[\"outputs\"] = outputs;\n\t_object[\"execute\"] = execute;\n\t_object[\"solutions\"] = solutions;\n\t_object[\"deploy\"] = deploy;\n\t_object[\"exec_result\"] = exec_result;\n\t_object[\"content_hash\"] = content_hash;\n\treturn _object;\n}\n\nvoid Transaction::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"content_hash\") {\n\t\t\t_entry.second.to(content_hash);\n\t\t} else if(_entry.first == \"deploy\") {\n\t\t\t_entry.second.to(deploy);\n\t\t} else if(_entry.first == \"exec_result\") {\n\t\t\t_entry.second.to(exec_result);\n\t\t} else if(_entry.first == \"execute\") {\n\t\t\t_entry.second.to(execute);\n\t\t} else if(_entry.first == \"expires\") {\n\t\t\t_entry.second.to(expires);\n\t\t} else if(_entry.first == \"fee_ratio\") {\n\t\t\t_entry.second.to(fee_ratio);\n\t\t} else if(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t} else if(_entry.first == \"inputs\") {\n\t\t\t_entry.second.to(inputs);\n\t\t} else if(_entry.first == \"max_fee_amount\") {\n\t\t\t_entry.second.to(max_fee_amount);\n\t\t} else if(_entry.first == \"network\") {\n\t\t\t_entry.second.to(network);\n\t\t} else if(_entry.first == \"nonce\") {\n\t\t\t_entry.second.to(nonce);\n\t\t} else if(_entry.first == \"note\") {\n\t\t\t_entry.second.to(note);\n\t\t} else if(_entry.first == \"outputs\") {\n\t\t\t_entry.second.to(outputs);\n\t\t} else if(_entry.first == \"sender\") {\n\t\t\t_entry.second.to(sender);\n\t\t} else if(_entry.first == \"solutions\") {\n\t\t\t_entry.second.to(solutions);\n\t\t} else if(_entry.first == \"static_cost\") {\n\t\t\t_entry.second.to(static_cost);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant Transaction::get_field(const std::string& _name) const {\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"expires\") {\n\t\treturn vnx::Variant(expires);\n\t}\n\tif(_name == \"fee_ratio\") {\n\t\treturn vnx::Variant(fee_ratio);\n\t}\n\tif(_name == \"static_cost\") {\n\t\treturn vnx::Variant(static_cost);\n\t}\n\tif(_name == \"max_fee_amount\") {\n\t\treturn vnx::Variant(max_fee_amount);\n\t}\n\tif(_name == \"note\") {\n\t\treturn vnx::Variant(note);\n\t}\n\tif(_name == \"nonce\") {\n\t\treturn vnx::Variant(nonce);\n\t}\n\tif(_name == \"network\") {\n\t\treturn vnx::Variant(network);\n\t}\n\tif(_name == \"sender\") {\n\t\treturn vnx::Variant(sender);\n\t}\n\tif(_name == \"inputs\") {\n\t\treturn vnx::Variant(inputs);\n\t}\n\tif(_name == \"outputs\") {\n\t\treturn vnx::Variant(outputs);\n\t}\n\tif(_name == \"execute\") {\n\t\treturn vnx::Variant(execute);\n\t}\n\tif(_name == \"solutions\") {\n\t\treturn vnx::Variant(solutions);\n\t}\n\tif(_name == \"deploy\") {\n\t\treturn vnx::Variant(deploy);\n\t}\n\tif(_name == \"exec_result\") {\n\t\treturn vnx::Variant(exec_result);\n\t}\n\tif(_name == \"content_hash\") {\n\t\treturn vnx::Variant(content_hash);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Transaction::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"id\") {\n\t\t_value.to(id);\n\t} else if(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"expires\") {\n\t\t_value.to(expires);\n\t} else if(_name == \"fee_ratio\") {\n\t\t_value.to(fee_ratio);\n\t} else if(_name == \"static_cost\") {\n\t\t_value.to(static_cost);\n\t} else if(_name == \"max_fee_amount\") {\n\t\t_value.to(max_fee_amount);\n\t} else if(_name == \"note\") {\n\t\t_value.to(note);\n\t} else if(_name == \"nonce\") {\n\t\t_value.to(nonce);\n\t} else if(_name == \"network\") {\n\t\t_value.to(network);\n\t} else if(_name == \"sender\") {\n\t\t_value.to(sender);\n\t} else if(_name == \"inputs\") {\n\t\t_value.to(inputs);\n\t} else if(_name == \"outputs\") {\n\t\t_value.to(outputs);\n\t} else if(_name == \"execute\") {\n\t\t_value.to(execute);\n\t} else if(_name == \"solutions\") {\n\t\t_value.to(solutions);\n\t} else if(_name == \"deploy\") {\n\t\t_value.to(deploy);\n\t} else if(_name == \"exec_result\") {\n\t\t_value.to(exec_result);\n\t} else if(_name == \"content_hash\") {\n\t\t_value.to(content_hash);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Transaction& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Transaction& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Transaction::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Transaction::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Transaction\";\n\ttype_code->type_hash = vnx::Hash64(0xce0462acdceaa5bcull);\n\ttype_code->code_hash = vnx::Hash64(0x6b823c733d9eab23ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::Transaction);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::TransactionBase::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Transaction>(); };\n\ttype_code->depends.resize(4);\n\ttype_code->depends[0] = ::mmx::tx_note_e::static_get_type_code();\n\ttype_code->depends[1] = ::mmx::txin_t::static_get_type_code();\n\ttype_code->depends[2] = ::mmx::txout_t::static_get_type_code();\n\ttype_code->depends[3] = ::mmx::exec_result_t::static_get_type_code();\n\ttype_code->fields.resize(17);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"expires\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"fee_ratio\";\n\t\tfield.value = vnx::to_string(1024);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"static_cost\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_fee_amount\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"note\";\n\t\tfield.code = {19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"nonce\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"network\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"sender\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"inputs\";\n\t\tfield.code = {12, 19, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"outputs\";\n\t\tfield.code = {12, 19, 2};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"execute\";\n\t\tfield.code = {12, 16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"solutions\";\n\t\tfield.code = {12, 16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"deploy\";\n\t\tfield.code = {16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[15];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"exec_result\";\n\t\tfield.code = {33, 19, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[16];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"content_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> Transaction::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.expires, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.fee_ratio, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.static_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_fee_amount, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.nonce, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.id, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.note, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.network, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.sender, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.inputs, type_code, _field->code.data()); break;\n\t\t\tcase 11: vnx::read(in, value.outputs, type_code, _field->code.data()); break;\n\t\t\tcase 12: vnx::read(in, value.execute, type_code, _field->code.data()); break;\n\t\t\tcase 13: vnx::read(in, value.solutions, type_code, _field->code.data()); break;\n\t\t\tcase 14: vnx::read(in, value.deploy, type_code, _field->code.data()); break;\n\t\t\tcase 15: vnx::read(in, value.exec_result, type_code, _field->code.data()); break;\n\t\t\tcase 16: vnx::read(in, value.content_hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Transaction& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Transaction;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Transaction>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(28);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write_value(_buf + 4, value.expires);\n\tvnx::write_value(_buf + 8, value.fee_ratio);\n\tvnx::write_value(_buf + 12, value.static_cost);\n\tvnx::write_value(_buf + 16, value.max_fee_amount);\n\tvnx::write_value(_buf + 20, value.nonce);\n\tvnx::write(out, value.id, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.note, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.network, type_code, type_code->fields[8].code.data());\n\tvnx::write(out, value.sender, type_code, type_code->fields[9].code.data());\n\tvnx::write(out, value.inputs, type_code, type_code->fields[10].code.data());\n\tvnx::write(out, value.outputs, type_code, type_code->fields[11].code.data());\n\tvnx::write(out, value.execute, type_code, type_code->fields[12].code.data());\n\tvnx::write(out, value.solutions, type_code, type_code->fields[13].code.data());\n\tvnx::write(out, value.deploy, type_code, type_code->fields[14].code.data());\n\tvnx::write(out, value.exec_result, type_code, type_code->fields[15].code.data());\n\tvnx::write(out, value.content_hash, type_code, type_code->fields[16].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Transaction& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Transaction& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Transaction& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/TransactionBase.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/TransactionBase.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 TransactionBase::VNX_TYPE_HASH(0x6697ffbf3611887dull);\nconst vnx::Hash64 TransactionBase::VNX_CODE_HASH(0x2693a4e1bdd90f6eull);\n\nvnx::Hash64 TransactionBase::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string TransactionBase::get_type_name() const {\n\treturn \"mmx.TransactionBase\";\n}\n\nconst vnx::TypeCode* TransactionBase::get_type_code() const {\n\treturn mmx::vnx_native_type_code_TransactionBase;\n}\n\nstd::shared_ptr<TransactionBase> TransactionBase::create() {\n\treturn std::make_shared<TransactionBase>();\n}\n\nstd::shared_ptr<vnx::Value> TransactionBase::clone() const {\n\treturn std::make_shared<TransactionBase>(*this);\n}\n\nvoid TransactionBase::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid TransactionBase::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid TransactionBase::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_TransactionBase;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, id);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid TransactionBase::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.TransactionBase\\\"\";\n\t_out << \", \\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \"}\";\n}\n\nvoid TransactionBase::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object TransactionBase::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.TransactionBase\";\n\t_object[\"id\"] = id;\n\treturn _object;\n}\n\nvoid TransactionBase::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t}\n\t}\n}\n\nvnx::Variant TransactionBase::get_field(const std::string& _name) const {\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid TransactionBase::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"id\") {\n\t\t_value.to(id);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const TransactionBase& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, TransactionBase& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* TransactionBase::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> TransactionBase::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.TransactionBase\";\n\ttype_code->type_hash = vnx::Hash64(0x6697ffbf3611887dull);\n\ttype_code->code_hash = vnx::Hash64(0x2693a4e1bdd90f6eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::TransactionBase);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<TransactionBase>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> TransactionBase::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::TransactionBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.id, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::TransactionBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_TransactionBase;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::TransactionBase>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.id, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::TransactionBase& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::TransactionBase& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::TransactionBase& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/VDF_Point.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 VDF_Point::VNX_TYPE_HASH(0x1671551501b6c956ull);\nconst vnx::Hash64 VDF_Point::VNX_CODE_HASH(0x5031dd26ac22d68eull);\n\nvnx::Hash64 VDF_Point::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string VDF_Point::get_type_name() const {\n\treturn \"mmx.VDF_Point\";\n}\n\nconst vnx::TypeCode* VDF_Point::get_type_code() const {\n\treturn mmx::vnx_native_type_code_VDF_Point;\n}\n\nstd::shared_ptr<VDF_Point> VDF_Point::create() {\n\treturn std::make_shared<VDF_Point>();\n}\n\nstd::shared_ptr<vnx::Value> VDF_Point::clone() const {\n\treturn std::make_shared<VDF_Point>(*this);\n}\n\nvoid VDF_Point::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid VDF_Point::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid VDF_Point::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_VDF_Point;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, vdf_height);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, start);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, num_iters);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, input);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, output);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, prev);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, reward_addr);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, content_hash);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, recv_time);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, proof);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid VDF_Point::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.VDF_Point\\\"\";\n\t_out << \", \\\"vdf_height\\\": \"; vnx::write(_out, vdf_height);\n\t_out << \", \\\"start\\\": \"; vnx::write(_out, start);\n\t_out << \", \\\"num_iters\\\": \"; vnx::write(_out, num_iters);\n\t_out << \", \\\"input\\\": \"; vnx::write(_out, input);\n\t_out << \", \\\"output\\\": \"; vnx::write(_out, output);\n\t_out << \", \\\"prev\\\": \"; vnx::write(_out, prev);\n\t_out << \", \\\"reward_addr\\\": \"; vnx::write(_out, reward_addr);\n\t_out << \", \\\"content_hash\\\": \"; vnx::write(_out, content_hash);\n\t_out << \", \\\"recv_time\\\": \"; vnx::write(_out, recv_time);\n\t_out << \", \\\"proof\\\": \"; vnx::write(_out, proof);\n\t_out << \"}\";\n}\n\nvoid VDF_Point::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object VDF_Point::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.VDF_Point\";\n\t_object[\"vdf_height\"] = vdf_height;\n\t_object[\"start\"] = start;\n\t_object[\"num_iters\"] = num_iters;\n\t_object[\"input\"] = input;\n\t_object[\"output\"] = output;\n\t_object[\"prev\"] = prev;\n\t_object[\"reward_addr\"] = reward_addr;\n\t_object[\"content_hash\"] = content_hash;\n\t_object[\"recv_time\"] = recv_time;\n\t_object[\"proof\"] = proof;\n\treturn _object;\n}\n\nvoid VDF_Point::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"content_hash\") {\n\t\t\t_entry.second.to(content_hash);\n\t\t} else if(_entry.first == \"input\") {\n\t\t\t_entry.second.to(input);\n\t\t} else if(_entry.first == \"num_iters\") {\n\t\t\t_entry.second.to(num_iters);\n\t\t} else if(_entry.first == \"output\") {\n\t\t\t_entry.second.to(output);\n\t\t} else if(_entry.first == \"prev\") {\n\t\t\t_entry.second.to(prev);\n\t\t} else if(_entry.first == \"proof\") {\n\t\t\t_entry.second.to(proof);\n\t\t} else if(_entry.first == \"recv_time\") {\n\t\t\t_entry.second.to(recv_time);\n\t\t} else if(_entry.first == \"reward_addr\") {\n\t\t\t_entry.second.to(reward_addr);\n\t\t} else if(_entry.first == \"start\") {\n\t\t\t_entry.second.to(start);\n\t\t} else if(_entry.first == \"vdf_height\") {\n\t\t\t_entry.second.to(vdf_height);\n\t\t}\n\t}\n}\n\nvnx::Variant VDF_Point::get_field(const std::string& _name) const {\n\tif(_name == \"vdf_height\") {\n\t\treturn vnx::Variant(vdf_height);\n\t}\n\tif(_name == \"start\") {\n\t\treturn vnx::Variant(start);\n\t}\n\tif(_name == \"num_iters\") {\n\t\treturn vnx::Variant(num_iters);\n\t}\n\tif(_name == \"input\") {\n\t\treturn vnx::Variant(input);\n\t}\n\tif(_name == \"output\") {\n\t\treturn vnx::Variant(output);\n\t}\n\tif(_name == \"prev\") {\n\t\treturn vnx::Variant(prev);\n\t}\n\tif(_name == \"reward_addr\") {\n\t\treturn vnx::Variant(reward_addr);\n\t}\n\tif(_name == \"content_hash\") {\n\t\treturn vnx::Variant(content_hash);\n\t}\n\tif(_name == \"recv_time\") {\n\t\treturn vnx::Variant(recv_time);\n\t}\n\tif(_name == \"proof\") {\n\t\treturn vnx::Variant(proof);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid VDF_Point::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"vdf_height\") {\n\t\t_value.to(vdf_height);\n\t} else if(_name == \"start\") {\n\t\t_value.to(start);\n\t} else if(_name == \"num_iters\") {\n\t\t_value.to(num_iters);\n\t} else if(_name == \"input\") {\n\t\t_value.to(input);\n\t} else if(_name == \"output\") {\n\t\t_value.to(output);\n\t} else if(_name == \"prev\") {\n\t\t_value.to(prev);\n\t} else if(_name == \"reward_addr\") {\n\t\t_value.to(reward_addr);\n\t} else if(_name == \"content_hash\") {\n\t\t_value.to(content_hash);\n\t} else if(_name == \"recv_time\") {\n\t\t_value.to(recv_time);\n\t} else if(_name == \"proof\") {\n\t\t_value.to(proof);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const VDF_Point& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, VDF_Point& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* VDF_Point::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> VDF_Point::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.VDF_Point\";\n\ttype_code->type_hash = vnx::Hash64(0x1671551501b6c956ull);\n\ttype_code->code_hash = vnx::Hash64(0x5031dd26ac22d68eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::VDF_Point);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<VDF_Point>(); };\n\ttype_code->fields.resize(10);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"vdf_height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"start\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"num_iters\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"prev\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_addr\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"content_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"recv_time\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"proof\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> VDF_Point::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::VDF_Point& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.vdf_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.start, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_iters, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.recv_time, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 3: vnx::read(in, value.input, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.output, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.prev, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.reward_addr, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.content_hash, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.proof, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::VDF_Point& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_VDF_Point;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::VDF_Point>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(28);\n\tvnx::write_value(_buf + 0, value.vdf_height);\n\tvnx::write_value(_buf + 4, value.start);\n\tvnx::write_value(_buf + 12, value.num_iters);\n\tvnx::write_value(_buf + 20, value.recv_time);\n\tvnx::write(out, value.input, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.output, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.prev, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.reward_addr, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.content_hash, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.proof, type_code, type_code->fields[9].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::VDF_Point& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::VDF_Point& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::VDF_Point& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ValidatorVote.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ValidatorVote::VNX_TYPE_HASH(0xc056a2ff24cdee25ull);\nconst vnx::Hash64 ValidatorVote::VNX_CODE_HASH(0xa8f4941cde83ae41ull);\n\nvnx::Hash64 ValidatorVote::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ValidatorVote::get_type_name() const {\n\treturn \"mmx.ValidatorVote\";\n}\n\nconst vnx::TypeCode* ValidatorVote::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ValidatorVote;\n}\n\nstd::shared_ptr<ValidatorVote> ValidatorVote::create() {\n\treturn std::make_shared<ValidatorVote>();\n}\n\nstd::shared_ptr<vnx::Value> ValidatorVote::clone() const {\n\treturn std::make_shared<ValidatorVote>(*this);\n}\n\nvoid ValidatorVote::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid ValidatorVote::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid ValidatorVote::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ValidatorVote;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, hash);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, farmer_key);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, farmer_sig);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, content_hash);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ValidatorVote::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.ValidatorVote\\\"\";\n\t_out << \", \\\"hash\\\": \"; vnx::write(_out, hash);\n\t_out << \", \\\"farmer_key\\\": \"; vnx::write(_out, farmer_key);\n\t_out << \", \\\"farmer_sig\\\": \"; vnx::write(_out, farmer_sig);\n\t_out << \", \\\"content_hash\\\": \"; vnx::write(_out, content_hash);\n\t_out << \"}\";\n}\n\nvoid ValidatorVote::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ValidatorVote::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ValidatorVote\";\n\t_object[\"hash\"] = hash;\n\t_object[\"farmer_key\"] = farmer_key;\n\t_object[\"farmer_sig\"] = farmer_sig;\n\t_object[\"content_hash\"] = content_hash;\n\treturn _object;\n}\n\nvoid ValidatorVote::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"content_hash\") {\n\t\t\t_entry.second.to(content_hash);\n\t\t} else if(_entry.first == \"farmer_key\") {\n\t\t\t_entry.second.to(farmer_key);\n\t\t} else if(_entry.first == \"farmer_sig\") {\n\t\t\t_entry.second.to(farmer_sig);\n\t\t} else if(_entry.first == \"hash\") {\n\t\t\t_entry.second.to(hash);\n\t\t}\n\t}\n}\n\nvnx::Variant ValidatorVote::get_field(const std::string& _name) const {\n\tif(_name == \"hash\") {\n\t\treturn vnx::Variant(hash);\n\t}\n\tif(_name == \"farmer_key\") {\n\t\treturn vnx::Variant(farmer_key);\n\t}\n\tif(_name == \"farmer_sig\") {\n\t\treturn vnx::Variant(farmer_sig);\n\t}\n\tif(_name == \"content_hash\") {\n\t\treturn vnx::Variant(content_hash);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ValidatorVote::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"hash\") {\n\t\t_value.to(hash);\n\t} else if(_name == \"farmer_key\") {\n\t\t_value.to(farmer_key);\n\t} else if(_name == \"farmer_sig\") {\n\t\t_value.to(farmer_sig);\n\t} else if(_name == \"content_hash\") {\n\t\t_value.to(content_hash);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ValidatorVote& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ValidatorVote& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ValidatorVote::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ValidatorVote::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ValidatorVote\";\n\ttype_code->type_hash = vnx::Hash64(0xc056a2ff24cdee25ull);\n\ttype_code->code_hash = vnx::Hash64(0xa8f4941cde83ae41ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::ValidatorVote);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<ValidatorVote>(); };\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_key\";\n\t\tfield.code = {11, 33, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_sig\";\n\t\tfield.code = {11, 64, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"content_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> ValidatorVote::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ValidatorVote& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.hash, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.farmer_key, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.farmer_sig, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.content_hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ValidatorVote& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ValidatorVote;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ValidatorVote>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.hash, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.farmer_key, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.farmer_sig, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.content_hash, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::ValidatorVote& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ValidatorVote& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ValidatorVote& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/WalletAsyncClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/WalletAsyncClient.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/Wallet_accept_offer.hxx>\n#include <mmx/Wallet_accept_offer_return.hxx>\n#include <mmx/Wallet_add_account.hxx>\n#include <mmx/Wallet_add_account_return.hxx>\n#include <mmx/Wallet_add_token.hxx>\n#include <mmx/Wallet_add_token_return.hxx>\n#include <mmx/Wallet_cancel_offer.hxx>\n#include <mmx/Wallet_cancel_offer_return.hxx>\n#include <mmx/Wallet_complete.hxx>\n#include <mmx/Wallet_complete_return.hxx>\n#include <mmx/Wallet_create_account.hxx>\n#include <mmx/Wallet_create_account_return.hxx>\n#include <mmx/Wallet_create_wallet.hxx>\n#include <mmx/Wallet_create_wallet_return.hxx>\n#include <mmx/Wallet_deploy.hxx>\n#include <mmx/Wallet_deploy_return.hxx>\n#include <mmx/Wallet_deposit.hxx>\n#include <mmx/Wallet_deposit_return.hxx>\n#include <mmx/Wallet_execute.hxx>\n#include <mmx/Wallet_execute_return.hxx>\n#include <mmx/Wallet_export_wallet.hxx>\n#include <mmx/Wallet_export_wallet_return.hxx>\n#include <mmx/Wallet_find_wallet_by_addr.hxx>\n#include <mmx/Wallet_find_wallet_by_addr_return.hxx>\n#include <mmx/Wallet_gather_inputs_for.hxx>\n#include <mmx/Wallet_gather_inputs_for_return.hxx>\n#include <mmx/Wallet_get_account.hxx>\n#include <mmx/Wallet_get_account_return.hxx>\n#include <mmx/Wallet_get_address.hxx>\n#include <mmx/Wallet_get_address_return.hxx>\n#include <mmx/Wallet_get_all_accounts.hxx>\n#include <mmx/Wallet_get_all_accounts_return.hxx>\n#include <mmx/Wallet_get_all_addresses.hxx>\n#include <mmx/Wallet_get_all_addresses_return.hxx>\n#include <mmx/Wallet_get_all_farmer_keys.hxx>\n#include <mmx/Wallet_get_all_farmer_keys_return.hxx>\n#include <mmx/Wallet_get_balance.hxx>\n#include <mmx/Wallet_get_balance_return.hxx>\n#include <mmx/Wallet_get_balances.hxx>\n#include <mmx/Wallet_get_balances_return.hxx>\n#include <mmx/Wallet_get_contract_balances.hxx>\n#include <mmx/Wallet_get_contract_balances_return.hxx>\n#include <mmx/Wallet_get_contracts.hxx>\n#include <mmx/Wallet_get_contracts_return.hxx>\n#include <mmx/Wallet_get_contracts_owned.hxx>\n#include <mmx/Wallet_get_contracts_owned_return.hxx>\n#include <mmx/Wallet_get_farmer_keys.hxx>\n#include <mmx/Wallet_get_farmer_keys_return.hxx>\n#include <mmx/Wallet_get_history.hxx>\n#include <mmx/Wallet_get_history_return.hxx>\n#include <mmx/Wallet_get_master_seed.hxx>\n#include <mmx/Wallet_get_master_seed_return.hxx>\n#include <mmx/Wallet_get_mnemonic_seed.hxx>\n#include <mmx/Wallet_get_mnemonic_seed_return.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist_return.hxx>\n#include <mmx/Wallet_get_offers.hxx>\n#include <mmx/Wallet_get_offers_return.hxx>\n#include <mmx/Wallet_get_swap_liquidity.hxx>\n#include <mmx/Wallet_get_swap_liquidity_return.hxx>\n#include <mmx/Wallet_get_token_list.hxx>\n#include <mmx/Wallet_get_token_list_return.hxx>\n#include <mmx/Wallet_get_total_balances.hxx>\n#include <mmx/Wallet_get_total_balances_return.hxx>\n#include <mmx/Wallet_get_tx_log.hxx>\n#include <mmx/Wallet_get_tx_log_return.hxx>\n#include <mmx/Wallet_import_wallet.hxx>\n#include <mmx/Wallet_import_wallet_return.hxx>\n#include <mmx/Wallet_is_locked.hxx>\n#include <mmx/Wallet_is_locked_return.hxx>\n#include <mmx/Wallet_lock.hxx>\n#include <mmx/Wallet_lock_return.hxx>\n#include <mmx/Wallet_make_offer.hxx>\n#include <mmx/Wallet_make_offer_return.hxx>\n#include <mmx/Wallet_mark_spent.hxx>\n#include <mmx/Wallet_mark_spent_return.hxx>\n#include <mmx/Wallet_offer_trade.hxx>\n#include <mmx/Wallet_offer_trade_return.hxx>\n#include <mmx/Wallet_offer_withdraw.hxx>\n#include <mmx/Wallet_offer_withdraw_return.hxx>\n#include <mmx/Wallet_plotnft_create.hxx>\n#include <mmx/Wallet_plotnft_create_return.hxx>\n#include <mmx/Wallet_plotnft_exec.hxx>\n#include <mmx/Wallet_plotnft_exec_return.hxx>\n#include <mmx/Wallet_release.hxx>\n#include <mmx/Wallet_release_return.hxx>\n#include <mmx/Wallet_release_all.hxx>\n#include <mmx/Wallet_release_all_return.hxx>\n#include <mmx/Wallet_rem_token.hxx>\n#include <mmx/Wallet_rem_token_return.hxx>\n#include <mmx/Wallet_remove_account.hxx>\n#include <mmx/Wallet_remove_account_return.hxx>\n#include <mmx/Wallet_reserve.hxx>\n#include <mmx/Wallet_reserve_return.hxx>\n#include <mmx/Wallet_reset_cache.hxx>\n#include <mmx/Wallet_reset_cache_return.hxx>\n#include <mmx/Wallet_send.hxx>\n#include <mmx/Wallet_send_return.hxx>\n#include <mmx/Wallet_send_from.hxx>\n#include <mmx/Wallet_send_from_return.hxx>\n#include <mmx/Wallet_send_many.hxx>\n#include <mmx/Wallet_send_many_return.hxx>\n#include <mmx/Wallet_send_off.hxx>\n#include <mmx/Wallet_send_off_return.hxx>\n#include <mmx/Wallet_set_address_count.hxx>\n#include <mmx/Wallet_set_address_count_return.hxx>\n#include <mmx/Wallet_sign_msg.hxx>\n#include <mmx/Wallet_sign_msg_return.hxx>\n#include <mmx/Wallet_sign_off.hxx>\n#include <mmx/Wallet_sign_off_return.hxx>\n#include <mmx/Wallet_swap_add_liquid.hxx>\n#include <mmx/Wallet_swap_add_liquid_return.hxx>\n#include <mmx/Wallet_swap_rem_liquid.hxx>\n#include <mmx/Wallet_swap_rem_liquid_return.hxx>\n#include <mmx/Wallet_swap_trade.hxx>\n#include <mmx/Wallet_swap_trade_return.hxx>\n#include <mmx/Wallet_unlock.hxx>\n#include <mmx/Wallet_unlock_return.hxx>\n#include <mmx/Wallet_update_cache.hxx>\n#include <mmx/Wallet_update_cache_return.hxx>\n#include <mmx/account_info_t.hxx>\n#include <mmx/account_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/skey_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_log_entry_t.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nWalletAsyncClient::WalletAsyncClient(const std::string& service_name)\n\t:\tAsyncClient::AsyncClient(vnx::Hash64(service_name))\n{\n}\n\nWalletAsyncClient::WalletAsyncClient(vnx::Hash64 service_addr)\n\t:\tAsyncClient::AsyncClient(service_addr)\n{\n}\n\nuint64_t WalletAsyncClient::send(const uint32_t& index, const ::mmx::uint128& amount, const ::mmx::addr_t& dst_addr, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_send::create();\n\t_method->index = index;\n\t_method->amount = amount;\n\t_method->dst_addr = dst_addr;\n\t_method->currency = currency;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 0;\n\t\tvnx_queue_send[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::send_many(const uint32_t& index, const std::vector<std::pair<::mmx::addr_t, ::mmx::uint128>>& amounts, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_send_many::create();\n\t_method->index = index;\n\t_method->amounts = amounts;\n\t_method->currency = currency;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 1;\n\t\tvnx_queue_send_many[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::send_from(const uint32_t& index, const ::mmx::uint128& amount, const ::mmx::addr_t& dst_addr, const ::mmx::addr_t& src_addr, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_send_from::create();\n\t_method->index = index;\n\t_method->amount = amount;\n\t_method->dst_addr = dst_addr;\n\t_method->src_addr = src_addr;\n\t_method->currency = currency;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 2;\n\t\tvnx_queue_send_from[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::deploy(const uint32_t& index, std::shared_ptr<const ::mmx::Contract> contract, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_deploy::create();\n\t_method->index = index;\n\t_method->contract = contract;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 3;\n\t\tvnx_queue_deploy[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::execute(const uint32_t& index, const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const vnx::optional<uint32_t>& user, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_execute::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->method = method;\n\t_method->args = args;\n\t_method->user = user;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 4;\n\t\tvnx_queue_execute[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::deposit(const uint32_t& index, const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const ::mmx::uint128& amount, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_deposit::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->method = method;\n\t_method->args = args;\n\t_method->amount = amount;\n\t_method->currency = currency;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 5;\n\t\tvnx_queue_deposit[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::make_offer(const uint32_t& index, const uint32_t& owner, const ::mmx::uint128& bid_amount, const ::mmx::addr_t& bid_currency, const ::mmx::uint128& ask_amount, const ::mmx::addr_t& ask_currency, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_make_offer::create();\n\t_method->index = index;\n\t_method->owner = owner;\n\t_method->bid_amount = bid_amount;\n\t_method->bid_currency = bid_currency;\n\t_method->ask_amount = ask_amount;\n\t_method->ask_currency = ask_currency;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 6;\n\t\tvnx_queue_make_offer[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::offer_trade(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::uint128& amount, const uint32_t& dst_addr, const ::mmx::uint128& price, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_offer_trade::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->amount = amount;\n\t_method->dst_addr = dst_addr;\n\t_method->price = price;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 7;\n\t\tvnx_queue_offer_trade[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::offer_withdraw(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_offer_withdraw::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 8;\n\t\tvnx_queue_offer_withdraw[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::accept_offer(const uint32_t& index, const ::mmx::addr_t& address, const uint32_t& dst_addr, const ::mmx::uint128& price, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_accept_offer::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->dst_addr = dst_addr;\n\t_method->price = price;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 9;\n\t\tvnx_queue_accept_offer[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::cancel_offer(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_cancel_offer::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 10;\n\t\tvnx_queue_cancel_offer[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::swap_trade(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::uint128& amount, const ::mmx::addr_t& currency, const vnx::optional<::mmx::uint128>& min_trade, const int32_t& num_iter, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_swap_trade::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->amount = amount;\n\t_method->currency = currency;\n\t_method->min_trade = min_trade;\n\t_method->num_iter = num_iter;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 11;\n\t\tvnx_queue_swap_trade[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::swap_add_liquid(const uint32_t& index, const ::mmx::addr_t& address, const std::array<::mmx::uint128, 2>& amount, const uint32_t& pool_idx, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_swap_add_liquid::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->amount = amount;\n\t_method->pool_idx = pool_idx;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 12;\n\t\tvnx_queue_swap_add_liquid[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::swap_rem_liquid(const uint32_t& index, const ::mmx::addr_t& address, const std::array<::mmx::uint128, 2>& amount, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_swap_rem_liquid::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->amount = amount;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 13;\n\t\tvnx_queue_swap_rem_liquid[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::plotnft_exec(const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_plotnft_exec::create();\n\t_method->address = address;\n\t_method->method = method;\n\t_method->args = args;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 14;\n\t\tvnx_queue_plotnft_exec[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::plotnft_create(const uint32_t& index, const std::string& name, const vnx::optional<uint32_t>& owner, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_plotnft_create::create();\n\t_method->index = index;\n\t_method->name = name;\n\t_method->owner = owner;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 15;\n\t\tvnx_queue_plotnft_create[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::complete(const uint32_t& index, std::shared_ptr<const ::mmx::Transaction> tx, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_complete::create();\n\t_method->index = index;\n\t_method->tx = tx;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 16;\n\t\tvnx_queue_complete[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::sign_off(const uint32_t& index, std::shared_ptr<const ::mmx::Transaction> tx, const ::mmx::spend_options_t& options, const std::function<void(std::shared_ptr<const ::mmx::Transaction>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_sign_off::create();\n\t_method->index = index;\n\t_method->tx = tx;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 17;\n\t\tvnx_queue_sign_off[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::sign_msg(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::hash_t& msg, const std::function<void(std::shared_ptr<const ::mmx::Solution>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_sign_msg::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->msg = msg;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 18;\n\t\tvnx_queue_sign_msg[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::send_off(const uint32_t& index, std::shared_ptr<const ::mmx::Transaction> tx, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_send_off::create();\n\t_method->index = index;\n\t_method->tx = tx;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 19;\n\t\tvnx_queue_send_off[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::mark_spent(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_mark_spent::create();\n\t_method->index = index;\n\t_method->amounts = amounts;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 20;\n\t\tvnx_queue_mark_spent[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::reserve(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_reserve::create();\n\t_method->index = index;\n\t_method->amounts = amounts;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 21;\n\t\tvnx_queue_reserve[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::release(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_release::create();\n\t_method->index = index;\n\t_method->amounts = amounts;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 22;\n\t\tvnx_queue_release[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::release_all(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_release_all::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 23;\n\t\tvnx_queue_release_all[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::reset_cache(const uint32_t& index, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_reset_cache::create();\n\t_method->index = index;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 24;\n\t\tvnx_queue_reset_cache[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::update_cache(const uint32_t& index, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_update_cache::create();\n\t_method->index = index;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 25;\n\t\tvnx_queue_update_cache[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_history(const uint32_t& index, const ::mmx::query_filter_t& filter, const std::function<void(const std::vector<::mmx::tx_entry_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_history::create();\n\t_method->index = index;\n\t_method->filter = filter;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 26;\n\t\tvnx_queue_get_history[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_tx_log(const uint32_t& index, const int32_t& limit, const std::function<void(const std::vector<::mmx::tx_log_entry_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_tx_log::create();\n\t_method->index = index;\n\t_method->limit = limit;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 27;\n\t\tvnx_queue_get_tx_log[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::gather_inputs_for(const uint32_t& index, const ::mmx::uint128& amount, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options, const std::function<void(const std::vector<::mmx::txin_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_gather_inputs_for::create();\n\t_method->index = index;\n\t_method->amount = amount;\n\t_method->currency = currency;\n\t_method->options = options;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 28;\n\t\tvnx_queue_gather_inputs_for[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_balance(const uint32_t& index, const ::mmx::addr_t& currency, const std::function<void(const ::mmx::balance_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_balance::create();\n\t_method->index = index;\n\t_method->currency = currency;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 29;\n\t\tvnx_queue_get_balance[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_balances(const uint32_t& index, const vnx::bool_t& with_zero, const std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_balances::create();\n\t_method->index = index;\n\t_method->with_zero = with_zero;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 30;\n\t\tvnx_queue_get_balances[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_total_balances(const std::vector<::mmx::addr_t>& addresses, const std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_total_balances::create();\n\t_method->addresses = addresses;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 31;\n\t\tvnx_queue_get_total_balances[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_contract_balances(const ::mmx::addr_t& address, const std::function<void(const std::map<::mmx::addr_t, ::mmx::balance_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_contract_balances::create();\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 32;\n\t\tvnx_queue_get_contract_balances[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_contracts(const uint32_t& index, const vnx::optional<std::string>& type_name, const vnx::optional<::mmx::hash_t>& type_hash, const std::function<void(const std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_contracts::create();\n\t_method->index = index;\n\t_method->type_name = type_name;\n\t_method->type_hash = type_hash;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 33;\n\t\tvnx_queue_get_contracts[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_contracts_owned(const uint32_t& index, const vnx::optional<std::string>& type_name, const vnx::optional<::mmx::hash_t>& type_hash, const std::function<void(const std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_contracts_owned::create();\n\t_method->index = index;\n\t_method->type_name = type_name;\n\t_method->type_hash = type_hash;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 34;\n\t\tvnx_queue_get_contracts_owned[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_offers(const uint32_t& index, const vnx::bool_t& state, const std::function<void(const std::vector<::mmx::offer_data_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_offers::create();\n\t_method->index = index;\n\t_method->state = state;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 35;\n\t\tvnx_queue_get_offers[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_swap_liquidity(const uint32_t& index, const std::function<void(const std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_swap_liquidity::create();\n\t_method->index = index;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 36;\n\t\tvnx_queue_get_swap_liquidity[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_address(const uint32_t& index, const uint32_t& offset, const std::function<void(const ::mmx::addr_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_address::create();\n\t_method->index = index;\n\t_method->offset = offset;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 37;\n\t\tvnx_queue_get_address[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_all_addresses(const int32_t& index, const std::function<void(const std::vector<::mmx::addr_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_all_addresses::create();\n\t_method->index = index;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 38;\n\t\tvnx_queue_get_all_addresses[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::find_wallet_by_addr(const ::mmx::addr_t& address, const std::function<void(const int32_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_find_wallet_by_addr::create();\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 39;\n\t\tvnx_queue_find_wallet_by_addr[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_account(const uint32_t& index, const std::function<void(const ::mmx::account_info_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_account::create();\n\t_method->index = index;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 40;\n\t\tvnx_queue_get_account[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_all_accounts(const std::function<void(const std::vector<::mmx::account_info_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_all_accounts::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 41;\n\t\tvnx_queue_get_all_accounts[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::is_locked(const uint32_t& index, const std::function<void(const vnx::bool_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_is_locked::create();\n\t_method->index = index;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 42;\n\t\tvnx_queue_is_locked[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::lock(const uint32_t& index, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_lock::create();\n\t_method->index = index;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 43;\n\t\tvnx_queue_lock[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::unlock(const uint32_t& index, const std::string& passphrase, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_unlock::create();\n\t_method->index = index;\n\t_method->passphrase = passphrase;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 44;\n\t\tvnx_queue_unlock[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::add_account(const uint32_t& index, const ::mmx::account_t& config, const vnx::optional<std::string>& passphrase, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_add_account::create();\n\t_method->index = index;\n\t_method->config = config;\n\t_method->passphrase = passphrase;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 45;\n\t\tvnx_queue_add_account[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::create_account(const ::mmx::account_t& config, const vnx::optional<std::string>& passphrase, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_create_account::create();\n\t_method->config = config;\n\t_method->passphrase = passphrase;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 46;\n\t\tvnx_queue_create_account[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::create_wallet(const ::mmx::account_t& config, const vnx::optional<std::string>& words, const vnx::optional<std::string>& passphrase, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_create_wallet::create();\n\t_method->config = config;\n\t_method->words = words;\n\t_method->passphrase = passphrase;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 47;\n\t\tvnx_queue_create_wallet[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::import_wallet(const ::mmx::account_t& config, std::shared_ptr<const ::mmx::KeyFile> key_file, const vnx::optional<std::string>& passphrase, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_import_wallet::create();\n\t_method->config = config;\n\t_method->key_file = key_file;\n\t_method->passphrase = passphrase;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 48;\n\t\tvnx_queue_import_wallet[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::remove_account(const uint32_t& index, const uint32_t& account, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_remove_account::create();\n\t_method->index = index;\n\t_method->account = account;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 49;\n\t\tvnx_queue_remove_account[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::set_address_count(const uint32_t& index, const uint32_t& count, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_set_address_count::create();\n\t_method->index = index;\n\t_method->count = count;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 50;\n\t\tvnx_queue_set_address_count[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_mnemonic_wordlist(const std::string& lang, const std::function<void(const std::vector<std::string>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_mnemonic_wordlist::create();\n\t_method->lang = lang;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 51;\n\t\tvnx_queue_get_mnemonic_wordlist[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_token_list(const std::function<void(const std::set<::mmx::addr_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_token_list::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 52;\n\t\tvnx_queue_get_token_list[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::add_token(const ::mmx::addr_t& address, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_add_token::create();\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 53;\n\t\tvnx_queue_add_token[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::rem_token(const ::mmx::addr_t& address, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_rem_token::create();\n\t_method->address = address;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 54;\n\t\tvnx_queue_rem_token[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::export_wallet(const uint32_t& index, const std::function<void(std::shared_ptr<const ::mmx::KeyFile>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_export_wallet::create();\n\t_method->index = index;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 55;\n\t\tvnx_queue_export_wallet[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_master_seed(const uint32_t& index, const std::function<void(const ::mmx::hash_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_master_seed::create();\n\t_method->index = index;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 56;\n\t\tvnx_queue_get_master_seed[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_mnemonic_seed(const uint32_t& index, const std::function<void(const std::vector<std::string>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_mnemonic_seed::create();\n\t_method->index = index;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 57;\n\t\tvnx_queue_get_mnemonic_seed[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_farmer_keys(const uint32_t& index, const std::function<void(const std::pair<::mmx::skey_t, ::mmx::pubkey_t>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_farmer_keys::create();\n\t_method->index = index;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 58;\n\t\tvnx_queue_get_farmer_keys[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::get_all_farmer_keys(const std::function<void(const std::vector<std::pair<::mmx::skey_t, ::mmx::pubkey_t>>&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::Wallet_get_all_farmer_keys::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 59;\n\t\tvnx_queue_get_all_farmer_keys[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 60;\n\t\tvnx_queue_http_request[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes, const std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request_chunk::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\t_method->offset = offset;\n\t_method->max_bytes = max_bytes;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 61;\n\t\tvnx_queue_http_request_chunk[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::vnx_get_config_object(const std::function<void(const ::vnx::Object&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 62;\n\t\tvnx_queue_vnx_get_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::vnx_get_config(const std::string& name, const std::function<void(const ::vnx::Variant&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 63;\n\t\tvnx_queue_vnx_get_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::vnx_set_config_object(const ::vnx::Object& config, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 64;\n\t\tvnx_queue_vnx_set_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 65;\n\t\tvnx_queue_vnx_set_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::vnx_get_type_code(const std::function<void(const ::vnx::TypeCode&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 66;\n\t\tvnx_queue_vnx_get_type_code[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::vnx_get_module_info(const std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 67;\n\t\tvnx_queue_vnx_get_module_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::vnx_restart(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 68;\n\t\tvnx_queue_vnx_restart[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::vnx_stop(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 69;\n\t\tvnx_queue_vnx_stop[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WalletAsyncClient::vnx_self_test(const std::function<void(const vnx::bool_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 70;\n\t\tvnx_queue_vnx_self_test[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nint32_t WalletAsyncClient::vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\treturn -1;\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_send.find(_request_id);\n\t\t\tif(_iter != vnx_queue_send.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_send.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_send_many.find(_request_id);\n\t\t\tif(_iter != vnx_queue_send_many.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_send_many.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_send_from.find(_request_id);\n\t\t\tif(_iter != vnx_queue_send_from.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_send_from.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_deploy.find(_request_id);\n\t\t\tif(_iter != vnx_queue_deploy.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_deploy.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_execute.find(_request_id);\n\t\t\tif(_iter != vnx_queue_execute.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_execute.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_deposit.find(_request_id);\n\t\t\tif(_iter != vnx_queue_deposit.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_deposit.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_make_offer.find(_request_id);\n\t\t\tif(_iter != vnx_queue_make_offer.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_make_offer.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_offer_trade.find(_request_id);\n\t\t\tif(_iter != vnx_queue_offer_trade.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_offer_trade.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_offer_withdraw.find(_request_id);\n\t\t\tif(_iter != vnx_queue_offer_withdraw.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_offer_withdraw.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_accept_offer.find(_request_id);\n\t\t\tif(_iter != vnx_queue_accept_offer.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_accept_offer.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_cancel_offer.find(_request_id);\n\t\t\tif(_iter != vnx_queue_cancel_offer.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_cancel_offer.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_swap_trade.find(_request_id);\n\t\t\tif(_iter != vnx_queue_swap_trade.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_swap_trade.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 12: {\n\t\t\tconst auto _iter = vnx_queue_swap_add_liquid.find(_request_id);\n\t\t\tif(_iter != vnx_queue_swap_add_liquid.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_swap_add_liquid.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 13: {\n\t\t\tconst auto _iter = vnx_queue_swap_rem_liquid.find(_request_id);\n\t\t\tif(_iter != vnx_queue_swap_rem_liquid.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_swap_rem_liquid.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 14: {\n\t\t\tconst auto _iter = vnx_queue_plotnft_exec.find(_request_id);\n\t\t\tif(_iter != vnx_queue_plotnft_exec.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_plotnft_exec.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 15: {\n\t\t\tconst auto _iter = vnx_queue_plotnft_create.find(_request_id);\n\t\t\tif(_iter != vnx_queue_plotnft_create.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_plotnft_create.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 16: {\n\t\t\tconst auto _iter = vnx_queue_complete.find(_request_id);\n\t\t\tif(_iter != vnx_queue_complete.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_complete.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 17: {\n\t\t\tconst auto _iter = vnx_queue_sign_off.find(_request_id);\n\t\t\tif(_iter != vnx_queue_sign_off.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_sign_off.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 18: {\n\t\t\tconst auto _iter = vnx_queue_sign_msg.find(_request_id);\n\t\t\tif(_iter != vnx_queue_sign_msg.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_sign_msg.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 19: {\n\t\t\tconst auto _iter = vnx_queue_send_off.find(_request_id);\n\t\t\tif(_iter != vnx_queue_send_off.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_send_off.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 20: {\n\t\t\tconst auto _iter = vnx_queue_mark_spent.find(_request_id);\n\t\t\tif(_iter != vnx_queue_mark_spent.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_mark_spent.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 21: {\n\t\t\tconst auto _iter = vnx_queue_reserve.find(_request_id);\n\t\t\tif(_iter != vnx_queue_reserve.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_reserve.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 22: {\n\t\t\tconst auto _iter = vnx_queue_release.find(_request_id);\n\t\t\tif(_iter != vnx_queue_release.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_release.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 23: {\n\t\t\tconst auto _iter = vnx_queue_release_all.find(_request_id);\n\t\t\tif(_iter != vnx_queue_release_all.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_release_all.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 24: {\n\t\t\tconst auto _iter = vnx_queue_reset_cache.find(_request_id);\n\t\t\tif(_iter != vnx_queue_reset_cache.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_reset_cache.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 25: {\n\t\t\tconst auto _iter = vnx_queue_update_cache.find(_request_id);\n\t\t\tif(_iter != vnx_queue_update_cache.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_update_cache.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 26: {\n\t\t\tconst auto _iter = vnx_queue_get_history.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_history.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_history.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 27: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_log.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_tx_log.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_tx_log.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 28: {\n\t\t\tconst auto _iter = vnx_queue_gather_inputs_for.find(_request_id);\n\t\t\tif(_iter != vnx_queue_gather_inputs_for.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_gather_inputs_for.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 29: {\n\t\t\tconst auto _iter = vnx_queue_get_balance.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_balance.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_balance.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 30: {\n\t\t\tconst auto _iter = vnx_queue_get_balances.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_balances.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_balances.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 31: {\n\t\t\tconst auto _iter = vnx_queue_get_total_balances.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_total_balances.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_total_balances.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 32: {\n\t\t\tconst auto _iter = vnx_queue_get_contract_balances.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_contract_balances.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_contract_balances.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 33: {\n\t\t\tconst auto _iter = vnx_queue_get_contracts.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_contracts.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_contracts.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 34: {\n\t\t\tconst auto _iter = vnx_queue_get_contracts_owned.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_contracts_owned.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_contracts_owned.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 35: {\n\t\t\tconst auto _iter = vnx_queue_get_offers.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_offers.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_offers.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 36: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_liquidity.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_swap_liquidity.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_swap_liquidity.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 37: {\n\t\t\tconst auto _iter = vnx_queue_get_address.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_address.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_address.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 38: {\n\t\t\tconst auto _iter = vnx_queue_get_all_addresses.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_all_addresses.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_all_addresses.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 39: {\n\t\t\tconst auto _iter = vnx_queue_find_wallet_by_addr.find(_request_id);\n\t\t\tif(_iter != vnx_queue_find_wallet_by_addr.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_find_wallet_by_addr.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 40: {\n\t\t\tconst auto _iter = vnx_queue_get_account.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_account.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_account.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 41: {\n\t\t\tconst auto _iter = vnx_queue_get_all_accounts.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_all_accounts.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_all_accounts.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 42: {\n\t\t\tconst auto _iter = vnx_queue_is_locked.find(_request_id);\n\t\t\tif(_iter != vnx_queue_is_locked.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_is_locked.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 43: {\n\t\t\tconst auto _iter = vnx_queue_lock.find(_request_id);\n\t\t\tif(_iter != vnx_queue_lock.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_lock.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 44: {\n\t\t\tconst auto _iter = vnx_queue_unlock.find(_request_id);\n\t\t\tif(_iter != vnx_queue_unlock.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_unlock.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 45: {\n\t\t\tconst auto _iter = vnx_queue_add_account.find(_request_id);\n\t\t\tif(_iter != vnx_queue_add_account.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_add_account.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 46: {\n\t\t\tconst auto _iter = vnx_queue_create_account.find(_request_id);\n\t\t\tif(_iter != vnx_queue_create_account.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_create_account.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 47: {\n\t\t\tconst auto _iter = vnx_queue_create_wallet.find(_request_id);\n\t\t\tif(_iter != vnx_queue_create_wallet.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_create_wallet.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 48: {\n\t\t\tconst auto _iter = vnx_queue_import_wallet.find(_request_id);\n\t\t\tif(_iter != vnx_queue_import_wallet.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_import_wallet.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 49: {\n\t\t\tconst auto _iter = vnx_queue_remove_account.find(_request_id);\n\t\t\tif(_iter != vnx_queue_remove_account.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_remove_account.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 50: {\n\t\t\tconst auto _iter = vnx_queue_set_address_count.find(_request_id);\n\t\t\tif(_iter != vnx_queue_set_address_count.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_set_address_count.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 51: {\n\t\t\tconst auto _iter = vnx_queue_get_mnemonic_wordlist.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_mnemonic_wordlist.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_mnemonic_wordlist.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 52: {\n\t\t\tconst auto _iter = vnx_queue_get_token_list.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_token_list.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_token_list.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 53: {\n\t\t\tconst auto _iter = vnx_queue_add_token.find(_request_id);\n\t\t\tif(_iter != vnx_queue_add_token.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_add_token.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 54: {\n\t\t\tconst auto _iter = vnx_queue_rem_token.find(_request_id);\n\t\t\tif(_iter != vnx_queue_rem_token.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_rem_token.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 55: {\n\t\t\tconst auto _iter = vnx_queue_export_wallet.find(_request_id);\n\t\t\tif(_iter != vnx_queue_export_wallet.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_export_wallet.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 56: {\n\t\t\tconst auto _iter = vnx_queue_get_master_seed.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_master_seed.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_master_seed.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 57: {\n\t\t\tconst auto _iter = vnx_queue_get_mnemonic_seed.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_mnemonic_seed.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_mnemonic_seed.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 58: {\n\t\t\tconst auto _iter = vnx_queue_get_farmer_keys.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_farmer_keys.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_farmer_keys.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 59: {\n\t\t\tconst auto _iter = vnx_queue_get_all_farmer_keys.find(_request_id);\n\t\t\tif(_iter != vnx_queue_get_all_farmer_keys.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_get_all_farmer_keys.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 60: {\n\t\t\tconst auto _iter = vnx_queue_http_request.find(_request_id);\n\t\t\tif(_iter != vnx_queue_http_request.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_http_request.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 61: {\n\t\t\tconst auto _iter = vnx_queue_http_request_chunk.find(_request_id);\n\t\t\tif(_iter != vnx_queue_http_request_chunk.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_http_request_chunk.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 62: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 63: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 64: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 65: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 66: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 67: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 68: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_restart.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 69: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_stop.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 70: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_self_test.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn _index;\n}\n\nint32_t WalletAsyncClient::vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\tthrow std::runtime_error(\"WalletAsyncClient: received unknown return\");\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_send.find(_request_id);\n\t\t\tif(_iter == vnx_queue_send.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_send.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_send_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_send_many.find(_request_id);\n\t\t\tif(_iter == vnx_queue_send_many.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_send_many.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_send_many_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_send_from.find(_request_id);\n\t\t\tif(_iter == vnx_queue_send_from.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_send_from.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_send_from_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_deploy.find(_request_id);\n\t\t\tif(_iter == vnx_queue_deploy.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_deploy.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_deploy_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_execute.find(_request_id);\n\t\t\tif(_iter == vnx_queue_execute.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_execute.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_execute_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_deposit.find(_request_id);\n\t\t\tif(_iter == vnx_queue_deposit.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_deposit.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_deposit_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_make_offer.find(_request_id);\n\t\t\tif(_iter == vnx_queue_make_offer.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_make_offer.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_make_offer_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_offer_trade.find(_request_id);\n\t\t\tif(_iter == vnx_queue_offer_trade.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_offer_trade.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_offer_trade_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_offer_withdraw.find(_request_id);\n\t\t\tif(_iter == vnx_queue_offer_withdraw.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_offer_withdraw.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_offer_withdraw_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_accept_offer.find(_request_id);\n\t\t\tif(_iter == vnx_queue_accept_offer.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_accept_offer.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_accept_offer_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_cancel_offer.find(_request_id);\n\t\t\tif(_iter == vnx_queue_cancel_offer.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_cancel_offer.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_cancel_offer_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_swap_trade.find(_request_id);\n\t\t\tif(_iter == vnx_queue_swap_trade.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_swap_trade.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_swap_trade_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 12: {\n\t\t\tconst auto _iter = vnx_queue_swap_add_liquid.find(_request_id);\n\t\t\tif(_iter == vnx_queue_swap_add_liquid.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_swap_add_liquid.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_swap_add_liquid_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 13: {\n\t\t\tconst auto _iter = vnx_queue_swap_rem_liquid.find(_request_id);\n\t\t\tif(_iter == vnx_queue_swap_rem_liquid.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_swap_rem_liquid.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_swap_rem_liquid_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 14: {\n\t\t\tconst auto _iter = vnx_queue_plotnft_exec.find(_request_id);\n\t\t\tif(_iter == vnx_queue_plotnft_exec.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_plotnft_exec.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_plotnft_exec_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 15: {\n\t\t\tconst auto _iter = vnx_queue_plotnft_create.find(_request_id);\n\t\t\tif(_iter == vnx_queue_plotnft_create.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_plotnft_create.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_plotnft_create_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 16: {\n\t\t\tconst auto _iter = vnx_queue_complete.find(_request_id);\n\t\t\tif(_iter == vnx_queue_complete.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_complete.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_complete_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 17: {\n\t\t\tconst auto _iter = vnx_queue_sign_off.find(_request_id);\n\t\t\tif(_iter == vnx_queue_sign_off.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_sign_off.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_sign_off_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 18: {\n\t\t\tconst auto _iter = vnx_queue_sign_msg.find(_request_id);\n\t\t\tif(_iter == vnx_queue_sign_msg.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_sign_msg.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_sign_msg_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Solution>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 19: {\n\t\t\tconst auto _iter = vnx_queue_send_off.find(_request_id);\n\t\t\tif(_iter == vnx_queue_send_off.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_send_off.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 20: {\n\t\t\tconst auto _iter = vnx_queue_mark_spent.find(_request_id);\n\t\t\tif(_iter == vnx_queue_mark_spent.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_mark_spent.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 21: {\n\t\t\tconst auto _iter = vnx_queue_reserve.find(_request_id);\n\t\t\tif(_iter == vnx_queue_reserve.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_reserve.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 22: {\n\t\t\tconst auto _iter = vnx_queue_release.find(_request_id);\n\t\t\tif(_iter == vnx_queue_release.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_release.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 23: {\n\t\t\tconst auto _iter = vnx_queue_release_all.find(_request_id);\n\t\t\tif(_iter == vnx_queue_release_all.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_release_all.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 24: {\n\t\t\tconst auto _iter = vnx_queue_reset_cache.find(_request_id);\n\t\t\tif(_iter == vnx_queue_reset_cache.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_reset_cache.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 25: {\n\t\t\tconst auto _iter = vnx_queue_update_cache.find(_request_id);\n\t\t\tif(_iter == vnx_queue_update_cache.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_update_cache.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 26: {\n\t\t\tconst auto _iter = vnx_queue_get_history.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_history.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_history.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_history_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::tx_entry_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 27: {\n\t\t\tconst auto _iter = vnx_queue_get_tx_log.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_tx_log.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_tx_log.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_tx_log_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::tx_log_entry_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 28: {\n\t\t\tconst auto _iter = vnx_queue_gather_inputs_for.find(_request_id);\n\t\t\tif(_iter == vnx_queue_gather_inputs_for.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_gather_inputs_for.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_gather_inputs_for_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::txin_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 29: {\n\t\t\tconst auto _iter = vnx_queue_get_balance.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_balance.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_balance.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_balance_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::balance_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 30: {\n\t\t\tconst auto _iter = vnx_queue_get_balances.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_balances.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_balances.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_balances_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::balance_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 31: {\n\t\t\tconst auto _iter = vnx_queue_get_total_balances.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_total_balances.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_total_balances.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_total_balances_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::balance_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 32: {\n\t\t\tconst auto _iter = vnx_queue_get_contract_balances.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_contract_balances.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_contract_balances.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_contract_balances_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::balance_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 33: {\n\t\t\tconst auto _iter = vnx_queue_get_contracts.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_contracts.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_contracts.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_contracts_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 34: {\n\t\t\tconst auto _iter = vnx_queue_get_contracts_owned.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_contracts_owned.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_contracts_owned.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_contracts_owned_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 35: {\n\t\t\tconst auto _iter = vnx_queue_get_offers.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_offers.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_offers.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_offers_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 36: {\n\t\t\tconst auto _iter = vnx_queue_get_swap_liquidity.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_swap_liquidity.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_swap_liquidity.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_swap_liquidity_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 37: {\n\t\t\tconst auto _iter = vnx_queue_get_address.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_address.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_address.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_address_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::addr_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 38: {\n\t\t\tconst auto _iter = vnx_queue_get_all_addresses.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_all_addresses.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_all_addresses.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_all_addresses_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::addr_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 39: {\n\t\t\tconst auto _iter = vnx_queue_find_wallet_by_addr.find(_request_id);\n\t\t\tif(_iter == vnx_queue_find_wallet_by_addr.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_find_wallet_by_addr.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_find_wallet_by_addr_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<int32_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 40: {\n\t\t\tconst auto _iter = vnx_queue_get_account.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_account.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_account.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_account_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::account_info_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 41: {\n\t\t\tconst auto _iter = vnx_queue_get_all_accounts.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_all_accounts.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_all_accounts.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_all_accounts_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<::mmx::account_info_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 42: {\n\t\t\tconst auto _iter = vnx_queue_is_locked.find(_request_id);\n\t\t\tif(_iter == vnx_queue_is_locked.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_is_locked.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_is_locked_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::bool_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 43: {\n\t\t\tconst auto _iter = vnx_queue_lock.find(_request_id);\n\t\t\tif(_iter == vnx_queue_lock.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_lock.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 44: {\n\t\t\tconst auto _iter = vnx_queue_unlock.find(_request_id);\n\t\t\tif(_iter == vnx_queue_unlock.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_unlock.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 45: {\n\t\t\tconst auto _iter = vnx_queue_add_account.find(_request_id);\n\t\t\tif(_iter == vnx_queue_add_account.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_add_account.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 46: {\n\t\t\tconst auto _iter = vnx_queue_create_account.find(_request_id);\n\t\t\tif(_iter == vnx_queue_create_account.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_create_account.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 47: {\n\t\t\tconst auto _iter = vnx_queue_create_wallet.find(_request_id);\n\t\t\tif(_iter == vnx_queue_create_wallet.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_create_wallet.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 48: {\n\t\t\tconst auto _iter = vnx_queue_import_wallet.find(_request_id);\n\t\t\tif(_iter == vnx_queue_import_wallet.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_import_wallet.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 49: {\n\t\t\tconst auto _iter = vnx_queue_remove_account.find(_request_id);\n\t\t\tif(_iter == vnx_queue_remove_account.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_remove_account.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 50: {\n\t\t\tconst auto _iter = vnx_queue_set_address_count.find(_request_id);\n\t\t\tif(_iter == vnx_queue_set_address_count.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_set_address_count.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 51: {\n\t\t\tconst auto _iter = vnx_queue_get_mnemonic_wordlist.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_mnemonic_wordlist.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_mnemonic_wordlist.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_mnemonic_wordlist_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<std::string>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 52: {\n\t\t\tconst auto _iter = vnx_queue_get_token_list.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_token_list.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_token_list.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_token_list_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::set<::mmx::addr_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 53: {\n\t\t\tconst auto _iter = vnx_queue_add_token.find(_request_id);\n\t\t\tif(_iter == vnx_queue_add_token.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_add_token.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 54: {\n\t\t\tconst auto _iter = vnx_queue_rem_token.find(_request_id);\n\t\t\tif(_iter == vnx_queue_rem_token.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_rem_token.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 55: {\n\t\t\tconst auto _iter = vnx_queue_export_wallet.find(_request_id);\n\t\t\tif(_iter == vnx_queue_export_wallet.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_export_wallet.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_export_wallet_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::KeyFile>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 56: {\n\t\t\tconst auto _iter = vnx_queue_get_master_seed.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_master_seed.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_master_seed.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_master_seed_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::mmx::hash_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 57: {\n\t\t\tconst auto _iter = vnx_queue_get_mnemonic_seed.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_mnemonic_seed.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_mnemonic_seed.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_mnemonic_seed_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<std::string>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 58: {\n\t\t\tconst auto _iter = vnx_queue_get_farmer_keys.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_farmer_keys.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_farmer_keys.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_farmer_keys_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::pair<::mmx::skey_t, ::mmx::pubkey_t>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 59: {\n\t\t\tconst auto _iter = vnx_queue_get_all_farmer_keys.find(_request_id);\n\t\t\tif(_iter == vnx_queue_get_all_farmer_keys.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_get_all_farmer_keys.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_all_farmer_keys_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::vector<std::pair<::mmx::skey_t, ::mmx::pubkey_t>>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 60: {\n\t\t\tconst auto _iter = vnx_queue_http_request.find(_request_id);\n\t\t\tif(_iter == vnx_queue_http_request.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_http_request.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpResponse>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 61: {\n\t\t\tconst auto _iter = vnx_queue_http_request_chunk.find(_request_id);\n\t\t\tif(_iter == vnx_queue_http_request_chunk.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_http_request_chunk.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpData>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 62: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Object>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 63: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Variant>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 64: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 65: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 66: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::TypeCode>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 67: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 68: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_restart.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 69: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_stop.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 70: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_self_test.end()) {\n\t\t\t\tthrow std::runtime_error(\"WalletAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::bool_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif(_index >= 0) {\n\t\t\t\tthrow std::logic_error(\"WalletAsyncClient: invalid callback index\");\n\t\t\t}\n\t}\n\treturn _index;\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/WalletBase.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/WalletBase.hxx>\n#include <vnx/NoSuchMethod.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/Wallet_accept_offer.hxx>\n#include <mmx/Wallet_accept_offer_return.hxx>\n#include <mmx/Wallet_add_account.hxx>\n#include <mmx/Wallet_add_account_return.hxx>\n#include <mmx/Wallet_add_token.hxx>\n#include <mmx/Wallet_add_token_return.hxx>\n#include <mmx/Wallet_cancel_offer.hxx>\n#include <mmx/Wallet_cancel_offer_return.hxx>\n#include <mmx/Wallet_complete.hxx>\n#include <mmx/Wallet_complete_return.hxx>\n#include <mmx/Wallet_create_account.hxx>\n#include <mmx/Wallet_create_account_return.hxx>\n#include <mmx/Wallet_create_wallet.hxx>\n#include <mmx/Wallet_create_wallet_return.hxx>\n#include <mmx/Wallet_deploy.hxx>\n#include <mmx/Wallet_deploy_return.hxx>\n#include <mmx/Wallet_deposit.hxx>\n#include <mmx/Wallet_deposit_return.hxx>\n#include <mmx/Wallet_execute.hxx>\n#include <mmx/Wallet_execute_return.hxx>\n#include <mmx/Wallet_export_wallet.hxx>\n#include <mmx/Wallet_export_wallet_return.hxx>\n#include <mmx/Wallet_find_wallet_by_addr.hxx>\n#include <mmx/Wallet_find_wallet_by_addr_return.hxx>\n#include <mmx/Wallet_gather_inputs_for.hxx>\n#include <mmx/Wallet_gather_inputs_for_return.hxx>\n#include <mmx/Wallet_get_account.hxx>\n#include <mmx/Wallet_get_account_return.hxx>\n#include <mmx/Wallet_get_address.hxx>\n#include <mmx/Wallet_get_address_return.hxx>\n#include <mmx/Wallet_get_all_accounts.hxx>\n#include <mmx/Wallet_get_all_accounts_return.hxx>\n#include <mmx/Wallet_get_all_addresses.hxx>\n#include <mmx/Wallet_get_all_addresses_return.hxx>\n#include <mmx/Wallet_get_all_farmer_keys.hxx>\n#include <mmx/Wallet_get_all_farmer_keys_return.hxx>\n#include <mmx/Wallet_get_balance.hxx>\n#include <mmx/Wallet_get_balance_return.hxx>\n#include <mmx/Wallet_get_balances.hxx>\n#include <mmx/Wallet_get_balances_return.hxx>\n#include <mmx/Wallet_get_contract_balances.hxx>\n#include <mmx/Wallet_get_contract_balances_return.hxx>\n#include <mmx/Wallet_get_contracts.hxx>\n#include <mmx/Wallet_get_contracts_return.hxx>\n#include <mmx/Wallet_get_contracts_owned.hxx>\n#include <mmx/Wallet_get_contracts_owned_return.hxx>\n#include <mmx/Wallet_get_farmer_keys.hxx>\n#include <mmx/Wallet_get_farmer_keys_return.hxx>\n#include <mmx/Wallet_get_history.hxx>\n#include <mmx/Wallet_get_history_return.hxx>\n#include <mmx/Wallet_get_master_seed.hxx>\n#include <mmx/Wallet_get_master_seed_return.hxx>\n#include <mmx/Wallet_get_mnemonic_seed.hxx>\n#include <mmx/Wallet_get_mnemonic_seed_return.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist_return.hxx>\n#include <mmx/Wallet_get_offers.hxx>\n#include <mmx/Wallet_get_offers_return.hxx>\n#include <mmx/Wallet_get_swap_liquidity.hxx>\n#include <mmx/Wallet_get_swap_liquidity_return.hxx>\n#include <mmx/Wallet_get_token_list.hxx>\n#include <mmx/Wallet_get_token_list_return.hxx>\n#include <mmx/Wallet_get_total_balances.hxx>\n#include <mmx/Wallet_get_total_balances_return.hxx>\n#include <mmx/Wallet_get_tx_log.hxx>\n#include <mmx/Wallet_get_tx_log_return.hxx>\n#include <mmx/Wallet_import_wallet.hxx>\n#include <mmx/Wallet_import_wallet_return.hxx>\n#include <mmx/Wallet_is_locked.hxx>\n#include <mmx/Wallet_is_locked_return.hxx>\n#include <mmx/Wallet_lock.hxx>\n#include <mmx/Wallet_lock_return.hxx>\n#include <mmx/Wallet_make_offer.hxx>\n#include <mmx/Wallet_make_offer_return.hxx>\n#include <mmx/Wallet_mark_spent.hxx>\n#include <mmx/Wallet_mark_spent_return.hxx>\n#include <mmx/Wallet_offer_trade.hxx>\n#include <mmx/Wallet_offer_trade_return.hxx>\n#include <mmx/Wallet_offer_withdraw.hxx>\n#include <mmx/Wallet_offer_withdraw_return.hxx>\n#include <mmx/Wallet_plotnft_create.hxx>\n#include <mmx/Wallet_plotnft_create_return.hxx>\n#include <mmx/Wallet_plotnft_exec.hxx>\n#include <mmx/Wallet_plotnft_exec_return.hxx>\n#include <mmx/Wallet_release.hxx>\n#include <mmx/Wallet_release_return.hxx>\n#include <mmx/Wallet_release_all.hxx>\n#include <mmx/Wallet_release_all_return.hxx>\n#include <mmx/Wallet_rem_token.hxx>\n#include <mmx/Wallet_rem_token_return.hxx>\n#include <mmx/Wallet_remove_account.hxx>\n#include <mmx/Wallet_remove_account_return.hxx>\n#include <mmx/Wallet_reserve.hxx>\n#include <mmx/Wallet_reserve_return.hxx>\n#include <mmx/Wallet_reset_cache.hxx>\n#include <mmx/Wallet_reset_cache_return.hxx>\n#include <mmx/Wallet_send.hxx>\n#include <mmx/Wallet_send_return.hxx>\n#include <mmx/Wallet_send_from.hxx>\n#include <mmx/Wallet_send_from_return.hxx>\n#include <mmx/Wallet_send_many.hxx>\n#include <mmx/Wallet_send_many_return.hxx>\n#include <mmx/Wallet_send_off.hxx>\n#include <mmx/Wallet_send_off_return.hxx>\n#include <mmx/Wallet_set_address_count.hxx>\n#include <mmx/Wallet_set_address_count_return.hxx>\n#include <mmx/Wallet_sign_msg.hxx>\n#include <mmx/Wallet_sign_msg_return.hxx>\n#include <mmx/Wallet_sign_off.hxx>\n#include <mmx/Wallet_sign_off_return.hxx>\n#include <mmx/Wallet_swap_add_liquid.hxx>\n#include <mmx/Wallet_swap_add_liquid_return.hxx>\n#include <mmx/Wallet_swap_rem_liquid.hxx>\n#include <mmx/Wallet_swap_rem_liquid_return.hxx>\n#include <mmx/Wallet_swap_trade.hxx>\n#include <mmx/Wallet_swap_trade_return.hxx>\n#include <mmx/Wallet_unlock.hxx>\n#include <mmx/Wallet_unlock_return.hxx>\n#include <mmx/Wallet_update_cache.hxx>\n#include <mmx/Wallet_update_cache_return.hxx>\n#include <mmx/account_info_t.hxx>\n#include <mmx/account_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/skey_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_log_entry_t.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 WalletBase::VNX_TYPE_HASH(0x62207fd96d3aead7ull);\nconst vnx::Hash64 WalletBase::VNX_CODE_HASH(0xb77c4f1e4e419a4ull);\n\nWalletBase::WalletBase(const std::string& _vnx_name)\n\t:\tModule::Module(_vnx_name)\n{\n\tvnx::read_config(vnx_name + \".key_files\", key_files);\n\tvnx::read_config(vnx_name + \".accounts\", accounts);\n\tvnx::read_config(vnx_name + \".config_path\", config_path);\n\tvnx::read_config(vnx_name + \".storage_path\", storage_path);\n\tvnx::read_config(vnx_name + \".database_path\", database_path);\n\tvnx::read_config(vnx_name + \".node_server\", node_server);\n\tvnx::read_config(vnx_name + \".max_key_files\", max_key_files);\n\tvnx::read_config(vnx_name + \".num_addresses\", num_addresses);\n\tvnx::read_config(vnx_name + \".max_addresses\", max_addresses);\n\tvnx::read_config(vnx_name + \".default_expire\", default_expire);\n\tvnx::read_config(vnx_name + \".lock_timeout_sec\", lock_timeout_sec);\n\tvnx::read_config(vnx_name + \".cache_timeout_ms\", cache_timeout_ms);\n\tvnx::read_config(vnx_name + \".token_whitelist\", token_whitelist);\n}\n\nvnx::Hash64 WalletBase::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string WalletBase::get_type_name() const {\n\treturn \"mmx.Wallet\";\n}\n\nconst vnx::TypeCode* WalletBase::get_type_code() const {\n\treturn mmx::vnx_native_type_code_WalletBase;\n}\n\nvoid WalletBase::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_WalletBase;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, key_files);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, accounts);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, config_path);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, storage_path);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, database_path);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, node_server);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, max_key_files);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, num_addresses);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, max_addresses);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, default_expire);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, lock_timeout_sec);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, cache_timeout_ms);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, token_whitelist);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid WalletBase::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"key_files\\\": \"; vnx::write(_out, key_files);\n\t_out << \", \\\"accounts\\\": \"; vnx::write(_out, accounts);\n\t_out << \", \\\"config_path\\\": \"; vnx::write(_out, config_path);\n\t_out << \", \\\"storage_path\\\": \"; vnx::write(_out, storage_path);\n\t_out << \", \\\"database_path\\\": \"; vnx::write(_out, database_path);\n\t_out << \", \\\"node_server\\\": \"; vnx::write(_out, node_server);\n\t_out << \", \\\"max_key_files\\\": \"; vnx::write(_out, max_key_files);\n\t_out << \", \\\"num_addresses\\\": \"; vnx::write(_out, num_addresses);\n\t_out << \", \\\"max_addresses\\\": \"; vnx::write(_out, max_addresses);\n\t_out << \", \\\"default_expire\\\": \"; vnx::write(_out, default_expire);\n\t_out << \", \\\"lock_timeout_sec\\\": \"; vnx::write(_out, lock_timeout_sec);\n\t_out << \", \\\"cache_timeout_ms\\\": \"; vnx::write(_out, cache_timeout_ms);\n\t_out << \", \\\"token_whitelist\\\": \"; vnx::write(_out, token_whitelist);\n\t_out << \"}\";\n}\n\nvoid WalletBase::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object WalletBase::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet\";\n\t_object[\"key_files\"] = key_files;\n\t_object[\"accounts\"] = accounts;\n\t_object[\"config_path\"] = config_path;\n\t_object[\"storage_path\"] = storage_path;\n\t_object[\"database_path\"] = database_path;\n\t_object[\"node_server\"] = node_server;\n\t_object[\"max_key_files\"] = max_key_files;\n\t_object[\"num_addresses\"] = num_addresses;\n\t_object[\"max_addresses\"] = max_addresses;\n\t_object[\"default_expire\"] = default_expire;\n\t_object[\"lock_timeout_sec\"] = lock_timeout_sec;\n\t_object[\"cache_timeout_ms\"] = cache_timeout_ms;\n\t_object[\"token_whitelist\"] = token_whitelist;\n\treturn _object;\n}\n\nvoid WalletBase::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"accounts\") {\n\t\t\t_entry.second.to(accounts);\n\t\t} else if(_entry.first == \"cache_timeout_ms\") {\n\t\t\t_entry.second.to(cache_timeout_ms);\n\t\t} else if(_entry.first == \"config_path\") {\n\t\t\t_entry.second.to(config_path);\n\t\t} else if(_entry.first == \"database_path\") {\n\t\t\t_entry.second.to(database_path);\n\t\t} else if(_entry.first == \"default_expire\") {\n\t\t\t_entry.second.to(default_expire);\n\t\t} else if(_entry.first == \"key_files\") {\n\t\t\t_entry.second.to(key_files);\n\t\t} else if(_entry.first == \"lock_timeout_sec\") {\n\t\t\t_entry.second.to(lock_timeout_sec);\n\t\t} else if(_entry.first == \"max_addresses\") {\n\t\t\t_entry.second.to(max_addresses);\n\t\t} else if(_entry.first == \"max_key_files\") {\n\t\t\t_entry.second.to(max_key_files);\n\t\t} else if(_entry.first == \"node_server\") {\n\t\t\t_entry.second.to(node_server);\n\t\t} else if(_entry.first == \"num_addresses\") {\n\t\t\t_entry.second.to(num_addresses);\n\t\t} else if(_entry.first == \"storage_path\") {\n\t\t\t_entry.second.to(storage_path);\n\t\t} else if(_entry.first == \"token_whitelist\") {\n\t\t\t_entry.second.to(token_whitelist);\n\t\t}\n\t}\n}\n\nvnx::Variant WalletBase::get_field(const std::string& _name) const {\n\tif(_name == \"key_files\") {\n\t\treturn vnx::Variant(key_files);\n\t}\n\tif(_name == \"accounts\") {\n\t\treturn vnx::Variant(accounts);\n\t}\n\tif(_name == \"config_path\") {\n\t\treturn vnx::Variant(config_path);\n\t}\n\tif(_name == \"storage_path\") {\n\t\treturn vnx::Variant(storage_path);\n\t}\n\tif(_name == \"database_path\") {\n\t\treturn vnx::Variant(database_path);\n\t}\n\tif(_name == \"node_server\") {\n\t\treturn vnx::Variant(node_server);\n\t}\n\tif(_name == \"max_key_files\") {\n\t\treturn vnx::Variant(max_key_files);\n\t}\n\tif(_name == \"num_addresses\") {\n\t\treturn vnx::Variant(num_addresses);\n\t}\n\tif(_name == \"max_addresses\") {\n\t\treturn vnx::Variant(max_addresses);\n\t}\n\tif(_name == \"default_expire\") {\n\t\treturn vnx::Variant(default_expire);\n\t}\n\tif(_name == \"lock_timeout_sec\") {\n\t\treturn vnx::Variant(lock_timeout_sec);\n\t}\n\tif(_name == \"cache_timeout_ms\") {\n\t\treturn vnx::Variant(cache_timeout_ms);\n\t}\n\tif(_name == \"token_whitelist\") {\n\t\treturn vnx::Variant(token_whitelist);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid WalletBase::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"key_files\") {\n\t\t_value.to(key_files);\n\t} else if(_name == \"accounts\") {\n\t\t_value.to(accounts);\n\t} else if(_name == \"config_path\") {\n\t\t_value.to(config_path);\n\t} else if(_name == \"storage_path\") {\n\t\t_value.to(storage_path);\n\t} else if(_name == \"database_path\") {\n\t\t_value.to(database_path);\n\t} else if(_name == \"node_server\") {\n\t\t_value.to(node_server);\n\t} else if(_name == \"max_key_files\") {\n\t\t_value.to(max_key_files);\n\t} else if(_name == \"num_addresses\") {\n\t\t_value.to(num_addresses);\n\t} else if(_name == \"max_addresses\") {\n\t\t_value.to(max_addresses);\n\t} else if(_name == \"default_expire\") {\n\t\t_value.to(default_expire);\n\t} else if(_name == \"lock_timeout_sec\") {\n\t\t_value.to(lock_timeout_sec);\n\t} else if(_name == \"cache_timeout_ms\") {\n\t\t_value.to(cache_timeout_ms);\n\t} else if(_name == \"token_whitelist\") {\n\t\t_value.to(token_whitelist);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const WalletBase& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, WalletBase& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* WalletBase::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> WalletBase::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet\";\n\ttype_code->type_hash = vnx::Hash64(0x62207fd96d3aead7ull);\n\ttype_code->code_hash = vnx::Hash64(0xb77c4f1e4e419a4ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::WalletBase);\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::account_t::static_get_type_code();\n\ttype_code->methods.resize(71);\n\ttype_code->methods[0] = ::mmx::Wallet_accept_offer::static_get_type_code();\n\ttype_code->methods[1] = ::mmx::Wallet_add_account::static_get_type_code();\n\ttype_code->methods[2] = ::mmx::Wallet_add_token::static_get_type_code();\n\ttype_code->methods[3] = ::mmx::Wallet_cancel_offer::static_get_type_code();\n\ttype_code->methods[4] = ::mmx::Wallet_complete::static_get_type_code();\n\ttype_code->methods[5] = ::mmx::Wallet_create_account::static_get_type_code();\n\ttype_code->methods[6] = ::mmx::Wallet_create_wallet::static_get_type_code();\n\ttype_code->methods[7] = ::mmx::Wallet_deploy::static_get_type_code();\n\ttype_code->methods[8] = ::mmx::Wallet_deposit::static_get_type_code();\n\ttype_code->methods[9] = ::mmx::Wallet_execute::static_get_type_code();\n\ttype_code->methods[10] = ::mmx::Wallet_export_wallet::static_get_type_code();\n\ttype_code->methods[11] = ::mmx::Wallet_find_wallet_by_addr::static_get_type_code();\n\ttype_code->methods[12] = ::mmx::Wallet_gather_inputs_for::static_get_type_code();\n\ttype_code->methods[13] = ::mmx::Wallet_get_account::static_get_type_code();\n\ttype_code->methods[14] = ::mmx::Wallet_get_address::static_get_type_code();\n\ttype_code->methods[15] = ::mmx::Wallet_get_all_accounts::static_get_type_code();\n\ttype_code->methods[16] = ::mmx::Wallet_get_all_addresses::static_get_type_code();\n\ttype_code->methods[17] = ::mmx::Wallet_get_all_farmer_keys::static_get_type_code();\n\ttype_code->methods[18] = ::mmx::Wallet_get_balance::static_get_type_code();\n\ttype_code->methods[19] = ::mmx::Wallet_get_balances::static_get_type_code();\n\ttype_code->methods[20] = ::mmx::Wallet_get_contract_balances::static_get_type_code();\n\ttype_code->methods[21] = ::mmx::Wallet_get_contracts::static_get_type_code();\n\ttype_code->methods[22] = ::mmx::Wallet_get_contracts_owned::static_get_type_code();\n\ttype_code->methods[23] = ::mmx::Wallet_get_farmer_keys::static_get_type_code();\n\ttype_code->methods[24] = ::mmx::Wallet_get_history::static_get_type_code();\n\ttype_code->methods[25] = ::mmx::Wallet_get_master_seed::static_get_type_code();\n\ttype_code->methods[26] = ::mmx::Wallet_get_mnemonic_seed::static_get_type_code();\n\ttype_code->methods[27] = ::mmx::Wallet_get_mnemonic_wordlist::static_get_type_code();\n\ttype_code->methods[28] = ::mmx::Wallet_get_offers::static_get_type_code();\n\ttype_code->methods[29] = ::mmx::Wallet_get_swap_liquidity::static_get_type_code();\n\ttype_code->methods[30] = ::mmx::Wallet_get_token_list::static_get_type_code();\n\ttype_code->methods[31] = ::mmx::Wallet_get_total_balances::static_get_type_code();\n\ttype_code->methods[32] = ::mmx::Wallet_get_tx_log::static_get_type_code();\n\ttype_code->methods[33] = ::mmx::Wallet_import_wallet::static_get_type_code();\n\ttype_code->methods[34] = ::mmx::Wallet_is_locked::static_get_type_code();\n\ttype_code->methods[35] = ::mmx::Wallet_lock::static_get_type_code();\n\ttype_code->methods[36] = ::mmx::Wallet_make_offer::static_get_type_code();\n\ttype_code->methods[37] = ::mmx::Wallet_mark_spent::static_get_type_code();\n\ttype_code->methods[38] = ::mmx::Wallet_offer_trade::static_get_type_code();\n\ttype_code->methods[39] = ::mmx::Wallet_offer_withdraw::static_get_type_code();\n\ttype_code->methods[40] = ::mmx::Wallet_plotnft_create::static_get_type_code();\n\ttype_code->methods[41] = ::mmx::Wallet_plotnft_exec::static_get_type_code();\n\ttype_code->methods[42] = ::mmx::Wallet_release::static_get_type_code();\n\ttype_code->methods[43] = ::mmx::Wallet_release_all::static_get_type_code();\n\ttype_code->methods[44] = ::mmx::Wallet_rem_token::static_get_type_code();\n\ttype_code->methods[45] = ::mmx::Wallet_remove_account::static_get_type_code();\n\ttype_code->methods[46] = ::mmx::Wallet_reserve::static_get_type_code();\n\ttype_code->methods[47] = ::mmx::Wallet_reset_cache::static_get_type_code();\n\ttype_code->methods[48] = ::mmx::Wallet_send::static_get_type_code();\n\ttype_code->methods[49] = ::mmx::Wallet_send_from::static_get_type_code();\n\ttype_code->methods[50] = ::mmx::Wallet_send_many::static_get_type_code();\n\ttype_code->methods[51] = ::mmx::Wallet_send_off::static_get_type_code();\n\ttype_code->methods[52] = ::mmx::Wallet_set_address_count::static_get_type_code();\n\ttype_code->methods[53] = ::mmx::Wallet_sign_msg::static_get_type_code();\n\ttype_code->methods[54] = ::mmx::Wallet_sign_off::static_get_type_code();\n\ttype_code->methods[55] = ::mmx::Wallet_swap_add_liquid::static_get_type_code();\n\ttype_code->methods[56] = ::mmx::Wallet_swap_rem_liquid::static_get_type_code();\n\ttype_code->methods[57] = ::mmx::Wallet_swap_trade::static_get_type_code();\n\ttype_code->methods[58] = ::mmx::Wallet_unlock::static_get_type_code();\n\ttype_code->methods[59] = ::mmx::Wallet_update_cache::static_get_type_code();\n\ttype_code->methods[60] = ::vnx::ModuleInterface_vnx_get_config::static_get_type_code();\n\ttype_code->methods[61] = ::vnx::ModuleInterface_vnx_get_config_object::static_get_type_code();\n\ttype_code->methods[62] = ::vnx::ModuleInterface_vnx_get_module_info::static_get_type_code();\n\ttype_code->methods[63] = ::vnx::ModuleInterface_vnx_get_type_code::static_get_type_code();\n\ttype_code->methods[64] = ::vnx::ModuleInterface_vnx_restart::static_get_type_code();\n\ttype_code->methods[65] = ::vnx::ModuleInterface_vnx_self_test::static_get_type_code();\n\ttype_code->methods[66] = ::vnx::ModuleInterface_vnx_set_config::static_get_type_code();\n\ttype_code->methods[67] = ::vnx::ModuleInterface_vnx_set_config_object::static_get_type_code();\n\ttype_code->methods[68] = ::vnx::ModuleInterface_vnx_stop::static_get_type_code();\n\ttype_code->methods[69] = ::vnx::addons::HttpComponent_http_request::static_get_type_code();\n\ttype_code->methods[70] = ::vnx::addons::HttpComponent_http_request_chunk::static_get_type_code();\n\ttype_code->fields.resize(13);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"key_files\";\n\t\tfield.code = {12, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"accounts\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"config_path\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"storage_path\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"database_path\";\n\t\tfield.value = vnx::to_string(\"wallet/\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"node_server\";\n\t\tfield.value = vnx::to_string(\"Node\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_key_files\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_addresses\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_addresses\";\n\t\tfield.value = vnx::to_string(10000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"default_expire\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"lock_timeout_sec\";\n\t\tfield.value = vnx::to_string(600);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"cache_timeout_ms\";\n\t\tfield.value = vnx::to_string(1000);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"token_whitelist\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nvoid WalletBase::vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) {\n\tconst auto* _type_code = _value->get_type_code();\n\twhile(_type_code) {\n\t\tswitch(_type_code->type_hash) {\n\t\t\tdefault:\n\t\t\t\t_type_code = _type_code->super;\n\t\t}\n\t}\n\thandle(std::static_pointer_cast<const vnx::Value>(_value));\n}\n\nstd::shared_ptr<vnx::Value> WalletBase::vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) {\n\tswitch(_method->get_type_hash()) {\n\t\tcase 0x3299e81eb354b78full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_accept_offer>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_accept_offer_return::create();\n\t\t\t_return_value->_ret_0 = accept_offer(_args->index, _args->address, _args->dst_addr, _args->price, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x92d2d3518d9c33aeull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_add_account>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_add_account_return::create();\n\t\t\tadd_account(_args->index, _args->config, _args->passphrase);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x15fcc67eabc550b6ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_add_token>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_add_token_return::create();\n\t\t\tadd_token(_args->address);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x200cca704ba873c6ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_cancel_offer>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_cancel_offer_return::create();\n\t\t\t_return_value->_ret_0 = cancel_offer(_args->index, _args->address, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x20da222e7c7de702ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_complete>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_complete_return::create();\n\t\t\t_return_value->_ret_0 = complete(_args->index, _args->tx, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x11cd618b00e9e56cull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_create_account>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_create_account_return::create();\n\t\t\tcreate_account(_args->config, _args->passphrase);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xdcc08a3a1b171a19ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_create_wallet>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_create_wallet_return::create();\n\t\t\tcreate_wallet(_args->config, _args->words, _args->passphrase);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xcd71b07853d17497ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_deploy>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_deploy_return::create();\n\t\t\t_return_value->_ret_0 = deploy(_args->index, _args->contract, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x4bf71b9049e1c689ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_deposit>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_deposit_return::create();\n\t\t\t_return_value->_ret_0 = deposit(_args->index, _args->address, _args->method, _args->args, _args->amount, _args->currency, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x51a1276a27db7b4ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_execute>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_execute_return::create();\n\t\t\t_return_value->_ret_0 = execute(_args->index, _args->address, _args->method, _args->args, _args->user, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xd52b494df565ce7ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_export_wallet>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_export_wallet_return::create();\n\t\t\t_return_value->_ret_0 = export_wallet(_args->index);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x320237e79adcef6bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_find_wallet_by_addr>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_find_wallet_by_addr_return::create();\n\t\t\t_return_value->_ret_0 = find_wallet_by_addr(_args->address);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x31d9b9888b8c2de3ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_gather_inputs_for>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_gather_inputs_for_return::create();\n\t\t\t_return_value->_ret_0 = gather_inputs_for(_args->index, _args->amount, _args->currency, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf9669d0d42aec09eull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_account>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_account_return::create();\n\t\t\t_return_value->_ret_0 = get_account(_args->index);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xccad8dfe1543aa77ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_address>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_address_return::create();\n\t\t\t_return_value->_ret_0 = get_address(_args->index, _args->offset);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xdf8bfad64085cb83ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_all_accounts>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_all_accounts_return::create();\n\t\t\t_return_value->_ret_0 = get_all_accounts();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf5e2b4554613fd97ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_all_addresses>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_all_addresses_return::create();\n\t\t\t_return_value->_ret_0 = get_all_addresses(_args->index);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xc6a03b3f813d071dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_all_farmer_keys>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_all_farmer_keys_return::create();\n\t\t\t_return_value->_ret_0 = get_all_farmer_keys();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x1bc2c2dd67ab2829ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_balance>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_balance_return::create();\n\t\t\t_return_value->_ret_0 = get_balance(_args->index, _args->currency);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x5be581d54ae69a4ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_balances>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_balances_return::create();\n\t\t\t_return_value->_ret_0 = get_balances(_args->index, _args->with_zero);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x4d6b36c0c2804d26ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_contract_balances>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_contract_balances_return::create();\n\t\t\t_return_value->_ret_0 = get_contract_balances(_args->address);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9ff1932bcec18d57ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_contracts>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_contracts_return::create();\n\t\t\t_return_value->_ret_0 = get_contracts(_args->index, _args->type_name, _args->type_hash);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x7834485ec000f577ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_contracts_owned>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_contracts_owned_return::create();\n\t\t\t_return_value->_ret_0 = get_contracts_owned(_args->index, _args->type_name, _args->type_hash);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x44709e11ff3ff3eeull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_farmer_keys>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_farmer_keys_return::create();\n\t\t\t_return_value->_ret_0 = get_farmer_keys(_args->index);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x921f73f3d97d2d4dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_history>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_history_return::create();\n\t\t\t_return_value->_ret_0 = get_history(_args->index, _args->filter);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x8fddd77ece4d295bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_master_seed>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_master_seed_return::create();\n\t\t\t_return_value->_ret_0 = get_master_seed(_args->index);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xacf58d3b1a8ce4c0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_mnemonic_seed>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_mnemonic_seed_return::create();\n\t\t\t_return_value->_ret_0 = get_mnemonic_seed(_args->index);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xb833298e3ff28a44ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_mnemonic_wordlist>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_mnemonic_wordlist_return::create();\n\t\t\t_return_value->_ret_0 = get_mnemonic_wordlist(_args->lang);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6dacbe70cbe08925ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_offers>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_offers_return::create();\n\t\t\t_return_value->_ret_0 = get_offers(_args->index, _args->state);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x3a8f17d496f625bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_swap_liquidity>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_swap_liquidity_return::create();\n\t\t\t_return_value->_ret_0 = get_swap_liquidity(_args->index);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x322b4f4af3737efcull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_token_list>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_token_list_return::create();\n\t\t\t_return_value->_ret_0 = get_token_list();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xedd130caba2e2f04ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_total_balances>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_total_balances_return::create();\n\t\t\t_return_value->_ret_0 = get_total_balances(_args->addresses);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xc5570936be29c0ebull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_get_tx_log>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_get_tx_log_return::create();\n\t\t\t_return_value->_ret_0 = get_tx_log(_args->index, _args->limit);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x63a1d5b2fe482dd1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_import_wallet>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_import_wallet_return::create();\n\t\t\timport_wallet(_args->config, _args->key_file, _args->passphrase);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6087e83febcc233ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_is_locked>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_is_locked_return::create();\n\t\t\t_return_value->_ret_0 = is_locked(_args->index);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9072deb8ab538b2bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_lock>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_lock_return::create();\n\t\t\tlock(_args->index);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x8b0cf597e8265a73ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_make_offer>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_make_offer_return::create();\n\t\t\t_return_value->_ret_0 = make_offer(_args->index, _args->owner, _args->bid_amount, _args->bid_currency, _args->ask_amount, _args->ask_currency, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x107fed23348b3333ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_mark_spent>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_mark_spent_return::create();\n\t\t\tmark_spent(_args->index, _args->amounts);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x557a94a5a4887bf2ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_offer_trade>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_offer_trade_return::create();\n\t\t\t_return_value->_ret_0 = offer_trade(_args->index, _args->address, _args->amount, _args->dst_addr, _args->price, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x790a334fbf5dd1e6ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_offer_withdraw>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_offer_withdraw_return::create();\n\t\t\t_return_value->_ret_0 = offer_withdraw(_args->index, _args->address, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6b0c985ca2c555c9ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_plotnft_create>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_plotnft_create_return::create();\n\t\t\t_return_value->_ret_0 = plotnft_create(_args->index, _args->name, _args->owner, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xca9e9d0dfde795d1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_plotnft_exec>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_plotnft_exec_return::create();\n\t\t\t_return_value->_ret_0 = plotnft_exec(_args->address, _args->method, _args->args, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x2cd72a3370e05db3ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_release>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_release_return::create();\n\t\t\trelease(_args->index, _args->amounts);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x4bd57b9deca4be51ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_release_all>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_release_all_return::create();\n\t\t\trelease_all();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xc913cdd1600a2609ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_rem_token>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_rem_token_return::create();\n\t\t\trem_token(_args->address);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xdf7d8816958bcb8bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_remove_account>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_remove_account_return::create();\n\t\t\tremove_account(_args->index, _args->account);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xd14c466e8e7ebd76ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_reserve>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_reserve_return::create();\n\t\t\treserve(_args->index, _args->amounts);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x922c4f0299ea0bf4ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_reset_cache>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_reset_cache_return::create();\n\t\t\treset_cache(_args->index);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x3842658ae3c2d5ebull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_send>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_send_return::create();\n\t\t\t_return_value->_ret_0 = send(_args->index, _args->amount, _args->dst_addr, _args->currency, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x40c3c88665341592ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_send_from>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_send_from_return::create();\n\t\t\t_return_value->_ret_0 = send_from(_args->index, _args->amount, _args->dst_addr, _args->src_addr, _args->currency, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x4f35769a1b4c6786ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_send_many>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_send_many_return::create();\n\t\t\t_return_value->_ret_0 = send_many(_args->index, _args->amounts, _args->currency, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x8b7bfc0751d27adbull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_send_off>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_send_off_return::create();\n\t\t\tsend_off(_args->index, _args->tx);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9638ddc0c1d52b15ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_set_address_count>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_set_address_count_return::create();\n\t\t\tset_address_count(_args->index, _args->count);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x5bc54cc8b0112d3aull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_sign_msg>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_sign_msg_return::create();\n\t\t\t_return_value->_ret_0 = sign_msg(_args->index, _args->address, _args->msg);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x232c89cf3ed4d5b1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_sign_off>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_sign_off_return::create();\n\t\t\t_return_value->_ret_0 = sign_off(_args->index, _args->tx, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe053d1ae718e2f64ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_swap_add_liquid>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_swap_add_liquid_return::create();\n\t\t\t_return_value->_ret_0 = swap_add_liquid(_args->index, _args->address, _args->amount, _args->pool_idx, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6494b41c51e158eaull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_swap_rem_liquid>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_swap_rem_liquid_return::create();\n\t\t\t_return_value->_ret_0 = swap_rem_liquid(_args->index, _args->address, _args->amount, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x4b5a42cbf6657910ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_swap_trade>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_swap_trade_return::create();\n\t\t\t_return_value->_ret_0 = swap_trade(_args->index, _args->address, _args->amount, _args->currency, _args->min_trade, _args->num_iter, _args->options);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x800deedf12a4df74ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_unlock>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_unlock_return::create();\n\t\t\tunlock(_args->index, _args->passphrase);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf98cf07accda73b8ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::Wallet_update_cache>(_method);\n\t\t\tauto _return_value = ::mmx::Wallet_update_cache_return::create();\n\t\t\tupdate_cache(_args->index);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xbbc7f1a01044d294ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config(_args->name);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x17f58f68bf83abc0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_object_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config_object();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf6d82bdf66d034a1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_module_info_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_module_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x305ec4d628960e5dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_type_code_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_type_code();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9e95dc280cecca1bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_restart>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_restart_return::create();\n\t\t\tvnx_restart();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6ce3775b41a42697ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_self_test_return::create();\n\t\t\t_return_value->_ret_0 = vnx_self_test();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x362aac91373958b7ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_return::create();\n\t\t\tvnx_set_config(_args->name, _args->value);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xca30f814f17f322full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_object_return::create();\n\t\t\tvnx_set_config_object(_args->config);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x7ab49ce3d1bfc0d2ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_stop>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_stop_return::create();\n\t\t\tvnx_stop();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe0b6c38f619bad92ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::addons::HttpComponent_http_request>(_method);\n\t\t\thttp_request_async(_args->request, _args->sub_path, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t\tcase 0x97e79d08440406d5ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk>(_method);\n\t\t\thttp_request_chunk_async(_args->request, _args->sub_path, _args->offset, _args->max_bytes, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t}\n\tauto _ex = vnx::NoSuchMethod::create();\n\t_ex->method = _method->get_type_name();\n\treturn _ex;\n}\n\nvoid WalletBase::http_request_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpResponse>& _ret_0) const {\n\tauto _return_value = ::vnx::addons::HttpComponent_http_request_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\nvoid WalletBase::http_request_chunk_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpData>& _ret_0) const {\n\tauto _return_value = ::vnx::addons::HttpComponent_http_request_chunk_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::WalletBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_key_files, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_addresses, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_addresses, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[9]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.default_expire, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[10]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.lock_timeout_sec, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[11]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.cache_timeout_ms, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.key_files, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.accounts, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.config_path, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.storage_path, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.database_path, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.node_server, type_code, _field->code.data()); break;\n\t\t\tcase 12: vnx::read(in, value.token_whitelist, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::WalletBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_WalletBase;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::WalletBase>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(24);\n\tvnx::write_value(_buf + 0, value.max_key_files);\n\tvnx::write_value(_buf + 4, value.num_addresses);\n\tvnx::write_value(_buf + 8, value.max_addresses);\n\tvnx::write_value(_buf + 12, value.default_expire);\n\tvnx::write_value(_buf + 16, value.lock_timeout_sec);\n\tvnx::write_value(_buf + 20, value.cache_timeout_ms);\n\tvnx::write(out, value.key_files, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.accounts, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.config_path, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.storage_path, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.database_path, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.node_server, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.token_whitelist, type_code, type_code->fields[12].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::WalletBase& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::WalletBase& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::WalletBase& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/WalletClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/WalletClient.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/Wallet_accept_offer.hxx>\n#include <mmx/Wallet_accept_offer_return.hxx>\n#include <mmx/Wallet_add_account.hxx>\n#include <mmx/Wallet_add_account_return.hxx>\n#include <mmx/Wallet_add_token.hxx>\n#include <mmx/Wallet_add_token_return.hxx>\n#include <mmx/Wallet_cancel_offer.hxx>\n#include <mmx/Wallet_cancel_offer_return.hxx>\n#include <mmx/Wallet_complete.hxx>\n#include <mmx/Wallet_complete_return.hxx>\n#include <mmx/Wallet_create_account.hxx>\n#include <mmx/Wallet_create_account_return.hxx>\n#include <mmx/Wallet_create_wallet.hxx>\n#include <mmx/Wallet_create_wallet_return.hxx>\n#include <mmx/Wallet_deploy.hxx>\n#include <mmx/Wallet_deploy_return.hxx>\n#include <mmx/Wallet_deposit.hxx>\n#include <mmx/Wallet_deposit_return.hxx>\n#include <mmx/Wallet_execute.hxx>\n#include <mmx/Wallet_execute_return.hxx>\n#include <mmx/Wallet_export_wallet.hxx>\n#include <mmx/Wallet_export_wallet_return.hxx>\n#include <mmx/Wallet_find_wallet_by_addr.hxx>\n#include <mmx/Wallet_find_wallet_by_addr_return.hxx>\n#include <mmx/Wallet_gather_inputs_for.hxx>\n#include <mmx/Wallet_gather_inputs_for_return.hxx>\n#include <mmx/Wallet_get_account.hxx>\n#include <mmx/Wallet_get_account_return.hxx>\n#include <mmx/Wallet_get_address.hxx>\n#include <mmx/Wallet_get_address_return.hxx>\n#include <mmx/Wallet_get_all_accounts.hxx>\n#include <mmx/Wallet_get_all_accounts_return.hxx>\n#include <mmx/Wallet_get_all_addresses.hxx>\n#include <mmx/Wallet_get_all_addresses_return.hxx>\n#include <mmx/Wallet_get_all_farmer_keys.hxx>\n#include <mmx/Wallet_get_all_farmer_keys_return.hxx>\n#include <mmx/Wallet_get_balance.hxx>\n#include <mmx/Wallet_get_balance_return.hxx>\n#include <mmx/Wallet_get_balances.hxx>\n#include <mmx/Wallet_get_balances_return.hxx>\n#include <mmx/Wallet_get_contract_balances.hxx>\n#include <mmx/Wallet_get_contract_balances_return.hxx>\n#include <mmx/Wallet_get_contracts.hxx>\n#include <mmx/Wallet_get_contracts_return.hxx>\n#include <mmx/Wallet_get_contracts_owned.hxx>\n#include <mmx/Wallet_get_contracts_owned_return.hxx>\n#include <mmx/Wallet_get_farmer_keys.hxx>\n#include <mmx/Wallet_get_farmer_keys_return.hxx>\n#include <mmx/Wallet_get_history.hxx>\n#include <mmx/Wallet_get_history_return.hxx>\n#include <mmx/Wallet_get_master_seed.hxx>\n#include <mmx/Wallet_get_master_seed_return.hxx>\n#include <mmx/Wallet_get_mnemonic_seed.hxx>\n#include <mmx/Wallet_get_mnemonic_seed_return.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist_return.hxx>\n#include <mmx/Wallet_get_offers.hxx>\n#include <mmx/Wallet_get_offers_return.hxx>\n#include <mmx/Wallet_get_swap_liquidity.hxx>\n#include <mmx/Wallet_get_swap_liquidity_return.hxx>\n#include <mmx/Wallet_get_token_list.hxx>\n#include <mmx/Wallet_get_token_list_return.hxx>\n#include <mmx/Wallet_get_total_balances.hxx>\n#include <mmx/Wallet_get_total_balances_return.hxx>\n#include <mmx/Wallet_get_tx_log.hxx>\n#include <mmx/Wallet_get_tx_log_return.hxx>\n#include <mmx/Wallet_import_wallet.hxx>\n#include <mmx/Wallet_import_wallet_return.hxx>\n#include <mmx/Wallet_is_locked.hxx>\n#include <mmx/Wallet_is_locked_return.hxx>\n#include <mmx/Wallet_lock.hxx>\n#include <mmx/Wallet_lock_return.hxx>\n#include <mmx/Wallet_make_offer.hxx>\n#include <mmx/Wallet_make_offer_return.hxx>\n#include <mmx/Wallet_mark_spent.hxx>\n#include <mmx/Wallet_mark_spent_return.hxx>\n#include <mmx/Wallet_offer_trade.hxx>\n#include <mmx/Wallet_offer_trade_return.hxx>\n#include <mmx/Wallet_offer_withdraw.hxx>\n#include <mmx/Wallet_offer_withdraw_return.hxx>\n#include <mmx/Wallet_plotnft_create.hxx>\n#include <mmx/Wallet_plotnft_create_return.hxx>\n#include <mmx/Wallet_plotnft_exec.hxx>\n#include <mmx/Wallet_plotnft_exec_return.hxx>\n#include <mmx/Wallet_release.hxx>\n#include <mmx/Wallet_release_return.hxx>\n#include <mmx/Wallet_release_all.hxx>\n#include <mmx/Wallet_release_all_return.hxx>\n#include <mmx/Wallet_rem_token.hxx>\n#include <mmx/Wallet_rem_token_return.hxx>\n#include <mmx/Wallet_remove_account.hxx>\n#include <mmx/Wallet_remove_account_return.hxx>\n#include <mmx/Wallet_reserve.hxx>\n#include <mmx/Wallet_reserve_return.hxx>\n#include <mmx/Wallet_reset_cache.hxx>\n#include <mmx/Wallet_reset_cache_return.hxx>\n#include <mmx/Wallet_send.hxx>\n#include <mmx/Wallet_send_return.hxx>\n#include <mmx/Wallet_send_from.hxx>\n#include <mmx/Wallet_send_from_return.hxx>\n#include <mmx/Wallet_send_many.hxx>\n#include <mmx/Wallet_send_many_return.hxx>\n#include <mmx/Wallet_send_off.hxx>\n#include <mmx/Wallet_send_off_return.hxx>\n#include <mmx/Wallet_set_address_count.hxx>\n#include <mmx/Wallet_set_address_count_return.hxx>\n#include <mmx/Wallet_sign_msg.hxx>\n#include <mmx/Wallet_sign_msg_return.hxx>\n#include <mmx/Wallet_sign_off.hxx>\n#include <mmx/Wallet_sign_off_return.hxx>\n#include <mmx/Wallet_swap_add_liquid.hxx>\n#include <mmx/Wallet_swap_add_liquid_return.hxx>\n#include <mmx/Wallet_swap_rem_liquid.hxx>\n#include <mmx/Wallet_swap_rem_liquid_return.hxx>\n#include <mmx/Wallet_swap_trade.hxx>\n#include <mmx/Wallet_swap_trade_return.hxx>\n#include <mmx/Wallet_unlock.hxx>\n#include <mmx/Wallet_unlock_return.hxx>\n#include <mmx/Wallet_update_cache.hxx>\n#include <mmx/Wallet_update_cache_return.hxx>\n#include <mmx/account_info_t.hxx>\n#include <mmx/account_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/skey_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_log_entry_t.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/Variant.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nWalletClient::WalletClient(const std::string& service_name)\n\t:\tClient::Client(vnx::Hash64(service_name))\n{\n}\n\nWalletClient::WalletClient(vnx::Hash64 service_addr)\n\t:\tClient::Client(service_addr)\n{\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::send(const uint32_t& index, const ::mmx::uint128& amount, const ::mmx::addr_t& dst_addr, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_send::create();\n\t_method->index = index;\n\t_method->amount = amount;\n\t_method->dst_addr = dst_addr;\n\t_method->currency = currency;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_send_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::send_many(const uint32_t& index, const std::vector<std::pair<::mmx::addr_t, ::mmx::uint128>>& amounts, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_send_many::create();\n\t_method->index = index;\n\t_method->amounts = amounts;\n\t_method->currency = currency;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_send_many_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::send_from(const uint32_t& index, const ::mmx::uint128& amount, const ::mmx::addr_t& dst_addr, const ::mmx::addr_t& src_addr, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_send_from::create();\n\t_method->index = index;\n\t_method->amount = amount;\n\t_method->dst_addr = dst_addr;\n\t_method->src_addr = src_addr;\n\t_method->currency = currency;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_send_from_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::deploy(const uint32_t& index, std::shared_ptr<const ::mmx::Contract> contract, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_deploy::create();\n\t_method->index = index;\n\t_method->contract = contract;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_deploy_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::execute(const uint32_t& index, const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const vnx::optional<uint32_t>& user, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_execute::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->method = method;\n\t_method->args = args;\n\t_method->user = user;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_execute_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::deposit(const uint32_t& index, const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const ::mmx::uint128& amount, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_deposit::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->method = method;\n\t_method->args = args;\n\t_method->amount = amount;\n\t_method->currency = currency;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_deposit_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::make_offer(const uint32_t& index, const uint32_t& owner, const ::mmx::uint128& bid_amount, const ::mmx::addr_t& bid_currency, const ::mmx::uint128& ask_amount, const ::mmx::addr_t& ask_currency, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_make_offer::create();\n\t_method->index = index;\n\t_method->owner = owner;\n\t_method->bid_amount = bid_amount;\n\t_method->bid_currency = bid_currency;\n\t_method->ask_amount = ask_amount;\n\t_method->ask_currency = ask_currency;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_make_offer_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::offer_trade(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::uint128& amount, const uint32_t& dst_addr, const ::mmx::uint128& price, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_offer_trade::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->amount = amount;\n\t_method->dst_addr = dst_addr;\n\t_method->price = price;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_offer_trade_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::offer_withdraw(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_offer_withdraw::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_offer_withdraw_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::accept_offer(const uint32_t& index, const ::mmx::addr_t& address, const uint32_t& dst_addr, const ::mmx::uint128& price, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_accept_offer::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->dst_addr = dst_addr;\n\t_method->price = price;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_accept_offer_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::cancel_offer(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_cancel_offer::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_cancel_offer_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::swap_trade(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::uint128& amount, const ::mmx::addr_t& currency, const vnx::optional<::mmx::uint128>& min_trade, const int32_t& num_iter, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_swap_trade::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->amount = amount;\n\t_method->currency = currency;\n\t_method->min_trade = min_trade;\n\t_method->num_iter = num_iter;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_swap_trade_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::swap_add_liquid(const uint32_t& index, const ::mmx::addr_t& address, const std::array<::mmx::uint128, 2>& amount, const uint32_t& pool_idx, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_swap_add_liquid::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->amount = amount;\n\t_method->pool_idx = pool_idx;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_swap_add_liquid_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::swap_rem_liquid(const uint32_t& index, const ::mmx::addr_t& address, const std::array<::mmx::uint128, 2>& amount, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_swap_rem_liquid::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->amount = amount;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_swap_rem_liquid_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::plotnft_exec(const ::mmx::addr_t& address, const std::string& method, const std::vector<::vnx::Variant>& args, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_plotnft_exec::create();\n\t_method->address = address;\n\t_method->method = method;\n\t_method->args = args;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_plotnft_exec_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::plotnft_create(const uint32_t& index, const std::string& name, const vnx::optional<uint32_t>& owner, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_plotnft_create::create();\n\t_method->index = index;\n\t_method->name = name;\n\t_method->owner = owner;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_plotnft_create_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::complete(const uint32_t& index, std::shared_ptr<const ::mmx::Transaction> tx, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_complete::create();\n\t_method->index = index;\n\t_method->tx = tx;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_complete_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Transaction> WalletClient::sign_off(const uint32_t& index, std::shared_ptr<const ::mmx::Transaction> tx, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_sign_off::create();\n\t_method->index = index;\n\t_method->tx = tx;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_sign_off_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Transaction>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::mmx::Solution> WalletClient::sign_msg(const uint32_t& index, const ::mmx::addr_t& address, const ::mmx::hash_t& msg) {\n\tauto _method = ::mmx::Wallet_sign_msg::create();\n\t_method->index = index;\n\t_method->address = address;\n\t_method->msg = msg;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_sign_msg_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::Solution>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nvoid WalletClient::send_off(const uint32_t& index, std::shared_ptr<const ::mmx::Transaction> tx) {\n\tauto _method = ::mmx::Wallet_send_off::create();\n\t_method->index = index;\n\t_method->tx = tx;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::send_off_async(const uint32_t& index, std::shared_ptr<const ::mmx::Transaction> tx) {\n\tauto _method = ::mmx::Wallet_send_off::create();\n\t_method->index = index;\n\t_method->tx = tx;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::mark_spent(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts) {\n\tauto _method = ::mmx::Wallet_mark_spent::create();\n\t_method->index = index;\n\t_method->amounts = amounts;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::mark_spent_async(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts) {\n\tauto _method = ::mmx::Wallet_mark_spent::create();\n\t_method->index = index;\n\t_method->amounts = amounts;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::reserve(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts) {\n\tauto _method = ::mmx::Wallet_reserve::create();\n\t_method->index = index;\n\t_method->amounts = amounts;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::reserve_async(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts) {\n\tauto _method = ::mmx::Wallet_reserve::create();\n\t_method->index = index;\n\t_method->amounts = amounts;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::release(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts) {\n\tauto _method = ::mmx::Wallet_release::create();\n\t_method->index = index;\n\t_method->amounts = amounts;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::release_async(const uint32_t& index, const std::map<std::pair<::mmx::addr_t, ::mmx::addr_t>, ::mmx::uint128>& amounts) {\n\tauto _method = ::mmx::Wallet_release::create();\n\t_method->index = index;\n\t_method->amounts = amounts;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::release_all() {\n\tauto _method = ::mmx::Wallet_release_all::create();\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::release_all_async() {\n\tauto _method = ::mmx::Wallet_release_all::create();\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::reset_cache(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_reset_cache::create();\n\t_method->index = index;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::reset_cache_async(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_reset_cache::create();\n\t_method->index = index;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::update_cache(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_update_cache::create();\n\t_method->index = index;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::update_cache_async(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_update_cache::create();\n\t_method->index = index;\n\tvnx_request(_method, true);\n}\n\nstd::vector<::mmx::tx_entry_t> WalletClient::get_history(const uint32_t& index, const ::mmx::query_filter_t& filter) {\n\tauto _method = ::mmx::Wallet_get_history::create();\n\t_method->index = index;\n\t_method->filter = filter;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_history_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::tx_entry_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::tx_log_entry_t> WalletClient::get_tx_log(const uint32_t& index, const int32_t& limit) {\n\tauto _method = ::mmx::Wallet_get_tx_log::create();\n\t_method->index = index;\n\t_method->limit = limit;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_tx_log_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::tx_log_entry_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::txin_t> WalletClient::gather_inputs_for(const uint32_t& index, const ::mmx::uint128& amount, const ::mmx::addr_t& currency, const ::mmx::spend_options_t& options) {\n\tauto _method = ::mmx::Wallet_gather_inputs_for::create();\n\t_method->index = index;\n\t_method->amount = amount;\n\t_method->currency = currency;\n\t_method->options = options;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_gather_inputs_for_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::txin_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\n::mmx::balance_t WalletClient::get_balance(const uint32_t& index, const ::mmx::addr_t& currency) {\n\tauto _method = ::mmx::Wallet_get_balance::create();\n\t_method->index = index;\n\t_method->currency = currency;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_balance_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::balance_t>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::addr_t, ::mmx::balance_t> WalletClient::get_balances(const uint32_t& index, const vnx::bool_t& with_zero) {\n\tauto _method = ::mmx::Wallet_get_balances::create();\n\t_method->index = index;\n\t_method->with_zero = with_zero;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_balances_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::balance_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::addr_t, ::mmx::balance_t> WalletClient::get_total_balances(const std::vector<::mmx::addr_t>& addresses) {\n\tauto _method = ::mmx::Wallet_get_total_balances::create();\n\t_method->addresses = addresses;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_total_balances_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::balance_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::addr_t, ::mmx::balance_t> WalletClient::get_contract_balances(const ::mmx::addr_t& address) {\n\tauto _method = ::mmx::Wallet_get_contract_balances::create();\n\t_method->address = address;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_contract_balances_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::addr_t, ::mmx::balance_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>> WalletClient::get_contracts(const uint32_t& index, const vnx::optional<std::string>& type_name, const vnx::optional<::mmx::hash_t>& type_hash) {\n\tauto _method = ::mmx::Wallet_get_contracts::create();\n\t_method->index = index;\n\t_method->type_name = type_name;\n\t_method->type_hash = type_hash;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_contracts_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>> WalletClient::get_contracts_owned(const uint32_t& index, const vnx::optional<std::string>& type_name, const vnx::optional<::mmx::hash_t>& type_hash) {\n\tauto _method = ::mmx::Wallet_get_contracts_owned::create();\n\t_method->index = index;\n\t_method->type_name = type_name;\n\t_method->type_hash = type_hash;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_contracts_owned_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::addr_t, std::shared_ptr<const ::mmx::Contract>>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::offer_data_t> WalletClient::get_offers(const uint32_t& index, const vnx::bool_t& state) {\n\tauto _method = ::mmx::Wallet_get_offers::create();\n\t_method->index = index;\n\t_method->state = state;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_offers_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::offer_data_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>> WalletClient::get_swap_liquidity(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_get_swap_liquidity::create();\n\t_method->index = index;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_swap_liquidity_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::map<::mmx::addr_t, std::array<std::pair<::mmx::addr_t, ::mmx::uint128>, 2>>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\n::mmx::addr_t WalletClient::get_address(const uint32_t& index, const uint32_t& offset) {\n\tauto _method = ::mmx::Wallet_get_address::create();\n\t_method->index = index;\n\t_method->offset = offset;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_address_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::addr_t>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::addr_t> WalletClient::get_all_addresses(const int32_t& index) {\n\tauto _method = ::mmx::Wallet_get_all_addresses::create();\n\t_method->index = index;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_all_addresses_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::addr_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nint32_t WalletClient::find_wallet_by_addr(const ::mmx::addr_t& address) {\n\tauto _method = ::mmx::Wallet_find_wallet_by_addr::create();\n\t_method->address = address;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_find_wallet_by_addr_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<int32_t>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\n::mmx::account_info_t WalletClient::get_account(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_get_account::create();\n\t_method->index = index;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_account_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::account_info_t>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::vector<::mmx::account_info_t> WalletClient::get_all_accounts() {\n\tauto _method = ::mmx::Wallet_get_all_accounts::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_all_accounts_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<::mmx::account_info_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nvnx::bool_t WalletClient::is_locked(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_is_locked::create();\n\t_method->index = index;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_is_locked_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::bool_t>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nvoid WalletClient::lock(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_lock::create();\n\t_method->index = index;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::lock_async(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_lock::create();\n\t_method->index = index;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::unlock(const uint32_t& index, const std::string& passphrase) {\n\tauto _method = ::mmx::Wallet_unlock::create();\n\t_method->index = index;\n\t_method->passphrase = passphrase;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::unlock_async(const uint32_t& index, const std::string& passphrase) {\n\tauto _method = ::mmx::Wallet_unlock::create();\n\t_method->index = index;\n\t_method->passphrase = passphrase;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::add_account(const uint32_t& index, const ::mmx::account_t& config, const vnx::optional<std::string>& passphrase) {\n\tauto _method = ::mmx::Wallet_add_account::create();\n\t_method->index = index;\n\t_method->config = config;\n\t_method->passphrase = passphrase;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::add_account_async(const uint32_t& index, const ::mmx::account_t& config, const vnx::optional<std::string>& passphrase) {\n\tauto _method = ::mmx::Wallet_add_account::create();\n\t_method->index = index;\n\t_method->config = config;\n\t_method->passphrase = passphrase;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::create_account(const ::mmx::account_t& config, const vnx::optional<std::string>& passphrase) {\n\tauto _method = ::mmx::Wallet_create_account::create();\n\t_method->config = config;\n\t_method->passphrase = passphrase;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::create_account_async(const ::mmx::account_t& config, const vnx::optional<std::string>& passphrase) {\n\tauto _method = ::mmx::Wallet_create_account::create();\n\t_method->config = config;\n\t_method->passphrase = passphrase;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::create_wallet(const ::mmx::account_t& config, const vnx::optional<std::string>& words, const vnx::optional<std::string>& passphrase) {\n\tauto _method = ::mmx::Wallet_create_wallet::create();\n\t_method->config = config;\n\t_method->words = words;\n\t_method->passphrase = passphrase;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::create_wallet_async(const ::mmx::account_t& config, const vnx::optional<std::string>& words, const vnx::optional<std::string>& passphrase) {\n\tauto _method = ::mmx::Wallet_create_wallet::create();\n\t_method->config = config;\n\t_method->words = words;\n\t_method->passphrase = passphrase;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::import_wallet(const ::mmx::account_t& config, std::shared_ptr<const ::mmx::KeyFile> key_file, const vnx::optional<std::string>& passphrase) {\n\tauto _method = ::mmx::Wallet_import_wallet::create();\n\t_method->config = config;\n\t_method->key_file = key_file;\n\t_method->passphrase = passphrase;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::import_wallet_async(const ::mmx::account_t& config, std::shared_ptr<const ::mmx::KeyFile> key_file, const vnx::optional<std::string>& passphrase) {\n\tauto _method = ::mmx::Wallet_import_wallet::create();\n\t_method->config = config;\n\t_method->key_file = key_file;\n\t_method->passphrase = passphrase;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::remove_account(const uint32_t& index, const uint32_t& account) {\n\tauto _method = ::mmx::Wallet_remove_account::create();\n\t_method->index = index;\n\t_method->account = account;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::remove_account_async(const uint32_t& index, const uint32_t& account) {\n\tauto _method = ::mmx::Wallet_remove_account::create();\n\t_method->index = index;\n\t_method->account = account;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::set_address_count(const uint32_t& index, const uint32_t& count) {\n\tauto _method = ::mmx::Wallet_set_address_count::create();\n\t_method->index = index;\n\t_method->count = count;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::set_address_count_async(const uint32_t& index, const uint32_t& count) {\n\tauto _method = ::mmx::Wallet_set_address_count::create();\n\t_method->index = index;\n\t_method->count = count;\n\tvnx_request(_method, true);\n}\n\nstd::vector<std::string> WalletClient::get_mnemonic_wordlist(const std::string& lang) {\n\tauto _method = ::mmx::Wallet_get_mnemonic_wordlist::create();\n\t_method->lang = lang;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_mnemonic_wordlist_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<std::string>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::set<::mmx::addr_t> WalletClient::get_token_list() {\n\tauto _method = ::mmx::Wallet_get_token_list::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_token_list_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::set<::mmx::addr_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nvoid WalletClient::add_token(const ::mmx::addr_t& address) {\n\tauto _method = ::mmx::Wallet_add_token::create();\n\t_method->address = address;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::add_token_async(const ::mmx::addr_t& address) {\n\tauto _method = ::mmx::Wallet_add_token::create();\n\t_method->address = address;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::rem_token(const ::mmx::addr_t& address) {\n\tauto _method = ::mmx::Wallet_rem_token::create();\n\t_method->address = address;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::rem_token_async(const ::mmx::addr_t& address) {\n\tauto _method = ::mmx::Wallet_rem_token::create();\n\t_method->address = address;\n\tvnx_request(_method, true);\n}\n\nstd::shared_ptr<const ::mmx::KeyFile> WalletClient::export_wallet(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_export_wallet::create();\n\t_method->index = index;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_export_wallet_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::mmx::KeyFile>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\n::mmx::hash_t WalletClient::get_master_seed(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_get_master_seed::create();\n\t_method->index = index;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_master_seed_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::mmx::hash_t>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::vector<std::string> WalletClient::get_mnemonic_seed(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_get_mnemonic_seed::create();\n\t_method->index = index;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_mnemonic_seed_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<std::string>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::pair<::mmx::skey_t, ::mmx::pubkey_t> WalletClient::get_farmer_keys(const uint32_t& index) {\n\tauto _method = ::mmx::Wallet_get_farmer_keys::create();\n\t_method->index = index;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_farmer_keys_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::pair<::mmx::skey_t, ::mmx::pubkey_t>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::vector<std::pair<::mmx::skey_t, ::mmx::pubkey_t>> WalletClient::get_all_farmer_keys() {\n\tauto _method = ::mmx::Wallet_get_all_farmer_keys::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::mmx::Wallet_get_all_farmer_keys_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::vector<std::pair<::mmx::skey_t, ::mmx::pubkey_t>>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::addons::HttpResponse> WalletClient::http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpResponse>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::addons::HttpData> WalletClient::http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request_chunk::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\t_method->offset = offset;\n\t_method->max_bytes = max_bytes;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpData>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\n::vnx::Object WalletClient::vnx_get_config_object() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Object>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\n::vnx::Variant WalletClient::vnx_get_config(const std::string& name) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Variant>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nvoid WalletClient::vnx_set_config_object(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::vnx_set_config_object_async(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::vnx_set_config_async(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, true);\n}\n\n::vnx::TypeCode WalletClient::vnx_get_type_code() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::TypeCode>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::ModuleInfo> WalletClient::vnx_get_module_info() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\nvoid WalletClient::vnx_restart() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::vnx_restart_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, true);\n}\n\nvoid WalletClient::vnx_stop() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, false);\n}\n\nvoid WalletClient::vnx_stop_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, true);\n}\n\nvnx::bool_t WalletClient::vnx_self_test() {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::bool_t>();\n\t} else {\n\t\tthrow std::logic_error(\"WalletClient: invalid return value\");\n\t}\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/WalletFile.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/WalletFile.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 WalletFile::VNX_TYPE_HASH(0xefcdc0f20fc4360eull);\nconst vnx::Hash64 WalletFile::VNX_CODE_HASH(0x82ac26e33ee406a0ull);\n\nvnx::Hash64 WalletFile::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string WalletFile::get_type_name() const {\n\treturn \"mmx.WalletFile\";\n}\n\nconst vnx::TypeCode* WalletFile::get_type_code() const {\n\treturn mmx::vnx_native_type_code_WalletFile;\n}\n\nstd::shared_ptr<WalletFile> WalletFile::create() {\n\treturn std::make_shared<WalletFile>();\n}\n\nstd::shared_ptr<vnx::Value> WalletFile::clone() const {\n\treturn std::make_shared<WalletFile>(*this);\n}\n\nvoid WalletFile::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid WalletFile::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid WalletFile::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_WalletFile;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid WalletFile::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.WalletFile\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \"}\";\n}\n\nvoid WalletFile::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object WalletFile::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.WalletFile\";\n\t_object[\"addresses\"] = addresses;\n\treturn _object;\n}\n\nvoid WalletFile::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t}\n\t}\n}\n\nvnx::Variant WalletFile::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid WalletFile::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const WalletFile& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, WalletFile& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* WalletFile::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> WalletFile::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.WalletFile\";\n\ttype_code->type_hash = vnx::Hash64(0xefcdc0f20fc4360eull);\n\ttype_code->code_hash = vnx::Hash64(0x82ac26e33ee406a0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::WalletFile);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<WalletFile>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> WalletFile::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::WalletFile& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::WalletFile& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_WalletFile;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::WalletFile>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::WalletFile& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::WalletFile& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::WalletFile& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_accept_offer.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_accept_offer.hxx>\n#include <mmx/Wallet_accept_offer_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_accept_offer::VNX_TYPE_HASH(0x3299e81eb354b78full);\nconst vnx::Hash64 Wallet_accept_offer::VNX_CODE_HASH(0xaf382e8c8d65c4a9ull);\n\nvnx::Hash64 Wallet_accept_offer::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_accept_offer::get_type_name() const {\n\treturn \"mmx.Wallet.accept_offer\";\n}\n\nconst vnx::TypeCode* Wallet_accept_offer::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_accept_offer;\n}\n\nstd::shared_ptr<Wallet_accept_offer> Wallet_accept_offer::create() {\n\treturn std::make_shared<Wallet_accept_offer>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_accept_offer::clone() const {\n\treturn std::make_shared<Wallet_accept_offer>(*this);\n}\n\nvoid Wallet_accept_offer::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_accept_offer::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_accept_offer::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_accept_offer;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, dst_addr);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, price);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_accept_offer::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.accept_offer\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"dst_addr\\\": \"; vnx::write(_out, dst_addr);\n\t_out << \", \\\"price\\\": \"; vnx::write(_out, price);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_accept_offer::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_accept_offer::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.accept_offer\";\n\t_object[\"index\"] = index;\n\t_object[\"address\"] = address;\n\t_object[\"dst_addr\"] = dst_addr;\n\t_object[\"price\"] = price;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_accept_offer::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"dst_addr\") {\n\t\t\t_entry.second.to(dst_addr);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t} else if(_entry.first == \"price\") {\n\t\t\t_entry.second.to(price);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_accept_offer::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"dst_addr\") {\n\t\treturn vnx::Variant(dst_addr);\n\t}\n\tif(_name == \"price\") {\n\t\treturn vnx::Variant(price);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_accept_offer::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"dst_addr\") {\n\t\t_value.to(dst_addr);\n\t} else if(_name == \"price\") {\n\t\t_value.to(price);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_accept_offer& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_accept_offer& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_accept_offer::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_accept_offer::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.accept_offer\";\n\ttype_code->type_hash = vnx::Hash64(0x3299e81eb354b78full);\n\ttype_code->code_hash = vnx::Hash64(0xaf382e8c8d65c4a9ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_accept_offer);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_accept_offer>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_accept_offer_return::static_get_type_code();\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"dst_addr\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"price\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_accept_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.dst_addr, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.price, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_accept_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_accept_offer;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_accept_offer>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.dst_addr);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.price, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[4].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_accept_offer& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_accept_offer& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_accept_offer& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_accept_offer_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_accept_offer_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_accept_offer_return::VNX_TYPE_HASH(0xb44ec1a26ab66acdull);\nconst vnx::Hash64 Wallet_accept_offer_return::VNX_CODE_HASH(0x14dc42f2564e97bull);\n\nvnx::Hash64 Wallet_accept_offer_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_accept_offer_return::get_type_name() const {\n\treturn \"mmx.Wallet.accept_offer.return\";\n}\n\nconst vnx::TypeCode* Wallet_accept_offer_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_accept_offer_return;\n}\n\nstd::shared_ptr<Wallet_accept_offer_return> Wallet_accept_offer_return::create() {\n\treturn std::make_shared<Wallet_accept_offer_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_accept_offer_return::clone() const {\n\treturn std::make_shared<Wallet_accept_offer_return>(*this);\n}\n\nvoid Wallet_accept_offer_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_accept_offer_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_accept_offer_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_accept_offer_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_accept_offer_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.accept_offer.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_accept_offer_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_accept_offer_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.accept_offer.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_accept_offer_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_accept_offer_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_accept_offer_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_accept_offer_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_accept_offer_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_accept_offer_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_accept_offer_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.accept_offer.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb44ec1a26ab66acdull);\n\ttype_code->code_hash = vnx::Hash64(0x14dc42f2564e97bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_accept_offer_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_accept_offer_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_accept_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_accept_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_accept_offer_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_accept_offer_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_accept_offer_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_accept_offer_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_accept_offer_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_add_account.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_add_account.hxx>\n#include <mmx/Wallet_add_account_return.hxx>\n#include <mmx/account_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_add_account::VNX_TYPE_HASH(0x92d2d3518d9c33aeull);\nconst vnx::Hash64 Wallet_add_account::VNX_CODE_HASH(0xac3163168025d3e3ull);\n\nvnx::Hash64 Wallet_add_account::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_add_account::get_type_name() const {\n\treturn \"mmx.Wallet.add_account\";\n}\n\nconst vnx::TypeCode* Wallet_add_account::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_add_account;\n}\n\nstd::shared_ptr<Wallet_add_account> Wallet_add_account::create() {\n\treturn std::make_shared<Wallet_add_account>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_add_account::clone() const {\n\treturn std::make_shared<Wallet_add_account>(*this);\n}\n\nvoid Wallet_add_account::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_add_account::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_add_account::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_add_account;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, config);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, passphrase);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_add_account::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.add_account\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"config\\\": \"; vnx::write(_out, config);\n\t_out << \", \\\"passphrase\\\": \"; vnx::write(_out, passphrase);\n\t_out << \"}\";\n}\n\nvoid Wallet_add_account::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_add_account::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.add_account\";\n\t_object[\"index\"] = index;\n\t_object[\"config\"] = config;\n\t_object[\"passphrase\"] = passphrase;\n\treturn _object;\n}\n\nvoid Wallet_add_account::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"config\") {\n\t\t\t_entry.second.to(config);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"passphrase\") {\n\t\t\t_entry.second.to(passphrase);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_add_account::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"config\") {\n\t\treturn vnx::Variant(config);\n\t}\n\tif(_name == \"passphrase\") {\n\t\treturn vnx::Variant(passphrase);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_add_account::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"config\") {\n\t\t_value.to(config);\n\t} else if(_name == \"passphrase\") {\n\t\t_value.to(passphrase);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_add_account& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_add_account& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_add_account::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_add_account::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.add_account\";\n\ttype_code->type_hash = vnx::Hash64(0x92d2d3518d9c33aeull);\n\ttype_code->code_hash = vnx::Hash64(0xac3163168025d3e3ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_add_account);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_add_account>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::account_t::static_get_type_code();\n\ttype_code->return_type = ::mmx::Wallet_add_account_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"config\";\n\t\tfield.code = {19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"passphrase\";\n\t\tfield.code = {33, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_add_account& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.config, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.passphrase, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_add_account& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_add_account;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_add_account>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.config, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.passphrase, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_add_account& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_add_account& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_add_account& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_add_account_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_add_account_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_add_account_return::VNX_TYPE_HASH(0xda0b2d71dd9e8336ull);\nconst vnx::Hash64 Wallet_add_account_return::VNX_CODE_HASH(0x4a65f998a0ed8d87ull);\n\nvnx::Hash64 Wallet_add_account_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_add_account_return::get_type_name() const {\n\treturn \"mmx.Wallet.add_account.return\";\n}\n\nconst vnx::TypeCode* Wallet_add_account_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_add_account_return;\n}\n\nstd::shared_ptr<Wallet_add_account_return> Wallet_add_account_return::create() {\n\treturn std::make_shared<Wallet_add_account_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_add_account_return::clone() const {\n\treturn std::make_shared<Wallet_add_account_return>(*this);\n}\n\nvoid Wallet_add_account_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_add_account_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_add_account_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_add_account_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_add_account_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.add_account.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_add_account_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_add_account_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.add_account.return\";\n\treturn _object;\n}\n\nvoid Wallet_add_account_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_add_account_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_add_account_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_add_account_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_add_account_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_add_account_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_add_account_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.add_account.return\";\n\ttype_code->type_hash = vnx::Hash64(0xda0b2d71dd9e8336ull);\n\ttype_code->code_hash = vnx::Hash64(0x4a65f998a0ed8d87ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_add_account_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_add_account_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_add_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_add_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_add_account_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_add_account_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_add_account_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_add_account_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_add_account_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_add_token.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_add_token.hxx>\n#include <mmx/Wallet_add_token_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_add_token::VNX_TYPE_HASH(0x15fcc67eabc550b6ull);\nconst vnx::Hash64 Wallet_add_token::VNX_CODE_HASH(0xaa825d8ce40dfe46ull);\n\nvnx::Hash64 Wallet_add_token::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_add_token::get_type_name() const {\n\treturn \"mmx.Wallet.add_token\";\n}\n\nconst vnx::TypeCode* Wallet_add_token::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_add_token;\n}\n\nstd::shared_ptr<Wallet_add_token> Wallet_add_token::create() {\n\treturn std::make_shared<Wallet_add_token>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_add_token::clone() const {\n\treturn std::make_shared<Wallet_add_token>(*this);\n}\n\nvoid Wallet_add_token::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_add_token::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_add_token::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_add_token;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_add_token::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.add_token\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Wallet_add_token::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_add_token::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.add_token\";\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Wallet_add_token::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_add_token::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_add_token::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_add_token& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_add_token& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_add_token::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_add_token::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.add_token\";\n\ttype_code->type_hash = vnx::Hash64(0x15fcc67eabc550b6ull);\n\ttype_code->code_hash = vnx::Hash64(0xaa825d8ce40dfe46ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_add_token);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_add_token>(); };\n\ttype_code->return_type = ::mmx::Wallet_add_token_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_add_token& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_add_token& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_add_token;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_add_token>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_add_token& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_add_token& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_add_token& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_add_token_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_add_token_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_add_token_return::VNX_TYPE_HASH(0xb0b00a9f88ea83b5ull);\nconst vnx::Hash64 Wallet_add_token_return::VNX_CODE_HASH(0x4fa352b9f7e66ddcull);\n\nvnx::Hash64 Wallet_add_token_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_add_token_return::get_type_name() const {\n\treturn \"mmx.Wallet.add_token.return\";\n}\n\nconst vnx::TypeCode* Wallet_add_token_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_add_token_return;\n}\n\nstd::shared_ptr<Wallet_add_token_return> Wallet_add_token_return::create() {\n\treturn std::make_shared<Wallet_add_token_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_add_token_return::clone() const {\n\treturn std::make_shared<Wallet_add_token_return>(*this);\n}\n\nvoid Wallet_add_token_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_add_token_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_add_token_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_add_token_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_add_token_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.add_token.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_add_token_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_add_token_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.add_token.return\";\n\treturn _object;\n}\n\nvoid Wallet_add_token_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_add_token_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_add_token_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_add_token_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_add_token_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_add_token_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_add_token_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.add_token.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb0b00a9f88ea83b5ull);\n\ttype_code->code_hash = vnx::Hash64(0x4fa352b9f7e66ddcull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_add_token_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_add_token_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_add_token_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_add_token_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_add_token_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_add_token_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_add_token_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_add_token_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_add_token_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_cancel_offer.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_cancel_offer.hxx>\n#include <mmx/Wallet_cancel_offer_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_cancel_offer::VNX_TYPE_HASH(0x200cca704ba873c6ull);\nconst vnx::Hash64 Wallet_cancel_offer::VNX_CODE_HASH(0x9d6109c6fe7f4b4aull);\n\nvnx::Hash64 Wallet_cancel_offer::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_cancel_offer::get_type_name() const {\n\treturn \"mmx.Wallet.cancel_offer\";\n}\n\nconst vnx::TypeCode* Wallet_cancel_offer::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_cancel_offer;\n}\n\nstd::shared_ptr<Wallet_cancel_offer> Wallet_cancel_offer::create() {\n\treturn std::make_shared<Wallet_cancel_offer>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_cancel_offer::clone() const {\n\treturn std::make_shared<Wallet_cancel_offer>(*this);\n}\n\nvoid Wallet_cancel_offer::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_cancel_offer::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_cancel_offer::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_cancel_offer;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_cancel_offer::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.cancel_offer\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_cancel_offer::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_cancel_offer::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.cancel_offer\";\n\t_object[\"index\"] = index;\n\t_object[\"address\"] = address;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_cancel_offer::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_cancel_offer::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_cancel_offer::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_cancel_offer& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_cancel_offer& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_cancel_offer::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_cancel_offer::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.cancel_offer\";\n\ttype_code->type_hash = vnx::Hash64(0x200cca704ba873c6ull);\n\ttype_code->code_hash = vnx::Hash64(0x9d6109c6fe7f4b4aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_cancel_offer);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_cancel_offer>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_cancel_offer_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_cancel_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_cancel_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_cancel_offer;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_cancel_offer>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_cancel_offer& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_cancel_offer& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_cancel_offer& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_cancel_offer_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_cancel_offer_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_cancel_offer_return::VNX_TYPE_HASH(0x86f3531ebf8c56a2ull);\nconst vnx::Hash64 Wallet_cancel_offer_return::VNX_CODE_HASH(0x9a5e615f3ead005aull);\n\nvnx::Hash64 Wallet_cancel_offer_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_cancel_offer_return::get_type_name() const {\n\treturn \"mmx.Wallet.cancel_offer.return\";\n}\n\nconst vnx::TypeCode* Wallet_cancel_offer_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_cancel_offer_return;\n}\n\nstd::shared_ptr<Wallet_cancel_offer_return> Wallet_cancel_offer_return::create() {\n\treturn std::make_shared<Wallet_cancel_offer_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_cancel_offer_return::clone() const {\n\treturn std::make_shared<Wallet_cancel_offer_return>(*this);\n}\n\nvoid Wallet_cancel_offer_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_cancel_offer_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_cancel_offer_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_cancel_offer_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_cancel_offer_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.cancel_offer.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_cancel_offer_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_cancel_offer_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.cancel_offer.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_cancel_offer_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_cancel_offer_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_cancel_offer_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_cancel_offer_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_cancel_offer_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_cancel_offer_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_cancel_offer_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.cancel_offer.return\";\n\ttype_code->type_hash = vnx::Hash64(0x86f3531ebf8c56a2ull);\n\ttype_code->code_hash = vnx::Hash64(0x9a5e615f3ead005aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_cancel_offer_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_cancel_offer_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_cancel_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_cancel_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_cancel_offer_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_cancel_offer_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_cancel_offer_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_cancel_offer_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_cancel_offer_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_complete.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_complete.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/Wallet_complete_return.hxx>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_complete::VNX_TYPE_HASH(0x20da222e7c7de702ull);\nconst vnx::Hash64 Wallet_complete::VNX_CODE_HASH(0xeecf9ff3b992073ull);\n\nvnx::Hash64 Wallet_complete::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_complete::get_type_name() const {\n\treturn \"mmx.Wallet.complete\";\n}\n\nconst vnx::TypeCode* Wallet_complete::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_complete;\n}\n\nstd::shared_ptr<Wallet_complete> Wallet_complete::create() {\n\treturn std::make_shared<Wallet_complete>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_complete::clone() const {\n\treturn std::make_shared<Wallet_complete>(*this);\n}\n\nvoid Wallet_complete::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_complete::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_complete::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_complete;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, tx);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_complete::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.complete\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"tx\\\": \"; vnx::write(_out, tx);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_complete::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_complete::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.complete\";\n\t_object[\"index\"] = index;\n\t_object[\"tx\"] = tx;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_complete::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t} else if(_entry.first == \"tx\") {\n\t\t\t_entry.second.to(tx);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_complete::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"tx\") {\n\t\treturn vnx::Variant(tx);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_complete::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"tx\") {\n\t\t_value.to(tx);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_complete& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_complete& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_complete::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_complete::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.complete\";\n\ttype_code->type_hash = vnx::Hash64(0x20da222e7c7de702ull);\n\ttype_code->code_hash = vnx::Hash64(0xeecf9ff3b992073ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_complete);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_complete>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_complete_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"tx\";\n\t\tfield.code = {16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_complete& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.tx, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_complete& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_complete;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_complete>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.tx, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_complete& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_complete& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_complete& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_complete_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_complete_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_complete_return::VNX_TYPE_HASH(0x490ab9293f9dbfd0ull);\nconst vnx::Hash64 Wallet_complete_return::VNX_CODE_HASH(0x6d1cc1eb61f5cab4ull);\n\nvnx::Hash64 Wallet_complete_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_complete_return::get_type_name() const {\n\treturn \"mmx.Wallet.complete.return\";\n}\n\nconst vnx::TypeCode* Wallet_complete_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_complete_return;\n}\n\nstd::shared_ptr<Wallet_complete_return> Wallet_complete_return::create() {\n\treturn std::make_shared<Wallet_complete_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_complete_return::clone() const {\n\treturn std::make_shared<Wallet_complete_return>(*this);\n}\n\nvoid Wallet_complete_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_complete_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_complete_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_complete_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_complete_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.complete.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_complete_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_complete_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.complete.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_complete_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_complete_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_complete_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_complete_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_complete_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_complete_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_complete_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.complete.return\";\n\ttype_code->type_hash = vnx::Hash64(0x490ab9293f9dbfd0ull);\n\ttype_code->code_hash = vnx::Hash64(0x6d1cc1eb61f5cab4ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_complete_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_complete_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_complete_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_complete_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_complete_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_complete_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_complete_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_complete_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_complete_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_create_account.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_create_account.hxx>\n#include <mmx/Wallet_create_account_return.hxx>\n#include <mmx/account_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_create_account::VNX_TYPE_HASH(0x11cd618b00e9e56cull);\nconst vnx::Hash64 Wallet_create_account::VNX_CODE_HASH(0x108c4cc5921b9e14ull);\n\nvnx::Hash64 Wallet_create_account::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_create_account::get_type_name() const {\n\treturn \"mmx.Wallet.create_account\";\n}\n\nconst vnx::TypeCode* Wallet_create_account::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_create_account;\n}\n\nstd::shared_ptr<Wallet_create_account> Wallet_create_account::create() {\n\treturn std::make_shared<Wallet_create_account>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_create_account::clone() const {\n\treturn std::make_shared<Wallet_create_account>(*this);\n}\n\nvoid Wallet_create_account::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_create_account::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_create_account::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_create_account;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, config);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, passphrase);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_create_account::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.create_account\\\"\";\n\t_out << \", \\\"config\\\": \"; vnx::write(_out, config);\n\t_out << \", \\\"passphrase\\\": \"; vnx::write(_out, passphrase);\n\t_out << \"}\";\n}\n\nvoid Wallet_create_account::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_create_account::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.create_account\";\n\t_object[\"config\"] = config;\n\t_object[\"passphrase\"] = passphrase;\n\treturn _object;\n}\n\nvoid Wallet_create_account::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"config\") {\n\t\t\t_entry.second.to(config);\n\t\t} else if(_entry.first == \"passphrase\") {\n\t\t\t_entry.second.to(passphrase);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_create_account::get_field(const std::string& _name) const {\n\tif(_name == \"config\") {\n\t\treturn vnx::Variant(config);\n\t}\n\tif(_name == \"passphrase\") {\n\t\treturn vnx::Variant(passphrase);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_create_account::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"config\") {\n\t\t_value.to(config);\n\t} else if(_name == \"passphrase\") {\n\t\t_value.to(passphrase);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_create_account& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_create_account& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_create_account::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_create_account::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.create_account\";\n\ttype_code->type_hash = vnx::Hash64(0x11cd618b00e9e56cull);\n\ttype_code->code_hash = vnx::Hash64(0x108c4cc5921b9e14ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_create_account);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_create_account>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::account_t::static_get_type_code();\n\ttype_code->return_type = ::mmx::Wallet_create_account_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"config\";\n\t\tfield.code = {19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"passphrase\";\n\t\tfield.code = {33, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_create_account& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.config, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.passphrase, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_create_account& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_create_account;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_create_account>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.config, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.passphrase, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_create_account& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_create_account& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_create_account& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_create_account_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_create_account_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_create_account_return::VNX_TYPE_HASH(0x3a0ff64dc755a8d8ull);\nconst vnx::Hash64 Wallet_create_account_return::VNX_CODE_HASH(0x9ae25282966aa3a2ull);\n\nvnx::Hash64 Wallet_create_account_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_create_account_return::get_type_name() const {\n\treturn \"mmx.Wallet.create_account.return\";\n}\n\nconst vnx::TypeCode* Wallet_create_account_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_create_account_return;\n}\n\nstd::shared_ptr<Wallet_create_account_return> Wallet_create_account_return::create() {\n\treturn std::make_shared<Wallet_create_account_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_create_account_return::clone() const {\n\treturn std::make_shared<Wallet_create_account_return>(*this);\n}\n\nvoid Wallet_create_account_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_create_account_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_create_account_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_create_account_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_create_account_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.create_account.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_create_account_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_create_account_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.create_account.return\";\n\treturn _object;\n}\n\nvoid Wallet_create_account_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_create_account_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_create_account_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_create_account_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_create_account_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_create_account_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_create_account_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.create_account.return\";\n\ttype_code->type_hash = vnx::Hash64(0x3a0ff64dc755a8d8ull);\n\ttype_code->code_hash = vnx::Hash64(0x9ae25282966aa3a2ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_create_account_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_create_account_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_create_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_create_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_create_account_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_create_account_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_create_account_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_create_account_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_create_account_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_create_wallet.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_create_wallet.hxx>\n#include <mmx/Wallet_create_wallet_return.hxx>\n#include <mmx/account_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_create_wallet::VNX_TYPE_HASH(0xdcc08a3a1b171a19ull);\nconst vnx::Hash64 Wallet_create_wallet::VNX_CODE_HASH(0x264c33f1be540d30ull);\n\nvnx::Hash64 Wallet_create_wallet::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_create_wallet::get_type_name() const {\n\treturn \"mmx.Wallet.create_wallet\";\n}\n\nconst vnx::TypeCode* Wallet_create_wallet::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_create_wallet;\n}\n\nstd::shared_ptr<Wallet_create_wallet> Wallet_create_wallet::create() {\n\treturn std::make_shared<Wallet_create_wallet>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_create_wallet::clone() const {\n\treturn std::make_shared<Wallet_create_wallet>(*this);\n}\n\nvoid Wallet_create_wallet::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_create_wallet::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_create_wallet::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_create_wallet;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, config);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, words);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, passphrase);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_create_wallet::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.create_wallet\\\"\";\n\t_out << \", \\\"config\\\": \"; vnx::write(_out, config);\n\t_out << \", \\\"words\\\": \"; vnx::write(_out, words);\n\t_out << \", \\\"passphrase\\\": \"; vnx::write(_out, passphrase);\n\t_out << \"}\";\n}\n\nvoid Wallet_create_wallet::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_create_wallet::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.create_wallet\";\n\t_object[\"config\"] = config;\n\t_object[\"words\"] = words;\n\t_object[\"passphrase\"] = passphrase;\n\treturn _object;\n}\n\nvoid Wallet_create_wallet::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"config\") {\n\t\t\t_entry.second.to(config);\n\t\t} else if(_entry.first == \"passphrase\") {\n\t\t\t_entry.second.to(passphrase);\n\t\t} else if(_entry.first == \"words\") {\n\t\t\t_entry.second.to(words);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_create_wallet::get_field(const std::string& _name) const {\n\tif(_name == \"config\") {\n\t\treturn vnx::Variant(config);\n\t}\n\tif(_name == \"words\") {\n\t\treturn vnx::Variant(words);\n\t}\n\tif(_name == \"passphrase\") {\n\t\treturn vnx::Variant(passphrase);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_create_wallet::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"config\") {\n\t\t_value.to(config);\n\t} else if(_name == \"words\") {\n\t\t_value.to(words);\n\t} else if(_name == \"passphrase\") {\n\t\t_value.to(passphrase);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_create_wallet& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_create_wallet& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_create_wallet::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_create_wallet::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.create_wallet\";\n\ttype_code->type_hash = vnx::Hash64(0xdcc08a3a1b171a19ull);\n\ttype_code->code_hash = vnx::Hash64(0x264c33f1be540d30ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_create_wallet);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_create_wallet>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::account_t::static_get_type_code();\n\ttype_code->return_type = ::mmx::Wallet_create_wallet_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"config\";\n\t\tfield.code = {19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"words\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"passphrase\";\n\t\tfield.code = {33, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_create_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.config, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.words, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.passphrase, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_create_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_create_wallet;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_create_wallet>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.config, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.words, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.passphrase, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_create_wallet& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_create_wallet& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_create_wallet& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_create_wallet_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_create_wallet_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_create_wallet_return::VNX_TYPE_HASH(0xb417dca300f1949bull);\nconst vnx::Hash64 Wallet_create_wallet_return::VNX_CODE_HASH(0xfd8b5870e6a38549ull);\n\nvnx::Hash64 Wallet_create_wallet_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_create_wallet_return::get_type_name() const {\n\treturn \"mmx.Wallet.create_wallet.return\";\n}\n\nconst vnx::TypeCode* Wallet_create_wallet_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_create_wallet_return;\n}\n\nstd::shared_ptr<Wallet_create_wallet_return> Wallet_create_wallet_return::create() {\n\treturn std::make_shared<Wallet_create_wallet_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_create_wallet_return::clone() const {\n\treturn std::make_shared<Wallet_create_wallet_return>(*this);\n}\n\nvoid Wallet_create_wallet_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_create_wallet_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_create_wallet_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_create_wallet_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_create_wallet_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.create_wallet.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_create_wallet_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_create_wallet_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.create_wallet.return\";\n\treturn _object;\n}\n\nvoid Wallet_create_wallet_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_create_wallet_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_create_wallet_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_create_wallet_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_create_wallet_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_create_wallet_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_create_wallet_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.create_wallet.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb417dca300f1949bull);\n\ttype_code->code_hash = vnx::Hash64(0xfd8b5870e6a38549ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_create_wallet_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_create_wallet_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_create_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_create_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_create_wallet_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_create_wallet_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_create_wallet_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_create_wallet_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_create_wallet_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_deploy.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_deploy.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/Wallet_deploy_return.hxx>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_deploy::VNX_TYPE_HASH(0xcd71b07853d17497ull);\nconst vnx::Hash64 Wallet_deploy::VNX_CODE_HASH(0x1be27370027fbb2bull);\n\nvnx::Hash64 Wallet_deploy::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_deploy::get_type_name() const {\n\treturn \"mmx.Wallet.deploy\";\n}\n\nconst vnx::TypeCode* Wallet_deploy::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_deploy;\n}\n\nstd::shared_ptr<Wallet_deploy> Wallet_deploy::create() {\n\treturn std::make_shared<Wallet_deploy>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_deploy::clone() const {\n\treturn std::make_shared<Wallet_deploy>(*this);\n}\n\nvoid Wallet_deploy::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_deploy::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_deploy::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_deploy;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_deploy::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.deploy\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_deploy::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_deploy::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.deploy\";\n\t_object[\"index\"] = index;\n\t_object[\"contract\"] = contract;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_deploy::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_deploy::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_deploy::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_deploy& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_deploy& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_deploy::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_deploy::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.deploy\";\n\ttype_code->type_hash = vnx::Hash64(0xcd71b07853d17497ull);\n\ttype_code->code_hash = vnx::Hash64(0x1be27370027fbb2bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_deploy);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_deploy>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_deploy_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_deploy& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_deploy& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_deploy;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_deploy>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.contract, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_deploy& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_deploy& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_deploy& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_deploy_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_deploy_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_deploy_return::VNX_TYPE_HASH(0x7de4805b16e313f6ull);\nconst vnx::Hash64 Wallet_deploy_return::VNX_CODE_HASH(0xc60c546662ece15cull);\n\nvnx::Hash64 Wallet_deploy_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_deploy_return::get_type_name() const {\n\treturn \"mmx.Wallet.deploy.return\";\n}\n\nconst vnx::TypeCode* Wallet_deploy_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_deploy_return;\n}\n\nstd::shared_ptr<Wallet_deploy_return> Wallet_deploy_return::create() {\n\treturn std::make_shared<Wallet_deploy_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_deploy_return::clone() const {\n\treturn std::make_shared<Wallet_deploy_return>(*this);\n}\n\nvoid Wallet_deploy_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_deploy_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_deploy_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_deploy_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_deploy_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.deploy.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_deploy_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_deploy_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.deploy.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_deploy_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_deploy_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_deploy_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_deploy_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_deploy_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_deploy_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_deploy_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.deploy.return\";\n\ttype_code->type_hash = vnx::Hash64(0x7de4805b16e313f6ull);\n\ttype_code->code_hash = vnx::Hash64(0xc60c546662ece15cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_deploy_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_deploy_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_deploy_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_deploy_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_deploy_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_deploy_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_deploy_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_deploy_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_deploy_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_deposit.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_deposit.hxx>\n#include <mmx/Wallet_deposit_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_deposit::VNX_TYPE_HASH(0x4bf71b9049e1c689ull);\nconst vnx::Hash64 Wallet_deposit::VNX_CODE_HASH(0xaefaa8c725446070ull);\n\nvnx::Hash64 Wallet_deposit::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_deposit::get_type_name() const {\n\treturn \"mmx.Wallet.deposit\";\n}\n\nconst vnx::TypeCode* Wallet_deposit::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_deposit;\n}\n\nstd::shared_ptr<Wallet_deposit> Wallet_deposit::create() {\n\treturn std::make_shared<Wallet_deposit>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_deposit::clone() const {\n\treturn std::make_shared<Wallet_deposit>(*this);\n}\n\nvoid Wallet_deposit::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_deposit::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_deposit::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_deposit;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, method);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, args);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, currency);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_deposit::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.deposit\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"method\\\": \"; vnx::write(_out, method);\n\t_out << \", \\\"args\\\": \"; vnx::write(_out, args);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_deposit::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_deposit::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.deposit\";\n\t_object[\"index\"] = index;\n\t_object[\"address\"] = address;\n\t_object[\"method\"] = method;\n\t_object[\"args\"] = args;\n\t_object[\"amount\"] = amount;\n\t_object[\"currency\"] = currency;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_deposit::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"args\") {\n\t\t\t_entry.second.to(args);\n\t\t} else if(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"method\") {\n\t\t\t_entry.second.to(method);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_deposit::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"method\") {\n\t\treturn vnx::Variant(method);\n\t}\n\tif(_name == \"args\") {\n\t\treturn vnx::Variant(args);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_deposit::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"method\") {\n\t\t_value.to(method);\n\t} else if(_name == \"args\") {\n\t\t_value.to(args);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_deposit& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_deposit& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_deposit::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_deposit::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.deposit\";\n\ttype_code->type_hash = vnx::Hash64(0x4bf71b9049e1c689ull);\n\ttype_code->code_hash = vnx::Hash64(0xaefaa8c725446070ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_deposit);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_deposit>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_deposit_return::static_get_type_code();\n\ttype_code->fields.resize(7);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"method\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"args\";\n\t\tfield.code = {12, 17};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_deposit& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.method, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.args, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_deposit& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_deposit;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_deposit>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.method, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.args, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.currency, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[6].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_deposit& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_deposit& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_deposit& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_deposit_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_deposit_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_deposit_return::VNX_TYPE_HASH(0xf21ba8f2309d78aeull);\nconst vnx::Hash64 Wallet_deposit_return::VNX_CODE_HASH(0xe82ab591462c56e8ull);\n\nvnx::Hash64 Wallet_deposit_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_deposit_return::get_type_name() const {\n\treturn \"mmx.Wallet.deposit.return\";\n}\n\nconst vnx::TypeCode* Wallet_deposit_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_deposit_return;\n}\n\nstd::shared_ptr<Wallet_deposit_return> Wallet_deposit_return::create() {\n\treturn std::make_shared<Wallet_deposit_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_deposit_return::clone() const {\n\treturn std::make_shared<Wallet_deposit_return>(*this);\n}\n\nvoid Wallet_deposit_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_deposit_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_deposit_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_deposit_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_deposit_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.deposit.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_deposit_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_deposit_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.deposit.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_deposit_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_deposit_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_deposit_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_deposit_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_deposit_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_deposit_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_deposit_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.deposit.return\";\n\ttype_code->type_hash = vnx::Hash64(0xf21ba8f2309d78aeull);\n\ttype_code->code_hash = vnx::Hash64(0xe82ab591462c56e8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_deposit_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_deposit_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_deposit_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_deposit_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_deposit_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_deposit_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_deposit_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_deposit_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_deposit_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_execute.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_execute.hxx>\n#include <mmx/Wallet_execute_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_execute::VNX_TYPE_HASH(0x51a1276a27db7b4ull);\nconst vnx::Hash64 Wallet_execute::VNX_CODE_HASH(0xc1b7e135bce1a74cull);\n\nvnx::Hash64 Wallet_execute::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_execute::get_type_name() const {\n\treturn \"mmx.Wallet.execute\";\n}\n\nconst vnx::TypeCode* Wallet_execute::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_execute;\n}\n\nstd::shared_ptr<Wallet_execute> Wallet_execute::create() {\n\treturn std::make_shared<Wallet_execute>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_execute::clone() const {\n\treturn std::make_shared<Wallet_execute>(*this);\n}\n\nvoid Wallet_execute::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_execute::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_execute::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_execute;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, method);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, args);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, user);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_execute::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.execute\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"method\\\": \"; vnx::write(_out, method);\n\t_out << \", \\\"args\\\": \"; vnx::write(_out, args);\n\t_out << \", \\\"user\\\": \"; vnx::write(_out, user);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_execute::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_execute::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.execute\";\n\t_object[\"index\"] = index;\n\t_object[\"address\"] = address;\n\t_object[\"method\"] = method;\n\t_object[\"args\"] = args;\n\t_object[\"user\"] = user;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_execute::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"args\") {\n\t\t\t_entry.second.to(args);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"method\") {\n\t\t\t_entry.second.to(method);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t} else if(_entry.first == \"user\") {\n\t\t\t_entry.second.to(user);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_execute::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"method\") {\n\t\treturn vnx::Variant(method);\n\t}\n\tif(_name == \"args\") {\n\t\treturn vnx::Variant(args);\n\t}\n\tif(_name == \"user\") {\n\t\treturn vnx::Variant(user);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_execute::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"method\") {\n\t\t_value.to(method);\n\t} else if(_name == \"args\") {\n\t\t_value.to(args);\n\t} else if(_name == \"user\") {\n\t\t_value.to(user);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_execute& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_execute& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_execute::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_execute::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.execute\";\n\ttype_code->type_hash = vnx::Hash64(0x51a1276a27db7b4ull);\n\ttype_code->code_hash = vnx::Hash64(0xc1b7e135bce1a74cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_execute);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_execute>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_execute_return::static_get_type_code();\n\ttype_code->fields.resize(6);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"method\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"args\";\n\t\tfield.code = {12, 17};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user\";\n\t\tfield.code = {33, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_execute& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.method, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.args, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.user, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_execute& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_execute;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_execute>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.method, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.args, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.user, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[5].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_execute& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_execute& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_execute& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_execute_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_execute_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_execute_return::VNX_TYPE_HASH(0x9a51f18a1c26c764ull);\nconst vnx::Hash64 Wallet_execute_return::VNX_CODE_HASH(0xd8c90a60b537d423ull);\n\nvnx::Hash64 Wallet_execute_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_execute_return::get_type_name() const {\n\treturn \"mmx.Wallet.execute.return\";\n}\n\nconst vnx::TypeCode* Wallet_execute_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_execute_return;\n}\n\nstd::shared_ptr<Wallet_execute_return> Wallet_execute_return::create() {\n\treturn std::make_shared<Wallet_execute_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_execute_return::clone() const {\n\treturn std::make_shared<Wallet_execute_return>(*this);\n}\n\nvoid Wallet_execute_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_execute_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_execute_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_execute_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_execute_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.execute.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_execute_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_execute_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.execute.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_execute_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_execute_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_execute_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_execute_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_execute_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_execute_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_execute_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.execute.return\";\n\ttype_code->type_hash = vnx::Hash64(0x9a51f18a1c26c764ull);\n\ttype_code->code_hash = vnx::Hash64(0xd8c90a60b537d423ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_execute_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_execute_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_execute_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_execute_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_execute_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_execute_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_execute_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_execute_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_execute_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_export_wallet.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_export_wallet.hxx>\n#include <mmx/Wallet_export_wallet_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_export_wallet::VNX_TYPE_HASH(0xd52b494df565ce7ull);\nconst vnx::Hash64 Wallet_export_wallet::VNX_CODE_HASH(0xc0b375e8fc8b3baaull);\n\nvnx::Hash64 Wallet_export_wallet::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_export_wallet::get_type_name() const {\n\treturn \"mmx.Wallet.export_wallet\";\n}\n\nconst vnx::TypeCode* Wallet_export_wallet::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_export_wallet;\n}\n\nstd::shared_ptr<Wallet_export_wallet> Wallet_export_wallet::create() {\n\treturn std::make_shared<Wallet_export_wallet>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_export_wallet::clone() const {\n\treturn std::make_shared<Wallet_export_wallet>(*this);\n}\n\nvoid Wallet_export_wallet::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_export_wallet::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_export_wallet::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_export_wallet;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_export_wallet::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.export_wallet\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \"}\";\n}\n\nvoid Wallet_export_wallet::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_export_wallet::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.export_wallet\";\n\t_object[\"index\"] = index;\n\treturn _object;\n}\n\nvoid Wallet_export_wallet::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_export_wallet::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_export_wallet::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_export_wallet& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_export_wallet& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_export_wallet::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_export_wallet::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.export_wallet\";\n\ttype_code->type_hash = vnx::Hash64(0xd52b494df565ce7ull);\n\ttype_code->code_hash = vnx::Hash64(0xc0b375e8fc8b3baaull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_export_wallet);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_export_wallet>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_export_wallet_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_export_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_export_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_export_wallet;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_export_wallet>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_export_wallet& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_export_wallet& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_export_wallet& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_export_wallet_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_export_wallet_return.hxx>\n#include <mmx/KeyFile.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_export_wallet_return::VNX_TYPE_HASH(0x1c82818ba92b03f4ull);\nconst vnx::Hash64 Wallet_export_wallet_return::VNX_CODE_HASH(0x142d10722ca18e49ull);\n\nvnx::Hash64 Wallet_export_wallet_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_export_wallet_return::get_type_name() const {\n\treturn \"mmx.Wallet.export_wallet.return\";\n}\n\nconst vnx::TypeCode* Wallet_export_wallet_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_export_wallet_return;\n}\n\nstd::shared_ptr<Wallet_export_wallet_return> Wallet_export_wallet_return::create() {\n\treturn std::make_shared<Wallet_export_wallet_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_export_wallet_return::clone() const {\n\treturn std::make_shared<Wallet_export_wallet_return>(*this);\n}\n\nvoid Wallet_export_wallet_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_export_wallet_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_export_wallet_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_export_wallet_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_export_wallet_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.export_wallet.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_export_wallet_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_export_wallet_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.export_wallet.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_export_wallet_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_export_wallet_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_export_wallet_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_export_wallet_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_export_wallet_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_export_wallet_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_export_wallet_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.export_wallet.return\";\n\ttype_code->type_hash = vnx::Hash64(0x1c82818ba92b03f4ull);\n\ttype_code->code_hash = vnx::Hash64(0x142d10722ca18e49ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_export_wallet_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_export_wallet_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_export_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_export_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_export_wallet_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_export_wallet_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_export_wallet_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_export_wallet_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_export_wallet_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_find_wallet_by_addr.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_find_wallet_by_addr.hxx>\n#include <mmx/Wallet_find_wallet_by_addr_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_find_wallet_by_addr::VNX_TYPE_HASH(0x320237e79adcef6bull);\nconst vnx::Hash64 Wallet_find_wallet_by_addr::VNX_CODE_HASH(0x46ac506f00ac8beaull);\n\nvnx::Hash64 Wallet_find_wallet_by_addr::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_find_wallet_by_addr::get_type_name() const {\n\treturn \"mmx.Wallet.find_wallet_by_addr\";\n}\n\nconst vnx::TypeCode* Wallet_find_wallet_by_addr::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_find_wallet_by_addr;\n}\n\nstd::shared_ptr<Wallet_find_wallet_by_addr> Wallet_find_wallet_by_addr::create() {\n\treturn std::make_shared<Wallet_find_wallet_by_addr>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_find_wallet_by_addr::clone() const {\n\treturn std::make_shared<Wallet_find_wallet_by_addr>(*this);\n}\n\nvoid Wallet_find_wallet_by_addr::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_find_wallet_by_addr::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_find_wallet_by_addr::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_find_wallet_by_addr;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_find_wallet_by_addr::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.find_wallet_by_addr\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Wallet_find_wallet_by_addr::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_find_wallet_by_addr::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.find_wallet_by_addr\";\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Wallet_find_wallet_by_addr::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_find_wallet_by_addr::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_find_wallet_by_addr::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_find_wallet_by_addr& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_find_wallet_by_addr& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_find_wallet_by_addr::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_find_wallet_by_addr::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.find_wallet_by_addr\";\n\ttype_code->type_hash = vnx::Hash64(0x320237e79adcef6bull);\n\ttype_code->code_hash = vnx::Hash64(0x46ac506f00ac8beaull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_find_wallet_by_addr);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_find_wallet_by_addr>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_find_wallet_by_addr_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_find_wallet_by_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_find_wallet_by_addr& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_find_wallet_by_addr;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_find_wallet_by_addr>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_find_wallet_by_addr& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_find_wallet_by_addr& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_find_wallet_by_addr& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_find_wallet_by_addr_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_find_wallet_by_addr_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_find_wallet_by_addr_return::VNX_TYPE_HASH(0xdae07576f8844f6aull);\nconst vnx::Hash64 Wallet_find_wallet_by_addr_return::VNX_CODE_HASH(0x79efe2f1d0b77bc2ull);\n\nvnx::Hash64 Wallet_find_wallet_by_addr_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_find_wallet_by_addr_return::get_type_name() const {\n\treturn \"mmx.Wallet.find_wallet_by_addr.return\";\n}\n\nconst vnx::TypeCode* Wallet_find_wallet_by_addr_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_find_wallet_by_addr_return;\n}\n\nstd::shared_ptr<Wallet_find_wallet_by_addr_return> Wallet_find_wallet_by_addr_return::create() {\n\treturn std::make_shared<Wallet_find_wallet_by_addr_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_find_wallet_by_addr_return::clone() const {\n\treturn std::make_shared<Wallet_find_wallet_by_addr_return>(*this);\n}\n\nvoid Wallet_find_wallet_by_addr_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_find_wallet_by_addr_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_find_wallet_by_addr_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_find_wallet_by_addr_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_find_wallet_by_addr_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.find_wallet_by_addr.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_find_wallet_by_addr_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_find_wallet_by_addr_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.find_wallet_by_addr.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_find_wallet_by_addr_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_find_wallet_by_addr_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_find_wallet_by_addr_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_find_wallet_by_addr_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_find_wallet_by_addr_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_find_wallet_by_addr_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_find_wallet_by_addr_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.find_wallet_by_addr.return\";\n\ttype_code->type_hash = vnx::Hash64(0xdae07576f8844f6aull);\n\ttype_code->code_hash = vnx::Hash64(0x79efe2f1d0b77bc2ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_find_wallet_by_addr_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_find_wallet_by_addr_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {7};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_find_wallet_by_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value._ret_0, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_find_wallet_by_addr_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_find_wallet_by_addr_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_find_wallet_by_addr_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value._ret_0);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_find_wallet_by_addr_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_find_wallet_by_addr_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_find_wallet_by_addr_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_gather_inputs_for.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_gather_inputs_for.hxx>\n#include <mmx/Wallet_gather_inputs_for_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_gather_inputs_for::VNX_TYPE_HASH(0x31d9b9888b8c2de3ull);\nconst vnx::Hash64 Wallet_gather_inputs_for::VNX_CODE_HASH(0x6db80cec63fa392aull);\n\nvnx::Hash64 Wallet_gather_inputs_for::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_gather_inputs_for::get_type_name() const {\n\treturn \"mmx.Wallet.gather_inputs_for\";\n}\n\nconst vnx::TypeCode* Wallet_gather_inputs_for::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_gather_inputs_for;\n}\n\nstd::shared_ptr<Wallet_gather_inputs_for> Wallet_gather_inputs_for::create() {\n\treturn std::make_shared<Wallet_gather_inputs_for>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_gather_inputs_for::clone() const {\n\treturn std::make_shared<Wallet_gather_inputs_for>(*this);\n}\n\nvoid Wallet_gather_inputs_for::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_gather_inputs_for::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_gather_inputs_for::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_gather_inputs_for;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, currency);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_gather_inputs_for::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.gather_inputs_for\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_gather_inputs_for::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_gather_inputs_for::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.gather_inputs_for\";\n\t_object[\"index\"] = index;\n\t_object[\"amount\"] = amount;\n\t_object[\"currency\"] = currency;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_gather_inputs_for::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_gather_inputs_for::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_gather_inputs_for::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_gather_inputs_for& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_gather_inputs_for& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_gather_inputs_for::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_gather_inputs_for::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.gather_inputs_for\";\n\ttype_code->type_hash = vnx::Hash64(0x31d9b9888b8c2de3ull);\n\ttype_code->code_hash = vnx::Hash64(0x6db80cec63fa392aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_gather_inputs_for);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_gather_inputs_for>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_gather_inputs_for_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_gather_inputs_for& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_gather_inputs_for& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_gather_inputs_for;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_gather_inputs_for>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.amount, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.currency, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_gather_inputs_for& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_gather_inputs_for& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_gather_inputs_for& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_gather_inputs_for_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_gather_inputs_for_return.hxx>\n#include <mmx/txin_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_gather_inputs_for_return::VNX_TYPE_HASH(0xb099ed949b98dc77ull);\nconst vnx::Hash64 Wallet_gather_inputs_for_return::VNX_CODE_HASH(0x4cc0d97d743ebac6ull);\n\nvnx::Hash64 Wallet_gather_inputs_for_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_gather_inputs_for_return::get_type_name() const {\n\treturn \"mmx.Wallet.gather_inputs_for.return\";\n}\n\nconst vnx::TypeCode* Wallet_gather_inputs_for_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_gather_inputs_for_return;\n}\n\nstd::shared_ptr<Wallet_gather_inputs_for_return> Wallet_gather_inputs_for_return::create() {\n\treturn std::make_shared<Wallet_gather_inputs_for_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_gather_inputs_for_return::clone() const {\n\treturn std::make_shared<Wallet_gather_inputs_for_return>(*this);\n}\n\nvoid Wallet_gather_inputs_for_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_gather_inputs_for_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_gather_inputs_for_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_gather_inputs_for_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_gather_inputs_for_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.gather_inputs_for.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_gather_inputs_for_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_gather_inputs_for_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.gather_inputs_for.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_gather_inputs_for_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_gather_inputs_for_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_gather_inputs_for_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_gather_inputs_for_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_gather_inputs_for_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_gather_inputs_for_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_gather_inputs_for_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.gather_inputs_for.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb099ed949b98dc77ull);\n\ttype_code->code_hash = vnx::Hash64(0x4cc0d97d743ebac6ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_gather_inputs_for_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_gather_inputs_for_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::txin_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_gather_inputs_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_gather_inputs_for_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_gather_inputs_for_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_gather_inputs_for_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_gather_inputs_for_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_gather_inputs_for_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_gather_inputs_for_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_account.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_account.hxx>\n#include <mmx/Wallet_get_account_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_account::VNX_TYPE_HASH(0xf9669d0d42aec09eull);\nconst vnx::Hash64 Wallet_get_account::VNX_CODE_HASH(0x7da3abcca0d0ba17ull);\n\nvnx::Hash64 Wallet_get_account::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_account::get_type_name() const {\n\treturn \"mmx.Wallet.get_account\";\n}\n\nconst vnx::TypeCode* Wallet_get_account::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_account;\n}\n\nstd::shared_ptr<Wallet_get_account> Wallet_get_account::create() {\n\treturn std::make_shared<Wallet_get_account>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_account::clone() const {\n\treturn std::make_shared<Wallet_get_account>(*this);\n}\n\nvoid Wallet_get_account::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_account::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_account::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_account;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_account::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_account\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_account::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_account::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_account\";\n\t_object[\"index\"] = index;\n\treturn _object;\n}\n\nvoid Wallet_get_account::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_account::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_account::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_account& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_account& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_account::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_account::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_account\";\n\ttype_code->type_hash = vnx::Hash64(0xf9669d0d42aec09eull);\n\ttype_code->code_hash = vnx::Hash64(0x7da3abcca0d0ba17ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_account);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_account>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_account_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_account& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_account& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_account;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_account>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_account& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_account& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_account& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_account_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_account_return.hxx>\n#include <mmx/account_info_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_account_return::VNX_TYPE_HASH(0xaed020aa500eed2bull);\nconst vnx::Hash64 Wallet_get_account_return::VNX_CODE_HASH(0xbe35658acbfd3afeull);\n\nvnx::Hash64 Wallet_get_account_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_account_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_account.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_account_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_account_return;\n}\n\nstd::shared_ptr<Wallet_get_account_return> Wallet_get_account_return::create() {\n\treturn std::make_shared<Wallet_get_account_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_account_return::clone() const {\n\treturn std::make_shared<Wallet_get_account_return>(*this);\n}\n\nvoid Wallet_get_account_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_account_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_account_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_account_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_account_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_account.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_account_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_account_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_account.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_account_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_account_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_account_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_account_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_account_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_account_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_account_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_account.return\";\n\ttype_code->type_hash = vnx::Hash64(0xaed020aa500eed2bull);\n\ttype_code->code_hash = vnx::Hash64(0xbe35658acbfd3afeull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_account_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_account_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::account_info_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_account_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_account_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_account_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_account_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_account_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_address.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_address.hxx>\n#include <mmx/Wallet_get_address_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_address::VNX_TYPE_HASH(0xccad8dfe1543aa77ull);\nconst vnx::Hash64 Wallet_get_address::VNX_CODE_HASH(0x82d9df386952e8a8ull);\n\nvnx::Hash64 Wallet_get_address::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_address::get_type_name() const {\n\treturn \"mmx.Wallet.get_address\";\n}\n\nconst vnx::TypeCode* Wallet_get_address::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_address;\n}\n\nstd::shared_ptr<Wallet_get_address> Wallet_get_address::create() {\n\treturn std::make_shared<Wallet_get_address>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_address::clone() const {\n\treturn std::make_shared<Wallet_get_address>(*this);\n}\n\nvoid Wallet_get_address::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_address::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_address::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_address;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, offset);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_address::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_address\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"offset\\\": \"; vnx::write(_out, offset);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_address::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_address::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_address\";\n\t_object[\"index\"] = index;\n\t_object[\"offset\"] = offset;\n\treturn _object;\n}\n\nvoid Wallet_get_address::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"offset\") {\n\t\t\t_entry.second.to(offset);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_address::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"offset\") {\n\t\treturn vnx::Variant(offset);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_address::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"offset\") {\n\t\t_value.to(offset);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_address& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_address& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_address::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_address::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_address\";\n\ttype_code->type_hash = vnx::Hash64(0xccad8dfe1543aa77ull);\n\ttype_code->code_hash = vnx::Hash64(0x82d9df386952e8a8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_address);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_address>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_address_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"offset\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_address& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.offset, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_address& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_address;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_address>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.offset);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_address& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_address& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_address& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_address_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_address_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_address_return::VNX_TYPE_HASH(0x4c76a08d8d85c4e4ull);\nconst vnx::Hash64 Wallet_get_address_return::VNX_CODE_HASH(0xfd6ffc6bcfd8bc0cull);\n\nvnx::Hash64 Wallet_get_address_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_address_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_address.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_address_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_address_return;\n}\n\nstd::shared_ptr<Wallet_get_address_return> Wallet_get_address_return::create() {\n\treturn std::make_shared<Wallet_get_address_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_address_return::clone() const {\n\treturn std::make_shared<Wallet_get_address_return>(*this);\n}\n\nvoid Wallet_get_address_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_address_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_address_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_address_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_address_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_address.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_address_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_address_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_address.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_address_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_address_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_address_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_address_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_address_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_address_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_address_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_address.return\";\n\ttype_code->type_hash = vnx::Hash64(0x4c76a08d8d85c4e4ull);\n\ttype_code->code_hash = vnx::Hash64(0xfd6ffc6bcfd8bc0cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_address_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_address_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_address_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_address_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_address_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_address_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_address_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_address_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_address_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_all_accounts.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_all_accounts.hxx>\n#include <mmx/Wallet_get_all_accounts_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_all_accounts::VNX_TYPE_HASH(0xdf8bfad64085cb83ull);\nconst vnx::Hash64 Wallet_get_all_accounts::VNX_CODE_HASH(0x5f12990adbec3d71ull);\n\nvnx::Hash64 Wallet_get_all_accounts::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_all_accounts::get_type_name() const {\n\treturn \"mmx.Wallet.get_all_accounts\";\n}\n\nconst vnx::TypeCode* Wallet_get_all_accounts::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_accounts;\n}\n\nstd::shared_ptr<Wallet_get_all_accounts> Wallet_get_all_accounts::create() {\n\treturn std::make_shared<Wallet_get_all_accounts>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_all_accounts::clone() const {\n\treturn std::make_shared<Wallet_get_all_accounts>(*this);\n}\n\nvoid Wallet_get_all_accounts::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_accounts::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_accounts::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_all_accounts;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_all_accounts::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_all_accounts\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_get_all_accounts::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_all_accounts::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_all_accounts\";\n\treturn _object;\n}\n\nvoid Wallet_get_all_accounts::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_get_all_accounts::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_all_accounts::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_all_accounts& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_all_accounts& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_all_accounts::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_all_accounts::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_all_accounts\";\n\ttype_code->type_hash = vnx::Hash64(0xdf8bfad64085cb83ull);\n\ttype_code->code_hash = vnx::Hash64(0x5f12990adbec3d71ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_all_accounts);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_all_accounts>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_all_accounts_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_accounts& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_accounts& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_all_accounts;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_all_accounts>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_all_accounts& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_accounts& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_accounts& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_all_accounts_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_all_accounts_return.hxx>\n#include <mmx/account_info_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_all_accounts_return::VNX_TYPE_HASH(0x2bb48cc4299c5782ull);\nconst vnx::Hash64 Wallet_get_all_accounts_return::VNX_CODE_HASH(0xc75b9ab56069f16dull);\n\nvnx::Hash64 Wallet_get_all_accounts_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_all_accounts_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_all_accounts.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_all_accounts_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_accounts_return;\n}\n\nstd::shared_ptr<Wallet_get_all_accounts_return> Wallet_get_all_accounts_return::create() {\n\treturn std::make_shared<Wallet_get_all_accounts_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_all_accounts_return::clone() const {\n\treturn std::make_shared<Wallet_get_all_accounts_return>(*this);\n}\n\nvoid Wallet_get_all_accounts_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_accounts_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_accounts_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_all_accounts_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_all_accounts_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_all_accounts.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_all_accounts_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_all_accounts_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_all_accounts.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_all_accounts_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_all_accounts_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_all_accounts_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_all_accounts_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_all_accounts_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_all_accounts_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_all_accounts_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_all_accounts.return\";\n\ttype_code->type_hash = vnx::Hash64(0x2bb48cc4299c5782ull);\n\ttype_code->code_hash = vnx::Hash64(0xc75b9ab56069f16dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_all_accounts_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_all_accounts_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::account_info_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_accounts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_accounts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_all_accounts_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_all_accounts_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_all_accounts_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_accounts_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_accounts_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_all_addresses.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_all_addresses.hxx>\n#include <mmx/Wallet_get_all_addresses_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_all_addresses::VNX_TYPE_HASH(0xf5e2b4554613fd97ull);\nconst vnx::Hash64 Wallet_get_all_addresses::VNX_CODE_HASH(0x9c42c4048d370e6eull);\n\nvnx::Hash64 Wallet_get_all_addresses::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_all_addresses::get_type_name() const {\n\treturn \"mmx.Wallet.get_all_addresses\";\n}\n\nconst vnx::TypeCode* Wallet_get_all_addresses::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_addresses;\n}\n\nstd::shared_ptr<Wallet_get_all_addresses> Wallet_get_all_addresses::create() {\n\treturn std::make_shared<Wallet_get_all_addresses>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_all_addresses::clone() const {\n\treturn std::make_shared<Wallet_get_all_addresses>(*this);\n}\n\nvoid Wallet_get_all_addresses::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_addresses::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_addresses::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_all_addresses;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_all_addresses::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_all_addresses\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_all_addresses::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_all_addresses::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_all_addresses\";\n\t_object[\"index\"] = index;\n\treturn _object;\n}\n\nvoid Wallet_get_all_addresses::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_all_addresses::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_all_addresses::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_all_addresses& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_all_addresses& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_all_addresses::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_all_addresses::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_all_addresses\";\n\ttype_code->type_hash = vnx::Hash64(0xf5e2b4554613fd97ull);\n\ttype_code->code_hash = vnx::Hash64(0x9c42c4048d370e6eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_all_addresses);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_all_addresses>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_all_addresses_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {7};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_addresses& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_addresses& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_all_addresses;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_all_addresses>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_all_addresses& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_addresses& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_addresses& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_all_addresses_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_all_addresses_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_all_addresses_return::VNX_TYPE_HASH(0x2f16846155284194ull);\nconst vnx::Hash64 Wallet_get_all_addresses_return::VNX_CODE_HASH(0x577287a7d2ffb203ull);\n\nvnx::Hash64 Wallet_get_all_addresses_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_all_addresses_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_all_addresses.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_all_addresses_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_addresses_return;\n}\n\nstd::shared_ptr<Wallet_get_all_addresses_return> Wallet_get_all_addresses_return::create() {\n\treturn std::make_shared<Wallet_get_all_addresses_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_all_addresses_return::clone() const {\n\treturn std::make_shared<Wallet_get_all_addresses_return>(*this);\n}\n\nvoid Wallet_get_all_addresses_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_addresses_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_addresses_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_all_addresses_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_all_addresses_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_all_addresses.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_all_addresses_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_all_addresses_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_all_addresses.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_all_addresses_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_all_addresses_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_all_addresses_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_all_addresses_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_all_addresses_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_all_addresses_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_all_addresses_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_all_addresses.return\";\n\ttype_code->type_hash = vnx::Hash64(0x2f16846155284194ull);\n\ttype_code->code_hash = vnx::Hash64(0x577287a7d2ffb203ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_all_addresses_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_all_addresses_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_addresses_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_addresses_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_all_addresses_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_all_addresses_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_all_addresses_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_addresses_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_addresses_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_all_farmer_keys.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_all_farmer_keys.hxx>\n#include <mmx/Wallet_get_all_farmer_keys_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_all_farmer_keys::VNX_TYPE_HASH(0xc6a03b3f813d071dull);\nconst vnx::Hash64 Wallet_get_all_farmer_keys::VNX_CODE_HASH(0xac0ac802c63290ffull);\n\nvnx::Hash64 Wallet_get_all_farmer_keys::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_all_farmer_keys::get_type_name() const {\n\treturn \"mmx.Wallet.get_all_farmer_keys\";\n}\n\nconst vnx::TypeCode* Wallet_get_all_farmer_keys::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_farmer_keys;\n}\n\nstd::shared_ptr<Wallet_get_all_farmer_keys> Wallet_get_all_farmer_keys::create() {\n\treturn std::make_shared<Wallet_get_all_farmer_keys>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_all_farmer_keys::clone() const {\n\treturn std::make_shared<Wallet_get_all_farmer_keys>(*this);\n}\n\nvoid Wallet_get_all_farmer_keys::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_farmer_keys::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_farmer_keys::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_all_farmer_keys;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_all_farmer_keys::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_all_farmer_keys\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_get_all_farmer_keys::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_all_farmer_keys::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_all_farmer_keys\";\n\treturn _object;\n}\n\nvoid Wallet_get_all_farmer_keys::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_get_all_farmer_keys::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_all_farmer_keys::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_all_farmer_keys& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_all_farmer_keys& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_all_farmer_keys::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_all_farmer_keys::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_all_farmer_keys\";\n\ttype_code->type_hash = vnx::Hash64(0xc6a03b3f813d071dull);\n\ttype_code->code_hash = vnx::Hash64(0xac0ac802c63290ffull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_all_farmer_keys);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_all_farmer_keys>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_all_farmer_keys_return::static_get_type_code();\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_all_farmer_keys;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_all_farmer_keys>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_all_farmer_keys& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_farmer_keys& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_farmer_keys& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_all_farmer_keys_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_all_farmer_keys_return.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/skey_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_all_farmer_keys_return::VNX_TYPE_HASH(0xa2de9b0aaffc515aull);\nconst vnx::Hash64 Wallet_get_all_farmer_keys_return::VNX_CODE_HASH(0x71e6e83049d5d9fbull);\n\nvnx::Hash64 Wallet_get_all_farmer_keys_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_all_farmer_keys_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_all_farmer_keys.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_all_farmer_keys_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_farmer_keys_return;\n}\n\nstd::shared_ptr<Wallet_get_all_farmer_keys_return> Wallet_get_all_farmer_keys_return::create() {\n\treturn std::make_shared<Wallet_get_all_farmer_keys_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_all_farmer_keys_return::clone() const {\n\treturn std::make_shared<Wallet_get_all_farmer_keys_return>(*this);\n}\n\nvoid Wallet_get_all_farmer_keys_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_farmer_keys_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_all_farmer_keys_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_all_farmer_keys_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_all_farmer_keys_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_all_farmer_keys.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_all_farmer_keys_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_all_farmer_keys_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_all_farmer_keys.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_all_farmer_keys_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_all_farmer_keys_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_all_farmer_keys_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_all_farmer_keys_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_all_farmer_keys_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_all_farmer_keys_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_all_farmer_keys_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_all_farmer_keys.return\";\n\ttype_code->type_hash = vnx::Hash64(0xa2de9b0aaffc515aull);\n\ttype_code->code_hash = vnx::Hash64(0x71e6e83049d5d9fbull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_all_farmer_keys_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_all_farmer_keys_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 23, 2, 4, 7, 11, 32, 1, 11, 33, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_all_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_all_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_all_farmer_keys_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_all_farmer_keys_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_all_farmer_keys_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_all_farmer_keys_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_all_farmer_keys_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_balance.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_balance.hxx>\n#include <mmx/Wallet_get_balance_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_balance::VNX_TYPE_HASH(0x1bc2c2dd67ab2829ull);\nconst vnx::Hash64 Wallet_get_balance::VNX_CODE_HASH(0xdd703f18c114c63cull);\n\nvnx::Hash64 Wallet_get_balance::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_balance::get_type_name() const {\n\treturn \"mmx.Wallet.get_balance\";\n}\n\nconst vnx::TypeCode* Wallet_get_balance::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_balance;\n}\n\nstd::shared_ptr<Wallet_get_balance> Wallet_get_balance::create() {\n\treturn std::make_shared<Wallet_get_balance>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_balance::clone() const {\n\treturn std::make_shared<Wallet_get_balance>(*this);\n}\n\nvoid Wallet_get_balance::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_balance::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_balance::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_balance;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, currency);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_balance::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_balance\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_balance::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_balance::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_balance\";\n\t_object[\"index\"] = index;\n\t_object[\"currency\"] = currency;\n\treturn _object;\n}\n\nvoid Wallet_get_balance::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_balance::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_balance::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_balance& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_balance& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_balance::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_balance::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_balance\";\n\ttype_code->type_hash = vnx::Hash64(0x1bc2c2dd67ab2829ull);\n\ttype_code->code_hash = vnx::Hash64(0xdd703f18c114c63cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_balance);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_balance>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_balance_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_balance& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_balance;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_balance>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.currency, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_balance& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_balance& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balance& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_balance_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_balance_return.hxx>\n#include <mmx/balance_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_balance_return::VNX_TYPE_HASH(0xfa00e6f62563141full);\nconst vnx::Hash64 Wallet_get_balance_return::VNX_CODE_HASH(0x35c0be18c6ec6d7cull);\n\nvnx::Hash64 Wallet_get_balance_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_balance_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_balance.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_balance_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_balance_return;\n}\n\nstd::shared_ptr<Wallet_get_balance_return> Wallet_get_balance_return::create() {\n\treturn std::make_shared<Wallet_get_balance_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_balance_return::clone() const {\n\treturn std::make_shared<Wallet_get_balance_return>(*this);\n}\n\nvoid Wallet_get_balance_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_balance_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_balance_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_balance_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_balance_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_balance.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_balance_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_balance_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_balance.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_balance_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_balance_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_balance_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_balance_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_balance_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_balance_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_balance_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_balance.return\";\n\ttype_code->type_hash = vnx::Hash64(0xfa00e6f62563141full);\n\ttype_code->code_hash = vnx::Hash64(0x35c0be18c6ec6d7cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_balance_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_balance_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::balance_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_balance_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_balance_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_balance_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_balance_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_balance_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balance_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_balances.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_balances.hxx>\n#include <mmx/Wallet_get_balances_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_balances::VNX_TYPE_HASH(0x5be581d54ae69a4ull);\nconst vnx::Hash64 Wallet_get_balances::VNX_CODE_HASH(0xd74125cc5725f322ull);\n\nvnx::Hash64 Wallet_get_balances::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_balances::get_type_name() const {\n\treturn \"mmx.Wallet.get_balances\";\n}\n\nconst vnx::TypeCode* Wallet_get_balances::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_balances;\n}\n\nstd::shared_ptr<Wallet_get_balances> Wallet_get_balances::create() {\n\treturn std::make_shared<Wallet_get_balances>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_balances::clone() const {\n\treturn std::make_shared<Wallet_get_balances>(*this);\n}\n\nvoid Wallet_get_balances::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_balances::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_balances::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_balances;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, with_zero);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_balances::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_balances\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"with_zero\\\": \"; vnx::write(_out, with_zero);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_balances::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_balances::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_balances\";\n\t_object[\"index\"] = index;\n\t_object[\"with_zero\"] = with_zero;\n\treturn _object;\n}\n\nvoid Wallet_get_balances::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"with_zero\") {\n\t\t\t_entry.second.to(with_zero);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_balances::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"with_zero\") {\n\t\treturn vnx::Variant(with_zero);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_balances::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"with_zero\") {\n\t\t_value.to(with_zero);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_balances& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_balances& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_balances::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_balances::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_balances\";\n\ttype_code->type_hash = vnx::Hash64(0x5be581d54ae69a4ull);\n\ttype_code->code_hash = vnx::Hash64(0xd74125cc5725f322ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_balances);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_balances>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_balances_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"with_zero\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.with_zero, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_balances;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_balances>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(5);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.with_zero);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_balances& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_balances& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balances& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_balances_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_balances_return::VNX_TYPE_HASH(0xe041fcc6b3606c0full);\nconst vnx::Hash64 Wallet_get_balances_return::VNX_CODE_HASH(0x655ff1017926bca8ull);\n\nvnx::Hash64 Wallet_get_balances_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_balances_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_balances.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_balances_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_balances_return;\n}\n\nstd::shared_ptr<Wallet_get_balances_return> Wallet_get_balances_return::create() {\n\treturn std::make_shared<Wallet_get_balances_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_balances_return::clone() const {\n\treturn std::make_shared<Wallet_get_balances_return>(*this);\n}\n\nvoid Wallet_get_balances_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_balances_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_balances_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_balances_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_balances_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_balances.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_balances_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_balances_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_balances.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_balances_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_balances_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_balances_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_balances_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_balances_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_balances_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_balances_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_balances.return\";\n\ttype_code->type_hash = vnx::Hash64(0xe041fcc6b3606c0full);\n\ttype_code->code_hash = vnx::Hash64(0x655ff1017926bca8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_balances_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_balances_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::balance_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 5, 11, 32, 1, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_balances_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_balances_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_balances_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_balances_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_balances_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_contract_balances.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_contract_balances.hxx>\n#include <mmx/Wallet_get_contract_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_contract_balances::VNX_TYPE_HASH(0x4d6b36c0c2804d26ull);\nconst vnx::Hash64 Wallet_get_contract_balances::VNX_CODE_HASH(0x115df438f8f9ea19ull);\n\nvnx::Hash64 Wallet_get_contract_balances::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_contract_balances::get_type_name() const {\n\treturn \"mmx.Wallet.get_contract_balances\";\n}\n\nconst vnx::TypeCode* Wallet_get_contract_balances::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_contract_balances;\n}\n\nstd::shared_ptr<Wallet_get_contract_balances> Wallet_get_contract_balances::create() {\n\treturn std::make_shared<Wallet_get_contract_balances>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_contract_balances::clone() const {\n\treturn std::make_shared<Wallet_get_contract_balances>(*this);\n}\n\nvoid Wallet_get_contract_balances::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contract_balances::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contract_balances::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_contract_balances;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_contract_balances::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_contract_balances\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_contract_balances::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_contract_balances::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_contract_balances\";\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Wallet_get_contract_balances::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_contract_balances::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_contract_balances::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_contract_balances& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_contract_balances& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_contract_balances::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_contract_balances::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_contract_balances\";\n\ttype_code->type_hash = vnx::Hash64(0x4d6b36c0c2804d26ull);\n\ttype_code->code_hash = vnx::Hash64(0x115df438f8f9ea19ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_contract_balances);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_contract_balances>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_contract_balances_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contract_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_contract_balances;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_contract_balances>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_contract_balances& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contract_balances& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contract_balances& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_contract_balances_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_contract_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_contract_balances_return::VNX_TYPE_HASH(0x7800bce5a77b8bdcull);\nconst vnx::Hash64 Wallet_get_contract_balances_return::VNX_CODE_HASH(0xb919c0732b6a806cull);\n\nvnx::Hash64 Wallet_get_contract_balances_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_contract_balances_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_contract_balances.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_contract_balances_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_contract_balances_return;\n}\n\nstd::shared_ptr<Wallet_get_contract_balances_return> Wallet_get_contract_balances_return::create() {\n\treturn std::make_shared<Wallet_get_contract_balances_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_contract_balances_return::clone() const {\n\treturn std::make_shared<Wallet_get_contract_balances_return>(*this);\n}\n\nvoid Wallet_get_contract_balances_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contract_balances_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contract_balances_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_contract_balances_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_contract_balances_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_contract_balances.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_contract_balances_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_contract_balances_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_contract_balances.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_contract_balances_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_contract_balances_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_contract_balances_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_contract_balances_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_contract_balances_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_contract_balances_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_contract_balances_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_contract_balances.return\";\n\ttype_code->type_hash = vnx::Hash64(0x7800bce5a77b8bdcull);\n\ttype_code->code_hash = vnx::Hash64(0xb919c0732b6a806cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_contract_balances_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_contract_balances_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::balance_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 5, 11, 32, 1, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contract_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_contract_balances_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_contract_balances_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_contract_balances_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contract_balances_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contract_balances_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_contracts.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_contracts.hxx>\n#include <mmx/Wallet_get_contracts_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_contracts::VNX_TYPE_HASH(0x9ff1932bcec18d57ull);\nconst vnx::Hash64 Wallet_get_contracts::VNX_CODE_HASH(0xef77d58ab9b1a237ull);\n\nvnx::Hash64 Wallet_get_contracts::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_contracts::get_type_name() const {\n\treturn \"mmx.Wallet.get_contracts\";\n}\n\nconst vnx::TypeCode* Wallet_get_contracts::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_contracts;\n}\n\nstd::shared_ptr<Wallet_get_contracts> Wallet_get_contracts::create() {\n\treturn std::make_shared<Wallet_get_contracts>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_contracts::clone() const {\n\treturn std::make_shared<Wallet_get_contracts>(*this);\n}\n\nvoid Wallet_get_contracts::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contracts::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contracts::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_contracts;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, type_name);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, type_hash);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_contracts::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_contracts\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"type_name\\\": \"; vnx::write(_out, type_name);\n\t_out << \", \\\"type_hash\\\": \"; vnx::write(_out, type_hash);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_contracts::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_contracts::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_contracts\";\n\t_object[\"index\"] = index;\n\t_object[\"type_name\"] = type_name;\n\t_object[\"type_hash\"] = type_hash;\n\treturn _object;\n}\n\nvoid Wallet_get_contracts::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"type_hash\") {\n\t\t\t_entry.second.to(type_hash);\n\t\t} else if(_entry.first == \"type_name\") {\n\t\t\t_entry.second.to(type_name);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_contracts::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"type_name\") {\n\t\treturn vnx::Variant(type_name);\n\t}\n\tif(_name == \"type_hash\") {\n\t\treturn vnx::Variant(type_hash);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_contracts::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"type_name\") {\n\t\t_value.to(type_name);\n\t} else if(_name == \"type_hash\") {\n\t\t_value.to(type_hash);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_contracts& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_contracts& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_contracts::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_contracts::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_contracts\";\n\ttype_code->type_hash = vnx::Hash64(0x9ff1932bcec18d57ull);\n\ttype_code->code_hash = vnx::Hash64(0xef77d58ab9b1a237ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_contracts);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_contracts>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_contracts_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type_name\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type_hash\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_contracts& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.type_name, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.type_hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_contracts;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_contracts>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.type_name, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.type_hash, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_contracts& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_contracts_owned.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_contracts_owned.hxx>\n#include <mmx/Wallet_get_contracts_owned_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_contracts_owned::VNX_TYPE_HASH(0x7834485ec000f577ull);\nconst vnx::Hash64 Wallet_get_contracts_owned::VNX_CODE_HASH(0xd7ad65f9054dc61ull);\n\nvnx::Hash64 Wallet_get_contracts_owned::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_contracts_owned::get_type_name() const {\n\treturn \"mmx.Wallet.get_contracts_owned\";\n}\n\nconst vnx::TypeCode* Wallet_get_contracts_owned::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_contracts_owned;\n}\n\nstd::shared_ptr<Wallet_get_contracts_owned> Wallet_get_contracts_owned::create() {\n\treturn std::make_shared<Wallet_get_contracts_owned>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_contracts_owned::clone() const {\n\treturn std::make_shared<Wallet_get_contracts_owned>(*this);\n}\n\nvoid Wallet_get_contracts_owned::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contracts_owned::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contracts_owned::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_contracts_owned;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, type_name);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, type_hash);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_contracts_owned::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_contracts_owned\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"type_name\\\": \"; vnx::write(_out, type_name);\n\t_out << \", \\\"type_hash\\\": \"; vnx::write(_out, type_hash);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_contracts_owned::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_contracts_owned::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_contracts_owned\";\n\t_object[\"index\"] = index;\n\t_object[\"type_name\"] = type_name;\n\t_object[\"type_hash\"] = type_hash;\n\treturn _object;\n}\n\nvoid Wallet_get_contracts_owned::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"type_hash\") {\n\t\t\t_entry.second.to(type_hash);\n\t\t} else if(_entry.first == \"type_name\") {\n\t\t\t_entry.second.to(type_name);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_contracts_owned::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"type_name\") {\n\t\treturn vnx::Variant(type_name);\n\t}\n\tif(_name == \"type_hash\") {\n\t\treturn vnx::Variant(type_hash);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_contracts_owned::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"type_name\") {\n\t\t_value.to(type_name);\n\t} else if(_name == \"type_hash\") {\n\t\t_value.to(type_hash);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_contracts_owned& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_contracts_owned& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_contracts_owned::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_contracts_owned::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_contracts_owned\";\n\ttype_code->type_hash = vnx::Hash64(0x7834485ec000f577ull);\n\ttype_code->code_hash = vnx::Hash64(0xd7ad65f9054dc61ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_contracts_owned);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_contracts_owned>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_contracts_owned_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type_name\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type_hash\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_contracts_owned& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.type_name, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.type_hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts_owned& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_contracts_owned;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_contracts_owned>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.type_name, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.type_hash, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_contracts_owned& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts_owned& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts_owned& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_contracts_owned_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_contracts_owned_return.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_contracts_owned_return::VNX_TYPE_HASH(0x40aec1bc5f5f5c90ull);\nconst vnx::Hash64 Wallet_get_contracts_owned_return::VNX_CODE_HASH(0x8e8c7c052975d50bull);\n\nvnx::Hash64 Wallet_get_contracts_owned_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_contracts_owned_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_contracts_owned.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_contracts_owned_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_contracts_owned_return;\n}\n\nstd::shared_ptr<Wallet_get_contracts_owned_return> Wallet_get_contracts_owned_return::create() {\n\treturn std::make_shared<Wallet_get_contracts_owned_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_contracts_owned_return::clone() const {\n\treturn std::make_shared<Wallet_get_contracts_owned_return>(*this);\n}\n\nvoid Wallet_get_contracts_owned_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contracts_owned_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contracts_owned_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_contracts_owned_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_contracts_owned_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_contracts_owned.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_contracts_owned_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_contracts_owned_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_contracts_owned.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_contracts_owned_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_contracts_owned_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_contracts_owned_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_contracts_owned_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_contracts_owned_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_contracts_owned_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_contracts_owned_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_contracts_owned.return\";\n\ttype_code->type_hash = vnx::Hash64(0x40aec1bc5f5f5c90ull);\n\ttype_code->code_hash = vnx::Hash64(0x8e8c7c052975d50bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_contracts_owned_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_contracts_owned_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 5, 11, 32, 1, 16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_contracts_owned_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts_owned_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_contracts_owned_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_contracts_owned_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_contracts_owned_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts_owned_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts_owned_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_contracts_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_contracts_return.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_contracts_return::VNX_TYPE_HASH(0xf384dd12e1fac072ull);\nconst vnx::Hash64 Wallet_get_contracts_return::VNX_CODE_HASH(0xea598bd54594a832ull);\n\nvnx::Hash64 Wallet_get_contracts_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_contracts_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_contracts.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_contracts_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_contracts_return;\n}\n\nstd::shared_ptr<Wallet_get_contracts_return> Wallet_get_contracts_return::create() {\n\treturn std::make_shared<Wallet_get_contracts_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_contracts_return::clone() const {\n\treturn std::make_shared<Wallet_get_contracts_return>(*this);\n}\n\nvoid Wallet_get_contracts_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contracts_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_contracts_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_contracts_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_contracts_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_contracts.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_contracts_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_contracts_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_contracts.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_contracts_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_contracts_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_contracts_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_contracts_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_contracts_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_contracts_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_contracts_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_contracts.return\";\n\ttype_code->type_hash = vnx::Hash64(0xf384dd12e1fac072ull);\n\ttype_code->code_hash = vnx::Hash64(0xea598bd54594a832ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_contracts_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_contracts_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 5, 11, 32, 1, 16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_contracts_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_contracts_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_contracts_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_contracts_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_contracts_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_contracts_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_farmer_keys.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_farmer_keys.hxx>\n#include <mmx/Wallet_get_farmer_keys_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_farmer_keys::VNX_TYPE_HASH(0x44709e11ff3ff3eeull);\nconst vnx::Hash64 Wallet_get_farmer_keys::VNX_CODE_HASH(0xd98cf205e4acc7c7ull);\n\nvnx::Hash64 Wallet_get_farmer_keys::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_farmer_keys::get_type_name() const {\n\treturn \"mmx.Wallet.get_farmer_keys\";\n}\n\nconst vnx::TypeCode* Wallet_get_farmer_keys::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_farmer_keys;\n}\n\nstd::shared_ptr<Wallet_get_farmer_keys> Wallet_get_farmer_keys::create() {\n\treturn std::make_shared<Wallet_get_farmer_keys>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_farmer_keys::clone() const {\n\treturn std::make_shared<Wallet_get_farmer_keys>(*this);\n}\n\nvoid Wallet_get_farmer_keys::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_farmer_keys::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_farmer_keys::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_farmer_keys;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_farmer_keys::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_farmer_keys\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_farmer_keys::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_farmer_keys::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_farmer_keys\";\n\t_object[\"index\"] = index;\n\treturn _object;\n}\n\nvoid Wallet_get_farmer_keys::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_farmer_keys::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_farmer_keys::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_farmer_keys& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_farmer_keys& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_farmer_keys::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_farmer_keys::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_farmer_keys\";\n\ttype_code->type_hash = vnx::Hash64(0x44709e11ff3ff3eeull);\n\ttype_code->code_hash = vnx::Hash64(0xd98cf205e4acc7c7ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_farmer_keys);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_farmer_keys>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_farmer_keys_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_farmer_keys& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_farmer_keys;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_farmer_keys>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_farmer_keys& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_farmer_keys& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_farmer_keys& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_farmer_keys_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_farmer_keys_return.hxx>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/skey_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_farmer_keys_return::VNX_TYPE_HASH(0x25479f868269fbb0ull);\nconst vnx::Hash64 Wallet_get_farmer_keys_return::VNX_CODE_HASH(0x32127c3a3afe8b14ull);\n\nvnx::Hash64 Wallet_get_farmer_keys_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_farmer_keys_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_farmer_keys.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_farmer_keys_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_farmer_keys_return;\n}\n\nstd::shared_ptr<Wallet_get_farmer_keys_return> Wallet_get_farmer_keys_return::create() {\n\treturn std::make_shared<Wallet_get_farmer_keys_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_farmer_keys_return::clone() const {\n\treturn std::make_shared<Wallet_get_farmer_keys_return>(*this);\n}\n\nvoid Wallet_get_farmer_keys_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_farmer_keys_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_farmer_keys_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_farmer_keys_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_farmer_keys_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_farmer_keys.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_farmer_keys_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_farmer_keys_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_farmer_keys.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_farmer_keys_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_farmer_keys_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_farmer_keys_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_farmer_keys_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_farmer_keys_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_farmer_keys_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_farmer_keys_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_farmer_keys.return\";\n\ttype_code->type_hash = vnx::Hash64(0x25479f868269fbb0ull);\n\ttype_code->code_hash = vnx::Hash64(0x32127c3a3afe8b14ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_farmer_keys_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_farmer_keys_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {23, 2, 4, 7, 11, 32, 1, 11, 33, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_farmer_keys_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_farmer_keys_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_farmer_keys_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_farmer_keys_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_farmer_keys_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_farmer_keys_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_history.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_history.hxx>\n#include <mmx/Wallet_get_history_return.hxx>\n#include <mmx/query_filter_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_history::VNX_TYPE_HASH(0x921f73f3d97d2d4dull);\nconst vnx::Hash64 Wallet_get_history::VNX_CODE_HASH(0x412907c7d90400abull);\n\nvnx::Hash64 Wallet_get_history::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_history::get_type_name() const {\n\treturn \"mmx.Wallet.get_history\";\n}\n\nconst vnx::TypeCode* Wallet_get_history::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_history;\n}\n\nstd::shared_ptr<Wallet_get_history> Wallet_get_history::create() {\n\treturn std::make_shared<Wallet_get_history>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_history::clone() const {\n\treturn std::make_shared<Wallet_get_history>(*this);\n}\n\nvoid Wallet_get_history::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_history::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_history::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_history;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, filter);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_history::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_history\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"filter\\\": \"; vnx::write(_out, filter);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_history::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_history::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_history\";\n\t_object[\"index\"] = index;\n\t_object[\"filter\"] = filter;\n\treturn _object;\n}\n\nvoid Wallet_get_history::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"filter\") {\n\t\t\t_entry.second.to(filter);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_history::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"filter\") {\n\t\treturn vnx::Variant(filter);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_history::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"filter\") {\n\t\t_value.to(filter);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_history& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_history& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_history::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_history::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_history\";\n\ttype_code->type_hash = vnx::Hash64(0x921f73f3d97d2d4dull);\n\ttype_code->code_hash = vnx::Hash64(0x412907c7d90400abull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_history);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_history>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::query_filter_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_history_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"filter\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_history& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.filter, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_history& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_history;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_history>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.filter, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_history& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_history& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_history& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_history_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_history_return.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_history_return::VNX_TYPE_HASH(0xb1b8c9a446a81b1full);\nconst vnx::Hash64 Wallet_get_history_return::VNX_CODE_HASH(0xa49f9ab0fb74b994ull);\n\nvnx::Hash64 Wallet_get_history_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_history_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_history.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_history_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_history_return;\n}\n\nstd::shared_ptr<Wallet_get_history_return> Wallet_get_history_return::create() {\n\treturn std::make_shared<Wallet_get_history_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_history_return::clone() const {\n\treturn std::make_shared<Wallet_get_history_return>(*this);\n}\n\nvoid Wallet_get_history_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_history_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_history_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_history_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_history_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_history.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_history_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_history_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_history.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_history_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_history_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_history_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_history_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_history_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_history_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_history_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_history.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb1b8c9a446a81b1full);\n\ttype_code->code_hash = vnx::Hash64(0xa49f9ab0fb74b994ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_history_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_history_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::tx_entry_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_history_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_history_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_history_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_history_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_history_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_history_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_master_seed.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_master_seed.hxx>\n#include <mmx/Wallet_get_master_seed_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_master_seed::VNX_TYPE_HASH(0x8fddd77ece4d295bull);\nconst vnx::Hash64 Wallet_get_master_seed::VNX_CODE_HASH(0xcaa60f4096f3a701ull);\n\nvnx::Hash64 Wallet_get_master_seed::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_master_seed::get_type_name() const {\n\treturn \"mmx.Wallet.get_master_seed\";\n}\n\nconst vnx::TypeCode* Wallet_get_master_seed::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_master_seed;\n}\n\nstd::shared_ptr<Wallet_get_master_seed> Wallet_get_master_seed::create() {\n\treturn std::make_shared<Wallet_get_master_seed>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_master_seed::clone() const {\n\treturn std::make_shared<Wallet_get_master_seed>(*this);\n}\n\nvoid Wallet_get_master_seed::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_master_seed::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_master_seed::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_master_seed;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_master_seed::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_master_seed\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_master_seed::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_master_seed::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_master_seed\";\n\t_object[\"index\"] = index;\n\treturn _object;\n}\n\nvoid Wallet_get_master_seed::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_master_seed::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_master_seed::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_master_seed& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_master_seed& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_master_seed::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_master_seed::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_master_seed\";\n\ttype_code->type_hash = vnx::Hash64(0x8fddd77ece4d295bull);\n\ttype_code->code_hash = vnx::Hash64(0xcaa60f4096f3a701ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_master_seed);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_master_seed>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_master_seed_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_master_seed& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_master_seed& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_master_seed;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_master_seed>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_master_seed& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_master_seed& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_master_seed& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_master_seed_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_master_seed_return.hxx>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_master_seed_return::VNX_TYPE_HASH(0x8b0f38e742e132f0ull);\nconst vnx::Hash64 Wallet_get_master_seed_return::VNX_CODE_HASH(0xe7ebd95587740e0dull);\n\nvnx::Hash64 Wallet_get_master_seed_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_master_seed_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_master_seed.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_master_seed_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_master_seed_return;\n}\n\nstd::shared_ptr<Wallet_get_master_seed_return> Wallet_get_master_seed_return::create() {\n\treturn std::make_shared<Wallet_get_master_seed_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_master_seed_return::clone() const {\n\treturn std::make_shared<Wallet_get_master_seed_return>(*this);\n}\n\nvoid Wallet_get_master_seed_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_master_seed_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_master_seed_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_master_seed_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_master_seed_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_master_seed.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_master_seed_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_master_seed_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_master_seed.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_master_seed_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_master_seed_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_master_seed_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_master_seed_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_master_seed_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_master_seed_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_master_seed_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_master_seed.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8b0f38e742e132f0ull);\n\ttype_code->code_hash = vnx::Hash64(0xe7ebd95587740e0dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_master_seed_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_master_seed_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_master_seed_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_master_seed_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_master_seed_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_master_seed_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_master_seed_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_master_seed_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_master_seed_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_mnemonic_seed.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_mnemonic_seed.hxx>\n#include <mmx/Wallet_get_mnemonic_seed_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_mnemonic_seed::VNX_TYPE_HASH(0xacf58d3b1a8ce4c0ull);\nconst vnx::Hash64 Wallet_get_mnemonic_seed::VNX_CODE_HASH(0xd6ce10dce10c352dull);\n\nvnx::Hash64 Wallet_get_mnemonic_seed::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_mnemonic_seed::get_type_name() const {\n\treturn \"mmx.Wallet.get_mnemonic_seed\";\n}\n\nconst vnx::TypeCode* Wallet_get_mnemonic_seed::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_mnemonic_seed;\n}\n\nstd::shared_ptr<Wallet_get_mnemonic_seed> Wallet_get_mnemonic_seed::create() {\n\treturn std::make_shared<Wallet_get_mnemonic_seed>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_mnemonic_seed::clone() const {\n\treturn std::make_shared<Wallet_get_mnemonic_seed>(*this);\n}\n\nvoid Wallet_get_mnemonic_seed::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_mnemonic_seed::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_mnemonic_seed::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_mnemonic_seed;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_mnemonic_seed::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_mnemonic_seed\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_mnemonic_seed::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_mnemonic_seed::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_mnemonic_seed\";\n\t_object[\"index\"] = index;\n\treturn _object;\n}\n\nvoid Wallet_get_mnemonic_seed::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_mnemonic_seed::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_mnemonic_seed::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_mnemonic_seed& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_mnemonic_seed& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_mnemonic_seed::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_mnemonic_seed::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_mnemonic_seed\";\n\ttype_code->type_hash = vnx::Hash64(0xacf58d3b1a8ce4c0ull);\n\ttype_code->code_hash = vnx::Hash64(0xd6ce10dce10c352dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_mnemonic_seed);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_mnemonic_seed>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_mnemonic_seed_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_seed& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_seed& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_mnemonic_seed;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_mnemonic_seed>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_seed& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_seed& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_seed& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_mnemonic_seed_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_mnemonic_seed_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_mnemonic_seed_return::VNX_TYPE_HASH(0xd02dd0736911ac8bull);\nconst vnx::Hash64 Wallet_get_mnemonic_seed_return::VNX_CODE_HASH(0xbceaa79d0bd7829cull);\n\nvnx::Hash64 Wallet_get_mnemonic_seed_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_mnemonic_seed_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_mnemonic_seed.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_mnemonic_seed_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_mnemonic_seed_return;\n}\n\nstd::shared_ptr<Wallet_get_mnemonic_seed_return> Wallet_get_mnemonic_seed_return::create() {\n\treturn std::make_shared<Wallet_get_mnemonic_seed_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_mnemonic_seed_return::clone() const {\n\treturn std::make_shared<Wallet_get_mnemonic_seed_return>(*this);\n}\n\nvoid Wallet_get_mnemonic_seed_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_mnemonic_seed_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_mnemonic_seed_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_mnemonic_seed_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_mnemonic_seed_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_mnemonic_seed.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_mnemonic_seed_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_mnemonic_seed_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_mnemonic_seed.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_mnemonic_seed_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_mnemonic_seed_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_mnemonic_seed_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_mnemonic_seed_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_mnemonic_seed_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_mnemonic_seed_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_mnemonic_seed_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_mnemonic_seed.return\";\n\ttype_code->type_hash = vnx::Hash64(0xd02dd0736911ac8bull);\n\ttype_code->code_hash = vnx::Hash64(0xbceaa79d0bd7829cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_mnemonic_seed_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_mnemonic_seed_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_seed_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_seed_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_mnemonic_seed_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_mnemonic_seed_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_seed_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_seed_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_seed_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_mnemonic_wordlist.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_mnemonic_wordlist::VNX_TYPE_HASH(0xb833298e3ff28a44ull);\nconst vnx::Hash64 Wallet_get_mnemonic_wordlist::VNX_CODE_HASH(0xa3ac8b82b8e3ed61ull);\n\nvnx::Hash64 Wallet_get_mnemonic_wordlist::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_mnemonic_wordlist::get_type_name() const {\n\treturn \"mmx.Wallet.get_mnemonic_wordlist\";\n}\n\nconst vnx::TypeCode* Wallet_get_mnemonic_wordlist::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_mnemonic_wordlist;\n}\n\nstd::shared_ptr<Wallet_get_mnemonic_wordlist> Wallet_get_mnemonic_wordlist::create() {\n\treturn std::make_shared<Wallet_get_mnemonic_wordlist>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_mnemonic_wordlist::clone() const {\n\treturn std::make_shared<Wallet_get_mnemonic_wordlist>(*this);\n}\n\nvoid Wallet_get_mnemonic_wordlist::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_mnemonic_wordlist::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_mnemonic_wordlist::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_mnemonic_wordlist;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, lang);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_mnemonic_wordlist::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_mnemonic_wordlist\\\"\";\n\t_out << \", \\\"lang\\\": \"; vnx::write(_out, lang);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_mnemonic_wordlist::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_mnemonic_wordlist::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_mnemonic_wordlist\";\n\t_object[\"lang\"] = lang;\n\treturn _object;\n}\n\nvoid Wallet_get_mnemonic_wordlist::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"lang\") {\n\t\t\t_entry.second.to(lang);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_mnemonic_wordlist::get_field(const std::string& _name) const {\n\tif(_name == \"lang\") {\n\t\treturn vnx::Variant(lang);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_mnemonic_wordlist::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"lang\") {\n\t\t_value.to(lang);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_mnemonic_wordlist& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_mnemonic_wordlist& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_mnemonic_wordlist::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_mnemonic_wordlist::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_mnemonic_wordlist\";\n\ttype_code->type_hash = vnx::Hash64(0xb833298e3ff28a44ull);\n\ttype_code->code_hash = vnx::Hash64(0xa3ac8b82b8e3ed61ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_mnemonic_wordlist);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_mnemonic_wordlist>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_mnemonic_wordlist_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"lang\";\n\t\tfield.value = vnx::to_string(\"en\");\n\t\tfield.code = {32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_wordlist& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.lang, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_wordlist& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_mnemonic_wordlist;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_mnemonic_wordlist>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.lang, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_wordlist& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_wordlist& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_wordlist& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_mnemonic_wordlist_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_mnemonic_wordlist_return::VNX_TYPE_HASH(0x8ce49a9b57ee5789ull);\nconst vnx::Hash64 Wallet_get_mnemonic_wordlist_return::VNX_CODE_HASH(0x9c9727a6461a284bull);\n\nvnx::Hash64 Wallet_get_mnemonic_wordlist_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_mnemonic_wordlist_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_mnemonic_wordlist.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_mnemonic_wordlist_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_mnemonic_wordlist_return;\n}\n\nstd::shared_ptr<Wallet_get_mnemonic_wordlist_return> Wallet_get_mnemonic_wordlist_return::create() {\n\treturn std::make_shared<Wallet_get_mnemonic_wordlist_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_mnemonic_wordlist_return::clone() const {\n\treturn std::make_shared<Wallet_get_mnemonic_wordlist_return>(*this);\n}\n\nvoid Wallet_get_mnemonic_wordlist_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_mnemonic_wordlist_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_mnemonic_wordlist_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_mnemonic_wordlist_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_mnemonic_wordlist_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_mnemonic_wordlist.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_mnemonic_wordlist_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_mnemonic_wordlist_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_mnemonic_wordlist.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_mnemonic_wordlist_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_mnemonic_wordlist_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_mnemonic_wordlist_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_mnemonic_wordlist_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_mnemonic_wordlist_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_mnemonic_wordlist_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_mnemonic_wordlist_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_mnemonic_wordlist.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8ce49a9b57ee5789ull);\n\ttype_code->code_hash = vnx::Hash64(0x9c9727a6461a284bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_mnemonic_wordlist_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_mnemonic_wordlist_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_mnemonic_wordlist_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_mnemonic_wordlist_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_mnemonic_wordlist_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_mnemonic_wordlist_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_mnemonic_wordlist_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_mnemonic_wordlist_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_mnemonic_wordlist_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_offers.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_offers.hxx>\n#include <mmx/Wallet_get_offers_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_offers::VNX_TYPE_HASH(0x6dacbe70cbe08925ull);\nconst vnx::Hash64 Wallet_get_offers::VNX_CODE_HASH(0x31668698ad05661full);\n\nvnx::Hash64 Wallet_get_offers::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_offers::get_type_name() const {\n\treturn \"mmx.Wallet.get_offers\";\n}\n\nconst vnx::TypeCode* Wallet_get_offers::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_offers;\n}\n\nstd::shared_ptr<Wallet_get_offers> Wallet_get_offers::create() {\n\treturn std::make_shared<Wallet_get_offers>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_offers::clone() const {\n\treturn std::make_shared<Wallet_get_offers>(*this);\n}\n\nvoid Wallet_get_offers::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_offers::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_offers::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_offers;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, state);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_offers::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_offers\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"state\\\": \"; vnx::write(_out, state);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_offers::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_offers::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_offers\";\n\t_object[\"index\"] = index;\n\t_object[\"state\"] = state;\n\treturn _object;\n}\n\nvoid Wallet_get_offers::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"state\") {\n\t\t\t_entry.second.to(state);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_offers::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"state\") {\n\t\treturn vnx::Variant(state);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_offers::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"state\") {\n\t\t_value.to(state);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_offers& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_offers& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_offers::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_offers::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_offers\";\n\ttype_code->type_hash = vnx::Hash64(0x6dacbe70cbe08925ull);\n\ttype_code->code_hash = vnx::Hash64(0x31668698ad05661full);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_offers);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_offers>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_offers_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"state\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.state, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_offers& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_offers;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_offers>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(5);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.state);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_offers& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_offers& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_offers& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_offers_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_offers_return.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_offers_return::VNX_TYPE_HASH(0xdb130e20d160c564ull);\nconst vnx::Hash64 Wallet_get_offers_return::VNX_CODE_HASH(0xef448a6cf238da54ull);\n\nvnx::Hash64 Wallet_get_offers_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_offers_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_offers.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_offers_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_offers_return;\n}\n\nstd::shared_ptr<Wallet_get_offers_return> Wallet_get_offers_return::create() {\n\treturn std::make_shared<Wallet_get_offers_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_offers_return::clone() const {\n\treturn std::make_shared<Wallet_get_offers_return>(*this);\n}\n\nvoid Wallet_get_offers_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_offers_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_offers_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_offers_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_offers_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_offers.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_offers_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_offers_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_offers.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_offers_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_offers_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_offers_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_offers_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_offers_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_offers_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_offers_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_offers.return\";\n\ttype_code->type_hash = vnx::Hash64(0xdb130e20d160c564ull);\n\ttype_code->code_hash = vnx::Hash64(0xef448a6cf238da54ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_offers_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_offers_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::offer_data_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_offers_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_offers_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_offers_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_offers_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_offers_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_offers_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_swap_liquidity.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_swap_liquidity.hxx>\n#include <mmx/Wallet_get_swap_liquidity_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_swap_liquidity::VNX_TYPE_HASH(0x3a8f17d496f625bull);\nconst vnx::Hash64 Wallet_get_swap_liquidity::VNX_CODE_HASH(0xf66fefb4714e1f81ull);\n\nvnx::Hash64 Wallet_get_swap_liquidity::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_swap_liquidity::get_type_name() const {\n\treturn \"mmx.Wallet.get_swap_liquidity\";\n}\n\nconst vnx::TypeCode* Wallet_get_swap_liquidity::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_swap_liquidity;\n}\n\nstd::shared_ptr<Wallet_get_swap_liquidity> Wallet_get_swap_liquidity::create() {\n\treturn std::make_shared<Wallet_get_swap_liquidity>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_swap_liquidity::clone() const {\n\treturn std::make_shared<Wallet_get_swap_liquidity>(*this);\n}\n\nvoid Wallet_get_swap_liquidity::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_swap_liquidity::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_swap_liquidity::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_swap_liquidity;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_swap_liquidity::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_swap_liquidity\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_swap_liquidity::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_swap_liquidity::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_swap_liquidity\";\n\t_object[\"index\"] = index;\n\treturn _object;\n}\n\nvoid Wallet_get_swap_liquidity::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_swap_liquidity::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_swap_liquidity::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_swap_liquidity& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_swap_liquidity& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_swap_liquidity::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_swap_liquidity::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_swap_liquidity\";\n\ttype_code->type_hash = vnx::Hash64(0x3a8f17d496f625bull);\n\ttype_code->code_hash = vnx::Hash64(0xf66fefb4714e1f81ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_swap_liquidity);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_swap_liquidity>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_swap_liquidity_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_swap_liquidity& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_swap_liquidity& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_swap_liquidity;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_swap_liquidity>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_swap_liquidity& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_swap_liquidity& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_swap_liquidity& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_swap_liquidity_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_swap_liquidity_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_swap_liquidity_return::VNX_TYPE_HASH(0x6846e8caa82b1463ull);\nconst vnx::Hash64 Wallet_get_swap_liquidity_return::VNX_CODE_HASH(0x80c61153f74d0aa2ull);\n\nvnx::Hash64 Wallet_get_swap_liquidity_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_swap_liquidity_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_swap_liquidity.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_swap_liquidity_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_swap_liquidity_return;\n}\n\nstd::shared_ptr<Wallet_get_swap_liquidity_return> Wallet_get_swap_liquidity_return::create() {\n\treturn std::make_shared<Wallet_get_swap_liquidity_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_swap_liquidity_return::clone() const {\n\treturn std::make_shared<Wallet_get_swap_liquidity_return>(*this);\n}\n\nvoid Wallet_get_swap_liquidity_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_swap_liquidity_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_swap_liquidity_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_swap_liquidity_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_swap_liquidity_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_swap_liquidity.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_swap_liquidity_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_swap_liquidity_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_swap_liquidity.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_swap_liquidity_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_swap_liquidity_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_swap_liquidity_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_swap_liquidity_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_swap_liquidity_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_swap_liquidity_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_swap_liquidity_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_swap_liquidity.return\";\n\ttype_code->type_hash = vnx::Hash64(0x6846e8caa82b1463ull);\n\ttype_code->code_hash = vnx::Hash64(0x80c61153f74d0aa2ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_swap_liquidity_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_swap_liquidity_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 5, 11, 32, 1, 11, 2, 23, 2, 4, 7, 11, 32, 1, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_swap_liquidity_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_swap_liquidity_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_swap_liquidity_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_swap_liquidity_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_swap_liquidity_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_swap_liquidity_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_swap_liquidity_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_token_list.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_token_list.hxx>\n#include <mmx/Wallet_get_token_list_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_token_list::VNX_TYPE_HASH(0x322b4f4af3737efcull);\nconst vnx::Hash64 Wallet_get_token_list::VNX_CODE_HASH(0x58fd5e084df1b2d5ull);\n\nvnx::Hash64 Wallet_get_token_list::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_token_list::get_type_name() const {\n\treturn \"mmx.Wallet.get_token_list\";\n}\n\nconst vnx::TypeCode* Wallet_get_token_list::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_token_list;\n}\n\nstd::shared_ptr<Wallet_get_token_list> Wallet_get_token_list::create() {\n\treturn std::make_shared<Wallet_get_token_list>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_token_list::clone() const {\n\treturn std::make_shared<Wallet_get_token_list>(*this);\n}\n\nvoid Wallet_get_token_list::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_token_list::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_token_list::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_token_list;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_token_list::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_token_list\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_get_token_list::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_token_list::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_token_list\";\n\treturn _object;\n}\n\nvoid Wallet_get_token_list::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_get_token_list::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_token_list::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_token_list& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_token_list& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_token_list::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_token_list::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_token_list\";\n\ttype_code->type_hash = vnx::Hash64(0x322b4f4af3737efcull);\n\ttype_code->code_hash = vnx::Hash64(0x58fd5e084df1b2d5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_token_list);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_token_list>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_token_list_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_token_list& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_token_list& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_token_list;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_token_list>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_token_list& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_token_list& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_token_list& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_token_list_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_token_list_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_token_list_return::VNX_TYPE_HASH(0xe36d7210ddf3d216ull);\nconst vnx::Hash64 Wallet_get_token_list_return::VNX_CODE_HASH(0x98c95688535be6a1ull);\n\nvnx::Hash64 Wallet_get_token_list_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_token_list_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_token_list.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_token_list_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_token_list_return;\n}\n\nstd::shared_ptr<Wallet_get_token_list_return> Wallet_get_token_list_return::create() {\n\treturn std::make_shared<Wallet_get_token_list_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_token_list_return::clone() const {\n\treturn std::make_shared<Wallet_get_token_list_return>(*this);\n}\n\nvoid Wallet_get_token_list_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_token_list_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_token_list_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_token_list_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_token_list_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_token_list.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_token_list_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_token_list_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_token_list.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_token_list_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_token_list_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_token_list_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_token_list_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_token_list_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_token_list_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_token_list_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_token_list.return\";\n\ttype_code->type_hash = vnx::Hash64(0xe36d7210ddf3d216ull);\n\ttype_code->code_hash = vnx::Hash64(0x98c95688535be6a1ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_token_list_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_token_list_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_token_list_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_token_list_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_token_list_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_token_list_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_token_list_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_token_list_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_token_list_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_total_balances.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_total_balances.hxx>\n#include <mmx/Wallet_get_total_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_total_balances::VNX_TYPE_HASH(0xedd130caba2e2f04ull);\nconst vnx::Hash64 Wallet_get_total_balances::VNX_CODE_HASH(0x8384140fbbd50fe3ull);\n\nvnx::Hash64 Wallet_get_total_balances::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_total_balances::get_type_name() const {\n\treturn \"mmx.Wallet.get_total_balances\";\n}\n\nconst vnx::TypeCode* Wallet_get_total_balances::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_total_balances;\n}\n\nstd::shared_ptr<Wallet_get_total_balances> Wallet_get_total_balances::create() {\n\treturn std::make_shared<Wallet_get_total_balances>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_total_balances::clone() const {\n\treturn std::make_shared<Wallet_get_total_balances>(*this);\n}\n\nvoid Wallet_get_total_balances::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_total_balances::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_total_balances::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_total_balances;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, addresses);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_total_balances::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_total_balances\\\"\";\n\t_out << \", \\\"addresses\\\": \"; vnx::write(_out, addresses);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_total_balances::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_total_balances::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_total_balances\";\n\t_object[\"addresses\"] = addresses;\n\treturn _object;\n}\n\nvoid Wallet_get_total_balances::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"addresses\") {\n\t\t\t_entry.second.to(addresses);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_total_balances::get_field(const std::string& _name) const {\n\tif(_name == \"addresses\") {\n\t\treturn vnx::Variant(addresses);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_total_balances::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"addresses\") {\n\t\t_value.to(addresses);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_total_balances& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_total_balances& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_total_balances::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_total_balances::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_total_balances\";\n\ttype_code->type_hash = vnx::Hash64(0xedd130caba2e2f04ull);\n\ttype_code->code_hash = vnx::Hash64(0x8384140fbbd50fe3ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_total_balances);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_total_balances>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_total_balances_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"addresses\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_total_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.addresses, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_total_balances& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_total_balances;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_total_balances>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.addresses, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_total_balances& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_total_balances& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_total_balances& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_total_balances_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_total_balances_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/balance_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_total_balances_return::VNX_TYPE_HASH(0x46f0368d7c4e45ddull);\nconst vnx::Hash64 Wallet_get_total_balances_return::VNX_CODE_HASH(0xb6f538b27dce56d1ull);\n\nvnx::Hash64 Wallet_get_total_balances_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_total_balances_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_total_balances.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_total_balances_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_total_balances_return;\n}\n\nstd::shared_ptr<Wallet_get_total_balances_return> Wallet_get_total_balances_return::create() {\n\treturn std::make_shared<Wallet_get_total_balances_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_total_balances_return::clone() const {\n\treturn std::make_shared<Wallet_get_total_balances_return>(*this);\n}\n\nvoid Wallet_get_total_balances_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_total_balances_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_total_balances_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_total_balances_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_total_balances_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_total_balances.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_total_balances_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_total_balances_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_total_balances.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_total_balances_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_total_balances_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_total_balances_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_total_balances_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_total_balances_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_total_balances_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_total_balances_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_total_balances.return\";\n\ttype_code->type_hash = vnx::Hash64(0x46f0368d7c4e45ddull);\n\ttype_code->code_hash = vnx::Hash64(0xb6f538b27dce56d1ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_total_balances_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_total_balances_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::balance_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {13, 5, 11, 32, 1, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_total_balances_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_total_balances_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_total_balances_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_total_balances_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_total_balances_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_total_balances_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_tx_log.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_tx_log.hxx>\n#include <mmx/Wallet_get_tx_log_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_tx_log::VNX_TYPE_HASH(0xc5570936be29c0ebull);\nconst vnx::Hash64 Wallet_get_tx_log::VNX_CODE_HASH(0xb1e755e53564438cull);\n\nvnx::Hash64 Wallet_get_tx_log::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_tx_log::get_type_name() const {\n\treturn \"mmx.Wallet.get_tx_log\";\n}\n\nconst vnx::TypeCode* Wallet_get_tx_log::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_tx_log;\n}\n\nstd::shared_ptr<Wallet_get_tx_log> Wallet_get_tx_log::create() {\n\treturn std::make_shared<Wallet_get_tx_log>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_tx_log::clone() const {\n\treturn std::make_shared<Wallet_get_tx_log>(*this);\n}\n\nvoid Wallet_get_tx_log::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_tx_log::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_tx_log::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_tx_log;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, limit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_tx_log::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_tx_log\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_tx_log::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_tx_log::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_tx_log\";\n\t_object[\"index\"] = index;\n\t_object[\"limit\"] = limit;\n\treturn _object;\n}\n\nvoid Wallet_get_tx_log::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_tx_log::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_tx_log::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_tx_log& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_tx_log& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_tx_log::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_tx_log::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_tx_log\";\n\ttype_code->type_hash = vnx::Hash64(0xc5570936be29c0ebull);\n\ttype_code->code_hash = vnx::Hash64(0xb1e755e53564438cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_tx_log);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_tx_log>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_get_tx_log_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {7};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_tx_log& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_tx_log& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_tx_log;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_tx_log>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.limit);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_tx_log& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_tx_log& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_tx_log& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_get_tx_log_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_get_tx_log_return.hxx>\n#include <mmx/tx_log_entry_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_get_tx_log_return::VNX_TYPE_HASH(0x5c6d4b8fc9820ec1ull);\nconst vnx::Hash64 Wallet_get_tx_log_return::VNX_CODE_HASH(0x473ec2b2f67e072eull);\n\nvnx::Hash64 Wallet_get_tx_log_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_get_tx_log_return::get_type_name() const {\n\treturn \"mmx.Wallet.get_tx_log.return\";\n}\n\nconst vnx::TypeCode* Wallet_get_tx_log_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_get_tx_log_return;\n}\n\nstd::shared_ptr<Wallet_get_tx_log_return> Wallet_get_tx_log_return::create() {\n\treturn std::make_shared<Wallet_get_tx_log_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_get_tx_log_return::clone() const {\n\treturn std::make_shared<Wallet_get_tx_log_return>(*this);\n}\n\nvoid Wallet_get_tx_log_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_get_tx_log_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_get_tx_log_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_get_tx_log_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_get_tx_log_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.get_tx_log.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_get_tx_log_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_get_tx_log_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.get_tx_log.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_get_tx_log_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_get_tx_log_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_get_tx_log_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_get_tx_log_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_get_tx_log_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_get_tx_log_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_get_tx_log_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.get_tx_log.return\";\n\ttype_code->type_hash = vnx::Hash64(0x5c6d4b8fc9820ec1ull);\n\ttype_code->code_hash = vnx::Hash64(0x473ec2b2f67e072eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_get_tx_log_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_get_tx_log_return>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::tx_log_entry_t::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_get_tx_log_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_get_tx_log_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_get_tx_log_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_get_tx_log_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_get_tx_log_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_get_tx_log_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_get_tx_log_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_import_wallet.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_import_wallet.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/Wallet_import_wallet_return.hxx>\n#include <mmx/account_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_import_wallet::VNX_TYPE_HASH(0x63a1d5b2fe482dd1ull);\nconst vnx::Hash64 Wallet_import_wallet::VNX_CODE_HASH(0xd93a521903365209ull);\n\nvnx::Hash64 Wallet_import_wallet::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_import_wallet::get_type_name() const {\n\treturn \"mmx.Wallet.import_wallet\";\n}\n\nconst vnx::TypeCode* Wallet_import_wallet::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_import_wallet;\n}\n\nstd::shared_ptr<Wallet_import_wallet> Wallet_import_wallet::create() {\n\treturn std::make_shared<Wallet_import_wallet>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_import_wallet::clone() const {\n\treturn std::make_shared<Wallet_import_wallet>(*this);\n}\n\nvoid Wallet_import_wallet::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_import_wallet::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_import_wallet::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_import_wallet;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, config);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, key_file);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, passphrase);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_import_wallet::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.import_wallet\\\"\";\n\t_out << \", \\\"config\\\": \"; vnx::write(_out, config);\n\t_out << \", \\\"key_file\\\": \"; vnx::write(_out, key_file);\n\t_out << \", \\\"passphrase\\\": \"; vnx::write(_out, passphrase);\n\t_out << \"}\";\n}\n\nvoid Wallet_import_wallet::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_import_wallet::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.import_wallet\";\n\t_object[\"config\"] = config;\n\t_object[\"key_file\"] = key_file;\n\t_object[\"passphrase\"] = passphrase;\n\treturn _object;\n}\n\nvoid Wallet_import_wallet::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"config\") {\n\t\t\t_entry.second.to(config);\n\t\t} else if(_entry.first == \"key_file\") {\n\t\t\t_entry.second.to(key_file);\n\t\t} else if(_entry.first == \"passphrase\") {\n\t\t\t_entry.second.to(passphrase);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_import_wallet::get_field(const std::string& _name) const {\n\tif(_name == \"config\") {\n\t\treturn vnx::Variant(config);\n\t}\n\tif(_name == \"key_file\") {\n\t\treturn vnx::Variant(key_file);\n\t}\n\tif(_name == \"passphrase\") {\n\t\treturn vnx::Variant(passphrase);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_import_wallet::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"config\") {\n\t\t_value.to(config);\n\t} else if(_name == \"key_file\") {\n\t\t_value.to(key_file);\n\t} else if(_name == \"passphrase\") {\n\t\t_value.to(passphrase);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_import_wallet& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_import_wallet& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_import_wallet::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_import_wallet::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.import_wallet\";\n\ttype_code->type_hash = vnx::Hash64(0x63a1d5b2fe482dd1ull);\n\ttype_code->code_hash = vnx::Hash64(0xd93a521903365209ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_import_wallet);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_import_wallet>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::account_t::static_get_type_code();\n\ttype_code->return_type = ::mmx::Wallet_import_wallet_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"config\";\n\t\tfield.code = {19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"key_file\";\n\t\tfield.code = {16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"passphrase\";\n\t\tfield.code = {33, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_import_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.config, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.key_file, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.passphrase, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_import_wallet& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_import_wallet;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_import_wallet>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.config, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.key_file, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.passphrase, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_import_wallet& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_import_wallet& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_import_wallet& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_import_wallet_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_import_wallet_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_import_wallet_return::VNX_TYPE_HASH(0xc6edac537d44ecd1ull);\nconst vnx::Hash64 Wallet_import_wallet_return::VNX_CODE_HASH(0xe5b420ce28b802b6ull);\n\nvnx::Hash64 Wallet_import_wallet_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_import_wallet_return::get_type_name() const {\n\treturn \"mmx.Wallet.import_wallet.return\";\n}\n\nconst vnx::TypeCode* Wallet_import_wallet_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_import_wallet_return;\n}\n\nstd::shared_ptr<Wallet_import_wallet_return> Wallet_import_wallet_return::create() {\n\treturn std::make_shared<Wallet_import_wallet_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_import_wallet_return::clone() const {\n\treturn std::make_shared<Wallet_import_wallet_return>(*this);\n}\n\nvoid Wallet_import_wallet_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_import_wallet_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_import_wallet_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_import_wallet_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_import_wallet_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.import_wallet.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_import_wallet_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_import_wallet_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.import_wallet.return\";\n\treturn _object;\n}\n\nvoid Wallet_import_wallet_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_import_wallet_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_import_wallet_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_import_wallet_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_import_wallet_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_import_wallet_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_import_wallet_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.import_wallet.return\";\n\ttype_code->type_hash = vnx::Hash64(0xc6edac537d44ecd1ull);\n\ttype_code->code_hash = vnx::Hash64(0xe5b420ce28b802b6ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_import_wallet_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_import_wallet_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_import_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_import_wallet_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_import_wallet_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_import_wallet_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_import_wallet_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_import_wallet_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_import_wallet_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_is_locked.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_is_locked.hxx>\n#include <mmx/Wallet_is_locked_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_is_locked::VNX_TYPE_HASH(0x6087e83febcc233ull);\nconst vnx::Hash64 Wallet_is_locked::VNX_CODE_HASH(0x99e989de7c61f372ull);\n\nvnx::Hash64 Wallet_is_locked::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_is_locked::get_type_name() const {\n\treturn \"mmx.Wallet.is_locked\";\n}\n\nconst vnx::TypeCode* Wallet_is_locked::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_is_locked;\n}\n\nstd::shared_ptr<Wallet_is_locked> Wallet_is_locked::create() {\n\treturn std::make_shared<Wallet_is_locked>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_is_locked::clone() const {\n\treturn std::make_shared<Wallet_is_locked>(*this);\n}\n\nvoid Wallet_is_locked::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_is_locked::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_is_locked::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_is_locked;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_is_locked::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.is_locked\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \"}\";\n}\n\nvoid Wallet_is_locked::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_is_locked::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.is_locked\";\n\t_object[\"index\"] = index;\n\treturn _object;\n}\n\nvoid Wallet_is_locked::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_is_locked::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_is_locked::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_is_locked& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_is_locked& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_is_locked::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_is_locked::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.is_locked\";\n\ttype_code->type_hash = vnx::Hash64(0x6087e83febcc233ull);\n\ttype_code->code_hash = vnx::Hash64(0x99e989de7c61f372ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_is_locked);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_is_locked>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_is_locked_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_is_locked& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_is_locked& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_is_locked;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_is_locked>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_is_locked& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_is_locked& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_is_locked& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_is_locked_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_is_locked_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_is_locked_return::VNX_TYPE_HASH(0x1ea1b30193de8d7bull);\nconst vnx::Hash64 Wallet_is_locked_return::VNX_CODE_HASH(0xa654b2afcc700bbdull);\n\nvnx::Hash64 Wallet_is_locked_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_is_locked_return::get_type_name() const {\n\treturn \"mmx.Wallet.is_locked.return\";\n}\n\nconst vnx::TypeCode* Wallet_is_locked_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_is_locked_return;\n}\n\nstd::shared_ptr<Wallet_is_locked_return> Wallet_is_locked_return::create() {\n\treturn std::make_shared<Wallet_is_locked_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_is_locked_return::clone() const {\n\treturn std::make_shared<Wallet_is_locked_return>(*this);\n}\n\nvoid Wallet_is_locked_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_is_locked_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_is_locked_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_is_locked_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_is_locked_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.is_locked.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_is_locked_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_is_locked_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.is_locked.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_is_locked_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_is_locked_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_is_locked_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_is_locked_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_is_locked_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_is_locked_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_is_locked_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.is_locked.return\";\n\ttype_code->type_hash = vnx::Hash64(0x1ea1b30193de8d7bull);\n\ttype_code->code_hash = vnx::Hash64(0xa654b2afcc700bbdull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_is_locked_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_is_locked_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_is_locked_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value._ret_0, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_is_locked_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_is_locked_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_is_locked_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(1);\n\tvnx::write_value(_buf + 0, value._ret_0);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_is_locked_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_is_locked_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_is_locked_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_lock.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_lock.hxx>\n#include <mmx/Wallet_lock_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_lock::VNX_TYPE_HASH(0x9072deb8ab538b2bull);\nconst vnx::Hash64 Wallet_lock::VNX_CODE_HASH(0x5ef9cd488ac99859ull);\n\nvnx::Hash64 Wallet_lock::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_lock::get_type_name() const {\n\treturn \"mmx.Wallet.lock\";\n}\n\nconst vnx::TypeCode* Wallet_lock::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_lock;\n}\n\nstd::shared_ptr<Wallet_lock> Wallet_lock::create() {\n\treturn std::make_shared<Wallet_lock>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_lock::clone() const {\n\treturn std::make_shared<Wallet_lock>(*this);\n}\n\nvoid Wallet_lock::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_lock::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_lock::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_lock;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_lock::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.lock\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \"}\";\n}\n\nvoid Wallet_lock::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_lock::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.lock\";\n\t_object[\"index\"] = index;\n\treturn _object;\n}\n\nvoid Wallet_lock::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_lock::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_lock::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_lock& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_lock& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_lock::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_lock::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.lock\";\n\ttype_code->type_hash = vnx::Hash64(0x9072deb8ab538b2bull);\n\ttype_code->code_hash = vnx::Hash64(0x5ef9cd488ac99859ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_lock);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_lock>(); };\n\ttype_code->return_type = ::mmx::Wallet_lock_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_lock& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_lock& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_lock;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_lock>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_lock& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_lock& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_lock& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_lock_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_lock_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_lock_return::VNX_TYPE_HASH(0x74cb9d670ae675f3ull);\nconst vnx::Hash64 Wallet_lock_return::VNX_CODE_HASH(0x1534155daaa5320cull);\n\nvnx::Hash64 Wallet_lock_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_lock_return::get_type_name() const {\n\treturn \"mmx.Wallet.lock.return\";\n}\n\nconst vnx::TypeCode* Wallet_lock_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_lock_return;\n}\n\nstd::shared_ptr<Wallet_lock_return> Wallet_lock_return::create() {\n\treturn std::make_shared<Wallet_lock_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_lock_return::clone() const {\n\treturn std::make_shared<Wallet_lock_return>(*this);\n}\n\nvoid Wallet_lock_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_lock_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_lock_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_lock_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_lock_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.lock.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_lock_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_lock_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.lock.return\";\n\treturn _object;\n}\n\nvoid Wallet_lock_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_lock_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_lock_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_lock_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_lock_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_lock_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_lock_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.lock.return\";\n\ttype_code->type_hash = vnx::Hash64(0x74cb9d670ae675f3ull);\n\ttype_code->code_hash = vnx::Hash64(0x1534155daaa5320cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_lock_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_lock_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_lock_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_lock_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_lock_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_lock_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_lock_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_lock_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_lock_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_make_offer.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_make_offer.hxx>\n#include <mmx/Wallet_make_offer_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_make_offer::VNX_TYPE_HASH(0x8b0cf597e8265a73ull);\nconst vnx::Hash64 Wallet_make_offer::VNX_CODE_HASH(0xe13d393a070dc28eull);\n\nvnx::Hash64 Wallet_make_offer::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_make_offer::get_type_name() const {\n\treturn \"mmx.Wallet.make_offer\";\n}\n\nconst vnx::TypeCode* Wallet_make_offer::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_make_offer;\n}\n\nstd::shared_ptr<Wallet_make_offer> Wallet_make_offer::create() {\n\treturn std::make_shared<Wallet_make_offer>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_make_offer::clone() const {\n\treturn std::make_shared<Wallet_make_offer>(*this);\n}\n\nvoid Wallet_make_offer::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_make_offer::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_make_offer::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_make_offer;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, owner);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, bid_amount);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, bid_currency);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, ask_amount);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, ask_currency);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_make_offer::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.make_offer\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"owner\\\": \"; vnx::write(_out, owner);\n\t_out << \", \\\"bid_amount\\\": \"; vnx::write(_out, bid_amount);\n\t_out << \", \\\"bid_currency\\\": \"; vnx::write(_out, bid_currency);\n\t_out << \", \\\"ask_amount\\\": \"; vnx::write(_out, ask_amount);\n\t_out << \", \\\"ask_currency\\\": \"; vnx::write(_out, ask_currency);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_make_offer::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_make_offer::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.make_offer\";\n\t_object[\"index\"] = index;\n\t_object[\"owner\"] = owner;\n\t_object[\"bid_amount\"] = bid_amount;\n\t_object[\"bid_currency\"] = bid_currency;\n\t_object[\"ask_amount\"] = ask_amount;\n\t_object[\"ask_currency\"] = ask_currency;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_make_offer::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"ask_amount\") {\n\t\t\t_entry.second.to(ask_amount);\n\t\t} else if(_entry.first == \"ask_currency\") {\n\t\t\t_entry.second.to(ask_currency);\n\t\t} else if(_entry.first == \"bid_amount\") {\n\t\t\t_entry.second.to(bid_amount);\n\t\t} else if(_entry.first == \"bid_currency\") {\n\t\t\t_entry.second.to(bid_currency);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t} else if(_entry.first == \"owner\") {\n\t\t\t_entry.second.to(owner);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_make_offer::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"owner\") {\n\t\treturn vnx::Variant(owner);\n\t}\n\tif(_name == \"bid_amount\") {\n\t\treturn vnx::Variant(bid_amount);\n\t}\n\tif(_name == \"bid_currency\") {\n\t\treturn vnx::Variant(bid_currency);\n\t}\n\tif(_name == \"ask_amount\") {\n\t\treturn vnx::Variant(ask_amount);\n\t}\n\tif(_name == \"ask_currency\") {\n\t\treturn vnx::Variant(ask_currency);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_make_offer::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"owner\") {\n\t\t_value.to(owner);\n\t} else if(_name == \"bid_amount\") {\n\t\t_value.to(bid_amount);\n\t} else if(_name == \"bid_currency\") {\n\t\t_value.to(bid_currency);\n\t} else if(_name == \"ask_amount\") {\n\t\t_value.to(ask_amount);\n\t} else if(_name == \"ask_currency\") {\n\t\t_value.to(ask_currency);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_make_offer& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_make_offer& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_make_offer::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_make_offer::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.make_offer\";\n\ttype_code->type_hash = vnx::Hash64(0x8b0cf597e8265a73ull);\n\ttype_code->code_hash = vnx::Hash64(0xe13d393a070dc28eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_make_offer);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_make_offer>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_make_offer_return::static_get_type_code();\n\ttype_code->fields.resize(7);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"owner\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"bid_amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"bid_currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"ask_amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"ask_currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_make_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.owner, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 2: vnx::read(in, value.bid_amount, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.bid_currency, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.ask_amount, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.ask_currency, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_make_offer& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_make_offer;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_make_offer>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.owner);\n\tvnx::write(out, value.bid_amount, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.bid_currency, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.ask_amount, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.ask_currency, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[6].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_make_offer& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_make_offer& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_make_offer& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_make_offer_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_make_offer_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_make_offer_return::VNX_TYPE_HASH(0xf8ecff218266aadaull);\nconst vnx::Hash64 Wallet_make_offer_return::VNX_CODE_HASH(0x4fb2aaa69af5e557ull);\n\nvnx::Hash64 Wallet_make_offer_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_make_offer_return::get_type_name() const {\n\treturn \"mmx.Wallet.make_offer.return\";\n}\n\nconst vnx::TypeCode* Wallet_make_offer_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_make_offer_return;\n}\n\nstd::shared_ptr<Wallet_make_offer_return> Wallet_make_offer_return::create() {\n\treturn std::make_shared<Wallet_make_offer_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_make_offer_return::clone() const {\n\treturn std::make_shared<Wallet_make_offer_return>(*this);\n}\n\nvoid Wallet_make_offer_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_make_offer_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_make_offer_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_make_offer_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_make_offer_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.make_offer.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_make_offer_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_make_offer_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.make_offer.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_make_offer_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_make_offer_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_make_offer_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_make_offer_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_make_offer_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_make_offer_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_make_offer_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.make_offer.return\";\n\ttype_code->type_hash = vnx::Hash64(0xf8ecff218266aadaull);\n\ttype_code->code_hash = vnx::Hash64(0x4fb2aaa69af5e557ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_make_offer_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_make_offer_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_make_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_make_offer_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_make_offer_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_make_offer_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_make_offer_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_make_offer_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_make_offer_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_mark_spent.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_mark_spent.hxx>\n#include <mmx/Wallet_mark_spent_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_mark_spent::VNX_TYPE_HASH(0x107fed23348b3333ull);\nconst vnx::Hash64 Wallet_mark_spent::VNX_CODE_HASH(0x7a427fe0dff40777ull);\n\nvnx::Hash64 Wallet_mark_spent::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_mark_spent::get_type_name() const {\n\treturn \"mmx.Wallet.mark_spent\";\n}\n\nconst vnx::TypeCode* Wallet_mark_spent::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_mark_spent;\n}\n\nstd::shared_ptr<Wallet_mark_spent> Wallet_mark_spent::create() {\n\treturn std::make_shared<Wallet_mark_spent>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_mark_spent::clone() const {\n\treturn std::make_shared<Wallet_mark_spent>(*this);\n}\n\nvoid Wallet_mark_spent::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_mark_spent::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_mark_spent::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_mark_spent;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, amounts);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_mark_spent::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.mark_spent\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"amounts\\\": \"; vnx::write(_out, amounts);\n\t_out << \"}\";\n}\n\nvoid Wallet_mark_spent::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_mark_spent::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.mark_spent\";\n\t_object[\"index\"] = index;\n\t_object[\"amounts\"] = amounts;\n\treturn _object;\n}\n\nvoid Wallet_mark_spent::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"amounts\") {\n\t\t\t_entry.second.to(amounts);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_mark_spent::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"amounts\") {\n\t\treturn vnx::Variant(amounts);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_mark_spent::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"amounts\") {\n\t\t_value.to(amounts);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_mark_spent& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_mark_spent& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_mark_spent::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_mark_spent::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.mark_spent\";\n\ttype_code->type_hash = vnx::Hash64(0x107fed23348b3333ull);\n\ttype_code->code_hash = vnx::Hash64(0x7a427fe0dff40777ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_mark_spent);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_mark_spent>(); };\n\ttype_code->return_type = ::mmx::Wallet_mark_spent_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amounts\";\n\t\tfield.code = {13, 12, 23, 2, 4, 7, 11, 32, 1, 11, 32, 1, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_mark_spent& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.amounts, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_mark_spent& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_mark_spent;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_mark_spent>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.amounts, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_mark_spent& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_mark_spent& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_mark_spent& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_mark_spent_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_mark_spent_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_mark_spent_return::VNX_TYPE_HASH(0xf28950d2b8f874dfull);\nconst vnx::Hash64 Wallet_mark_spent_return::VNX_CODE_HASH(0xae19515a62eec3ddull);\n\nvnx::Hash64 Wallet_mark_spent_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_mark_spent_return::get_type_name() const {\n\treturn \"mmx.Wallet.mark_spent.return\";\n}\n\nconst vnx::TypeCode* Wallet_mark_spent_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_mark_spent_return;\n}\n\nstd::shared_ptr<Wallet_mark_spent_return> Wallet_mark_spent_return::create() {\n\treturn std::make_shared<Wallet_mark_spent_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_mark_spent_return::clone() const {\n\treturn std::make_shared<Wallet_mark_spent_return>(*this);\n}\n\nvoid Wallet_mark_spent_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_mark_spent_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_mark_spent_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_mark_spent_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_mark_spent_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.mark_spent.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_mark_spent_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_mark_spent_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.mark_spent.return\";\n\treturn _object;\n}\n\nvoid Wallet_mark_spent_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_mark_spent_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_mark_spent_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_mark_spent_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_mark_spent_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_mark_spent_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_mark_spent_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.mark_spent.return\";\n\ttype_code->type_hash = vnx::Hash64(0xf28950d2b8f874dfull);\n\ttype_code->code_hash = vnx::Hash64(0xae19515a62eec3ddull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_mark_spent_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_mark_spent_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_mark_spent_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_mark_spent_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_mark_spent_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_mark_spent_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_mark_spent_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_mark_spent_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_mark_spent_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_offer_trade.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_offer_trade.hxx>\n#include <mmx/Wallet_offer_trade_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_offer_trade::VNX_TYPE_HASH(0x557a94a5a4887bf2ull);\nconst vnx::Hash64 Wallet_offer_trade::VNX_CODE_HASH(0x6ac0af69904bcd76ull);\n\nvnx::Hash64 Wallet_offer_trade::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_offer_trade::get_type_name() const {\n\treturn \"mmx.Wallet.offer_trade\";\n}\n\nconst vnx::TypeCode* Wallet_offer_trade::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_offer_trade;\n}\n\nstd::shared_ptr<Wallet_offer_trade> Wallet_offer_trade::create() {\n\treturn std::make_shared<Wallet_offer_trade>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_offer_trade::clone() const {\n\treturn std::make_shared<Wallet_offer_trade>(*this);\n}\n\nvoid Wallet_offer_trade::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_offer_trade::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_offer_trade::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_offer_trade;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, dst_addr);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, price);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_offer_trade::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.offer_trade\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"dst_addr\\\": \"; vnx::write(_out, dst_addr);\n\t_out << \", \\\"price\\\": \"; vnx::write(_out, price);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_offer_trade::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_offer_trade::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.offer_trade\";\n\t_object[\"index\"] = index;\n\t_object[\"address\"] = address;\n\t_object[\"amount\"] = amount;\n\t_object[\"dst_addr\"] = dst_addr;\n\t_object[\"price\"] = price;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_offer_trade::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"dst_addr\") {\n\t\t\t_entry.second.to(dst_addr);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t} else if(_entry.first == \"price\") {\n\t\t\t_entry.second.to(price);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_offer_trade::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"dst_addr\") {\n\t\treturn vnx::Variant(dst_addr);\n\t}\n\tif(_name == \"price\") {\n\t\treturn vnx::Variant(price);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_offer_trade::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"dst_addr\") {\n\t\t_value.to(dst_addr);\n\t} else if(_name == \"price\") {\n\t\t_value.to(price);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_offer_trade& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_offer_trade& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_offer_trade::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_offer_trade::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.offer_trade\";\n\ttype_code->type_hash = vnx::Hash64(0x557a94a5a4887bf2ull);\n\ttype_code->code_hash = vnx::Hash64(0x6ac0af69904bcd76ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_offer_trade);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_offer_trade>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_offer_trade_return::static_get_type_code();\n\ttype_code->fields.resize(6);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"dst_addr\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"price\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_offer_trade& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.dst_addr, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.price, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_offer_trade& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_offer_trade;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_offer_trade>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.dst_addr);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.price, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[5].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_offer_trade& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_offer_trade& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_trade& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_offer_trade_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_offer_trade_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_offer_trade_return::VNX_TYPE_HASH(0xb43f9bef89670cebull);\nconst vnx::Hash64 Wallet_offer_trade_return::VNX_CODE_HASH(0x2abc8aa8f3e7c390ull);\n\nvnx::Hash64 Wallet_offer_trade_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_offer_trade_return::get_type_name() const {\n\treturn \"mmx.Wallet.offer_trade.return\";\n}\n\nconst vnx::TypeCode* Wallet_offer_trade_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_offer_trade_return;\n}\n\nstd::shared_ptr<Wallet_offer_trade_return> Wallet_offer_trade_return::create() {\n\treturn std::make_shared<Wallet_offer_trade_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_offer_trade_return::clone() const {\n\treturn std::make_shared<Wallet_offer_trade_return>(*this);\n}\n\nvoid Wallet_offer_trade_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_offer_trade_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_offer_trade_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_offer_trade_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_offer_trade_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.offer_trade.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_offer_trade_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_offer_trade_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.offer_trade.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_offer_trade_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_offer_trade_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_offer_trade_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_offer_trade_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_offer_trade_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_offer_trade_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_offer_trade_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.offer_trade.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb43f9bef89670cebull);\n\ttype_code->code_hash = vnx::Hash64(0x2abc8aa8f3e7c390ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_offer_trade_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_offer_trade_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_offer_trade_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_offer_trade_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_offer_trade_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_offer_trade_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_offer_trade_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_offer_trade_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_trade_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_offer_withdraw.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_offer_withdraw.hxx>\n#include <mmx/Wallet_offer_withdraw_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_offer_withdraw::VNX_TYPE_HASH(0x790a334fbf5dd1e6ull);\nconst vnx::Hash64 Wallet_offer_withdraw::VNX_CODE_HASH(0x4ab2d90a638d2787ull);\n\nvnx::Hash64 Wallet_offer_withdraw::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_offer_withdraw::get_type_name() const {\n\treturn \"mmx.Wallet.offer_withdraw\";\n}\n\nconst vnx::TypeCode* Wallet_offer_withdraw::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_offer_withdraw;\n}\n\nstd::shared_ptr<Wallet_offer_withdraw> Wallet_offer_withdraw::create() {\n\treturn std::make_shared<Wallet_offer_withdraw>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_offer_withdraw::clone() const {\n\treturn std::make_shared<Wallet_offer_withdraw>(*this);\n}\n\nvoid Wallet_offer_withdraw::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_offer_withdraw::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_offer_withdraw::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_offer_withdraw;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_offer_withdraw::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.offer_withdraw\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_offer_withdraw::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_offer_withdraw::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.offer_withdraw\";\n\t_object[\"index\"] = index;\n\t_object[\"address\"] = address;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_offer_withdraw::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_offer_withdraw::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_offer_withdraw::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_offer_withdraw& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_offer_withdraw& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_offer_withdraw::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_offer_withdraw::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.offer_withdraw\";\n\ttype_code->type_hash = vnx::Hash64(0x790a334fbf5dd1e6ull);\n\ttype_code->code_hash = vnx::Hash64(0x4ab2d90a638d2787ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_offer_withdraw);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_offer_withdraw>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_offer_withdraw_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_offer_withdraw& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_offer_withdraw& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_offer_withdraw;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_offer_withdraw>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_offer_withdraw& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_offer_withdraw& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_withdraw& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_offer_withdraw_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_offer_withdraw_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_offer_withdraw_return::VNX_TYPE_HASH(0xea9f43cd17c41965ull);\nconst vnx::Hash64 Wallet_offer_withdraw_return::VNX_CODE_HASH(0xece913c433426433ull);\n\nvnx::Hash64 Wallet_offer_withdraw_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_offer_withdraw_return::get_type_name() const {\n\treturn \"mmx.Wallet.offer_withdraw.return\";\n}\n\nconst vnx::TypeCode* Wallet_offer_withdraw_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_offer_withdraw_return;\n}\n\nstd::shared_ptr<Wallet_offer_withdraw_return> Wallet_offer_withdraw_return::create() {\n\treturn std::make_shared<Wallet_offer_withdraw_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_offer_withdraw_return::clone() const {\n\treturn std::make_shared<Wallet_offer_withdraw_return>(*this);\n}\n\nvoid Wallet_offer_withdraw_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_offer_withdraw_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_offer_withdraw_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_offer_withdraw_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_offer_withdraw_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.offer_withdraw.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_offer_withdraw_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_offer_withdraw_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.offer_withdraw.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_offer_withdraw_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_offer_withdraw_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_offer_withdraw_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_offer_withdraw_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_offer_withdraw_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_offer_withdraw_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_offer_withdraw_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.offer_withdraw.return\";\n\ttype_code->type_hash = vnx::Hash64(0xea9f43cd17c41965ull);\n\ttype_code->code_hash = vnx::Hash64(0xece913c433426433ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_offer_withdraw_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_offer_withdraw_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_offer_withdraw_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_offer_withdraw_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_offer_withdraw_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_offer_withdraw_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_offer_withdraw_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_offer_withdraw_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_offer_withdraw_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_plotnft_create.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_plotnft_create.hxx>\n#include <mmx/Wallet_plotnft_create_return.hxx>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_plotnft_create::VNX_TYPE_HASH(0x6b0c985ca2c555c9ull);\nconst vnx::Hash64 Wallet_plotnft_create::VNX_CODE_HASH(0xdf7a5af8c6702eb0ull);\n\nvnx::Hash64 Wallet_plotnft_create::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_plotnft_create::get_type_name() const {\n\treturn \"mmx.Wallet.plotnft_create\";\n}\n\nconst vnx::TypeCode* Wallet_plotnft_create::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_plotnft_create;\n}\n\nstd::shared_ptr<Wallet_plotnft_create> Wallet_plotnft_create::create() {\n\treturn std::make_shared<Wallet_plotnft_create>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_plotnft_create::clone() const {\n\treturn std::make_shared<Wallet_plotnft_create>(*this);\n}\n\nvoid Wallet_plotnft_create::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_plotnft_create::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_plotnft_create::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_plotnft_create;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, owner);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_plotnft_create::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.plotnft_create\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"owner\\\": \"; vnx::write(_out, owner);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_plotnft_create::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_plotnft_create::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.plotnft_create\";\n\t_object[\"index\"] = index;\n\t_object[\"name\"] = name;\n\t_object[\"owner\"] = owner;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_plotnft_create::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t} else if(_entry.first == \"owner\") {\n\t\t\t_entry.second.to(owner);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_plotnft_create::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"owner\") {\n\t\treturn vnx::Variant(owner);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_plotnft_create::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"owner\") {\n\t\t_value.to(owner);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_plotnft_create& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_plotnft_create& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_plotnft_create::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_plotnft_create::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.plotnft_create\";\n\ttype_code->type_hash = vnx::Hash64(0x6b0c985ca2c555c9ull);\n\ttype_code->code_hash = vnx::Hash64(0xdf7a5af8c6702eb0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_plotnft_create);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_plotnft_create>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_plotnft_create_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"owner\";\n\t\tfield.code = {33, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_plotnft_create& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.owner, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_create& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_plotnft_create;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_plotnft_create>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.name, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.owner, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_plotnft_create& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_create& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_create& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_plotnft_create_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_plotnft_create_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_plotnft_create_return::VNX_TYPE_HASH(0x349cedc7d1d4dcfull);\nconst vnx::Hash64 Wallet_plotnft_create_return::VNX_CODE_HASH(0xb1aa822e75d3ed91ull);\n\nvnx::Hash64 Wallet_plotnft_create_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_plotnft_create_return::get_type_name() const {\n\treturn \"mmx.Wallet.plotnft_create.return\";\n}\n\nconst vnx::TypeCode* Wallet_plotnft_create_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_plotnft_create_return;\n}\n\nstd::shared_ptr<Wallet_plotnft_create_return> Wallet_plotnft_create_return::create() {\n\treturn std::make_shared<Wallet_plotnft_create_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_plotnft_create_return::clone() const {\n\treturn std::make_shared<Wallet_plotnft_create_return>(*this);\n}\n\nvoid Wallet_plotnft_create_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_plotnft_create_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_plotnft_create_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_plotnft_create_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_plotnft_create_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.plotnft_create.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_plotnft_create_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_plotnft_create_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.plotnft_create.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_plotnft_create_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_plotnft_create_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_plotnft_create_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_plotnft_create_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_plotnft_create_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_plotnft_create_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_plotnft_create_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.plotnft_create.return\";\n\ttype_code->type_hash = vnx::Hash64(0x349cedc7d1d4dcfull);\n\ttype_code->code_hash = vnx::Hash64(0xb1aa822e75d3ed91ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_plotnft_create_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_plotnft_create_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_plotnft_create_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_create_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_plotnft_create_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_plotnft_create_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_plotnft_create_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_create_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_create_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_plotnft_exec.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_plotnft_exec.hxx>\n#include <mmx/Wallet_plotnft_exec_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_plotnft_exec::VNX_TYPE_HASH(0xca9e9d0dfde795d1ull);\nconst vnx::Hash64 Wallet_plotnft_exec::VNX_CODE_HASH(0x4c5f4c17a6934bacull);\n\nvnx::Hash64 Wallet_plotnft_exec::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_plotnft_exec::get_type_name() const {\n\treturn \"mmx.Wallet.plotnft_exec\";\n}\n\nconst vnx::TypeCode* Wallet_plotnft_exec::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_plotnft_exec;\n}\n\nstd::shared_ptr<Wallet_plotnft_exec> Wallet_plotnft_exec::create() {\n\treturn std::make_shared<Wallet_plotnft_exec>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_plotnft_exec::clone() const {\n\treturn std::make_shared<Wallet_plotnft_exec>(*this);\n}\n\nvoid Wallet_plotnft_exec::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_plotnft_exec::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_plotnft_exec::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_plotnft_exec;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, method);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, args);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_plotnft_exec::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.plotnft_exec\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"method\\\": \"; vnx::write(_out, method);\n\t_out << \", \\\"args\\\": \"; vnx::write(_out, args);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_plotnft_exec::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_plotnft_exec::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.plotnft_exec\";\n\t_object[\"address\"] = address;\n\t_object[\"method\"] = method;\n\t_object[\"args\"] = args;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_plotnft_exec::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"args\") {\n\t\t\t_entry.second.to(args);\n\t\t} else if(_entry.first == \"method\") {\n\t\t\t_entry.second.to(method);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_plotnft_exec::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"method\") {\n\t\treturn vnx::Variant(method);\n\t}\n\tif(_name == \"args\") {\n\t\treturn vnx::Variant(args);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_plotnft_exec::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"method\") {\n\t\t_value.to(method);\n\t} else if(_name == \"args\") {\n\t\t_value.to(args);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_plotnft_exec& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_plotnft_exec& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_plotnft_exec::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_plotnft_exec::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.plotnft_exec\";\n\ttype_code->type_hash = vnx::Hash64(0xca9e9d0dfde795d1ull);\n\ttype_code->code_hash = vnx::Hash64(0x4c5f4c17a6934bacull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_plotnft_exec);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_plotnft_exec>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_plotnft_exec_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"method\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"args\";\n\t\tfield.code = {12, 17};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_plotnft_exec& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.method, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.args, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_exec& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_plotnft_exec;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_plotnft_exec>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.method, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.args, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_plotnft_exec& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_exec& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_exec& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_plotnft_exec_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_plotnft_exec_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_plotnft_exec_return::VNX_TYPE_HASH(0x8330b38d9cb47b24ull);\nconst vnx::Hash64 Wallet_plotnft_exec_return::VNX_CODE_HASH(0x83799190fafddf37ull);\n\nvnx::Hash64 Wallet_plotnft_exec_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_plotnft_exec_return::get_type_name() const {\n\treturn \"mmx.Wallet.plotnft_exec.return\";\n}\n\nconst vnx::TypeCode* Wallet_plotnft_exec_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_plotnft_exec_return;\n}\n\nstd::shared_ptr<Wallet_plotnft_exec_return> Wallet_plotnft_exec_return::create() {\n\treturn std::make_shared<Wallet_plotnft_exec_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_plotnft_exec_return::clone() const {\n\treturn std::make_shared<Wallet_plotnft_exec_return>(*this);\n}\n\nvoid Wallet_plotnft_exec_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_plotnft_exec_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_plotnft_exec_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_plotnft_exec_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_plotnft_exec_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.plotnft_exec.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_plotnft_exec_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_plotnft_exec_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.plotnft_exec.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_plotnft_exec_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_plotnft_exec_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_plotnft_exec_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_plotnft_exec_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_plotnft_exec_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_plotnft_exec_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_plotnft_exec_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.plotnft_exec.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8330b38d9cb47b24ull);\n\ttype_code->code_hash = vnx::Hash64(0x83799190fafddf37ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_plotnft_exec_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_plotnft_exec_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_plotnft_exec_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_plotnft_exec_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_plotnft_exec_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_plotnft_exec_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_plotnft_exec_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_plotnft_exec_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_plotnft_exec_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_release.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_release.hxx>\n#include <mmx/Wallet_release_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_release::VNX_TYPE_HASH(0x2cd72a3370e05db3ull);\nconst vnx::Hash64 Wallet_release::VNX_CODE_HASH(0x78dfeec1fd2ea88dull);\n\nvnx::Hash64 Wallet_release::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_release::get_type_name() const {\n\treturn \"mmx.Wallet.release\";\n}\n\nconst vnx::TypeCode* Wallet_release::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_release;\n}\n\nstd::shared_ptr<Wallet_release> Wallet_release::create() {\n\treturn std::make_shared<Wallet_release>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_release::clone() const {\n\treturn std::make_shared<Wallet_release>(*this);\n}\n\nvoid Wallet_release::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_release::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_release::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_release;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, amounts);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_release::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.release\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"amounts\\\": \"; vnx::write(_out, amounts);\n\t_out << \"}\";\n}\n\nvoid Wallet_release::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_release::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.release\";\n\t_object[\"index\"] = index;\n\t_object[\"amounts\"] = amounts;\n\treturn _object;\n}\n\nvoid Wallet_release::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"amounts\") {\n\t\t\t_entry.second.to(amounts);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_release::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"amounts\") {\n\t\treturn vnx::Variant(amounts);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_release::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"amounts\") {\n\t\t_value.to(amounts);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_release& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_release& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_release::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_release::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.release\";\n\ttype_code->type_hash = vnx::Hash64(0x2cd72a3370e05db3ull);\n\ttype_code->code_hash = vnx::Hash64(0x78dfeec1fd2ea88dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_release);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_release>(); };\n\ttype_code->return_type = ::mmx::Wallet_release_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amounts\";\n\t\tfield.code = {13, 12, 23, 2, 4, 7, 11, 32, 1, 11, 32, 1, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_release& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.amounts, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_release& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_release;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_release>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.amounts, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_release& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_release& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_release& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_release_all.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_release_all.hxx>\n#include <mmx/Wallet_release_all_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_release_all::VNX_TYPE_HASH(0x4bd57b9deca4be51ull);\nconst vnx::Hash64 Wallet_release_all::VNX_CODE_HASH(0x20519ec9a9adaaadull);\n\nvnx::Hash64 Wallet_release_all::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_release_all::get_type_name() const {\n\treturn \"mmx.Wallet.release_all\";\n}\n\nconst vnx::TypeCode* Wallet_release_all::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_release_all;\n}\n\nstd::shared_ptr<Wallet_release_all> Wallet_release_all::create() {\n\treturn std::make_shared<Wallet_release_all>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_release_all::clone() const {\n\treturn std::make_shared<Wallet_release_all>(*this);\n}\n\nvoid Wallet_release_all::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_release_all::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_release_all::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_release_all;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_release_all::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.release_all\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_release_all::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_release_all::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.release_all\";\n\treturn _object;\n}\n\nvoid Wallet_release_all::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_release_all::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_release_all::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_release_all& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_release_all& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_release_all::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_release_all::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.release_all\";\n\ttype_code->type_hash = vnx::Hash64(0x4bd57b9deca4be51ull);\n\ttype_code->code_hash = vnx::Hash64(0x20519ec9a9adaaadull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_release_all);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_release_all>(); };\n\ttype_code->return_type = ::mmx::Wallet_release_all_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_release_all& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_release_all& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_release_all;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_release_all>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_release_all& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_release_all& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_release_all& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_release_all_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_release_all_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_release_all_return::VNX_TYPE_HASH(0xf7029fb06b3b3fa5ull);\nconst vnx::Hash64 Wallet_release_all_return::VNX_CODE_HASH(0x5939c981f3f672feull);\n\nvnx::Hash64 Wallet_release_all_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_release_all_return::get_type_name() const {\n\treturn \"mmx.Wallet.release_all.return\";\n}\n\nconst vnx::TypeCode* Wallet_release_all_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_release_all_return;\n}\n\nstd::shared_ptr<Wallet_release_all_return> Wallet_release_all_return::create() {\n\treturn std::make_shared<Wallet_release_all_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_release_all_return::clone() const {\n\treturn std::make_shared<Wallet_release_all_return>(*this);\n}\n\nvoid Wallet_release_all_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_release_all_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_release_all_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_release_all_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_release_all_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.release_all.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_release_all_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_release_all_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.release_all.return\";\n\treturn _object;\n}\n\nvoid Wallet_release_all_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_release_all_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_release_all_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_release_all_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_release_all_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_release_all_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_release_all_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.release_all.return\";\n\ttype_code->type_hash = vnx::Hash64(0xf7029fb06b3b3fa5ull);\n\ttype_code->code_hash = vnx::Hash64(0x5939c981f3f672feull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_release_all_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_release_all_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_release_all_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_release_all_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_release_all_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_release_all_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_release_all_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_release_all_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_release_all_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_release_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_release_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_release_return::VNX_TYPE_HASH(0xd302995a8c4dcf83ull);\nconst vnx::Hash64 Wallet_release_return::VNX_CODE_HASH(0x669bdca0c327d3b0ull);\n\nvnx::Hash64 Wallet_release_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_release_return::get_type_name() const {\n\treturn \"mmx.Wallet.release.return\";\n}\n\nconst vnx::TypeCode* Wallet_release_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_release_return;\n}\n\nstd::shared_ptr<Wallet_release_return> Wallet_release_return::create() {\n\treturn std::make_shared<Wallet_release_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_release_return::clone() const {\n\treturn std::make_shared<Wallet_release_return>(*this);\n}\n\nvoid Wallet_release_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_release_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_release_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_release_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_release_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.release.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_release_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_release_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.release.return\";\n\treturn _object;\n}\n\nvoid Wallet_release_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_release_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_release_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_release_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_release_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_release_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_release_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.release.return\";\n\ttype_code->type_hash = vnx::Hash64(0xd302995a8c4dcf83ull);\n\ttype_code->code_hash = vnx::Hash64(0x669bdca0c327d3b0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_release_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_release_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_release_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_release_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_release_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_release_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_release_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_release_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_release_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_rem_token.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_rem_token.hxx>\n#include <mmx/Wallet_rem_token_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_rem_token::VNX_TYPE_HASH(0xc913cdd1600a2609ull);\nconst vnx::Hash64 Wallet_rem_token::VNX_CODE_HASH(0x5b6ec771b12c57ffull);\n\nvnx::Hash64 Wallet_rem_token::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_rem_token::get_type_name() const {\n\treturn \"mmx.Wallet.rem_token\";\n}\n\nconst vnx::TypeCode* Wallet_rem_token::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_rem_token;\n}\n\nstd::shared_ptr<Wallet_rem_token> Wallet_rem_token::create() {\n\treturn std::make_shared<Wallet_rem_token>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_rem_token::clone() const {\n\treturn std::make_shared<Wallet_rem_token>(*this);\n}\n\nvoid Wallet_rem_token::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_rem_token::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_rem_token::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_rem_token;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_rem_token::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.rem_token\\\"\";\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \"}\";\n}\n\nvoid Wallet_rem_token::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_rem_token::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.rem_token\";\n\t_object[\"address\"] = address;\n\treturn _object;\n}\n\nvoid Wallet_rem_token::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_rem_token::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_rem_token::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_rem_token& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_rem_token& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_rem_token::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_rem_token::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.rem_token\";\n\ttype_code->type_hash = vnx::Hash64(0xc913cdd1600a2609ull);\n\ttype_code->code_hash = vnx::Hash64(0x5b6ec771b12c57ffull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_rem_token);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_rem_token>(); };\n\ttype_code->return_type = ::mmx::Wallet_rem_token_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_rem_token& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_rem_token& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_rem_token;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_rem_token>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_rem_token& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_rem_token& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_rem_token& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_rem_token_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_rem_token_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_rem_token_return::VNX_TYPE_HASH(0xb59ee8fb44d30755ull);\nconst vnx::Hash64 Wallet_rem_token_return::VNX_CODE_HASH(0x49dc1abd74cbc8c0ull);\n\nvnx::Hash64 Wallet_rem_token_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_rem_token_return::get_type_name() const {\n\treturn \"mmx.Wallet.rem_token.return\";\n}\n\nconst vnx::TypeCode* Wallet_rem_token_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_rem_token_return;\n}\n\nstd::shared_ptr<Wallet_rem_token_return> Wallet_rem_token_return::create() {\n\treturn std::make_shared<Wallet_rem_token_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_rem_token_return::clone() const {\n\treturn std::make_shared<Wallet_rem_token_return>(*this);\n}\n\nvoid Wallet_rem_token_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_rem_token_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_rem_token_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_rem_token_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_rem_token_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.rem_token.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_rem_token_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_rem_token_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.rem_token.return\";\n\treturn _object;\n}\n\nvoid Wallet_rem_token_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_rem_token_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_rem_token_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_rem_token_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_rem_token_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_rem_token_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_rem_token_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.rem_token.return\";\n\ttype_code->type_hash = vnx::Hash64(0xb59ee8fb44d30755ull);\n\ttype_code->code_hash = vnx::Hash64(0x49dc1abd74cbc8c0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_rem_token_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_rem_token_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_rem_token_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_rem_token_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_rem_token_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_rem_token_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_rem_token_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_rem_token_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_rem_token_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_remove_account.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_remove_account.hxx>\n#include <mmx/Wallet_remove_account_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_remove_account::VNX_TYPE_HASH(0xdf7d8816958bcb8bull);\nconst vnx::Hash64 Wallet_remove_account::VNX_CODE_HASH(0xc8ecb3dca6beacbbull);\n\nvnx::Hash64 Wallet_remove_account::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_remove_account::get_type_name() const {\n\treturn \"mmx.Wallet.remove_account\";\n}\n\nconst vnx::TypeCode* Wallet_remove_account::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_remove_account;\n}\n\nstd::shared_ptr<Wallet_remove_account> Wallet_remove_account::create() {\n\treturn std::make_shared<Wallet_remove_account>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_remove_account::clone() const {\n\treturn std::make_shared<Wallet_remove_account>(*this);\n}\n\nvoid Wallet_remove_account::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_remove_account::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_remove_account::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_remove_account;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, account);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_remove_account::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.remove_account\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"account\\\": \"; vnx::write(_out, account);\n\t_out << \"}\";\n}\n\nvoid Wallet_remove_account::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_remove_account::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.remove_account\";\n\t_object[\"index\"] = index;\n\t_object[\"account\"] = account;\n\treturn _object;\n}\n\nvoid Wallet_remove_account::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"account\") {\n\t\t\t_entry.second.to(account);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_remove_account::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"account\") {\n\t\treturn vnx::Variant(account);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_remove_account::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"account\") {\n\t\t_value.to(account);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_remove_account& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_remove_account& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_remove_account::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_remove_account::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.remove_account\";\n\ttype_code->type_hash = vnx::Hash64(0xdf7d8816958bcb8bull);\n\ttype_code->code_hash = vnx::Hash64(0xc8ecb3dca6beacbbull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_remove_account);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_remove_account>(); };\n\ttype_code->return_type = ::mmx::Wallet_remove_account_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"account\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_remove_account& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.account, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_remove_account& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_remove_account;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_remove_account>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.account);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_remove_account& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_remove_account& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_remove_account& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_remove_account_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_remove_account_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_remove_account_return::VNX_TYPE_HASH(0x8e0d71e4003dca80ull);\nconst vnx::Hash64 Wallet_remove_account_return::VNX_CODE_HASH(0xb7c111331c578f45ull);\n\nvnx::Hash64 Wallet_remove_account_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_remove_account_return::get_type_name() const {\n\treturn \"mmx.Wallet.remove_account.return\";\n}\n\nconst vnx::TypeCode* Wallet_remove_account_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_remove_account_return;\n}\n\nstd::shared_ptr<Wallet_remove_account_return> Wallet_remove_account_return::create() {\n\treturn std::make_shared<Wallet_remove_account_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_remove_account_return::clone() const {\n\treturn std::make_shared<Wallet_remove_account_return>(*this);\n}\n\nvoid Wallet_remove_account_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_remove_account_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_remove_account_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_remove_account_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_remove_account_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.remove_account.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_remove_account_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_remove_account_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.remove_account.return\";\n\treturn _object;\n}\n\nvoid Wallet_remove_account_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_remove_account_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_remove_account_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_remove_account_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_remove_account_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_remove_account_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_remove_account_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.remove_account.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8e0d71e4003dca80ull);\n\ttype_code->code_hash = vnx::Hash64(0xb7c111331c578f45ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_remove_account_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_remove_account_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_remove_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_remove_account_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_remove_account_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_remove_account_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_remove_account_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_remove_account_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_remove_account_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_reserve.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_reserve.hxx>\n#include <mmx/Wallet_reserve_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_reserve::VNX_TYPE_HASH(0xd14c466e8e7ebd76ull);\nconst vnx::Hash64 Wallet_reserve::VNX_CODE_HASH(0xe78e0ba524664c8dull);\n\nvnx::Hash64 Wallet_reserve::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_reserve::get_type_name() const {\n\treturn \"mmx.Wallet.reserve\";\n}\n\nconst vnx::TypeCode* Wallet_reserve::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_reserve;\n}\n\nstd::shared_ptr<Wallet_reserve> Wallet_reserve::create() {\n\treturn std::make_shared<Wallet_reserve>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_reserve::clone() const {\n\treturn std::make_shared<Wallet_reserve>(*this);\n}\n\nvoid Wallet_reserve::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_reserve::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_reserve::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_reserve;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, amounts);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_reserve::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.reserve\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"amounts\\\": \"; vnx::write(_out, amounts);\n\t_out << \"}\";\n}\n\nvoid Wallet_reserve::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_reserve::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.reserve\";\n\t_object[\"index\"] = index;\n\t_object[\"amounts\"] = amounts;\n\treturn _object;\n}\n\nvoid Wallet_reserve::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"amounts\") {\n\t\t\t_entry.second.to(amounts);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_reserve::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"amounts\") {\n\t\treturn vnx::Variant(amounts);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_reserve::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"amounts\") {\n\t\t_value.to(amounts);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_reserve& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_reserve& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_reserve::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_reserve::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.reserve\";\n\ttype_code->type_hash = vnx::Hash64(0xd14c466e8e7ebd76ull);\n\ttype_code->code_hash = vnx::Hash64(0xe78e0ba524664c8dull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_reserve);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_reserve>(); };\n\ttype_code->return_type = ::mmx::Wallet_reserve_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amounts\";\n\t\tfield.code = {13, 12, 23, 2, 4, 7, 11, 32, 1, 11, 32, 1, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_reserve& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.amounts, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_reserve& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_reserve;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_reserve>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.amounts, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_reserve& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_reserve& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_reserve& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_reserve_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_reserve_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_reserve_return::VNX_TYPE_HASH(0x79de0793f575d4d6ull);\nconst vnx::Hash64 Wallet_reserve_return::VNX_CODE_HASH(0x11033794570e822eull);\n\nvnx::Hash64 Wallet_reserve_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_reserve_return::get_type_name() const {\n\treturn \"mmx.Wallet.reserve.return\";\n}\n\nconst vnx::TypeCode* Wallet_reserve_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_reserve_return;\n}\n\nstd::shared_ptr<Wallet_reserve_return> Wallet_reserve_return::create() {\n\treturn std::make_shared<Wallet_reserve_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_reserve_return::clone() const {\n\treturn std::make_shared<Wallet_reserve_return>(*this);\n}\n\nvoid Wallet_reserve_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_reserve_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_reserve_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_reserve_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_reserve_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.reserve.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_reserve_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_reserve_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.reserve.return\";\n\treturn _object;\n}\n\nvoid Wallet_reserve_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_reserve_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_reserve_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_reserve_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_reserve_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_reserve_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_reserve_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.reserve.return\";\n\ttype_code->type_hash = vnx::Hash64(0x79de0793f575d4d6ull);\n\ttype_code->code_hash = vnx::Hash64(0x11033794570e822eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_reserve_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_reserve_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_reserve_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_reserve_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_reserve_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_reserve_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_reserve_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_reserve_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_reserve_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_reset_cache.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_reset_cache.hxx>\n#include <mmx/Wallet_reset_cache_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_reset_cache::VNX_TYPE_HASH(0x922c4f0299ea0bf4ull);\nconst vnx::Hash64 Wallet_reset_cache::VNX_CODE_HASH(0x7b796bce552fdda3ull);\n\nvnx::Hash64 Wallet_reset_cache::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_reset_cache::get_type_name() const {\n\treturn \"mmx.Wallet.reset_cache\";\n}\n\nconst vnx::TypeCode* Wallet_reset_cache::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_reset_cache;\n}\n\nstd::shared_ptr<Wallet_reset_cache> Wallet_reset_cache::create() {\n\treturn std::make_shared<Wallet_reset_cache>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_reset_cache::clone() const {\n\treturn std::make_shared<Wallet_reset_cache>(*this);\n}\n\nvoid Wallet_reset_cache::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_reset_cache::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_reset_cache::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_reset_cache;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_reset_cache::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.reset_cache\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \"}\";\n}\n\nvoid Wallet_reset_cache::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_reset_cache::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.reset_cache\";\n\t_object[\"index\"] = index;\n\treturn _object;\n}\n\nvoid Wallet_reset_cache::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_reset_cache::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_reset_cache::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_reset_cache& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_reset_cache& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_reset_cache::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_reset_cache::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.reset_cache\";\n\ttype_code->type_hash = vnx::Hash64(0x922c4f0299ea0bf4ull);\n\ttype_code->code_hash = vnx::Hash64(0x7b796bce552fdda3ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_reset_cache);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_reset_cache>(); };\n\ttype_code->return_type = ::mmx::Wallet_reset_cache_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_reset_cache& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_reset_cache& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_reset_cache;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_reset_cache>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_reset_cache& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_reset_cache& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_reset_cache& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_reset_cache_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_reset_cache_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_reset_cache_return::VNX_TYPE_HASH(0x59e9fbfbf5d8218bull);\nconst vnx::Hash64 Wallet_reset_cache_return::VNX_CODE_HASH(0xc2a10c6cd4a0275bull);\n\nvnx::Hash64 Wallet_reset_cache_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_reset_cache_return::get_type_name() const {\n\treturn \"mmx.Wallet.reset_cache.return\";\n}\n\nconst vnx::TypeCode* Wallet_reset_cache_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_reset_cache_return;\n}\n\nstd::shared_ptr<Wallet_reset_cache_return> Wallet_reset_cache_return::create() {\n\treturn std::make_shared<Wallet_reset_cache_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_reset_cache_return::clone() const {\n\treturn std::make_shared<Wallet_reset_cache_return>(*this);\n}\n\nvoid Wallet_reset_cache_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_reset_cache_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_reset_cache_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_reset_cache_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_reset_cache_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.reset_cache.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_reset_cache_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_reset_cache_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.reset_cache.return\";\n\treturn _object;\n}\n\nvoid Wallet_reset_cache_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_reset_cache_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_reset_cache_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_reset_cache_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_reset_cache_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_reset_cache_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_reset_cache_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.reset_cache.return\";\n\ttype_code->type_hash = vnx::Hash64(0x59e9fbfbf5d8218bull);\n\ttype_code->code_hash = vnx::Hash64(0xc2a10c6cd4a0275bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_reset_cache_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_reset_cache_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_reset_cache_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_reset_cache_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_reset_cache_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_reset_cache_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_reset_cache_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_reset_cache_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_reset_cache_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_send.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_send.hxx>\n#include <mmx/Wallet_send_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_send::VNX_TYPE_HASH(0x3842658ae3c2d5ebull);\nconst vnx::Hash64 Wallet_send::VNX_CODE_HASH(0xa715ebf32e6fcdc5ull);\n\nvnx::Hash64 Wallet_send::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_send::get_type_name() const {\n\treturn \"mmx.Wallet.send\";\n}\n\nconst vnx::TypeCode* Wallet_send::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_send;\n}\n\nstd::shared_ptr<Wallet_send> Wallet_send::create() {\n\treturn std::make_shared<Wallet_send>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_send::clone() const {\n\treturn std::make_shared<Wallet_send>(*this);\n}\n\nvoid Wallet_send::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_send::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_send::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_send;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, dst_addr);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, currency);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_send::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.send\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"dst_addr\\\": \"; vnx::write(_out, dst_addr);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_send::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_send::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.send\";\n\t_object[\"index\"] = index;\n\t_object[\"amount\"] = amount;\n\t_object[\"dst_addr\"] = dst_addr;\n\t_object[\"currency\"] = currency;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_send::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t} else if(_entry.first == \"dst_addr\") {\n\t\t\t_entry.second.to(dst_addr);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_send::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"dst_addr\") {\n\t\treturn vnx::Variant(dst_addr);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_send::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"dst_addr\") {\n\t\t_value.to(dst_addr);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_send& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_send& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_send::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_send::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.send\";\n\ttype_code->type_hash = vnx::Hash64(0x3842658ae3c2d5ebull);\n\ttype_code->code_hash = vnx::Hash64(0xa715ebf32e6fcdc5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_send);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_send>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_send_return::static_get_type_code();\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"dst_addr\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_send& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.dst_addr, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_send& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_send;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_send>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.amount, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.dst_addr, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.currency, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[4].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_send& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_send& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_send_from.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_send_from.hxx>\n#include <mmx/Wallet_send_from_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_send_from::VNX_TYPE_HASH(0x40c3c88665341592ull);\nconst vnx::Hash64 Wallet_send_from::VNX_CODE_HASH(0x3418bf96bb760e29ull);\n\nvnx::Hash64 Wallet_send_from::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_send_from::get_type_name() const {\n\treturn \"mmx.Wallet.send_from\";\n}\n\nconst vnx::TypeCode* Wallet_send_from::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_send_from;\n}\n\nstd::shared_ptr<Wallet_send_from> Wallet_send_from::create() {\n\treturn std::make_shared<Wallet_send_from>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_send_from::clone() const {\n\treturn std::make_shared<Wallet_send_from>(*this);\n}\n\nvoid Wallet_send_from::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_send_from::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_send_from::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_send_from;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, dst_addr);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, src_addr);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, currency);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_send_from::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.send_from\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"dst_addr\\\": \"; vnx::write(_out, dst_addr);\n\t_out << \", \\\"src_addr\\\": \"; vnx::write(_out, src_addr);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_send_from::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_send_from::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.send_from\";\n\t_object[\"index\"] = index;\n\t_object[\"amount\"] = amount;\n\t_object[\"dst_addr\"] = dst_addr;\n\t_object[\"src_addr\"] = src_addr;\n\t_object[\"currency\"] = currency;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_send_from::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t} else if(_entry.first == \"dst_addr\") {\n\t\t\t_entry.second.to(dst_addr);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t} else if(_entry.first == \"src_addr\") {\n\t\t\t_entry.second.to(src_addr);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_send_from::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"dst_addr\") {\n\t\treturn vnx::Variant(dst_addr);\n\t}\n\tif(_name == \"src_addr\") {\n\t\treturn vnx::Variant(src_addr);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_send_from::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"dst_addr\") {\n\t\t_value.to(dst_addr);\n\t} else if(_name == \"src_addr\") {\n\t\t_value.to(src_addr);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_send_from& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_send_from& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_send_from::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_send_from::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.send_from\";\n\ttype_code->type_hash = vnx::Hash64(0x40c3c88665341592ull);\n\ttype_code->code_hash = vnx::Hash64(0x3418bf96bb760e29ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_send_from);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_send_from>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_send_from_return::static_get_type_code();\n\ttype_code->fields.resize(6);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"dst_addr\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"src_addr\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_send_from& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.dst_addr, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.src_addr, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_from& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_send_from;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_send_from>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.amount, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.dst_addr, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.src_addr, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.currency, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[5].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_send_from& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_send_from& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_from& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_send_from_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_send_from_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_send_from_return::VNX_TYPE_HASH(0xf578239f07abf05dull);\nconst vnx::Hash64 Wallet_send_from_return::VNX_CODE_HASH(0xb081864be80ec4ebull);\n\nvnx::Hash64 Wallet_send_from_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_send_from_return::get_type_name() const {\n\treturn \"mmx.Wallet.send_from.return\";\n}\n\nconst vnx::TypeCode* Wallet_send_from_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_send_from_return;\n}\n\nstd::shared_ptr<Wallet_send_from_return> Wallet_send_from_return::create() {\n\treturn std::make_shared<Wallet_send_from_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_send_from_return::clone() const {\n\treturn std::make_shared<Wallet_send_from_return>(*this);\n}\n\nvoid Wallet_send_from_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_send_from_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_send_from_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_send_from_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_send_from_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.send_from.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_send_from_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_send_from_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.send_from.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_send_from_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_send_from_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_send_from_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_send_from_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_send_from_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_send_from_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_send_from_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.send_from.return\";\n\ttype_code->type_hash = vnx::Hash64(0xf578239f07abf05dull);\n\ttype_code->code_hash = vnx::Hash64(0xb081864be80ec4ebull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_send_from_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_send_from_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_send_from_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_from_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_send_from_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_send_from_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_send_from_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_send_from_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_from_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_send_many.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_send_many.hxx>\n#include <mmx/Wallet_send_many_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_send_many::VNX_TYPE_HASH(0x4f35769a1b4c6786ull);\nconst vnx::Hash64 Wallet_send_many::VNX_CODE_HASH(0x612a38bfa60f37b0ull);\n\nvnx::Hash64 Wallet_send_many::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_send_many::get_type_name() const {\n\treturn \"mmx.Wallet.send_many\";\n}\n\nconst vnx::TypeCode* Wallet_send_many::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_send_many;\n}\n\nstd::shared_ptr<Wallet_send_many> Wallet_send_many::create() {\n\treturn std::make_shared<Wallet_send_many>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_send_many::clone() const {\n\treturn std::make_shared<Wallet_send_many>(*this);\n}\n\nvoid Wallet_send_many::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_send_many::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_send_many::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_send_many;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, amounts);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, currency);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_send_many::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.send_many\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"amounts\\\": \"; vnx::write(_out, amounts);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_send_many::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_send_many::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.send_many\";\n\t_object[\"index\"] = index;\n\t_object[\"amounts\"] = amounts;\n\t_object[\"currency\"] = currency;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_send_many::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"amounts\") {\n\t\t\t_entry.second.to(amounts);\n\t\t} else if(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_send_many::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"amounts\") {\n\t\treturn vnx::Variant(amounts);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_send_many::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"amounts\") {\n\t\t_value.to(amounts);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_send_many& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_send_many& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_send_many::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_send_many::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.send_many\";\n\ttype_code->type_hash = vnx::Hash64(0x4f35769a1b4c6786ull);\n\ttype_code->code_hash = vnx::Hash64(0x612a38bfa60f37b0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_send_many);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_send_many>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_send_many_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amounts\";\n\t\tfield.code = {12, 23, 2, 4, 7, 11, 32, 1, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_send_many& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.amounts, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_many& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_send_many;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_send_many>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.amounts, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.currency, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_send_many& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_send_many& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_many& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_send_many_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_send_many_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_send_many_return::VNX_TYPE_HASH(0x828bddc86fbaf1e1ull);\nconst vnx::Hash64 Wallet_send_many_return::VNX_CODE_HASH(0x43ae66f2254e6860ull);\n\nvnx::Hash64 Wallet_send_many_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_send_many_return::get_type_name() const {\n\treturn \"mmx.Wallet.send_many.return\";\n}\n\nconst vnx::TypeCode* Wallet_send_many_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_send_many_return;\n}\n\nstd::shared_ptr<Wallet_send_many_return> Wallet_send_many_return::create() {\n\treturn std::make_shared<Wallet_send_many_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_send_many_return::clone() const {\n\treturn std::make_shared<Wallet_send_many_return>(*this);\n}\n\nvoid Wallet_send_many_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_send_many_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_send_many_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_send_many_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_send_many_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.send_many.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_send_many_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_send_many_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.send_many.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_send_many_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_send_many_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_send_many_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_send_many_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_send_many_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_send_many_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_send_many_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.send_many.return\";\n\ttype_code->type_hash = vnx::Hash64(0x828bddc86fbaf1e1ull);\n\ttype_code->code_hash = vnx::Hash64(0x43ae66f2254e6860ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_send_many_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_send_many_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_send_many_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_many_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_send_many_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_send_many_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_send_many_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_send_many_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_many_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_send_off.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_send_off.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/Wallet_send_off_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_send_off::VNX_TYPE_HASH(0x8b7bfc0751d27adbull);\nconst vnx::Hash64 Wallet_send_off::VNX_CODE_HASH(0x58536e1288a0faf0ull);\n\nvnx::Hash64 Wallet_send_off::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_send_off::get_type_name() const {\n\treturn \"mmx.Wallet.send_off\";\n}\n\nconst vnx::TypeCode* Wallet_send_off::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_send_off;\n}\n\nstd::shared_ptr<Wallet_send_off> Wallet_send_off::create() {\n\treturn std::make_shared<Wallet_send_off>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_send_off::clone() const {\n\treturn std::make_shared<Wallet_send_off>(*this);\n}\n\nvoid Wallet_send_off::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_send_off::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_send_off::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_send_off;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, tx);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_send_off::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.send_off\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"tx\\\": \"; vnx::write(_out, tx);\n\t_out << \"}\";\n}\n\nvoid Wallet_send_off::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_send_off::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.send_off\";\n\t_object[\"index\"] = index;\n\t_object[\"tx\"] = tx;\n\treturn _object;\n}\n\nvoid Wallet_send_off::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"tx\") {\n\t\t\t_entry.second.to(tx);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_send_off::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"tx\") {\n\t\treturn vnx::Variant(tx);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_send_off::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"tx\") {\n\t\t_value.to(tx);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_send_off& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_send_off& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_send_off::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_send_off::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.send_off\";\n\ttype_code->type_hash = vnx::Hash64(0x8b7bfc0751d27adbull);\n\ttype_code->code_hash = vnx::Hash64(0x58536e1288a0faf0ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_send_off);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_send_off>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_send_off_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"tx\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_send_off& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.tx, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_off& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_send_off;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_send_off>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.tx, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_send_off& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_send_off& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_off& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_send_off_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_send_off_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_send_off_return::VNX_TYPE_HASH(0x9b9017e8636e8571ull);\nconst vnx::Hash64 Wallet_send_off_return::VNX_CODE_HASH(0x8869e47098b079baull);\n\nvnx::Hash64 Wallet_send_off_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_send_off_return::get_type_name() const {\n\treturn \"mmx.Wallet.send_off.return\";\n}\n\nconst vnx::TypeCode* Wallet_send_off_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_send_off_return;\n}\n\nstd::shared_ptr<Wallet_send_off_return> Wallet_send_off_return::create() {\n\treturn std::make_shared<Wallet_send_off_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_send_off_return::clone() const {\n\treturn std::make_shared<Wallet_send_off_return>(*this);\n}\n\nvoid Wallet_send_off_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_send_off_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_send_off_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_send_off_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_send_off_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.send_off.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_send_off_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_send_off_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.send_off.return\";\n\treturn _object;\n}\n\nvoid Wallet_send_off_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_send_off_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_send_off_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_send_off_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_send_off_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_send_off_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_send_off_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.send_off.return\";\n\ttype_code->type_hash = vnx::Hash64(0x9b9017e8636e8571ull);\n\ttype_code->code_hash = vnx::Hash64(0x8869e47098b079baull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_send_off_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_send_off_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_send_off_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_off_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_send_off_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_send_off_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_send_off_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_send_off_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_off_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_send_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_send_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_send_return::VNX_TYPE_HASH(0x5df7b911342a1e6full);\nconst vnx::Hash64 Wallet_send_return::VNX_CODE_HASH(0x4f9f700d2eeb3ab7ull);\n\nvnx::Hash64 Wallet_send_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_send_return::get_type_name() const {\n\treturn \"mmx.Wallet.send.return\";\n}\n\nconst vnx::TypeCode* Wallet_send_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_send_return;\n}\n\nstd::shared_ptr<Wallet_send_return> Wallet_send_return::create() {\n\treturn std::make_shared<Wallet_send_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_send_return::clone() const {\n\treturn std::make_shared<Wallet_send_return>(*this);\n}\n\nvoid Wallet_send_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_send_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_send_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_send_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_send_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.send.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_send_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_send_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.send.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_send_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_send_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_send_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_send_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_send_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_send_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_send_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.send.return\";\n\ttype_code->type_hash = vnx::Hash64(0x5df7b911342a1e6full);\n\ttype_code->code_hash = vnx::Hash64(0x4f9f700d2eeb3ab7ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_send_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_send_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_send_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_send_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_send_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_send_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_send_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_send_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_send_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_set_address_count.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_set_address_count.hxx>\n#include <mmx/Wallet_set_address_count_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_set_address_count::VNX_TYPE_HASH(0x9638ddc0c1d52b15ull);\nconst vnx::Hash64 Wallet_set_address_count::VNX_CODE_HASH(0x7621e48cd485e3b8ull);\n\nvnx::Hash64 Wallet_set_address_count::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_set_address_count::get_type_name() const {\n\treturn \"mmx.Wallet.set_address_count\";\n}\n\nconst vnx::TypeCode* Wallet_set_address_count::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_set_address_count;\n}\n\nstd::shared_ptr<Wallet_set_address_count> Wallet_set_address_count::create() {\n\treturn std::make_shared<Wallet_set_address_count>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_set_address_count::clone() const {\n\treturn std::make_shared<Wallet_set_address_count>(*this);\n}\n\nvoid Wallet_set_address_count::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_set_address_count::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_set_address_count::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_set_address_count;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, count);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_set_address_count::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.set_address_count\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"count\\\": \"; vnx::write(_out, count);\n\t_out << \"}\";\n}\n\nvoid Wallet_set_address_count::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_set_address_count::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.set_address_count\";\n\t_object[\"index\"] = index;\n\t_object[\"count\"] = count;\n\treturn _object;\n}\n\nvoid Wallet_set_address_count::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"count\") {\n\t\t\t_entry.second.to(count);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_set_address_count::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"count\") {\n\t\treturn vnx::Variant(count);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_set_address_count::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"count\") {\n\t\t_value.to(count);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_set_address_count& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_set_address_count& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_set_address_count::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_set_address_count::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.set_address_count\";\n\ttype_code->type_hash = vnx::Hash64(0x9638ddc0c1d52b15ull);\n\ttype_code->code_hash = vnx::Hash64(0x7621e48cd485e3b8ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_set_address_count);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_set_address_count>(); };\n\ttype_code->return_type = ::mmx::Wallet_set_address_count_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"count\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_set_address_count& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.count, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_set_address_count& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_set_address_count;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_set_address_count>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.count);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_set_address_count& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_set_address_count& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_set_address_count& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_set_address_count_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_set_address_count_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_set_address_count_return::VNX_TYPE_HASH(0x5948620640c50bf8ull);\nconst vnx::Hash64 Wallet_set_address_count_return::VNX_CODE_HASH(0x8739cbb3951d8598ull);\n\nvnx::Hash64 Wallet_set_address_count_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_set_address_count_return::get_type_name() const {\n\treturn \"mmx.Wallet.set_address_count.return\";\n}\n\nconst vnx::TypeCode* Wallet_set_address_count_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_set_address_count_return;\n}\n\nstd::shared_ptr<Wallet_set_address_count_return> Wallet_set_address_count_return::create() {\n\treturn std::make_shared<Wallet_set_address_count_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_set_address_count_return::clone() const {\n\treturn std::make_shared<Wallet_set_address_count_return>(*this);\n}\n\nvoid Wallet_set_address_count_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_set_address_count_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_set_address_count_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_set_address_count_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_set_address_count_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.set_address_count.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_set_address_count_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_set_address_count_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.set_address_count.return\";\n\treturn _object;\n}\n\nvoid Wallet_set_address_count_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_set_address_count_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_set_address_count_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_set_address_count_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_set_address_count_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_set_address_count_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_set_address_count_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.set_address_count.return\";\n\ttype_code->type_hash = vnx::Hash64(0x5948620640c50bf8ull);\n\ttype_code->code_hash = vnx::Hash64(0x8739cbb3951d8598ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_set_address_count_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_set_address_count_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_set_address_count_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_set_address_count_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_set_address_count_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_set_address_count_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_set_address_count_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_set_address_count_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_set_address_count_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_sign_msg.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_sign_msg.hxx>\n#include <mmx/Wallet_sign_msg_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_sign_msg::VNX_TYPE_HASH(0x5bc54cc8b0112d3aull);\nconst vnx::Hash64 Wallet_sign_msg::VNX_CODE_HASH(0x79808d31510faa02ull);\n\nvnx::Hash64 Wallet_sign_msg::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_sign_msg::get_type_name() const {\n\treturn \"mmx.Wallet.sign_msg\";\n}\n\nconst vnx::TypeCode* Wallet_sign_msg::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_sign_msg;\n}\n\nstd::shared_ptr<Wallet_sign_msg> Wallet_sign_msg::create() {\n\treturn std::make_shared<Wallet_sign_msg>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_sign_msg::clone() const {\n\treturn std::make_shared<Wallet_sign_msg>(*this);\n}\n\nvoid Wallet_sign_msg::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_sign_msg::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_sign_msg::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_sign_msg;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, msg);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_sign_msg::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.sign_msg\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"msg\\\": \"; vnx::write(_out, msg);\n\t_out << \"}\";\n}\n\nvoid Wallet_sign_msg::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_sign_msg::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.sign_msg\";\n\t_object[\"index\"] = index;\n\t_object[\"address\"] = address;\n\t_object[\"msg\"] = msg;\n\treturn _object;\n}\n\nvoid Wallet_sign_msg::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"msg\") {\n\t\t\t_entry.second.to(msg);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_sign_msg::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"msg\") {\n\t\treturn vnx::Variant(msg);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_sign_msg::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"msg\") {\n\t\t_value.to(msg);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_sign_msg& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_sign_msg& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_sign_msg::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_sign_msg::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.sign_msg\";\n\ttype_code->type_hash = vnx::Hash64(0x5bc54cc8b0112d3aull);\n\ttype_code->code_hash = vnx::Hash64(0x79808d31510faa02ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_sign_msg);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_sign_msg>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_sign_msg_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"msg\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_sign_msg& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.msg, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_sign_msg& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_sign_msg;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_sign_msg>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.msg, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_sign_msg& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_sign_msg& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_msg& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_sign_msg_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_sign_msg_return.hxx>\n#include <mmx/Solution.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_sign_msg_return::VNX_TYPE_HASH(0x5cf2f6b20fa33f51ull);\nconst vnx::Hash64 Wallet_sign_msg_return::VNX_CODE_HASH(0x78e30f052fa4a1f5ull);\n\nvnx::Hash64 Wallet_sign_msg_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_sign_msg_return::get_type_name() const {\n\treturn \"mmx.Wallet.sign_msg.return\";\n}\n\nconst vnx::TypeCode* Wallet_sign_msg_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_sign_msg_return;\n}\n\nstd::shared_ptr<Wallet_sign_msg_return> Wallet_sign_msg_return::create() {\n\treturn std::make_shared<Wallet_sign_msg_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_sign_msg_return::clone() const {\n\treturn std::make_shared<Wallet_sign_msg_return>(*this);\n}\n\nvoid Wallet_sign_msg_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_sign_msg_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_sign_msg_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_sign_msg_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_sign_msg_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.sign_msg.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_sign_msg_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_sign_msg_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.sign_msg.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_sign_msg_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_sign_msg_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_sign_msg_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_sign_msg_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_sign_msg_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_sign_msg_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_sign_msg_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.sign_msg.return\";\n\ttype_code->type_hash = vnx::Hash64(0x5cf2f6b20fa33f51ull);\n\ttype_code->code_hash = vnx::Hash64(0x78e30f052fa4a1f5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_sign_msg_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_sign_msg_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_sign_msg_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_sign_msg_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_sign_msg_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_sign_msg_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_sign_msg_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_msg_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_sign_off.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_sign_off.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/Wallet_sign_off_return.hxx>\n#include <mmx/spend_options_t.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_sign_off::VNX_TYPE_HASH(0x232c89cf3ed4d5b1ull);\nconst vnx::Hash64 Wallet_sign_off::VNX_CODE_HASH(0xb867c4561cf82cb5ull);\n\nvnx::Hash64 Wallet_sign_off::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_sign_off::get_type_name() const {\n\treturn \"mmx.Wallet.sign_off\";\n}\n\nconst vnx::TypeCode* Wallet_sign_off::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_sign_off;\n}\n\nstd::shared_ptr<Wallet_sign_off> Wallet_sign_off::create() {\n\treturn std::make_shared<Wallet_sign_off>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_sign_off::clone() const {\n\treturn std::make_shared<Wallet_sign_off>(*this);\n}\n\nvoid Wallet_sign_off::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_sign_off::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_sign_off::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_sign_off;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, tx);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_sign_off::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.sign_off\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"tx\\\": \"; vnx::write(_out, tx);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_sign_off::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_sign_off::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.sign_off\";\n\t_object[\"index\"] = index;\n\t_object[\"tx\"] = tx;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_sign_off::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t} else if(_entry.first == \"tx\") {\n\t\t\t_entry.second.to(tx);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_sign_off::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"tx\") {\n\t\treturn vnx::Variant(tx);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_sign_off::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"tx\") {\n\t\t_value.to(tx);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_sign_off& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_sign_off& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_sign_off::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_sign_off::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.sign_off\";\n\ttype_code->type_hash = vnx::Hash64(0x232c89cf3ed4d5b1ull);\n\ttype_code->code_hash = vnx::Hash64(0xb867c4561cf82cb5ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_sign_off);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_sign_off>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_sign_off_return::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"tx\";\n\t\tfield.code = {16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_sign_off& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.tx, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_sign_off& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_sign_off;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_sign_off>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.tx, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_sign_off& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_sign_off& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_off& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_sign_off_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_sign_off_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_sign_off_return::VNX_TYPE_HASH(0x4b2ee7febe4ec00aull);\nconst vnx::Hash64 Wallet_sign_off_return::VNX_CODE_HASH(0x90e8330947672349ull);\n\nvnx::Hash64 Wallet_sign_off_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_sign_off_return::get_type_name() const {\n\treturn \"mmx.Wallet.sign_off.return\";\n}\n\nconst vnx::TypeCode* Wallet_sign_off_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_sign_off_return;\n}\n\nstd::shared_ptr<Wallet_sign_off_return> Wallet_sign_off_return::create() {\n\treturn std::make_shared<Wallet_sign_off_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_sign_off_return::clone() const {\n\treturn std::make_shared<Wallet_sign_off_return>(*this);\n}\n\nvoid Wallet_sign_off_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_sign_off_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_sign_off_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_sign_off_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_sign_off_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.sign_off.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_sign_off_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_sign_off_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.sign_off.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_sign_off_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_sign_off_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_sign_off_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_sign_off_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_sign_off_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_sign_off_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_sign_off_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.sign_off.return\";\n\ttype_code->type_hash = vnx::Hash64(0x4b2ee7febe4ec00aull);\n\ttype_code->code_hash = vnx::Hash64(0x90e8330947672349ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_sign_off_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_sign_off_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_sign_off_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_sign_off_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_sign_off_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_sign_off_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_sign_off_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_sign_off_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_sign_off_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_swap_add_liquid.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_swap_add_liquid.hxx>\n#include <mmx/Wallet_swap_add_liquid_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_swap_add_liquid::VNX_TYPE_HASH(0xe053d1ae718e2f64ull);\nconst vnx::Hash64 Wallet_swap_add_liquid::VNX_CODE_HASH(0xd639284ecbb947beull);\n\nvnx::Hash64 Wallet_swap_add_liquid::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_swap_add_liquid::get_type_name() const {\n\treturn \"mmx.Wallet.swap_add_liquid\";\n}\n\nconst vnx::TypeCode* Wallet_swap_add_liquid::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_swap_add_liquid;\n}\n\nstd::shared_ptr<Wallet_swap_add_liquid> Wallet_swap_add_liquid::create() {\n\treturn std::make_shared<Wallet_swap_add_liquid>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_swap_add_liquid::clone() const {\n\treturn std::make_shared<Wallet_swap_add_liquid>(*this);\n}\n\nvoid Wallet_swap_add_liquid::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_add_liquid::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_add_liquid::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_swap_add_liquid;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, pool_idx);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_swap_add_liquid::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.swap_add_liquid\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"pool_idx\\\": \"; vnx::write(_out, pool_idx);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_swap_add_liquid::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_swap_add_liquid::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.swap_add_liquid\";\n\t_object[\"index\"] = index;\n\t_object[\"address\"] = address;\n\t_object[\"amount\"] = amount;\n\t_object[\"pool_idx\"] = pool_idx;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_swap_add_liquid::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t} else if(_entry.first == \"pool_idx\") {\n\t\t\t_entry.second.to(pool_idx);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_swap_add_liquid::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"pool_idx\") {\n\t\treturn vnx::Variant(pool_idx);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_swap_add_liquid::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"pool_idx\") {\n\t\t_value.to(pool_idx);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_swap_add_liquid& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_swap_add_liquid& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_swap_add_liquid::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_swap_add_liquid::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.swap_add_liquid\";\n\ttype_code->type_hash = vnx::Hash64(0xe053d1ae718e2f64ull);\n\ttype_code->code_hash = vnx::Hash64(0xd639284ecbb947beull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_swap_add_liquid);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_swap_add_liquid>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_swap_add_liquid_return::static_get_type_code();\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"pool_idx\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_swap_add_liquid& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.pool_idx, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_add_liquid& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_swap_add_liquid;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_swap_add_liquid>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.pool_idx);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[4].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_swap_add_liquid& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_add_liquid& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_add_liquid& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_swap_add_liquid_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_swap_add_liquid_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_swap_add_liquid_return::VNX_TYPE_HASH(0xc2812565c73ec527ull);\nconst vnx::Hash64 Wallet_swap_add_liquid_return::VNX_CODE_HASH(0x2cab467bd0a1971bull);\n\nvnx::Hash64 Wallet_swap_add_liquid_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_swap_add_liquid_return::get_type_name() const {\n\treturn \"mmx.Wallet.swap_add_liquid.return\";\n}\n\nconst vnx::TypeCode* Wallet_swap_add_liquid_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_swap_add_liquid_return;\n}\n\nstd::shared_ptr<Wallet_swap_add_liquid_return> Wallet_swap_add_liquid_return::create() {\n\treturn std::make_shared<Wallet_swap_add_liquid_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_swap_add_liquid_return::clone() const {\n\treturn std::make_shared<Wallet_swap_add_liquid_return>(*this);\n}\n\nvoid Wallet_swap_add_liquid_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_add_liquid_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_add_liquid_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_swap_add_liquid_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_swap_add_liquid_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.swap_add_liquid.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_swap_add_liquid_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_swap_add_liquid_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.swap_add_liquid.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_swap_add_liquid_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_swap_add_liquid_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_swap_add_liquid_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_swap_add_liquid_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_swap_add_liquid_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_swap_add_liquid_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_swap_add_liquid_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.swap_add_liquid.return\";\n\ttype_code->type_hash = vnx::Hash64(0xc2812565c73ec527ull);\n\ttype_code->code_hash = vnx::Hash64(0x2cab467bd0a1971bull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_swap_add_liquid_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_swap_add_liquid_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_swap_add_liquid_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_add_liquid_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_swap_add_liquid_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_swap_add_liquid_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_swap_add_liquid_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_add_liquid_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_add_liquid_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_swap_rem_liquid.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_swap_rem_liquid.hxx>\n#include <mmx/Wallet_swap_rem_liquid_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_swap_rem_liquid::VNX_TYPE_HASH(0x6494b41c51e158eaull);\nconst vnx::Hash64 Wallet_swap_rem_liquid::VNX_CODE_HASH(0xdd2e39fa2c122341ull);\n\nvnx::Hash64 Wallet_swap_rem_liquid::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_swap_rem_liquid::get_type_name() const {\n\treturn \"mmx.Wallet.swap_rem_liquid\";\n}\n\nconst vnx::TypeCode* Wallet_swap_rem_liquid::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_swap_rem_liquid;\n}\n\nstd::shared_ptr<Wallet_swap_rem_liquid> Wallet_swap_rem_liquid::create() {\n\treturn std::make_shared<Wallet_swap_rem_liquid>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_swap_rem_liquid::clone() const {\n\treturn std::make_shared<Wallet_swap_rem_liquid>(*this);\n}\n\nvoid Wallet_swap_rem_liquid::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_rem_liquid::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_rem_liquid::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_swap_rem_liquid;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_swap_rem_liquid::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.swap_rem_liquid\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_swap_rem_liquid::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_swap_rem_liquid::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.swap_rem_liquid\";\n\t_object[\"index\"] = index;\n\t_object[\"address\"] = address;\n\t_object[\"amount\"] = amount;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_swap_rem_liquid::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_swap_rem_liquid::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_swap_rem_liquid::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_swap_rem_liquid& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_swap_rem_liquid& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_swap_rem_liquid::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_swap_rem_liquid::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.swap_rem_liquid\";\n\ttype_code->type_hash = vnx::Hash64(0x6494b41c51e158eaull);\n\ttype_code->code_hash = vnx::Hash64(0xdd2e39fa2c122341ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_swap_rem_liquid);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_swap_rem_liquid>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_swap_rem_liquid_return::static_get_type_code();\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_swap_rem_liquid& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_rem_liquid& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_swap_rem_liquid;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_swap_rem_liquid>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_swap_rem_liquid& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_rem_liquid& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_rem_liquid& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_swap_rem_liquid_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_swap_rem_liquid_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_swap_rem_liquid_return::VNX_TYPE_HASH(0x946935a83dd0b8d2ull);\nconst vnx::Hash64 Wallet_swap_rem_liquid_return::VNX_CODE_HASH(0xe0d1cb69e7e7b56eull);\n\nvnx::Hash64 Wallet_swap_rem_liquid_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_swap_rem_liquid_return::get_type_name() const {\n\treturn \"mmx.Wallet.swap_rem_liquid.return\";\n}\n\nconst vnx::TypeCode* Wallet_swap_rem_liquid_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_swap_rem_liquid_return;\n}\n\nstd::shared_ptr<Wallet_swap_rem_liquid_return> Wallet_swap_rem_liquid_return::create() {\n\treturn std::make_shared<Wallet_swap_rem_liquid_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_swap_rem_liquid_return::clone() const {\n\treturn std::make_shared<Wallet_swap_rem_liquid_return>(*this);\n}\n\nvoid Wallet_swap_rem_liquid_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_rem_liquid_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_rem_liquid_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_swap_rem_liquid_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_swap_rem_liquid_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.swap_rem_liquid.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_swap_rem_liquid_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_swap_rem_liquid_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.swap_rem_liquid.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_swap_rem_liquid_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_swap_rem_liquid_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_swap_rem_liquid_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_swap_rem_liquid_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_swap_rem_liquid_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_swap_rem_liquid_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_swap_rem_liquid_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.swap_rem_liquid.return\";\n\ttype_code->type_hash = vnx::Hash64(0x946935a83dd0b8d2ull);\n\ttype_code->code_hash = vnx::Hash64(0xe0d1cb69e7e7b56eull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_swap_rem_liquid_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_swap_rem_liquid_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_swap_rem_liquid_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_rem_liquid_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_swap_rem_liquid_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_swap_rem_liquid_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_swap_rem_liquid_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_rem_liquid_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_rem_liquid_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_swap_trade.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_swap_trade.hxx>\n#include <mmx/Wallet_swap_trade_return.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_swap_trade::VNX_TYPE_HASH(0x4b5a42cbf6657910ull);\nconst vnx::Hash64 Wallet_swap_trade::VNX_CODE_HASH(0xae88cd4b5e90ea93ull);\n\nvnx::Hash64 Wallet_swap_trade::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_swap_trade::get_type_name() const {\n\treturn \"mmx.Wallet.swap_trade\";\n}\n\nconst vnx::TypeCode* Wallet_swap_trade::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_swap_trade;\n}\n\nstd::shared_ptr<Wallet_swap_trade> Wallet_swap_trade::create() {\n\treturn std::make_shared<Wallet_swap_trade>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_swap_trade::clone() const {\n\treturn std::make_shared<Wallet_swap_trade>(*this);\n}\n\nvoid Wallet_swap_trade::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_trade::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_trade::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_swap_trade;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, currency);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, min_trade);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, num_iter);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, options);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_swap_trade::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.swap_trade\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \", \\\"min_trade\\\": \"; vnx::write(_out, min_trade);\n\t_out << \", \\\"num_iter\\\": \"; vnx::write(_out, num_iter);\n\t_out << \", \\\"options\\\": \"; vnx::write(_out, options);\n\t_out << \"}\";\n}\n\nvoid Wallet_swap_trade::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_swap_trade::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.swap_trade\";\n\t_object[\"index\"] = index;\n\t_object[\"address\"] = address;\n\t_object[\"amount\"] = amount;\n\t_object[\"currency\"] = currency;\n\t_object[\"min_trade\"] = min_trade;\n\t_object[\"num_iter\"] = num_iter;\n\t_object[\"options\"] = options;\n\treturn _object;\n}\n\nvoid Wallet_swap_trade::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"min_trade\") {\n\t\t\t_entry.second.to(min_trade);\n\t\t} else if(_entry.first == \"num_iter\") {\n\t\t\t_entry.second.to(num_iter);\n\t\t} else if(_entry.first == \"options\") {\n\t\t\t_entry.second.to(options);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_swap_trade::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\tif(_name == \"min_trade\") {\n\t\treturn vnx::Variant(min_trade);\n\t}\n\tif(_name == \"num_iter\") {\n\t\treturn vnx::Variant(num_iter);\n\t}\n\tif(_name == \"options\") {\n\t\treturn vnx::Variant(options);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_swap_trade::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t} else if(_name == \"min_trade\") {\n\t\t_value.to(min_trade);\n\t} else if(_name == \"num_iter\") {\n\t\t_value.to(num_iter);\n\t} else if(_name == \"options\") {\n\t\t_value.to(options);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_swap_trade& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_swap_trade& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_swap_trade::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_swap_trade::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.swap_trade\";\n\ttype_code->type_hash = vnx::Hash64(0x4b5a42cbf6657910ull);\n\ttype_code->code_hash = vnx::Hash64(0xae88cd4b5e90ea93ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_swap_trade);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_swap_trade>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::spend_options_t::static_get_type_code();\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_swap_trade_return::static_get_type_code();\n\ttype_code->fields.resize(7);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"min_trade\";\n\t\tfield.code = {33, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_iter\";\n\t\tfield.value = vnx::to_string(20);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"options\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->permission = \"mmx.permission_e.SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_swap_trade& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_iter, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.min_trade, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.options, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_trade& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_swap_trade;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_swap_trade>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.num_iter);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.currency, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.min_trade, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.options, type_code, type_code->fields[6].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_swap_trade& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_trade& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_trade& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_swap_trade_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_swap_trade_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_swap_trade_return::VNX_TYPE_HASH(0x8fe4c13b007c63f4ull);\nconst vnx::Hash64 Wallet_swap_trade_return::VNX_CODE_HASH(0xe4ed446e42a698cbull);\n\nvnx::Hash64 Wallet_swap_trade_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_swap_trade_return::get_type_name() const {\n\treturn \"mmx.Wallet.swap_trade.return\";\n}\n\nconst vnx::TypeCode* Wallet_swap_trade_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_swap_trade_return;\n}\n\nstd::shared_ptr<Wallet_swap_trade_return> Wallet_swap_trade_return::create() {\n\treturn std::make_shared<Wallet_swap_trade_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_swap_trade_return::clone() const {\n\treturn std::make_shared<Wallet_swap_trade_return>(*this);\n}\n\nvoid Wallet_swap_trade_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_trade_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_swap_trade_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_swap_trade_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, _ret_0);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_swap_trade_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.swap_trade.return\\\"\";\n\t_out << \", \\\"_ret_0\\\": \"; vnx::write(_out, _ret_0);\n\t_out << \"}\";\n}\n\nvoid Wallet_swap_trade_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_swap_trade_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.swap_trade.return\";\n\t_object[\"_ret_0\"] = _ret_0;\n\treturn _object;\n}\n\nvoid Wallet_swap_trade_return::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"_ret_0\") {\n\t\t\t_entry.second.to(_ret_0);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_swap_trade_return::get_field(const std::string& _name) const {\n\tif(_name == \"_ret_0\") {\n\t\treturn vnx::Variant(_ret_0);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_swap_trade_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"_ret_0\") {\n\t\t_value.to(_ret_0);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_swap_trade_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_swap_trade_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_swap_trade_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_swap_trade_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.swap_trade.return\";\n\ttype_code->type_hash = vnx::Hash64(0x8fe4c13b007c63f4ull);\n\ttype_code->code_hash = vnx::Hash64(0xe4ed446e42a698cbull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_swap_trade_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_swap_trade_return>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"_ret_0\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_swap_trade_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value._ret_0, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_swap_trade_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_swap_trade_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_swap_trade_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value._ret_0, type_code, type_code->fields[0].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_swap_trade_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_swap_trade_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_swap_trade_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_unlock.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_unlock.hxx>\n#include <mmx/Wallet_unlock_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_unlock::VNX_TYPE_HASH(0x800deedf12a4df74ull);\nconst vnx::Hash64 Wallet_unlock::VNX_CODE_HASH(0x3fc9ada9c9fa68a1ull);\n\nvnx::Hash64 Wallet_unlock::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_unlock::get_type_name() const {\n\treturn \"mmx.Wallet.unlock\";\n}\n\nconst vnx::TypeCode* Wallet_unlock::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_unlock;\n}\n\nstd::shared_ptr<Wallet_unlock> Wallet_unlock::create() {\n\treturn std::make_shared<Wallet_unlock>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_unlock::clone() const {\n\treturn std::make_shared<Wallet_unlock>(*this);\n}\n\nvoid Wallet_unlock::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_unlock::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_unlock::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_unlock;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, passphrase);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_unlock::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.unlock\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"passphrase\\\": \"; vnx::write(_out, passphrase);\n\t_out << \"}\";\n}\n\nvoid Wallet_unlock::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_unlock::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.unlock\";\n\t_object[\"index\"] = index;\n\t_object[\"passphrase\"] = passphrase;\n\treturn _object;\n}\n\nvoid Wallet_unlock::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"passphrase\") {\n\t\t\t_entry.second.to(passphrase);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_unlock::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"passphrase\") {\n\t\treturn vnx::Variant(passphrase);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_unlock::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"passphrase\") {\n\t\t_value.to(passphrase);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_unlock& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_unlock& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_unlock::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_unlock::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.unlock\";\n\ttype_code->type_hash = vnx::Hash64(0x800deedf12a4df74ull);\n\ttype_code->code_hash = vnx::Hash64(0x3fc9ada9c9fa68a1ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_unlock);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_unlock>(); };\n\ttype_code->return_type = ::mmx::Wallet_unlock_return::static_get_type_code();\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"passphrase\";\n\t\tfield.code = {32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_unlock& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.passphrase, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_unlock& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_unlock;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_unlock>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write(out, value.passphrase, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_unlock& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_unlock& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_unlock& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_unlock_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_unlock_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_unlock_return::VNX_TYPE_HASH(0xe8e5c839343f6bbcull);\nconst vnx::Hash64 Wallet_unlock_return::VNX_CODE_HASH(0x4ad5b8f97fab331cull);\n\nvnx::Hash64 Wallet_unlock_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_unlock_return::get_type_name() const {\n\treturn \"mmx.Wallet.unlock.return\";\n}\n\nconst vnx::TypeCode* Wallet_unlock_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_unlock_return;\n}\n\nstd::shared_ptr<Wallet_unlock_return> Wallet_unlock_return::create() {\n\treturn std::make_shared<Wallet_unlock_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_unlock_return::clone() const {\n\treturn std::make_shared<Wallet_unlock_return>(*this);\n}\n\nvoid Wallet_unlock_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_unlock_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_unlock_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_unlock_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_unlock_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.unlock.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_unlock_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_unlock_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.unlock.return\";\n\treturn _object;\n}\n\nvoid Wallet_unlock_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_unlock_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_unlock_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_unlock_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_unlock_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_unlock_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_unlock_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.unlock.return\";\n\ttype_code->type_hash = vnx::Hash64(0xe8e5c839343f6bbcull);\n\ttype_code->code_hash = vnx::Hash64(0x4ad5b8f97fab331cull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_unlock_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_unlock_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_unlock_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_unlock_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_unlock_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_unlock_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_unlock_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_unlock_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_unlock_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_update_cache.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_update_cache.hxx>\n#include <mmx/Wallet_update_cache_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_update_cache::VNX_TYPE_HASH(0xf98cf07accda73b8ull);\nconst vnx::Hash64 Wallet_update_cache::VNX_CODE_HASH(0x786ac26b257a9241ull);\n\nvnx::Hash64 Wallet_update_cache::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_update_cache::get_type_name() const {\n\treturn \"mmx.Wallet.update_cache\";\n}\n\nconst vnx::TypeCode* Wallet_update_cache::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_update_cache;\n}\n\nstd::shared_ptr<Wallet_update_cache> Wallet_update_cache::create() {\n\treturn std::make_shared<Wallet_update_cache>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_update_cache::clone() const {\n\treturn std::make_shared<Wallet_update_cache>(*this);\n}\n\nvoid Wallet_update_cache::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_update_cache::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_update_cache::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_update_cache;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_update_cache::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.update_cache\\\"\";\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \"}\";\n}\n\nvoid Wallet_update_cache::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_update_cache::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.update_cache\";\n\t_object[\"index\"] = index;\n\treturn _object;\n}\n\nvoid Wallet_update_cache::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t}\n\t}\n}\n\nvnx::Variant Wallet_update_cache::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid Wallet_update_cache::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_update_cache& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_update_cache& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_update_cache::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_update_cache::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.update_cache\";\n\ttype_code->type_hash = vnx::Hash64(0xf98cf07accda73b8ull);\n\ttype_code->code_hash = vnx::Hash64(0x786ac26b257a9241ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_update_cache);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_update_cache>(); };\n\ttype_code->is_const = true;\n\ttype_code->return_type = ::mmx::Wallet_update_cache_return::static_get_type_code();\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_update_cache& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_update_cache& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_update_cache;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_update_cache>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.index);\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_update_cache& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_update_cache& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_update_cache& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/Wallet_update_cache_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/Wallet_update_cache_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 Wallet_update_cache_return::VNX_TYPE_HASH(0x7e1b25fb37caf248ull);\nconst vnx::Hash64 Wallet_update_cache_return::VNX_CODE_HASH(0xf4b9f74bdff3f851ull);\n\nvnx::Hash64 Wallet_update_cache_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string Wallet_update_cache_return::get_type_name() const {\n\treturn \"mmx.Wallet.update_cache.return\";\n}\n\nconst vnx::TypeCode* Wallet_update_cache_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_Wallet_update_cache_return;\n}\n\nstd::shared_ptr<Wallet_update_cache_return> Wallet_update_cache_return::create() {\n\treturn std::make_shared<Wallet_update_cache_return>();\n}\n\nstd::shared_ptr<vnx::Value> Wallet_update_cache_return::clone() const {\n\treturn std::make_shared<Wallet_update_cache_return>(*this);\n}\n\nvoid Wallet_update_cache_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid Wallet_update_cache_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid Wallet_update_cache_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_Wallet_update_cache_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid Wallet_update_cache_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.Wallet.update_cache.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid Wallet_update_cache_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object Wallet_update_cache_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.Wallet.update_cache.return\";\n\treturn _object;\n}\n\nvoid Wallet_update_cache_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant Wallet_update_cache_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid Wallet_update_cache_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const Wallet_update_cache_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, Wallet_update_cache_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* Wallet_update_cache_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> Wallet_update_cache_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.Wallet.update_cache.return\";\n\ttype_code->type_hash = vnx::Hash64(0x7e1b25fb37caf248ull);\n\ttype_code->code_hash = vnx::Hash64(0xf4b9f74bdff3f851ull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::Wallet_update_cache_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<Wallet_update_cache_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::Wallet_update_cache_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::Wallet_update_cache_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_Wallet_update_cache_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::Wallet_update_cache_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::Wallet_update_cache_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::Wallet_update_cache_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::Wallet_update_cache_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/WebAPIAsyncClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/WebAPIAsyncClient.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/WebAPI_shutdown.hxx>\n#include <mmx/WebAPI_shutdown_return.hxx>\n#include <vnx/LogMsg.hxx>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nWebAPIAsyncClient::WebAPIAsyncClient(const std::string& service_name)\n\t:\tAsyncClient::AsyncClient(vnx::Hash64(service_name))\n{\n}\n\nWebAPIAsyncClient::WebAPIAsyncClient(vnx::Hash64 service_addr)\n\t:\tAsyncClient::AsyncClient(service_addr)\n{\n}\n\nuint64_t WebAPIAsyncClient::shutdown(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::mmx::WebAPI_shutdown::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 0;\n\t\tvnx_queue_shutdown[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WebAPIAsyncClient::http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const std::function<void(std::shared_ptr<const ::vnx::addons::HttpResponse>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 1;\n\t\tvnx_queue_http_request[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WebAPIAsyncClient::http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes, const std::function<void(std::shared_ptr<const ::vnx::addons::HttpData>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request_chunk::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\t_method->offset = offset;\n\t_method->max_bytes = max_bytes;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 2;\n\t\tvnx_queue_http_request_chunk[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WebAPIAsyncClient::vnx_get_config_object(const std::function<void(const ::vnx::Object&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 3;\n\t\tvnx_queue_vnx_get_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WebAPIAsyncClient::vnx_get_config(const std::string& name, const std::function<void(const ::vnx::Variant&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 4;\n\t\tvnx_queue_vnx_get_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WebAPIAsyncClient::vnx_set_config_object(const ::vnx::Object& config, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 5;\n\t\tvnx_queue_vnx_set_config_object[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WebAPIAsyncClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value, const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 6;\n\t\tvnx_queue_vnx_set_config[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WebAPIAsyncClient::vnx_get_type_code(const std::function<void(const ::vnx::TypeCode&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 7;\n\t\tvnx_queue_vnx_get_type_code[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WebAPIAsyncClient::vnx_get_module_info(const std::function<void(std::shared_ptr<const ::vnx::ModuleInfo>)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 8;\n\t\tvnx_queue_vnx_get_module_info[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WebAPIAsyncClient::vnx_restart(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 9;\n\t\tvnx_queue_vnx_restart[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WebAPIAsyncClient::vnx_stop(const std::function<void()>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 10;\n\t\tvnx_queue_vnx_stop[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nuint64_t WebAPIAsyncClient::vnx_self_test(const std::function<void(const vnx::bool_t&)>& _callback, const std::function<void(const vnx::exception&)>& _error_callback) {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tconst auto _request_id = ++vnx_next_id;\n\t{\n\t\tstd::lock_guard<std::mutex> _lock(vnx_mutex);\n\t\tvnx_pending[_request_id] = 11;\n\t\tvnx_queue_vnx_self_test[_request_id] = std::make_pair(_callback, _error_callback);\n\t}\n\tvnx_request(_method, _request_id);\n\treturn _request_id;\n}\n\nint32_t WebAPIAsyncClient::vnx_purge_request(uint64_t _request_id, const vnx::exception& _ex) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\treturn -1;\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_shutdown.find(_request_id);\n\t\t\tif(_iter != vnx_queue_shutdown.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_shutdown.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_http_request.find(_request_id);\n\t\t\tif(_iter != vnx_queue_http_request.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_http_request.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_http_request_chunk.find(_request_id);\n\t\t\tif(_iter != vnx_queue_http_request_chunk.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_http_request_chunk.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_set_config.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_restart.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_stop.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter != vnx_queue_vnx_self_test.end()) {\n\t\t\t\tconst auto _callback = std::move(_iter->second.second);\n\t\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t\t_lock.unlock();\n\t\t\t\tif(_callback) {\n\t\t\t\t\t_callback(_ex);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn _index;\n}\n\nint32_t WebAPIAsyncClient::vnx_callback_switch(uint64_t _request_id, std::shared_ptr<const vnx::Value> _value) {\n\tstd::unique_lock<std::mutex> _lock(vnx_mutex);\n\tconst auto _iter = vnx_pending.find(_request_id);\n\tif(_iter == vnx_pending.end()) {\n\t\tthrow std::runtime_error(\"WebAPIAsyncClient: received unknown return\");\n\t}\n\tconst auto _index = _iter->second;\n\tvnx_pending.erase(_iter);\n\tswitch(_index) {\n\t\tcase 0: {\n\t\t\tconst auto _iter = vnx_queue_shutdown.find(_request_id);\n\t\t\tif(_iter == vnx_queue_shutdown.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_shutdown.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 1: {\n\t\t\tconst auto _iter = vnx_queue_http_request.find(_request_id);\n\t\t\tif(_iter == vnx_queue_http_request.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_http_request.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpResponse>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WebAPIAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 2: {\n\t\t\tconst auto _iter = vnx_queue_http_request_chunk.find(_request_id);\n\t\t\tif(_iter == vnx_queue_http_request_chunk.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_http_request_chunk.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpData>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WebAPIAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 3: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Object>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WebAPIAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 4: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::Variant>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WebAPIAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 5: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config_object.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config_object.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config_object.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 6: {\n\t\t\tconst auto _iter = vnx_queue_vnx_set_config.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_set_config.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_set_config.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 7: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_type_code.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_type_code.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_type_code.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<::vnx::TypeCode>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WebAPIAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 8: {\n\t\t\tconst auto _iter = vnx_queue_vnx_get_module_info.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_get_module_info.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_get_module_info.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WebAPIAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 9: {\n\t\t\tconst auto _iter = vnx_queue_vnx_restart.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_restart.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_restart.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 10: {\n\t\t\tconst auto _iter = vnx_queue_vnx_stop.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_stop.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_stop.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\t_callback();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase 11: {\n\t\t\tconst auto _iter = vnx_queue_vnx_self_test.find(_request_id);\n\t\t\tif(_iter == vnx_queue_vnx_self_test.end()) {\n\t\t\t\tthrow std::runtime_error(\"WebAPIAsyncClient: callback not found\");\n\t\t\t}\n\t\t\tconst auto _callback = std::move(_iter->second.first);\n\t\t\tvnx_queue_vnx_self_test.erase(_iter);\n\t\t\t_lock.unlock();\n\t\t\tif(_callback) {\n\t\t\t\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_value)) {\n\t\t\t\t\t_callback(_result->_ret_0);\n\t\t\t\t} else if(_value && !_value->is_void()) {\n\t\t\t\t\t_callback(_value->get_field_by_index(0).to<vnx::bool_t>());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"WebAPIAsyncClient: invalid return value\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tif(_index >= 0) {\n\t\t\t\tthrow std::logic_error(\"WebAPIAsyncClient: invalid callback index\");\n\t\t\t}\n\t}\n\treturn _index;\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/WebAPIBase.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/WebAPIBase.hxx>\n#include <vnx/NoSuchMethod.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/WebAPI_shutdown.hxx>\n#include <mmx/WebAPI_shutdown_return.hxx>\n#include <vnx/LogMsg.hxx>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 WebAPIBase::VNX_TYPE_HASH(0xfe90ce601fcc0cc6ull);\nconst vnx::Hash64 WebAPIBase::VNX_CODE_HASH(0xed61ac1e8ca7f4c6ull);\n\nWebAPIBase::WebAPIBase(const std::string& _vnx_name)\n\t:\tModule::Module(_vnx_name)\n{\n\tvnx::read_config(vnx_name + \".input_blocks\", input_blocks);\n\tvnx::read_config(vnx_name + \".input_proofs\", input_proofs);\n\tvnx::read_config(vnx_name + \".node_server\", node_server);\n\tvnx::read_config(vnx_name + \".wallet_server\", wallet_server);\n\tvnx::read_config(vnx_name + \".farmer_server\", farmer_server);\n\tvnx::read_config(vnx_name + \".exchange_server\", exchange_server);\n\tvnx::read_config(vnx_name + \".config_path\", config_path);\n\tvnx::read_config(vnx_name + \".max_recursion\", max_recursion);\n\tvnx::read_config(vnx_name + \".max_log_history\", max_log_history);\n\tvnx::read_config(vnx_name + \".sync_delay\", sync_delay);\n\tvnx::read_config(vnx_name + \".cache_max_age\", cache_max_age);\n}\n\nvnx::Hash64 WebAPIBase::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string WebAPIBase::get_type_name() const {\n\treturn \"mmx.WebAPI\";\n}\n\nconst vnx::TypeCode* WebAPIBase::get_type_code() const {\n\treturn mmx::vnx_native_type_code_WebAPIBase;\n}\n\nvoid WebAPIBase::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_WebAPIBase;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, input_blocks);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, input_proofs);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, node_server);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, wallet_server);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, farmer_server);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, exchange_server);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, config_path);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, max_recursion);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, max_log_history);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, sync_delay);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, cache_max_age);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid WebAPIBase::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"input_blocks\\\": \"; vnx::write(_out, input_blocks);\n\t_out << \", \\\"input_proofs\\\": \"; vnx::write(_out, input_proofs);\n\t_out << \", \\\"node_server\\\": \"; vnx::write(_out, node_server);\n\t_out << \", \\\"wallet_server\\\": \"; vnx::write(_out, wallet_server);\n\t_out << \", \\\"farmer_server\\\": \"; vnx::write(_out, farmer_server);\n\t_out << \", \\\"exchange_server\\\": \"; vnx::write(_out, exchange_server);\n\t_out << \", \\\"config_path\\\": \"; vnx::write(_out, config_path);\n\t_out << \", \\\"max_recursion\\\": \"; vnx::write(_out, max_recursion);\n\t_out << \", \\\"max_log_history\\\": \"; vnx::write(_out, max_log_history);\n\t_out << \", \\\"sync_delay\\\": \"; vnx::write(_out, sync_delay);\n\t_out << \", \\\"cache_max_age\\\": \"; vnx::write(_out, cache_max_age);\n\t_out << \"}\";\n}\n\nvoid WebAPIBase::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object WebAPIBase::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.WebAPI\";\n\t_object[\"input_blocks\"] = input_blocks;\n\t_object[\"input_proofs\"] = input_proofs;\n\t_object[\"node_server\"] = node_server;\n\t_object[\"wallet_server\"] = wallet_server;\n\t_object[\"farmer_server\"] = farmer_server;\n\t_object[\"exchange_server\"] = exchange_server;\n\t_object[\"config_path\"] = config_path;\n\t_object[\"max_recursion\"] = max_recursion;\n\t_object[\"max_log_history\"] = max_log_history;\n\t_object[\"sync_delay\"] = sync_delay;\n\t_object[\"cache_max_age\"] = cache_max_age;\n\treturn _object;\n}\n\nvoid WebAPIBase::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"cache_max_age\") {\n\t\t\t_entry.second.to(cache_max_age);\n\t\t} else if(_entry.first == \"config_path\") {\n\t\t\t_entry.second.to(config_path);\n\t\t} else if(_entry.first == \"exchange_server\") {\n\t\t\t_entry.second.to(exchange_server);\n\t\t} else if(_entry.first == \"farmer_server\") {\n\t\t\t_entry.second.to(farmer_server);\n\t\t} else if(_entry.first == \"input_blocks\") {\n\t\t\t_entry.second.to(input_blocks);\n\t\t} else if(_entry.first == \"input_proofs\") {\n\t\t\t_entry.second.to(input_proofs);\n\t\t} else if(_entry.first == \"max_log_history\") {\n\t\t\t_entry.second.to(max_log_history);\n\t\t} else if(_entry.first == \"max_recursion\") {\n\t\t\t_entry.second.to(max_recursion);\n\t\t} else if(_entry.first == \"node_server\") {\n\t\t\t_entry.second.to(node_server);\n\t\t} else if(_entry.first == \"sync_delay\") {\n\t\t\t_entry.second.to(sync_delay);\n\t\t} else if(_entry.first == \"wallet_server\") {\n\t\t\t_entry.second.to(wallet_server);\n\t\t}\n\t}\n}\n\nvnx::Variant WebAPIBase::get_field(const std::string& _name) const {\n\tif(_name == \"input_blocks\") {\n\t\treturn vnx::Variant(input_blocks);\n\t}\n\tif(_name == \"input_proofs\") {\n\t\treturn vnx::Variant(input_proofs);\n\t}\n\tif(_name == \"node_server\") {\n\t\treturn vnx::Variant(node_server);\n\t}\n\tif(_name == \"wallet_server\") {\n\t\treturn vnx::Variant(wallet_server);\n\t}\n\tif(_name == \"farmer_server\") {\n\t\treturn vnx::Variant(farmer_server);\n\t}\n\tif(_name == \"exchange_server\") {\n\t\treturn vnx::Variant(exchange_server);\n\t}\n\tif(_name == \"config_path\") {\n\t\treturn vnx::Variant(config_path);\n\t}\n\tif(_name == \"max_recursion\") {\n\t\treturn vnx::Variant(max_recursion);\n\t}\n\tif(_name == \"max_log_history\") {\n\t\treturn vnx::Variant(max_log_history);\n\t}\n\tif(_name == \"sync_delay\") {\n\t\treturn vnx::Variant(sync_delay);\n\t}\n\tif(_name == \"cache_max_age\") {\n\t\treturn vnx::Variant(cache_max_age);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid WebAPIBase::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"input_blocks\") {\n\t\t_value.to(input_blocks);\n\t} else if(_name == \"input_proofs\") {\n\t\t_value.to(input_proofs);\n\t} else if(_name == \"node_server\") {\n\t\t_value.to(node_server);\n\t} else if(_name == \"wallet_server\") {\n\t\t_value.to(wallet_server);\n\t} else if(_name == \"farmer_server\") {\n\t\t_value.to(farmer_server);\n\t} else if(_name == \"exchange_server\") {\n\t\t_value.to(exchange_server);\n\t} else if(_name == \"config_path\") {\n\t\t_value.to(config_path);\n\t} else if(_name == \"max_recursion\") {\n\t\t_value.to(max_recursion);\n\t} else if(_name == \"max_log_history\") {\n\t\t_value.to(max_log_history);\n\t} else if(_name == \"sync_delay\") {\n\t\t_value.to(sync_delay);\n\t} else if(_name == \"cache_max_age\") {\n\t\t_value.to(cache_max_age);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const WebAPIBase& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, WebAPIBase& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* WebAPIBase::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> WebAPIBase::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.WebAPI\";\n\ttype_code->type_hash = vnx::Hash64(0xfe90ce601fcc0cc6ull);\n\ttype_code->code_hash = vnx::Hash64(0xed61ac1e8ca7f4c6ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::WebAPIBase);\n\ttype_code->methods.resize(12);\n\ttype_code->methods[0] = ::mmx::WebAPI_shutdown::static_get_type_code();\n\ttype_code->methods[1] = ::vnx::ModuleInterface_vnx_get_config::static_get_type_code();\n\ttype_code->methods[2] = ::vnx::ModuleInterface_vnx_get_config_object::static_get_type_code();\n\ttype_code->methods[3] = ::vnx::ModuleInterface_vnx_get_module_info::static_get_type_code();\n\ttype_code->methods[4] = ::vnx::ModuleInterface_vnx_get_type_code::static_get_type_code();\n\ttype_code->methods[5] = ::vnx::ModuleInterface_vnx_restart::static_get_type_code();\n\ttype_code->methods[6] = ::vnx::ModuleInterface_vnx_self_test::static_get_type_code();\n\ttype_code->methods[7] = ::vnx::ModuleInterface_vnx_set_config::static_get_type_code();\n\ttype_code->methods[8] = ::vnx::ModuleInterface_vnx_set_config_object::static_get_type_code();\n\ttype_code->methods[9] = ::vnx::ModuleInterface_vnx_stop::static_get_type_code();\n\ttype_code->methods[10] = ::vnx::addons::HttpComponent_http_request::static_get_type_code();\n\ttype_code->methods[11] = ::vnx::addons::HttpComponent_http_request_chunk::static_get_type_code();\n\ttype_code->fields.resize(11);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_blocks\";\n\t\tfield.value = vnx::to_string(\"node.verified_blocks\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_proofs\";\n\t\tfield.value = vnx::to_string(\"harvester.proof\");\n\t\tfield.code = {12, 5};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"node_server\";\n\t\tfield.value = vnx::to_string(\"Node\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"wallet_server\";\n\t\tfield.value = vnx::to_string(\"Wallet\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_server\";\n\t\tfield.value = vnx::to_string(\"Farmer\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"exchange_server\";\n\t\tfield.value = vnx::to_string(\"ExchClient\");\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"config_path\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_recursion\";\n\t\tfield.value = vnx::to_string(100);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_log_history\";\n\t\tfield.value = vnx::to_string(10000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"sync_delay\";\n\t\tfield.value = vnx::to_string(18);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"cache_max_age\";\n\t\tfield.value = vnx::to_string(0);\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nvoid WebAPIBase::vnx_handle_switch(std::shared_ptr<const vnx::Value> _value) {\n\tconst auto* _type_code = _value->get_type_code();\n\twhile(_type_code) {\n\t\tswitch(_type_code->type_hash) {\n\t\t\tcase 0x94965d816d328467ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::Block>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0x816e898b36befae0ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::mmx::ProofResponse>(_value));\n\t\t\t\treturn;\n\t\t\tcase 0x2a13f6d072f9b852ull:\n\t\t\t\thandle(std::static_pointer_cast<const ::vnx::LogMsg>(_value));\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\t_type_code = _type_code->super;\n\t\t}\n\t}\n\thandle(std::static_pointer_cast<const vnx::Value>(_value));\n}\n\nstd::shared_ptr<vnx::Value> WebAPIBase::vnx_call_switch(std::shared_ptr<const vnx::Value> _method, const vnx::request_id_t& _request_id) {\n\tswitch(_method->get_type_hash()) {\n\t\tcase 0x75dd6111dc25b9d6ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::mmx::WebAPI_shutdown>(_method);\n\t\t\tauto _return_value = ::mmx::WebAPI_shutdown_return::create();\n\t\t\tshutdown();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xbbc7f1a01044d294ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config(_args->name);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x17f58f68bf83abc0ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_config_object_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_config_object();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xf6d82bdf66d034a1ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_module_info_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_module_info();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x305ec4d628960e5dull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_get_type_code_return::create();\n\t\t\t_return_value->_ret_0 = vnx_get_type_code();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x9e95dc280cecca1bull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_restart>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_restart_return::create();\n\t\t\tvnx_restart();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x6ce3775b41a42697ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_self_test_return::create();\n\t\t\t_return_value->_ret_0 = vnx_self_test();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x362aac91373958b7ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_return::create();\n\t\t\tvnx_set_config(_args->name, _args->value);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xca30f814f17f322full: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_set_config_object>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_set_config_object_return::create();\n\t\t\tvnx_set_config_object(_args->config);\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0x7ab49ce3d1bfc0d2ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::ModuleInterface_vnx_stop>(_method);\n\t\t\tauto _return_value = ::vnx::ModuleInterface_vnx_stop_return::create();\n\t\t\tvnx_stop();\n\t\t\treturn _return_value;\n\t\t}\n\t\tcase 0xe0b6c38f619bad92ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::addons::HttpComponent_http_request>(_method);\n\t\t\thttp_request_async(_args->request, _args->sub_path, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t\tcase 0x97e79d08440406d5ull: {\n\t\t\tauto _args = std::static_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk>(_method);\n\t\t\thttp_request_chunk_async(_args->request, _args->sub_path, _args->offset, _args->max_bytes, _request_id);\n\t\t\treturn nullptr;\n\t\t}\n\t}\n\tauto _ex = vnx::NoSuchMethod::create();\n\t_ex->method = _method->get_type_name();\n\treturn _ex;\n}\n\nvoid WebAPIBase::http_request_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpResponse>& _ret_0) const {\n\tauto _return_value = ::vnx::addons::HttpComponent_http_request_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\nvoid WebAPIBase::http_request_chunk_async_return(const vnx::request_id_t& _request_id, const std::shared_ptr<const ::vnx::addons::HttpData>& _ret_0) const {\n\tauto _return_value = ::vnx::addons::HttpComponent_http_request_chunk_return::create();\n\t_return_value->_ret_0 = _ret_0;\n\tvnx_async_return(_request_id, _return_value);\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::WebAPIBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_recursion, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_log_history, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[9]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.sync_delay, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[10]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.cache_max_age, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.input_blocks, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.input_proofs, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.node_server, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.wallet_server, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.farmer_server, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.exchange_server, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.config_path, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::WebAPIBase& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_WebAPIBase;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::WebAPIBase>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(16);\n\tvnx::write_value(_buf + 0, value.max_recursion);\n\tvnx::write_value(_buf + 4, value.max_log_history);\n\tvnx::write_value(_buf + 8, value.sync_delay);\n\tvnx::write_value(_buf + 12, value.cache_max_age);\n\tvnx::write(out, value.input_blocks, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.input_proofs, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.node_server, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.wallet_server, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.farmer_server, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.exchange_server, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.config_path, type_code, type_code->fields[6].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::WebAPIBase& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::WebAPIBase& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::WebAPIBase& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/WebAPIClient.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/WebAPIClient.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/WebAPI_shutdown.hxx>\n#include <mmx/WebAPI_shutdown_return.hxx>\n#include <vnx/LogMsg.hxx>\n#include <vnx/Module.h>\n#include <vnx/ModuleInterface_vnx_get_config.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_get_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info.hxx>\n#include <vnx/ModuleInterface_vnx_get_module_info_return.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code.hxx>\n#include <vnx/ModuleInterface_vnx_get_type_code_return.hxx>\n#include <vnx/ModuleInterface_vnx_restart.hxx>\n#include <vnx/ModuleInterface_vnx_restart_return.hxx>\n#include <vnx/ModuleInterface_vnx_self_test.hxx>\n#include <vnx/ModuleInterface_vnx_self_test_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_return.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object.hxx>\n#include <vnx/ModuleInterface_vnx_set_config_object_return.hxx>\n#include <vnx/ModuleInterface_vnx_stop.hxx>\n#include <vnx/ModuleInterface_vnx_stop_return.hxx>\n#include <vnx/TopicPtr.hpp>\n#include <vnx/addons/HttpComponent_http_request.hxx>\n#include <vnx/addons/HttpComponent_http_request_return.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk.hxx>\n#include <vnx/addons/HttpComponent_http_request_chunk_return.hxx>\n#include <vnx/addons/HttpData.hxx>\n#include <vnx/addons/HttpRequest.hxx>\n#include <vnx/addons/HttpResponse.hxx>\n\n#include <vnx/Generic.hxx>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nWebAPIClient::WebAPIClient(const std::string& service_name)\n\t:\tClient::Client(vnx::Hash64(service_name))\n{\n}\n\nWebAPIClient::WebAPIClient(vnx::Hash64 service_addr)\n\t:\tClient::Client(service_addr)\n{\n}\n\nvoid WebAPIClient::shutdown() {\n\tauto _method = ::mmx::WebAPI_shutdown::create();\n\tvnx_request(_method, false);\n}\n\nvoid WebAPIClient::shutdown_async() {\n\tauto _method = ::mmx::WebAPI_shutdown::create();\n\tvnx_request(_method, true);\n}\n\nstd::shared_ptr<const ::vnx::addons::HttpResponse> WebAPIClient::http_request(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpResponse>>();\n\t} else {\n\t\tthrow std::logic_error(\"WebAPIClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::addons::HttpData> WebAPIClient::http_request_chunk(std::shared_ptr<const ::vnx::addons::HttpRequest> request, const std::string& sub_path, const int64_t& offset, const int64_t& max_bytes) {\n\tauto _method = ::vnx::addons::HttpComponent_http_request_chunk::create();\n\t_method->request = request;\n\t_method->sub_path = sub_path;\n\t_method->offset = offset;\n\t_method->max_bytes = max_bytes;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::addons::HttpComponent_http_request_chunk_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::addons::HttpData>>();\n\t} else {\n\t\tthrow std::logic_error(\"WebAPIClient: invalid return value\");\n\t}\n}\n\n::vnx::Object WebAPIClient::vnx_get_config_object() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config_object::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_object_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Object>();\n\t} else {\n\t\tthrow std::logic_error(\"WebAPIClient: invalid return value\");\n\t}\n}\n\n::vnx::Variant WebAPIClient::vnx_get_config(const std::string& name) {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_config::create();\n\t_method->name = name;\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_config_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::Variant>();\n\t} else {\n\t\tthrow std::logic_error(\"WebAPIClient: invalid return value\");\n\t}\n}\n\nvoid WebAPIClient::vnx_set_config_object(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, false);\n}\n\nvoid WebAPIClient::vnx_set_config_object_async(const ::vnx::Object& config) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config_object::create();\n\t_method->config = config;\n\tvnx_request(_method, true);\n}\n\nvoid WebAPIClient::vnx_set_config(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, false);\n}\n\nvoid WebAPIClient::vnx_set_config_async(const std::string& name, const ::vnx::Variant& value) {\n\tauto _method = ::vnx::ModuleInterface_vnx_set_config::create();\n\t_method->name = name;\n\t_method->value = value;\n\tvnx_request(_method, true);\n}\n\n::vnx::TypeCode WebAPIClient::vnx_get_type_code() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_type_code::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_type_code_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<::vnx::TypeCode>();\n\t} else {\n\t\tthrow std::logic_error(\"WebAPIClient: invalid return value\");\n\t}\n}\n\nstd::shared_ptr<const ::vnx::ModuleInfo> WebAPIClient::vnx_get_module_info() {\n\tauto _method = ::vnx::ModuleInterface_vnx_get_module_info::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_get_module_info_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<std::shared_ptr<const ::vnx::ModuleInfo>>();\n\t} else {\n\t\tthrow std::logic_error(\"WebAPIClient: invalid return value\");\n\t}\n}\n\nvoid WebAPIClient::vnx_restart() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, false);\n}\n\nvoid WebAPIClient::vnx_restart_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_restart::create();\n\tvnx_request(_method, true);\n}\n\nvoid WebAPIClient::vnx_stop() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, false);\n}\n\nvoid WebAPIClient::vnx_stop_async() {\n\tauto _method = ::vnx::ModuleInterface_vnx_stop::create();\n\tvnx_request(_method, true);\n}\n\nvnx::bool_t WebAPIClient::vnx_self_test() {\n\tauto _method = ::vnx::ModuleInterface_vnx_self_test::create();\n\tauto _return_value = vnx_request(_method, false);\n\tif(auto _result = std::dynamic_pointer_cast<const ::vnx::ModuleInterface_vnx_self_test_return>(_return_value)) {\n\t\treturn _result->_ret_0;\n\t} else if(_return_value && !_return_value->is_void()) {\n\t\treturn _return_value->get_field_by_index(0).to<vnx::bool_t>();\n\t} else {\n\t\tthrow std::logic_error(\"WebAPIClient: invalid return value\");\n\t}\n}\n\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/WebAPI_shutdown.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/WebAPI_shutdown.hxx>\n#include <mmx/WebAPI_shutdown_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 WebAPI_shutdown::VNX_TYPE_HASH(0x75dd6111dc25b9d6ull);\nconst vnx::Hash64 WebAPI_shutdown::VNX_CODE_HASH(0xf792dcbc39336dbull);\n\nvnx::Hash64 WebAPI_shutdown::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string WebAPI_shutdown::get_type_name() const {\n\treturn \"mmx.WebAPI.shutdown\";\n}\n\nconst vnx::TypeCode* WebAPI_shutdown::get_type_code() const {\n\treturn mmx::vnx_native_type_code_WebAPI_shutdown;\n}\n\nstd::shared_ptr<WebAPI_shutdown> WebAPI_shutdown::create() {\n\treturn std::make_shared<WebAPI_shutdown>();\n}\n\nstd::shared_ptr<vnx::Value> WebAPI_shutdown::clone() const {\n\treturn std::make_shared<WebAPI_shutdown>(*this);\n}\n\nvoid WebAPI_shutdown::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid WebAPI_shutdown::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid WebAPI_shutdown::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_WebAPI_shutdown;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid WebAPI_shutdown::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.WebAPI.shutdown\\\"\";\n\t_out << \"}\";\n}\n\nvoid WebAPI_shutdown::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object WebAPI_shutdown::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.WebAPI.shutdown\";\n\treturn _object;\n}\n\nvoid WebAPI_shutdown::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant WebAPI_shutdown::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid WebAPI_shutdown::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const WebAPI_shutdown& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, WebAPI_shutdown& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* WebAPI_shutdown::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> WebAPI_shutdown::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.WebAPI.shutdown\";\n\ttype_code->type_hash = vnx::Hash64(0x75dd6111dc25b9d6ull);\n\ttype_code->code_hash = vnx::Hash64(0xf792dcbc39336dbull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_method = true;\n\ttype_code->native_size = sizeof(::mmx::WebAPI_shutdown);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<WebAPI_shutdown>(); };\n\ttype_code->return_type = ::mmx::WebAPI_shutdown_return::static_get_type_code();\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::WebAPI_shutdown& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::WebAPI_shutdown& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_WebAPI_shutdown;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::WebAPI_shutdown>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::WebAPI_shutdown& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::WebAPI_shutdown& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::WebAPI_shutdown& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/WebAPI_shutdown_return.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/WebAPI_shutdown_return.hxx>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 WebAPI_shutdown_return::VNX_TYPE_HASH(0x248624ff297c34ull);\nconst vnx::Hash64 WebAPI_shutdown_return::VNX_CODE_HASH(0xc5fc79884d0b1c8aull);\n\nvnx::Hash64 WebAPI_shutdown_return::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string WebAPI_shutdown_return::get_type_name() const {\n\treturn \"mmx.WebAPI.shutdown.return\";\n}\n\nconst vnx::TypeCode* WebAPI_shutdown_return::get_type_code() const {\n\treturn mmx::vnx_native_type_code_WebAPI_shutdown_return;\n}\n\nstd::shared_ptr<WebAPI_shutdown_return> WebAPI_shutdown_return::create() {\n\treturn std::make_shared<WebAPI_shutdown_return>();\n}\n\nstd::shared_ptr<vnx::Value> WebAPI_shutdown_return::clone() const {\n\treturn std::make_shared<WebAPI_shutdown_return>(*this);\n}\n\nvoid WebAPI_shutdown_return::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid WebAPI_shutdown_return::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid WebAPI_shutdown_return::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_WebAPI_shutdown_return;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid WebAPI_shutdown_return::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.WebAPI.shutdown.return\\\"\";\n\t_out << \"}\";\n}\n\nvoid WebAPI_shutdown_return::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object WebAPI_shutdown_return::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.WebAPI.shutdown.return\";\n\treturn _object;\n}\n\nvoid WebAPI_shutdown_return::from_object(const vnx::Object& _object) {\n}\n\nvnx::Variant WebAPI_shutdown_return::get_field(const std::string& _name) const {\n\treturn vnx::Variant();\n}\n\nvoid WebAPI_shutdown_return::set_field(const std::string& _name, const vnx::Variant& _value) {\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const WebAPI_shutdown_return& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, WebAPI_shutdown_return& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* WebAPI_shutdown_return::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> WebAPI_shutdown_return::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.WebAPI.shutdown.return\";\n\ttype_code->type_hash = vnx::Hash64(0x248624ff297c34ull);\n\ttype_code->code_hash = vnx::Hash64(0xc5fc79884d0b1c8aull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->is_return = true;\n\ttype_code->native_size = sizeof(::mmx::WebAPI_shutdown_return);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<WebAPI_shutdown_return>(); };\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::WebAPI_shutdown_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::WebAPI_shutdown_return& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_WebAPI_shutdown_return;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::WebAPI_shutdown_return>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n}\n\nvoid read(std::istream& in, ::mmx::WebAPI_shutdown_return& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::WebAPI_shutdown_return& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::WebAPI_shutdown_return& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/account_info_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/account_info_t.hxx>\n#include <mmx/account_t.hxx>\n#include <mmx/addr_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 account_info_t::VNX_TYPE_HASH(0x5858a2f32468feaeull);\nconst vnx::Hash64 account_info_t::VNX_CODE_HASH(0x1e6f0e2fdf725334ull);\n\nvnx::Hash64 account_info_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string account_info_t::get_type_name() const {\n\treturn \"mmx.account_info_t\";\n}\n\nconst vnx::TypeCode* account_info_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_account_info_t;\n}\n\nstd::shared_ptr<account_info_t> account_info_t::create() {\n\treturn std::make_shared<account_info_t>();\n}\n\nstd::shared_ptr<account_info_t> account_info_t::clone() const {\n\treturn std::make_shared<account_info_t>(*this);\n}\n\nvoid account_info_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid account_info_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid account_info_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_account_info_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, num_addresses);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, key_file);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, finger_print);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, with_passphrase);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, is_hidden);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, account);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid account_info_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"num_addresses\\\": \"; vnx::write(_out, num_addresses);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"key_file\\\": \"; vnx::write(_out, key_file);\n\t_out << \", \\\"finger_print\\\": \"; vnx::write(_out, finger_print);\n\t_out << \", \\\"with_passphrase\\\": \"; vnx::write(_out, with_passphrase);\n\t_out << \", \\\"is_hidden\\\": \"; vnx::write(_out, is_hidden);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"account\\\": \"; vnx::write(_out, account);\n\t_out << \"}\";\n}\n\nvoid account_info_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object account_info_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.account_info_t\";\n\t_object[\"index\"] = index;\n\t_object[\"num_addresses\"] = num_addresses;\n\t_object[\"name\"] = name;\n\t_object[\"key_file\"] = key_file;\n\t_object[\"finger_print\"] = finger_print;\n\t_object[\"with_passphrase\"] = with_passphrase;\n\t_object[\"is_hidden\"] = is_hidden;\n\t_object[\"address\"] = address;\n\t_object[\"account\"] = account;\n\treturn _object;\n}\n\nvoid account_info_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"account\") {\n\t\t\t_entry.second.to(account);\n\t\t} else if(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"finger_print\") {\n\t\t\t_entry.second.to(finger_print);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"is_hidden\") {\n\t\t\t_entry.second.to(is_hidden);\n\t\t} else if(_entry.first == \"key_file\") {\n\t\t\t_entry.second.to(key_file);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t} else if(_entry.first == \"num_addresses\") {\n\t\t\t_entry.second.to(num_addresses);\n\t\t} else if(_entry.first == \"with_passphrase\") {\n\t\t\t_entry.second.to(with_passphrase);\n\t\t}\n\t}\n}\n\nvnx::Variant account_info_t::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"num_addresses\") {\n\t\treturn vnx::Variant(num_addresses);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"key_file\") {\n\t\treturn vnx::Variant(key_file);\n\t}\n\tif(_name == \"finger_print\") {\n\t\treturn vnx::Variant(finger_print);\n\t}\n\tif(_name == \"with_passphrase\") {\n\t\treturn vnx::Variant(with_passphrase);\n\t}\n\tif(_name == \"is_hidden\") {\n\t\treturn vnx::Variant(is_hidden);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"account\") {\n\t\treturn vnx::Variant(account);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid account_info_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"num_addresses\") {\n\t\t_value.to(num_addresses);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"key_file\") {\n\t\t_value.to(key_file);\n\t} else if(_name == \"finger_print\") {\n\t\t_value.to(finger_print);\n\t} else if(_name == \"with_passphrase\") {\n\t\t_value.to(with_passphrase);\n\t} else if(_name == \"is_hidden\") {\n\t\t_value.to(is_hidden);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"account\") {\n\t\t_value.to(account);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const account_info_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, account_info_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* account_info_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> account_info_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.account_info_t\";\n\ttype_code->type_hash = vnx::Hash64(0x5858a2f32468feaeull);\n\ttype_code->code_hash = vnx::Hash64(0x1e6f0e2fdf725334ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::account_info_t);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::account_t::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<account_info_t>>(); };\n\ttype_code->fields.resize(9);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_addresses\";\n\t\tfield.value = vnx::to_string(1);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"key_file\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"finger_print\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"with_passphrase\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_hidden\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"account\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::account_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_addresses, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.with_passphrase, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_hidden, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.account, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 2: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.key_file, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.finger_print, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::account_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_account_info_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::account_info_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(14);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.num_addresses);\n\tvnx::write_value(_buf + 8, value.with_passphrase);\n\tvnx::write_value(_buf + 9, value.is_hidden);\n\tvnx::write_value(_buf + 10, value.account);\n\tvnx::write(out, value.name, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.key_file, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.finger_print, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.address, type_code, type_code->fields[7].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::account_info_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::account_info_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::account_info_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::account_info_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::account_info_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/account_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/account_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 account_t::VNX_TYPE_HASH(0xc0c163f453729a7ull);\nconst vnx::Hash64 account_t::VNX_CODE_HASH(0xee2c18587edeb7a4ull);\n\nvnx::Hash64 account_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string account_t::get_type_name() const {\n\treturn \"mmx.account_t\";\n}\n\nconst vnx::TypeCode* account_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_account_t;\n}\n\nstd::shared_ptr<account_t> account_t::create() {\n\treturn std::make_shared<account_t>();\n}\n\nstd::shared_ptr<account_t> account_t::clone() const {\n\treturn std::make_shared<account_t>(*this);\n}\n\nvoid account_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid account_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid account_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_account_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, num_addresses);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, key_file);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, finger_print);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, with_passphrase);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, is_hidden);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid account_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"num_addresses\\\": \"; vnx::write(_out, num_addresses);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"key_file\\\": \"; vnx::write(_out, key_file);\n\t_out << \", \\\"finger_print\\\": \"; vnx::write(_out, finger_print);\n\t_out << \", \\\"with_passphrase\\\": \"; vnx::write(_out, with_passphrase);\n\t_out << \", \\\"is_hidden\\\": \"; vnx::write(_out, is_hidden);\n\t_out << \"}\";\n}\n\nvoid account_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object account_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.account_t\";\n\t_object[\"index\"] = index;\n\t_object[\"num_addresses\"] = num_addresses;\n\t_object[\"name\"] = name;\n\t_object[\"key_file\"] = key_file;\n\t_object[\"finger_print\"] = finger_print;\n\t_object[\"with_passphrase\"] = with_passphrase;\n\t_object[\"is_hidden\"] = is_hidden;\n\treturn _object;\n}\n\nvoid account_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"finger_print\") {\n\t\t\t_entry.second.to(finger_print);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"is_hidden\") {\n\t\t\t_entry.second.to(is_hidden);\n\t\t} else if(_entry.first == \"key_file\") {\n\t\t\t_entry.second.to(key_file);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t} else if(_entry.first == \"num_addresses\") {\n\t\t\t_entry.second.to(num_addresses);\n\t\t} else if(_entry.first == \"with_passphrase\") {\n\t\t\t_entry.second.to(with_passphrase);\n\t\t}\n\t}\n}\n\nvnx::Variant account_t::get_field(const std::string& _name) const {\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"num_addresses\") {\n\t\treturn vnx::Variant(num_addresses);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"key_file\") {\n\t\treturn vnx::Variant(key_file);\n\t}\n\tif(_name == \"finger_print\") {\n\t\treturn vnx::Variant(finger_print);\n\t}\n\tif(_name == \"with_passphrase\") {\n\t\treturn vnx::Variant(with_passphrase);\n\t}\n\tif(_name == \"is_hidden\") {\n\t\treturn vnx::Variant(is_hidden);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid account_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"num_addresses\") {\n\t\t_value.to(num_addresses);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"key_file\") {\n\t\t_value.to(key_file);\n\t} else if(_name == \"finger_print\") {\n\t\t_value.to(finger_print);\n\t} else if(_name == \"with_passphrase\") {\n\t\t_value.to(with_passphrase);\n\t} else if(_name == \"is_hidden\") {\n\t\t_value.to(is_hidden);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const account_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, account_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* account_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> account_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.account_t\";\n\ttype_code->type_hash = vnx::Hash64(0xc0c163f453729a7ull);\n\ttype_code->code_hash = vnx::Hash64(0xee2c18587edeb7a4ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::account_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<account_t>>(); };\n\ttype_code->fields.resize(7);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"index\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_addresses\";\n\t\tfield.value = vnx::to_string(1);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"key_file\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"finger_print\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"with_passphrase\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_hidden\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::account_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_addresses, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.with_passphrase, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_hidden, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 2: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.key_file, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.finger_print, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::account_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_account_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::account_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(10);\n\tvnx::write_value(_buf + 0, value.index);\n\tvnx::write_value(_buf + 4, value.num_addresses);\n\tvnx::write_value(_buf + 8, value.with_passphrase);\n\tvnx::write_value(_buf + 9, value.is_hidden);\n\tvnx::write(out, value.name, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.key_file, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.finger_print, type_code, type_code->fields[4].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::account_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::account_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::account_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::account_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::account_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/balance_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/balance_t.hxx>\n#include <mmx/uint128.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 balance_t::VNX_TYPE_HASH(0x613173c7e5ce65b4ull);\nconst vnx::Hash64 balance_t::VNX_CODE_HASH(0x9b34210a248d52bcull);\n\nvnx::Hash64 balance_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string balance_t::get_type_name() const {\n\treturn \"mmx.balance_t\";\n}\n\nconst vnx::TypeCode* balance_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_balance_t;\n}\n\nstd::shared_ptr<balance_t> balance_t::create() {\n\treturn std::make_shared<balance_t>();\n}\n\nstd::shared_ptr<balance_t> balance_t::clone() const {\n\treturn std::make_shared<balance_t>(*this);\n}\n\nvoid balance_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid balance_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid balance_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_balance_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, spendable);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, reserved);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, locked);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, total);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, is_validated);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid balance_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"spendable\\\": \"; vnx::write(_out, spendable);\n\t_out << \", \\\"reserved\\\": \"; vnx::write(_out, reserved);\n\t_out << \", \\\"locked\\\": \"; vnx::write(_out, locked);\n\t_out << \", \\\"total\\\": \"; vnx::write(_out, total);\n\t_out << \", \\\"is_validated\\\": \"; vnx::write(_out, is_validated);\n\t_out << \"}\";\n}\n\nvoid balance_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object balance_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.balance_t\";\n\t_object[\"spendable\"] = spendable;\n\t_object[\"reserved\"] = reserved;\n\t_object[\"locked\"] = locked;\n\t_object[\"total\"] = total;\n\t_object[\"is_validated\"] = is_validated;\n\treturn _object;\n}\n\nvoid balance_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"is_validated\") {\n\t\t\t_entry.second.to(is_validated);\n\t\t} else if(_entry.first == \"locked\") {\n\t\t\t_entry.second.to(locked);\n\t\t} else if(_entry.first == \"reserved\") {\n\t\t\t_entry.second.to(reserved);\n\t\t} else if(_entry.first == \"spendable\") {\n\t\t\t_entry.second.to(spendable);\n\t\t} else if(_entry.first == \"total\") {\n\t\t\t_entry.second.to(total);\n\t\t}\n\t}\n}\n\nvnx::Variant balance_t::get_field(const std::string& _name) const {\n\tif(_name == \"spendable\") {\n\t\treturn vnx::Variant(spendable);\n\t}\n\tif(_name == \"reserved\") {\n\t\treturn vnx::Variant(reserved);\n\t}\n\tif(_name == \"locked\") {\n\t\treturn vnx::Variant(locked);\n\t}\n\tif(_name == \"total\") {\n\t\treturn vnx::Variant(total);\n\t}\n\tif(_name == \"is_validated\") {\n\t\treturn vnx::Variant(is_validated);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid balance_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"spendable\") {\n\t\t_value.to(spendable);\n\t} else if(_name == \"reserved\") {\n\t\t_value.to(reserved);\n\t} else if(_name == \"locked\") {\n\t\t_value.to(locked);\n\t} else if(_name == \"total\") {\n\t\t_value.to(total);\n\t} else if(_name == \"is_validated\") {\n\t\t_value.to(is_validated);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const balance_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, balance_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* balance_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> balance_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.balance_t\";\n\ttype_code->type_hash = vnx::Hash64(0x613173c7e5ce65b4ull);\n\ttype_code->code_hash = vnx::Hash64(0x9b34210a248d52bcull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::balance_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<balance_t>>(); };\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"spendable\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reserved\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"locked\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"total\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_validated\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::balance_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_validated, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.spendable, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.reserved, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.locked, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.total, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::balance_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_balance_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::balance_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(1);\n\tvnx::write_value(_buf + 0, value.is_validated);\n\tvnx::write(out, value.spendable, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.reserved, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.locked, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.total, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::balance_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::balance_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::balance_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::balance_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::balance_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/block_index_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/block_index_t.hxx>\n#include <mmx/hash_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 block_index_t::VNX_TYPE_HASH(0xd00c722670bca900ull);\nconst vnx::Hash64 block_index_t::VNX_CODE_HASH(0x457ce85ac9b66218ull);\n\nvnx::Hash64 block_index_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string block_index_t::get_type_name() const {\n\treturn \"mmx.block_index_t\";\n}\n\nconst vnx::TypeCode* block_index_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_block_index_t;\n}\n\nstd::shared_ptr<block_index_t> block_index_t::create() {\n\treturn std::make_shared<block_index_t>();\n}\n\nstd::shared_ptr<block_index_t> block_index_t::clone() const {\n\treturn std::make_shared<block_index_t>(*this);\n}\n\nvoid block_index_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid block_index_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid block_index_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_block_index_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, hash);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, content_hash);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, static_cost);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, total_cost);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, file_offset);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid block_index_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"hash\\\": \"; vnx::write(_out, hash);\n\t_out << \", \\\"content_hash\\\": \"; vnx::write(_out, content_hash);\n\t_out << \", \\\"static_cost\\\": \"; vnx::write(_out, static_cost);\n\t_out << \", \\\"total_cost\\\": \"; vnx::write(_out, total_cost);\n\t_out << \", \\\"file_offset\\\": \"; vnx::write(_out, file_offset);\n\t_out << \"}\";\n}\n\nvoid block_index_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object block_index_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.block_index_t\";\n\t_object[\"hash\"] = hash;\n\t_object[\"content_hash\"] = content_hash;\n\t_object[\"static_cost\"] = static_cost;\n\t_object[\"total_cost\"] = total_cost;\n\t_object[\"file_offset\"] = file_offset;\n\treturn _object;\n}\n\nvoid block_index_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"content_hash\") {\n\t\t\t_entry.second.to(content_hash);\n\t\t} else if(_entry.first == \"file_offset\") {\n\t\t\t_entry.second.to(file_offset);\n\t\t} else if(_entry.first == \"hash\") {\n\t\t\t_entry.second.to(hash);\n\t\t} else if(_entry.first == \"static_cost\") {\n\t\t\t_entry.second.to(static_cost);\n\t\t} else if(_entry.first == \"total_cost\") {\n\t\t\t_entry.second.to(total_cost);\n\t\t}\n\t}\n}\n\nvnx::Variant block_index_t::get_field(const std::string& _name) const {\n\tif(_name == \"hash\") {\n\t\treturn vnx::Variant(hash);\n\t}\n\tif(_name == \"content_hash\") {\n\t\treturn vnx::Variant(content_hash);\n\t}\n\tif(_name == \"static_cost\") {\n\t\treturn vnx::Variant(static_cost);\n\t}\n\tif(_name == \"total_cost\") {\n\t\treturn vnx::Variant(total_cost);\n\t}\n\tif(_name == \"file_offset\") {\n\t\treturn vnx::Variant(file_offset);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid block_index_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"hash\") {\n\t\t_value.to(hash);\n\t} else if(_name == \"content_hash\") {\n\t\t_value.to(content_hash);\n\t} else if(_name == \"static_cost\") {\n\t\t_value.to(static_cost);\n\t} else if(_name == \"total_cost\") {\n\t\t_value.to(total_cost);\n\t} else if(_name == \"file_offset\") {\n\t\t_value.to(file_offset);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const block_index_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, block_index_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* block_index_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> block_index_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.block_index_t\";\n\ttype_code->type_hash = vnx::Hash64(0xd00c722670bca900ull);\n\ttype_code->code_hash = vnx::Hash64(0x457ce85ac9b66218ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::block_index_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<block_index_t>>(); };\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"content_hash\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"static_cost\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"total_cost\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"file_offset\";\n\t\tfield.code = {8};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::block_index_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.static_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.file_offset, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.hash, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.content_hash, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::block_index_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_block_index_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::block_index_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(16);\n\tvnx::write_value(_buf + 0, value.static_cost);\n\tvnx::write_value(_buf + 4, value.total_cost);\n\tvnx::write_value(_buf + 8, value.file_offset);\n\tvnx::write(out, value.hash, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.content_hash, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::block_index_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::block_index_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::block_index_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::block_index_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::block_index_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/compile_flags_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/compile_flags_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 compile_flags_t::VNX_TYPE_HASH(0x2d1279b3d438d884ull);\nconst vnx::Hash64 compile_flags_t::VNX_CODE_HASH(0x81e1d734f9efb196ull);\n\nvnx::Hash64 compile_flags_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string compile_flags_t::get_type_name() const {\n\treturn \"mmx.compile_flags_t\";\n}\n\nconst vnx::TypeCode* compile_flags_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_compile_flags_t;\n}\n\nstd::shared_ptr<compile_flags_t> compile_flags_t::create() {\n\treturn std::make_shared<compile_flags_t>();\n}\n\nstd::shared_ptr<compile_flags_t> compile_flags_t::clone() const {\n\treturn std::make_shared<compile_flags_t>(*this);\n}\n\nvoid compile_flags_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid compile_flags_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid compile_flags_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_compile_flags_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, verbose);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, opt_level);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, catch_overflow);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid compile_flags_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"verbose\\\": \"; vnx::write(_out, verbose);\n\t_out << \", \\\"opt_level\\\": \"; vnx::write(_out, opt_level);\n\t_out << \", \\\"catch_overflow\\\": \"; vnx::write(_out, catch_overflow);\n\t_out << \"}\";\n}\n\nvoid compile_flags_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object compile_flags_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.compile_flags_t\";\n\t_object[\"verbose\"] = verbose;\n\t_object[\"opt_level\"] = opt_level;\n\t_object[\"catch_overflow\"] = catch_overflow;\n\treturn _object;\n}\n\nvoid compile_flags_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"catch_overflow\") {\n\t\t\t_entry.second.to(catch_overflow);\n\t\t} else if(_entry.first == \"opt_level\") {\n\t\t\t_entry.second.to(opt_level);\n\t\t} else if(_entry.first == \"verbose\") {\n\t\t\t_entry.second.to(verbose);\n\t\t}\n\t}\n}\n\nvnx::Variant compile_flags_t::get_field(const std::string& _name) const {\n\tif(_name == \"verbose\") {\n\t\treturn vnx::Variant(verbose);\n\t}\n\tif(_name == \"opt_level\") {\n\t\treturn vnx::Variant(opt_level);\n\t}\n\tif(_name == \"catch_overflow\") {\n\t\treturn vnx::Variant(catch_overflow);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid compile_flags_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"verbose\") {\n\t\t_value.to(verbose);\n\t} else if(_name == \"opt_level\") {\n\t\t_value.to(opt_level);\n\t} else if(_name == \"catch_overflow\") {\n\t\t_value.to(catch_overflow);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const compile_flags_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, compile_flags_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* compile_flags_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> compile_flags_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.compile_flags_t\";\n\ttype_code->type_hash = vnx::Hash64(0x2d1279b3d438d884ull);\n\ttype_code->code_hash = vnx::Hash64(0x81e1d734f9efb196ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::compile_flags_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<compile_flags_t>>(); };\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"verbose\";\n\t\tfield.value = vnx::to_string(0);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"opt_level\";\n\t\tfield.value = vnx::to_string(3);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"catch_overflow\";\n\t\tfield.value = vnx::to_string(true);\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::compile_flags_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.verbose, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.opt_level, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.catch_overflow, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::compile_flags_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_compile_flags_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::compile_flags_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(9);\n\tvnx::write_value(_buf + 0, value.verbose);\n\tvnx::write_value(_buf + 4, value.opt_level);\n\tvnx::write_value(_buf + 8, value.catch_overflow);\n}\n\nvoid read(std::istream& in, ::mmx::compile_flags_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::compile_flags_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::compile_flags_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::compile_flags_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::compile_flags_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/error_code_e.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/error_code_e.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 error_code_e::VNX_TYPE_HASH(0xc3330407879f46ull);\nconst vnx::Hash64 error_code_e::VNX_CODE_HASH(0x88993cb1a7d930bfull);\n\nvnx::Hash64 error_code_e::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string error_code_e::get_type_name() const {\n\treturn \"mmx.error_code_e\";\n}\n\nconst vnx::TypeCode* error_code_e::get_type_code() const {\n\treturn mmx::vnx_native_type_code_error_code_e;\n}\n\nstd::shared_ptr<error_code_e> error_code_e::create() {\n\treturn std::make_shared<error_code_e>();\n}\n\nstd::shared_ptr<error_code_e> error_code_e::clone() const {\n\treturn std::make_shared<error_code_e>(*this);\n}\n\nvoid error_code_e::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid error_code_e::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvnx::bool_t error_code_e::is_valid() const {\n\tswitch(value) {\n\t\tcase INSUFFICIENT_FUNDS: return true;\n\t\tcase INSUFFICIENT_FUNDS_TXFEE: return true;\n\t\tcase INVALID_CONTRACT: return true;\n\t\tcase INVALID_OPERATION: return true;\n\t\tcase TXFEE_OVERRUN: return true;\n\t\tcase TX_EXPIRED: return true;\n\t}\n\treturn false;\n}\n\nstd::string error_code_e::to_string() const {\n\tswitch(value) {\n\t\tcase INSUFFICIENT_FUNDS: return \"\\\"INSUFFICIENT_FUNDS\\\"\";\n\t\tcase INSUFFICIENT_FUNDS_TXFEE: return \"\\\"INSUFFICIENT_FUNDS_TXFEE\\\"\";\n\t\tcase INVALID_CONTRACT: return \"\\\"INVALID_CONTRACT\\\"\";\n\t\tcase INVALID_OPERATION: return \"\\\"INVALID_OPERATION\\\"\";\n\t\tcase TXFEE_OVERRUN: return \"\\\"TXFEE_OVERRUN\\\"\";\n\t\tcase TX_EXPIRED: return \"\\\"TX_EXPIRED\\\"\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string error_code_e::to_string_value() const {\n\tswitch(value) {\n\t\tcase INSUFFICIENT_FUNDS: return \"INSUFFICIENT_FUNDS\";\n\t\tcase INSUFFICIENT_FUNDS_TXFEE: return \"INSUFFICIENT_FUNDS_TXFEE\";\n\t\tcase INVALID_CONTRACT: return \"INVALID_CONTRACT\";\n\t\tcase INVALID_OPERATION: return \"INVALID_OPERATION\";\n\t\tcase TXFEE_OVERRUN: return \"TXFEE_OVERRUN\";\n\t\tcase TX_EXPIRED: return \"TX_EXPIRED\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string error_code_e::to_string_value_full() const {\n\tswitch(value) {\n\t\tcase INSUFFICIENT_FUNDS: return \"mmx.error_code_e.INSUFFICIENT_FUNDS\";\n\t\tcase INSUFFICIENT_FUNDS_TXFEE: return \"mmx.error_code_e.INSUFFICIENT_FUNDS_TXFEE\";\n\t\tcase INVALID_CONTRACT: return \"mmx.error_code_e.INVALID_CONTRACT\";\n\t\tcase INVALID_OPERATION: return \"mmx.error_code_e.INVALID_OPERATION\";\n\t\tcase TXFEE_OVERRUN: return \"mmx.error_code_e.TXFEE_OVERRUN\";\n\t\tcase TX_EXPIRED: return \"mmx.error_code_e.TX_EXPIRED\";\n\t}\n\treturn std::to_string(value);\n}\n\nvoid error_code_e::from_string(const std::string& _str) {\n\tstd::string _name;\n\tvnx::from_string(_str, _name);\n\tfrom_string_value(_name);\n}\n\nvoid error_code_e::from_string_value(const std::string& _name) {\n\tvnx::Variant var;\n\tvnx::from_string_value(_name, var);\n\tif(var.is_string()) {\n\t\tif(_name == \"INSUFFICIENT_FUNDS\") value = INSUFFICIENT_FUNDS;\n\t\telse if(_name == \"INSUFFICIENT_FUNDS_TXFEE\") value = INSUFFICIENT_FUNDS_TXFEE;\n\t\telse if(_name == \"INVALID_CONTRACT\") value = INVALID_CONTRACT;\n\t\telse if(_name == \"INVALID_OPERATION\") value = INVALID_OPERATION;\n\t\telse if(_name == \"TXFEE_OVERRUN\") value = TXFEE_OVERRUN;\n\t\telse if(_name == \"TX_EXPIRED\") value = TX_EXPIRED;\n\t\telse value = enum_t(vnx::hash64(_name));\n\t} else {\n\t\tvalue = enum_t(std::stoul(_name.c_str(), nullptr, 0));\n\t}\n}\n\nvoid error_code_e::accept(vnx::Visitor& _visitor) const {\n\tstd::string _name;\n\tswitch(value) {\n\t\tcase INSUFFICIENT_FUNDS: _name = \"INSUFFICIENT_FUNDS\"; break;\n\t\tcase INSUFFICIENT_FUNDS_TXFEE: _name = \"INSUFFICIENT_FUNDS_TXFEE\"; break;\n\t\tcase INVALID_CONTRACT: _name = \"INVALID_CONTRACT\"; break;\n\t\tcase INVALID_OPERATION: _name = \"INVALID_OPERATION\"; break;\n\t\tcase TXFEE_OVERRUN: _name = \"TXFEE_OVERRUN\"; break;\n\t\tcase TX_EXPIRED: _name = \"TX_EXPIRED\"; break;\n\t}\n\t_visitor.enum_value(value, _name);\n}\n\nvoid error_code_e::write(std::ostream& _out) const {\n\tswitch(value) {\n\t\tcase INSUFFICIENT_FUNDS: _out << \"\\\"INSUFFICIENT_FUNDS\\\"\"; break;\n\t\tcase INSUFFICIENT_FUNDS_TXFEE: _out << \"\\\"INSUFFICIENT_FUNDS_TXFEE\\\"\"; break;\n\t\tcase INVALID_CONTRACT: _out << \"\\\"INVALID_CONTRACT\\\"\"; break;\n\t\tcase INVALID_OPERATION: _out << \"\\\"INVALID_OPERATION\\\"\"; break;\n\t\tcase TXFEE_OVERRUN: _out << \"\\\"TXFEE_OVERRUN\\\"\"; break;\n\t\tcase TX_EXPIRED: _out << \"\\\"TX_EXPIRED\\\"\"; break;\n\t\tdefault: _out << value;\n\t}\n}\n\nvoid error_code_e::read(std::istream& _in) {\n\tfrom_string_value(vnx::read(_in).to_string_value());\n}\n\nvnx::Object error_code_e::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.error_code_e\";\n\t_object[\"value\"] = value;\n\treturn _object;\n}\n\nvoid error_code_e::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"value\") {\n\t\t\t_entry.second.to(value);\n\t\t}\n\t}\n}\n\nvnx::Variant error_code_e::get_field(const std::string& _name) const {\n\tif(_name == \"value\") {\n\t\treturn vnx::Variant(value);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid error_code_e::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"value\") {\n\t\t_value.to(value);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const error_code_e& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, error_code_e& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* error_code_e::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> error_code_e::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.error_code_e\";\n\ttype_code->type_hash = vnx::Hash64(0xc3330407879f46ull);\n\ttype_code->code_hash = vnx::Hash64(0x88993cb1a7d930bfull);\n\ttype_code->is_native = true;\n\ttype_code->is_enum = true;\n\ttype_code->native_size = sizeof(::mmx::error_code_e);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<error_code_e>>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"value\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->enum_map[1975784893] = \"INSUFFICIENT_FUNDS\";\n\ttype_code->enum_map[1882923049] = \"INSUFFICIENT_FUNDS_TXFEE\";\n\ttype_code->enum_map[914919857] = \"INVALID_CONTRACT\";\n\ttype_code->enum_map[2667583392] = \"INVALID_OPERATION\";\n\ttype_code->enum_map[3169221647] = \"TXFEE_OVERRUN\";\n\ttype_code->enum_map[327454547] = \"TX_EXPIRED\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::error_code_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tVariant tmp;\n\t\tvnx::read(in, tmp, type_code, code);\n\t\tif(tmp.is_string()) {\n\t\t\tvnx::from_string(tmp.to_string(), value);\n\t\t} else if(tmp.is_ulong()) {\n\t\t\tvalue = ::mmx::error_code_e::enum_t(tmp.to<uint32_t>());\n\t\t} else {\n\t\t\tvalue = ::mmx::error_code_e();\n\t\t}\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.value, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::error_code_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_STRING) {\n\t\tvnx::write(out, value.to_string_value(), nullptr, code);\n\t\treturn;\n\t}\n\tif(code && code[0] == CODE_UINT32) {\n\t\tvnx::write(out, value.value, nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_error_code_e;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::error_code_e>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.value);\n}\n\nvoid read(std::istream& in, ::mmx::error_code_e& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::error_code_e& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::error_code_e& value) {\n\tvalue.accept(visitor);\n}\n\nvoid read(TypeInput& in, ::mmx::error_code_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tuint32_t tmp = 0;\n\tvnx::read(in, tmp, type_code, code);\n\tvalue = ::mmx::error_code_e::enum_t(tmp);\n}\n\nvoid write(TypeOutput& out, const ::mmx::error_code_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tvnx::write(out, uint32_t(value), type_code, code);\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::error_code_e& _value) {\n\treturn _value.to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::error_code_e& _value) {\n\treturn _value.to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::error_code_e& _value) {\n\treturn _value.to_string_value_full();\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::error_code_e::enum_t& _value) {\n\treturn ::mmx::error_code_e(_value).to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::error_code_e::enum_t& _value) {\n\treturn ::mmx::error_code_e(_value).to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::error_code_e::enum_t& _value) {\n\treturn ::mmx::error_code_e(_value).to_string_value_full();\n}\n\nbool is_equivalent<::mmx::error_code_e>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::error_code_e::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/exec_entry_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/exec_entry_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/uint128.hpp>\n#include <vnx/Variant.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 exec_entry_t::VNX_TYPE_HASH(0xd30282844b1862a4ull);\nconst vnx::Hash64 exec_entry_t::VNX_CODE_HASH(0x34e910d80c01901full);\n\nvnx::Hash64 exec_entry_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string exec_entry_t::get_type_name() const {\n\treturn \"mmx.exec_entry_t\";\n}\n\nconst vnx::TypeCode* exec_entry_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_exec_entry_t;\n}\n\nstd::shared_ptr<exec_entry_t> exec_entry_t::create() {\n\treturn std::make_shared<exec_entry_t>();\n}\n\nstd::shared_ptr<exec_entry_t> exec_entry_t::clone() const {\n\treturn std::make_shared<exec_entry_t>(*this);\n}\n\nvoid exec_entry_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid exec_entry_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid exec_entry_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_exec_entry_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, txid);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, method);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, args);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, user);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, deposit);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid exec_entry_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"txid\\\": \"; vnx::write(_out, txid);\n\t_out << \", \\\"method\\\": \"; vnx::write(_out, method);\n\t_out << \", \\\"args\\\": \"; vnx::write(_out, args);\n\t_out << \", \\\"user\\\": \"; vnx::write(_out, user);\n\t_out << \", \\\"deposit\\\": \"; vnx::write(_out, deposit);\n\t_out << \"}\";\n}\n\nvoid exec_entry_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object exec_entry_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.exec_entry_t\";\n\t_object[\"height\"] = height;\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"txid\"] = txid;\n\t_object[\"method\"] = method;\n\t_object[\"args\"] = args;\n\t_object[\"user\"] = user;\n\t_object[\"deposit\"] = deposit;\n\treturn _object;\n}\n\nvoid exec_entry_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"args\") {\n\t\t\t_entry.second.to(args);\n\t\t} else if(_entry.first == \"deposit\") {\n\t\t\t_entry.second.to(deposit);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"method\") {\n\t\t\t_entry.second.to(method);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t} else if(_entry.first == \"txid\") {\n\t\t\t_entry.second.to(txid);\n\t\t} else if(_entry.first == \"user\") {\n\t\t\t_entry.second.to(user);\n\t\t}\n\t}\n}\n\nvnx::Variant exec_entry_t::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"txid\") {\n\t\treturn vnx::Variant(txid);\n\t}\n\tif(_name == \"method\") {\n\t\treturn vnx::Variant(method);\n\t}\n\tif(_name == \"args\") {\n\t\treturn vnx::Variant(args);\n\t}\n\tif(_name == \"user\") {\n\t\treturn vnx::Variant(user);\n\t}\n\tif(_name == \"deposit\") {\n\t\treturn vnx::Variant(deposit);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid exec_entry_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"txid\") {\n\t\t_value.to(txid);\n\t} else if(_name == \"method\") {\n\t\t_value.to(method);\n\t} else if(_name == \"args\") {\n\t\t_value.to(args);\n\t} else if(_name == \"user\") {\n\t\t_value.to(user);\n\t} else if(_name == \"deposit\") {\n\t\t_value.to(deposit);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const exec_entry_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, exec_entry_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* exec_entry_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> exec_entry_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.exec_entry_t\";\n\ttype_code->type_hash = vnx::Hash64(0xd30282844b1862a4ull);\n\ttype_code->code_hash = vnx::Hash64(0x34e910d80c01901full);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::exec_entry_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<exec_entry_t>>(); };\n\ttype_code->fields.resize(7);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"txid\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"method\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"args\";\n\t\tfield.code = {12, 17};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"deposit\";\n\t\tfield.code = {33, 23, 2, 4, 7, 11, 32, 1, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::exec_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_stamp, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 2: vnx::read(in, value.txid, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.method, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.args, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.user, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.deposit, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::exec_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_exec_entry_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::exec_entry_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(12);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write_value(_buf + 4, value.time_stamp);\n\tvnx::write(out, value.txid, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.method, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.args, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.user, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.deposit, type_code, type_code->fields[6].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::exec_entry_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::exec_entry_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::exec_entry_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::exec_entry_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::exec_entry_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/exec_error_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/exec_error_t.hxx>\n#include <mmx/hash_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nconst uint32_t exec_error_t::MAX_MESSAGE_LENGTH;\n\nconst vnx::Hash64 exec_error_t::VNX_TYPE_HASH(0x5cd84f2d984d4bfull);\nconst vnx::Hash64 exec_error_t::VNX_CODE_HASH(0xe63ddc3bb4a33205ull);\n\nvnx::Hash64 exec_error_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string exec_error_t::get_type_name() const {\n\treturn \"mmx.exec_error_t\";\n}\n\nconst vnx::TypeCode* exec_error_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_exec_error_t;\n}\n\nstd::shared_ptr<exec_error_t> exec_error_t::create() {\n\treturn std::make_shared<exec_error_t>();\n}\n\nstd::shared_ptr<exec_error_t> exec_error_t::clone() const {\n\treturn std::make_shared<exec_error_t>(*this);\n}\n\nvoid exec_error_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid exec_error_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid exec_error_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_exec_error_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, code);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, operation);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, line);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, message);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid exec_error_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"code\\\": \"; vnx::write(_out, code);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"operation\\\": \"; vnx::write(_out, operation);\n\t_out << \", \\\"line\\\": \"; vnx::write(_out, line);\n\t_out << \", \\\"message\\\": \"; vnx::write(_out, message);\n\t_out << \"}\";\n}\n\nvoid exec_error_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object exec_error_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.exec_error_t\";\n\t_object[\"code\"] = code;\n\t_object[\"address\"] = address;\n\t_object[\"operation\"] = operation;\n\t_object[\"line\"] = line;\n\t_object[\"message\"] = message;\n\treturn _object;\n}\n\nvoid exec_error_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"code\") {\n\t\t\t_entry.second.to(code);\n\t\t} else if(_entry.first == \"line\") {\n\t\t\t_entry.second.to(line);\n\t\t} else if(_entry.first == \"message\") {\n\t\t\t_entry.second.to(message);\n\t\t} else if(_entry.first == \"operation\") {\n\t\t\t_entry.second.to(operation);\n\t\t}\n\t}\n}\n\nvnx::Variant exec_error_t::get_field(const std::string& _name) const {\n\tif(_name == \"code\") {\n\t\treturn vnx::Variant(code);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"operation\") {\n\t\treturn vnx::Variant(operation);\n\t}\n\tif(_name == \"line\") {\n\t\treturn vnx::Variant(line);\n\t}\n\tif(_name == \"message\") {\n\t\treturn vnx::Variant(message);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid exec_error_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"code\") {\n\t\t_value.to(code);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"operation\") {\n\t\t_value.to(operation);\n\t} else if(_name == \"line\") {\n\t\t_value.to(line);\n\t} else if(_name == \"message\") {\n\t\t_value.to(message);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const exec_error_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, exec_error_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* exec_error_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> exec_error_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.exec_error_t\";\n\ttype_code->type_hash = vnx::Hash64(0x5cd84f2d984d4bfull);\n\ttype_code->code_hash = vnx::Hash64(0xe63ddc3bb4a33205ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::exec_error_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<exec_error_t>>(); };\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"code\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"address\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"operation\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"line\";\n\t\tfield.code = {33, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"message\";\n\t\tfield.code = {32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::exec_error_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.code, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.address, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.operation, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 3: vnx::read(in, value.line, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.message, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::exec_error_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_exec_error_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::exec_error_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(12);\n\tvnx::write_value(_buf + 0, value.code);\n\tvnx::write_value(_buf + 4, value.address);\n\tvnx::write_value(_buf + 8, value.operation);\n\tvnx::write(out, value.line, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.message, type_code, type_code->fields[4].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::exec_error_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::exec_error_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::exec_error_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::exec_error_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::exec_error_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/exec_result_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/exec_result_t.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/exec_error_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/txin_t.hxx>\n#include <mmx/txout_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 exec_result_t::VNX_TYPE_HASH(0x18fe02e2374b039eull);\nconst vnx::Hash64 exec_result_t::VNX_CODE_HASH(0xa116d6139487cc21ull);\n\nvnx::Hash64 exec_result_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string exec_result_t::get_type_name() const {\n\treturn \"mmx.exec_result_t\";\n}\n\nconst vnx::TypeCode* exec_result_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_exec_result_t;\n}\n\nstd::shared_ptr<exec_result_t> exec_result_t::create() {\n\treturn std::make_shared<exec_result_t>();\n}\n\nstd::shared_ptr<exec_result_t> exec_result_t::clone() const {\n\treturn std::make_shared<exec_result_t>(*this);\n}\n\nvoid exec_result_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid exec_result_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid exec_result_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_exec_result_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, did_fail);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, total_cost);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, total_fee);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, inputs);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, outputs);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, error);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid exec_result_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"did_fail\\\": \"; vnx::write(_out, did_fail);\n\t_out << \", \\\"total_cost\\\": \"; vnx::write(_out, total_cost);\n\t_out << \", \\\"total_fee\\\": \"; vnx::write(_out, total_fee);\n\t_out << \", \\\"inputs\\\": \"; vnx::write(_out, inputs);\n\t_out << \", \\\"outputs\\\": \"; vnx::write(_out, outputs);\n\t_out << \", \\\"error\\\": \"; vnx::write(_out, error);\n\t_out << \"}\";\n}\n\nvoid exec_result_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object exec_result_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.exec_result_t\";\n\t_object[\"did_fail\"] = did_fail;\n\t_object[\"total_cost\"] = total_cost;\n\t_object[\"total_fee\"] = total_fee;\n\t_object[\"inputs\"] = inputs;\n\t_object[\"outputs\"] = outputs;\n\t_object[\"error\"] = error;\n\treturn _object;\n}\n\nvoid exec_result_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"did_fail\") {\n\t\t\t_entry.second.to(did_fail);\n\t\t} else if(_entry.first == \"error\") {\n\t\t\t_entry.second.to(error);\n\t\t} else if(_entry.first == \"inputs\") {\n\t\t\t_entry.second.to(inputs);\n\t\t} else if(_entry.first == \"outputs\") {\n\t\t\t_entry.second.to(outputs);\n\t\t} else if(_entry.first == \"total_cost\") {\n\t\t\t_entry.second.to(total_cost);\n\t\t} else if(_entry.first == \"total_fee\") {\n\t\t\t_entry.second.to(total_fee);\n\t\t}\n\t}\n}\n\nvnx::Variant exec_result_t::get_field(const std::string& _name) const {\n\tif(_name == \"did_fail\") {\n\t\treturn vnx::Variant(did_fail);\n\t}\n\tif(_name == \"total_cost\") {\n\t\treturn vnx::Variant(total_cost);\n\t}\n\tif(_name == \"total_fee\") {\n\t\treturn vnx::Variant(total_fee);\n\t}\n\tif(_name == \"inputs\") {\n\t\treturn vnx::Variant(inputs);\n\t}\n\tif(_name == \"outputs\") {\n\t\treturn vnx::Variant(outputs);\n\t}\n\tif(_name == \"error\") {\n\t\treturn vnx::Variant(error);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid exec_result_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"did_fail\") {\n\t\t_value.to(did_fail);\n\t} else if(_name == \"total_cost\") {\n\t\t_value.to(total_cost);\n\t} else if(_name == \"total_fee\") {\n\t\t_value.to(total_fee);\n\t} else if(_name == \"inputs\") {\n\t\t_value.to(inputs);\n\t} else if(_name == \"outputs\") {\n\t\t_value.to(outputs);\n\t} else if(_name == \"error\") {\n\t\t_value.to(error);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const exec_result_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, exec_result_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* exec_result_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> exec_result_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.exec_result_t\";\n\ttype_code->type_hash = vnx::Hash64(0x18fe02e2374b039eull);\n\ttype_code->code_hash = vnx::Hash64(0xa116d6139487cc21ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::exec_result_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<exec_result_t>>(); };\n\ttype_code->depends.resize(3);\n\ttype_code->depends[0] = ::mmx::txin_t::static_get_type_code();\n\ttype_code->depends[1] = ::mmx::txout_t::static_get_type_code();\n\ttype_code->depends[2] = ::mmx::exec_error_t::static_get_type_code();\n\ttype_code->fields.resize(6);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"did_fail\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"total_cost\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"total_fee\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"inputs\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"outputs\";\n\t\tfield.code = {12, 19, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"error\";\n\t\tfield.code = {33, 19, 2};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::exec_result_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.did_fail, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_fee, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 3: vnx::read(in, value.inputs, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.outputs, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.error, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::exec_result_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_exec_result_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::exec_result_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(9);\n\tvnx::write_value(_buf + 0, value.did_fail);\n\tvnx::write_value(_buf + 1, value.total_cost);\n\tvnx::write_value(_buf + 5, value.total_fee);\n\tvnx::write(out, value.inputs, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.outputs, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.error, type_code, type_code->fields[5].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::exec_result_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::exec_result_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::exec_result_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::exec_result_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::exec_result_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/farmed_block_info_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/farmed_block_info_t.hxx>\n#include <mmx/addr_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 farmed_block_info_t::VNX_TYPE_HASH(0x2e10154a52617b19ull);\nconst vnx::Hash64 farmed_block_info_t::VNX_CODE_HASH(0xf131225aa531d24dull);\n\nvnx::Hash64 farmed_block_info_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string farmed_block_info_t::get_type_name() const {\n\treturn \"mmx.farmed_block_info_t\";\n}\n\nconst vnx::TypeCode* farmed_block_info_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_farmed_block_info_t;\n}\n\nstd::shared_ptr<farmed_block_info_t> farmed_block_info_t::create() {\n\treturn std::make_shared<farmed_block_info_t>();\n}\n\nstd::shared_ptr<farmed_block_info_t> farmed_block_info_t::clone() const {\n\treturn std::make_shared<farmed_block_info_t>(*this);\n}\n\nvoid farmed_block_info_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid farmed_block_info_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid farmed_block_info_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_farmed_block_info_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, reward);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, reward_addr);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid farmed_block_info_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"reward\\\": \"; vnx::write(_out, reward);\n\t_out << \", \\\"reward_addr\\\": \"; vnx::write(_out, reward_addr);\n\t_out << \"}\";\n}\n\nvoid farmed_block_info_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object farmed_block_info_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.farmed_block_info_t\";\n\t_object[\"height\"] = height;\n\t_object[\"reward\"] = reward;\n\t_object[\"reward_addr\"] = reward_addr;\n\treturn _object;\n}\n\nvoid farmed_block_info_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"reward\") {\n\t\t\t_entry.second.to(reward);\n\t\t} else if(_entry.first == \"reward_addr\") {\n\t\t\t_entry.second.to(reward_addr);\n\t\t}\n\t}\n}\n\nvnx::Variant farmed_block_info_t::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"reward\") {\n\t\treturn vnx::Variant(reward);\n\t}\n\tif(_name == \"reward_addr\") {\n\t\treturn vnx::Variant(reward_addr);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid farmed_block_info_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"reward\") {\n\t\t_value.to(reward);\n\t} else if(_name == \"reward_addr\") {\n\t\t_value.to(reward_addr);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const farmed_block_info_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, farmed_block_info_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* farmed_block_info_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> farmed_block_info_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.farmed_block_info_t\";\n\ttype_code->type_hash = vnx::Hash64(0x2e10154a52617b19ull);\n\ttype_code->code_hash = vnx::Hash64(0xf131225aa531d24dull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::farmed_block_info_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<farmed_block_info_t>>(); };\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"reward\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_addr\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::farmed_block_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.reward, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 2: vnx::read(in, value.reward_addr, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::farmed_block_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_farmed_block_info_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::farmed_block_info_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write_value(_buf + 4, value.reward);\n\tvnx::write(out, value.reward_addr, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::farmed_block_info_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::farmed_block_info_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::farmed_block_info_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::farmed_block_info_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::farmed_block_info_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/farmed_block_summary_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/farmed_block_summary_t.hxx>\n#include <mmx/addr_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 farmed_block_summary_t::VNX_TYPE_HASH(0x9fe2bac01782721dull);\nconst vnx::Hash64 farmed_block_summary_t::VNX_CODE_HASH(0x8349f56d71a75ef6ull);\n\nvnx::Hash64 farmed_block_summary_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string farmed_block_summary_t::get_type_name() const {\n\treturn \"mmx.farmed_block_summary_t\";\n}\n\nconst vnx::TypeCode* farmed_block_summary_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_farmed_block_summary_t;\n}\n\nstd::shared_ptr<farmed_block_summary_t> farmed_block_summary_t::create() {\n\treturn std::make_shared<farmed_block_summary_t>();\n}\n\nstd::shared_ptr<farmed_block_summary_t> farmed_block_summary_t::clone() const {\n\treturn std::make_shared<farmed_block_summary_t>(*this);\n}\n\nvoid farmed_block_summary_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid farmed_block_summary_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid farmed_block_summary_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_farmed_block_summary_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, num_blocks);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, last_height);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, total_rewards);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, reward_map);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid farmed_block_summary_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"num_blocks\\\": \"; vnx::write(_out, num_blocks);\n\t_out << \", \\\"last_height\\\": \"; vnx::write(_out, last_height);\n\t_out << \", \\\"total_rewards\\\": \"; vnx::write(_out, total_rewards);\n\t_out << \", \\\"reward_map\\\": \"; vnx::write(_out, reward_map);\n\t_out << \"}\";\n}\n\nvoid farmed_block_summary_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object farmed_block_summary_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.farmed_block_summary_t\";\n\t_object[\"num_blocks\"] = num_blocks;\n\t_object[\"last_height\"] = last_height;\n\t_object[\"total_rewards\"] = total_rewards;\n\t_object[\"reward_map\"] = reward_map;\n\treturn _object;\n}\n\nvoid farmed_block_summary_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"last_height\") {\n\t\t\t_entry.second.to(last_height);\n\t\t} else if(_entry.first == \"num_blocks\") {\n\t\t\t_entry.second.to(num_blocks);\n\t\t} else if(_entry.first == \"reward_map\") {\n\t\t\t_entry.second.to(reward_map);\n\t\t} else if(_entry.first == \"total_rewards\") {\n\t\t\t_entry.second.to(total_rewards);\n\t\t}\n\t}\n}\n\nvnx::Variant farmed_block_summary_t::get_field(const std::string& _name) const {\n\tif(_name == \"num_blocks\") {\n\t\treturn vnx::Variant(num_blocks);\n\t}\n\tif(_name == \"last_height\") {\n\t\treturn vnx::Variant(last_height);\n\t}\n\tif(_name == \"total_rewards\") {\n\t\treturn vnx::Variant(total_rewards);\n\t}\n\tif(_name == \"reward_map\") {\n\t\treturn vnx::Variant(reward_map);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid farmed_block_summary_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"num_blocks\") {\n\t\t_value.to(num_blocks);\n\t} else if(_name == \"last_height\") {\n\t\t_value.to(last_height);\n\t} else if(_name == \"total_rewards\") {\n\t\t_value.to(total_rewards);\n\t} else if(_name == \"reward_map\") {\n\t\t_value.to(reward_map);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const farmed_block_summary_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, farmed_block_summary_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* farmed_block_summary_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> farmed_block_summary_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.farmed_block_summary_t\";\n\ttype_code->type_hash = vnx::Hash64(0x9fe2bac01782721dull);\n\ttype_code->code_hash = vnx::Hash64(0x8349f56d71a75ef6ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::farmed_block_summary_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<farmed_block_summary_t>>(); };\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"num_blocks\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"last_height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"total_rewards\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_map\";\n\t\tfield.code = {13, 5, 11, 32, 1, 4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::farmed_block_summary_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.num_blocks, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.last_height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_rewards, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 3: vnx::read(in, value.reward_map, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::farmed_block_summary_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_farmed_block_summary_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::farmed_block_summary_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(16);\n\tvnx::write_value(_buf + 0, value.num_blocks);\n\tvnx::write_value(_buf + 4, value.last_height);\n\tvnx::write_value(_buf + 8, value.total_rewards);\n\tvnx::write(out, value.reward_map, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::farmed_block_summary_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::farmed_block_summary_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::farmed_block_summary_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::farmed_block_summary_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::farmed_block_summary_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/node_info_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/node_info_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/node_type_e.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 node_info_t::VNX_TYPE_HASH(0xda45b5e3a527588eull);\nconst vnx::Hash64 node_info_t::VNX_CODE_HASH(0xa5e1afc5dbd3ecf5ull);\n\nvnx::Hash64 node_info_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string node_info_t::get_type_name() const {\n\treturn \"mmx.node_info_t\";\n}\n\nconst vnx::TypeCode* node_info_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_node_info_t;\n}\n\nstd::shared_ptr<node_info_t> node_info_t::create() {\n\treturn std::make_shared<node_info_t>();\n}\n\nstd::shared_ptr<node_info_t> node_info_t::clone() const {\n\treturn std::make_shared<node_info_t>(*this);\n}\n\nvoid node_info_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid node_info_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid node_info_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_node_info_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, id);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, type);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid node_info_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"type\\\": \"; vnx::write(_out, type);\n\t_out << \"}\";\n}\n\nvoid node_info_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object node_info_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.node_info_t\";\n\t_object[\"id\"] = id;\n\t_object[\"version\"] = version;\n\t_object[\"type\"] = type;\n\treturn _object;\n}\n\nvoid node_info_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t} else if(_entry.first == \"type\") {\n\t\t\t_entry.second.to(type);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant node_info_t::get_field(const std::string& _name) const {\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"type\") {\n\t\treturn vnx::Variant(type);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid node_info_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"id\") {\n\t\t_value.to(id);\n\t} else if(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"type\") {\n\t\t_value.to(type);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const node_info_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, node_info_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* node_info_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> node_info_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.node_info_t\";\n\ttype_code->type_hash = vnx::Hash64(0xda45b5e3a527588eull);\n\ttype_code->code_hash = vnx::Hash64(0xa5e1afc5dbd3ecf5ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::node_info_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<node_info_t>>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::node_type_e::static_get_type_code();\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::node_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.id, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.type, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::node_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_node_info_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::node_info_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.version);\n\tvnx::write(out, value.id, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.type, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::node_info_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::node_info_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::node_info_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::node_info_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::node_info_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/node_type_e.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/node_type_e.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 node_type_e::VNX_TYPE_HASH(0xa5de458f1ce5539aull);\nconst vnx::Hash64 node_type_e::VNX_CODE_HASH(0xbf2f8dd8ae8b1079ull);\n\nvnx::Hash64 node_type_e::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string node_type_e::get_type_name() const {\n\treturn \"mmx.node_type_e\";\n}\n\nconst vnx::TypeCode* node_type_e::get_type_code() const {\n\treturn mmx::vnx_native_type_code_node_type_e;\n}\n\nstd::shared_ptr<node_type_e> node_type_e::create() {\n\treturn std::make_shared<node_type_e>();\n}\n\nstd::shared_ptr<node_type_e> node_type_e::clone() const {\n\treturn std::make_shared<node_type_e>(*this);\n}\n\nvoid node_type_e::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid node_type_e::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvnx::bool_t node_type_e::is_valid() const {\n\tswitch(value) {\n\t\tcase API_CLIENT: return true;\n\t\tcase FULL_NODE: return true;\n\t\tcase LIGHT_NODE: return true;\n\t}\n\treturn false;\n}\n\nstd::string node_type_e::to_string() const {\n\tswitch(value) {\n\t\tcase API_CLIENT: return \"\\\"API_CLIENT\\\"\";\n\t\tcase FULL_NODE: return \"\\\"FULL_NODE\\\"\";\n\t\tcase LIGHT_NODE: return \"\\\"LIGHT_NODE\\\"\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string node_type_e::to_string_value() const {\n\tswitch(value) {\n\t\tcase API_CLIENT: return \"API_CLIENT\";\n\t\tcase FULL_NODE: return \"FULL_NODE\";\n\t\tcase LIGHT_NODE: return \"LIGHT_NODE\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string node_type_e::to_string_value_full() const {\n\tswitch(value) {\n\t\tcase API_CLIENT: return \"mmx.node_type_e.API_CLIENT\";\n\t\tcase FULL_NODE: return \"mmx.node_type_e.FULL_NODE\";\n\t\tcase LIGHT_NODE: return \"mmx.node_type_e.LIGHT_NODE\";\n\t}\n\treturn std::to_string(value);\n}\n\nvoid node_type_e::from_string(const std::string& _str) {\n\tstd::string _name;\n\tvnx::from_string(_str, _name);\n\tfrom_string_value(_name);\n}\n\nvoid node_type_e::from_string_value(const std::string& _name) {\n\tvnx::Variant var;\n\tvnx::from_string_value(_name, var);\n\tif(var.is_string()) {\n\t\tif(_name == \"API_CLIENT\") value = API_CLIENT;\n\t\telse if(_name == \"FULL_NODE\") value = FULL_NODE;\n\t\telse if(_name == \"LIGHT_NODE\") value = LIGHT_NODE;\n\t\telse value = enum_t(vnx::hash64(_name));\n\t} else {\n\t\tvalue = enum_t(std::stoul(_name.c_str(), nullptr, 0));\n\t}\n}\n\nvoid node_type_e::accept(vnx::Visitor& _visitor) const {\n\tstd::string _name;\n\tswitch(value) {\n\t\tcase API_CLIENT: _name = \"API_CLIENT\"; break;\n\t\tcase FULL_NODE: _name = \"FULL_NODE\"; break;\n\t\tcase LIGHT_NODE: _name = \"LIGHT_NODE\"; break;\n\t}\n\t_visitor.enum_value(value, _name);\n}\n\nvoid node_type_e::write(std::ostream& _out) const {\n\tswitch(value) {\n\t\tcase API_CLIENT: _out << \"\\\"API_CLIENT\\\"\"; break;\n\t\tcase FULL_NODE: _out << \"\\\"FULL_NODE\\\"\"; break;\n\t\tcase LIGHT_NODE: _out << \"\\\"LIGHT_NODE\\\"\"; break;\n\t\tdefault: _out << value;\n\t}\n}\n\nvoid node_type_e::read(std::istream& _in) {\n\tfrom_string_value(vnx::read(_in).to_string_value());\n}\n\nvnx::Object node_type_e::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.node_type_e\";\n\t_object[\"value\"] = value;\n\treturn _object;\n}\n\nvoid node_type_e::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"value\") {\n\t\t\t_entry.second.to(value);\n\t\t}\n\t}\n}\n\nvnx::Variant node_type_e::get_field(const std::string& _name) const {\n\tif(_name == \"value\") {\n\t\treturn vnx::Variant(value);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid node_type_e::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"value\") {\n\t\t_value.to(value);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const node_type_e& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, node_type_e& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* node_type_e::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> node_type_e::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.node_type_e\";\n\ttype_code->type_hash = vnx::Hash64(0xa5de458f1ce5539aull);\n\ttype_code->code_hash = vnx::Hash64(0xbf2f8dd8ae8b1079ull);\n\ttype_code->is_native = true;\n\ttype_code->is_enum = true;\n\ttype_code->native_size = sizeof(::mmx::node_type_e);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<node_type_e>>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"value\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->enum_map[1802393446] = \"API_CLIENT\";\n\ttype_code->enum_map[2903686019] = \"FULL_NODE\";\n\ttype_code->enum_map[3477499945] = \"LIGHT_NODE\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::node_type_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tVariant tmp;\n\t\tvnx::read(in, tmp, type_code, code);\n\t\tif(tmp.is_string()) {\n\t\t\tvnx::from_string(tmp.to_string(), value);\n\t\t} else if(tmp.is_ulong()) {\n\t\t\tvalue = ::mmx::node_type_e::enum_t(tmp.to<uint32_t>());\n\t\t} else {\n\t\t\tvalue = ::mmx::node_type_e();\n\t\t}\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.value, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::node_type_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_STRING) {\n\t\tvnx::write(out, value.to_string_value(), nullptr, code);\n\t\treturn;\n\t}\n\tif(code && code[0] == CODE_UINT32) {\n\t\tvnx::write(out, value.value, nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_node_type_e;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::node_type_e>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.value);\n}\n\nvoid read(std::istream& in, ::mmx::node_type_e& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::node_type_e& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::node_type_e& value) {\n\tvalue.accept(visitor);\n}\n\nvoid read(TypeInput& in, ::mmx::node_type_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tuint32_t tmp = 0;\n\tvnx::read(in, tmp, type_code, code);\n\tvalue = ::mmx::node_type_e::enum_t(tmp);\n}\n\nvoid write(TypeOutput& out, const ::mmx::node_type_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tvnx::write(out, uint32_t(value), type_code, code);\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::node_type_e& _value) {\n\treturn _value.to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::node_type_e& _value) {\n\treturn _value.to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::node_type_e& _value) {\n\treturn _value.to_string_value_full();\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::node_type_e::enum_t& _value) {\n\treturn ::mmx::node_type_e(_value).to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::node_type_e::enum_t& _value) {\n\treturn ::mmx::node_type_e(_value).to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::node_type_e::enum_t& _value) {\n\treturn ::mmx::node_type_e(_value).to_string_value_full();\n}\n\nbool is_equivalent<::mmx::node_type_e>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::node_type_e::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/offer_data_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 offer_data_t::VNX_TYPE_HASH(0xc97a08a709a5f1efull);\nconst vnx::Hash64 offer_data_t::VNX_CODE_HASH(0x2d42a286fdb37006ull);\n\nvnx::Hash64 offer_data_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string offer_data_t::get_type_name() const {\n\treturn \"mmx.offer_data_t\";\n}\n\nconst vnx::TypeCode* offer_data_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_offer_data_t;\n}\n\nstd::shared_ptr<offer_data_t> offer_data_t::create() {\n\treturn std::make_shared<offer_data_t>();\n}\n\nstd::shared_ptr<offer_data_t> offer_data_t::clone() const {\n\treturn std::make_shared<offer_data_t>(*this);\n}\n\nvoid offer_data_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid offer_data_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid offer_data_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_offer_data_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, last_update);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, owner);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, partner);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, bid_currency);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, ask_currency);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, bid_balance);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, ask_balance);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, ask_amount);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, inv_price);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, price);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid offer_data_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"last_update\\\": \"; vnx::write(_out, last_update);\n\t_out << \", \\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"owner\\\": \"; vnx::write(_out, owner);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"partner\\\": \"; vnx::write(_out, partner);\n\t_out << \", \\\"bid_currency\\\": \"; vnx::write(_out, bid_currency);\n\t_out << \", \\\"ask_currency\\\": \"; vnx::write(_out, ask_currency);\n\t_out << \", \\\"bid_balance\\\": \"; vnx::write(_out, bid_balance);\n\t_out << \", \\\"ask_balance\\\": \"; vnx::write(_out, ask_balance);\n\t_out << \", \\\"ask_amount\\\": \"; vnx::write(_out, ask_amount);\n\t_out << \", \\\"inv_price\\\": \"; vnx::write(_out, inv_price);\n\t_out << \", \\\"price\\\": \"; vnx::write(_out, price);\n\t_out << \"}\";\n}\n\nvoid offer_data_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object offer_data_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.offer_data_t\";\n\t_object[\"height\"] = height;\n\t_object[\"last_update\"] = last_update;\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"owner\"] = owner;\n\t_object[\"address\"] = address;\n\t_object[\"partner\"] = partner;\n\t_object[\"bid_currency\"] = bid_currency;\n\t_object[\"ask_currency\"] = ask_currency;\n\t_object[\"bid_balance\"] = bid_balance;\n\t_object[\"ask_balance\"] = ask_balance;\n\t_object[\"ask_amount\"] = ask_amount;\n\t_object[\"inv_price\"] = inv_price;\n\t_object[\"price\"] = price;\n\treturn _object;\n}\n\nvoid offer_data_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"ask_amount\") {\n\t\t\t_entry.second.to(ask_amount);\n\t\t} else if(_entry.first == \"ask_balance\") {\n\t\t\t_entry.second.to(ask_balance);\n\t\t} else if(_entry.first == \"ask_currency\") {\n\t\t\t_entry.second.to(ask_currency);\n\t\t} else if(_entry.first == \"bid_balance\") {\n\t\t\t_entry.second.to(bid_balance);\n\t\t} else if(_entry.first == \"bid_currency\") {\n\t\t\t_entry.second.to(bid_currency);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"inv_price\") {\n\t\t\t_entry.second.to(inv_price);\n\t\t} else if(_entry.first == \"last_update\") {\n\t\t\t_entry.second.to(last_update);\n\t\t} else if(_entry.first == \"owner\") {\n\t\t\t_entry.second.to(owner);\n\t\t} else if(_entry.first == \"partner\") {\n\t\t\t_entry.second.to(partner);\n\t\t} else if(_entry.first == \"price\") {\n\t\t\t_entry.second.to(price);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t}\n\t}\n}\n\nvnx::Variant offer_data_t::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"last_update\") {\n\t\treturn vnx::Variant(last_update);\n\t}\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"owner\") {\n\t\treturn vnx::Variant(owner);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"partner\") {\n\t\treturn vnx::Variant(partner);\n\t}\n\tif(_name == \"bid_currency\") {\n\t\treturn vnx::Variant(bid_currency);\n\t}\n\tif(_name == \"ask_currency\") {\n\t\treturn vnx::Variant(ask_currency);\n\t}\n\tif(_name == \"bid_balance\") {\n\t\treturn vnx::Variant(bid_balance);\n\t}\n\tif(_name == \"ask_balance\") {\n\t\treturn vnx::Variant(ask_balance);\n\t}\n\tif(_name == \"ask_amount\") {\n\t\treturn vnx::Variant(ask_amount);\n\t}\n\tif(_name == \"inv_price\") {\n\t\treturn vnx::Variant(inv_price);\n\t}\n\tif(_name == \"price\") {\n\t\treturn vnx::Variant(price);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid offer_data_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"last_update\") {\n\t\t_value.to(last_update);\n\t} else if(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"owner\") {\n\t\t_value.to(owner);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"partner\") {\n\t\t_value.to(partner);\n\t} else if(_name == \"bid_currency\") {\n\t\t_value.to(bid_currency);\n\t} else if(_name == \"ask_currency\") {\n\t\t_value.to(ask_currency);\n\t} else if(_name == \"bid_balance\") {\n\t\t_value.to(bid_balance);\n\t} else if(_name == \"ask_balance\") {\n\t\t_value.to(ask_balance);\n\t} else if(_name == \"ask_amount\") {\n\t\t_value.to(ask_amount);\n\t} else if(_name == \"inv_price\") {\n\t\t_value.to(inv_price);\n\t} else if(_name == \"price\") {\n\t\t_value.to(price);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const offer_data_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, offer_data_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* offer_data_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> offer_data_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.offer_data_t\";\n\ttype_code->type_hash = vnx::Hash64(0xc97a08a709a5f1efull);\n\ttype_code->code_hash = vnx::Hash64(0x2d42a286fdb37006ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::offer_data_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<offer_data_t>>(); };\n\ttype_code->fields.resize(13);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"last_update\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"owner\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"partner\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"bid_currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"ask_currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"bid_balance\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"ask_balance\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"ask_amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"inv_price\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"price\";\n\t\tfield.code = {10};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::offer_data_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.last_update, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_stamp, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[12]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.price, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 3: vnx::read(in, value.owner, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.partner, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.bid_currency, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.ask_currency, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.bid_balance, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.ask_balance, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.ask_amount, type_code, _field->code.data()); break;\n\t\t\tcase 11: vnx::read(in, value.inv_price, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::offer_data_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_offer_data_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::offer_data_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(24);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write_value(_buf + 4, value.last_update);\n\tvnx::write_value(_buf + 8, value.time_stamp);\n\tvnx::write_value(_buf + 16, value.price);\n\tvnx::write(out, value.owner, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.address, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.partner, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.bid_currency, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.ask_currency, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.bid_balance, type_code, type_code->fields[8].code.data());\n\tvnx::write(out, value.ask_balance, type_code, type_code->fields[9].code.data());\n\tvnx::write(out, value.ask_amount, type_code, type_code->fields[10].code.data());\n\tvnx::write(out, value.inv_price, type_code, type_code->fields[11].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::offer_data_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::offer_data_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::offer_data_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::offer_data_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::offer_data_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/package.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/Block.hxx>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/Challenge.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/FarmInfo.hxx>\n#include <mmx/FarmerBase.hxx>\n#include <mmx/Farmer_get_farm_info.hxx>\n#include <mmx/Farmer_get_farm_info_return.hxx>\n#include <mmx/Farmer_get_farmer_keys.hxx>\n#include <mmx/Farmer_get_farmer_keys_return.hxx>\n#include <mmx/Farmer_get_mac_addr.hxx>\n#include <mmx/Farmer_get_mac_addr_return.hxx>\n#include <mmx/Farmer_get_partial_diff.hxx>\n#include <mmx/Farmer_get_partial_diff_return.hxx>\n#include <mmx/Farmer_get_partial_diffs.hxx>\n#include <mmx/Farmer_get_partial_diffs_return.hxx>\n#include <mmx/Farmer_sign_block.hxx>\n#include <mmx/Farmer_sign_block_return.hxx>\n#include <mmx/Farmer_sign_vote.hxx>\n#include <mmx/Farmer_sign_vote_return.hxx>\n#include <mmx/HarvesterBase.hxx>\n#include <mmx/Harvester_add_plot_dir.hxx>\n#include <mmx/Harvester_add_plot_dir_return.hxx>\n#include <mmx/Harvester_get_farm_info.hxx>\n#include <mmx/Harvester_get_farm_info_return.hxx>\n#include <mmx/Harvester_get_total_bytes.hxx>\n#include <mmx/Harvester_get_total_bytes_return.hxx>\n#include <mmx/Harvester_reload.hxx>\n#include <mmx/Harvester_reload_return.hxx>\n#include <mmx/Harvester_rem_plot_dir.hxx>\n#include <mmx/Harvester_rem_plot_dir_return.hxx>\n#include <mmx/IntervalRequest.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/LookupInfo.hxx>\n#include <mmx/NetworkInfo.hxx>\n#include <mmx/NodeBase.hxx>\n#include <mmx/Node_add_block.hxx>\n#include <mmx/Node_add_block_return.hxx>\n#include <mmx/Node_add_transaction.hxx>\n#include <mmx/Node_add_transaction_return.hxx>\n#include <mmx/Node_call_contract.hxx>\n#include <mmx/Node_call_contract_return.hxx>\n#include <mmx/Node_dump_storage.hxx>\n#include <mmx/Node_dump_storage_return.hxx>\n#include <mmx/Node_fetch_offers.hxx>\n#include <mmx/Node_fetch_offers_return.hxx>\n#include <mmx/Node_get_all_balances.hxx>\n#include <mmx/Node_get_all_balances_return.hxx>\n#include <mmx/Node_get_balance.hxx>\n#include <mmx/Node_get_balance_return.hxx>\n#include <mmx/Node_get_balances.hxx>\n#include <mmx/Node_get_balances_return.hxx>\n#include <mmx/Node_get_block.hxx>\n#include <mmx/Node_get_block_return.hxx>\n#include <mmx/Node_get_block_at.hxx>\n#include <mmx/Node_get_block_at_return.hxx>\n#include <mmx/Node_get_block_hash.hxx>\n#include <mmx/Node_get_block_hash_return.hxx>\n#include <mmx/Node_get_block_hash_ex.hxx>\n#include <mmx/Node_get_block_hash_ex_return.hxx>\n#include <mmx/Node_get_contract.hxx>\n#include <mmx/Node_get_contract_return.hxx>\n#include <mmx/Node_get_contract_balances.hxx>\n#include <mmx/Node_get_contract_balances_return.hxx>\n#include <mmx/Node_get_contract_for.hxx>\n#include <mmx/Node_get_contract_for_return.hxx>\n#include <mmx/Node_get_contracts.hxx>\n#include <mmx/Node_get_contracts_return.hxx>\n#include <mmx/Node_get_contracts_by.hxx>\n#include <mmx/Node_get_contracts_by_return.hxx>\n#include <mmx/Node_get_contracts_owned_by.hxx>\n#include <mmx/Node_get_contracts_owned_by_return.hxx>\n#include <mmx/Node_get_exec_history.hxx>\n#include <mmx/Node_get_exec_history_return.hxx>\n#include <mmx/Node_get_farmed_block_summary.hxx>\n#include <mmx/Node_get_farmed_block_summary_return.hxx>\n#include <mmx/Node_get_farmed_blocks.hxx>\n#include <mmx/Node_get_farmed_blocks_return.hxx>\n#include <mmx/Node_get_farmer_ranking.hxx>\n#include <mmx/Node_get_farmer_ranking_return.hxx>\n#include <mmx/Node_get_genesis_hash.hxx>\n#include <mmx/Node_get_genesis_hash_return.hxx>\n#include <mmx/Node_get_header.hxx>\n#include <mmx/Node_get_header_return.hxx>\n#include <mmx/Node_get_header_at.hxx>\n#include <mmx/Node_get_header_at_return.hxx>\n#include <mmx/Node_get_height.hxx>\n#include <mmx/Node_get_height_return.hxx>\n#include <mmx/Node_get_history.hxx>\n#include <mmx/Node_get_history_return.hxx>\n#include <mmx/Node_get_history_memo.hxx>\n#include <mmx/Node_get_history_memo_return.hxx>\n#include <mmx/Node_get_network_info.hxx>\n#include <mmx/Node_get_network_info_return.hxx>\n#include <mmx/Node_get_offer.hxx>\n#include <mmx/Node_get_offer_return.hxx>\n#include <mmx/Node_get_offers.hxx>\n#include <mmx/Node_get_offers_return.hxx>\n#include <mmx/Node_get_offers_by.hxx>\n#include <mmx/Node_get_offers_by_return.hxx>\n#include <mmx/Node_get_params.hxx>\n#include <mmx/Node_get_params_return.hxx>\n#include <mmx/Node_get_plot_nft_info.hxx>\n#include <mmx/Node_get_plot_nft_info_return.hxx>\n#include <mmx/Node_get_plot_nft_target.hxx>\n#include <mmx/Node_get_plot_nft_target_return.hxx>\n#include <mmx/Node_get_recent_offers.hxx>\n#include <mmx/Node_get_recent_offers_return.hxx>\n#include <mmx/Node_get_recent_offers_for.hxx>\n#include <mmx/Node_get_recent_offers_for_return.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity_return.hxx>\n#include <mmx/Node_get_swap_fees_earned.hxx>\n#include <mmx/Node_get_swap_fees_earned_return.hxx>\n#include <mmx/Node_get_swap_history.hxx>\n#include <mmx/Node_get_swap_history_return.hxx>\n#include <mmx/Node_get_swap_info.hxx>\n#include <mmx/Node_get_swap_info_return.hxx>\n#include <mmx/Node_get_swap_liquidity_by.hxx>\n#include <mmx/Node_get_swap_liquidity_by_return.hxx>\n#include <mmx/Node_get_swap_trade_estimate.hxx>\n#include <mmx/Node_get_swap_trade_estimate_return.hxx>\n#include <mmx/Node_get_swap_user_info.hxx>\n#include <mmx/Node_get_swap_user_info_return.hxx>\n#include <mmx/Node_get_swaps.hxx>\n#include <mmx/Node_get_swaps_return.hxx>\n#include <mmx/Node_get_synced_height.hxx>\n#include <mmx/Node_get_synced_height_return.hxx>\n#include <mmx/Node_get_synced_vdf_height.hxx>\n#include <mmx/Node_get_synced_vdf_height_return.hxx>\n#include <mmx/Node_get_total_balance.hxx>\n#include <mmx/Node_get_total_balance_return.hxx>\n#include <mmx/Node_get_total_balances.hxx>\n#include <mmx/Node_get_total_balances_return.hxx>\n#include <mmx/Node_get_total_supply.hxx>\n#include <mmx/Node_get_total_supply_return.hxx>\n#include <mmx/Node_get_trade_history.hxx>\n#include <mmx/Node_get_trade_history_return.hxx>\n#include <mmx/Node_get_trade_history_for.hxx>\n#include <mmx/Node_get_trade_history_for_return.hxx>\n#include <mmx/Node_get_transaction.hxx>\n#include <mmx/Node_get_transaction_return.hxx>\n#include <mmx/Node_get_transactions.hxx>\n#include <mmx/Node_get_transactions_return.hxx>\n#include <mmx/Node_get_tx_height.hxx>\n#include <mmx/Node_get_tx_height_return.hxx>\n#include <mmx/Node_get_tx_ids.hxx>\n#include <mmx/Node_get_tx_ids_return.hxx>\n#include <mmx/Node_get_tx_ids_at.hxx>\n#include <mmx/Node_get_tx_ids_at_return.hxx>\n#include <mmx/Node_get_tx_ids_since.hxx>\n#include <mmx/Node_get_tx_ids_since_return.hxx>\n#include <mmx/Node_get_tx_info.hxx>\n#include <mmx/Node_get_tx_info_return.hxx>\n#include <mmx/Node_get_tx_info_for.hxx>\n#include <mmx/Node_get_tx_info_for_return.hxx>\n#include <mmx/Node_get_vdf_height.hxx>\n#include <mmx/Node_get_vdf_height_return.hxx>\n#include <mmx/Node_get_vdf_peak.hxx>\n#include <mmx/Node_get_vdf_peak_return.hxx>\n#include <mmx/Node_read_storage.hxx>\n#include <mmx/Node_read_storage_return.hxx>\n#include <mmx/Node_read_storage_array.hxx>\n#include <mmx/Node_read_storage_array_return.hxx>\n#include <mmx/Node_read_storage_entry_addr.hxx>\n#include <mmx/Node_read_storage_entry_addr_return.hxx>\n#include <mmx/Node_read_storage_entry_string.hxx>\n#include <mmx/Node_read_storage_entry_string_return.hxx>\n#include <mmx/Node_read_storage_entry_var.hxx>\n#include <mmx/Node_read_storage_entry_var_return.hxx>\n#include <mmx/Node_read_storage_field.hxx>\n#include <mmx/Node_read_storage_field_return.hxx>\n#include <mmx/Node_read_storage_map.hxx>\n#include <mmx/Node_read_storage_map_return.hxx>\n#include <mmx/Node_read_storage_object.hxx>\n#include <mmx/Node_read_storage_object_return.hxx>\n#include <mmx/Node_read_storage_var.hxx>\n#include <mmx/Node_read_storage_var_return.hxx>\n#include <mmx/Node_revert_sync.hxx>\n#include <mmx/Node_revert_sync_return.hxx>\n#include <mmx/Node_start_sync.hxx>\n#include <mmx/Node_start_sync_return.hxx>\n#include <mmx/Node_validate.hxx>\n#include <mmx/Node_validate_return.hxx>\n#include <mmx/Node_verify_partial.hxx>\n#include <mmx/Node_verify_partial_return.hxx>\n#include <mmx/Node_verify_plot_nft_target.hxx>\n#include <mmx/Node_verify_plot_nft_target_return.hxx>\n#include <mmx/Operation.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/PeerInfo.hxx>\n#include <mmx/PlotHeader.hxx>\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/ProofOfSpaceNFT.hxx>\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/ProofServerBase.hxx>\n#include <mmx/ProofServer_compute.hxx>\n#include <mmx/ProofServer_compute_return.hxx>\n#include <mmx/ReceiveNote.hxx>\n#include <mmx/Request.hxx>\n#include <mmx/Return.hxx>\n#include <mmx/RouterBase.hxx>\n#include <mmx/Router_discover.hxx>\n#include <mmx/Router_discover_return.hxx>\n#include <mmx/Router_fetch_block.hxx>\n#include <mmx/Router_fetch_block_return.hxx>\n#include <mmx/Router_fetch_block_at.hxx>\n#include <mmx/Router_fetch_block_at_return.hxx>\n#include <mmx/Router_get_blocks_at.hxx>\n#include <mmx/Router_get_blocks_at_return.hxx>\n#include <mmx/Router_get_connected_peers.hxx>\n#include <mmx/Router_get_connected_peers_return.hxx>\n#include <mmx/Router_get_id.hxx>\n#include <mmx/Router_get_id_return.hxx>\n#include <mmx/Router_get_info.hxx>\n#include <mmx/Router_get_info_return.hxx>\n#include <mmx/Router_get_known_peers.hxx>\n#include <mmx/Router_get_known_peers_return.hxx>\n#include <mmx/Router_get_peer_info.hxx>\n#include <mmx/Router_get_peer_info_return.hxx>\n#include <mmx/Router_get_peers.hxx>\n#include <mmx/Router_get_peers_return.hxx>\n#include <mmx/Router_kick_peer.hxx>\n#include <mmx/Router_kick_peer_return.hxx>\n#include <mmx/Router_sign_msg.hxx>\n#include <mmx/Router_sign_msg_return.hxx>\n#include <mmx/Solution.hxx>\n#include <mmx/TimeLordBase.hxx>\n#include <mmx/TimeLord_stop_vdf.hxx>\n#include <mmx/TimeLord_stop_vdf_return.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/TransactionBase.hxx>\n#include <mmx/VDF_Point.hxx>\n#include <mmx/ValidatorVote.hxx>\n#include <mmx/WalletBase.hxx>\n#include <mmx/Wallet_accept_offer.hxx>\n#include <mmx/Wallet_accept_offer_return.hxx>\n#include <mmx/Wallet_add_account.hxx>\n#include <mmx/Wallet_add_account_return.hxx>\n#include <mmx/Wallet_add_token.hxx>\n#include <mmx/Wallet_add_token_return.hxx>\n#include <mmx/Wallet_cancel_offer.hxx>\n#include <mmx/Wallet_cancel_offer_return.hxx>\n#include <mmx/Wallet_complete.hxx>\n#include <mmx/Wallet_complete_return.hxx>\n#include <mmx/Wallet_create_account.hxx>\n#include <mmx/Wallet_create_account_return.hxx>\n#include <mmx/Wallet_create_wallet.hxx>\n#include <mmx/Wallet_create_wallet_return.hxx>\n#include <mmx/Wallet_deploy.hxx>\n#include <mmx/Wallet_deploy_return.hxx>\n#include <mmx/Wallet_deposit.hxx>\n#include <mmx/Wallet_deposit_return.hxx>\n#include <mmx/Wallet_execute.hxx>\n#include <mmx/Wallet_execute_return.hxx>\n#include <mmx/Wallet_export_wallet.hxx>\n#include <mmx/Wallet_export_wallet_return.hxx>\n#include <mmx/Wallet_find_wallet_by_addr.hxx>\n#include <mmx/Wallet_find_wallet_by_addr_return.hxx>\n#include <mmx/Wallet_gather_inputs_for.hxx>\n#include <mmx/Wallet_gather_inputs_for_return.hxx>\n#include <mmx/Wallet_get_account.hxx>\n#include <mmx/Wallet_get_account_return.hxx>\n#include <mmx/Wallet_get_address.hxx>\n#include <mmx/Wallet_get_address_return.hxx>\n#include <mmx/Wallet_get_all_accounts.hxx>\n#include <mmx/Wallet_get_all_accounts_return.hxx>\n#include <mmx/Wallet_get_all_addresses.hxx>\n#include <mmx/Wallet_get_all_addresses_return.hxx>\n#include <mmx/Wallet_get_all_farmer_keys.hxx>\n#include <mmx/Wallet_get_all_farmer_keys_return.hxx>\n#include <mmx/Wallet_get_balance.hxx>\n#include <mmx/Wallet_get_balance_return.hxx>\n#include <mmx/Wallet_get_balances.hxx>\n#include <mmx/Wallet_get_balances_return.hxx>\n#include <mmx/Wallet_get_contract_balances.hxx>\n#include <mmx/Wallet_get_contract_balances_return.hxx>\n#include <mmx/Wallet_get_contracts.hxx>\n#include <mmx/Wallet_get_contracts_return.hxx>\n#include <mmx/Wallet_get_contracts_owned.hxx>\n#include <mmx/Wallet_get_contracts_owned_return.hxx>\n#include <mmx/Wallet_get_farmer_keys.hxx>\n#include <mmx/Wallet_get_farmer_keys_return.hxx>\n#include <mmx/Wallet_get_history.hxx>\n#include <mmx/Wallet_get_history_return.hxx>\n#include <mmx/Wallet_get_master_seed.hxx>\n#include <mmx/Wallet_get_master_seed_return.hxx>\n#include <mmx/Wallet_get_mnemonic_seed.hxx>\n#include <mmx/Wallet_get_mnemonic_seed_return.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist.hxx>\n#include <mmx/Wallet_get_mnemonic_wordlist_return.hxx>\n#include <mmx/Wallet_get_offers.hxx>\n#include <mmx/Wallet_get_offers_return.hxx>\n#include <mmx/Wallet_get_swap_liquidity.hxx>\n#include <mmx/Wallet_get_swap_liquidity_return.hxx>\n#include <mmx/Wallet_get_token_list.hxx>\n#include <mmx/Wallet_get_token_list_return.hxx>\n#include <mmx/Wallet_get_total_balances.hxx>\n#include <mmx/Wallet_get_total_balances_return.hxx>\n#include <mmx/Wallet_get_tx_log.hxx>\n#include <mmx/Wallet_get_tx_log_return.hxx>\n#include <mmx/Wallet_import_wallet.hxx>\n#include <mmx/Wallet_import_wallet_return.hxx>\n#include <mmx/Wallet_is_locked.hxx>\n#include <mmx/Wallet_is_locked_return.hxx>\n#include <mmx/Wallet_lock.hxx>\n#include <mmx/Wallet_lock_return.hxx>\n#include <mmx/Wallet_make_offer.hxx>\n#include <mmx/Wallet_make_offer_return.hxx>\n#include <mmx/Wallet_mark_spent.hxx>\n#include <mmx/Wallet_mark_spent_return.hxx>\n#include <mmx/Wallet_offer_trade.hxx>\n#include <mmx/Wallet_offer_trade_return.hxx>\n#include <mmx/Wallet_offer_withdraw.hxx>\n#include <mmx/Wallet_offer_withdraw_return.hxx>\n#include <mmx/Wallet_plotnft_create.hxx>\n#include <mmx/Wallet_plotnft_create_return.hxx>\n#include <mmx/Wallet_plotnft_exec.hxx>\n#include <mmx/Wallet_plotnft_exec_return.hxx>\n#include <mmx/Wallet_release.hxx>\n#include <mmx/Wallet_release_return.hxx>\n#include <mmx/Wallet_release_all.hxx>\n#include <mmx/Wallet_release_all_return.hxx>\n#include <mmx/Wallet_rem_token.hxx>\n#include <mmx/Wallet_rem_token_return.hxx>\n#include <mmx/Wallet_remove_account.hxx>\n#include <mmx/Wallet_remove_account_return.hxx>\n#include <mmx/Wallet_reserve.hxx>\n#include <mmx/Wallet_reserve_return.hxx>\n#include <mmx/Wallet_reset_cache.hxx>\n#include <mmx/Wallet_reset_cache_return.hxx>\n#include <mmx/Wallet_send.hxx>\n#include <mmx/Wallet_send_return.hxx>\n#include <mmx/Wallet_send_from.hxx>\n#include <mmx/Wallet_send_from_return.hxx>\n#include <mmx/Wallet_send_many.hxx>\n#include <mmx/Wallet_send_many_return.hxx>\n#include <mmx/Wallet_send_off.hxx>\n#include <mmx/Wallet_send_off_return.hxx>\n#include <mmx/Wallet_set_address_count.hxx>\n#include <mmx/Wallet_set_address_count_return.hxx>\n#include <mmx/Wallet_sign_msg.hxx>\n#include <mmx/Wallet_sign_msg_return.hxx>\n#include <mmx/Wallet_sign_off.hxx>\n#include <mmx/Wallet_sign_off_return.hxx>\n#include <mmx/Wallet_swap_add_liquid.hxx>\n#include <mmx/Wallet_swap_add_liquid_return.hxx>\n#include <mmx/Wallet_swap_rem_liquid.hxx>\n#include <mmx/Wallet_swap_rem_liquid_return.hxx>\n#include <mmx/Wallet_swap_trade.hxx>\n#include <mmx/Wallet_swap_trade_return.hxx>\n#include <mmx/Wallet_unlock.hxx>\n#include <mmx/Wallet_unlock_return.hxx>\n#include <mmx/Wallet_update_cache.hxx>\n#include <mmx/Wallet_update_cache_return.hxx>\n#include <mmx/WalletFile.hxx>\n#include <mmx/WebAPIBase.hxx>\n#include <mmx/WebAPI_shutdown.hxx>\n#include <mmx/WebAPI_shutdown_return.hxx>\n#include <mmx/account_info_t.hxx>\n#include <mmx/account_t.hxx>\n#include <mmx/balance_t.hxx>\n#include <mmx/block_index_t.hxx>\n#include <mmx/compile_flags_t.hxx>\n#include <mmx/error_code_e.hxx>\n#include <mmx/exec_entry_t.hxx>\n#include <mmx/exec_error_t.hxx>\n#include <mmx/exec_result_t.hxx>\n#include <mmx/farmed_block_info_t.hxx>\n#include <mmx/farmed_block_summary_t.hxx>\n#include <mmx/node_info_t.hxx>\n#include <mmx/node_type_e.hxx>\n#include <mmx/offer_data_t.hxx>\n#include <mmx/peer_info_t.hxx>\n#include <mmx/permission_e.hxx>\n#include <mmx/plot_nft_info_t.hxx>\n#include <mmx/pooling_error_e.hxx>\n#include <mmx/pooling_info_t.hxx>\n#include <mmx/pooling_stats_t.hxx>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/swap_entry_t.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <mmx/swap_pool_info_t.hxx>\n#include <mmx/swap_user_info_t.hxx>\n#include <mmx/table_entry_t.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <mmx/trade_log_t.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/tx_index_t.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <mmx/tx_log_entry_t.hxx>\n#include <mmx/tx_note_e.hxx>\n#include <mmx/tx_type_e.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/txio_entry_t.hxx>\n#include <mmx/txio_t.hxx>\n#include <mmx/txout_t.hxx>\n#include <mmx/uint_fraction_t.hxx>\n#include <mmx/ulong_fraction_t.hxx>\n#include <mmx/virtual_plot_info_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/fixed128.hpp>\n#include <mmx/hash_512_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <mmx/skey_t.hpp>\n#include <mmx/uint128.hpp>\n\n#include <mmx/package.hxx>\n#include <vnx/vnx.h>\n\n\n\nnamespace vnx {\n\nconst TypeCode* type<::mmx::Block>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Block;\n}\n\nvoid type<::mmx::Block>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Block());\n}\n\nvoid type<::mmx::Block>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Block& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::BlockHeader>::get_type_code() {\n\treturn mmx::vnx_native_type_code_BlockHeader;\n}\n\nvoid type<::mmx::BlockHeader>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::BlockHeader());\n}\n\nvoid type<::mmx::BlockHeader>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::BlockHeader& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::ChainParams>::get_type_code() {\n\treturn mmx::vnx_native_type_code_ChainParams;\n}\n\nvoid type<::mmx::ChainParams>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::ChainParams());\n}\n\nvoid type<::mmx::ChainParams>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ChainParams& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Challenge>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Challenge;\n}\n\nvoid type<::mmx::Challenge>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Challenge());\n}\n\nvoid type<::mmx::Challenge>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Challenge& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Contract>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Contract;\n}\n\nvoid type<::mmx::Contract>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Contract());\n}\n\nvoid type<::mmx::Contract>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Contract& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::FarmInfo>::get_type_code() {\n\treturn mmx::vnx_native_type_code_FarmInfo;\n}\n\nvoid type<::mmx::FarmInfo>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::FarmInfo());\n}\n\nvoid type<::mmx::FarmInfo>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::FarmInfo& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_get_farm_info>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_get_farm_info;\n}\n\nvoid type<::mmx::Farmer_get_farm_info>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_get_farm_info());\n}\n\nvoid type<::mmx::Farmer_get_farm_info>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_farm_info& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_get_farm_info_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_get_farm_info_return;\n}\n\nvoid type<::mmx::Farmer_get_farm_info_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_get_farm_info_return());\n}\n\nvoid type<::mmx::Farmer_get_farm_info_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_farm_info_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_get_farmer_keys>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_get_farmer_keys;\n}\n\nvoid type<::mmx::Farmer_get_farmer_keys>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_get_farmer_keys());\n}\n\nvoid type<::mmx::Farmer_get_farmer_keys>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_farmer_keys& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_get_farmer_keys_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_get_farmer_keys_return;\n}\n\nvoid type<::mmx::Farmer_get_farmer_keys_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_get_farmer_keys_return());\n}\n\nvoid type<::mmx::Farmer_get_farmer_keys_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_farmer_keys_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_get_mac_addr>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_get_mac_addr;\n}\n\nvoid type<::mmx::Farmer_get_mac_addr>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_get_mac_addr());\n}\n\nvoid type<::mmx::Farmer_get_mac_addr>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_mac_addr& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_get_mac_addr_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_get_mac_addr_return;\n}\n\nvoid type<::mmx::Farmer_get_mac_addr_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_get_mac_addr_return());\n}\n\nvoid type<::mmx::Farmer_get_mac_addr_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_mac_addr_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_get_partial_diff>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_get_partial_diff;\n}\n\nvoid type<::mmx::Farmer_get_partial_diff>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_get_partial_diff());\n}\n\nvoid type<::mmx::Farmer_get_partial_diff>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_partial_diff& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_get_partial_diff_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_get_partial_diff_return;\n}\n\nvoid type<::mmx::Farmer_get_partial_diff_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_get_partial_diff_return());\n}\n\nvoid type<::mmx::Farmer_get_partial_diff_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_partial_diff_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_get_partial_diffs>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_get_partial_diffs;\n}\n\nvoid type<::mmx::Farmer_get_partial_diffs>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_get_partial_diffs());\n}\n\nvoid type<::mmx::Farmer_get_partial_diffs>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_partial_diffs& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_get_partial_diffs_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_get_partial_diffs_return;\n}\n\nvoid type<::mmx::Farmer_get_partial_diffs_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_get_partial_diffs_return());\n}\n\nvoid type<::mmx::Farmer_get_partial_diffs_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_get_partial_diffs_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_sign_block>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_sign_block;\n}\n\nvoid type<::mmx::Farmer_sign_block>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_sign_block());\n}\n\nvoid type<::mmx::Farmer_sign_block>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_sign_block& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_sign_block_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_sign_block_return;\n}\n\nvoid type<::mmx::Farmer_sign_block_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_sign_block_return());\n}\n\nvoid type<::mmx::Farmer_sign_block_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_sign_block_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_sign_vote>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_sign_vote;\n}\n\nvoid type<::mmx::Farmer_sign_vote>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_sign_vote());\n}\n\nvoid type<::mmx::Farmer_sign_vote>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_sign_vote& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Farmer_sign_vote_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Farmer_sign_vote_return;\n}\n\nvoid type<::mmx::Farmer_sign_vote_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Farmer_sign_vote_return());\n}\n\nvoid type<::mmx::Farmer_sign_vote_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Farmer_sign_vote_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Harvester_add_plot_dir>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Harvester_add_plot_dir;\n}\n\nvoid type<::mmx::Harvester_add_plot_dir>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Harvester_add_plot_dir());\n}\n\nvoid type<::mmx::Harvester_add_plot_dir>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_add_plot_dir& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Harvester_add_plot_dir_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Harvester_add_plot_dir_return;\n}\n\nvoid type<::mmx::Harvester_add_plot_dir_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Harvester_add_plot_dir_return());\n}\n\nvoid type<::mmx::Harvester_add_plot_dir_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_add_plot_dir_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Harvester_get_farm_info>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Harvester_get_farm_info;\n}\n\nvoid type<::mmx::Harvester_get_farm_info>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Harvester_get_farm_info());\n}\n\nvoid type<::mmx::Harvester_get_farm_info>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_get_farm_info& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Harvester_get_farm_info_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Harvester_get_farm_info_return;\n}\n\nvoid type<::mmx::Harvester_get_farm_info_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Harvester_get_farm_info_return());\n}\n\nvoid type<::mmx::Harvester_get_farm_info_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_get_farm_info_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Harvester_get_total_bytes>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Harvester_get_total_bytes;\n}\n\nvoid type<::mmx::Harvester_get_total_bytes>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Harvester_get_total_bytes());\n}\n\nvoid type<::mmx::Harvester_get_total_bytes>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_get_total_bytes& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Harvester_get_total_bytes_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Harvester_get_total_bytes_return;\n}\n\nvoid type<::mmx::Harvester_get_total_bytes_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Harvester_get_total_bytes_return());\n}\n\nvoid type<::mmx::Harvester_get_total_bytes_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_get_total_bytes_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Harvester_reload>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Harvester_reload;\n}\n\nvoid type<::mmx::Harvester_reload>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Harvester_reload());\n}\n\nvoid type<::mmx::Harvester_reload>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_reload& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Harvester_reload_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Harvester_reload_return;\n}\n\nvoid type<::mmx::Harvester_reload_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Harvester_reload_return());\n}\n\nvoid type<::mmx::Harvester_reload_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_reload_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Harvester_rem_plot_dir>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Harvester_rem_plot_dir;\n}\n\nvoid type<::mmx::Harvester_rem_plot_dir>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Harvester_rem_plot_dir());\n}\n\nvoid type<::mmx::Harvester_rem_plot_dir>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_rem_plot_dir& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Harvester_rem_plot_dir_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Harvester_rem_plot_dir_return;\n}\n\nvoid type<::mmx::Harvester_rem_plot_dir_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Harvester_rem_plot_dir_return());\n}\n\nvoid type<::mmx::Harvester_rem_plot_dir_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Harvester_rem_plot_dir_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::IntervalRequest>::get_type_code() {\n\treturn mmx::vnx_native_type_code_IntervalRequest;\n}\n\nvoid type<::mmx::IntervalRequest>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::IntervalRequest());\n}\n\nvoid type<::mmx::IntervalRequest>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::IntervalRequest& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::KeyFile>::get_type_code() {\n\treturn mmx::vnx_native_type_code_KeyFile;\n}\n\nvoid type<::mmx::KeyFile>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::KeyFile());\n}\n\nvoid type<::mmx::KeyFile>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::KeyFile& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::LookupInfo>::get_type_code() {\n\treturn mmx::vnx_native_type_code_LookupInfo;\n}\n\nvoid type<::mmx::LookupInfo>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::LookupInfo());\n}\n\nvoid type<::mmx::LookupInfo>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::LookupInfo& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::NetworkInfo>::get_type_code() {\n\treturn mmx::vnx_native_type_code_NetworkInfo;\n}\n\nvoid type<::mmx::NetworkInfo>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::NetworkInfo());\n}\n\nvoid type<::mmx::NetworkInfo>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::NetworkInfo& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_add_block>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_add_block;\n}\n\nvoid type<::mmx::Node_add_block>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_add_block());\n}\n\nvoid type<::mmx::Node_add_block>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_add_block& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_add_block_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_add_block_return;\n}\n\nvoid type<::mmx::Node_add_block_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_add_block_return());\n}\n\nvoid type<::mmx::Node_add_block_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_add_block_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_add_transaction>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_add_transaction;\n}\n\nvoid type<::mmx::Node_add_transaction>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_add_transaction());\n}\n\nvoid type<::mmx::Node_add_transaction>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_add_transaction& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_add_transaction_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_add_transaction_return;\n}\n\nvoid type<::mmx::Node_add_transaction_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_add_transaction_return());\n}\n\nvoid type<::mmx::Node_add_transaction_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_add_transaction_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_call_contract>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_call_contract;\n}\n\nvoid type<::mmx::Node_call_contract>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_call_contract());\n}\n\nvoid type<::mmx::Node_call_contract>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_call_contract& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_call_contract_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_call_contract_return;\n}\n\nvoid type<::mmx::Node_call_contract_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_call_contract_return());\n}\n\nvoid type<::mmx::Node_call_contract_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_call_contract_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_dump_storage>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_dump_storage;\n}\n\nvoid type<::mmx::Node_dump_storage>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_dump_storage());\n}\n\nvoid type<::mmx::Node_dump_storage>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_dump_storage& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_dump_storage_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_dump_storage_return;\n}\n\nvoid type<::mmx::Node_dump_storage_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_dump_storage_return());\n}\n\nvoid type<::mmx::Node_dump_storage_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_dump_storage_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_fetch_offers>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_fetch_offers;\n}\n\nvoid type<::mmx::Node_fetch_offers>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_fetch_offers());\n}\n\nvoid type<::mmx::Node_fetch_offers>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_fetch_offers& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_fetch_offers_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_fetch_offers_return;\n}\n\nvoid type<::mmx::Node_fetch_offers_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_fetch_offers_return());\n}\n\nvoid type<::mmx::Node_fetch_offers_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_fetch_offers_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_all_balances>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_all_balances;\n}\n\nvoid type<::mmx::Node_get_all_balances>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_all_balances());\n}\n\nvoid type<::mmx::Node_get_all_balances>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_all_balances& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_all_balances_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_all_balances_return;\n}\n\nvoid type<::mmx::Node_get_all_balances_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_all_balances_return());\n}\n\nvoid type<::mmx::Node_get_all_balances_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_all_balances_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_balance>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_balance;\n}\n\nvoid type<::mmx::Node_get_balance>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_balance());\n}\n\nvoid type<::mmx::Node_get_balance>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_balance& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_balance_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_balance_return;\n}\n\nvoid type<::mmx::Node_get_balance_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_balance_return());\n}\n\nvoid type<::mmx::Node_get_balance_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_balance_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_balances>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_balances;\n}\n\nvoid type<::mmx::Node_get_balances>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_balances());\n}\n\nvoid type<::mmx::Node_get_balances>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_balances& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_balances_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_balances_return;\n}\n\nvoid type<::mmx::Node_get_balances_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_balances_return());\n}\n\nvoid type<::mmx::Node_get_balances_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_balances_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_block>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_block;\n}\n\nvoid type<::mmx::Node_get_block>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_block());\n}\n\nvoid type<::mmx::Node_get_block>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_block_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_block_return;\n}\n\nvoid type<::mmx::Node_get_block_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_block_return());\n}\n\nvoid type<::mmx::Node_get_block_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_block_at>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_block_at;\n}\n\nvoid type<::mmx::Node_get_block_at>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_block_at());\n}\n\nvoid type<::mmx::Node_get_block_at>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_at& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_block_at_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_block_at_return;\n}\n\nvoid type<::mmx::Node_get_block_at_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_block_at_return());\n}\n\nvoid type<::mmx::Node_get_block_at_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_at_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_block_hash>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_block_hash;\n}\n\nvoid type<::mmx::Node_get_block_hash>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_block_hash());\n}\n\nvoid type<::mmx::Node_get_block_hash>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_hash& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_block_hash_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_block_hash_return;\n}\n\nvoid type<::mmx::Node_get_block_hash_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_block_hash_return());\n}\n\nvoid type<::mmx::Node_get_block_hash_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_hash_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_block_hash_ex>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_block_hash_ex;\n}\n\nvoid type<::mmx::Node_get_block_hash_ex>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_block_hash_ex());\n}\n\nvoid type<::mmx::Node_get_block_hash_ex>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_hash_ex& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_block_hash_ex_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_block_hash_ex_return;\n}\n\nvoid type<::mmx::Node_get_block_hash_ex_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_block_hash_ex_return());\n}\n\nvoid type<::mmx::Node_get_block_hash_ex_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_block_hash_ex_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contract>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contract;\n}\n\nvoid type<::mmx::Node_get_contract>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contract());\n}\n\nvoid type<::mmx::Node_get_contract>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contract_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contract_return;\n}\n\nvoid type<::mmx::Node_get_contract_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contract_return());\n}\n\nvoid type<::mmx::Node_get_contract_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contract_balances>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contract_balances;\n}\n\nvoid type<::mmx::Node_get_contract_balances>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contract_balances());\n}\n\nvoid type<::mmx::Node_get_contract_balances>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract_balances& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contract_balances_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contract_balances_return;\n}\n\nvoid type<::mmx::Node_get_contract_balances_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contract_balances_return());\n}\n\nvoid type<::mmx::Node_get_contract_balances_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract_balances_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contract_for>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contract_for;\n}\n\nvoid type<::mmx::Node_get_contract_for>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contract_for());\n}\n\nvoid type<::mmx::Node_get_contract_for>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract_for& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contract_for_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contract_for_return;\n}\n\nvoid type<::mmx::Node_get_contract_for_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contract_for_return());\n}\n\nvoid type<::mmx::Node_get_contract_for_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contract_for_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contracts>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contracts;\n}\n\nvoid type<::mmx::Node_get_contracts>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contracts());\n}\n\nvoid type<::mmx::Node_get_contracts>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contracts_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contracts_return;\n}\n\nvoid type<::mmx::Node_get_contracts_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contracts_return());\n}\n\nvoid type<::mmx::Node_get_contracts_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contracts_by>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contracts_by;\n}\n\nvoid type<::mmx::Node_get_contracts_by>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contracts_by());\n}\n\nvoid type<::mmx::Node_get_contracts_by>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts_by& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contracts_by_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contracts_by_return;\n}\n\nvoid type<::mmx::Node_get_contracts_by_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contracts_by_return());\n}\n\nvoid type<::mmx::Node_get_contracts_by_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts_by_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contracts_owned_by>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contracts_owned_by;\n}\n\nvoid type<::mmx::Node_get_contracts_owned_by>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contracts_owned_by());\n}\n\nvoid type<::mmx::Node_get_contracts_owned_by>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts_owned_by& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_contracts_owned_by_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_contracts_owned_by_return;\n}\n\nvoid type<::mmx::Node_get_contracts_owned_by_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_contracts_owned_by_return());\n}\n\nvoid type<::mmx::Node_get_contracts_owned_by_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_contracts_owned_by_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_exec_history>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_exec_history;\n}\n\nvoid type<::mmx::Node_get_exec_history>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_exec_history());\n}\n\nvoid type<::mmx::Node_get_exec_history>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_exec_history& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_exec_history_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_exec_history_return;\n}\n\nvoid type<::mmx::Node_get_exec_history_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_exec_history_return());\n}\n\nvoid type<::mmx::Node_get_exec_history_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_exec_history_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_farmed_block_summary>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_farmed_block_summary;\n}\n\nvoid type<::mmx::Node_get_farmed_block_summary>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_farmed_block_summary());\n}\n\nvoid type<::mmx::Node_get_farmed_block_summary>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmed_block_summary& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_farmed_block_summary_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_farmed_block_summary_return;\n}\n\nvoid type<::mmx::Node_get_farmed_block_summary_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_farmed_block_summary_return());\n}\n\nvoid type<::mmx::Node_get_farmed_block_summary_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmed_block_summary_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_farmed_blocks>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_farmed_blocks;\n}\n\nvoid type<::mmx::Node_get_farmed_blocks>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_farmed_blocks());\n}\n\nvoid type<::mmx::Node_get_farmed_blocks>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmed_blocks& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_farmed_blocks_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_farmed_blocks_return;\n}\n\nvoid type<::mmx::Node_get_farmed_blocks_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_farmed_blocks_return());\n}\n\nvoid type<::mmx::Node_get_farmed_blocks_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmed_blocks_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_farmer_ranking>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_farmer_ranking;\n}\n\nvoid type<::mmx::Node_get_farmer_ranking>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_farmer_ranking());\n}\n\nvoid type<::mmx::Node_get_farmer_ranking>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmer_ranking& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_farmer_ranking_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_farmer_ranking_return;\n}\n\nvoid type<::mmx::Node_get_farmer_ranking_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_farmer_ranking_return());\n}\n\nvoid type<::mmx::Node_get_farmer_ranking_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_farmer_ranking_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_genesis_hash>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_genesis_hash;\n}\n\nvoid type<::mmx::Node_get_genesis_hash>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_genesis_hash());\n}\n\nvoid type<::mmx::Node_get_genesis_hash>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_genesis_hash& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_genesis_hash_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_genesis_hash_return;\n}\n\nvoid type<::mmx::Node_get_genesis_hash_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_genesis_hash_return());\n}\n\nvoid type<::mmx::Node_get_genesis_hash_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_genesis_hash_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_header>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_header;\n}\n\nvoid type<::mmx::Node_get_header>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_header());\n}\n\nvoid type<::mmx::Node_get_header>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_header& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_header_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_header_return;\n}\n\nvoid type<::mmx::Node_get_header_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_header_return());\n}\n\nvoid type<::mmx::Node_get_header_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_header_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_header_at>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_header_at;\n}\n\nvoid type<::mmx::Node_get_header_at>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_header_at());\n}\n\nvoid type<::mmx::Node_get_header_at>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_header_at& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_header_at_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_header_at_return;\n}\n\nvoid type<::mmx::Node_get_header_at_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_header_at_return());\n}\n\nvoid type<::mmx::Node_get_header_at_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_header_at_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_height>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_height;\n}\n\nvoid type<::mmx::Node_get_height>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_height());\n}\n\nvoid type<::mmx::Node_get_height>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_height& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_height_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_height_return;\n}\n\nvoid type<::mmx::Node_get_height_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_height_return());\n}\n\nvoid type<::mmx::Node_get_height_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_height_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_history>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_history;\n}\n\nvoid type<::mmx::Node_get_history>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_history());\n}\n\nvoid type<::mmx::Node_get_history>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_history& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_history_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_history_return;\n}\n\nvoid type<::mmx::Node_get_history_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_history_return());\n}\n\nvoid type<::mmx::Node_get_history_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_history_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_history_memo>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_history_memo;\n}\n\nvoid type<::mmx::Node_get_history_memo>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_history_memo());\n}\n\nvoid type<::mmx::Node_get_history_memo>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_history_memo& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_history_memo_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_history_memo_return;\n}\n\nvoid type<::mmx::Node_get_history_memo_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_history_memo_return());\n}\n\nvoid type<::mmx::Node_get_history_memo_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_history_memo_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_network_info>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_network_info;\n}\n\nvoid type<::mmx::Node_get_network_info>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_network_info());\n}\n\nvoid type<::mmx::Node_get_network_info>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_network_info& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_network_info_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_network_info_return;\n}\n\nvoid type<::mmx::Node_get_network_info_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_network_info_return());\n}\n\nvoid type<::mmx::Node_get_network_info_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_network_info_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_offer>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_offer;\n}\n\nvoid type<::mmx::Node_get_offer>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_offer());\n}\n\nvoid type<::mmx::Node_get_offer>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offer& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_offer_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_offer_return;\n}\n\nvoid type<::mmx::Node_get_offer_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_offer_return());\n}\n\nvoid type<::mmx::Node_get_offer_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offer_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_offers>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_offers;\n}\n\nvoid type<::mmx::Node_get_offers>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_offers());\n}\n\nvoid type<::mmx::Node_get_offers>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offers& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_offers_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_offers_return;\n}\n\nvoid type<::mmx::Node_get_offers_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_offers_return());\n}\n\nvoid type<::mmx::Node_get_offers_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offers_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_offers_by>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_offers_by;\n}\n\nvoid type<::mmx::Node_get_offers_by>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_offers_by());\n}\n\nvoid type<::mmx::Node_get_offers_by>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offers_by& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_offers_by_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_offers_by_return;\n}\n\nvoid type<::mmx::Node_get_offers_by_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_offers_by_return());\n}\n\nvoid type<::mmx::Node_get_offers_by_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_offers_by_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_params>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_params;\n}\n\nvoid type<::mmx::Node_get_params>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_params());\n}\n\nvoid type<::mmx::Node_get_params>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_params& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_params_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_params_return;\n}\n\nvoid type<::mmx::Node_get_params_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_params_return());\n}\n\nvoid type<::mmx::Node_get_params_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_params_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_plot_nft_info>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_plot_nft_info;\n}\n\nvoid type<::mmx::Node_get_plot_nft_info>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_plot_nft_info());\n}\n\nvoid type<::mmx::Node_get_plot_nft_info>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_plot_nft_info& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_plot_nft_info_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_plot_nft_info_return;\n}\n\nvoid type<::mmx::Node_get_plot_nft_info_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_plot_nft_info_return());\n}\n\nvoid type<::mmx::Node_get_plot_nft_info_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_plot_nft_info_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_plot_nft_target>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_plot_nft_target;\n}\n\nvoid type<::mmx::Node_get_plot_nft_target>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_plot_nft_target());\n}\n\nvoid type<::mmx::Node_get_plot_nft_target>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_plot_nft_target& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_plot_nft_target_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_plot_nft_target_return;\n}\n\nvoid type<::mmx::Node_get_plot_nft_target_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_plot_nft_target_return());\n}\n\nvoid type<::mmx::Node_get_plot_nft_target_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_plot_nft_target_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_recent_offers>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_recent_offers;\n}\n\nvoid type<::mmx::Node_get_recent_offers>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_recent_offers());\n}\n\nvoid type<::mmx::Node_get_recent_offers>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_recent_offers& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_recent_offers_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_recent_offers_return;\n}\n\nvoid type<::mmx::Node_get_recent_offers_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_recent_offers_return());\n}\n\nvoid type<::mmx::Node_get_recent_offers_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_recent_offers_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_recent_offers_for>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_recent_offers_for;\n}\n\nvoid type<::mmx::Node_get_recent_offers_for>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_recent_offers_for());\n}\n\nvoid type<::mmx::Node_get_recent_offers_for>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_recent_offers_for& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_recent_offers_for_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_recent_offers_for_return;\n}\n\nvoid type<::mmx::Node_get_recent_offers_for_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_recent_offers_for_return());\n}\n\nvoid type<::mmx::Node_get_recent_offers_for_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_recent_offers_for_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_equivalent_liquidity>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_equivalent_liquidity;\n}\n\nvoid type<::mmx::Node_get_swap_equivalent_liquidity>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_equivalent_liquidity());\n}\n\nvoid type<::mmx::Node_get_swap_equivalent_liquidity>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_equivalent_liquidity& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_equivalent_liquidity_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_equivalent_liquidity_return;\n}\n\nvoid type<::mmx::Node_get_swap_equivalent_liquidity_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_equivalent_liquidity_return());\n}\n\nvoid type<::mmx::Node_get_swap_equivalent_liquidity_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_equivalent_liquidity_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_fees_earned>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_fees_earned;\n}\n\nvoid type<::mmx::Node_get_swap_fees_earned>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_fees_earned());\n}\n\nvoid type<::mmx::Node_get_swap_fees_earned>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_fees_earned& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_fees_earned_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_fees_earned_return;\n}\n\nvoid type<::mmx::Node_get_swap_fees_earned_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_fees_earned_return());\n}\n\nvoid type<::mmx::Node_get_swap_fees_earned_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_fees_earned_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_history>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_history;\n}\n\nvoid type<::mmx::Node_get_swap_history>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_history());\n}\n\nvoid type<::mmx::Node_get_swap_history>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_history& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_history_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_history_return;\n}\n\nvoid type<::mmx::Node_get_swap_history_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_history_return());\n}\n\nvoid type<::mmx::Node_get_swap_history_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_history_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_info>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_info;\n}\n\nvoid type<::mmx::Node_get_swap_info>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_info());\n}\n\nvoid type<::mmx::Node_get_swap_info>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_info& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_info_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_info_return;\n}\n\nvoid type<::mmx::Node_get_swap_info_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_info_return());\n}\n\nvoid type<::mmx::Node_get_swap_info_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_info_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_liquidity_by>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_liquidity_by;\n}\n\nvoid type<::mmx::Node_get_swap_liquidity_by>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_liquidity_by());\n}\n\nvoid type<::mmx::Node_get_swap_liquidity_by>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_liquidity_by& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_liquidity_by_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_liquidity_by_return;\n}\n\nvoid type<::mmx::Node_get_swap_liquidity_by_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_liquidity_by_return());\n}\n\nvoid type<::mmx::Node_get_swap_liquidity_by_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_liquidity_by_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_trade_estimate>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_trade_estimate;\n}\n\nvoid type<::mmx::Node_get_swap_trade_estimate>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_trade_estimate());\n}\n\nvoid type<::mmx::Node_get_swap_trade_estimate>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_trade_estimate& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_trade_estimate_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_trade_estimate_return;\n}\n\nvoid type<::mmx::Node_get_swap_trade_estimate_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_trade_estimate_return());\n}\n\nvoid type<::mmx::Node_get_swap_trade_estimate_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_trade_estimate_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_user_info>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_user_info;\n}\n\nvoid type<::mmx::Node_get_swap_user_info>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_user_info());\n}\n\nvoid type<::mmx::Node_get_swap_user_info>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_user_info& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swap_user_info_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swap_user_info_return;\n}\n\nvoid type<::mmx::Node_get_swap_user_info_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swap_user_info_return());\n}\n\nvoid type<::mmx::Node_get_swap_user_info_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swap_user_info_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swaps>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swaps;\n}\n\nvoid type<::mmx::Node_get_swaps>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swaps());\n}\n\nvoid type<::mmx::Node_get_swaps>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swaps& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_swaps_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_swaps_return;\n}\n\nvoid type<::mmx::Node_get_swaps_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_swaps_return());\n}\n\nvoid type<::mmx::Node_get_swaps_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_swaps_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_synced_height>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_synced_height;\n}\n\nvoid type<::mmx::Node_get_synced_height>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_synced_height());\n}\n\nvoid type<::mmx::Node_get_synced_height>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_synced_height& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_synced_height_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_synced_height_return;\n}\n\nvoid type<::mmx::Node_get_synced_height_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_synced_height_return());\n}\n\nvoid type<::mmx::Node_get_synced_height_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_synced_height_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_synced_vdf_height>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_synced_vdf_height;\n}\n\nvoid type<::mmx::Node_get_synced_vdf_height>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_synced_vdf_height());\n}\n\nvoid type<::mmx::Node_get_synced_vdf_height>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_synced_vdf_height& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_synced_vdf_height_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_synced_vdf_height_return;\n}\n\nvoid type<::mmx::Node_get_synced_vdf_height_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_synced_vdf_height_return());\n}\n\nvoid type<::mmx::Node_get_synced_vdf_height_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_synced_vdf_height_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_total_balance>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_total_balance;\n}\n\nvoid type<::mmx::Node_get_total_balance>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_total_balance());\n}\n\nvoid type<::mmx::Node_get_total_balance>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_balance& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_total_balance_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_total_balance_return;\n}\n\nvoid type<::mmx::Node_get_total_balance_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_total_balance_return());\n}\n\nvoid type<::mmx::Node_get_total_balance_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_balance_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_total_balances>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_total_balances;\n}\n\nvoid type<::mmx::Node_get_total_balances>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_total_balances());\n}\n\nvoid type<::mmx::Node_get_total_balances>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_balances& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_total_balances_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_total_balances_return;\n}\n\nvoid type<::mmx::Node_get_total_balances_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_total_balances_return());\n}\n\nvoid type<::mmx::Node_get_total_balances_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_balances_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_total_supply>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_total_supply;\n}\n\nvoid type<::mmx::Node_get_total_supply>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_total_supply());\n}\n\nvoid type<::mmx::Node_get_total_supply>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_supply& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_total_supply_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_total_supply_return;\n}\n\nvoid type<::mmx::Node_get_total_supply_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_total_supply_return());\n}\n\nvoid type<::mmx::Node_get_total_supply_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_total_supply_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_trade_history>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_trade_history;\n}\n\nvoid type<::mmx::Node_get_trade_history>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_trade_history());\n}\n\nvoid type<::mmx::Node_get_trade_history>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_trade_history& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_trade_history_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_trade_history_return;\n}\n\nvoid type<::mmx::Node_get_trade_history_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_trade_history_return());\n}\n\nvoid type<::mmx::Node_get_trade_history_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_trade_history_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_trade_history_for>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_trade_history_for;\n}\n\nvoid type<::mmx::Node_get_trade_history_for>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_trade_history_for());\n}\n\nvoid type<::mmx::Node_get_trade_history_for>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_trade_history_for& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_trade_history_for_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_trade_history_for_return;\n}\n\nvoid type<::mmx::Node_get_trade_history_for_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_trade_history_for_return());\n}\n\nvoid type<::mmx::Node_get_trade_history_for_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_trade_history_for_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_transaction>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_transaction;\n}\n\nvoid type<::mmx::Node_get_transaction>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_transaction());\n}\n\nvoid type<::mmx::Node_get_transaction>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_transaction& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_transaction_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_transaction_return;\n}\n\nvoid type<::mmx::Node_get_transaction_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_transaction_return());\n}\n\nvoid type<::mmx::Node_get_transaction_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_transaction_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_transactions>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_transactions;\n}\n\nvoid type<::mmx::Node_get_transactions>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_transactions());\n}\n\nvoid type<::mmx::Node_get_transactions>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_transactions& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_transactions_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_transactions_return;\n}\n\nvoid type<::mmx::Node_get_transactions_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_transactions_return());\n}\n\nvoid type<::mmx::Node_get_transactions_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_transactions_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_height>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_height;\n}\n\nvoid type<::mmx::Node_get_tx_height>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_height());\n}\n\nvoid type<::mmx::Node_get_tx_height>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_height& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_height_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_height_return;\n}\n\nvoid type<::mmx::Node_get_tx_height_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_height_return());\n}\n\nvoid type<::mmx::Node_get_tx_height_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_height_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_ids>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids;\n}\n\nvoid type<::mmx::Node_get_tx_ids>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_ids());\n}\n\nvoid type<::mmx::Node_get_tx_ids>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_ids_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids_return;\n}\n\nvoid type<::mmx::Node_get_tx_ids_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_ids_return());\n}\n\nvoid type<::mmx::Node_get_tx_ids_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_ids_at>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids_at;\n}\n\nvoid type<::mmx::Node_get_tx_ids_at>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_ids_at());\n}\n\nvoid type<::mmx::Node_get_tx_ids_at>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids_at& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_ids_at_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids_at_return;\n}\n\nvoid type<::mmx::Node_get_tx_ids_at_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_ids_at_return());\n}\n\nvoid type<::mmx::Node_get_tx_ids_at_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids_at_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_ids_since>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids_since;\n}\n\nvoid type<::mmx::Node_get_tx_ids_since>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_ids_since());\n}\n\nvoid type<::mmx::Node_get_tx_ids_since>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids_since& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_ids_since_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_ids_since_return;\n}\n\nvoid type<::mmx::Node_get_tx_ids_since_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_ids_since_return());\n}\n\nvoid type<::mmx::Node_get_tx_ids_since_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_ids_since_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_info>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_info;\n}\n\nvoid type<::mmx::Node_get_tx_info>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_info());\n}\n\nvoid type<::mmx::Node_get_tx_info>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_info& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_info_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_info_return;\n}\n\nvoid type<::mmx::Node_get_tx_info_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_info_return());\n}\n\nvoid type<::mmx::Node_get_tx_info_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_info_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_info_for>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_info_for;\n}\n\nvoid type<::mmx::Node_get_tx_info_for>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_info_for());\n}\n\nvoid type<::mmx::Node_get_tx_info_for>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_info_for& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_tx_info_for_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_tx_info_for_return;\n}\n\nvoid type<::mmx::Node_get_tx_info_for_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_tx_info_for_return());\n}\n\nvoid type<::mmx::Node_get_tx_info_for_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_tx_info_for_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_vdf_height>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_vdf_height;\n}\n\nvoid type<::mmx::Node_get_vdf_height>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_vdf_height());\n}\n\nvoid type<::mmx::Node_get_vdf_height>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_vdf_height& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_vdf_height_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_vdf_height_return;\n}\n\nvoid type<::mmx::Node_get_vdf_height_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_vdf_height_return());\n}\n\nvoid type<::mmx::Node_get_vdf_height_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_vdf_height_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_vdf_peak>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_vdf_peak;\n}\n\nvoid type<::mmx::Node_get_vdf_peak>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_vdf_peak());\n}\n\nvoid type<::mmx::Node_get_vdf_peak>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_vdf_peak& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_get_vdf_peak_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_get_vdf_peak_return;\n}\n\nvoid type<::mmx::Node_get_vdf_peak_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_get_vdf_peak_return());\n}\n\nvoid type<::mmx::Node_get_vdf_peak_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_get_vdf_peak_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage;\n}\n\nvoid type<::mmx::Node_read_storage>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage());\n}\n\nvoid type<::mmx::Node_read_storage>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_return;\n}\n\nvoid type<::mmx::Node_read_storage_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_return());\n}\n\nvoid type<::mmx::Node_read_storage_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_array>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_array;\n}\n\nvoid type<::mmx::Node_read_storage_array>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_array());\n}\n\nvoid type<::mmx::Node_read_storage_array>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_array& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_array_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_array_return;\n}\n\nvoid type<::mmx::Node_read_storage_array_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_array_return());\n}\n\nvoid type<::mmx::Node_read_storage_array_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_array_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_entry_addr>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_addr;\n}\n\nvoid type<::mmx::Node_read_storage_entry_addr>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_entry_addr());\n}\n\nvoid type<::mmx::Node_read_storage_entry_addr>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_addr& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_entry_addr_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_addr_return;\n}\n\nvoid type<::mmx::Node_read_storage_entry_addr_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_entry_addr_return());\n}\n\nvoid type<::mmx::Node_read_storage_entry_addr_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_addr_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_entry_string>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_string;\n}\n\nvoid type<::mmx::Node_read_storage_entry_string>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_entry_string());\n}\n\nvoid type<::mmx::Node_read_storage_entry_string>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_string& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_entry_string_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_string_return;\n}\n\nvoid type<::mmx::Node_read_storage_entry_string_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_entry_string_return());\n}\n\nvoid type<::mmx::Node_read_storage_entry_string_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_string_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_entry_var>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_var;\n}\n\nvoid type<::mmx::Node_read_storage_entry_var>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_entry_var());\n}\n\nvoid type<::mmx::Node_read_storage_entry_var>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_var& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_entry_var_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_entry_var_return;\n}\n\nvoid type<::mmx::Node_read_storage_entry_var_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_entry_var_return());\n}\n\nvoid type<::mmx::Node_read_storage_entry_var_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_entry_var_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_field>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_field;\n}\n\nvoid type<::mmx::Node_read_storage_field>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_field());\n}\n\nvoid type<::mmx::Node_read_storage_field>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_field& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_field_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_field_return;\n}\n\nvoid type<::mmx::Node_read_storage_field_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_field_return());\n}\n\nvoid type<::mmx::Node_read_storage_field_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_field_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_map>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_map;\n}\n\nvoid type<::mmx::Node_read_storage_map>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_map());\n}\n\nvoid type<::mmx::Node_read_storage_map>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_map& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_map_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_map_return;\n}\n\nvoid type<::mmx::Node_read_storage_map_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_map_return());\n}\n\nvoid type<::mmx::Node_read_storage_map_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_map_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_object>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_object;\n}\n\nvoid type<::mmx::Node_read_storage_object>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_object());\n}\n\nvoid type<::mmx::Node_read_storage_object>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_object& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_object_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_object_return;\n}\n\nvoid type<::mmx::Node_read_storage_object_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_object_return());\n}\n\nvoid type<::mmx::Node_read_storage_object_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_object_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_var>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_var;\n}\n\nvoid type<::mmx::Node_read_storage_var>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_var());\n}\n\nvoid type<::mmx::Node_read_storage_var>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_var& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_read_storage_var_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_read_storage_var_return;\n}\n\nvoid type<::mmx::Node_read_storage_var_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_read_storage_var_return());\n}\n\nvoid type<::mmx::Node_read_storage_var_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_read_storage_var_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_revert_sync>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_revert_sync;\n}\n\nvoid type<::mmx::Node_revert_sync>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_revert_sync());\n}\n\nvoid type<::mmx::Node_revert_sync>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_revert_sync& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_revert_sync_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_revert_sync_return;\n}\n\nvoid type<::mmx::Node_revert_sync_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_revert_sync_return());\n}\n\nvoid type<::mmx::Node_revert_sync_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_revert_sync_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_start_sync>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_start_sync;\n}\n\nvoid type<::mmx::Node_start_sync>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_start_sync());\n}\n\nvoid type<::mmx::Node_start_sync>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_start_sync& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_start_sync_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_start_sync_return;\n}\n\nvoid type<::mmx::Node_start_sync_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_start_sync_return());\n}\n\nvoid type<::mmx::Node_start_sync_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_start_sync_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_validate>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_validate;\n}\n\nvoid type<::mmx::Node_validate>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_validate());\n}\n\nvoid type<::mmx::Node_validate>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_validate& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_validate_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_validate_return;\n}\n\nvoid type<::mmx::Node_validate_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_validate_return());\n}\n\nvoid type<::mmx::Node_validate_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_validate_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_verify_partial>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_verify_partial;\n}\n\nvoid type<::mmx::Node_verify_partial>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_verify_partial());\n}\n\nvoid type<::mmx::Node_verify_partial>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_verify_partial& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_verify_partial_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_verify_partial_return;\n}\n\nvoid type<::mmx::Node_verify_partial_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_verify_partial_return());\n}\n\nvoid type<::mmx::Node_verify_partial_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_verify_partial_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_verify_plot_nft_target>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_verify_plot_nft_target;\n}\n\nvoid type<::mmx::Node_verify_plot_nft_target>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_verify_plot_nft_target());\n}\n\nvoid type<::mmx::Node_verify_plot_nft_target>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_verify_plot_nft_target& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Node_verify_plot_nft_target_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Node_verify_plot_nft_target_return;\n}\n\nvoid type<::mmx::Node_verify_plot_nft_target_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Node_verify_plot_nft_target_return());\n}\n\nvoid type<::mmx::Node_verify_plot_nft_target_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Node_verify_plot_nft_target_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Operation>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Operation;\n}\n\nvoid type<::mmx::Operation>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Operation());\n}\n\nvoid type<::mmx::Operation>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Operation& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Partial>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Partial;\n}\n\nvoid type<::mmx::Partial>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Partial());\n}\n\nvoid type<::mmx::Partial>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Partial& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::PeerInfo>::get_type_code() {\n\treturn mmx::vnx_native_type_code_PeerInfo;\n}\n\nvoid type<::mmx::PeerInfo>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::PeerInfo());\n}\n\nvoid type<::mmx::PeerInfo>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::PeerInfo& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::PlotHeader>::get_type_code() {\n\treturn mmx::vnx_native_type_code_PlotHeader;\n}\n\nvoid type<::mmx::PlotHeader>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::PlotHeader());\n}\n\nvoid type<::mmx::PlotHeader>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::PlotHeader& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::ProofOfSpace>::get_type_code() {\n\treturn mmx::vnx_native_type_code_ProofOfSpace;\n}\n\nvoid type<::mmx::ProofOfSpace>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::ProofOfSpace());\n}\n\nvoid type<::mmx::ProofOfSpace>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofOfSpace& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::ProofOfSpaceNFT>::get_type_code() {\n\treturn mmx::vnx_native_type_code_ProofOfSpaceNFT;\n}\n\nvoid type<::mmx::ProofOfSpaceNFT>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::ProofOfSpaceNFT());\n}\n\nvoid type<::mmx::ProofOfSpaceNFT>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofOfSpaceNFT& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::ProofOfSpaceOG>::get_type_code() {\n\treturn mmx::vnx_native_type_code_ProofOfSpaceOG;\n}\n\nvoid type<::mmx::ProofOfSpaceOG>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::ProofOfSpaceOG());\n}\n\nvoid type<::mmx::ProofOfSpaceOG>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofOfSpaceOG& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::ProofOfTime>::get_type_code() {\n\treturn mmx::vnx_native_type_code_ProofOfTime;\n}\n\nvoid type<::mmx::ProofOfTime>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::ProofOfTime());\n}\n\nvoid type<::mmx::ProofOfTime>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofOfTime& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::ProofResponse>::get_type_code() {\n\treturn mmx::vnx_native_type_code_ProofResponse;\n}\n\nvoid type<::mmx::ProofResponse>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::ProofResponse());\n}\n\nvoid type<::mmx::ProofResponse>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofResponse& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::ProofServer_compute>::get_type_code() {\n\treturn mmx::vnx_native_type_code_ProofServer_compute;\n}\n\nvoid type<::mmx::ProofServer_compute>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::ProofServer_compute());\n}\n\nvoid type<::mmx::ProofServer_compute>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofServer_compute& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::ProofServer_compute_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_ProofServer_compute_return;\n}\n\nvoid type<::mmx::ProofServer_compute_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::ProofServer_compute_return());\n}\n\nvoid type<::mmx::ProofServer_compute_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ProofServer_compute_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::ReceiveNote>::get_type_code() {\n\treturn mmx::vnx_native_type_code_ReceiveNote;\n}\n\nvoid type<::mmx::ReceiveNote>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::ReceiveNote());\n}\n\nvoid type<::mmx::ReceiveNote>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ReceiveNote& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Request>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Request;\n}\n\nvoid type<::mmx::Request>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Request());\n}\n\nvoid type<::mmx::Request>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Request& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Return;\n}\n\nvoid type<::mmx::Return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Return());\n}\n\nvoid type<::mmx::Return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_discover>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_discover;\n}\n\nvoid type<::mmx::Router_discover>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_discover());\n}\n\nvoid type<::mmx::Router_discover>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_discover& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_discover_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_discover_return;\n}\n\nvoid type<::mmx::Router_discover_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_discover_return());\n}\n\nvoid type<::mmx::Router_discover_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_discover_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_fetch_block>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_fetch_block;\n}\n\nvoid type<::mmx::Router_fetch_block>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_fetch_block());\n}\n\nvoid type<::mmx::Router_fetch_block>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_fetch_block& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_fetch_block_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_fetch_block_return;\n}\n\nvoid type<::mmx::Router_fetch_block_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_fetch_block_return());\n}\n\nvoid type<::mmx::Router_fetch_block_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_fetch_block_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_fetch_block_at>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_fetch_block_at;\n}\n\nvoid type<::mmx::Router_fetch_block_at>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_fetch_block_at());\n}\n\nvoid type<::mmx::Router_fetch_block_at>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_fetch_block_at& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_fetch_block_at_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_fetch_block_at_return;\n}\n\nvoid type<::mmx::Router_fetch_block_at_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_fetch_block_at_return());\n}\n\nvoid type<::mmx::Router_fetch_block_at_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_fetch_block_at_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_blocks_at>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_blocks_at;\n}\n\nvoid type<::mmx::Router_get_blocks_at>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_blocks_at());\n}\n\nvoid type<::mmx::Router_get_blocks_at>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_blocks_at& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_blocks_at_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_blocks_at_return;\n}\n\nvoid type<::mmx::Router_get_blocks_at_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_blocks_at_return());\n}\n\nvoid type<::mmx::Router_get_blocks_at_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_blocks_at_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_connected_peers>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_connected_peers;\n}\n\nvoid type<::mmx::Router_get_connected_peers>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_connected_peers());\n}\n\nvoid type<::mmx::Router_get_connected_peers>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_connected_peers& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_connected_peers_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_connected_peers_return;\n}\n\nvoid type<::mmx::Router_get_connected_peers_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_connected_peers_return());\n}\n\nvoid type<::mmx::Router_get_connected_peers_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_connected_peers_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_id>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_id;\n}\n\nvoid type<::mmx::Router_get_id>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_id());\n}\n\nvoid type<::mmx::Router_get_id>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_id& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_id_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_id_return;\n}\n\nvoid type<::mmx::Router_get_id_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_id_return());\n}\n\nvoid type<::mmx::Router_get_id_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_id_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_info>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_info;\n}\n\nvoid type<::mmx::Router_get_info>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_info());\n}\n\nvoid type<::mmx::Router_get_info>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_info& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_info_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_info_return;\n}\n\nvoid type<::mmx::Router_get_info_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_info_return());\n}\n\nvoid type<::mmx::Router_get_info_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_info_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_known_peers>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_known_peers;\n}\n\nvoid type<::mmx::Router_get_known_peers>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_known_peers());\n}\n\nvoid type<::mmx::Router_get_known_peers>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_known_peers& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_known_peers_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_known_peers_return;\n}\n\nvoid type<::mmx::Router_get_known_peers_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_known_peers_return());\n}\n\nvoid type<::mmx::Router_get_known_peers_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_known_peers_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_peer_info>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_peer_info;\n}\n\nvoid type<::mmx::Router_get_peer_info>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_peer_info());\n}\n\nvoid type<::mmx::Router_get_peer_info>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_peer_info& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_peer_info_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_peer_info_return;\n}\n\nvoid type<::mmx::Router_get_peer_info_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_peer_info_return());\n}\n\nvoid type<::mmx::Router_get_peer_info_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_peer_info_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_peers>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_peers;\n}\n\nvoid type<::mmx::Router_get_peers>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_peers());\n}\n\nvoid type<::mmx::Router_get_peers>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_peers& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_get_peers_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_get_peers_return;\n}\n\nvoid type<::mmx::Router_get_peers_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_get_peers_return());\n}\n\nvoid type<::mmx::Router_get_peers_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_get_peers_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_kick_peer>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_kick_peer;\n}\n\nvoid type<::mmx::Router_kick_peer>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_kick_peer());\n}\n\nvoid type<::mmx::Router_kick_peer>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_kick_peer& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_kick_peer_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_kick_peer_return;\n}\n\nvoid type<::mmx::Router_kick_peer_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_kick_peer_return());\n}\n\nvoid type<::mmx::Router_kick_peer_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_kick_peer_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_sign_msg>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_sign_msg;\n}\n\nvoid type<::mmx::Router_sign_msg>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_sign_msg());\n}\n\nvoid type<::mmx::Router_sign_msg>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_sign_msg& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Router_sign_msg_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Router_sign_msg_return;\n}\n\nvoid type<::mmx::Router_sign_msg_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Router_sign_msg_return());\n}\n\nvoid type<::mmx::Router_sign_msg_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Router_sign_msg_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Solution>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Solution;\n}\n\nvoid type<::mmx::Solution>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Solution());\n}\n\nvoid type<::mmx::Solution>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Solution& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::TimeLord_stop_vdf>::get_type_code() {\n\treturn mmx::vnx_native_type_code_TimeLord_stop_vdf;\n}\n\nvoid type<::mmx::TimeLord_stop_vdf>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::TimeLord_stop_vdf());\n}\n\nvoid type<::mmx::TimeLord_stop_vdf>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::TimeLord_stop_vdf& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::TimeLord_stop_vdf_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_TimeLord_stop_vdf_return;\n}\n\nvoid type<::mmx::TimeLord_stop_vdf_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::TimeLord_stop_vdf_return());\n}\n\nvoid type<::mmx::TimeLord_stop_vdf_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::TimeLord_stop_vdf_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Transaction>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Transaction;\n}\n\nvoid type<::mmx::Transaction>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Transaction());\n}\n\nvoid type<::mmx::Transaction>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Transaction& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::TransactionBase>::get_type_code() {\n\treturn mmx::vnx_native_type_code_TransactionBase;\n}\n\nvoid type<::mmx::TransactionBase>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::TransactionBase());\n}\n\nvoid type<::mmx::TransactionBase>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::TransactionBase& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::VDF_Point>::get_type_code() {\n\treturn mmx::vnx_native_type_code_VDF_Point;\n}\n\nvoid type<::mmx::VDF_Point>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::VDF_Point());\n}\n\nvoid type<::mmx::VDF_Point>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::VDF_Point& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::ValidatorVote>::get_type_code() {\n\treturn mmx::vnx_native_type_code_ValidatorVote;\n}\n\nvoid type<::mmx::ValidatorVote>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::ValidatorVote());\n}\n\nvoid type<::mmx::ValidatorVote>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ValidatorVote& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_accept_offer>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_accept_offer;\n}\n\nvoid type<::mmx::Wallet_accept_offer>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_accept_offer());\n}\n\nvoid type<::mmx::Wallet_accept_offer>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_accept_offer& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_accept_offer_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_accept_offer_return;\n}\n\nvoid type<::mmx::Wallet_accept_offer_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_accept_offer_return());\n}\n\nvoid type<::mmx::Wallet_accept_offer_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_accept_offer_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_add_account>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_add_account;\n}\n\nvoid type<::mmx::Wallet_add_account>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_add_account());\n}\n\nvoid type<::mmx::Wallet_add_account>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_add_account& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_add_account_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_add_account_return;\n}\n\nvoid type<::mmx::Wallet_add_account_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_add_account_return());\n}\n\nvoid type<::mmx::Wallet_add_account_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_add_account_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_add_token>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_add_token;\n}\n\nvoid type<::mmx::Wallet_add_token>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_add_token());\n}\n\nvoid type<::mmx::Wallet_add_token>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_add_token& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_add_token_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_add_token_return;\n}\n\nvoid type<::mmx::Wallet_add_token_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_add_token_return());\n}\n\nvoid type<::mmx::Wallet_add_token_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_add_token_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_cancel_offer>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_cancel_offer;\n}\n\nvoid type<::mmx::Wallet_cancel_offer>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_cancel_offer());\n}\n\nvoid type<::mmx::Wallet_cancel_offer>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_cancel_offer& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_cancel_offer_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_cancel_offer_return;\n}\n\nvoid type<::mmx::Wallet_cancel_offer_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_cancel_offer_return());\n}\n\nvoid type<::mmx::Wallet_cancel_offer_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_cancel_offer_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_complete>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_complete;\n}\n\nvoid type<::mmx::Wallet_complete>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_complete());\n}\n\nvoid type<::mmx::Wallet_complete>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_complete& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_complete_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_complete_return;\n}\n\nvoid type<::mmx::Wallet_complete_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_complete_return());\n}\n\nvoid type<::mmx::Wallet_complete_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_complete_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_create_account>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_create_account;\n}\n\nvoid type<::mmx::Wallet_create_account>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_create_account());\n}\n\nvoid type<::mmx::Wallet_create_account>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_create_account& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_create_account_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_create_account_return;\n}\n\nvoid type<::mmx::Wallet_create_account_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_create_account_return());\n}\n\nvoid type<::mmx::Wallet_create_account_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_create_account_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_create_wallet>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_create_wallet;\n}\n\nvoid type<::mmx::Wallet_create_wallet>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_create_wallet());\n}\n\nvoid type<::mmx::Wallet_create_wallet>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_create_wallet& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_create_wallet_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_create_wallet_return;\n}\n\nvoid type<::mmx::Wallet_create_wallet_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_create_wallet_return());\n}\n\nvoid type<::mmx::Wallet_create_wallet_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_create_wallet_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_deploy>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_deploy;\n}\n\nvoid type<::mmx::Wallet_deploy>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_deploy());\n}\n\nvoid type<::mmx::Wallet_deploy>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_deploy& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_deploy_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_deploy_return;\n}\n\nvoid type<::mmx::Wallet_deploy_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_deploy_return());\n}\n\nvoid type<::mmx::Wallet_deploy_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_deploy_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_deposit>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_deposit;\n}\n\nvoid type<::mmx::Wallet_deposit>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_deposit());\n}\n\nvoid type<::mmx::Wallet_deposit>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_deposit& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_deposit_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_deposit_return;\n}\n\nvoid type<::mmx::Wallet_deposit_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_deposit_return());\n}\n\nvoid type<::mmx::Wallet_deposit_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_deposit_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_execute>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_execute;\n}\n\nvoid type<::mmx::Wallet_execute>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_execute());\n}\n\nvoid type<::mmx::Wallet_execute>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_execute& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_execute_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_execute_return;\n}\n\nvoid type<::mmx::Wallet_execute_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_execute_return());\n}\n\nvoid type<::mmx::Wallet_execute_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_execute_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_export_wallet>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_export_wallet;\n}\n\nvoid type<::mmx::Wallet_export_wallet>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_export_wallet());\n}\n\nvoid type<::mmx::Wallet_export_wallet>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_export_wallet& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_export_wallet_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_export_wallet_return;\n}\n\nvoid type<::mmx::Wallet_export_wallet_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_export_wallet_return());\n}\n\nvoid type<::mmx::Wallet_export_wallet_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_export_wallet_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_find_wallet_by_addr>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_find_wallet_by_addr;\n}\n\nvoid type<::mmx::Wallet_find_wallet_by_addr>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_find_wallet_by_addr());\n}\n\nvoid type<::mmx::Wallet_find_wallet_by_addr>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_find_wallet_by_addr& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_find_wallet_by_addr_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_find_wallet_by_addr_return;\n}\n\nvoid type<::mmx::Wallet_find_wallet_by_addr_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_find_wallet_by_addr_return());\n}\n\nvoid type<::mmx::Wallet_find_wallet_by_addr_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_find_wallet_by_addr_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_gather_inputs_for>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_gather_inputs_for;\n}\n\nvoid type<::mmx::Wallet_gather_inputs_for>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_gather_inputs_for());\n}\n\nvoid type<::mmx::Wallet_gather_inputs_for>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_gather_inputs_for& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_gather_inputs_for_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_gather_inputs_for_return;\n}\n\nvoid type<::mmx::Wallet_gather_inputs_for_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_gather_inputs_for_return());\n}\n\nvoid type<::mmx::Wallet_gather_inputs_for_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_gather_inputs_for_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_account>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_account;\n}\n\nvoid type<::mmx::Wallet_get_account>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_account());\n}\n\nvoid type<::mmx::Wallet_get_account>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_account& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_account_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_account_return;\n}\n\nvoid type<::mmx::Wallet_get_account_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_account_return());\n}\n\nvoid type<::mmx::Wallet_get_account_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_account_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_address>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_address;\n}\n\nvoid type<::mmx::Wallet_get_address>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_address());\n}\n\nvoid type<::mmx::Wallet_get_address>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_address& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_address_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_address_return;\n}\n\nvoid type<::mmx::Wallet_get_address_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_address_return());\n}\n\nvoid type<::mmx::Wallet_get_address_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_address_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_all_accounts>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_accounts;\n}\n\nvoid type<::mmx::Wallet_get_all_accounts>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_all_accounts());\n}\n\nvoid type<::mmx::Wallet_get_all_accounts>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_accounts& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_all_accounts_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_accounts_return;\n}\n\nvoid type<::mmx::Wallet_get_all_accounts_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_all_accounts_return());\n}\n\nvoid type<::mmx::Wallet_get_all_accounts_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_accounts_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_all_addresses>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_addresses;\n}\n\nvoid type<::mmx::Wallet_get_all_addresses>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_all_addresses());\n}\n\nvoid type<::mmx::Wallet_get_all_addresses>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_addresses& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_all_addresses_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_addresses_return;\n}\n\nvoid type<::mmx::Wallet_get_all_addresses_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_all_addresses_return());\n}\n\nvoid type<::mmx::Wallet_get_all_addresses_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_addresses_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_all_farmer_keys>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_farmer_keys;\n}\n\nvoid type<::mmx::Wallet_get_all_farmer_keys>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_all_farmer_keys());\n}\n\nvoid type<::mmx::Wallet_get_all_farmer_keys>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_farmer_keys& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_all_farmer_keys_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_all_farmer_keys_return;\n}\n\nvoid type<::mmx::Wallet_get_all_farmer_keys_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_all_farmer_keys_return());\n}\n\nvoid type<::mmx::Wallet_get_all_farmer_keys_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_all_farmer_keys_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_balance>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_balance;\n}\n\nvoid type<::mmx::Wallet_get_balance>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_balance());\n}\n\nvoid type<::mmx::Wallet_get_balance>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_balance& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_balance_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_balance_return;\n}\n\nvoid type<::mmx::Wallet_get_balance_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_balance_return());\n}\n\nvoid type<::mmx::Wallet_get_balance_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_balance_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_balances>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_balances;\n}\n\nvoid type<::mmx::Wallet_get_balances>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_balances());\n}\n\nvoid type<::mmx::Wallet_get_balances>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_balances& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_balances_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_balances_return;\n}\n\nvoid type<::mmx::Wallet_get_balances_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_balances_return());\n}\n\nvoid type<::mmx::Wallet_get_balances_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_balances_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_contract_balances>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_contract_balances;\n}\n\nvoid type<::mmx::Wallet_get_contract_balances>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_contract_balances());\n}\n\nvoid type<::mmx::Wallet_get_contract_balances>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contract_balances& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_contract_balances_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_contract_balances_return;\n}\n\nvoid type<::mmx::Wallet_get_contract_balances_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_contract_balances_return());\n}\n\nvoid type<::mmx::Wallet_get_contract_balances_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contract_balances_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_contracts>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_contracts;\n}\n\nvoid type<::mmx::Wallet_get_contracts>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_contracts());\n}\n\nvoid type<::mmx::Wallet_get_contracts>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contracts& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_contracts_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_contracts_return;\n}\n\nvoid type<::mmx::Wallet_get_contracts_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_contracts_return());\n}\n\nvoid type<::mmx::Wallet_get_contracts_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contracts_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_contracts_owned>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_contracts_owned;\n}\n\nvoid type<::mmx::Wallet_get_contracts_owned>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_contracts_owned());\n}\n\nvoid type<::mmx::Wallet_get_contracts_owned>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contracts_owned& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_contracts_owned_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_contracts_owned_return;\n}\n\nvoid type<::mmx::Wallet_get_contracts_owned_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_contracts_owned_return());\n}\n\nvoid type<::mmx::Wallet_get_contracts_owned_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_contracts_owned_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_farmer_keys>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_farmer_keys;\n}\n\nvoid type<::mmx::Wallet_get_farmer_keys>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_farmer_keys());\n}\n\nvoid type<::mmx::Wallet_get_farmer_keys>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_farmer_keys& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_farmer_keys_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_farmer_keys_return;\n}\n\nvoid type<::mmx::Wallet_get_farmer_keys_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_farmer_keys_return());\n}\n\nvoid type<::mmx::Wallet_get_farmer_keys_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_farmer_keys_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_history>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_history;\n}\n\nvoid type<::mmx::Wallet_get_history>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_history());\n}\n\nvoid type<::mmx::Wallet_get_history>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_history& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_history_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_history_return;\n}\n\nvoid type<::mmx::Wallet_get_history_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_history_return());\n}\n\nvoid type<::mmx::Wallet_get_history_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_history_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_master_seed>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_master_seed;\n}\n\nvoid type<::mmx::Wallet_get_master_seed>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_master_seed());\n}\n\nvoid type<::mmx::Wallet_get_master_seed>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_master_seed& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_master_seed_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_master_seed_return;\n}\n\nvoid type<::mmx::Wallet_get_master_seed_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_master_seed_return());\n}\n\nvoid type<::mmx::Wallet_get_master_seed_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_master_seed_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_mnemonic_seed>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_mnemonic_seed;\n}\n\nvoid type<::mmx::Wallet_get_mnemonic_seed>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_mnemonic_seed());\n}\n\nvoid type<::mmx::Wallet_get_mnemonic_seed>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_mnemonic_seed& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_mnemonic_seed_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_mnemonic_seed_return;\n}\n\nvoid type<::mmx::Wallet_get_mnemonic_seed_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_mnemonic_seed_return());\n}\n\nvoid type<::mmx::Wallet_get_mnemonic_seed_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_mnemonic_seed_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_mnemonic_wordlist>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_mnemonic_wordlist;\n}\n\nvoid type<::mmx::Wallet_get_mnemonic_wordlist>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_mnemonic_wordlist());\n}\n\nvoid type<::mmx::Wallet_get_mnemonic_wordlist>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_mnemonic_wordlist& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_mnemonic_wordlist_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_mnemonic_wordlist_return;\n}\n\nvoid type<::mmx::Wallet_get_mnemonic_wordlist_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_mnemonic_wordlist_return());\n}\n\nvoid type<::mmx::Wallet_get_mnemonic_wordlist_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_mnemonic_wordlist_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_offers>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_offers;\n}\n\nvoid type<::mmx::Wallet_get_offers>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_offers());\n}\n\nvoid type<::mmx::Wallet_get_offers>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_offers& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_offers_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_offers_return;\n}\n\nvoid type<::mmx::Wallet_get_offers_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_offers_return());\n}\n\nvoid type<::mmx::Wallet_get_offers_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_offers_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_swap_liquidity>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_swap_liquidity;\n}\n\nvoid type<::mmx::Wallet_get_swap_liquidity>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_swap_liquidity());\n}\n\nvoid type<::mmx::Wallet_get_swap_liquidity>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_swap_liquidity& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_swap_liquidity_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_swap_liquidity_return;\n}\n\nvoid type<::mmx::Wallet_get_swap_liquidity_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_swap_liquidity_return());\n}\n\nvoid type<::mmx::Wallet_get_swap_liquidity_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_swap_liquidity_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_token_list>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_token_list;\n}\n\nvoid type<::mmx::Wallet_get_token_list>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_token_list());\n}\n\nvoid type<::mmx::Wallet_get_token_list>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_token_list& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_token_list_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_token_list_return;\n}\n\nvoid type<::mmx::Wallet_get_token_list_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_token_list_return());\n}\n\nvoid type<::mmx::Wallet_get_token_list_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_token_list_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_total_balances>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_total_balances;\n}\n\nvoid type<::mmx::Wallet_get_total_balances>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_total_balances());\n}\n\nvoid type<::mmx::Wallet_get_total_balances>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_total_balances& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_total_balances_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_total_balances_return;\n}\n\nvoid type<::mmx::Wallet_get_total_balances_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_total_balances_return());\n}\n\nvoid type<::mmx::Wallet_get_total_balances_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_total_balances_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_tx_log>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_tx_log;\n}\n\nvoid type<::mmx::Wallet_get_tx_log>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_tx_log());\n}\n\nvoid type<::mmx::Wallet_get_tx_log>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_tx_log& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_get_tx_log_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_get_tx_log_return;\n}\n\nvoid type<::mmx::Wallet_get_tx_log_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_get_tx_log_return());\n}\n\nvoid type<::mmx::Wallet_get_tx_log_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_get_tx_log_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_import_wallet>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_import_wallet;\n}\n\nvoid type<::mmx::Wallet_import_wallet>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_import_wallet());\n}\n\nvoid type<::mmx::Wallet_import_wallet>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_import_wallet& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_import_wallet_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_import_wallet_return;\n}\n\nvoid type<::mmx::Wallet_import_wallet_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_import_wallet_return());\n}\n\nvoid type<::mmx::Wallet_import_wallet_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_import_wallet_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_is_locked>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_is_locked;\n}\n\nvoid type<::mmx::Wallet_is_locked>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_is_locked());\n}\n\nvoid type<::mmx::Wallet_is_locked>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_is_locked& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_is_locked_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_is_locked_return;\n}\n\nvoid type<::mmx::Wallet_is_locked_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_is_locked_return());\n}\n\nvoid type<::mmx::Wallet_is_locked_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_is_locked_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_lock>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_lock;\n}\n\nvoid type<::mmx::Wallet_lock>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_lock());\n}\n\nvoid type<::mmx::Wallet_lock>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_lock& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_lock_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_lock_return;\n}\n\nvoid type<::mmx::Wallet_lock_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_lock_return());\n}\n\nvoid type<::mmx::Wallet_lock_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_lock_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_make_offer>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_make_offer;\n}\n\nvoid type<::mmx::Wallet_make_offer>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_make_offer());\n}\n\nvoid type<::mmx::Wallet_make_offer>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_make_offer& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_make_offer_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_make_offer_return;\n}\n\nvoid type<::mmx::Wallet_make_offer_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_make_offer_return());\n}\n\nvoid type<::mmx::Wallet_make_offer_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_make_offer_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_mark_spent>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_mark_spent;\n}\n\nvoid type<::mmx::Wallet_mark_spent>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_mark_spent());\n}\n\nvoid type<::mmx::Wallet_mark_spent>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_mark_spent& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_mark_spent_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_mark_spent_return;\n}\n\nvoid type<::mmx::Wallet_mark_spent_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_mark_spent_return());\n}\n\nvoid type<::mmx::Wallet_mark_spent_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_mark_spent_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_offer_trade>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_offer_trade;\n}\n\nvoid type<::mmx::Wallet_offer_trade>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_offer_trade());\n}\n\nvoid type<::mmx::Wallet_offer_trade>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_offer_trade& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_offer_trade_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_offer_trade_return;\n}\n\nvoid type<::mmx::Wallet_offer_trade_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_offer_trade_return());\n}\n\nvoid type<::mmx::Wallet_offer_trade_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_offer_trade_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_offer_withdraw>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_offer_withdraw;\n}\n\nvoid type<::mmx::Wallet_offer_withdraw>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_offer_withdraw());\n}\n\nvoid type<::mmx::Wallet_offer_withdraw>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_offer_withdraw& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_offer_withdraw_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_offer_withdraw_return;\n}\n\nvoid type<::mmx::Wallet_offer_withdraw_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_offer_withdraw_return());\n}\n\nvoid type<::mmx::Wallet_offer_withdraw_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_offer_withdraw_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_plotnft_create>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_plotnft_create;\n}\n\nvoid type<::mmx::Wallet_plotnft_create>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_plotnft_create());\n}\n\nvoid type<::mmx::Wallet_plotnft_create>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_plotnft_create& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_plotnft_create_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_plotnft_create_return;\n}\n\nvoid type<::mmx::Wallet_plotnft_create_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_plotnft_create_return());\n}\n\nvoid type<::mmx::Wallet_plotnft_create_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_plotnft_create_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_plotnft_exec>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_plotnft_exec;\n}\n\nvoid type<::mmx::Wallet_plotnft_exec>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_plotnft_exec());\n}\n\nvoid type<::mmx::Wallet_plotnft_exec>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_plotnft_exec& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_plotnft_exec_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_plotnft_exec_return;\n}\n\nvoid type<::mmx::Wallet_plotnft_exec_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_plotnft_exec_return());\n}\n\nvoid type<::mmx::Wallet_plotnft_exec_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_plotnft_exec_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_release>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_release;\n}\n\nvoid type<::mmx::Wallet_release>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_release());\n}\n\nvoid type<::mmx::Wallet_release>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_release& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_release_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_release_return;\n}\n\nvoid type<::mmx::Wallet_release_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_release_return());\n}\n\nvoid type<::mmx::Wallet_release_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_release_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_release_all>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_release_all;\n}\n\nvoid type<::mmx::Wallet_release_all>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_release_all());\n}\n\nvoid type<::mmx::Wallet_release_all>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_release_all& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_release_all_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_release_all_return;\n}\n\nvoid type<::mmx::Wallet_release_all_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_release_all_return());\n}\n\nvoid type<::mmx::Wallet_release_all_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_release_all_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_rem_token>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_rem_token;\n}\n\nvoid type<::mmx::Wallet_rem_token>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_rem_token());\n}\n\nvoid type<::mmx::Wallet_rem_token>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_rem_token& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_rem_token_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_rem_token_return;\n}\n\nvoid type<::mmx::Wallet_rem_token_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_rem_token_return());\n}\n\nvoid type<::mmx::Wallet_rem_token_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_rem_token_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_remove_account>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_remove_account;\n}\n\nvoid type<::mmx::Wallet_remove_account>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_remove_account());\n}\n\nvoid type<::mmx::Wallet_remove_account>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_remove_account& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_remove_account_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_remove_account_return;\n}\n\nvoid type<::mmx::Wallet_remove_account_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_remove_account_return());\n}\n\nvoid type<::mmx::Wallet_remove_account_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_remove_account_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_reserve>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_reserve;\n}\n\nvoid type<::mmx::Wallet_reserve>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_reserve());\n}\n\nvoid type<::mmx::Wallet_reserve>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_reserve& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_reserve_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_reserve_return;\n}\n\nvoid type<::mmx::Wallet_reserve_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_reserve_return());\n}\n\nvoid type<::mmx::Wallet_reserve_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_reserve_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_reset_cache>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_reset_cache;\n}\n\nvoid type<::mmx::Wallet_reset_cache>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_reset_cache());\n}\n\nvoid type<::mmx::Wallet_reset_cache>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_reset_cache& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_reset_cache_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_reset_cache_return;\n}\n\nvoid type<::mmx::Wallet_reset_cache_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_reset_cache_return());\n}\n\nvoid type<::mmx::Wallet_reset_cache_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_reset_cache_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_send>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_send;\n}\n\nvoid type<::mmx::Wallet_send>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_send());\n}\n\nvoid type<::mmx::Wallet_send>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_send_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_send_return;\n}\n\nvoid type<::mmx::Wallet_send_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_send_return());\n}\n\nvoid type<::mmx::Wallet_send_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_send_from>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_send_from;\n}\n\nvoid type<::mmx::Wallet_send_from>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_send_from());\n}\n\nvoid type<::mmx::Wallet_send_from>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_from& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_send_from_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_send_from_return;\n}\n\nvoid type<::mmx::Wallet_send_from_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_send_from_return());\n}\n\nvoid type<::mmx::Wallet_send_from_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_from_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_send_many>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_send_many;\n}\n\nvoid type<::mmx::Wallet_send_many>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_send_many());\n}\n\nvoid type<::mmx::Wallet_send_many>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_many& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_send_many_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_send_many_return;\n}\n\nvoid type<::mmx::Wallet_send_many_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_send_many_return());\n}\n\nvoid type<::mmx::Wallet_send_many_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_many_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_send_off>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_send_off;\n}\n\nvoid type<::mmx::Wallet_send_off>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_send_off());\n}\n\nvoid type<::mmx::Wallet_send_off>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_off& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_send_off_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_send_off_return;\n}\n\nvoid type<::mmx::Wallet_send_off_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_send_off_return());\n}\n\nvoid type<::mmx::Wallet_send_off_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_send_off_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_set_address_count>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_set_address_count;\n}\n\nvoid type<::mmx::Wallet_set_address_count>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_set_address_count());\n}\n\nvoid type<::mmx::Wallet_set_address_count>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_set_address_count& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_set_address_count_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_set_address_count_return;\n}\n\nvoid type<::mmx::Wallet_set_address_count_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_set_address_count_return());\n}\n\nvoid type<::mmx::Wallet_set_address_count_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_set_address_count_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_sign_msg>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_sign_msg;\n}\n\nvoid type<::mmx::Wallet_sign_msg>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_sign_msg());\n}\n\nvoid type<::mmx::Wallet_sign_msg>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_sign_msg& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_sign_msg_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_sign_msg_return;\n}\n\nvoid type<::mmx::Wallet_sign_msg_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_sign_msg_return());\n}\n\nvoid type<::mmx::Wallet_sign_msg_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_sign_msg_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_sign_off>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_sign_off;\n}\n\nvoid type<::mmx::Wallet_sign_off>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_sign_off());\n}\n\nvoid type<::mmx::Wallet_sign_off>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_sign_off& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_sign_off_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_sign_off_return;\n}\n\nvoid type<::mmx::Wallet_sign_off_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_sign_off_return());\n}\n\nvoid type<::mmx::Wallet_sign_off_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_sign_off_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_swap_add_liquid>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_swap_add_liquid;\n}\n\nvoid type<::mmx::Wallet_swap_add_liquid>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_swap_add_liquid());\n}\n\nvoid type<::mmx::Wallet_swap_add_liquid>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_add_liquid& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_swap_add_liquid_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_swap_add_liquid_return;\n}\n\nvoid type<::mmx::Wallet_swap_add_liquid_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_swap_add_liquid_return());\n}\n\nvoid type<::mmx::Wallet_swap_add_liquid_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_add_liquid_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_swap_rem_liquid>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_swap_rem_liquid;\n}\n\nvoid type<::mmx::Wallet_swap_rem_liquid>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_swap_rem_liquid());\n}\n\nvoid type<::mmx::Wallet_swap_rem_liquid>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_rem_liquid& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_swap_rem_liquid_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_swap_rem_liquid_return;\n}\n\nvoid type<::mmx::Wallet_swap_rem_liquid_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_swap_rem_liquid_return());\n}\n\nvoid type<::mmx::Wallet_swap_rem_liquid_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_rem_liquid_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_swap_trade>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_swap_trade;\n}\n\nvoid type<::mmx::Wallet_swap_trade>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_swap_trade());\n}\n\nvoid type<::mmx::Wallet_swap_trade>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_trade& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_swap_trade_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_swap_trade_return;\n}\n\nvoid type<::mmx::Wallet_swap_trade_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_swap_trade_return());\n}\n\nvoid type<::mmx::Wallet_swap_trade_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_swap_trade_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_unlock>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_unlock;\n}\n\nvoid type<::mmx::Wallet_unlock>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_unlock());\n}\n\nvoid type<::mmx::Wallet_unlock>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_unlock& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_unlock_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_unlock_return;\n}\n\nvoid type<::mmx::Wallet_unlock_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_unlock_return());\n}\n\nvoid type<::mmx::Wallet_unlock_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_unlock_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_update_cache>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_update_cache;\n}\n\nvoid type<::mmx::Wallet_update_cache>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_update_cache());\n}\n\nvoid type<::mmx::Wallet_update_cache>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_update_cache& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::Wallet_update_cache_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_Wallet_update_cache_return;\n}\n\nvoid type<::mmx::Wallet_update_cache_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::Wallet_update_cache_return());\n}\n\nvoid type<::mmx::Wallet_update_cache_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::Wallet_update_cache_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::WalletFile>::get_type_code() {\n\treturn mmx::vnx_native_type_code_WalletFile;\n}\n\nvoid type<::mmx::WalletFile>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::WalletFile());\n}\n\nvoid type<::mmx::WalletFile>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::WalletFile& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::WebAPI_shutdown>::get_type_code() {\n\treturn mmx::vnx_native_type_code_WebAPI_shutdown;\n}\n\nvoid type<::mmx::WebAPI_shutdown>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::WebAPI_shutdown());\n}\n\nvoid type<::mmx::WebAPI_shutdown>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::WebAPI_shutdown& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::WebAPI_shutdown_return>::get_type_code() {\n\treturn mmx::vnx_native_type_code_WebAPI_shutdown_return;\n}\n\nvoid type<::mmx::WebAPI_shutdown_return>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::WebAPI_shutdown_return());\n}\n\nvoid type<::mmx::WebAPI_shutdown_return>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::WebAPI_shutdown_return& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::account_info_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_account_info_t;\n}\n\nvoid type<::mmx::account_info_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::account_info_t());\n}\n\nvoid type<::mmx::account_info_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::account_info_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::account_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_account_t;\n}\n\nvoid type<::mmx::account_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::account_t());\n}\n\nvoid type<::mmx::account_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::account_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::addr_t>::get_type_code() {\n\treturn nullptr;\n}\n\nvoid type<::mmx::addr_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::addr_t());\n}\n\nvoid type<::mmx::addr_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::addr_t& value, bool special) {\n\tconst std::vector<int> tmp = {11, 32, 1};\n\tcode.insert(code.end(), tmp.begin(), tmp.end());}\n\nconst TypeCode* type<::mmx::balance_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_balance_t;\n}\n\nvoid type<::mmx::balance_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::balance_t());\n}\n\nvoid type<::mmx::balance_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::balance_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::block_index_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_block_index_t;\n}\n\nvoid type<::mmx::block_index_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::block_index_t());\n}\n\nvoid type<::mmx::block_index_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::block_index_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::compile_flags_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_compile_flags_t;\n}\n\nvoid type<::mmx::compile_flags_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::compile_flags_t());\n}\n\nvoid type<::mmx::compile_flags_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::compile_flags_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::error_code_e>::get_type_code() {\n\treturn mmx::vnx_native_type_code_error_code_e;\n}\n\nvoid type<::mmx::error_code_e>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::error_code_e());\n}\n\nvoid type<::mmx::error_code_e>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::error_code_e& value, bool special) {\n\tif(!special || value.is_valid()) {\n\t\tcode.push_back(CODE_STRING);\n\t} else {\n\t\tcode.push_back(CODE_UINT32);\n\t}\n}\n\nconst TypeCode* type<::mmx::exec_entry_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_exec_entry_t;\n}\n\nvoid type<::mmx::exec_entry_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::exec_entry_t());\n}\n\nvoid type<::mmx::exec_entry_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::exec_entry_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::exec_error_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_exec_error_t;\n}\n\nvoid type<::mmx::exec_error_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::exec_error_t());\n}\n\nvoid type<::mmx::exec_error_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::exec_error_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::exec_result_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_exec_result_t;\n}\n\nvoid type<::mmx::exec_result_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::exec_result_t());\n}\n\nvoid type<::mmx::exec_result_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::exec_result_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::farmed_block_info_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_farmed_block_info_t;\n}\n\nvoid type<::mmx::farmed_block_info_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::farmed_block_info_t());\n}\n\nvoid type<::mmx::farmed_block_info_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::farmed_block_info_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::farmed_block_summary_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_farmed_block_summary_t;\n}\n\nvoid type<::mmx::farmed_block_summary_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::farmed_block_summary_t());\n}\n\nvoid type<::mmx::farmed_block_summary_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::farmed_block_summary_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::fixed128>::get_type_code() {\n\treturn nullptr;\n}\n\nvoid type<::mmx::fixed128>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::fixed128());\n}\n\nvoid type<::mmx::fixed128>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::fixed128& value, bool special) {\n\tconst std::vector<int> tmp = {11, 16, 1};\n\tcode.insert(code.end(), tmp.begin(), tmp.end());}\n\nconst TypeCode* type<::mmx::hash_512_t>::get_type_code() {\n\treturn nullptr;\n}\n\nvoid type<::mmx::hash_512_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::hash_512_t());\n}\n\nvoid type<::mmx::hash_512_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::hash_512_t& value, bool special) {\n\tconst std::vector<int> tmp = {11, 64, 1};\n\tcode.insert(code.end(), tmp.begin(), tmp.end());}\n\nconst TypeCode* type<::mmx::hash_t>::get_type_code() {\n\treturn nullptr;\n}\n\nvoid type<::mmx::hash_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::hash_t());\n}\n\nvoid type<::mmx::hash_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::hash_t& value, bool special) {\n\tconst std::vector<int> tmp = {11, 32, 1};\n\tcode.insert(code.end(), tmp.begin(), tmp.end());}\n\nconst TypeCode* type<::mmx::node_info_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_node_info_t;\n}\n\nvoid type<::mmx::node_info_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::node_info_t());\n}\n\nvoid type<::mmx::node_info_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::node_info_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::node_type_e>::get_type_code() {\n\treturn mmx::vnx_native_type_code_node_type_e;\n}\n\nvoid type<::mmx::node_type_e>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::node_type_e());\n}\n\nvoid type<::mmx::node_type_e>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::node_type_e& value, bool special) {\n\tif(!special || value.is_valid()) {\n\t\tcode.push_back(CODE_STRING);\n\t} else {\n\t\tcode.push_back(CODE_UINT32);\n\t}\n}\n\nconst TypeCode* type<::mmx::offer_data_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_offer_data_t;\n}\n\nvoid type<::mmx::offer_data_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::offer_data_t());\n}\n\nvoid type<::mmx::offer_data_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::offer_data_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::peer_info_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_peer_info_t;\n}\n\nvoid type<::mmx::peer_info_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::peer_info_t());\n}\n\nvoid type<::mmx::peer_info_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::peer_info_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::permission_e>::get_type_code() {\n\treturn mmx::vnx_native_type_code_permission_e;\n}\n\nvoid type<::mmx::permission_e>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::permission_e());\n}\n\nvoid type<::mmx::permission_e>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::permission_e& value, bool special) {\n\tif(!special || value.is_valid()) {\n\t\tcode.push_back(CODE_STRING);\n\t} else {\n\t\tcode.push_back(CODE_UINT32);\n\t}\n}\n\nconst TypeCode* type<::mmx::plot_nft_info_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_plot_nft_info_t;\n}\n\nvoid type<::mmx::plot_nft_info_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::plot_nft_info_t());\n}\n\nvoid type<::mmx::plot_nft_info_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::plot_nft_info_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::pooling_error_e>::get_type_code() {\n\treturn mmx::vnx_native_type_code_pooling_error_e;\n}\n\nvoid type<::mmx::pooling_error_e>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::pooling_error_e());\n}\n\nvoid type<::mmx::pooling_error_e>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::pooling_error_e& value, bool special) {\n\tif(!special || value.is_valid()) {\n\t\tcode.push_back(CODE_STRING);\n\t} else {\n\t\tcode.push_back(CODE_UINT32);\n\t}\n}\n\nconst TypeCode* type<::mmx::pooling_info_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_pooling_info_t;\n}\n\nvoid type<::mmx::pooling_info_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::pooling_info_t());\n}\n\nvoid type<::mmx::pooling_info_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::pooling_info_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::pooling_stats_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_pooling_stats_t;\n}\n\nvoid type<::mmx::pooling_stats_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::pooling_stats_t());\n}\n\nvoid type<::mmx::pooling_stats_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::pooling_stats_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::pubkey_t>::get_type_code() {\n\treturn nullptr;\n}\n\nvoid type<::mmx::pubkey_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::pubkey_t());\n}\n\nvoid type<::mmx::pubkey_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::pubkey_t& value, bool special) {\n\tconst std::vector<int> tmp = {11, 33, 1};\n\tcode.insert(code.end(), tmp.begin(), tmp.end());}\n\nconst TypeCode* type<::mmx::query_filter_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_query_filter_t;\n}\n\nvoid type<::mmx::query_filter_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::query_filter_t());\n}\n\nvoid type<::mmx::query_filter_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::query_filter_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::signature_t>::get_type_code() {\n\treturn nullptr;\n}\n\nvoid type<::mmx::signature_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::signature_t());\n}\n\nvoid type<::mmx::signature_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::signature_t& value, bool special) {\n\tconst std::vector<int> tmp = {11, 64, 1};\n\tcode.insert(code.end(), tmp.begin(), tmp.end());}\n\nconst TypeCode* type<::mmx::skey_t>::get_type_code() {\n\treturn nullptr;\n}\n\nvoid type<::mmx::skey_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::skey_t());\n}\n\nvoid type<::mmx::skey_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::skey_t& value, bool special) {\n\tconst std::vector<int> tmp = {11, 32, 1};\n\tcode.insert(code.end(), tmp.begin(), tmp.end());}\n\nconst TypeCode* type<::mmx::spend_options_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_spend_options_t;\n}\n\nvoid type<::mmx::spend_options_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::spend_options_t());\n}\n\nvoid type<::mmx::spend_options_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::spend_options_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::swap_entry_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_swap_entry_t;\n}\n\nvoid type<::mmx::swap_entry_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::swap_entry_t());\n}\n\nvoid type<::mmx::swap_entry_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::swap_entry_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::swap_info_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_swap_info_t;\n}\n\nvoid type<::mmx::swap_info_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::swap_info_t());\n}\n\nvoid type<::mmx::swap_info_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::swap_info_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::swap_pool_info_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_swap_pool_info_t;\n}\n\nvoid type<::mmx::swap_pool_info_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::swap_pool_info_t());\n}\n\nvoid type<::mmx::swap_pool_info_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::swap_pool_info_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::swap_user_info_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_swap_user_info_t;\n}\n\nvoid type<::mmx::swap_user_info_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::swap_user_info_t());\n}\n\nvoid type<::mmx::swap_user_info_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::swap_user_info_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::table_entry_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_table_entry_t;\n}\n\nvoid type<::mmx::table_entry_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::table_entry_t());\n}\n\nvoid type<::mmx::table_entry_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::table_entry_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::trade_entry_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_trade_entry_t;\n}\n\nvoid type<::mmx::trade_entry_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::trade_entry_t());\n}\n\nvoid type<::mmx::trade_entry_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::trade_entry_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::trade_log_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_trade_log_t;\n}\n\nvoid type<::mmx::trade_log_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::trade_log_t());\n}\n\nvoid type<::mmx::trade_log_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::trade_log_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::tx_entry_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_tx_entry_t;\n}\n\nvoid type<::mmx::tx_entry_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::tx_entry_t());\n}\n\nvoid type<::mmx::tx_entry_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_entry_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::tx_index_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_tx_index_t;\n}\n\nvoid type<::mmx::tx_index_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::tx_index_t());\n}\n\nvoid type<::mmx::tx_index_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_index_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::tx_info_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_tx_info_t;\n}\n\nvoid type<::mmx::tx_info_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::tx_info_t());\n}\n\nvoid type<::mmx::tx_info_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_info_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::tx_log_entry_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_tx_log_entry_t;\n}\n\nvoid type<::mmx::tx_log_entry_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::tx_log_entry_t());\n}\n\nvoid type<::mmx::tx_log_entry_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_log_entry_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::tx_note_e>::get_type_code() {\n\treturn mmx::vnx_native_type_code_tx_note_e;\n}\n\nvoid type<::mmx::tx_note_e>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::tx_note_e());\n}\n\nvoid type<::mmx::tx_note_e>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_note_e& value, bool special) {\n\tif(!special || value.is_valid()) {\n\t\tcode.push_back(CODE_STRING);\n\t} else {\n\t\tcode.push_back(CODE_UINT32);\n\t}\n}\n\nconst TypeCode* type<::mmx::tx_type_e>::get_type_code() {\n\treturn mmx::vnx_native_type_code_tx_type_e;\n}\n\nvoid type<::mmx::tx_type_e>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::tx_type_e());\n}\n\nvoid type<::mmx::tx_type_e>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::tx_type_e& value, bool special) {\n\tif(!special || value.is_valid()) {\n\t\tcode.push_back(CODE_STRING);\n\t} else {\n\t\tcode.push_back(CODE_UINT32);\n\t}\n}\n\nconst TypeCode* type<::mmx::txin_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_txin_t;\n}\n\nvoid type<::mmx::txin_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::txin_t());\n}\n\nvoid type<::mmx::txin_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::txin_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::txio_entry_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_txio_entry_t;\n}\n\nvoid type<::mmx::txio_entry_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::txio_entry_t());\n}\n\nvoid type<::mmx::txio_entry_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::txio_entry_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::txio_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_txio_t;\n}\n\nvoid type<::mmx::txio_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::txio_t());\n}\n\nvoid type<::mmx::txio_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::txio_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::txout_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_txout_t;\n}\n\nvoid type<::mmx::txout_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::txout_t());\n}\n\nvoid type<::mmx::txout_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::txout_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::uint128>::get_type_code() {\n\treturn nullptr;\n}\n\nvoid type<::mmx::uint128>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::uint128());\n}\n\nvoid type<::mmx::uint128>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::uint128& value, bool special) {\n\tconst std::vector<int> tmp = {11, 16, 1};\n\tcode.insert(code.end(), tmp.begin(), tmp.end());}\n\nconst TypeCode* type<::mmx::uint_fraction_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_uint_fraction_t;\n}\n\nvoid type<::mmx::uint_fraction_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::uint_fraction_t());\n}\n\nvoid type<::mmx::uint_fraction_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::uint_fraction_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::ulong_fraction_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_ulong_fraction_t;\n}\n\nvoid type<::mmx::ulong_fraction_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::ulong_fraction_t());\n}\n\nvoid type<::mmx::ulong_fraction_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::ulong_fraction_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\nconst TypeCode* type<::mmx::virtual_plot_info_t>::get_type_code() {\n\treturn mmx::vnx_native_type_code_virtual_plot_info_t;\n}\n\nvoid type<::mmx::virtual_plot_info_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::virtual_plot_info_t());\n}\n\nvoid type<::mmx::virtual_plot_info_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::virtual_plot_info_t& value, bool special) {\n\tcode.push_back(CODE_OBJECT);\n}\n\n\n} // namespace vnx\n\n\nnamespace mmx {\n\n\nvoid register_all_types() {\n\tvnx::register_type_code(::mmx::Block::static_create_type_code());\n\tvnx::register_type_code(::mmx::BlockHeader::static_create_type_code());\n\tvnx::register_type_code(::mmx::ChainParams::static_create_type_code());\n\tvnx::register_type_code(::mmx::Challenge::static_create_type_code());\n\tvnx::register_type_code(::mmx::Contract::static_create_type_code());\n\tvnx::register_type_code(::mmx::FarmInfo::static_create_type_code());\n\tvnx::register_type_code(::mmx::FarmerBase::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_get_farm_info::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_get_farm_info_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_get_farmer_keys::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_get_farmer_keys_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_get_mac_addr::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_get_mac_addr_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_get_partial_diff::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_get_partial_diff_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_get_partial_diffs::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_get_partial_diffs_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_sign_block::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_sign_block_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_sign_vote::static_create_type_code());\n\tvnx::register_type_code(::mmx::Farmer_sign_vote_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::HarvesterBase::static_create_type_code());\n\tvnx::register_type_code(::mmx::Harvester_add_plot_dir::static_create_type_code());\n\tvnx::register_type_code(::mmx::Harvester_add_plot_dir_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Harvester_get_farm_info::static_create_type_code());\n\tvnx::register_type_code(::mmx::Harvester_get_farm_info_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Harvester_get_total_bytes::static_create_type_code());\n\tvnx::register_type_code(::mmx::Harvester_get_total_bytes_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Harvester_reload::static_create_type_code());\n\tvnx::register_type_code(::mmx::Harvester_reload_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Harvester_rem_plot_dir::static_create_type_code());\n\tvnx::register_type_code(::mmx::Harvester_rem_plot_dir_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::IntervalRequest::static_create_type_code());\n\tvnx::register_type_code(::mmx::KeyFile::static_create_type_code());\n\tvnx::register_type_code(::mmx::LookupInfo::static_create_type_code());\n\tvnx::register_type_code(::mmx::NetworkInfo::static_create_type_code());\n\tvnx::register_type_code(::mmx::NodeBase::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_add_block::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_add_block_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_add_transaction::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_add_transaction_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_call_contract::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_call_contract_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_dump_storage::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_dump_storage_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_fetch_offers::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_fetch_offers_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_all_balances::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_all_balances_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_balance::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_balance_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_balances::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_balances_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_block::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_block_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_block_at::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_block_at_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_block_hash::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_block_hash_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_block_hash_ex::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_block_hash_ex_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contract::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contract_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contract_balances::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contract_balances_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contract_for::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contract_for_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contracts::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contracts_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contracts_by::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contracts_by_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contracts_owned_by::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_contracts_owned_by_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_exec_history::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_exec_history_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_farmed_block_summary::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_farmed_block_summary_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_farmed_blocks::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_farmed_blocks_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_farmer_ranking::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_farmer_ranking_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_genesis_hash::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_genesis_hash_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_header::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_header_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_header_at::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_header_at_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_height::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_height_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_history::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_history_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_history_memo::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_history_memo_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_network_info::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_network_info_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_offer::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_offer_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_offers::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_offers_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_offers_by::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_offers_by_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_params::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_params_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_plot_nft_info::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_plot_nft_info_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_plot_nft_target::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_plot_nft_target_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_recent_offers::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_recent_offers_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_recent_offers_for::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_recent_offers_for_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_equivalent_liquidity::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_equivalent_liquidity_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_fees_earned::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_fees_earned_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_history::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_history_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_info::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_info_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_liquidity_by::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_liquidity_by_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_trade_estimate::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_trade_estimate_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_user_info::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swap_user_info_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swaps::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_swaps_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_synced_height::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_synced_height_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_synced_vdf_height::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_synced_vdf_height_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_total_balance::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_total_balance_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_total_balances::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_total_balances_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_total_supply::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_total_supply_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_trade_history::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_trade_history_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_trade_history_for::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_trade_history_for_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_transaction::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_transaction_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_transactions::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_transactions_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_height::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_height_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_ids::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_ids_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_ids_at::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_ids_at_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_ids_since::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_ids_since_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_info::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_info_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_info_for::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_tx_info_for_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_vdf_height::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_vdf_height_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_vdf_peak::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_get_vdf_peak_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_array::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_array_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_entry_addr::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_entry_addr_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_entry_string::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_entry_string_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_entry_var::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_entry_var_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_field::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_field_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_map::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_map_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_object::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_object_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_var::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_read_storage_var_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_revert_sync::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_revert_sync_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_start_sync::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_start_sync_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_validate::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_validate_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_verify_partial::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_verify_partial_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_verify_plot_nft_target::static_create_type_code());\n\tvnx::register_type_code(::mmx::Node_verify_plot_nft_target_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Operation::static_create_type_code());\n\tvnx::register_type_code(::mmx::Partial::static_create_type_code());\n\tvnx::register_type_code(::mmx::PeerInfo::static_create_type_code());\n\tvnx::register_type_code(::mmx::PlotHeader::static_create_type_code());\n\tvnx::register_type_code(::mmx::ProofOfSpace::static_create_type_code());\n\tvnx::register_type_code(::mmx::ProofOfSpaceNFT::static_create_type_code());\n\tvnx::register_type_code(::mmx::ProofOfSpaceOG::static_create_type_code());\n\tvnx::register_type_code(::mmx::ProofOfTime::static_create_type_code());\n\tvnx::register_type_code(::mmx::ProofResponse::static_create_type_code());\n\tvnx::register_type_code(::mmx::ProofServerBase::static_create_type_code());\n\tvnx::register_type_code(::mmx::ProofServer_compute::static_create_type_code());\n\tvnx::register_type_code(::mmx::ProofServer_compute_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::ReceiveNote::static_create_type_code());\n\tvnx::register_type_code(::mmx::Request::static_create_type_code());\n\tvnx::register_type_code(::mmx::Return::static_create_type_code());\n\tvnx::register_type_code(::mmx::RouterBase::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_discover::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_discover_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_fetch_block::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_fetch_block_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_fetch_block_at::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_fetch_block_at_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_blocks_at::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_blocks_at_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_connected_peers::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_connected_peers_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_id::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_id_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_info::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_info_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_known_peers::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_known_peers_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_peer_info::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_peer_info_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_peers::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_get_peers_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_kick_peer::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_kick_peer_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_sign_msg::static_create_type_code());\n\tvnx::register_type_code(::mmx::Router_sign_msg_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Solution::static_create_type_code());\n\tvnx::register_type_code(::mmx::TimeLordBase::static_create_type_code());\n\tvnx::register_type_code(::mmx::TimeLord_stop_vdf::static_create_type_code());\n\tvnx::register_type_code(::mmx::TimeLord_stop_vdf_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Transaction::static_create_type_code());\n\tvnx::register_type_code(::mmx::TransactionBase::static_create_type_code());\n\tvnx::register_type_code(::mmx::VDF_Point::static_create_type_code());\n\tvnx::register_type_code(::mmx::ValidatorVote::static_create_type_code());\n\tvnx::register_type_code(::mmx::WalletBase::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_accept_offer::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_accept_offer_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_add_account::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_add_account_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_add_token::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_add_token_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_cancel_offer::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_cancel_offer_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_complete::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_complete_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_create_account::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_create_account_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_create_wallet::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_create_wallet_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_deploy::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_deploy_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_deposit::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_deposit_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_execute::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_execute_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_export_wallet::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_export_wallet_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_find_wallet_by_addr::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_find_wallet_by_addr_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_gather_inputs_for::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_gather_inputs_for_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_account::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_account_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_address::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_address_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_all_accounts::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_all_accounts_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_all_addresses::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_all_addresses_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_all_farmer_keys::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_all_farmer_keys_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_balance::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_balance_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_balances::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_balances_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_contract_balances::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_contract_balances_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_contracts::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_contracts_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_contracts_owned::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_contracts_owned_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_farmer_keys::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_farmer_keys_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_history::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_history_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_master_seed::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_master_seed_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_mnemonic_seed::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_mnemonic_seed_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_mnemonic_wordlist::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_mnemonic_wordlist_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_offers::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_offers_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_swap_liquidity::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_swap_liquidity_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_token_list::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_token_list_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_total_balances::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_total_balances_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_tx_log::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_get_tx_log_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_import_wallet::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_import_wallet_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_is_locked::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_is_locked_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_lock::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_lock_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_make_offer::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_make_offer_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_mark_spent::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_mark_spent_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_offer_trade::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_offer_trade_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_offer_withdraw::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_offer_withdraw_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_plotnft_create::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_plotnft_create_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_plotnft_exec::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_plotnft_exec_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_release::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_release_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_release_all::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_release_all_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_rem_token::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_rem_token_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_remove_account::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_remove_account_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_reserve::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_reserve_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_reset_cache::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_reset_cache_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_send::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_send_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_send_from::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_send_from_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_send_many::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_send_many_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_send_off::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_send_off_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_set_address_count::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_set_address_count_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_sign_msg::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_sign_msg_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_sign_off::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_sign_off_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_swap_add_liquid::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_swap_add_liquid_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_swap_rem_liquid::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_swap_rem_liquid_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_swap_trade::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_swap_trade_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_unlock::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_unlock_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_update_cache::static_create_type_code());\n\tvnx::register_type_code(::mmx::Wallet_update_cache_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::WalletFile::static_create_type_code());\n\tvnx::register_type_code(::mmx::WebAPIBase::static_create_type_code());\n\tvnx::register_type_code(::mmx::WebAPI_shutdown::static_create_type_code());\n\tvnx::register_type_code(::mmx::WebAPI_shutdown_return::static_create_type_code());\n\tvnx::register_type_code(::mmx::account_info_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::account_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::balance_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::block_index_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::compile_flags_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::error_code_e::static_create_type_code());\n\tvnx::register_type_code(::mmx::exec_entry_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::exec_error_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::exec_result_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::farmed_block_info_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::farmed_block_summary_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::node_info_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::node_type_e::static_create_type_code());\n\tvnx::register_type_code(::mmx::offer_data_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::peer_info_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::permission_e::static_create_type_code());\n\tvnx::register_type_code(::mmx::plot_nft_info_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::pooling_error_e::static_create_type_code());\n\tvnx::register_type_code(::mmx::pooling_info_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::pooling_stats_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::query_filter_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::spend_options_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::swap_entry_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::swap_info_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::swap_pool_info_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::swap_user_info_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::table_entry_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::trade_entry_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::trade_log_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::tx_entry_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::tx_index_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::tx_info_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::tx_log_entry_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::tx_note_e::static_create_type_code());\n\tvnx::register_type_code(::mmx::tx_type_e::static_create_type_code());\n\tvnx::register_type_code(::mmx::txin_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::txio_entry_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::txio_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::txout_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::uint_fraction_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::ulong_fraction_t::static_create_type_code());\n\tvnx::register_type_code(::mmx::virtual_plot_info_t::static_create_type_code());\n}\n\nstatic struct vnx_static_init {\n\tvnx_static_init() {\n\t\tregister_all_types();\n\t}\n} vnx_static_init_;\n\nconst vnx::TypeCode* const vnx_native_type_code_Block = vnx::get_type_code(vnx::Hash64(0x94965d816d328467ull));\nconst vnx::TypeCode* const vnx_native_type_code_BlockHeader = vnx::get_type_code(vnx::Hash64(0xcaae941a2fc712a6ull));\nconst vnx::TypeCode* const vnx_native_type_code_ChainParams = vnx::get_type_code(vnx::Hash64(0x51bba8d28881e8e7ull));\nconst vnx::TypeCode* const vnx_native_type_code_Challenge = vnx::get_type_code(vnx::Hash64(0x4bf49f8022405249ull));\nconst vnx::TypeCode* const vnx_native_type_code_Contract = vnx::get_type_code(vnx::Hash64(0x26b896ae8c415285ull));\nconst vnx::TypeCode* const vnx_native_type_code_FarmInfo = vnx::get_type_code(vnx::Hash64(0xa2701372b9137f0eull));\nconst vnx::TypeCode* const vnx_native_type_code_FarmerBase = vnx::get_type_code(vnx::Hash64(0xff732ba14d9d1abull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_get_farm_info = vnx::get_type_code(vnx::Hash64(0x7e72655f6f215b5aull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_get_farm_info_return = vnx::get_type_code(vnx::Hash64(0xccf47453b394d3e3ull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_get_farmer_keys = vnx::get_type_code(vnx::Hash64(0x784507b4594a776aull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_get_farmer_keys_return = vnx::get_type_code(vnx::Hash64(0xdb382c476694095full));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_get_mac_addr = vnx::get_type_code(vnx::Hash64(0xe9ced9f6feb676b3ull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_get_mac_addr_return = vnx::get_type_code(vnx::Hash64(0x9e4caad2ffaba990ull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_get_partial_diff = vnx::get_type_code(vnx::Hash64(0x40f08b90e2eb4ca0ull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_get_partial_diff_return = vnx::get_type_code(vnx::Hash64(0xd5650a69bbe8d978ull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_get_partial_diffs = vnx::get_type_code(vnx::Hash64(0x8806f6763215c58bull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_get_partial_diffs_return = vnx::get_type_code(vnx::Hash64(0x439549fd31330df6ull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_sign_block = vnx::get_type_code(vnx::Hash64(0x6924b10f345eb316ull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_sign_block_return = vnx::get_type_code(vnx::Hash64(0xb8acce9269f91310ull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_sign_vote = vnx::get_type_code(vnx::Hash64(0x655117e05d64b5fcull));\nconst vnx::TypeCode* const vnx_native_type_code_Farmer_sign_vote_return = vnx::get_type_code(vnx::Hash64(0x40848c38fe18b587ull));\nconst vnx::TypeCode* const vnx_native_type_code_HarvesterBase = vnx::get_type_code(vnx::Hash64(0xc17118896cde1555ull));\nconst vnx::TypeCode* const vnx_native_type_code_Harvester_add_plot_dir = vnx::get_type_code(vnx::Hash64(0x61714d1c7ecaffddull));\nconst vnx::TypeCode* const vnx_native_type_code_Harvester_add_plot_dir_return = vnx::get_type_code(vnx::Hash64(0x8b5f7bc4f34fb5d5ull));\nconst vnx::TypeCode* const vnx_native_type_code_Harvester_get_farm_info = vnx::get_type_code(vnx::Hash64(0x129f91b9ade2891full));\nconst vnx::TypeCode* const vnx_native_type_code_Harvester_get_farm_info_return = vnx::get_type_code(vnx::Hash64(0x87a91b15ec42441full));\nconst vnx::TypeCode* const vnx_native_type_code_Harvester_get_total_bytes = vnx::get_type_code(vnx::Hash64(0x36f2104b41d9a25cull));\nconst vnx::TypeCode* const vnx_native_type_code_Harvester_get_total_bytes_return = vnx::get_type_code(vnx::Hash64(0xd9a9fe83ba7d6918ull));\nconst vnx::TypeCode* const vnx_native_type_code_Harvester_reload = vnx::get_type_code(vnx::Hash64(0xc67a4577de7e85caull));\nconst vnx::TypeCode* const vnx_native_type_code_Harvester_reload_return = vnx::get_type_code(vnx::Hash64(0x39fc8cc53bcf4659ull));\nconst vnx::TypeCode* const vnx_native_type_code_Harvester_rem_plot_dir = vnx::get_type_code(vnx::Hash64(0x57674e56f3ab6076ull));\nconst vnx::TypeCode* const vnx_native_type_code_Harvester_rem_plot_dir_return = vnx::get_type_code(vnx::Hash64(0xb2a8cfb3633bf358ull));\nconst vnx::TypeCode* const vnx_native_type_code_IntervalRequest = vnx::get_type_code(vnx::Hash64(0xa4e39be061f13d71ull));\nconst vnx::TypeCode* const vnx_native_type_code_KeyFile = vnx::get_type_code(vnx::Hash64(0xdf868931a939cba1ull));\nconst vnx::TypeCode* const vnx_native_type_code_LookupInfo = vnx::get_type_code(vnx::Hash64(0xb7b2ff343487dd63ull));\nconst vnx::TypeCode* const vnx_native_type_code_NetworkInfo = vnx::get_type_code(vnx::Hash64(0xd984018819746101ull));\nconst vnx::TypeCode* const vnx_native_type_code_NodeBase = vnx::get_type_code(vnx::Hash64(0x289d7651582d76a3ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_add_block = vnx::get_type_code(vnx::Hash64(0x63abca4d23f93894ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_add_block_return = vnx::get_type_code(vnx::Hash64(0xb6d1115db03a6d6aull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_add_transaction = vnx::get_type_code(vnx::Hash64(0xd9782531c0e3f766ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_add_transaction_return = vnx::get_type_code(vnx::Hash64(0x2ded8c10e1721ba8ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_call_contract = vnx::get_type_code(vnx::Hash64(0x6a21b0dfe3e541e8ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_call_contract_return = vnx::get_type_code(vnx::Hash64(0x8449f6656a89f7aeull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_dump_storage = vnx::get_type_code(vnx::Hash64(0x8b66a712eea839bbull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_dump_storage_return = vnx::get_type_code(vnx::Hash64(0xbc8c0b1ce37def41ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_fetch_offers = vnx::get_type_code(vnx::Hash64(0xfca08ee41b997129ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_fetch_offers_return = vnx::get_type_code(vnx::Hash64(0x8c5cc826b759938bull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_all_balances = vnx::get_type_code(vnx::Hash64(0xe099ac5aea49433ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_all_balances_return = vnx::get_type_code(vnx::Hash64(0x80800e710295b3c1ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_balance = vnx::get_type_code(vnx::Hash64(0x2e00172d0470479ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_balance_return = vnx::get_type_code(vnx::Hash64(0xe29d98f8f1ab3e21ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_balances = vnx::get_type_code(vnx::Hash64(0x1c8af02c41e96460ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_balances_return = vnx::get_type_code(vnx::Hash64(0x1e00f02ae6304cf0ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_block = vnx::get_type_code(vnx::Hash64(0xeb3fabe56dec161aull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_block_return = vnx::get_type_code(vnx::Hash64(0x6d9abdbf20c4b4d2ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_block_at = vnx::get_type_code(vnx::Hash64(0xc69c9f876a00e48full));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_block_at_return = vnx::get_type_code(vnx::Hash64(0x6e3c22a7391c5491ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_block_hash = vnx::get_type_code(vnx::Hash64(0x43c5087066b73f38ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_block_hash_return = vnx::get_type_code(vnx::Hash64(0x47877c5597b978dfull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_block_hash_ex = vnx::get_type_code(vnx::Hash64(0x6024ae54abca18cbull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_block_hash_ex_return = vnx::get_type_code(vnx::Hash64(0x8d82a7b11dfd7a4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contract = vnx::get_type_code(vnx::Hash64(0xa28704c65a67a293ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contract_return = vnx::get_type_code(vnx::Hash64(0x314d0901de362f8cull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contract_balances = vnx::get_type_code(vnx::Hash64(0xeb1e66155927b13aull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contract_balances_return = vnx::get_type_code(vnx::Hash64(0x4974c6093398e264ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contract_for = vnx::get_type_code(vnx::Hash64(0x6a953dcea83b9832ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contract_for_return = vnx::get_type_code(vnx::Hash64(0xde97319367a6d647ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contracts = vnx::get_type_code(vnx::Hash64(0x49e218583c1f1c8aull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contracts_return = vnx::get_type_code(vnx::Hash64(0x13d73d6d69c8af0bull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contracts_by = vnx::get_type_code(vnx::Hash64(0xe7c397362a63f57cull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contracts_by_return = vnx::get_type_code(vnx::Hash64(0x9ad1099f1adf2565ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contracts_owned_by = vnx::get_type_code(vnx::Hash64(0x63989a04fee2fba4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_contracts_owned_by_return = vnx::get_type_code(vnx::Hash64(0x3b9dbec85ee482bfull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_exec_history = vnx::get_type_code(vnx::Hash64(0xf17c2f67bedb9df6ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_exec_history_return = vnx::get_type_code(vnx::Hash64(0x17079d265ede8785ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_farmed_block_summary = vnx::get_type_code(vnx::Hash64(0xa6cda1247bd4f537ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_farmed_block_summary_return = vnx::get_type_code(vnx::Hash64(0xef3dcd5d4d2a58e3ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_farmed_blocks = vnx::get_type_code(vnx::Hash64(0xfc412d06ff25542eull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_farmed_blocks_return = vnx::get_type_code(vnx::Hash64(0xe8697ffd381616baull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_farmer_ranking = vnx::get_type_code(vnx::Hash64(0x548d571d6384bd43ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_farmer_ranking_return = vnx::get_type_code(vnx::Hash64(0xb74e7f1a70a60ecdull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_genesis_hash = vnx::get_type_code(vnx::Hash64(0xbfab786cb64c5a3ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_genesis_hash_return = vnx::get_type_code(vnx::Hash64(0x5c5ea53e3163fd5ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_header = vnx::get_type_code(vnx::Hash64(0xf17a5d0c180db198ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_header_return = vnx::get_type_code(vnx::Hash64(0xeffae31958103da7ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_header_at = vnx::get_type_code(vnx::Hash64(0x52658163d8767c79ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_header_at_return = vnx::get_type_code(vnx::Hash64(0x4efc6897885ee521ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_height = vnx::get_type_code(vnx::Hash64(0x55f0d4ef7a117716ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_height_return = vnx::get_type_code(vnx::Hash64(0x5fb0ff1e11add033ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_history = vnx::get_type_code(vnx::Hash64(0x8b3db05c6e91011dull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_history_return = vnx::get_type_code(vnx::Hash64(0xa925b7aa92603121ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_history_memo = vnx::get_type_code(vnx::Hash64(0x693c0c791039287cull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_history_memo_return = vnx::get_type_code(vnx::Hash64(0x3bba2b40c2e82885ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_network_info = vnx::get_type_code(vnx::Hash64(0x79cedc8662eeb2e4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_network_info_return = vnx::get_type_code(vnx::Hash64(0x28541acc5945ae0eull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_offer = vnx::get_type_code(vnx::Hash64(0xd3e336e279686563ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_offer_return = vnx::get_type_code(vnx::Hash64(0xa92bb7b910e3424full));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_offers = vnx::get_type_code(vnx::Hash64(0x62e5e37dd72d3175ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_offers_return = vnx::get_type_code(vnx::Hash64(0xf93f5d6546a50db1ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_offers_by = vnx::get_type_code(vnx::Hash64(0xf83c55f59e407411ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_offers_by_return = vnx::get_type_code(vnx::Hash64(0x59efe1350028d6f4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_params = vnx::get_type_code(vnx::Hash64(0x6384b34900c2e465ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_params_return = vnx::get_type_code(vnx::Hash64(0xd0a614f2ed037180ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_plot_nft_info = vnx::get_type_code(vnx::Hash64(0x23efbfd355a3741full));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_plot_nft_info_return = vnx::get_type_code(vnx::Hash64(0x4d3661c719d8496bull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_plot_nft_target = vnx::get_type_code(vnx::Hash64(0x14dfd6e2b1f3282eull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_plot_nft_target_return = vnx::get_type_code(vnx::Hash64(0x6d6444fd1b89732ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_recent_offers = vnx::get_type_code(vnx::Hash64(0xfcd729efd0504fdeull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_recent_offers_return = vnx::get_type_code(vnx::Hash64(0x15933813d284d584ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_recent_offers_for = vnx::get_type_code(vnx::Hash64(0xd89f845556eb17a0ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_recent_offers_for_return = vnx::get_type_code(vnx::Hash64(0x8fbaa054b954ea7bull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_equivalent_liquidity = vnx::get_type_code(vnx::Hash64(0xc43a3083725aa480ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_equivalent_liquidity_return = vnx::get_type_code(vnx::Hash64(0x8222183b679ab5f4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_fees_earned = vnx::get_type_code(vnx::Hash64(0x1dae57fb82265b93ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_fees_earned_return = vnx::get_type_code(vnx::Hash64(0x57002afc89a8db98ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_history = vnx::get_type_code(vnx::Hash64(0xc16faaf15fcc9f36ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_history_return = vnx::get_type_code(vnx::Hash64(0xe5d18002a6793518ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_info = vnx::get_type_code(vnx::Hash64(0x14f546a807fae18cull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_info_return = vnx::get_type_code(vnx::Hash64(0x302116742171428ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_liquidity_by = vnx::get_type_code(vnx::Hash64(0x426cded100da751eull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_liquidity_by_return = vnx::get_type_code(vnx::Hash64(0x8401973e1930a6c0ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_trade_estimate = vnx::get_type_code(vnx::Hash64(0x1c3d2e0c3a431e9eull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_trade_estimate_return = vnx::get_type_code(vnx::Hash64(0xdad9da7cd6d250a8ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_user_info = vnx::get_type_code(vnx::Hash64(0xb92b8fb7df56ec0full));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swap_user_info_return = vnx::get_type_code(vnx::Hash64(0x50fb0bab9551a420ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swaps = vnx::get_type_code(vnx::Hash64(0x219bbb3e5dcd19eaull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_swaps_return = vnx::get_type_code(vnx::Hash64(0x6c94172788fc0d28ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_synced_height = vnx::get_type_code(vnx::Hash64(0xc4fb44ec3d1a8bb7ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_synced_height_return = vnx::get_type_code(vnx::Hash64(0xd466ce92d1bbe9dbull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_synced_vdf_height = vnx::get_type_code(vnx::Hash64(0x3c9ce92abd3b42c6ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_synced_vdf_height_return = vnx::get_type_code(vnx::Hash64(0x1122764a35c86b4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_total_balance = vnx::get_type_code(vnx::Hash64(0x91e9019d224db4b0ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_total_balance_return = vnx::get_type_code(vnx::Hash64(0x3336380a894f52a8ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_total_balances = vnx::get_type_code(vnx::Hash64(0xf54c4ec46ee6053aull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_total_balances_return = vnx::get_type_code(vnx::Hash64(0x9332c7a83f7644d7ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_total_supply = vnx::get_type_code(vnx::Hash64(0x17d971db6900bd9dull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_total_supply_return = vnx::get_type_code(vnx::Hash64(0xe69f15a0766eaf27ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_trade_history = vnx::get_type_code(vnx::Hash64(0x62736b035e3995cdull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_trade_history_return = vnx::get_type_code(vnx::Hash64(0x4d3692b594dd7f9eull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_trade_history_for = vnx::get_type_code(vnx::Hash64(0xd55cda633e3dd5b8ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_trade_history_for_return = vnx::get_type_code(vnx::Hash64(0xd61154789cdb246bull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_transaction = vnx::get_type_code(vnx::Hash64(0x9c76ca142292750full));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_transaction_return = vnx::get_type_code(vnx::Hash64(0x3848f078ff4024dull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_transactions = vnx::get_type_code(vnx::Hash64(0x715a5bb668426203ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_transactions_return = vnx::get_type_code(vnx::Hash64(0xd11c40a507abaaaull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_height = vnx::get_type_code(vnx::Hash64(0xf6f917fad9361e3aull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_height_return = vnx::get_type_code(vnx::Hash64(0xda69a0d06f4b5c3eull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids = vnx::get_type_code(vnx::Hash64(0xe268e5bf2a7f22d6ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids_return = vnx::get_type_code(vnx::Hash64(0xba3ffcf776e64920ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids_at = vnx::get_type_code(vnx::Hash64(0x904c686b59c101c3ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids_at_return = vnx::get_type_code(vnx::Hash64(0x945565d9cbfadc31ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids_since = vnx::get_type_code(vnx::Hash64(0x640af36b555e1606ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_ids_since_return = vnx::get_type_code(vnx::Hash64(0xe5c1511a48d2d288ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_info = vnx::get_type_code(vnx::Hash64(0xb5409a3aaa19d1d2ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_info_return = vnx::get_type_code(vnx::Hash64(0x3668f41cc643227full));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_info_for = vnx::get_type_code(vnx::Hash64(0xba1c6e6eccfe9369ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_tx_info_for_return = vnx::get_type_code(vnx::Hash64(0xfd527dc84681a04ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_vdf_height = vnx::get_type_code(vnx::Hash64(0x33db3aa655c4e5feull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_vdf_height_return = vnx::get_type_code(vnx::Hash64(0x5f83cae2903e53bfull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_vdf_peak = vnx::get_type_code(vnx::Hash64(0xf3449b43830283ddull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_get_vdf_peak_return = vnx::get_type_code(vnx::Hash64(0x837f2b6433a274a1ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage = vnx::get_type_code(vnx::Hash64(0xd74cd2b291cb9cd6ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_return = vnx::get_type_code(vnx::Hash64(0xab73866ba23ed19aull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_array = vnx::get_type_code(vnx::Hash64(0xe5826950ca0a442bull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_array_return = vnx::get_type_code(vnx::Hash64(0xba7fed069216454dull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_addr = vnx::get_type_code(vnx::Hash64(0xffbf8c4478bb5ab5ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_addr_return = vnx::get_type_code(vnx::Hash64(0xacd2f58f1ca8df54ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_string = vnx::get_type_code(vnx::Hash64(0xe5b52723a3714e9full));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_string_return = vnx::get_type_code(vnx::Hash64(0x56c6103ea03d7ceaull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_var = vnx::get_type_code(vnx::Hash64(0xb0ebcc688396e6dbull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_entry_var_return = vnx::get_type_code(vnx::Hash64(0x773a90b50f714a11ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_field = vnx::get_type_code(vnx::Hash64(0xc9a10c9f7f2cef16ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_field_return = vnx::get_type_code(vnx::Hash64(0xf817bcace12b9ef3ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_map = vnx::get_type_code(vnx::Hash64(0x1cc0cc12bc2c1b4eull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_map_return = vnx::get_type_code(vnx::Hash64(0x1d56300164b3e79ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_object = vnx::get_type_code(vnx::Hash64(0x5930cf36eeb662fbull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_object_return = vnx::get_type_code(vnx::Hash64(0x48c9a69123ef41afull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_var = vnx::get_type_code(vnx::Hash64(0x16d0361bcb359c2full));\nconst vnx::TypeCode* const vnx_native_type_code_Node_read_storage_var_return = vnx::get_type_code(vnx::Hash64(0xaaa6685b20943467ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_revert_sync = vnx::get_type_code(vnx::Hash64(0x8c1cc38a7a8a6c1dull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_revert_sync_return = vnx::get_type_code(vnx::Hash64(0x3962a4b86b203e0aull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_start_sync = vnx::get_type_code(vnx::Hash64(0x6c5be8aeb25ef3c8ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_start_sync_return = vnx::get_type_code(vnx::Hash64(0xe75b8e6a62d7e744ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_validate = vnx::get_type_code(vnx::Hash64(0x95dbbd65f36b618ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_validate_return = vnx::get_type_code(vnx::Hash64(0xe3c465d0fc0c4a4cull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_verify_partial = vnx::get_type_code(vnx::Hash64(0xeb15396685387f88ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_verify_partial_return = vnx::get_type_code(vnx::Hash64(0xb64fb769c6ffcf36ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_verify_plot_nft_target = vnx::get_type_code(vnx::Hash64(0xf3ac786edcae50e1ull));\nconst vnx::TypeCode* const vnx_native_type_code_Node_verify_plot_nft_target_return = vnx::get_type_code(vnx::Hash64(0x82f0f6ed43a0c4bull));\nconst vnx::TypeCode* const vnx_native_type_code_Operation = vnx::get_type_code(vnx::Hash64(0xfd69dd82e906e619ull));\nconst vnx::TypeCode* const vnx_native_type_code_Partial = vnx::get_type_code(vnx::Hash64(0x2c849b13a7efd71aull));\nconst vnx::TypeCode* const vnx_native_type_code_PeerInfo = vnx::get_type_code(vnx::Hash64(0xf7a37f624c94a121ull));\nconst vnx::TypeCode* const vnx_native_type_code_PlotHeader = vnx::get_type_code(vnx::Hash64(0x299c5790983c47b6ull));\nconst vnx::TypeCode* const vnx_native_type_code_ProofOfSpace = vnx::get_type_code(vnx::Hash64(0x9269760ad5fd0058ull));\nconst vnx::TypeCode* const vnx_native_type_code_ProofOfSpaceNFT = vnx::get_type_code(vnx::Hash64(0x22a4d97166711bd9ull));\nconst vnx::TypeCode* const vnx_native_type_code_ProofOfSpaceOG = vnx::get_type_code(vnx::Hash64(0x6def5518efc37b4ull));\nconst vnx::TypeCode* const vnx_native_type_code_ProofOfTime = vnx::get_type_code(vnx::Hash64(0xa84a63942b8e5c6aull));\nconst vnx::TypeCode* const vnx_native_type_code_ProofResponse = vnx::get_type_code(vnx::Hash64(0x816e898b36befae0ull));\nconst vnx::TypeCode* const vnx_native_type_code_ProofServerBase = vnx::get_type_code(vnx::Hash64(0xa531590f144986a6ull));\nconst vnx::TypeCode* const vnx_native_type_code_ProofServer_compute = vnx::get_type_code(vnx::Hash64(0x1565fa29d1604750ull));\nconst vnx::TypeCode* const vnx_native_type_code_ProofServer_compute_return = vnx::get_type_code(vnx::Hash64(0x5b42e049360ce028ull));\nconst vnx::TypeCode* const vnx_native_type_code_ReceiveNote = vnx::get_type_code(vnx::Hash64(0x30439468cf29fa4bull));\nconst vnx::TypeCode* const vnx_native_type_code_Request = vnx::get_type_code(vnx::Hash64(0x110ce6958669f66bull));\nconst vnx::TypeCode* const vnx_native_type_code_Return = vnx::get_type_code(vnx::Hash64(0xb479dce669278664ull));\nconst vnx::TypeCode* const vnx_native_type_code_RouterBase = vnx::get_type_code(vnx::Hash64(0x952c4ef2956f31c4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_discover = vnx::get_type_code(vnx::Hash64(0xeda51767d96e246cull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_discover_return = vnx::get_type_code(vnx::Hash64(0xb4e47e012f264f94ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_fetch_block = vnx::get_type_code(vnx::Hash64(0x7c2f762681e7cc51ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_fetch_block_return = vnx::get_type_code(vnx::Hash64(0xcbe76155006bbb44ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_fetch_block_at = vnx::get_type_code(vnx::Hash64(0xa4deba522ed6f8adull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_fetch_block_at_return = vnx::get_type_code(vnx::Hash64(0xff711a762d6f885ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_blocks_at = vnx::get_type_code(vnx::Hash64(0x1eb0c0d7eae3c33aull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_blocks_at_return = vnx::get_type_code(vnx::Hash64(0x70f0e9e7aa72b810ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_connected_peers = vnx::get_type_code(vnx::Hash64(0x8682feb65fbb77feull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_connected_peers_return = vnx::get_type_code(vnx::Hash64(0x5c96b95e03d32e32ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_id = vnx::get_type_code(vnx::Hash64(0xb9f7168b5ae94cd9ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_id_return = vnx::get_type_code(vnx::Hash64(0x3924146b7a803806ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_info = vnx::get_type_code(vnx::Hash64(0x364ea887c149a265ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_info_return = vnx::get_type_code(vnx::Hash64(0x15170c71ca9209a9ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_known_peers = vnx::get_type_code(vnx::Hash64(0xaa408b6bf4e8168dull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_known_peers_return = vnx::get_type_code(vnx::Hash64(0xc08cde4fbf7f2abcull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_peer_info = vnx::get_type_code(vnx::Hash64(0x520a467ef9324cb3ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_peer_info_return = vnx::get_type_code(vnx::Hash64(0xffff4ae0244281b5ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_peers = vnx::get_type_code(vnx::Hash64(0x66d68bd91b462049ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_get_peers_return = vnx::get_type_code(vnx::Hash64(0x595714f80f272d86ull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_kick_peer = vnx::get_type_code(vnx::Hash64(0x359a21379021beedull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_kick_peer_return = vnx::get_type_code(vnx::Hash64(0xd7189e110cc3a50full));\nconst vnx::TypeCode* const vnx_native_type_code_Router_sign_msg = vnx::get_type_code(vnx::Hash64(0x88ede2fbb99ab63eull));\nconst vnx::TypeCode* const vnx_native_type_code_Router_sign_msg_return = vnx::get_type_code(vnx::Hash64(0x67c8c37a7b5fc991ull));\nconst vnx::TypeCode* const vnx_native_type_code_Solution = vnx::get_type_code(vnx::Hash64(0x9f693babd1a91ccdull));\nconst vnx::TypeCode* const vnx_native_type_code_TimeLordBase = vnx::get_type_code(vnx::Hash64(0x311081636f6570efull));\nconst vnx::TypeCode* const vnx_native_type_code_TimeLord_stop_vdf = vnx::get_type_code(vnx::Hash64(0xf7f78eb9f371e6e7ull));\nconst vnx::TypeCode* const vnx_native_type_code_TimeLord_stop_vdf_return = vnx::get_type_code(vnx::Hash64(0x53e37fb500ea3a9full));\nconst vnx::TypeCode* const vnx_native_type_code_Transaction = vnx::get_type_code(vnx::Hash64(0xce0462acdceaa5bcull));\nconst vnx::TypeCode* const vnx_native_type_code_TransactionBase = vnx::get_type_code(vnx::Hash64(0x6697ffbf3611887dull));\nconst vnx::TypeCode* const vnx_native_type_code_VDF_Point = vnx::get_type_code(vnx::Hash64(0x1671551501b6c956ull));\nconst vnx::TypeCode* const vnx_native_type_code_ValidatorVote = vnx::get_type_code(vnx::Hash64(0xc056a2ff24cdee25ull));\nconst vnx::TypeCode* const vnx_native_type_code_WalletBase = vnx::get_type_code(vnx::Hash64(0x62207fd96d3aead7ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_accept_offer = vnx::get_type_code(vnx::Hash64(0x3299e81eb354b78full));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_accept_offer_return = vnx::get_type_code(vnx::Hash64(0xb44ec1a26ab66acdull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_add_account = vnx::get_type_code(vnx::Hash64(0x92d2d3518d9c33aeull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_add_account_return = vnx::get_type_code(vnx::Hash64(0xda0b2d71dd9e8336ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_add_token = vnx::get_type_code(vnx::Hash64(0x15fcc67eabc550b6ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_add_token_return = vnx::get_type_code(vnx::Hash64(0xb0b00a9f88ea83b5ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_cancel_offer = vnx::get_type_code(vnx::Hash64(0x200cca704ba873c6ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_cancel_offer_return = vnx::get_type_code(vnx::Hash64(0x86f3531ebf8c56a2ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_complete = vnx::get_type_code(vnx::Hash64(0x20da222e7c7de702ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_complete_return = vnx::get_type_code(vnx::Hash64(0x490ab9293f9dbfd0ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_create_account = vnx::get_type_code(vnx::Hash64(0x11cd618b00e9e56cull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_create_account_return = vnx::get_type_code(vnx::Hash64(0x3a0ff64dc755a8d8ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_create_wallet = vnx::get_type_code(vnx::Hash64(0xdcc08a3a1b171a19ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_create_wallet_return = vnx::get_type_code(vnx::Hash64(0xb417dca300f1949bull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_deploy = vnx::get_type_code(vnx::Hash64(0xcd71b07853d17497ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_deploy_return = vnx::get_type_code(vnx::Hash64(0x7de4805b16e313f6ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_deposit = vnx::get_type_code(vnx::Hash64(0x4bf71b9049e1c689ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_deposit_return = vnx::get_type_code(vnx::Hash64(0xf21ba8f2309d78aeull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_execute = vnx::get_type_code(vnx::Hash64(0x51a1276a27db7b4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_execute_return = vnx::get_type_code(vnx::Hash64(0x9a51f18a1c26c764ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_export_wallet = vnx::get_type_code(vnx::Hash64(0xd52b494df565ce7ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_export_wallet_return = vnx::get_type_code(vnx::Hash64(0x1c82818ba92b03f4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_find_wallet_by_addr = vnx::get_type_code(vnx::Hash64(0x320237e79adcef6bull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_find_wallet_by_addr_return = vnx::get_type_code(vnx::Hash64(0xdae07576f8844f6aull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_gather_inputs_for = vnx::get_type_code(vnx::Hash64(0x31d9b9888b8c2de3ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_gather_inputs_for_return = vnx::get_type_code(vnx::Hash64(0xb099ed949b98dc77ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_account = vnx::get_type_code(vnx::Hash64(0xf9669d0d42aec09eull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_account_return = vnx::get_type_code(vnx::Hash64(0xaed020aa500eed2bull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_address = vnx::get_type_code(vnx::Hash64(0xccad8dfe1543aa77ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_address_return = vnx::get_type_code(vnx::Hash64(0x4c76a08d8d85c4e4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_accounts = vnx::get_type_code(vnx::Hash64(0xdf8bfad64085cb83ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_accounts_return = vnx::get_type_code(vnx::Hash64(0x2bb48cc4299c5782ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_addresses = vnx::get_type_code(vnx::Hash64(0xf5e2b4554613fd97ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_addresses_return = vnx::get_type_code(vnx::Hash64(0x2f16846155284194ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_farmer_keys = vnx::get_type_code(vnx::Hash64(0xc6a03b3f813d071dull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_all_farmer_keys_return = vnx::get_type_code(vnx::Hash64(0xa2de9b0aaffc515aull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_balance = vnx::get_type_code(vnx::Hash64(0x1bc2c2dd67ab2829ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_balance_return = vnx::get_type_code(vnx::Hash64(0xfa00e6f62563141full));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_balances = vnx::get_type_code(vnx::Hash64(0x5be581d54ae69a4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_balances_return = vnx::get_type_code(vnx::Hash64(0xe041fcc6b3606c0full));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_contract_balances = vnx::get_type_code(vnx::Hash64(0x4d6b36c0c2804d26ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_contract_balances_return = vnx::get_type_code(vnx::Hash64(0x7800bce5a77b8bdcull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_contracts = vnx::get_type_code(vnx::Hash64(0x9ff1932bcec18d57ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_contracts_return = vnx::get_type_code(vnx::Hash64(0xf384dd12e1fac072ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_contracts_owned = vnx::get_type_code(vnx::Hash64(0x7834485ec000f577ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_contracts_owned_return = vnx::get_type_code(vnx::Hash64(0x40aec1bc5f5f5c90ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_farmer_keys = vnx::get_type_code(vnx::Hash64(0x44709e11ff3ff3eeull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_farmer_keys_return = vnx::get_type_code(vnx::Hash64(0x25479f868269fbb0ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_history = vnx::get_type_code(vnx::Hash64(0x921f73f3d97d2d4dull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_history_return = vnx::get_type_code(vnx::Hash64(0xb1b8c9a446a81b1full));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_master_seed = vnx::get_type_code(vnx::Hash64(0x8fddd77ece4d295bull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_master_seed_return = vnx::get_type_code(vnx::Hash64(0x8b0f38e742e132f0ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_mnemonic_seed = vnx::get_type_code(vnx::Hash64(0xacf58d3b1a8ce4c0ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_mnemonic_seed_return = vnx::get_type_code(vnx::Hash64(0xd02dd0736911ac8bull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_mnemonic_wordlist = vnx::get_type_code(vnx::Hash64(0xb833298e3ff28a44ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_mnemonic_wordlist_return = vnx::get_type_code(vnx::Hash64(0x8ce49a9b57ee5789ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_offers = vnx::get_type_code(vnx::Hash64(0x6dacbe70cbe08925ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_offers_return = vnx::get_type_code(vnx::Hash64(0xdb130e20d160c564ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_swap_liquidity = vnx::get_type_code(vnx::Hash64(0x3a8f17d496f625bull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_swap_liquidity_return = vnx::get_type_code(vnx::Hash64(0x6846e8caa82b1463ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_token_list = vnx::get_type_code(vnx::Hash64(0x322b4f4af3737efcull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_token_list_return = vnx::get_type_code(vnx::Hash64(0xe36d7210ddf3d216ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_total_balances = vnx::get_type_code(vnx::Hash64(0xedd130caba2e2f04ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_total_balances_return = vnx::get_type_code(vnx::Hash64(0x46f0368d7c4e45ddull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_tx_log = vnx::get_type_code(vnx::Hash64(0xc5570936be29c0ebull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_get_tx_log_return = vnx::get_type_code(vnx::Hash64(0x5c6d4b8fc9820ec1ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_import_wallet = vnx::get_type_code(vnx::Hash64(0x63a1d5b2fe482dd1ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_import_wallet_return = vnx::get_type_code(vnx::Hash64(0xc6edac537d44ecd1ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_is_locked = vnx::get_type_code(vnx::Hash64(0x6087e83febcc233ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_is_locked_return = vnx::get_type_code(vnx::Hash64(0x1ea1b30193de8d7bull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_lock = vnx::get_type_code(vnx::Hash64(0x9072deb8ab538b2bull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_lock_return = vnx::get_type_code(vnx::Hash64(0x74cb9d670ae675f3ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_make_offer = vnx::get_type_code(vnx::Hash64(0x8b0cf597e8265a73ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_make_offer_return = vnx::get_type_code(vnx::Hash64(0xf8ecff218266aadaull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_mark_spent = vnx::get_type_code(vnx::Hash64(0x107fed23348b3333ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_mark_spent_return = vnx::get_type_code(vnx::Hash64(0xf28950d2b8f874dfull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_offer_trade = vnx::get_type_code(vnx::Hash64(0x557a94a5a4887bf2ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_offer_trade_return = vnx::get_type_code(vnx::Hash64(0xb43f9bef89670cebull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_offer_withdraw = vnx::get_type_code(vnx::Hash64(0x790a334fbf5dd1e6ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_offer_withdraw_return = vnx::get_type_code(vnx::Hash64(0xea9f43cd17c41965ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_plotnft_create = vnx::get_type_code(vnx::Hash64(0x6b0c985ca2c555c9ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_plotnft_create_return = vnx::get_type_code(vnx::Hash64(0x349cedc7d1d4dcfull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_plotnft_exec = vnx::get_type_code(vnx::Hash64(0xca9e9d0dfde795d1ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_plotnft_exec_return = vnx::get_type_code(vnx::Hash64(0x8330b38d9cb47b24ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_release = vnx::get_type_code(vnx::Hash64(0x2cd72a3370e05db3ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_release_return = vnx::get_type_code(vnx::Hash64(0xd302995a8c4dcf83ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_release_all = vnx::get_type_code(vnx::Hash64(0x4bd57b9deca4be51ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_release_all_return = vnx::get_type_code(vnx::Hash64(0xf7029fb06b3b3fa5ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_rem_token = vnx::get_type_code(vnx::Hash64(0xc913cdd1600a2609ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_rem_token_return = vnx::get_type_code(vnx::Hash64(0xb59ee8fb44d30755ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_remove_account = vnx::get_type_code(vnx::Hash64(0xdf7d8816958bcb8bull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_remove_account_return = vnx::get_type_code(vnx::Hash64(0x8e0d71e4003dca80ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_reserve = vnx::get_type_code(vnx::Hash64(0xd14c466e8e7ebd76ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_reserve_return = vnx::get_type_code(vnx::Hash64(0x79de0793f575d4d6ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_reset_cache = vnx::get_type_code(vnx::Hash64(0x922c4f0299ea0bf4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_reset_cache_return = vnx::get_type_code(vnx::Hash64(0x59e9fbfbf5d8218bull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_send = vnx::get_type_code(vnx::Hash64(0x3842658ae3c2d5ebull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_send_return = vnx::get_type_code(vnx::Hash64(0x5df7b911342a1e6full));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_send_from = vnx::get_type_code(vnx::Hash64(0x40c3c88665341592ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_send_from_return = vnx::get_type_code(vnx::Hash64(0xf578239f07abf05dull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_send_many = vnx::get_type_code(vnx::Hash64(0x4f35769a1b4c6786ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_send_many_return = vnx::get_type_code(vnx::Hash64(0x828bddc86fbaf1e1ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_send_off = vnx::get_type_code(vnx::Hash64(0x8b7bfc0751d27adbull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_send_off_return = vnx::get_type_code(vnx::Hash64(0x9b9017e8636e8571ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_set_address_count = vnx::get_type_code(vnx::Hash64(0x9638ddc0c1d52b15ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_set_address_count_return = vnx::get_type_code(vnx::Hash64(0x5948620640c50bf8ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_sign_msg = vnx::get_type_code(vnx::Hash64(0x5bc54cc8b0112d3aull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_sign_msg_return = vnx::get_type_code(vnx::Hash64(0x5cf2f6b20fa33f51ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_sign_off = vnx::get_type_code(vnx::Hash64(0x232c89cf3ed4d5b1ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_sign_off_return = vnx::get_type_code(vnx::Hash64(0x4b2ee7febe4ec00aull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_swap_add_liquid = vnx::get_type_code(vnx::Hash64(0xe053d1ae718e2f64ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_swap_add_liquid_return = vnx::get_type_code(vnx::Hash64(0xc2812565c73ec527ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_swap_rem_liquid = vnx::get_type_code(vnx::Hash64(0x6494b41c51e158eaull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_swap_rem_liquid_return = vnx::get_type_code(vnx::Hash64(0x946935a83dd0b8d2ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_swap_trade = vnx::get_type_code(vnx::Hash64(0x4b5a42cbf6657910ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_swap_trade_return = vnx::get_type_code(vnx::Hash64(0x8fe4c13b007c63f4ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_unlock = vnx::get_type_code(vnx::Hash64(0x800deedf12a4df74ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_unlock_return = vnx::get_type_code(vnx::Hash64(0xe8e5c839343f6bbcull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_update_cache = vnx::get_type_code(vnx::Hash64(0xf98cf07accda73b8ull));\nconst vnx::TypeCode* const vnx_native_type_code_Wallet_update_cache_return = vnx::get_type_code(vnx::Hash64(0x7e1b25fb37caf248ull));\nconst vnx::TypeCode* const vnx_native_type_code_WalletFile = vnx::get_type_code(vnx::Hash64(0xefcdc0f20fc4360eull));\nconst vnx::TypeCode* const vnx_native_type_code_WebAPIBase = vnx::get_type_code(vnx::Hash64(0xfe90ce601fcc0cc6ull));\nconst vnx::TypeCode* const vnx_native_type_code_WebAPI_shutdown = vnx::get_type_code(vnx::Hash64(0x75dd6111dc25b9d6ull));\nconst vnx::TypeCode* const vnx_native_type_code_WebAPI_shutdown_return = vnx::get_type_code(vnx::Hash64(0x248624ff297c34ull));\nconst vnx::TypeCode* const vnx_native_type_code_account_info_t = vnx::get_type_code(vnx::Hash64(0x5858a2f32468feaeull));\nconst vnx::TypeCode* const vnx_native_type_code_account_t = vnx::get_type_code(vnx::Hash64(0xc0c163f453729a7ull));\nconst vnx::TypeCode* const vnx_native_type_code_balance_t = vnx::get_type_code(vnx::Hash64(0x613173c7e5ce65b4ull));\nconst vnx::TypeCode* const vnx_native_type_code_block_index_t = vnx::get_type_code(vnx::Hash64(0xd00c722670bca900ull));\nconst vnx::TypeCode* const vnx_native_type_code_compile_flags_t = vnx::get_type_code(vnx::Hash64(0x2d1279b3d438d884ull));\nconst vnx::TypeCode* const vnx_native_type_code_error_code_e = vnx::get_type_code(vnx::Hash64(0xc3330407879f46ull));\nconst vnx::TypeCode* const vnx_native_type_code_exec_entry_t = vnx::get_type_code(vnx::Hash64(0xd30282844b1862a4ull));\nconst vnx::TypeCode* const vnx_native_type_code_exec_error_t = vnx::get_type_code(vnx::Hash64(0x5cd84f2d984d4bfull));\nconst vnx::TypeCode* const vnx_native_type_code_exec_result_t = vnx::get_type_code(vnx::Hash64(0x18fe02e2374b039eull));\nconst vnx::TypeCode* const vnx_native_type_code_farmed_block_info_t = vnx::get_type_code(vnx::Hash64(0x2e10154a52617b19ull));\nconst vnx::TypeCode* const vnx_native_type_code_farmed_block_summary_t = vnx::get_type_code(vnx::Hash64(0x9fe2bac01782721dull));\nconst vnx::TypeCode* const vnx_native_type_code_node_info_t = vnx::get_type_code(vnx::Hash64(0xda45b5e3a527588eull));\nconst vnx::TypeCode* const vnx_native_type_code_node_type_e = vnx::get_type_code(vnx::Hash64(0xa5de458f1ce5539aull));\nconst vnx::TypeCode* const vnx_native_type_code_offer_data_t = vnx::get_type_code(vnx::Hash64(0xc97a08a709a5f1efull));\nconst vnx::TypeCode* const vnx_native_type_code_peer_info_t = vnx::get_type_code(vnx::Hash64(0xce0ff32e89625afbull));\nconst vnx::TypeCode* const vnx_native_type_code_permission_e = vnx::get_type_code(vnx::Hash64(0x7d75a3f04c313898ull));\nconst vnx::TypeCode* const vnx_native_type_code_plot_nft_info_t = vnx::get_type_code(vnx::Hash64(0xf8e0b44f3c0a54aeull));\nconst vnx::TypeCode* const vnx_native_type_code_pooling_error_e = vnx::get_type_code(vnx::Hash64(0xec786b877a93f17ull));\nconst vnx::TypeCode* const vnx_native_type_code_pooling_info_t = vnx::get_type_code(vnx::Hash64(0xbddcc977498f516full));\nconst vnx::TypeCode* const vnx_native_type_code_pooling_stats_t = vnx::get_type_code(vnx::Hash64(0xb2441a254359df11ull));\nconst vnx::TypeCode* const vnx_native_type_code_query_filter_t = vnx::get_type_code(vnx::Hash64(0x92b02006aeea9a76ull));\nconst vnx::TypeCode* const vnx_native_type_code_spend_options_t = vnx::get_type_code(vnx::Hash64(0x37f7c6d377362e95ull));\nconst vnx::TypeCode* const vnx_native_type_code_swap_entry_t = vnx::get_type_code(vnx::Hash64(0xe3110712aa0f6064ull));\nconst vnx::TypeCode* const vnx_native_type_code_swap_info_t = vnx::get_type_code(vnx::Hash64(0x7586be908f15ae8ull));\nconst vnx::TypeCode* const vnx_native_type_code_swap_pool_info_t = vnx::get_type_code(vnx::Hash64(0x6502e235a743dabull));\nconst vnx::TypeCode* const vnx_native_type_code_swap_user_info_t = vnx::get_type_code(vnx::Hash64(0x1b6c720bff2d638cull));\nconst vnx::TypeCode* const vnx_native_type_code_table_entry_t = vnx::get_type_code(vnx::Hash64(0x9bdbee40872de9a7ull));\nconst vnx::TypeCode* const vnx_native_type_code_trade_entry_t = vnx::get_type_code(vnx::Hash64(0xed7d8e67cb8db394ull));\nconst vnx::TypeCode* const vnx_native_type_code_trade_log_t = vnx::get_type_code(vnx::Hash64(0xafedf6853c645eb8ull));\nconst vnx::TypeCode* const vnx_native_type_code_tx_entry_t = vnx::get_type_code(vnx::Hash64(0x438cda5719015870ull));\nconst vnx::TypeCode* const vnx_native_type_code_tx_index_t = vnx::get_type_code(vnx::Hash64(0xc326e232ee2ebb41ull));\nconst vnx::TypeCode* const vnx_native_type_code_tx_info_t = vnx::get_type_code(vnx::Hash64(0x44e4a710953f4785ull));\nconst vnx::TypeCode* const vnx_native_type_code_tx_log_entry_t = vnx::get_type_code(vnx::Hash64(0xc29d95c24aff8b43ull));\nconst vnx::TypeCode* const vnx_native_type_code_tx_note_e = vnx::get_type_code(vnx::Hash64(0x347c1deca0a9c9cull));\nconst vnx::TypeCode* const vnx_native_type_code_tx_type_e = vnx::get_type_code(vnx::Hash64(0x3b7f577c2cfd4c91ull));\nconst vnx::TypeCode* const vnx_native_type_code_txin_t = vnx::get_type_code(vnx::Hash64(0xda6587114a2413full));\nconst vnx::TypeCode* const vnx_native_type_code_txio_entry_t = vnx::get_type_code(vnx::Hash64(0x2d1c65e166ab244bull));\nconst vnx::TypeCode* const vnx_native_type_code_txio_t = vnx::get_type_code(vnx::Hash64(0x32adb93b85c82cf4ull));\nconst vnx::TypeCode* const vnx_native_type_code_txout_t = vnx::get_type_code(vnx::Hash64(0xaa91772752216576ull));\nconst vnx::TypeCode* const vnx_native_type_code_uint_fraction_t = vnx::get_type_code(vnx::Hash64(0xe5632136b5a3ed5aull));\nconst vnx::TypeCode* const vnx_native_type_code_ulong_fraction_t = vnx::get_type_code(vnx::Hash64(0xe9c2388a9c35ce06ull));\nconst vnx::TypeCode* const vnx_native_type_code_virtual_plot_info_t = vnx::get_type_code(vnx::Hash64(0xcbcd7c49be95180eull));\n\n} // namespace mmx\n"
  },
  {
    "path": "generated/src/peer_info_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/peer_info_t.hxx>\n#include <mmx/node_type_e.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 peer_info_t::VNX_TYPE_HASH(0xce0ff32e89625afbull);\nconst vnx::Hash64 peer_info_t::VNX_CODE_HASH(0xd6ab74a4c33a8685ull);\n\nvnx::Hash64 peer_info_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string peer_info_t::get_type_name() const {\n\treturn \"mmx.peer_info_t\";\n}\n\nconst vnx::TypeCode* peer_info_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_peer_info_t;\n}\n\nstd::shared_ptr<peer_info_t> peer_info_t::create() {\n\treturn std::make_shared<peer_info_t>();\n}\n\nstd::shared_ptr<peer_info_t> peer_info_t::clone() const {\n\treturn std::make_shared<peer_info_t>(*this);\n}\n\nvoid peer_info_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid peer_info_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid peer_info_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_peer_info_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, id);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, type);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, ping_ms);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, version);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, recv_timeout_ms);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, connect_time_ms);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, bytes_send);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, bytes_recv);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, pending_cost);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, compression_ratio);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, is_synced);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, is_paused);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, is_blocked);\n\t_visitor.type_field(_type_code->fields[15], 15); vnx::accept(_visitor, is_outbound);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid peer_info_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"type\\\": \"; vnx::write(_out, type);\n\t_out << \", \\\"ping_ms\\\": \"; vnx::write(_out, ping_ms);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"version\\\": \"; vnx::write(_out, version);\n\t_out << \", \\\"recv_timeout_ms\\\": \"; vnx::write(_out, recv_timeout_ms);\n\t_out << \", \\\"connect_time_ms\\\": \"; vnx::write(_out, connect_time_ms);\n\t_out << \", \\\"bytes_send\\\": \"; vnx::write(_out, bytes_send);\n\t_out << \", \\\"bytes_recv\\\": \"; vnx::write(_out, bytes_recv);\n\t_out << \", \\\"pending_cost\\\": \"; vnx::write(_out, pending_cost);\n\t_out << \", \\\"compression_ratio\\\": \"; vnx::write(_out, compression_ratio);\n\t_out << \", \\\"is_synced\\\": \"; vnx::write(_out, is_synced);\n\t_out << \", \\\"is_paused\\\": \"; vnx::write(_out, is_paused);\n\t_out << \", \\\"is_blocked\\\": \"; vnx::write(_out, is_blocked);\n\t_out << \", \\\"is_outbound\\\": \"; vnx::write(_out, is_outbound);\n\t_out << \"}\";\n}\n\nvoid peer_info_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object peer_info_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.peer_info_t\";\n\t_object[\"id\"] = id;\n\t_object[\"address\"] = address;\n\t_object[\"type\"] = type;\n\t_object[\"ping_ms\"] = ping_ms;\n\t_object[\"height\"] = height;\n\t_object[\"version\"] = version;\n\t_object[\"recv_timeout_ms\"] = recv_timeout_ms;\n\t_object[\"connect_time_ms\"] = connect_time_ms;\n\t_object[\"bytes_send\"] = bytes_send;\n\t_object[\"bytes_recv\"] = bytes_recv;\n\t_object[\"pending_cost\"] = pending_cost;\n\t_object[\"compression_ratio\"] = compression_ratio;\n\t_object[\"is_synced\"] = is_synced;\n\t_object[\"is_paused\"] = is_paused;\n\t_object[\"is_blocked\"] = is_blocked;\n\t_object[\"is_outbound\"] = is_outbound;\n\treturn _object;\n}\n\nvoid peer_info_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"bytes_recv\") {\n\t\t\t_entry.second.to(bytes_recv);\n\t\t} else if(_entry.first == \"bytes_send\") {\n\t\t\t_entry.second.to(bytes_send);\n\t\t} else if(_entry.first == \"compression_ratio\") {\n\t\t\t_entry.second.to(compression_ratio);\n\t\t} else if(_entry.first == \"connect_time_ms\") {\n\t\t\t_entry.second.to(connect_time_ms);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t} else if(_entry.first == \"is_blocked\") {\n\t\t\t_entry.second.to(is_blocked);\n\t\t} else if(_entry.first == \"is_outbound\") {\n\t\t\t_entry.second.to(is_outbound);\n\t\t} else if(_entry.first == \"is_paused\") {\n\t\t\t_entry.second.to(is_paused);\n\t\t} else if(_entry.first == \"is_synced\") {\n\t\t\t_entry.second.to(is_synced);\n\t\t} else if(_entry.first == \"pending_cost\") {\n\t\t\t_entry.second.to(pending_cost);\n\t\t} else if(_entry.first == \"ping_ms\") {\n\t\t\t_entry.second.to(ping_ms);\n\t\t} else if(_entry.first == \"recv_timeout_ms\") {\n\t\t\t_entry.second.to(recv_timeout_ms);\n\t\t} else if(_entry.first == \"type\") {\n\t\t\t_entry.second.to(type);\n\t\t} else if(_entry.first == \"version\") {\n\t\t\t_entry.second.to(version);\n\t\t}\n\t}\n}\n\nvnx::Variant peer_info_t::get_field(const std::string& _name) const {\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"type\") {\n\t\treturn vnx::Variant(type);\n\t}\n\tif(_name == \"ping_ms\") {\n\t\treturn vnx::Variant(ping_ms);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"version\") {\n\t\treturn vnx::Variant(version);\n\t}\n\tif(_name == \"recv_timeout_ms\") {\n\t\treturn vnx::Variant(recv_timeout_ms);\n\t}\n\tif(_name == \"connect_time_ms\") {\n\t\treturn vnx::Variant(connect_time_ms);\n\t}\n\tif(_name == \"bytes_send\") {\n\t\treturn vnx::Variant(bytes_send);\n\t}\n\tif(_name == \"bytes_recv\") {\n\t\treturn vnx::Variant(bytes_recv);\n\t}\n\tif(_name == \"pending_cost\") {\n\t\treturn vnx::Variant(pending_cost);\n\t}\n\tif(_name == \"compression_ratio\") {\n\t\treturn vnx::Variant(compression_ratio);\n\t}\n\tif(_name == \"is_synced\") {\n\t\treturn vnx::Variant(is_synced);\n\t}\n\tif(_name == \"is_paused\") {\n\t\treturn vnx::Variant(is_paused);\n\t}\n\tif(_name == \"is_blocked\") {\n\t\treturn vnx::Variant(is_blocked);\n\t}\n\tif(_name == \"is_outbound\") {\n\t\treturn vnx::Variant(is_outbound);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid peer_info_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"id\") {\n\t\t_value.to(id);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"type\") {\n\t\t_value.to(type);\n\t} else if(_name == \"ping_ms\") {\n\t\t_value.to(ping_ms);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"version\") {\n\t\t_value.to(version);\n\t} else if(_name == \"recv_timeout_ms\") {\n\t\t_value.to(recv_timeout_ms);\n\t} else if(_name == \"connect_time_ms\") {\n\t\t_value.to(connect_time_ms);\n\t} else if(_name == \"bytes_send\") {\n\t\t_value.to(bytes_send);\n\t} else if(_name == \"bytes_recv\") {\n\t\t_value.to(bytes_recv);\n\t} else if(_name == \"pending_cost\") {\n\t\t_value.to(pending_cost);\n\t} else if(_name == \"compression_ratio\") {\n\t\t_value.to(compression_ratio);\n\t} else if(_name == \"is_synced\") {\n\t\t_value.to(is_synced);\n\t} else if(_name == \"is_paused\") {\n\t\t_value.to(is_paused);\n\t} else if(_name == \"is_blocked\") {\n\t\t_value.to(is_blocked);\n\t} else if(_name == \"is_outbound\") {\n\t\t_value.to(is_outbound);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const peer_info_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, peer_info_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* peer_info_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> peer_info_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.peer_info_t\";\n\ttype_code->type_hash = vnx::Hash64(0xce0ff32e89625afbull);\n\ttype_code->code_hash = vnx::Hash64(0xd6ab74a4c33a8685ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::peer_info_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<peer_info_t>>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::node_type_e::static_get_type_code();\n\ttype_code->fields.resize(16);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"id\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type\";\n\t\tfield.code = {19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"ping_ms\";\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"version\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"recv_timeout_ms\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"connect_time_ms\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"bytes_send\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"bytes_recv\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"pending_cost\";\n\t\tfield.code = {10};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"compression_ratio\";\n\t\tfield.code = {10};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_synced\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_paused\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_blocked\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[15];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_outbound\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::peer_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.id, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.ping_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.version, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.recv_timeout_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.connect_time_ms, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.bytes_send, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[9]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.bytes_recv, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[10]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.pending_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[11]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.compression_ratio, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[12]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_synced, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[13]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_paused, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[14]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_blocked, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[15]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_outbound, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.type, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::peer_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_peer_info_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::peer_info_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(72);\n\tvnx::write_value(_buf + 0, value.id);\n\tvnx::write_value(_buf + 8, value.ping_ms);\n\tvnx::write_value(_buf + 12, value.height);\n\tvnx::write_value(_buf + 16, value.version);\n\tvnx::write_value(_buf + 20, value.recv_timeout_ms);\n\tvnx::write_value(_buf + 28, value.connect_time_ms);\n\tvnx::write_value(_buf + 36, value.bytes_send);\n\tvnx::write_value(_buf + 44, value.bytes_recv);\n\tvnx::write_value(_buf + 52, value.pending_cost);\n\tvnx::write_value(_buf + 60, value.compression_ratio);\n\tvnx::write_value(_buf + 68, value.is_synced);\n\tvnx::write_value(_buf + 69, value.is_paused);\n\tvnx::write_value(_buf + 70, value.is_blocked);\n\tvnx::write_value(_buf + 71, value.is_outbound);\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.type, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::peer_info_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::peer_info_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::peer_info_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::peer_info_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::peer_info_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/permission_e.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/permission_e.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 permission_e::VNX_TYPE_HASH(0x7d75a3f04c313898ull);\nconst vnx::Hash64 permission_e::VNX_CODE_HASH(0x8c018d9153a2dcebull);\n\nvnx::Hash64 permission_e::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string permission_e::get_type_name() const {\n\treturn \"mmx.permission_e\";\n}\n\nconst vnx::TypeCode* permission_e::get_type_code() const {\n\treturn mmx::vnx_native_type_code_permission_e;\n}\n\nstd::shared_ptr<permission_e> permission_e::create() {\n\treturn std::make_shared<permission_e>();\n}\n\nstd::shared_ptr<permission_e> permission_e::clone() const {\n\treturn std::make_shared<permission_e>(*this);\n}\n\nvoid permission_e::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid permission_e::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvnx::bool_t permission_e::is_valid() const {\n\tswitch(value) {\n\t\tcase PUBLIC: return true;\n\t\tcase REMOTE: return true;\n\t\tcase SIGN_BLOCK: return true;\n\t\tcase SPENDING: return true;\n\t}\n\treturn false;\n}\n\nstd::string permission_e::to_string() const {\n\tswitch(value) {\n\t\tcase PUBLIC: return \"\\\"PUBLIC\\\"\";\n\t\tcase REMOTE: return \"\\\"REMOTE\\\"\";\n\t\tcase SIGN_BLOCK: return \"\\\"SIGN_BLOCK\\\"\";\n\t\tcase SPENDING: return \"\\\"SPENDING\\\"\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string permission_e::to_string_value() const {\n\tswitch(value) {\n\t\tcase PUBLIC: return \"PUBLIC\";\n\t\tcase REMOTE: return \"REMOTE\";\n\t\tcase SIGN_BLOCK: return \"SIGN_BLOCK\";\n\t\tcase SPENDING: return \"SPENDING\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string permission_e::to_string_value_full() const {\n\tswitch(value) {\n\t\tcase PUBLIC: return \"mmx.permission_e.PUBLIC\";\n\t\tcase REMOTE: return \"mmx.permission_e.REMOTE\";\n\t\tcase SIGN_BLOCK: return \"mmx.permission_e.SIGN_BLOCK\";\n\t\tcase SPENDING: return \"mmx.permission_e.SPENDING\";\n\t}\n\treturn std::to_string(value);\n}\n\nvoid permission_e::from_string(const std::string& _str) {\n\tstd::string _name;\n\tvnx::from_string(_str, _name);\n\tfrom_string_value(_name);\n}\n\nvoid permission_e::from_string_value(const std::string& _name) {\n\tvnx::Variant var;\n\tvnx::from_string_value(_name, var);\n\tif(var.is_string()) {\n\t\tif(_name == \"PUBLIC\") value = PUBLIC;\n\t\telse if(_name == \"REMOTE\") value = REMOTE;\n\t\telse if(_name == \"SIGN_BLOCK\") value = SIGN_BLOCK;\n\t\telse if(_name == \"SPENDING\") value = SPENDING;\n\t\telse value = enum_t(vnx::hash64(_name));\n\t} else {\n\t\tvalue = enum_t(std::stoul(_name.c_str(), nullptr, 0));\n\t}\n}\n\nvoid permission_e::accept(vnx::Visitor& _visitor) const {\n\tstd::string _name;\n\tswitch(value) {\n\t\tcase PUBLIC: _name = \"PUBLIC\"; break;\n\t\tcase REMOTE: _name = \"REMOTE\"; break;\n\t\tcase SIGN_BLOCK: _name = \"SIGN_BLOCK\"; break;\n\t\tcase SPENDING: _name = \"SPENDING\"; break;\n\t}\n\t_visitor.enum_value(value, _name);\n}\n\nvoid permission_e::write(std::ostream& _out) const {\n\tswitch(value) {\n\t\tcase PUBLIC: _out << \"\\\"PUBLIC\\\"\"; break;\n\t\tcase REMOTE: _out << \"\\\"REMOTE\\\"\"; break;\n\t\tcase SIGN_BLOCK: _out << \"\\\"SIGN_BLOCK\\\"\"; break;\n\t\tcase SPENDING: _out << \"\\\"SPENDING\\\"\"; break;\n\t\tdefault: _out << value;\n\t}\n}\n\nvoid permission_e::read(std::istream& _in) {\n\tfrom_string_value(vnx::read(_in).to_string_value());\n}\n\nvnx::Object permission_e::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.permission_e\";\n\t_object[\"value\"] = value;\n\treturn _object;\n}\n\nvoid permission_e::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"value\") {\n\t\t\t_entry.second.to(value);\n\t\t}\n\t}\n}\n\nvnx::Variant permission_e::get_field(const std::string& _name) const {\n\tif(_name == \"value\") {\n\t\treturn vnx::Variant(value);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid permission_e::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"value\") {\n\t\t_value.to(value);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const permission_e& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, permission_e& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* permission_e::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> permission_e::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.permission_e\";\n\ttype_code->type_hash = vnx::Hash64(0x7d75a3f04c313898ull);\n\ttype_code->code_hash = vnx::Hash64(0x8c018d9153a2dcebull);\n\ttype_code->is_native = true;\n\ttype_code->is_enum = true;\n\ttype_code->native_size = sizeof(::mmx::permission_e);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<permission_e>>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"value\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->enum_map[2166575688] = \"PUBLIC\";\n\ttype_code->enum_map[412167022] = \"REMOTE\";\n\ttype_code->enum_map[1091809605] = \"SIGN_BLOCK\";\n\ttype_code->enum_map[1957258863] = \"SPENDING\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::permission_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tVariant tmp;\n\t\tvnx::read(in, tmp, type_code, code);\n\t\tif(tmp.is_string()) {\n\t\t\tvnx::from_string(tmp.to_string(), value);\n\t\t} else if(tmp.is_ulong()) {\n\t\t\tvalue = ::mmx::permission_e::enum_t(tmp.to<uint32_t>());\n\t\t} else {\n\t\t\tvalue = ::mmx::permission_e();\n\t\t}\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.value, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::permission_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_STRING) {\n\t\tvnx::write(out, value.to_string_value(), nullptr, code);\n\t\treturn;\n\t}\n\tif(code && code[0] == CODE_UINT32) {\n\t\tvnx::write(out, value.value, nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_permission_e;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::permission_e>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.value);\n}\n\nvoid read(std::istream& in, ::mmx::permission_e& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::permission_e& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::permission_e& value) {\n\tvalue.accept(visitor);\n}\n\nvoid read(TypeInput& in, ::mmx::permission_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tuint32_t tmp = 0;\n\tvnx::read(in, tmp, type_code, code);\n\tvalue = ::mmx::permission_e::enum_t(tmp);\n}\n\nvoid write(TypeOutput& out, const ::mmx::permission_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tvnx::write(out, uint32_t(value), type_code, code);\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::permission_e& _value) {\n\treturn _value.to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::permission_e& _value) {\n\treturn _value.to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::permission_e& _value) {\n\treturn _value.to_string_value_full();\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::permission_e::enum_t& _value) {\n\treturn ::mmx::permission_e(_value).to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::permission_e::enum_t& _value) {\n\treturn ::mmx::permission_e(_value).to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::permission_e::enum_t& _value) {\n\treturn ::mmx::permission_e(_value).to_string_value_full();\n}\n\nbool is_equivalent<::mmx::permission_e>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::permission_e::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/plot_nft_info_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/plot_nft_info_t.hxx>\n#include <mmx/addr_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 plot_nft_info_t::VNX_TYPE_HASH(0xf8e0b44f3c0a54aeull);\nconst vnx::Hash64 plot_nft_info_t::VNX_CODE_HASH(0x3e8732c6d4e57af7ull);\n\nvnx::Hash64 plot_nft_info_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string plot_nft_info_t::get_type_name() const {\n\treturn \"mmx.plot_nft_info_t\";\n}\n\nconst vnx::TypeCode* plot_nft_info_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_plot_nft_info_t;\n}\n\nstd::shared_ptr<plot_nft_info_t> plot_nft_info_t::create() {\n\treturn std::make_shared<plot_nft_info_t>();\n}\n\nstd::shared_ptr<plot_nft_info_t> plot_nft_info_t::clone() const {\n\treturn std::make_shared<plot_nft_info_t>(*this);\n}\n\nvoid plot_nft_info_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid plot_nft_info_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid plot_nft_info_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_plot_nft_info_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, owner);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, is_locked);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, target);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, unlock_height);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, server_url);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid plot_nft_info_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"owner\\\": \"; vnx::write(_out, owner);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"is_locked\\\": \"; vnx::write(_out, is_locked);\n\t_out << \", \\\"target\\\": \"; vnx::write(_out, target);\n\t_out << \", \\\"unlock_height\\\": \"; vnx::write(_out, unlock_height);\n\t_out << \", \\\"server_url\\\": \"; vnx::write(_out, server_url);\n\t_out << \"}\";\n}\n\nvoid plot_nft_info_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object plot_nft_info_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.plot_nft_info_t\";\n\t_object[\"name\"] = name;\n\t_object[\"owner\"] = owner;\n\t_object[\"address\"] = address;\n\t_object[\"is_locked\"] = is_locked;\n\t_object[\"target\"] = target;\n\t_object[\"unlock_height\"] = unlock_height;\n\t_object[\"server_url\"] = server_url;\n\treturn _object;\n}\n\nvoid plot_nft_info_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"is_locked\") {\n\t\t\t_entry.second.to(is_locked);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t} else if(_entry.first == \"owner\") {\n\t\t\t_entry.second.to(owner);\n\t\t} else if(_entry.first == \"server_url\") {\n\t\t\t_entry.second.to(server_url);\n\t\t} else if(_entry.first == \"target\") {\n\t\t\t_entry.second.to(target);\n\t\t} else if(_entry.first == \"unlock_height\") {\n\t\t\t_entry.second.to(unlock_height);\n\t\t}\n\t}\n}\n\nvnx::Variant plot_nft_info_t::get_field(const std::string& _name) const {\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"owner\") {\n\t\treturn vnx::Variant(owner);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"is_locked\") {\n\t\treturn vnx::Variant(is_locked);\n\t}\n\tif(_name == \"target\") {\n\t\treturn vnx::Variant(target);\n\t}\n\tif(_name == \"unlock_height\") {\n\t\treturn vnx::Variant(unlock_height);\n\t}\n\tif(_name == \"server_url\") {\n\t\treturn vnx::Variant(server_url);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid plot_nft_info_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"owner\") {\n\t\t_value.to(owner);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"is_locked\") {\n\t\t_value.to(is_locked);\n\t} else if(_name == \"target\") {\n\t\t_value.to(target);\n\t} else if(_name == \"unlock_height\") {\n\t\t_value.to(unlock_height);\n\t} else if(_name == \"server_url\") {\n\t\t_value.to(server_url);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const plot_nft_info_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, plot_nft_info_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* plot_nft_info_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> plot_nft_info_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.plot_nft_info_t\";\n\ttype_code->type_hash = vnx::Hash64(0xf8e0b44f3c0a54aeull);\n\ttype_code->code_hash = vnx::Hash64(0x3e8732c6d4e57af7ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::plot_nft_info_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<plot_nft_info_t>>(); };\n\ttype_code->fields.resize(7);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"owner\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_locked\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"target\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"unlock_height\";\n\t\tfield.code = {33, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"server_url\";\n\t\tfield.code = {33, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::plot_nft_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_locked, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.owner, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.target, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.unlock_height, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.server_url, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::plot_nft_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_plot_nft_info_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::plot_nft_info_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(1);\n\tvnx::write_value(_buf + 0, value.is_locked);\n\tvnx::write(out, value.name, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.owner, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.address, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.target, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.unlock_height, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.server_url, type_code, type_code->fields[6].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::plot_nft_info_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::plot_nft_info_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::plot_nft_info_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::plot_nft_info_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::plot_nft_info_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/pooling_error_e.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/pooling_error_e.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 pooling_error_e::VNX_TYPE_HASH(0xec786b877a93f17ull);\nconst vnx::Hash64 pooling_error_e::VNX_CODE_HASH(0x598a3a53e6c7f787ull);\n\nvnx::Hash64 pooling_error_e::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string pooling_error_e::get_type_name() const {\n\treturn \"mmx.pooling_error_e\";\n}\n\nconst vnx::TypeCode* pooling_error_e::get_type_code() const {\n\treturn mmx::vnx_native_type_code_pooling_error_e;\n}\n\nstd::shared_ptr<pooling_error_e> pooling_error_e::create() {\n\treturn std::make_shared<pooling_error_e>();\n}\n\nstd::shared_ptr<pooling_error_e> pooling_error_e::clone() const {\n\treturn std::make_shared<pooling_error_e>(*this);\n}\n\nvoid pooling_error_e::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid pooling_error_e::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvnx::bool_t pooling_error_e::is_valid() const {\n\tswitch(value) {\n\t\tcase CHALLENGE_NOT_CONFIRMED: return true;\n\t\tcase CHALLENGE_NOT_FOUND: return true;\n\t\tcase CHALLENGE_REVERTED: return true;\n\t\tcase DUPLICATE_PARTIAL: return true;\n\t\tcase INVALID_ACCOUNT: return true;\n\t\tcase INVALID_AUTH_KEY: return true;\n\t\tcase INVALID_CONTRACT: return true;\n\t\tcase INVALID_DIFFICULTY: return true;\n\t\tcase INVALID_PARTIAL: return true;\n\t\tcase INVALID_PROOF: return true;\n\t\tcase INVALID_SIGNATURE: return true;\n\t\tcase INVALID_TIMESTAMP: return true;\n\t\tcase NONE: return true;\n\t\tcase PARTIAL_NOT_GOOD_ENOUGH: return true;\n\t\tcase PARTIAL_TOO_LATE: return true;\n\t\tcase POOL_LOST_SYNC: return true;\n\t\tcase SERVER_ERROR: return true;\n\t}\n\treturn false;\n}\n\nstd::string pooling_error_e::to_string() const {\n\tswitch(value) {\n\t\tcase CHALLENGE_NOT_CONFIRMED: return \"\\\"CHALLENGE_NOT_CONFIRMED\\\"\";\n\t\tcase CHALLENGE_NOT_FOUND: return \"\\\"CHALLENGE_NOT_FOUND\\\"\";\n\t\tcase CHALLENGE_REVERTED: return \"\\\"CHALLENGE_REVERTED\\\"\";\n\t\tcase DUPLICATE_PARTIAL: return \"\\\"DUPLICATE_PARTIAL\\\"\";\n\t\tcase INVALID_ACCOUNT: return \"\\\"INVALID_ACCOUNT\\\"\";\n\t\tcase INVALID_AUTH_KEY: return \"\\\"INVALID_AUTH_KEY\\\"\";\n\t\tcase INVALID_CONTRACT: return \"\\\"INVALID_CONTRACT\\\"\";\n\t\tcase INVALID_DIFFICULTY: return \"\\\"INVALID_DIFFICULTY\\\"\";\n\t\tcase INVALID_PARTIAL: return \"\\\"INVALID_PARTIAL\\\"\";\n\t\tcase INVALID_PROOF: return \"\\\"INVALID_PROOF\\\"\";\n\t\tcase INVALID_SIGNATURE: return \"\\\"INVALID_SIGNATURE\\\"\";\n\t\tcase INVALID_TIMESTAMP: return \"\\\"INVALID_TIMESTAMP\\\"\";\n\t\tcase NONE: return \"\\\"NONE\\\"\";\n\t\tcase PARTIAL_NOT_GOOD_ENOUGH: return \"\\\"PARTIAL_NOT_GOOD_ENOUGH\\\"\";\n\t\tcase PARTIAL_TOO_LATE: return \"\\\"PARTIAL_TOO_LATE\\\"\";\n\t\tcase POOL_LOST_SYNC: return \"\\\"POOL_LOST_SYNC\\\"\";\n\t\tcase SERVER_ERROR: return \"\\\"SERVER_ERROR\\\"\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string pooling_error_e::to_string_value() const {\n\tswitch(value) {\n\t\tcase CHALLENGE_NOT_CONFIRMED: return \"CHALLENGE_NOT_CONFIRMED\";\n\t\tcase CHALLENGE_NOT_FOUND: return \"CHALLENGE_NOT_FOUND\";\n\t\tcase CHALLENGE_REVERTED: return \"CHALLENGE_REVERTED\";\n\t\tcase DUPLICATE_PARTIAL: return \"DUPLICATE_PARTIAL\";\n\t\tcase INVALID_ACCOUNT: return \"INVALID_ACCOUNT\";\n\t\tcase INVALID_AUTH_KEY: return \"INVALID_AUTH_KEY\";\n\t\tcase INVALID_CONTRACT: return \"INVALID_CONTRACT\";\n\t\tcase INVALID_DIFFICULTY: return \"INVALID_DIFFICULTY\";\n\t\tcase INVALID_PARTIAL: return \"INVALID_PARTIAL\";\n\t\tcase INVALID_PROOF: return \"INVALID_PROOF\";\n\t\tcase INVALID_SIGNATURE: return \"INVALID_SIGNATURE\";\n\t\tcase INVALID_TIMESTAMP: return \"INVALID_TIMESTAMP\";\n\t\tcase NONE: return \"NONE\";\n\t\tcase PARTIAL_NOT_GOOD_ENOUGH: return \"PARTIAL_NOT_GOOD_ENOUGH\";\n\t\tcase PARTIAL_TOO_LATE: return \"PARTIAL_TOO_LATE\";\n\t\tcase POOL_LOST_SYNC: return \"POOL_LOST_SYNC\";\n\t\tcase SERVER_ERROR: return \"SERVER_ERROR\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string pooling_error_e::to_string_value_full() const {\n\tswitch(value) {\n\t\tcase CHALLENGE_NOT_CONFIRMED: return \"mmx.pooling_error_e.CHALLENGE_NOT_CONFIRMED\";\n\t\tcase CHALLENGE_NOT_FOUND: return \"mmx.pooling_error_e.CHALLENGE_NOT_FOUND\";\n\t\tcase CHALLENGE_REVERTED: return \"mmx.pooling_error_e.CHALLENGE_REVERTED\";\n\t\tcase DUPLICATE_PARTIAL: return \"mmx.pooling_error_e.DUPLICATE_PARTIAL\";\n\t\tcase INVALID_ACCOUNT: return \"mmx.pooling_error_e.INVALID_ACCOUNT\";\n\t\tcase INVALID_AUTH_KEY: return \"mmx.pooling_error_e.INVALID_AUTH_KEY\";\n\t\tcase INVALID_CONTRACT: return \"mmx.pooling_error_e.INVALID_CONTRACT\";\n\t\tcase INVALID_DIFFICULTY: return \"mmx.pooling_error_e.INVALID_DIFFICULTY\";\n\t\tcase INVALID_PARTIAL: return \"mmx.pooling_error_e.INVALID_PARTIAL\";\n\t\tcase INVALID_PROOF: return \"mmx.pooling_error_e.INVALID_PROOF\";\n\t\tcase INVALID_SIGNATURE: return \"mmx.pooling_error_e.INVALID_SIGNATURE\";\n\t\tcase INVALID_TIMESTAMP: return \"mmx.pooling_error_e.INVALID_TIMESTAMP\";\n\t\tcase NONE: return \"mmx.pooling_error_e.NONE\";\n\t\tcase PARTIAL_NOT_GOOD_ENOUGH: return \"mmx.pooling_error_e.PARTIAL_NOT_GOOD_ENOUGH\";\n\t\tcase PARTIAL_TOO_LATE: return \"mmx.pooling_error_e.PARTIAL_TOO_LATE\";\n\t\tcase POOL_LOST_SYNC: return \"mmx.pooling_error_e.POOL_LOST_SYNC\";\n\t\tcase SERVER_ERROR: return \"mmx.pooling_error_e.SERVER_ERROR\";\n\t}\n\treturn std::to_string(value);\n}\n\nvoid pooling_error_e::from_string(const std::string& _str) {\n\tstd::string _name;\n\tvnx::from_string(_str, _name);\n\tfrom_string_value(_name);\n}\n\nvoid pooling_error_e::from_string_value(const std::string& _name) {\n\tvnx::Variant var;\n\tvnx::from_string_value(_name, var);\n\tif(var.is_string()) {\n\t\tif(_name == \"CHALLENGE_NOT_CONFIRMED\") value = CHALLENGE_NOT_CONFIRMED;\n\t\telse if(_name == \"CHALLENGE_NOT_FOUND\") value = CHALLENGE_NOT_FOUND;\n\t\telse if(_name == \"CHALLENGE_REVERTED\") value = CHALLENGE_REVERTED;\n\t\telse if(_name == \"DUPLICATE_PARTIAL\") value = DUPLICATE_PARTIAL;\n\t\telse if(_name == \"INVALID_ACCOUNT\") value = INVALID_ACCOUNT;\n\t\telse if(_name == \"INVALID_AUTH_KEY\") value = INVALID_AUTH_KEY;\n\t\telse if(_name == \"INVALID_CONTRACT\") value = INVALID_CONTRACT;\n\t\telse if(_name == \"INVALID_DIFFICULTY\") value = INVALID_DIFFICULTY;\n\t\telse if(_name == \"INVALID_PARTIAL\") value = INVALID_PARTIAL;\n\t\telse if(_name == \"INVALID_PROOF\") value = INVALID_PROOF;\n\t\telse if(_name == \"INVALID_SIGNATURE\") value = INVALID_SIGNATURE;\n\t\telse if(_name == \"INVALID_TIMESTAMP\") value = INVALID_TIMESTAMP;\n\t\telse if(_name == \"NONE\") value = NONE;\n\t\telse if(_name == \"PARTIAL_NOT_GOOD_ENOUGH\") value = PARTIAL_NOT_GOOD_ENOUGH;\n\t\telse if(_name == \"PARTIAL_TOO_LATE\") value = PARTIAL_TOO_LATE;\n\t\telse if(_name == \"POOL_LOST_SYNC\") value = POOL_LOST_SYNC;\n\t\telse if(_name == \"SERVER_ERROR\") value = SERVER_ERROR;\n\t\telse value = enum_t(vnx::hash64(_name));\n\t} else {\n\t\tvalue = enum_t(std::stoul(_name.c_str(), nullptr, 0));\n\t}\n}\n\nvoid pooling_error_e::accept(vnx::Visitor& _visitor) const {\n\tstd::string _name;\n\tswitch(value) {\n\t\tcase CHALLENGE_NOT_CONFIRMED: _name = \"CHALLENGE_NOT_CONFIRMED\"; break;\n\t\tcase CHALLENGE_NOT_FOUND: _name = \"CHALLENGE_NOT_FOUND\"; break;\n\t\tcase CHALLENGE_REVERTED: _name = \"CHALLENGE_REVERTED\"; break;\n\t\tcase DUPLICATE_PARTIAL: _name = \"DUPLICATE_PARTIAL\"; break;\n\t\tcase INVALID_ACCOUNT: _name = \"INVALID_ACCOUNT\"; break;\n\t\tcase INVALID_AUTH_KEY: _name = \"INVALID_AUTH_KEY\"; break;\n\t\tcase INVALID_CONTRACT: _name = \"INVALID_CONTRACT\"; break;\n\t\tcase INVALID_DIFFICULTY: _name = \"INVALID_DIFFICULTY\"; break;\n\t\tcase INVALID_PARTIAL: _name = \"INVALID_PARTIAL\"; break;\n\t\tcase INVALID_PROOF: _name = \"INVALID_PROOF\"; break;\n\t\tcase INVALID_SIGNATURE: _name = \"INVALID_SIGNATURE\"; break;\n\t\tcase INVALID_TIMESTAMP: _name = \"INVALID_TIMESTAMP\"; break;\n\t\tcase NONE: _name = \"NONE\"; break;\n\t\tcase PARTIAL_NOT_GOOD_ENOUGH: _name = \"PARTIAL_NOT_GOOD_ENOUGH\"; break;\n\t\tcase PARTIAL_TOO_LATE: _name = \"PARTIAL_TOO_LATE\"; break;\n\t\tcase POOL_LOST_SYNC: _name = \"POOL_LOST_SYNC\"; break;\n\t\tcase SERVER_ERROR: _name = \"SERVER_ERROR\"; break;\n\t}\n\t_visitor.enum_value(value, _name);\n}\n\nvoid pooling_error_e::write(std::ostream& _out) const {\n\tswitch(value) {\n\t\tcase CHALLENGE_NOT_CONFIRMED: _out << \"\\\"CHALLENGE_NOT_CONFIRMED\\\"\"; break;\n\t\tcase CHALLENGE_NOT_FOUND: _out << \"\\\"CHALLENGE_NOT_FOUND\\\"\"; break;\n\t\tcase CHALLENGE_REVERTED: _out << \"\\\"CHALLENGE_REVERTED\\\"\"; break;\n\t\tcase DUPLICATE_PARTIAL: _out << \"\\\"DUPLICATE_PARTIAL\\\"\"; break;\n\t\tcase INVALID_ACCOUNT: _out << \"\\\"INVALID_ACCOUNT\\\"\"; break;\n\t\tcase INVALID_AUTH_KEY: _out << \"\\\"INVALID_AUTH_KEY\\\"\"; break;\n\t\tcase INVALID_CONTRACT: _out << \"\\\"INVALID_CONTRACT\\\"\"; break;\n\t\tcase INVALID_DIFFICULTY: _out << \"\\\"INVALID_DIFFICULTY\\\"\"; break;\n\t\tcase INVALID_PARTIAL: _out << \"\\\"INVALID_PARTIAL\\\"\"; break;\n\t\tcase INVALID_PROOF: _out << \"\\\"INVALID_PROOF\\\"\"; break;\n\t\tcase INVALID_SIGNATURE: _out << \"\\\"INVALID_SIGNATURE\\\"\"; break;\n\t\tcase INVALID_TIMESTAMP: _out << \"\\\"INVALID_TIMESTAMP\\\"\"; break;\n\t\tcase NONE: _out << \"\\\"NONE\\\"\"; break;\n\t\tcase PARTIAL_NOT_GOOD_ENOUGH: _out << \"\\\"PARTIAL_NOT_GOOD_ENOUGH\\\"\"; break;\n\t\tcase PARTIAL_TOO_LATE: _out << \"\\\"PARTIAL_TOO_LATE\\\"\"; break;\n\t\tcase POOL_LOST_SYNC: _out << \"\\\"POOL_LOST_SYNC\\\"\"; break;\n\t\tcase SERVER_ERROR: _out << \"\\\"SERVER_ERROR\\\"\"; break;\n\t\tdefault: _out << value;\n\t}\n}\n\nvoid pooling_error_e::read(std::istream& _in) {\n\tfrom_string_value(vnx::read(_in).to_string_value());\n}\n\nvnx::Object pooling_error_e::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.pooling_error_e\";\n\t_object[\"value\"] = value;\n\treturn _object;\n}\n\nvoid pooling_error_e::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"value\") {\n\t\t\t_entry.second.to(value);\n\t\t}\n\t}\n}\n\nvnx::Variant pooling_error_e::get_field(const std::string& _name) const {\n\tif(_name == \"value\") {\n\t\treturn vnx::Variant(value);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid pooling_error_e::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"value\") {\n\t\t_value.to(value);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const pooling_error_e& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, pooling_error_e& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* pooling_error_e::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> pooling_error_e::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.pooling_error_e\";\n\ttype_code->type_hash = vnx::Hash64(0xec786b877a93f17ull);\n\ttype_code->code_hash = vnx::Hash64(0x598a3a53e6c7f787ull);\n\ttype_code->is_native = true;\n\ttype_code->is_enum = true;\n\ttype_code->native_size = sizeof(::mmx::pooling_error_e);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<pooling_error_e>>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"value\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->enum_map[1645788267] = \"CHALLENGE_NOT_CONFIRMED\";\n\ttype_code->enum_map[471927302] = \"CHALLENGE_NOT_FOUND\";\n\ttype_code->enum_map[1760085717] = \"CHALLENGE_REVERTED\";\n\ttype_code->enum_map[271202490] = \"DUPLICATE_PARTIAL\";\n\ttype_code->enum_map[3369359198] = \"INVALID_ACCOUNT\";\n\ttype_code->enum_map[1953340654] = \"INVALID_AUTH_KEY\";\n\ttype_code->enum_map[914919857] = \"INVALID_CONTRACT\";\n\ttype_code->enum_map[1883406896] = \"INVALID_DIFFICULTY\";\n\ttype_code->enum_map[405897781] = \"INVALID_PARTIAL\";\n\ttype_code->enum_map[3117556933] = \"INVALID_PROOF\";\n\ttype_code->enum_map[3529800621] = \"INVALID_SIGNATURE\";\n\ttype_code->enum_map[2157722321] = \"INVALID_TIMESTAMP\";\n\ttype_code->enum_map[0] = \"NONE\";\n\ttype_code->enum_map[1161496011] = \"PARTIAL_NOT_GOOD_ENOUGH\";\n\ttype_code->enum_map[2832488076] = \"PARTIAL_TOO_LATE\";\n\ttype_code->enum_map[1324712875] = \"POOL_LOST_SYNC\";\n\ttype_code->enum_map[2095599592] = \"SERVER_ERROR\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::pooling_error_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tVariant tmp;\n\t\tvnx::read(in, tmp, type_code, code);\n\t\tif(tmp.is_string()) {\n\t\t\tvnx::from_string(tmp.to_string(), value);\n\t\t} else if(tmp.is_ulong()) {\n\t\t\tvalue = ::mmx::pooling_error_e::enum_t(tmp.to<uint32_t>());\n\t\t} else {\n\t\t\tvalue = ::mmx::pooling_error_e();\n\t\t}\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.value, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::pooling_error_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_STRING) {\n\t\tvnx::write(out, value.to_string_value(), nullptr, code);\n\t\treturn;\n\t}\n\tif(code && code[0] == CODE_UINT32) {\n\t\tvnx::write(out, value.value, nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_pooling_error_e;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::pooling_error_e>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.value);\n}\n\nvoid read(std::istream& in, ::mmx::pooling_error_e& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::pooling_error_e& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::pooling_error_e& value) {\n\tvalue.accept(visitor);\n}\n\nvoid read(TypeInput& in, ::mmx::pooling_error_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tuint32_t tmp = 0;\n\tvnx::read(in, tmp, type_code, code);\n\tvalue = ::mmx::pooling_error_e::enum_t(tmp);\n}\n\nvoid write(TypeOutput& out, const ::mmx::pooling_error_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tvnx::write(out, uint32_t(value), type_code, code);\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::pooling_error_e& _value) {\n\treturn _value.to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::pooling_error_e& _value) {\n\treturn _value.to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::pooling_error_e& _value) {\n\treturn _value.to_string_value_full();\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::pooling_error_e::enum_t& _value) {\n\treturn ::mmx::pooling_error_e(_value).to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::pooling_error_e::enum_t& _value) {\n\treturn ::mmx::pooling_error_e(_value).to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::pooling_error_e::enum_t& _value) {\n\treturn ::mmx::pooling_error_e(_value).to_string_value_full();\n}\n\nbool is_equivalent<::mmx::pooling_error_e>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::pooling_error_e::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/pooling_info_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/pooling_info_t.hxx>\n#include <mmx/addr_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 pooling_info_t::VNX_TYPE_HASH(0xbddcc977498f516full);\nconst vnx::Hash64 pooling_info_t::VNX_CODE_HASH(0x9ae4e6628fe7603aull);\n\nvnx::Hash64 pooling_info_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string pooling_info_t::get_type_name() const {\n\treturn \"mmx.pooling_info_t\";\n}\n\nconst vnx::TypeCode* pooling_info_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_pooling_info_t;\n}\n\nstd::shared_ptr<pooling_info_t> pooling_info_t::create() {\n\treturn std::make_shared<pooling_info_t>();\n}\n\nstd::shared_ptr<pooling_info_t> pooling_info_t::clone() const {\n\treturn std::make_shared<pooling_info_t>(*this);\n}\n\nvoid pooling_info_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid pooling_info_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid pooling_info_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_pooling_info_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, server_url);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, pool_target);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, partial_diff);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, plot_count);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, is_plot_nft);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid pooling_info_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"server_url\\\": \"; vnx::write(_out, server_url);\n\t_out << \", \\\"pool_target\\\": \"; vnx::write(_out, pool_target);\n\t_out << \", \\\"partial_diff\\\": \"; vnx::write(_out, partial_diff);\n\t_out << \", \\\"plot_count\\\": \"; vnx::write(_out, plot_count);\n\t_out << \", \\\"is_plot_nft\\\": \"; vnx::write(_out, is_plot_nft);\n\t_out << \"}\";\n}\n\nvoid pooling_info_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object pooling_info_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.pooling_info_t\";\n\t_object[\"contract\"] = contract;\n\t_object[\"name\"] = name;\n\t_object[\"server_url\"] = server_url;\n\t_object[\"pool_target\"] = pool_target;\n\t_object[\"partial_diff\"] = partial_diff;\n\t_object[\"plot_count\"] = plot_count;\n\t_object[\"is_plot_nft\"] = is_plot_nft;\n\treturn _object;\n}\n\nvoid pooling_info_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"is_plot_nft\") {\n\t\t\t_entry.second.to(is_plot_nft);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t} else if(_entry.first == \"partial_diff\") {\n\t\t\t_entry.second.to(partial_diff);\n\t\t} else if(_entry.first == \"plot_count\") {\n\t\t\t_entry.second.to(plot_count);\n\t\t} else if(_entry.first == \"pool_target\") {\n\t\t\t_entry.second.to(pool_target);\n\t\t} else if(_entry.first == \"server_url\") {\n\t\t\t_entry.second.to(server_url);\n\t\t}\n\t}\n}\n\nvnx::Variant pooling_info_t::get_field(const std::string& _name) const {\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"server_url\") {\n\t\treturn vnx::Variant(server_url);\n\t}\n\tif(_name == \"pool_target\") {\n\t\treturn vnx::Variant(pool_target);\n\t}\n\tif(_name == \"partial_diff\") {\n\t\treturn vnx::Variant(partial_diff);\n\t}\n\tif(_name == \"plot_count\") {\n\t\treturn vnx::Variant(plot_count);\n\t}\n\tif(_name == \"is_plot_nft\") {\n\t\treturn vnx::Variant(is_plot_nft);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid pooling_info_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"server_url\") {\n\t\t_value.to(server_url);\n\t} else if(_name == \"pool_target\") {\n\t\t_value.to(pool_target);\n\t} else if(_name == \"partial_diff\") {\n\t\t_value.to(partial_diff);\n\t} else if(_name == \"plot_count\") {\n\t\t_value.to(plot_count);\n\t} else if(_name == \"is_plot_nft\") {\n\t\t_value.to(is_plot_nft);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const pooling_info_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, pooling_info_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* pooling_info_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> pooling_info_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.pooling_info_t\";\n\ttype_code->type_hash = vnx::Hash64(0xbddcc977498f516full);\n\ttype_code->code_hash = vnx::Hash64(0x9ae4e6628fe7603aull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::pooling_info_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<pooling_info_t>>(); };\n\ttype_code->fields.resize(7);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"server_url\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"pool_target\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"partial_diff\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"plot_count\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_plot_nft\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::pooling_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.partial_diff, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.plot_count, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_plot_nft, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.server_url, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.pool_target, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::pooling_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_pooling_info_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::pooling_info_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(13);\n\tvnx::write_value(_buf + 0, value.partial_diff);\n\tvnx::write_value(_buf + 8, value.plot_count);\n\tvnx::write_value(_buf + 12, value.is_plot_nft);\n\tvnx::write(out, value.contract, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.name, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.server_url, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.pool_target, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::pooling_info_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::pooling_info_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::pooling_info_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::pooling_info_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::pooling_info_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/pooling_stats_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/pooling_stats_t.hxx>\n#include <mmx/pooling_error_e.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 pooling_stats_t::VNX_TYPE_HASH(0xb2441a254359df11ull);\nconst vnx::Hash64 pooling_stats_t::VNX_CODE_HASH(0xd172855ac604d22bull);\n\nvnx::Hash64 pooling_stats_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string pooling_stats_t::get_type_name() const {\n\treturn \"mmx.pooling_stats_t\";\n}\n\nconst vnx::TypeCode* pooling_stats_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_pooling_stats_t;\n}\n\nstd::shared_ptr<pooling_stats_t> pooling_stats_t::create() {\n\treturn std::make_shared<pooling_stats_t>();\n}\n\nstd::shared_ptr<pooling_stats_t> pooling_stats_t::clone() const {\n\treturn std::make_shared<pooling_stats_t>(*this);\n}\n\nvoid pooling_stats_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid pooling_stats_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid pooling_stats_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_pooling_stats_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, server_url);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, partial_diff);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, valid_points);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, failed_points);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, total_partials);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, total_response_time);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, last_partial);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, error_count);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid pooling_stats_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"server_url\\\": \"; vnx::write(_out, server_url);\n\t_out << \", \\\"partial_diff\\\": \"; vnx::write(_out, partial_diff);\n\t_out << \", \\\"valid_points\\\": \"; vnx::write(_out, valid_points);\n\t_out << \", \\\"failed_points\\\": \"; vnx::write(_out, failed_points);\n\t_out << \", \\\"total_partials\\\": \"; vnx::write(_out, total_partials);\n\t_out << \", \\\"total_response_time\\\": \"; vnx::write(_out, total_response_time);\n\t_out << \", \\\"last_partial\\\": \"; vnx::write(_out, last_partial);\n\t_out << \", \\\"error_count\\\": \"; vnx::write(_out, error_count);\n\t_out << \"}\";\n}\n\nvoid pooling_stats_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object pooling_stats_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.pooling_stats_t\";\n\t_object[\"server_url\"] = server_url;\n\t_object[\"partial_diff\"] = partial_diff;\n\t_object[\"valid_points\"] = valid_points;\n\t_object[\"failed_points\"] = failed_points;\n\t_object[\"total_partials\"] = total_partials;\n\t_object[\"total_response_time\"] = total_response_time;\n\t_object[\"last_partial\"] = last_partial;\n\t_object[\"error_count\"] = error_count;\n\treturn _object;\n}\n\nvoid pooling_stats_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"error_count\") {\n\t\t\t_entry.second.to(error_count);\n\t\t} else if(_entry.first == \"failed_points\") {\n\t\t\t_entry.second.to(failed_points);\n\t\t} else if(_entry.first == \"last_partial\") {\n\t\t\t_entry.second.to(last_partial);\n\t\t} else if(_entry.first == \"partial_diff\") {\n\t\t\t_entry.second.to(partial_diff);\n\t\t} else if(_entry.first == \"server_url\") {\n\t\t\t_entry.second.to(server_url);\n\t\t} else if(_entry.first == \"total_partials\") {\n\t\t\t_entry.second.to(total_partials);\n\t\t} else if(_entry.first == \"total_response_time\") {\n\t\t\t_entry.second.to(total_response_time);\n\t\t} else if(_entry.first == \"valid_points\") {\n\t\t\t_entry.second.to(valid_points);\n\t\t}\n\t}\n}\n\nvnx::Variant pooling_stats_t::get_field(const std::string& _name) const {\n\tif(_name == \"server_url\") {\n\t\treturn vnx::Variant(server_url);\n\t}\n\tif(_name == \"partial_diff\") {\n\t\treturn vnx::Variant(partial_diff);\n\t}\n\tif(_name == \"valid_points\") {\n\t\treturn vnx::Variant(valid_points);\n\t}\n\tif(_name == \"failed_points\") {\n\t\treturn vnx::Variant(failed_points);\n\t}\n\tif(_name == \"total_partials\") {\n\t\treturn vnx::Variant(total_partials);\n\t}\n\tif(_name == \"total_response_time\") {\n\t\treturn vnx::Variant(total_response_time);\n\t}\n\tif(_name == \"last_partial\") {\n\t\treturn vnx::Variant(last_partial);\n\t}\n\tif(_name == \"error_count\") {\n\t\treturn vnx::Variant(error_count);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid pooling_stats_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"server_url\") {\n\t\t_value.to(server_url);\n\t} else if(_name == \"partial_diff\") {\n\t\t_value.to(partial_diff);\n\t} else if(_name == \"valid_points\") {\n\t\t_value.to(valid_points);\n\t} else if(_name == \"failed_points\") {\n\t\t_value.to(failed_points);\n\t} else if(_name == \"total_partials\") {\n\t\t_value.to(total_partials);\n\t} else if(_name == \"total_response_time\") {\n\t\t_value.to(total_response_time);\n\t} else if(_name == \"last_partial\") {\n\t\t_value.to(last_partial);\n\t} else if(_name == \"error_count\") {\n\t\t_value.to(error_count);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const pooling_stats_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, pooling_stats_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* pooling_stats_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> pooling_stats_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.pooling_stats_t\";\n\ttype_code->type_hash = vnx::Hash64(0xb2441a254359df11ull);\n\ttype_code->code_hash = vnx::Hash64(0xd172855ac604d22bull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::pooling_stats_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<pooling_stats_t>>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::pooling_error_e::static_get_type_code();\n\ttype_code->fields.resize(8);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"server_url\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"partial_diff\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"valid_points\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"failed_points\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"total_partials\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"total_response_time\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"last_partial\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"error_count\";\n\t\tfield.code = {13, 4, 19, 0, 3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::pooling_stats_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.partial_diff, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.valid_points, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.failed_points, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_partials, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.total_response_time, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.last_partial, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.server_url, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.error_count, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::pooling_stats_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_pooling_stats_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::pooling_stats_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(44);\n\tvnx::write_value(_buf + 0, value.partial_diff);\n\tvnx::write_value(_buf + 8, value.valid_points);\n\tvnx::write_value(_buf + 16, value.failed_points);\n\tvnx::write_value(_buf + 24, value.total_partials);\n\tvnx::write_value(_buf + 28, value.total_response_time);\n\tvnx::write_value(_buf + 36, value.last_partial);\n\tvnx::write(out, value.server_url, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.error_count, type_code, type_code->fields[7].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::pooling_stats_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::pooling_stats_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::pooling_stats_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::pooling_stats_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::pooling_stats_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/query_filter_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/query_filter_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/tx_type_e.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 query_filter_t::VNX_TYPE_HASH(0x92b02006aeea9a76ull);\nconst vnx::Hash64 query_filter_t::VNX_CODE_HASH(0xd4593a6cc6eb5537ull);\n\nvnx::Hash64 query_filter_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string query_filter_t::get_type_name() const {\n\treturn \"mmx.query_filter_t\";\n}\n\nconst vnx::TypeCode* query_filter_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_query_filter_t;\n}\n\nstd::shared_ptr<query_filter_t> query_filter_t::create() {\n\treturn std::make_shared<query_filter_t>();\n}\n\nstd::shared_ptr<query_filter_t> query_filter_t::clone() const {\n\treturn std::make_shared<query_filter_t>(*this);\n}\n\nvoid query_filter_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid query_filter_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid query_filter_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_query_filter_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, since);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, until);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, limit);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, max_search);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, currency);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, type);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, memo);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, white_list);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, with_pending);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid query_filter_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"since\\\": \"; vnx::write(_out, since);\n\t_out << \", \\\"until\\\": \"; vnx::write(_out, until);\n\t_out << \", \\\"limit\\\": \"; vnx::write(_out, limit);\n\t_out << \", \\\"max_search\\\": \"; vnx::write(_out, max_search);\n\t_out << \", \\\"currency\\\": \"; vnx::write(_out, currency);\n\t_out << \", \\\"type\\\": \"; vnx::write(_out, type);\n\t_out << \", \\\"memo\\\": \"; vnx::write(_out, memo);\n\t_out << \", \\\"white_list\\\": \"; vnx::write(_out, white_list);\n\t_out << \", \\\"with_pending\\\": \"; vnx::write(_out, with_pending);\n\t_out << \"}\";\n}\n\nvoid query_filter_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object query_filter_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.query_filter_t\";\n\t_object[\"since\"] = since;\n\t_object[\"until\"] = until;\n\t_object[\"limit\"] = limit;\n\t_object[\"max_search\"] = max_search;\n\t_object[\"currency\"] = currency;\n\t_object[\"type\"] = type;\n\t_object[\"memo\"] = memo;\n\t_object[\"white_list\"] = white_list;\n\t_object[\"with_pending\"] = with_pending;\n\treturn _object;\n}\n\nvoid query_filter_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"currency\") {\n\t\t\t_entry.second.to(currency);\n\t\t} else if(_entry.first == \"limit\") {\n\t\t\t_entry.second.to(limit);\n\t\t} else if(_entry.first == \"max_search\") {\n\t\t\t_entry.second.to(max_search);\n\t\t} else if(_entry.first == \"memo\") {\n\t\t\t_entry.second.to(memo);\n\t\t} else if(_entry.first == \"since\") {\n\t\t\t_entry.second.to(since);\n\t\t} else if(_entry.first == \"type\") {\n\t\t\t_entry.second.to(type);\n\t\t} else if(_entry.first == \"until\") {\n\t\t\t_entry.second.to(until);\n\t\t} else if(_entry.first == \"white_list\") {\n\t\t\t_entry.second.to(white_list);\n\t\t} else if(_entry.first == \"with_pending\") {\n\t\t\t_entry.second.to(with_pending);\n\t\t}\n\t}\n}\n\nvnx::Variant query_filter_t::get_field(const std::string& _name) const {\n\tif(_name == \"since\") {\n\t\treturn vnx::Variant(since);\n\t}\n\tif(_name == \"until\") {\n\t\treturn vnx::Variant(until);\n\t}\n\tif(_name == \"limit\") {\n\t\treturn vnx::Variant(limit);\n\t}\n\tif(_name == \"max_search\") {\n\t\treturn vnx::Variant(max_search);\n\t}\n\tif(_name == \"currency\") {\n\t\treturn vnx::Variant(currency);\n\t}\n\tif(_name == \"type\") {\n\t\treturn vnx::Variant(type);\n\t}\n\tif(_name == \"memo\") {\n\t\treturn vnx::Variant(memo);\n\t}\n\tif(_name == \"white_list\") {\n\t\treturn vnx::Variant(white_list);\n\t}\n\tif(_name == \"with_pending\") {\n\t\treturn vnx::Variant(with_pending);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid query_filter_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"since\") {\n\t\t_value.to(since);\n\t} else if(_name == \"until\") {\n\t\t_value.to(until);\n\t} else if(_name == \"limit\") {\n\t\t_value.to(limit);\n\t} else if(_name == \"max_search\") {\n\t\t_value.to(max_search);\n\t} else if(_name == \"currency\") {\n\t\t_value.to(currency);\n\t} else if(_name == \"type\") {\n\t\t_value.to(type);\n\t} else if(_name == \"memo\") {\n\t\t_value.to(memo);\n\t} else if(_name == \"white_list\") {\n\t\t_value.to(white_list);\n\t} else if(_name == \"with_pending\") {\n\t\t_value.to(with_pending);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const query_filter_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, query_filter_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* query_filter_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> query_filter_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.query_filter_t\";\n\ttype_code->type_hash = vnx::Hash64(0x92b02006aeea9a76ull);\n\ttype_code->code_hash = vnx::Hash64(0xd4593a6cc6eb5537ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::query_filter_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<query_filter_t>>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::tx_type_e::static_get_type_code();\n\ttype_code->fields.resize(9);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"since\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"until\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"limit\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"max_search\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"currency\";\n\t\tfield.code = {12, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type\";\n\t\tfield.code = {33, 19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"memo\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"white_list\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"with_pending\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::query_filter_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.since, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.until, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.limit, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.max_search, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.white_list, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.with_pending, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 4: vnx::read(in, value.currency, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.type, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.memo, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::query_filter_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_query_filter_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::query_filter_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(18);\n\tvnx::write_value(_buf + 0, value.since);\n\tvnx::write_value(_buf + 4, value.until);\n\tvnx::write_value(_buf + 8, value.limit);\n\tvnx::write_value(_buf + 12, value.max_search);\n\tvnx::write_value(_buf + 16, value.white_list);\n\tvnx::write_value(_buf + 17, value.with_pending);\n\tvnx::write(out, value.currency, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.type, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.memo, type_code, type_code->fields[6].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::query_filter_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::query_filter_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::query_filter_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::query_filter_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::query_filter_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/spend_options_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/tx_note_e.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 spend_options_t::VNX_TYPE_HASH(0x37f7c6d377362e95ull);\nconst vnx::Hash64 spend_options_t::VNX_CODE_HASH(0x4ac9872830f3000full);\n\nvnx::Hash64 spend_options_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string spend_options_t::get_type_name() const {\n\treturn \"mmx.spend_options_t\";\n}\n\nconst vnx::TypeCode* spend_options_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_spend_options_t;\n}\n\nstd::shared_ptr<spend_options_t> spend_options_t::create() {\n\treturn std::make_shared<spend_options_t>();\n}\n\nstd::shared_ptr<spend_options_t> spend_options_t::clone() const {\n\treturn std::make_shared<spend_options_t>(*this);\n}\n\nvoid spend_options_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid spend_options_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid spend_options_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_spend_options_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, auto_send);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, mark_spent);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, fee_ratio);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, gas_limit);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, expire_at);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, expire_delta);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, nonce);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, user);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, sender);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, passphrase);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, note);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, memo);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, owner_map);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, contract_map);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid spend_options_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"auto_send\\\": \"; vnx::write(_out, auto_send);\n\t_out << \", \\\"mark_spent\\\": \"; vnx::write(_out, mark_spent);\n\t_out << \", \\\"fee_ratio\\\": \"; vnx::write(_out, fee_ratio);\n\t_out << \", \\\"gas_limit\\\": \"; vnx::write(_out, gas_limit);\n\t_out << \", \\\"expire_at\\\": \"; vnx::write(_out, expire_at);\n\t_out << \", \\\"expire_delta\\\": \"; vnx::write(_out, expire_delta);\n\t_out << \", \\\"nonce\\\": \"; vnx::write(_out, nonce);\n\t_out << \", \\\"user\\\": \"; vnx::write(_out, user);\n\t_out << \", \\\"sender\\\": \"; vnx::write(_out, sender);\n\t_out << \", \\\"passphrase\\\": \"; vnx::write(_out, passphrase);\n\t_out << \", \\\"note\\\": \"; vnx::write(_out, note);\n\t_out << \", \\\"memo\\\": \"; vnx::write(_out, memo);\n\t_out << \", \\\"owner_map\\\": \"; vnx::write(_out, owner_map);\n\t_out << \", \\\"contract_map\\\": \"; vnx::write(_out, contract_map);\n\t_out << \"}\";\n}\n\nvoid spend_options_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object spend_options_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.spend_options_t\";\n\t_object[\"auto_send\"] = auto_send;\n\t_object[\"mark_spent\"] = mark_spent;\n\t_object[\"fee_ratio\"] = fee_ratio;\n\t_object[\"gas_limit\"] = gas_limit;\n\t_object[\"expire_at\"] = expire_at;\n\t_object[\"expire_delta\"] = expire_delta;\n\t_object[\"nonce\"] = nonce;\n\t_object[\"user\"] = user;\n\t_object[\"sender\"] = sender;\n\t_object[\"passphrase\"] = passphrase;\n\t_object[\"note\"] = note;\n\t_object[\"memo\"] = memo;\n\t_object[\"owner_map\"] = owner_map;\n\t_object[\"contract_map\"] = contract_map;\n\treturn _object;\n}\n\nvoid spend_options_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"auto_send\") {\n\t\t\t_entry.second.to(auto_send);\n\t\t} else if(_entry.first == \"contract_map\") {\n\t\t\t_entry.second.to(contract_map);\n\t\t} else if(_entry.first == \"expire_at\") {\n\t\t\t_entry.second.to(expire_at);\n\t\t} else if(_entry.first == \"expire_delta\") {\n\t\t\t_entry.second.to(expire_delta);\n\t\t} else if(_entry.first == \"fee_ratio\") {\n\t\t\t_entry.second.to(fee_ratio);\n\t\t} else if(_entry.first == \"gas_limit\") {\n\t\t\t_entry.second.to(gas_limit);\n\t\t} else if(_entry.first == \"mark_spent\") {\n\t\t\t_entry.second.to(mark_spent);\n\t\t} else if(_entry.first == \"memo\") {\n\t\t\t_entry.second.to(memo);\n\t\t} else if(_entry.first == \"nonce\") {\n\t\t\t_entry.second.to(nonce);\n\t\t} else if(_entry.first == \"note\") {\n\t\t\t_entry.second.to(note);\n\t\t} else if(_entry.first == \"owner_map\") {\n\t\t\t_entry.second.to(owner_map);\n\t\t} else if(_entry.first == \"passphrase\") {\n\t\t\t_entry.second.to(passphrase);\n\t\t} else if(_entry.first == \"sender\") {\n\t\t\t_entry.second.to(sender);\n\t\t} else if(_entry.first == \"user\") {\n\t\t\t_entry.second.to(user);\n\t\t}\n\t}\n}\n\nvnx::Variant spend_options_t::get_field(const std::string& _name) const {\n\tif(_name == \"auto_send\") {\n\t\treturn vnx::Variant(auto_send);\n\t}\n\tif(_name == \"mark_spent\") {\n\t\treturn vnx::Variant(mark_spent);\n\t}\n\tif(_name == \"fee_ratio\") {\n\t\treturn vnx::Variant(fee_ratio);\n\t}\n\tif(_name == \"gas_limit\") {\n\t\treturn vnx::Variant(gas_limit);\n\t}\n\tif(_name == \"expire_at\") {\n\t\treturn vnx::Variant(expire_at);\n\t}\n\tif(_name == \"expire_delta\") {\n\t\treturn vnx::Variant(expire_delta);\n\t}\n\tif(_name == \"nonce\") {\n\t\treturn vnx::Variant(nonce);\n\t}\n\tif(_name == \"user\") {\n\t\treturn vnx::Variant(user);\n\t}\n\tif(_name == \"sender\") {\n\t\treturn vnx::Variant(sender);\n\t}\n\tif(_name == \"passphrase\") {\n\t\treturn vnx::Variant(passphrase);\n\t}\n\tif(_name == \"note\") {\n\t\treturn vnx::Variant(note);\n\t}\n\tif(_name == \"memo\") {\n\t\treturn vnx::Variant(memo);\n\t}\n\tif(_name == \"owner_map\") {\n\t\treturn vnx::Variant(owner_map);\n\t}\n\tif(_name == \"contract_map\") {\n\t\treturn vnx::Variant(contract_map);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid spend_options_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"auto_send\") {\n\t\t_value.to(auto_send);\n\t} else if(_name == \"mark_spent\") {\n\t\t_value.to(mark_spent);\n\t} else if(_name == \"fee_ratio\") {\n\t\t_value.to(fee_ratio);\n\t} else if(_name == \"gas_limit\") {\n\t\t_value.to(gas_limit);\n\t} else if(_name == \"expire_at\") {\n\t\t_value.to(expire_at);\n\t} else if(_name == \"expire_delta\") {\n\t\t_value.to(expire_delta);\n\t} else if(_name == \"nonce\") {\n\t\t_value.to(nonce);\n\t} else if(_name == \"user\") {\n\t\t_value.to(user);\n\t} else if(_name == \"sender\") {\n\t\t_value.to(sender);\n\t} else if(_name == \"passphrase\") {\n\t\t_value.to(passphrase);\n\t} else if(_name == \"note\") {\n\t\t_value.to(note);\n\t} else if(_name == \"memo\") {\n\t\t_value.to(memo);\n\t} else if(_name == \"owner_map\") {\n\t\t_value.to(owner_map);\n\t} else if(_name == \"contract_map\") {\n\t\t_value.to(contract_map);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const spend_options_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, spend_options_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* spend_options_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> spend_options_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.spend_options_t\";\n\ttype_code->type_hash = vnx::Hash64(0x37f7c6d377362e95ull);\n\ttype_code->code_hash = vnx::Hash64(0x4ac9872830f3000full);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::spend_options_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<spend_options_t>>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::tx_note_e::static_get_type_code();\n\ttype_code->fields.resize(14);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"auto_send\";\n\t\tfield.value = vnx::to_string(true);\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"mark_spent\";\n\t\tfield.value = vnx::to_string(false);\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"fee_ratio\";\n\t\tfield.value = vnx::to_string(1024);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"gas_limit\";\n\t\tfield.value = vnx::to_string(5000000);\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"expire_at\";\n\t\tfield.code = {33, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"expire_delta\";\n\t\tfield.code = {33, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"nonce\";\n\t\tfield.code = {33, 4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"sender\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"passphrase\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"note\";\n\t\tfield.code = {33, 19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"memo\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"owner_map\";\n\t\tfield.code = {13, 5, 11, 32, 1, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract_map\";\n\t\tfield.code = {13, 5, 11, 32, 1, 16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::spend_options_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.auto_send, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.mark_spent, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.fee_ratio, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.gas_limit, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 4: vnx::read(in, value.expire_at, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.expire_delta, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.nonce, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.user, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.sender, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.passphrase, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.note, type_code, _field->code.data()); break;\n\t\t\tcase 11: vnx::read(in, value.memo, type_code, _field->code.data()); break;\n\t\t\tcase 12: vnx::read(in, value.owner_map, type_code, _field->code.data()); break;\n\t\t\tcase 13: vnx::read(in, value.contract_map, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::spend_options_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_spend_options_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::spend_options_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(10);\n\tvnx::write_value(_buf + 0, value.auto_send);\n\tvnx::write_value(_buf + 1, value.mark_spent);\n\tvnx::write_value(_buf + 2, value.fee_ratio);\n\tvnx::write_value(_buf + 6, value.gas_limit);\n\tvnx::write(out, value.expire_at, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.expire_delta, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.nonce, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.user, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.sender, type_code, type_code->fields[8].code.data());\n\tvnx::write(out, value.passphrase, type_code, type_code->fields[9].code.data());\n\tvnx::write(out, value.note, type_code, type_code->fields[10].code.data());\n\tvnx::write(out, value.memo, type_code, type_code->fields[11].code.data());\n\tvnx::write(out, value.owner_map, type_code, type_code->fields[12].code.data());\n\tvnx::write(out, value.contract_map, type_code, type_code->fields[13].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::spend_options_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::spend_options_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::spend_options_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::spend_options_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::spend_options_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/swap_entry_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/swap_entry_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/uint128.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 swap_entry_t::VNX_TYPE_HASH(0xe3110712aa0f6064ull);\nconst vnx::Hash64 swap_entry_t::VNX_CODE_HASH(0xe1805d1d4cab1d30ull);\n\nvnx::Hash64 swap_entry_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string swap_entry_t::get_type_name() const {\n\treturn \"mmx.swap_entry_t\";\n}\n\nconst vnx::TypeCode* swap_entry_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_swap_entry_t;\n}\n\nstd::shared_ptr<swap_entry_t> swap_entry_t::create() {\n\treturn std::make_shared<swap_entry_t>();\n}\n\nstd::shared_ptr<swap_entry_t> swap_entry_t::clone() const {\n\treturn std::make_shared<swap_entry_t>(*this);\n}\n\nvoid swap_entry_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid swap_entry_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid swap_entry_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_swap_entry_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, txid);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, type);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, index);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, value);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, symbol);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, user);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid swap_entry_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"txid\\\": \"; vnx::write(_out, txid);\n\t_out << \", \\\"type\\\": \"; vnx::write(_out, type);\n\t_out << \", \\\"index\\\": \"; vnx::write(_out, index);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"value\\\": \"; vnx::write(_out, value);\n\t_out << \", \\\"symbol\\\": \"; vnx::write(_out, symbol);\n\t_out << \", \\\"user\\\": \"; vnx::write(_out, user);\n\t_out << \"}\";\n}\n\nvoid swap_entry_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object swap_entry_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.swap_entry_t\";\n\t_object[\"height\"] = height;\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"txid\"] = txid;\n\t_object[\"type\"] = type;\n\t_object[\"index\"] = index;\n\t_object[\"amount\"] = amount;\n\t_object[\"value\"] = value;\n\t_object[\"symbol\"] = symbol;\n\t_object[\"user\"] = user;\n\treturn _object;\n}\n\nvoid swap_entry_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"index\") {\n\t\t\t_entry.second.to(index);\n\t\t} else if(_entry.first == \"symbol\") {\n\t\t\t_entry.second.to(symbol);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t} else if(_entry.first == \"txid\") {\n\t\t\t_entry.second.to(txid);\n\t\t} else if(_entry.first == \"type\") {\n\t\t\t_entry.second.to(type);\n\t\t} else if(_entry.first == \"user\") {\n\t\t\t_entry.second.to(user);\n\t\t} else if(_entry.first == \"value\") {\n\t\t\t_entry.second.to(value);\n\t\t}\n\t}\n}\n\nvnx::Variant swap_entry_t::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"txid\") {\n\t\treturn vnx::Variant(txid);\n\t}\n\tif(_name == \"type\") {\n\t\treturn vnx::Variant(type);\n\t}\n\tif(_name == \"index\") {\n\t\treturn vnx::Variant(index);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"value\") {\n\t\treturn vnx::Variant(value);\n\t}\n\tif(_name == \"symbol\") {\n\t\treturn vnx::Variant(symbol);\n\t}\n\tif(_name == \"user\") {\n\t\treturn vnx::Variant(user);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid swap_entry_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"txid\") {\n\t\t_value.to(txid);\n\t} else if(_name == \"type\") {\n\t\t_value.to(type);\n\t} else if(_name == \"index\") {\n\t\t_value.to(index);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"value\") {\n\t\t_value.to(value);\n\t} else if(_name == \"symbol\") {\n\t\t_value.to(symbol);\n\t} else if(_name == \"user\") {\n\t\t_value.to(user);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const swap_entry_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, swap_entry_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* swap_entry_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> swap_entry_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.swap_entry_t\";\n\ttype_code->type_hash = vnx::Hash64(0xe3110712aa0f6064ull);\n\ttype_code->code_hash = vnx::Hash64(0xe1805d1d4cab1d30ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::swap_entry_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<swap_entry_t>>(); };\n\ttype_code->fields.resize(9);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"txid\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"index\";\n\t\tfield.code = {1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"value\";\n\t\tfield.code = {33, 10};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"symbol\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::swap_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_stamp, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.index, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 2: vnx::read(in, value.txid, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.type, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.value, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.symbol, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.user, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::swap_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_swap_entry_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::swap_entry_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(13);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write_value(_buf + 4, value.time_stamp);\n\tvnx::write_value(_buf + 12, value.index);\n\tvnx::write(out, value.txid, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.type, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.value, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.symbol, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.user, type_code, type_code->fields[8].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::swap_entry_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::swap_entry_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::swap_entry_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::swap_entry_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::swap_entry_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/swap_info_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/swap_info_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/swap_pool_info_t.hxx>\n#include <mmx/uint128.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 swap_info_t::VNX_TYPE_HASH(0x7586be908f15ae8ull);\nconst vnx::Hash64 swap_info_t::VNX_CODE_HASH(0x5ce6cfe182fce2ull);\n\nvnx::Hash64 swap_info_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string swap_info_t::get_type_name() const {\n\treturn \"mmx.swap_info_t\";\n}\n\nconst vnx::TypeCode* swap_info_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_swap_info_t;\n}\n\nstd::shared_ptr<swap_info_t> swap_info_t::create() {\n\treturn std::make_shared<swap_info_t>();\n}\n\nstd::shared_ptr<swap_info_t> swap_info_t::clone() const {\n\treturn std::make_shared<swap_info_t>(*this);\n}\n\nvoid swap_info_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid swap_info_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid swap_info_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_swap_info_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, name);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, tokens);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, wallet);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, balance);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, volume);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, fees_paid);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, fees_claimed);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, user_total);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, volume_1d);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, volume_7d);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, avg_apy_1d);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, avg_apy_7d);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, fee_rates);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, pools);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid swap_info_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"name\\\": \"; vnx::write(_out, name);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"tokens\\\": \"; vnx::write(_out, tokens);\n\t_out << \", \\\"wallet\\\": \"; vnx::write(_out, wallet);\n\t_out << \", \\\"balance\\\": \"; vnx::write(_out, balance);\n\t_out << \", \\\"volume\\\": \"; vnx::write(_out, volume);\n\t_out << \", \\\"fees_paid\\\": \"; vnx::write(_out, fees_paid);\n\t_out << \", \\\"fees_claimed\\\": \"; vnx::write(_out, fees_claimed);\n\t_out << \", \\\"user_total\\\": \"; vnx::write(_out, user_total);\n\t_out << \", \\\"volume_1d\\\": \"; vnx::write(_out, volume_1d);\n\t_out << \", \\\"volume_7d\\\": \"; vnx::write(_out, volume_7d);\n\t_out << \", \\\"avg_apy_1d\\\": \"; vnx::write(_out, avg_apy_1d);\n\t_out << \", \\\"avg_apy_7d\\\": \"; vnx::write(_out, avg_apy_7d);\n\t_out << \", \\\"fee_rates\\\": \"; vnx::write(_out, fee_rates);\n\t_out << \", \\\"pools\\\": \"; vnx::write(_out, pools);\n\t_out << \"}\";\n}\n\nvoid swap_info_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object swap_info_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.swap_info_t\";\n\t_object[\"name\"] = name;\n\t_object[\"address\"] = address;\n\t_object[\"tokens\"] = tokens;\n\t_object[\"wallet\"] = wallet;\n\t_object[\"balance\"] = balance;\n\t_object[\"volume\"] = volume;\n\t_object[\"fees_paid\"] = fees_paid;\n\t_object[\"fees_claimed\"] = fees_claimed;\n\t_object[\"user_total\"] = user_total;\n\t_object[\"volume_1d\"] = volume_1d;\n\t_object[\"volume_7d\"] = volume_7d;\n\t_object[\"avg_apy_1d\"] = avg_apy_1d;\n\t_object[\"avg_apy_7d\"] = avg_apy_7d;\n\t_object[\"fee_rates\"] = fee_rates;\n\t_object[\"pools\"] = pools;\n\treturn _object;\n}\n\nvoid swap_info_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"avg_apy_1d\") {\n\t\t\t_entry.second.to(avg_apy_1d);\n\t\t} else if(_entry.first == \"avg_apy_7d\") {\n\t\t\t_entry.second.to(avg_apy_7d);\n\t\t} else if(_entry.first == \"balance\") {\n\t\t\t_entry.second.to(balance);\n\t\t} else if(_entry.first == \"fee_rates\") {\n\t\t\t_entry.second.to(fee_rates);\n\t\t} else if(_entry.first == \"fees_claimed\") {\n\t\t\t_entry.second.to(fees_claimed);\n\t\t} else if(_entry.first == \"fees_paid\") {\n\t\t\t_entry.second.to(fees_paid);\n\t\t} else if(_entry.first == \"name\") {\n\t\t\t_entry.second.to(name);\n\t\t} else if(_entry.first == \"pools\") {\n\t\t\t_entry.second.to(pools);\n\t\t} else if(_entry.first == \"tokens\") {\n\t\t\t_entry.second.to(tokens);\n\t\t} else if(_entry.first == \"user_total\") {\n\t\t\t_entry.second.to(user_total);\n\t\t} else if(_entry.first == \"volume\") {\n\t\t\t_entry.second.to(volume);\n\t\t} else if(_entry.first == \"volume_1d\") {\n\t\t\t_entry.second.to(volume_1d);\n\t\t} else if(_entry.first == \"volume_7d\") {\n\t\t\t_entry.second.to(volume_7d);\n\t\t} else if(_entry.first == \"wallet\") {\n\t\t\t_entry.second.to(wallet);\n\t\t}\n\t}\n}\n\nvnx::Variant swap_info_t::get_field(const std::string& _name) const {\n\tif(_name == \"name\") {\n\t\treturn vnx::Variant(name);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"tokens\") {\n\t\treturn vnx::Variant(tokens);\n\t}\n\tif(_name == \"wallet\") {\n\t\treturn vnx::Variant(wallet);\n\t}\n\tif(_name == \"balance\") {\n\t\treturn vnx::Variant(balance);\n\t}\n\tif(_name == \"volume\") {\n\t\treturn vnx::Variant(volume);\n\t}\n\tif(_name == \"fees_paid\") {\n\t\treturn vnx::Variant(fees_paid);\n\t}\n\tif(_name == \"fees_claimed\") {\n\t\treturn vnx::Variant(fees_claimed);\n\t}\n\tif(_name == \"user_total\") {\n\t\treturn vnx::Variant(user_total);\n\t}\n\tif(_name == \"volume_1d\") {\n\t\treturn vnx::Variant(volume_1d);\n\t}\n\tif(_name == \"volume_7d\") {\n\t\treturn vnx::Variant(volume_7d);\n\t}\n\tif(_name == \"avg_apy_1d\") {\n\t\treturn vnx::Variant(avg_apy_1d);\n\t}\n\tif(_name == \"avg_apy_7d\") {\n\t\treturn vnx::Variant(avg_apy_7d);\n\t}\n\tif(_name == \"fee_rates\") {\n\t\treturn vnx::Variant(fee_rates);\n\t}\n\tif(_name == \"pools\") {\n\t\treturn vnx::Variant(pools);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid swap_info_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"name\") {\n\t\t_value.to(name);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"tokens\") {\n\t\t_value.to(tokens);\n\t} else if(_name == \"wallet\") {\n\t\t_value.to(wallet);\n\t} else if(_name == \"balance\") {\n\t\t_value.to(balance);\n\t} else if(_name == \"volume\") {\n\t\t_value.to(volume);\n\t} else if(_name == \"fees_paid\") {\n\t\t_value.to(fees_paid);\n\t} else if(_name == \"fees_claimed\") {\n\t\t_value.to(fees_claimed);\n\t} else if(_name == \"user_total\") {\n\t\t_value.to(user_total);\n\t} else if(_name == \"volume_1d\") {\n\t\t_value.to(volume_1d);\n\t} else if(_name == \"volume_7d\") {\n\t\t_value.to(volume_7d);\n\t} else if(_name == \"avg_apy_1d\") {\n\t\t_value.to(avg_apy_1d);\n\t} else if(_name == \"avg_apy_7d\") {\n\t\t_value.to(avg_apy_7d);\n\t} else if(_name == \"fee_rates\") {\n\t\t_value.to(fee_rates);\n\t} else if(_name == \"pools\") {\n\t\t_value.to(pools);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const swap_info_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, swap_info_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* swap_info_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> swap_info_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.swap_info_t\";\n\ttype_code->type_hash = vnx::Hash64(0x7586be908f15ae8ull);\n\ttype_code->code_hash = vnx::Hash64(0x5ce6cfe182fce2ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::swap_info_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<swap_info_t>>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::swap_pool_info_t::static_get_type_code();\n\ttype_code->fields.resize(15);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"name\";\n\t\tfield.code = {32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"tokens\";\n\t\tfield.code = {11, 2, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"wallet\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"balance\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"volume\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"fees_paid\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"fees_claimed\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user_total\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"volume_1d\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"volume_7d\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.data_size = 16;\n\t\tfield.name = \"avg_apy_1d\";\n\t\tfield.code = {11, 2, 10};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.data_size = 16;\n\t\tfield.name = \"avg_apy_7d\";\n\t\tfield.code = {11, 2, 10};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"fee_rates\";\n\t\tfield.code = {12, 10};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"pools\";\n\t\tfield.code = {12, 19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::swap_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[11]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.avg_apy_1d, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[12]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.avg_apy_7d, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.name, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.tokens, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.wallet, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.balance, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.volume, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.fees_paid, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.fees_claimed, type_code, _field->code.data()); break;\n\t\t\tcase 8: vnx::read(in, value.user_total, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.volume_1d, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.volume_7d, type_code, _field->code.data()); break;\n\t\t\tcase 13: vnx::read(in, value.fee_rates, type_code, _field->code.data()); break;\n\t\t\tcase 14: vnx::read(in, value.pools, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::swap_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_swap_info_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::swap_info_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(32);\n\tvnx::write_value(_buf + 0, value.avg_apy_1d);\n\tvnx::write_value(_buf + 16, value.avg_apy_7d);\n\tvnx::write(out, value.name, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.address, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.tokens, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.wallet, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.balance, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.volume, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.fees_paid, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.fees_claimed, type_code, type_code->fields[7].code.data());\n\tvnx::write(out, value.user_total, type_code, type_code->fields[8].code.data());\n\tvnx::write(out, value.volume_1d, type_code, type_code->fields[9].code.data());\n\tvnx::write(out, value.volume_7d, type_code, type_code->fields[10].code.data());\n\tvnx::write(out, value.fee_rates, type_code, type_code->fields[13].code.data());\n\tvnx::write(out, value.pools, type_code, type_code->fields[14].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::swap_info_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::swap_info_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::swap_info_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::swap_info_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::swap_info_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/swap_pool_info_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/swap_pool_info_t.hxx>\n#include <mmx/uint128.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 swap_pool_info_t::VNX_TYPE_HASH(0x6502e235a743dabull);\nconst vnx::Hash64 swap_pool_info_t::VNX_CODE_HASH(0x4faff85eb45fb55ull);\n\nvnx::Hash64 swap_pool_info_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string swap_pool_info_t::get_type_name() const {\n\treturn \"mmx.swap_pool_info_t\";\n}\n\nconst vnx::TypeCode* swap_pool_info_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_swap_pool_info_t;\n}\n\nstd::shared_ptr<swap_pool_info_t> swap_pool_info_t::create() {\n\treturn std::make_shared<swap_pool_info_t>();\n}\n\nstd::shared_ptr<swap_pool_info_t> swap_pool_info_t::clone() const {\n\treturn std::make_shared<swap_pool_info_t>(*this);\n}\n\nvoid swap_pool_info_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid swap_pool_info_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid swap_pool_info_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_swap_pool_info_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, balance);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, fees_paid);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, fees_claimed);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, user_total);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid swap_pool_info_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"balance\\\": \"; vnx::write(_out, balance);\n\t_out << \", \\\"fees_paid\\\": \"; vnx::write(_out, fees_paid);\n\t_out << \", \\\"fees_claimed\\\": \"; vnx::write(_out, fees_claimed);\n\t_out << \", \\\"user_total\\\": \"; vnx::write(_out, user_total);\n\t_out << \"}\";\n}\n\nvoid swap_pool_info_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object swap_pool_info_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.swap_pool_info_t\";\n\t_object[\"balance\"] = balance;\n\t_object[\"fees_paid\"] = fees_paid;\n\t_object[\"fees_claimed\"] = fees_claimed;\n\t_object[\"user_total\"] = user_total;\n\treturn _object;\n}\n\nvoid swap_pool_info_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"balance\") {\n\t\t\t_entry.second.to(balance);\n\t\t} else if(_entry.first == \"fees_claimed\") {\n\t\t\t_entry.second.to(fees_claimed);\n\t\t} else if(_entry.first == \"fees_paid\") {\n\t\t\t_entry.second.to(fees_paid);\n\t\t} else if(_entry.first == \"user_total\") {\n\t\t\t_entry.second.to(user_total);\n\t\t}\n\t}\n}\n\nvnx::Variant swap_pool_info_t::get_field(const std::string& _name) const {\n\tif(_name == \"balance\") {\n\t\treturn vnx::Variant(balance);\n\t}\n\tif(_name == \"fees_paid\") {\n\t\treturn vnx::Variant(fees_paid);\n\t}\n\tif(_name == \"fees_claimed\") {\n\t\treturn vnx::Variant(fees_claimed);\n\t}\n\tif(_name == \"user_total\") {\n\t\treturn vnx::Variant(user_total);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid swap_pool_info_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"balance\") {\n\t\t_value.to(balance);\n\t} else if(_name == \"fees_paid\") {\n\t\t_value.to(fees_paid);\n\t} else if(_name == \"fees_claimed\") {\n\t\t_value.to(fees_claimed);\n\t} else if(_name == \"user_total\") {\n\t\t_value.to(user_total);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const swap_pool_info_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, swap_pool_info_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* swap_pool_info_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> swap_pool_info_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.swap_pool_info_t\";\n\ttype_code->type_hash = vnx::Hash64(0x6502e235a743dabull);\n\ttype_code->code_hash = vnx::Hash64(0x4faff85eb45fb55ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::swap_pool_info_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<swap_pool_info_t>>(); };\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"balance\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"fees_paid\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"fees_claimed\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"user_total\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::swap_pool_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.balance, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.fees_paid, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.fees_claimed, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.user_total, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::swap_pool_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_swap_pool_info_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::swap_pool_info_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.balance, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.fees_paid, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.fees_claimed, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.user_total, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::swap_pool_info_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::swap_pool_info_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::swap_pool_info_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::swap_pool_info_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::swap_pool_info_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/swap_user_info_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/swap_user_info_t.hxx>\n#include <mmx/uint128.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 swap_user_info_t::VNX_TYPE_HASH(0x1b6c720bff2d638cull);\nconst vnx::Hash64 swap_user_info_t::VNX_CODE_HASH(0x996df91e34c838d2ull);\n\nvnx::Hash64 swap_user_info_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string swap_user_info_t::get_type_name() const {\n\treturn \"mmx.swap_user_info_t\";\n}\n\nconst vnx::TypeCode* swap_user_info_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_swap_user_info_t;\n}\n\nstd::shared_ptr<swap_user_info_t> swap_user_info_t::create() {\n\treturn std::make_shared<swap_user_info_t>();\n}\n\nstd::shared_ptr<swap_user_info_t> swap_user_info_t::clone() const {\n\treturn std::make_shared<swap_user_info_t>(*this);\n}\n\nvoid swap_user_info_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid swap_user_info_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid swap_user_info_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_swap_user_info_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, pool_idx);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, balance);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, last_user_total);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, last_fees_paid);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, fees_earned);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, equivalent_liquidity);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, unlock_height);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid swap_user_info_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"pool_idx\\\": \"; vnx::write(_out, pool_idx);\n\t_out << \", \\\"balance\\\": \"; vnx::write(_out, balance);\n\t_out << \", \\\"last_user_total\\\": \"; vnx::write(_out, last_user_total);\n\t_out << \", \\\"last_fees_paid\\\": \"; vnx::write(_out, last_fees_paid);\n\t_out << \", \\\"fees_earned\\\": \"; vnx::write(_out, fees_earned);\n\t_out << \", \\\"equivalent_liquidity\\\": \"; vnx::write(_out, equivalent_liquidity);\n\t_out << \", \\\"unlock_height\\\": \"; vnx::write(_out, unlock_height);\n\t_out << \"}\";\n}\n\nvoid swap_user_info_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object swap_user_info_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.swap_user_info_t\";\n\t_object[\"pool_idx\"] = pool_idx;\n\t_object[\"balance\"] = balance;\n\t_object[\"last_user_total\"] = last_user_total;\n\t_object[\"last_fees_paid\"] = last_fees_paid;\n\t_object[\"fees_earned\"] = fees_earned;\n\t_object[\"equivalent_liquidity\"] = equivalent_liquidity;\n\t_object[\"unlock_height\"] = unlock_height;\n\treturn _object;\n}\n\nvoid swap_user_info_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"balance\") {\n\t\t\t_entry.second.to(balance);\n\t\t} else if(_entry.first == \"equivalent_liquidity\") {\n\t\t\t_entry.second.to(equivalent_liquidity);\n\t\t} else if(_entry.first == \"fees_earned\") {\n\t\t\t_entry.second.to(fees_earned);\n\t\t} else if(_entry.first == \"last_fees_paid\") {\n\t\t\t_entry.second.to(last_fees_paid);\n\t\t} else if(_entry.first == \"last_user_total\") {\n\t\t\t_entry.second.to(last_user_total);\n\t\t} else if(_entry.first == \"pool_idx\") {\n\t\t\t_entry.second.to(pool_idx);\n\t\t} else if(_entry.first == \"unlock_height\") {\n\t\t\t_entry.second.to(unlock_height);\n\t\t}\n\t}\n}\n\nvnx::Variant swap_user_info_t::get_field(const std::string& _name) const {\n\tif(_name == \"pool_idx\") {\n\t\treturn vnx::Variant(pool_idx);\n\t}\n\tif(_name == \"balance\") {\n\t\treturn vnx::Variant(balance);\n\t}\n\tif(_name == \"last_user_total\") {\n\t\treturn vnx::Variant(last_user_total);\n\t}\n\tif(_name == \"last_fees_paid\") {\n\t\treturn vnx::Variant(last_fees_paid);\n\t}\n\tif(_name == \"fees_earned\") {\n\t\treturn vnx::Variant(fees_earned);\n\t}\n\tif(_name == \"equivalent_liquidity\") {\n\t\treturn vnx::Variant(equivalent_liquidity);\n\t}\n\tif(_name == \"unlock_height\") {\n\t\treturn vnx::Variant(unlock_height);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid swap_user_info_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"pool_idx\") {\n\t\t_value.to(pool_idx);\n\t} else if(_name == \"balance\") {\n\t\t_value.to(balance);\n\t} else if(_name == \"last_user_total\") {\n\t\t_value.to(last_user_total);\n\t} else if(_name == \"last_fees_paid\") {\n\t\t_value.to(last_fees_paid);\n\t} else if(_name == \"fees_earned\") {\n\t\t_value.to(fees_earned);\n\t} else if(_name == \"equivalent_liquidity\") {\n\t\t_value.to(equivalent_liquidity);\n\t} else if(_name == \"unlock_height\") {\n\t\t_value.to(unlock_height);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const swap_user_info_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, swap_user_info_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* swap_user_info_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> swap_user_info_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.swap_user_info_t\";\n\ttype_code->type_hash = vnx::Hash64(0x1b6c720bff2d638cull);\n\ttype_code->code_hash = vnx::Hash64(0x996df91e34c838d2ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::swap_user_info_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<swap_user_info_t>>(); };\n\ttype_code->fields.resize(7);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"pool_idx\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {7};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"balance\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"last_user_total\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"last_fees_paid\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"fees_earned\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"equivalent_liquidity\";\n\t\tfield.code = {11, 2, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"unlock_height\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::swap_user_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.pool_idx, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.unlock_height, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.balance, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.last_user_total, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.last_fees_paid, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.fees_earned, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.equivalent_liquidity, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::swap_user_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_swap_user_info_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::swap_user_info_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.pool_idx);\n\tvnx::write_value(_buf + 4, value.unlock_height);\n\tvnx::write(out, value.balance, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.last_user_total, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.last_fees_paid, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.fees_earned, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.equivalent_liquidity, type_code, type_code->fields[5].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::swap_user_info_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::swap_user_info_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::swap_user_info_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::swap_user_info_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::swap_user_info_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/table_entry_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/table_entry_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 table_entry_t::VNX_TYPE_HASH(0x9bdbee40872de9a7ull);\nconst vnx::Hash64 table_entry_t::VNX_CODE_HASH(0x7dfd2e2748a04e22ull);\n\nvnx::Hash64 table_entry_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string table_entry_t::get_type_name() const {\n\treturn \"mmx.table_entry_t\";\n}\n\nconst vnx::TypeCode* table_entry_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_table_entry_t;\n}\n\nstd::shared_ptr<table_entry_t> table_entry_t::create() {\n\treturn std::make_shared<table_entry_t>();\n}\n\nstd::shared_ptr<table_entry_t> table_entry_t::clone() const {\n\treturn std::make_shared<table_entry_t>(*this);\n}\n\nvoid table_entry_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid table_entry_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid table_entry_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_table_entry_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, y);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, meta);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, x_values);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid table_entry_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"y\\\": \"; vnx::write(_out, y);\n\t_out << \", \\\"meta\\\": \"; vnx::write(_out, meta);\n\t_out << \", \\\"x_values\\\": \"; vnx::write(_out, x_values);\n\t_out << \"}\";\n}\n\nvoid table_entry_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object table_entry_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.table_entry_t\";\n\t_object[\"y\"] = y;\n\t_object[\"meta\"] = meta;\n\t_object[\"x_values\"] = x_values;\n\treturn _object;\n}\n\nvoid table_entry_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"meta\") {\n\t\t\t_entry.second.to(meta);\n\t\t} else if(_entry.first == \"x_values\") {\n\t\t\t_entry.second.to(x_values);\n\t\t} else if(_entry.first == \"y\") {\n\t\t\t_entry.second.to(y);\n\t\t}\n\t}\n}\n\nvnx::Variant table_entry_t::get_field(const std::string& _name) const {\n\tif(_name == \"y\") {\n\t\treturn vnx::Variant(y);\n\t}\n\tif(_name == \"meta\") {\n\t\treturn vnx::Variant(meta);\n\t}\n\tif(_name == \"x_values\") {\n\t\treturn vnx::Variant(x_values);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid table_entry_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"y\") {\n\t\t_value.to(y);\n\t} else if(_name == \"meta\") {\n\t\t_value.to(meta);\n\t} else if(_name == \"x_values\") {\n\t\t_value.to(x_values);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const table_entry_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, table_entry_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* table_entry_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> table_entry_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.table_entry_t\";\n\ttype_code->type_hash = vnx::Hash64(0x9bdbee40872de9a7ull);\n\ttype_code->code_hash = vnx::Hash64(0x7dfd2e2748a04e22ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::table_entry_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<table_entry_t>>(); };\n\ttype_code->fields.resize(3);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"y\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 48;\n\t\tfield.name = \"meta\";\n\t\tfield.code = {11, 48, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"x_values\";\n\t\tfield.code = {12, 3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::table_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.y, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.meta, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 2: vnx::read(in, value.x_values, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::table_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_table_entry_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::table_entry_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(52);\n\tvnx::write_value(_buf + 0, value.y);\n\tvnx::write_value(_buf + 4, value.meta);\n\tvnx::write(out, value.x_values, type_code, type_code->fields[2].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::table_entry_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::table_entry_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::table_entry_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::table_entry_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::table_entry_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/trade_entry_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/trade_entry_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/uint128.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 trade_entry_t::VNX_TYPE_HASH(0xed7d8e67cb8db394ull);\nconst vnx::Hash64 trade_entry_t::VNX_CODE_HASH(0x41a3f530c0620602ull);\n\nvnx::Hash64 trade_entry_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string trade_entry_t::get_type_name() const {\n\treturn \"mmx.trade_entry_t\";\n}\n\nconst vnx::TypeCode* trade_entry_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_trade_entry_t;\n}\n\nstd::shared_ptr<trade_entry_t> trade_entry_t::create() {\n\treturn std::make_shared<trade_entry_t>();\n}\n\nstd::shared_ptr<trade_entry_t> trade_entry_t::clone() const {\n\treturn std::make_shared<trade_entry_t>(*this);\n}\n\nvoid trade_entry_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid trade_entry_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid trade_entry_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_trade_entry_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, txid);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, bid_currency);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, ask_currency);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, bid_amount);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, ask_amount);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, price);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid trade_entry_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"txid\\\": \"; vnx::write(_out, txid);\n\t_out << \", \\\"bid_currency\\\": \"; vnx::write(_out, bid_currency);\n\t_out << \", \\\"ask_currency\\\": \"; vnx::write(_out, ask_currency);\n\t_out << \", \\\"bid_amount\\\": \"; vnx::write(_out, bid_amount);\n\t_out << \", \\\"ask_amount\\\": \"; vnx::write(_out, ask_amount);\n\t_out << \", \\\"price\\\": \"; vnx::write(_out, price);\n\t_out << \"}\";\n}\n\nvoid trade_entry_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object trade_entry_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.trade_entry_t\";\n\t_object[\"height\"] = height;\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"address\"] = address;\n\t_object[\"txid\"] = txid;\n\t_object[\"bid_currency\"] = bid_currency;\n\t_object[\"ask_currency\"] = ask_currency;\n\t_object[\"bid_amount\"] = bid_amount;\n\t_object[\"ask_amount\"] = ask_amount;\n\t_object[\"price\"] = price;\n\treturn _object;\n}\n\nvoid trade_entry_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"ask_amount\") {\n\t\t\t_entry.second.to(ask_amount);\n\t\t} else if(_entry.first == \"ask_currency\") {\n\t\t\t_entry.second.to(ask_currency);\n\t\t} else if(_entry.first == \"bid_amount\") {\n\t\t\t_entry.second.to(bid_amount);\n\t\t} else if(_entry.first == \"bid_currency\") {\n\t\t\t_entry.second.to(bid_currency);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"price\") {\n\t\t\t_entry.second.to(price);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t} else if(_entry.first == \"txid\") {\n\t\t\t_entry.second.to(txid);\n\t\t}\n\t}\n}\n\nvnx::Variant trade_entry_t::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"txid\") {\n\t\treturn vnx::Variant(txid);\n\t}\n\tif(_name == \"bid_currency\") {\n\t\treturn vnx::Variant(bid_currency);\n\t}\n\tif(_name == \"ask_currency\") {\n\t\treturn vnx::Variant(ask_currency);\n\t}\n\tif(_name == \"bid_amount\") {\n\t\treturn vnx::Variant(bid_amount);\n\t}\n\tif(_name == \"ask_amount\") {\n\t\treturn vnx::Variant(ask_amount);\n\t}\n\tif(_name == \"price\") {\n\t\treturn vnx::Variant(price);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid trade_entry_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"txid\") {\n\t\t_value.to(txid);\n\t} else if(_name == \"bid_currency\") {\n\t\t_value.to(bid_currency);\n\t} else if(_name == \"ask_currency\") {\n\t\t_value.to(ask_currency);\n\t} else if(_name == \"bid_amount\") {\n\t\t_value.to(bid_amount);\n\t} else if(_name == \"ask_amount\") {\n\t\t_value.to(ask_amount);\n\t} else if(_name == \"price\") {\n\t\t_value.to(price);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const trade_entry_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, trade_entry_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* trade_entry_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> trade_entry_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.trade_entry_t\";\n\ttype_code->type_hash = vnx::Hash64(0xed7d8e67cb8db394ull);\n\ttype_code->code_hash = vnx::Hash64(0x41a3f530c0620602ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::trade_entry_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<trade_entry_t>>(); };\n\ttype_code->fields.resize(9);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"txid\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"bid_currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"ask_currency\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"bid_amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"ask_amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"price\";\n\t\tfield.code = {10};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::trade_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_stamp, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.price, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 2: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.txid, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.bid_currency, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.ask_currency, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.bid_amount, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.ask_amount, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::trade_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_trade_entry_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::trade_entry_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(20);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write_value(_buf + 4, value.time_stamp);\n\tvnx::write_value(_buf + 12, value.price);\n\tvnx::write(out, value.address, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.txid, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.bid_currency, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.ask_currency, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.bid_amount, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.ask_amount, type_code, type_code->fields[7].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::trade_entry_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::trade_entry_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::trade_entry_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::trade_entry_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::trade_entry_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/trade_log_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/trade_log_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/uint128.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 trade_log_t::VNX_TYPE_HASH(0xafedf6853c645eb8ull);\nconst vnx::Hash64 trade_log_t::VNX_CODE_HASH(0xac626531793faaf2ull);\n\nvnx::Hash64 trade_log_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string trade_log_t::get_type_name() const {\n\treturn \"mmx.trade_log_t\";\n}\n\nconst vnx::TypeCode* trade_log_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_trade_log_t;\n}\n\nstd::shared_ptr<trade_log_t> trade_log_t::create() {\n\treturn std::make_shared<trade_log_t>();\n}\n\nstd::shared_ptr<trade_log_t> trade_log_t::clone() const {\n\treturn std::make_shared<trade_log_t>(*this);\n}\n\nvoid trade_log_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid trade_log_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid trade_log_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_trade_log_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, txid);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, inv_price);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, ask_amount);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid trade_log_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"txid\\\": \"; vnx::write(_out, txid);\n\t_out << \", \\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"inv_price\\\": \"; vnx::write(_out, inv_price);\n\t_out << \", \\\"ask_amount\\\": \"; vnx::write(_out, ask_amount);\n\t_out << \"}\";\n}\n\nvoid trade_log_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object trade_log_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.trade_log_t\";\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"txid\"] = txid;\n\t_object[\"address\"] = address;\n\t_object[\"inv_price\"] = inv_price;\n\t_object[\"ask_amount\"] = ask_amount;\n\treturn _object;\n}\n\nvoid trade_log_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"ask_amount\") {\n\t\t\t_entry.second.to(ask_amount);\n\t\t} else if(_entry.first == \"inv_price\") {\n\t\t\t_entry.second.to(inv_price);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t} else if(_entry.first == \"txid\") {\n\t\t\t_entry.second.to(txid);\n\t\t}\n\t}\n}\n\nvnx::Variant trade_log_t::get_field(const std::string& _name) const {\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"txid\") {\n\t\treturn vnx::Variant(txid);\n\t}\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"inv_price\") {\n\t\treturn vnx::Variant(inv_price);\n\t}\n\tif(_name == \"ask_amount\") {\n\t\treturn vnx::Variant(ask_amount);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid trade_log_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"txid\") {\n\t\t_value.to(txid);\n\t} else if(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"inv_price\") {\n\t\t_value.to(inv_price);\n\t} else if(_name == \"ask_amount\") {\n\t\t_value.to(ask_amount);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const trade_log_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, trade_log_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* trade_log_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> trade_log_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.trade_log_t\";\n\ttype_code->type_hash = vnx::Hash64(0xafedf6853c645eb8ull);\n\ttype_code->code_hash = vnx::Hash64(0xac626531793faaf2ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::trade_log_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<trade_log_t>>(); };\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"txid\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"inv_price\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"ask_amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::trade_log_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_stamp, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.txid, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.inv_price, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.ask_amount, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::trade_log_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_trade_log_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::trade_log_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.time_stamp);\n\tvnx::write(out, value.txid, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.address, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.inv_price, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.ask_amount, type_code, type_code->fields[4].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::trade_log_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::trade_log_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::trade_log_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::trade_log_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::trade_log_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/tx_entry_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/tx_entry_t.hxx>\n#include <mmx/txio_entry_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 tx_entry_t::VNX_TYPE_HASH(0x438cda5719015870ull);\nconst vnx::Hash64 tx_entry_t::VNX_CODE_HASH(0x349db5d68f110d24ull);\n\nvnx::Hash64 tx_entry_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string tx_entry_t::get_type_name() const {\n\treturn \"mmx.tx_entry_t\";\n}\n\nconst vnx::TypeCode* tx_entry_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_tx_entry_t;\n}\n\nstd::shared_ptr<tx_entry_t> tx_entry_t::create() {\n\treturn std::make_shared<tx_entry_t>();\n}\n\nstd::shared_ptr<tx_entry_t> tx_entry_t::clone() const {\n\treturn std::make_shared<tx_entry_t>(*this);\n}\n\nvoid tx_entry_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid tx_entry_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid tx_entry_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_tx_entry_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, memo);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, txid);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, type);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, is_validated);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, is_pending);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid tx_entry_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"memo\\\": \"; vnx::write(_out, memo);\n\t_out << \", \\\"txid\\\": \"; vnx::write(_out, txid);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"type\\\": \"; vnx::write(_out, type);\n\t_out << \", \\\"is_validated\\\": \"; vnx::write(_out, is_validated);\n\t_out << \", \\\"is_pending\\\": \"; vnx::write(_out, is_pending);\n\t_out << \"}\";\n}\n\nvoid tx_entry_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object tx_entry_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.tx_entry_t\";\n\t_object[\"address\"] = address;\n\t_object[\"contract\"] = contract;\n\t_object[\"amount\"] = amount;\n\t_object[\"memo\"] = memo;\n\t_object[\"txid\"] = txid;\n\t_object[\"height\"] = height;\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"type\"] = type;\n\t_object[\"is_validated\"] = is_validated;\n\t_object[\"is_pending\"] = is_pending;\n\treturn _object;\n}\n\nvoid tx_entry_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"is_pending\") {\n\t\t\t_entry.second.to(is_pending);\n\t\t} else if(_entry.first == \"is_validated\") {\n\t\t\t_entry.second.to(is_validated);\n\t\t} else if(_entry.first == \"memo\") {\n\t\t\t_entry.second.to(memo);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t} else if(_entry.first == \"txid\") {\n\t\t\t_entry.second.to(txid);\n\t\t} else if(_entry.first == \"type\") {\n\t\t\t_entry.second.to(type);\n\t\t}\n\t}\n}\n\nvnx::Variant tx_entry_t::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"memo\") {\n\t\treturn vnx::Variant(memo);\n\t}\n\tif(_name == \"txid\") {\n\t\treturn vnx::Variant(txid);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"type\") {\n\t\treturn vnx::Variant(type);\n\t}\n\tif(_name == \"is_validated\") {\n\t\treturn vnx::Variant(is_validated);\n\t}\n\tif(_name == \"is_pending\") {\n\t\treturn vnx::Variant(is_pending);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid tx_entry_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"memo\") {\n\t\t_value.to(memo);\n\t} else if(_name == \"txid\") {\n\t\t_value.to(txid);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"type\") {\n\t\t_value.to(type);\n\t} else if(_name == \"is_validated\") {\n\t\t_value.to(is_validated);\n\t} else if(_name == \"is_pending\") {\n\t\t_value.to(is_pending);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const tx_entry_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, tx_entry_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* tx_entry_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> tx_entry_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.tx_entry_t\";\n\ttype_code->type_hash = vnx::Hash64(0x438cda5719015870ull);\n\ttype_code->code_hash = vnx::Hash64(0x349db5d68f110d24ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::tx_entry_t);\n\ttype_code->parents.resize(2);\n\ttype_code->parents[0] = ::mmx::txio_entry_t::static_get_type_code();\n\ttype_code->parents[1] = ::mmx::txio_t::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<tx_entry_t>>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::tx_type_e::static_get_type_code();\n\ttype_code->fields.resize(10);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"memo\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"txid\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type\";\n\t\tfield.code = {19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_validated\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"is_pending\";\n\t\tfield.code = {31};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::tx_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_stamp, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_validated, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[9]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.is_pending, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.memo, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.txid, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.type, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::tx_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_tx_entry_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::tx_entry_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(14);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write_value(_buf + 4, value.time_stamp);\n\tvnx::write_value(_buf + 12, value.is_validated);\n\tvnx::write_value(_buf + 13, value.is_pending);\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.contract, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.memo, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.txid, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.type, type_code, type_code->fields[7].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::tx_entry_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::tx_entry_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::tx_entry_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::tx_entry_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::tx_entry_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/tx_index_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/tx_index_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 tx_index_t::VNX_TYPE_HASH(0xc326e232ee2ebb41ull);\nconst vnx::Hash64 tx_index_t::VNX_CODE_HASH(0xcc0b998144214be3ull);\n\nvnx::Hash64 tx_index_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string tx_index_t::get_type_name() const {\n\treturn \"mmx.tx_index_t\";\n}\n\nconst vnx::TypeCode* tx_index_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_tx_index_t;\n}\n\nstd::shared_ptr<tx_index_t> tx_index_t::create() {\n\treturn std::make_shared<tx_index_t>();\n}\n\nstd::shared_ptr<tx_index_t> tx_index_t::clone() const {\n\treturn std::make_shared<tx_index_t>(*this);\n}\n\nvoid tx_index_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid tx_index_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid tx_index_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_tx_index_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, static_cost);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, contract_read_cost);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, file_offset);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid tx_index_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"static_cost\\\": \"; vnx::write(_out, static_cost);\n\t_out << \", \\\"contract_read_cost\\\": \"; vnx::write(_out, contract_read_cost);\n\t_out << \", \\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"file_offset\\\": \"; vnx::write(_out, file_offset);\n\t_out << \"}\";\n}\n\nvoid tx_index_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object tx_index_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.tx_index_t\";\n\t_object[\"height\"] = height;\n\t_object[\"static_cost\"] = static_cost;\n\t_object[\"contract_read_cost\"] = contract_read_cost;\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"file_offset\"] = file_offset;\n\treturn _object;\n}\n\nvoid tx_index_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"contract_read_cost\") {\n\t\t\t_entry.second.to(contract_read_cost);\n\t\t} else if(_entry.first == \"file_offset\") {\n\t\t\t_entry.second.to(file_offset);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"static_cost\") {\n\t\t\t_entry.second.to(static_cost);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t}\n\t}\n}\n\nvnx::Variant tx_index_t::get_field(const std::string& _name) const {\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"static_cost\") {\n\t\treturn vnx::Variant(static_cost);\n\t}\n\tif(_name == \"contract_read_cost\") {\n\t\treturn vnx::Variant(contract_read_cost);\n\t}\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"file_offset\") {\n\t\treturn vnx::Variant(file_offset);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid tx_index_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"static_cost\") {\n\t\t_value.to(static_cost);\n\t} else if(_name == \"contract_read_cost\") {\n\t\t_value.to(contract_read_cost);\n\t} else if(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"file_offset\") {\n\t\t_value.to(file_offset);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const tx_index_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, tx_index_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* tx_index_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> tx_index_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.tx_index_t\";\n\ttype_code->type_hash = vnx::Hash64(0xc326e232ee2ebb41ull);\n\ttype_code->code_hash = vnx::Hash64(0xcc0b998144214be3ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::tx_index_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<tx_index_t>>(); };\n\ttype_code->fields.resize(5);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"static_cost\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"contract_read_cost\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"file_offset\";\n\t\tfield.code = {8};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::tx_index_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.static_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.contract_read_cost, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[3]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_stamp, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.file_offset, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::tx_index_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_tx_index_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::tx_index_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(28);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write_value(_buf + 4, value.static_cost);\n\tvnx::write_value(_buf + 8, value.contract_read_cost);\n\tvnx::write_value(_buf + 12, value.time_stamp);\n\tvnx::write_value(_buf + 20, value.file_offset);\n}\n\nvoid read(std::istream& in, ::mmx::tx_index_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::tx_index_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::tx_index_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::tx_index_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::tx_index_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/tx_info_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/tx_info_t.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/Operation.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/tx_note_e.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/txout_t.hxx>\n#include <mmx/uint128.hpp>\n#include <vnx/Value.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 tx_info_t::VNX_TYPE_HASH(0x44e4a710953f4785ull);\nconst vnx::Hash64 tx_info_t::VNX_CODE_HASH(0x455bd4d0fb65c9ccull);\n\nvnx::Hash64 tx_info_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string tx_info_t::get_type_name() const {\n\treturn \"mmx.tx_info_t\";\n}\n\nconst vnx::TypeCode* tx_info_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_tx_info_t;\n}\n\nstd::shared_ptr<tx_info_t> tx_info_t::create() {\n\treturn std::make_shared<tx_info_t>();\n}\n\nstd::shared_ptr<vnx::Value> tx_info_t::clone() const {\n\treturn std::make_shared<tx_info_t>(*this);\n}\n\nvoid tx_info_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid tx_info_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid tx_info_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_tx_info_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, id);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, expires);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, did_fail);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, block);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, message);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, fee);\n\t_visitor.type_field(_type_code->fields[8], 8); vnx::accept(_visitor, cost);\n\t_visitor.type_field(_type_code->fields[9], 9); vnx::accept(_visitor, note);\n\t_visitor.type_field(_type_code->fields[10], 10); vnx::accept(_visitor, sender);\n\t_visitor.type_field(_type_code->fields[11], 11); vnx::accept(_visitor, inputs);\n\t_visitor.type_field(_type_code->fields[12], 12); vnx::accept(_visitor, outputs);\n\t_visitor.type_field(_type_code->fields[13], 13); vnx::accept(_visitor, operations);\n\t_visitor.type_field(_type_code->fields[14], 14); vnx::accept(_visitor, deployed);\n\t_visitor.type_field(_type_code->fields[15], 15); vnx::accept(_visitor, input_amounts);\n\t_visitor.type_field(_type_code->fields[16], 16); vnx::accept(_visitor, output_amounts);\n\t_visitor.type_field(_type_code->fields[17], 17); vnx::accept(_visitor, contracts);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid tx_info_t::write(std::ostream& _out) const {\n\t_out << \"{\\\"__type\\\": \\\"mmx.tx_info_t\\\"\";\n\t_out << \", \\\"id\\\": \"; vnx::write(_out, id);\n\t_out << \", \\\"expires\\\": \"; vnx::write(_out, expires);\n\t_out << \", \\\"did_fail\\\": \"; vnx::write(_out, did_fail);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"block\\\": \"; vnx::write(_out, block);\n\t_out << \", \\\"message\\\": \"; vnx::write(_out, message);\n\t_out << \", \\\"fee\\\": \"; vnx::write(_out, fee);\n\t_out << \", \\\"cost\\\": \"; vnx::write(_out, cost);\n\t_out << \", \\\"note\\\": \"; vnx::write(_out, note);\n\t_out << \", \\\"sender\\\": \"; vnx::write(_out, sender);\n\t_out << \", \\\"inputs\\\": \"; vnx::write(_out, inputs);\n\t_out << \", \\\"outputs\\\": \"; vnx::write(_out, outputs);\n\t_out << \", \\\"operations\\\": \"; vnx::write(_out, operations);\n\t_out << \", \\\"deployed\\\": \"; vnx::write(_out, deployed);\n\t_out << \", \\\"input_amounts\\\": \"; vnx::write(_out, input_amounts);\n\t_out << \", \\\"output_amounts\\\": \"; vnx::write(_out, output_amounts);\n\t_out << \", \\\"contracts\\\": \"; vnx::write(_out, contracts);\n\t_out << \"}\";\n}\n\nvoid tx_info_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object tx_info_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.tx_info_t\";\n\t_object[\"id\"] = id;\n\t_object[\"expires\"] = expires;\n\t_object[\"did_fail\"] = did_fail;\n\t_object[\"height\"] = height;\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"block\"] = block;\n\t_object[\"message\"] = message;\n\t_object[\"fee\"] = fee;\n\t_object[\"cost\"] = cost;\n\t_object[\"note\"] = note;\n\t_object[\"sender\"] = sender;\n\t_object[\"inputs\"] = inputs;\n\t_object[\"outputs\"] = outputs;\n\t_object[\"operations\"] = operations;\n\t_object[\"deployed\"] = deployed;\n\t_object[\"input_amounts\"] = input_amounts;\n\t_object[\"output_amounts\"] = output_amounts;\n\t_object[\"contracts\"] = contracts;\n\treturn _object;\n}\n\nvoid tx_info_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"block\") {\n\t\t\t_entry.second.to(block);\n\t\t} else if(_entry.first == \"contracts\") {\n\t\t\t_entry.second.to(contracts);\n\t\t} else if(_entry.first == \"cost\") {\n\t\t\t_entry.second.to(cost);\n\t\t} else if(_entry.first == \"deployed\") {\n\t\t\t_entry.second.to(deployed);\n\t\t} else if(_entry.first == \"did_fail\") {\n\t\t\t_entry.second.to(did_fail);\n\t\t} else if(_entry.first == \"expires\") {\n\t\t\t_entry.second.to(expires);\n\t\t} else if(_entry.first == \"fee\") {\n\t\t\t_entry.second.to(fee);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"id\") {\n\t\t\t_entry.second.to(id);\n\t\t} else if(_entry.first == \"input_amounts\") {\n\t\t\t_entry.second.to(input_amounts);\n\t\t} else if(_entry.first == \"inputs\") {\n\t\t\t_entry.second.to(inputs);\n\t\t} else if(_entry.first == \"message\") {\n\t\t\t_entry.second.to(message);\n\t\t} else if(_entry.first == \"note\") {\n\t\t\t_entry.second.to(note);\n\t\t} else if(_entry.first == \"operations\") {\n\t\t\t_entry.second.to(operations);\n\t\t} else if(_entry.first == \"output_amounts\") {\n\t\t\t_entry.second.to(output_amounts);\n\t\t} else if(_entry.first == \"outputs\") {\n\t\t\t_entry.second.to(outputs);\n\t\t} else if(_entry.first == \"sender\") {\n\t\t\t_entry.second.to(sender);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t}\n\t}\n}\n\nvnx::Variant tx_info_t::get_field(const std::string& _name) const {\n\tif(_name == \"id\") {\n\t\treturn vnx::Variant(id);\n\t}\n\tif(_name == \"expires\") {\n\t\treturn vnx::Variant(expires);\n\t}\n\tif(_name == \"did_fail\") {\n\t\treturn vnx::Variant(did_fail);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"block\") {\n\t\treturn vnx::Variant(block);\n\t}\n\tif(_name == \"message\") {\n\t\treturn vnx::Variant(message);\n\t}\n\tif(_name == \"fee\") {\n\t\treturn vnx::Variant(fee);\n\t}\n\tif(_name == \"cost\") {\n\t\treturn vnx::Variant(cost);\n\t}\n\tif(_name == \"note\") {\n\t\treturn vnx::Variant(note);\n\t}\n\tif(_name == \"sender\") {\n\t\treturn vnx::Variant(sender);\n\t}\n\tif(_name == \"inputs\") {\n\t\treturn vnx::Variant(inputs);\n\t}\n\tif(_name == \"outputs\") {\n\t\treturn vnx::Variant(outputs);\n\t}\n\tif(_name == \"operations\") {\n\t\treturn vnx::Variant(operations);\n\t}\n\tif(_name == \"deployed\") {\n\t\treturn vnx::Variant(deployed);\n\t}\n\tif(_name == \"input_amounts\") {\n\t\treturn vnx::Variant(input_amounts);\n\t}\n\tif(_name == \"output_amounts\") {\n\t\treturn vnx::Variant(output_amounts);\n\t}\n\tif(_name == \"contracts\") {\n\t\treturn vnx::Variant(contracts);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid tx_info_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"id\") {\n\t\t_value.to(id);\n\t} else if(_name == \"expires\") {\n\t\t_value.to(expires);\n\t} else if(_name == \"did_fail\") {\n\t\t_value.to(did_fail);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"block\") {\n\t\t_value.to(block);\n\t} else if(_name == \"message\") {\n\t\t_value.to(message);\n\t} else if(_name == \"fee\") {\n\t\t_value.to(fee);\n\t} else if(_name == \"cost\") {\n\t\t_value.to(cost);\n\t} else if(_name == \"note\") {\n\t\t_value.to(note);\n\t} else if(_name == \"sender\") {\n\t\t_value.to(sender);\n\t} else if(_name == \"inputs\") {\n\t\t_value.to(inputs);\n\t} else if(_name == \"outputs\") {\n\t\t_value.to(outputs);\n\t} else if(_name == \"operations\") {\n\t\t_value.to(operations);\n\t} else if(_name == \"deployed\") {\n\t\t_value.to(deployed);\n\t} else if(_name == \"input_amounts\") {\n\t\t_value.to(input_amounts);\n\t} else if(_name == \"output_amounts\") {\n\t\t_value.to(output_amounts);\n\t} else if(_name == \"contracts\") {\n\t\t_value.to(contracts);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const tx_info_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, tx_info_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* tx_info_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> tx_info_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.tx_info_t\";\n\ttype_code->type_hash = vnx::Hash64(0x44e4a710953f4785ull);\n\ttype_code->code_hash = vnx::Hash64(0x455bd4d0fb65c9ccull);\n\ttype_code->is_native = true;\n\ttype_code->is_class = true;\n\ttype_code->native_size = sizeof(::mmx::tx_info_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<tx_info_t>(); };\n\ttype_code->depends.resize(3);\n\ttype_code->depends[0] = ::mmx::tx_note_e::static_get_type_code();\n\ttype_code->depends[1] = ::mmx::txin_t::static_get_type_code();\n\ttype_code->depends[2] = ::mmx::txout_t::static_get_type_code();\n\ttype_code->fields.resize(18);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"id\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"expires\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"did_fail\";\n\t\tfield.code = {31};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"height\";\n\t\tfield.code = {33, 3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {33, 8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"block\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"message\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"fee\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[8];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"cost\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[9];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"note\";\n\t\tfield.code = {19, 0};\n\t}\n\t{\n\t\tauto& field = type_code->fields[10];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"sender\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[11];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"inputs\";\n\t\tfield.code = {12, 19, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[12];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"outputs\";\n\t\tfield.code = {12, 19, 2};\n\t}\n\t{\n\t\tauto& field = type_code->fields[13];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"operations\";\n\t\tfield.code = {12, 16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[14];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"deployed\";\n\t\tfield.code = {16};\n\t}\n\t{\n\t\tauto& field = type_code->fields[15];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"input_amounts\";\n\t\tfield.code = {13, 5, 11, 32, 1, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[16];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"output_amounts\";\n\t\tfield.code = {13, 5, 11, 32, 1, 11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[17];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contracts\";\n\t\tfield.code = {13, 5, 11, 32, 1, 16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::Value> tx_info_t::vnx_call_switch(std::shared_ptr<const vnx::Value> _method) {\n\tswitch(_method->get_type_hash()) {\n\t}\n\treturn nullptr;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::tx_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.expires, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[2]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.did_fail, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[7]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.fee, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[8]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.cost, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.id, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.height, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.time_stamp, type_code, _field->code.data()); break;\n\t\t\tcase 5: vnx::read(in, value.block, type_code, _field->code.data()); break;\n\t\t\tcase 6: vnx::read(in, value.message, type_code, _field->code.data()); break;\n\t\t\tcase 9: vnx::read(in, value.note, type_code, _field->code.data()); break;\n\t\t\tcase 10: vnx::read(in, value.sender, type_code, _field->code.data()); break;\n\t\t\tcase 11: vnx::read(in, value.inputs, type_code, _field->code.data()); break;\n\t\t\tcase 12: vnx::read(in, value.outputs, type_code, _field->code.data()); break;\n\t\t\tcase 13: vnx::read(in, value.operations, type_code, _field->code.data()); break;\n\t\t\tcase 14: vnx::read(in, value.deployed, type_code, _field->code.data()); break;\n\t\t\tcase 15: vnx::read(in, value.input_amounts, type_code, _field->code.data()); break;\n\t\t\tcase 16: vnx::read(in, value.output_amounts, type_code, _field->code.data()); break;\n\t\t\tcase 17: vnx::read(in, value.contracts, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::tx_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_tx_info_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::tx_info_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(13);\n\tvnx::write_value(_buf + 0, value.expires);\n\tvnx::write_value(_buf + 4, value.did_fail);\n\tvnx::write_value(_buf + 5, value.fee);\n\tvnx::write_value(_buf + 9, value.cost);\n\tvnx::write(out, value.id, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.height, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.time_stamp, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.block, type_code, type_code->fields[5].code.data());\n\tvnx::write(out, value.message, type_code, type_code->fields[6].code.data());\n\tvnx::write(out, value.note, type_code, type_code->fields[9].code.data());\n\tvnx::write(out, value.sender, type_code, type_code->fields[10].code.data());\n\tvnx::write(out, value.inputs, type_code, type_code->fields[11].code.data());\n\tvnx::write(out, value.outputs, type_code, type_code->fields[12].code.data());\n\tvnx::write(out, value.operations, type_code, type_code->fields[13].code.data());\n\tvnx::write(out, value.deployed, type_code, type_code->fields[14].code.data());\n\tvnx::write(out, value.input_amounts, type_code, type_code->fields[15].code.data());\n\tvnx::write(out, value.output_amounts, type_code, type_code->fields[16].code.data());\n\tvnx::write(out, value.contracts, type_code, type_code->fields[17].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::tx_info_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::tx_info_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::tx_info_t& value) {\n\tvalue.accept(visitor);\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/tx_log_entry_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/tx_log_entry_t.hxx>\n#include <mmx/Transaction.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 tx_log_entry_t::VNX_TYPE_HASH(0xc29d95c24aff8b43ull);\nconst vnx::Hash64 tx_log_entry_t::VNX_CODE_HASH(0x137c7ee80c73c070ull);\n\nvnx::Hash64 tx_log_entry_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string tx_log_entry_t::get_type_name() const {\n\treturn \"mmx.tx_log_entry_t\";\n}\n\nconst vnx::TypeCode* tx_log_entry_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_tx_log_entry_t;\n}\n\nstd::shared_ptr<tx_log_entry_t> tx_log_entry_t::create() {\n\treturn std::make_shared<tx_log_entry_t>();\n}\n\nstd::shared_ptr<tx_log_entry_t> tx_log_entry_t::clone() const {\n\treturn std::make_shared<tx_log_entry_t>(*this);\n}\n\nvoid tx_log_entry_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid tx_log_entry_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid tx_log_entry_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_tx_log_entry_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, time);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, tx);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid tx_log_entry_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"time\\\": \"; vnx::write(_out, time);\n\t_out << \", \\\"tx\\\": \"; vnx::write(_out, tx);\n\t_out << \"}\";\n}\n\nvoid tx_log_entry_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object tx_log_entry_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.tx_log_entry_t\";\n\t_object[\"time\"] = time;\n\t_object[\"tx\"] = tx;\n\treturn _object;\n}\n\nvoid tx_log_entry_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"time\") {\n\t\t\t_entry.second.to(time);\n\t\t} else if(_entry.first == \"tx\") {\n\t\t\t_entry.second.to(tx);\n\t\t}\n\t}\n}\n\nvnx::Variant tx_log_entry_t::get_field(const std::string& _name) const {\n\tif(_name == \"time\") {\n\t\treturn vnx::Variant(time);\n\t}\n\tif(_name == \"tx\") {\n\t\treturn vnx::Variant(tx);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid tx_log_entry_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"time\") {\n\t\t_value.to(time);\n\t} else if(_name == \"tx\") {\n\t\t_value.to(tx);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const tx_log_entry_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, tx_log_entry_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* tx_log_entry_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> tx_log_entry_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.tx_log_entry_t\";\n\ttype_code->type_hash = vnx::Hash64(0xc29d95c24aff8b43ull);\n\ttype_code->code_hash = vnx::Hash64(0x137c7ee80c73c070ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::tx_log_entry_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<tx_log_entry_t>>(); };\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"tx\";\n\t\tfield.code = {16};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::tx_log_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 1: vnx::read(in, value.tx, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::tx_log_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_tx_log_entry_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::tx_log_entry_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.time);\n\tvnx::write(out, value.tx, type_code, type_code->fields[1].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::tx_log_entry_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::tx_log_entry_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::tx_log_entry_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::tx_log_entry_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::tx_log_entry_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/tx_note_e.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/tx_note_e.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 tx_note_e::VNX_TYPE_HASH(0x347c1deca0a9c9cull);\nconst vnx::Hash64 tx_note_e::VNX_CODE_HASH(0x77210f7cf5390671ull);\n\nvnx::Hash64 tx_note_e::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string tx_note_e::get_type_name() const {\n\treturn \"mmx.tx_note_e\";\n}\n\nconst vnx::TypeCode* tx_note_e::get_type_code() const {\n\treturn mmx::vnx_native_type_code_tx_note_e;\n}\n\nstd::shared_ptr<tx_note_e> tx_note_e::create() {\n\treturn std::make_shared<tx_note_e>();\n}\n\nstd::shared_ptr<tx_note_e> tx_note_e::clone() const {\n\treturn std::make_shared<tx_note_e>(*this);\n}\n\nvoid tx_note_e::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid tx_note_e::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvnx::bool_t tx_note_e::is_valid() const {\n\tswitch(value) {\n\t\tcase BURN: return true;\n\t\tcase CLAIM: return true;\n\t\tcase DEPLOY: return true;\n\t\tcase DEPOSIT: return true;\n\t\tcase EXECUTE: return true;\n\t\tcase MINT: return true;\n\t\tcase MUTATE: return true;\n\t\tcase OFFER: return true;\n\t\tcase REVOKE: return true;\n\t\tcase REWARD: return true;\n\t\tcase TIMELORD_REWARD: return true;\n\t\tcase TRADE: return true;\n\t\tcase TRANSFER: return true;\n\t\tcase WITHDRAW: return true;\n\t}\n\treturn false;\n}\n\nstd::string tx_note_e::to_string() const {\n\tswitch(value) {\n\t\tcase BURN: return \"\\\"BURN\\\"\";\n\t\tcase CLAIM: return \"\\\"CLAIM\\\"\";\n\t\tcase DEPLOY: return \"\\\"DEPLOY\\\"\";\n\t\tcase DEPOSIT: return \"\\\"DEPOSIT\\\"\";\n\t\tcase EXECUTE: return \"\\\"EXECUTE\\\"\";\n\t\tcase MINT: return \"\\\"MINT\\\"\";\n\t\tcase MUTATE: return \"\\\"MUTATE\\\"\";\n\t\tcase OFFER: return \"\\\"OFFER\\\"\";\n\t\tcase REVOKE: return \"\\\"REVOKE\\\"\";\n\t\tcase REWARD: return \"\\\"REWARD\\\"\";\n\t\tcase TIMELORD_REWARD: return \"\\\"TIMELORD_REWARD\\\"\";\n\t\tcase TRADE: return \"\\\"TRADE\\\"\";\n\t\tcase TRANSFER: return \"\\\"TRANSFER\\\"\";\n\t\tcase WITHDRAW: return \"\\\"WITHDRAW\\\"\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string tx_note_e::to_string_value() const {\n\tswitch(value) {\n\t\tcase BURN: return \"BURN\";\n\t\tcase CLAIM: return \"CLAIM\";\n\t\tcase DEPLOY: return \"DEPLOY\";\n\t\tcase DEPOSIT: return \"DEPOSIT\";\n\t\tcase EXECUTE: return \"EXECUTE\";\n\t\tcase MINT: return \"MINT\";\n\t\tcase MUTATE: return \"MUTATE\";\n\t\tcase OFFER: return \"OFFER\";\n\t\tcase REVOKE: return \"REVOKE\";\n\t\tcase REWARD: return \"REWARD\";\n\t\tcase TIMELORD_REWARD: return \"TIMELORD_REWARD\";\n\t\tcase TRADE: return \"TRADE\";\n\t\tcase TRANSFER: return \"TRANSFER\";\n\t\tcase WITHDRAW: return \"WITHDRAW\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string tx_note_e::to_string_value_full() const {\n\tswitch(value) {\n\t\tcase BURN: return \"mmx.tx_note_e.BURN\";\n\t\tcase CLAIM: return \"mmx.tx_note_e.CLAIM\";\n\t\tcase DEPLOY: return \"mmx.tx_note_e.DEPLOY\";\n\t\tcase DEPOSIT: return \"mmx.tx_note_e.DEPOSIT\";\n\t\tcase EXECUTE: return \"mmx.tx_note_e.EXECUTE\";\n\t\tcase MINT: return \"mmx.tx_note_e.MINT\";\n\t\tcase MUTATE: return \"mmx.tx_note_e.MUTATE\";\n\t\tcase OFFER: return \"mmx.tx_note_e.OFFER\";\n\t\tcase REVOKE: return \"mmx.tx_note_e.REVOKE\";\n\t\tcase REWARD: return \"mmx.tx_note_e.REWARD\";\n\t\tcase TIMELORD_REWARD: return \"mmx.tx_note_e.TIMELORD_REWARD\";\n\t\tcase TRADE: return \"mmx.tx_note_e.TRADE\";\n\t\tcase TRANSFER: return \"mmx.tx_note_e.TRANSFER\";\n\t\tcase WITHDRAW: return \"mmx.tx_note_e.WITHDRAW\";\n\t}\n\treturn std::to_string(value);\n}\n\nvoid tx_note_e::from_string(const std::string& _str) {\n\tstd::string _name;\n\tvnx::from_string(_str, _name);\n\tfrom_string_value(_name);\n}\n\nvoid tx_note_e::from_string_value(const std::string& _name) {\n\tvnx::Variant var;\n\tvnx::from_string_value(_name, var);\n\tif(var.is_string()) {\n\t\tif(_name == \"BURN\") value = BURN;\n\t\telse if(_name == \"CLAIM\") value = CLAIM;\n\t\telse if(_name == \"DEPLOY\") value = DEPLOY;\n\t\telse if(_name == \"DEPOSIT\") value = DEPOSIT;\n\t\telse if(_name == \"EXECUTE\") value = EXECUTE;\n\t\telse if(_name == \"MINT\") value = MINT;\n\t\telse if(_name == \"MUTATE\") value = MUTATE;\n\t\telse if(_name == \"OFFER\") value = OFFER;\n\t\telse if(_name == \"REVOKE\") value = REVOKE;\n\t\telse if(_name == \"REWARD\") value = REWARD;\n\t\telse if(_name == \"TIMELORD_REWARD\") value = TIMELORD_REWARD;\n\t\telse if(_name == \"TRADE\") value = TRADE;\n\t\telse if(_name == \"TRANSFER\") value = TRANSFER;\n\t\telse if(_name == \"WITHDRAW\") value = WITHDRAW;\n\t\telse value = enum_t(vnx::hash64(_name));\n\t} else {\n\t\tvalue = enum_t(std::stoul(_name.c_str(), nullptr, 0));\n\t}\n}\n\nvoid tx_note_e::accept(vnx::Visitor& _visitor) const {\n\tstd::string _name;\n\tswitch(value) {\n\t\tcase BURN: _name = \"BURN\"; break;\n\t\tcase CLAIM: _name = \"CLAIM\"; break;\n\t\tcase DEPLOY: _name = \"DEPLOY\"; break;\n\t\tcase DEPOSIT: _name = \"DEPOSIT\"; break;\n\t\tcase EXECUTE: _name = \"EXECUTE\"; break;\n\t\tcase MINT: _name = \"MINT\"; break;\n\t\tcase MUTATE: _name = \"MUTATE\"; break;\n\t\tcase OFFER: _name = \"OFFER\"; break;\n\t\tcase REVOKE: _name = \"REVOKE\"; break;\n\t\tcase REWARD: _name = \"REWARD\"; break;\n\t\tcase TIMELORD_REWARD: _name = \"TIMELORD_REWARD\"; break;\n\t\tcase TRADE: _name = \"TRADE\"; break;\n\t\tcase TRANSFER: _name = \"TRANSFER\"; break;\n\t\tcase WITHDRAW: _name = \"WITHDRAW\"; break;\n\t}\n\t_visitor.enum_value(value, _name);\n}\n\nvoid tx_note_e::write(std::ostream& _out) const {\n\tswitch(value) {\n\t\tcase BURN: _out << \"\\\"BURN\\\"\"; break;\n\t\tcase CLAIM: _out << \"\\\"CLAIM\\\"\"; break;\n\t\tcase DEPLOY: _out << \"\\\"DEPLOY\\\"\"; break;\n\t\tcase DEPOSIT: _out << \"\\\"DEPOSIT\\\"\"; break;\n\t\tcase EXECUTE: _out << \"\\\"EXECUTE\\\"\"; break;\n\t\tcase MINT: _out << \"\\\"MINT\\\"\"; break;\n\t\tcase MUTATE: _out << \"\\\"MUTATE\\\"\"; break;\n\t\tcase OFFER: _out << \"\\\"OFFER\\\"\"; break;\n\t\tcase REVOKE: _out << \"\\\"REVOKE\\\"\"; break;\n\t\tcase REWARD: _out << \"\\\"REWARD\\\"\"; break;\n\t\tcase TIMELORD_REWARD: _out << \"\\\"TIMELORD_REWARD\\\"\"; break;\n\t\tcase TRADE: _out << \"\\\"TRADE\\\"\"; break;\n\t\tcase TRANSFER: _out << \"\\\"TRANSFER\\\"\"; break;\n\t\tcase WITHDRAW: _out << \"\\\"WITHDRAW\\\"\"; break;\n\t\tdefault: _out << value;\n\t}\n}\n\nvoid tx_note_e::read(std::istream& _in) {\n\tfrom_string_value(vnx::read(_in).to_string_value());\n}\n\nvnx::Object tx_note_e::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.tx_note_e\";\n\t_object[\"value\"] = value;\n\treturn _object;\n}\n\nvoid tx_note_e::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"value\") {\n\t\t\t_entry.second.to(value);\n\t\t}\n\t}\n}\n\nvnx::Variant tx_note_e::get_field(const std::string& _name) const {\n\tif(_name == \"value\") {\n\t\treturn vnx::Variant(value);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid tx_note_e::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"value\") {\n\t\t_value.to(value);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const tx_note_e& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, tx_note_e& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* tx_note_e::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> tx_note_e::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.tx_note_e\";\n\ttype_code->type_hash = vnx::Hash64(0x347c1deca0a9c9cull);\n\ttype_code->code_hash = vnx::Hash64(0x77210f7cf5390671ull);\n\ttype_code->is_native = true;\n\ttype_code->is_enum = true;\n\ttype_code->native_size = sizeof(::mmx::tx_note_e);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<tx_note_e>>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"value\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->enum_map[1273454750] = \"BURN\";\n\ttype_code->enum_map[3251493825] = \"CLAIM\";\n\ttype_code->enum_map[251696509] = \"DEPLOY\";\n\ttype_code->enum_map[4272391094] = \"DEPOSIT\";\n\ttype_code->enum_map[356250251] = \"EXECUTE\";\n\ttype_code->enum_map[2140500429] = \"MINT\";\n\ttype_code->enum_map[2579166487] = \"MUTATE\";\n\ttype_code->enum_map[1549148948] = \"OFFER\";\n\ttype_code->enum_map[3821531424] = \"REVOKE\";\n\ttype_code->enum_map[3842121424] = \"REWARD\";\n\ttype_code->enum_map[1783340485] = \"TIMELORD_REWARD\";\n\ttype_code->enum_map[329618288] = \"TRADE\";\n\ttype_code->enum_map[858544509] = \"TRANSFER\";\n\ttype_code->enum_map[4266232802] = \"WITHDRAW\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::tx_note_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tVariant tmp;\n\t\tvnx::read(in, tmp, type_code, code);\n\t\tif(tmp.is_string()) {\n\t\t\tvnx::from_string(tmp.to_string(), value);\n\t\t} else if(tmp.is_ulong()) {\n\t\t\tvalue = ::mmx::tx_note_e::enum_t(tmp.to<uint32_t>());\n\t\t} else {\n\t\t\tvalue = ::mmx::tx_note_e();\n\t\t}\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.value, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::tx_note_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_STRING) {\n\t\tvnx::write(out, value.to_string_value(), nullptr, code);\n\t\treturn;\n\t}\n\tif(code && code[0] == CODE_UINT32) {\n\t\tvnx::write(out, value.value, nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_tx_note_e;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::tx_note_e>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.value);\n}\n\nvoid read(std::istream& in, ::mmx::tx_note_e& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::tx_note_e& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::tx_note_e& value) {\n\tvalue.accept(visitor);\n}\n\nvoid read(TypeInput& in, ::mmx::tx_note_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tuint32_t tmp = 0;\n\tvnx::read(in, tmp, type_code, code);\n\tvalue = ::mmx::tx_note_e::enum_t(tmp);\n}\n\nvoid write(TypeOutput& out, const ::mmx::tx_note_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tvnx::write(out, uint32_t(value), type_code, code);\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::tx_note_e& _value) {\n\treturn _value.to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::tx_note_e& _value) {\n\treturn _value.to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::tx_note_e& _value) {\n\treturn _value.to_string_value_full();\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::tx_note_e::enum_t& _value) {\n\treturn ::mmx::tx_note_e(_value).to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::tx_note_e::enum_t& _value) {\n\treturn ::mmx::tx_note_e(_value).to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::tx_note_e::enum_t& _value) {\n\treturn ::mmx::tx_note_e(_value).to_string_value_full();\n}\n\nbool is_equivalent<::mmx::tx_note_e>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::tx_note_e::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/tx_type_e.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/tx_type_e.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 tx_type_e::VNX_TYPE_HASH(0x3b7f577c2cfd4c91ull);\nconst vnx::Hash64 tx_type_e::VNX_CODE_HASH(0x3fb4b4c341be138dull);\n\nvnx::Hash64 tx_type_e::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string tx_type_e::get_type_name() const {\n\treturn \"mmx.tx_type_e\";\n}\n\nconst vnx::TypeCode* tx_type_e::get_type_code() const {\n\treturn mmx::vnx_native_type_code_tx_type_e;\n}\n\nstd::shared_ptr<tx_type_e> tx_type_e::create() {\n\treturn std::make_shared<tx_type_e>();\n}\n\nstd::shared_ptr<tx_type_e> tx_type_e::clone() const {\n\treturn std::make_shared<tx_type_e>(*this);\n}\n\nvoid tx_type_e::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid tx_type_e::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvnx::bool_t tx_type_e::is_valid() const {\n\tswitch(value) {\n\t\tcase PROJECT_REWARD: return true;\n\t\tcase RECEIVE: return true;\n\t\tcase REWARD: return true;\n\t\tcase SPEND: return true;\n\t\tcase TXFEE: return true;\n\t\tcase VDF_REWARD: return true;\n\t}\n\treturn false;\n}\n\nstd::string tx_type_e::to_string() const {\n\tswitch(value) {\n\t\tcase PROJECT_REWARD: return \"\\\"PROJECT_REWARD\\\"\";\n\t\tcase RECEIVE: return \"\\\"RECEIVE\\\"\";\n\t\tcase REWARD: return \"\\\"REWARD\\\"\";\n\t\tcase SPEND: return \"\\\"SPEND\\\"\";\n\t\tcase TXFEE: return \"\\\"TXFEE\\\"\";\n\t\tcase VDF_REWARD: return \"\\\"VDF_REWARD\\\"\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string tx_type_e::to_string_value() const {\n\tswitch(value) {\n\t\tcase PROJECT_REWARD: return \"PROJECT_REWARD\";\n\t\tcase RECEIVE: return \"RECEIVE\";\n\t\tcase REWARD: return \"REWARD\";\n\t\tcase SPEND: return \"SPEND\";\n\t\tcase TXFEE: return \"TXFEE\";\n\t\tcase VDF_REWARD: return \"VDF_REWARD\";\n\t}\n\treturn std::to_string(value);\n}\n\nstd::string tx_type_e::to_string_value_full() const {\n\tswitch(value) {\n\t\tcase PROJECT_REWARD: return \"mmx.tx_type_e.PROJECT_REWARD\";\n\t\tcase RECEIVE: return \"mmx.tx_type_e.RECEIVE\";\n\t\tcase REWARD: return \"mmx.tx_type_e.REWARD\";\n\t\tcase SPEND: return \"mmx.tx_type_e.SPEND\";\n\t\tcase TXFEE: return \"mmx.tx_type_e.TXFEE\";\n\t\tcase VDF_REWARD: return \"mmx.tx_type_e.VDF_REWARD\";\n\t}\n\treturn std::to_string(value);\n}\n\nvoid tx_type_e::from_string(const std::string& _str) {\n\tstd::string _name;\n\tvnx::from_string(_str, _name);\n\tfrom_string_value(_name);\n}\n\nvoid tx_type_e::from_string_value(const std::string& _name) {\n\tvnx::Variant var;\n\tvnx::from_string_value(_name, var);\n\tif(var.is_string()) {\n\t\tif(_name == \"PROJECT_REWARD\") value = PROJECT_REWARD;\n\t\telse if(_name == \"RECEIVE\") value = RECEIVE;\n\t\telse if(_name == \"REWARD\") value = REWARD;\n\t\telse if(_name == \"SPEND\") value = SPEND;\n\t\telse if(_name == \"TXFEE\") value = TXFEE;\n\t\telse if(_name == \"VDF_REWARD\") value = VDF_REWARD;\n\t\telse value = enum_t(vnx::hash64(_name));\n\t} else {\n\t\tvalue = enum_t(std::stoul(_name.c_str(), nullptr, 0));\n\t}\n}\n\nvoid tx_type_e::accept(vnx::Visitor& _visitor) const {\n\tstd::string _name;\n\tswitch(value) {\n\t\tcase PROJECT_REWARD: _name = \"PROJECT_REWARD\"; break;\n\t\tcase RECEIVE: _name = \"RECEIVE\"; break;\n\t\tcase REWARD: _name = \"REWARD\"; break;\n\t\tcase SPEND: _name = \"SPEND\"; break;\n\t\tcase TXFEE: _name = \"TXFEE\"; break;\n\t\tcase VDF_REWARD: _name = \"VDF_REWARD\"; break;\n\t}\n\t_visitor.enum_value(value, _name);\n}\n\nvoid tx_type_e::write(std::ostream& _out) const {\n\tswitch(value) {\n\t\tcase PROJECT_REWARD: _out << \"\\\"PROJECT_REWARD\\\"\"; break;\n\t\tcase RECEIVE: _out << \"\\\"RECEIVE\\\"\"; break;\n\t\tcase REWARD: _out << \"\\\"REWARD\\\"\"; break;\n\t\tcase SPEND: _out << \"\\\"SPEND\\\"\"; break;\n\t\tcase TXFEE: _out << \"\\\"TXFEE\\\"\"; break;\n\t\tcase VDF_REWARD: _out << \"\\\"VDF_REWARD\\\"\"; break;\n\t\tdefault: _out << value;\n\t}\n}\n\nvoid tx_type_e::read(std::istream& _in) {\n\tfrom_string_value(vnx::read(_in).to_string_value());\n}\n\nvnx::Object tx_type_e::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.tx_type_e\";\n\t_object[\"value\"] = value;\n\treturn _object;\n}\n\nvoid tx_type_e::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"value\") {\n\t\t\t_entry.second.to(value);\n\t\t}\n\t}\n}\n\nvnx::Variant tx_type_e::get_field(const std::string& _name) const {\n\tif(_name == \"value\") {\n\t\treturn vnx::Variant(value);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid tx_type_e::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"value\") {\n\t\t_value.to(value);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const tx_type_e& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, tx_type_e& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* tx_type_e::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> tx_type_e::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.tx_type_e\";\n\ttype_code->type_hash = vnx::Hash64(0x3b7f577c2cfd4c91ull);\n\ttype_code->code_hash = vnx::Hash64(0x3fb4b4c341be138dull);\n\ttype_code->is_native = true;\n\ttype_code->is_enum = true;\n\ttype_code->native_size = sizeof(::mmx::tx_type_e);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<tx_type_e>>(); };\n\ttype_code->fields.resize(1);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"value\";\n\t\tfield.code = {3};\n\t}\n\ttype_code->enum_map[795347438] = \"PROJECT_REWARD\";\n\ttype_code->enum_map[940023181] = \"RECEIVE\";\n\ttype_code->enum_map[3842121424] = \"REWARD\";\n\ttype_code->enum_map[2341768809] = \"SPEND\";\n\ttype_code->enum_map[3965595220] = \"TXFEE\";\n\ttype_code->enum_map[1923446990] = \"VDF_REWARD\";\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::tx_type_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tVariant tmp;\n\t\tvnx::read(in, tmp, type_code, code);\n\t\tif(tmp.is_string()) {\n\t\t\tvnx::from_string(tmp.to_string(), value);\n\t\t} else if(tmp.is_ulong()) {\n\t\t\tvalue = ::mmx::tx_type_e::enum_t(tmp.to<uint32_t>());\n\t\t} else {\n\t\t\tvalue = ::mmx::tx_type_e();\n\t\t}\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.value, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::tx_type_e& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_STRING) {\n\t\tvnx::write(out, value.to_string_value(), nullptr, code);\n\t\treturn;\n\t}\n\tif(code && code[0] == CODE_UINT32) {\n\t\tvnx::write(out, value.value, nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_tx_type_e;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::tx_type_e>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(4);\n\tvnx::write_value(_buf + 0, value.value);\n}\n\nvoid read(std::istream& in, ::mmx::tx_type_e& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::tx_type_e& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::tx_type_e& value) {\n\tvalue.accept(visitor);\n}\n\nvoid read(TypeInput& in, ::mmx::tx_type_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tuint32_t tmp = 0;\n\tvnx::read(in, tmp, type_code, code);\n\tvalue = ::mmx::tx_type_e::enum_t(tmp);\n}\n\nvoid write(TypeOutput& out, const ::mmx::tx_type_e::enum_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tvnx::write(out, uint32_t(value), type_code, code);\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::tx_type_e& _value) {\n\treturn _value.to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::tx_type_e& _value) {\n\treturn _value.to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::tx_type_e& _value) {\n\treturn _value.to_string_value_full();\n}\n\ntemplate<>\nstd::string to_string(const ::mmx::tx_type_e::enum_t& _value) {\n\treturn ::mmx::tx_type_e(_value).to_string();\n}\n\ntemplate<>\nstd::string to_string_value(const ::mmx::tx_type_e::enum_t& _value) {\n\treturn ::mmx::tx_type_e(_value).to_string_value();\n}\n\ntemplate<>\nstd::string to_string_value_full(const ::mmx::tx_type_e::enum_t& _value) {\n\treturn ::mmx::tx_type_e(_value).to_string_value_full();\n}\n\nbool is_equivalent<::mmx::tx_type_e>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::tx_type_e::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/txin_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/txin_t.hxx>\n#include <mmx/txio_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nconst uint8_t txin_t::IS_EXEC;\nconst uint16_t txin_t::NO_SOLUTION;\n\nconst vnx::Hash64 txin_t::VNX_TYPE_HASH(0xda6587114a2413full);\nconst vnx::Hash64 txin_t::VNX_CODE_HASH(0xf995f5e67a956c4eull);\n\nvnx::Hash64 txin_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string txin_t::get_type_name() const {\n\treturn \"mmx.txin_t\";\n}\n\nconst vnx::TypeCode* txin_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_txin_t;\n}\n\nstd::shared_ptr<txin_t> txin_t::create() {\n\treturn std::make_shared<txin_t>();\n}\n\nstd::shared_ptr<txin_t> txin_t::clone() const {\n\treturn std::make_shared<txin_t>(*this);\n}\n\nvoid txin_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid txin_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid txin_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_txin_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, memo);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, solution);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, flags);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid txin_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"memo\\\": \"; vnx::write(_out, memo);\n\t_out << \", \\\"solution\\\": \"; vnx::write(_out, solution);\n\t_out << \", \\\"flags\\\": \"; vnx::write(_out, flags);\n\t_out << \"}\";\n}\n\nvoid txin_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object txin_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.txin_t\";\n\t_object[\"address\"] = address;\n\t_object[\"contract\"] = contract;\n\t_object[\"amount\"] = amount;\n\t_object[\"memo\"] = memo;\n\t_object[\"solution\"] = solution;\n\t_object[\"flags\"] = flags;\n\treturn _object;\n}\n\nvoid txin_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"flags\") {\n\t\t\t_entry.second.to(flags);\n\t\t} else if(_entry.first == \"memo\") {\n\t\t\t_entry.second.to(memo);\n\t\t} else if(_entry.first == \"solution\") {\n\t\t\t_entry.second.to(solution);\n\t\t}\n\t}\n}\n\nvnx::Variant txin_t::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"memo\") {\n\t\treturn vnx::Variant(memo);\n\t}\n\tif(_name == \"solution\") {\n\t\treturn vnx::Variant(solution);\n\t}\n\tif(_name == \"flags\") {\n\t\treturn vnx::Variant(flags);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid txin_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"memo\") {\n\t\t_value.to(memo);\n\t} else if(_name == \"solution\") {\n\t\t_value.to(solution);\n\t} else if(_name == \"flags\") {\n\t\t_value.to(flags);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const txin_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, txin_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* txin_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> txin_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.txin_t\";\n\ttype_code->type_hash = vnx::Hash64(0xda6587114a2413full);\n\ttype_code->code_hash = vnx::Hash64(0xf995f5e67a956c4eull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::txin_t);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::txio_t::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<txin_t>>(); };\n\ttype_code->fields.resize(6);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"memo\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 2;\n\t\tfield.name = \"solution\";\n\t\tfield.value = vnx::to_string(-1);\n\t\tfield.code = {2};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 1;\n\t\tfield.name = \"flags\";\n\t\tfield.code = {1};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::txin_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.solution, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.flags, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.memo, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::txin_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_txin_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::txin_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(3);\n\tvnx::write_value(_buf + 0, value.solution);\n\tvnx::write_value(_buf + 2, value.flags);\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.contract, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.memo, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::txin_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::txin_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::txin_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::txin_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::txin_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/txio_entry_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/txio_entry_t.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/tx_type_e.hxx>\n#include <mmx/txio_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 txio_entry_t::VNX_TYPE_HASH(0x2d1c65e166ab244bull);\nconst vnx::Hash64 txio_entry_t::VNX_CODE_HASH(0x2daf93e2887e8013ull);\n\nvnx::Hash64 txio_entry_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string txio_entry_t::get_type_name() const {\n\treturn \"mmx.txio_entry_t\";\n}\n\nconst vnx::TypeCode* txio_entry_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_txio_entry_t;\n}\n\nstd::shared_ptr<txio_entry_t> txio_entry_t::create() {\n\treturn std::make_shared<txio_entry_t>();\n}\n\nstd::shared_ptr<txio_entry_t> txio_entry_t::clone() const {\n\treturn std::make_shared<txio_entry_t>(*this);\n}\n\nvoid txio_entry_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid txio_entry_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid txio_entry_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_txio_entry_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, memo);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, txid);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, height);\n\t_visitor.type_field(_type_code->fields[6], 6); vnx::accept(_visitor, time_stamp);\n\t_visitor.type_field(_type_code->fields[7], 7); vnx::accept(_visitor, type);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid txio_entry_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"memo\\\": \"; vnx::write(_out, memo);\n\t_out << \", \\\"txid\\\": \"; vnx::write(_out, txid);\n\t_out << \", \\\"height\\\": \"; vnx::write(_out, height);\n\t_out << \", \\\"time_stamp\\\": \"; vnx::write(_out, time_stamp);\n\t_out << \", \\\"type\\\": \"; vnx::write(_out, type);\n\t_out << \"}\";\n}\n\nvoid txio_entry_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object txio_entry_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.txio_entry_t\";\n\t_object[\"address\"] = address;\n\t_object[\"contract\"] = contract;\n\t_object[\"amount\"] = amount;\n\t_object[\"memo\"] = memo;\n\t_object[\"txid\"] = txid;\n\t_object[\"height\"] = height;\n\t_object[\"time_stamp\"] = time_stamp;\n\t_object[\"type\"] = type;\n\treturn _object;\n}\n\nvoid txio_entry_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"height\") {\n\t\t\t_entry.second.to(height);\n\t\t} else if(_entry.first == \"memo\") {\n\t\t\t_entry.second.to(memo);\n\t\t} else if(_entry.first == \"time_stamp\") {\n\t\t\t_entry.second.to(time_stamp);\n\t\t} else if(_entry.first == \"txid\") {\n\t\t\t_entry.second.to(txid);\n\t\t} else if(_entry.first == \"type\") {\n\t\t\t_entry.second.to(type);\n\t\t}\n\t}\n}\n\nvnx::Variant txio_entry_t::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"memo\") {\n\t\treturn vnx::Variant(memo);\n\t}\n\tif(_name == \"txid\") {\n\t\treturn vnx::Variant(txid);\n\t}\n\tif(_name == \"height\") {\n\t\treturn vnx::Variant(height);\n\t}\n\tif(_name == \"time_stamp\") {\n\t\treturn vnx::Variant(time_stamp);\n\t}\n\tif(_name == \"type\") {\n\t\treturn vnx::Variant(type);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid txio_entry_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"memo\") {\n\t\t_value.to(memo);\n\t} else if(_name == \"txid\") {\n\t\t_value.to(txid);\n\t} else if(_name == \"height\") {\n\t\t_value.to(height);\n\t} else if(_name == \"time_stamp\") {\n\t\t_value.to(time_stamp);\n\t} else if(_name == \"type\") {\n\t\t_value.to(type);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const txio_entry_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, txio_entry_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* txio_entry_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> txio_entry_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.txio_entry_t\";\n\ttype_code->type_hash = vnx::Hash64(0x2d1c65e166ab244bull);\n\ttype_code->code_hash = vnx::Hash64(0x2daf93e2887e8013ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::txio_entry_t);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::txio_t::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<txio_entry_t>>(); };\n\ttype_code->depends.resize(1);\n\ttype_code->depends[0] = ::mmx::tx_type_e::static_get_type_code();\n\ttype_code->fields.resize(8);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"memo\";\n\t\tfield.code = {33, 32};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"txid\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"height\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[6];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"time_stamp\";\n\t\tfield.code = {8};\n\t}\n\t{\n\t\tauto& field = type_code->fields[7];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"type\";\n\t\tfield.code = {19, 0};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::txio_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.height, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[6]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.time_stamp, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.memo, type_code, _field->code.data()); break;\n\t\t\tcase 4: vnx::read(in, value.txid, type_code, _field->code.data()); break;\n\t\t\tcase 7: vnx::read(in, value.type, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::txio_entry_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_txio_entry_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::txio_entry_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(12);\n\tvnx::write_value(_buf + 0, value.height);\n\tvnx::write_value(_buf + 4, value.time_stamp);\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.contract, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.memo, type_code, type_code->fields[3].code.data());\n\tvnx::write(out, value.txid, type_code, type_code->fields[4].code.data());\n\tvnx::write(out, value.type, type_code, type_code->fields[7].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::txio_entry_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::txio_entry_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::txio_entry_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::txio_entry_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::txio_entry_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/txio_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/txio_t.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nconst uint32_t txio_t::MAX_MEMO_SIZE;\n\nconst vnx::Hash64 txio_t::VNX_TYPE_HASH(0x32adb93b85c82cf4ull);\nconst vnx::Hash64 txio_t::VNX_CODE_HASH(0x7ddcede672a6e7ddull);\n\nvnx::Hash64 txio_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string txio_t::get_type_name() const {\n\treturn \"mmx.txio_t\";\n}\n\nconst vnx::TypeCode* txio_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_txio_t;\n}\n\nstd::shared_ptr<txio_t> txio_t::create() {\n\treturn std::make_shared<txio_t>();\n}\n\nstd::shared_ptr<txio_t> txio_t::clone() const {\n\treturn std::make_shared<txio_t>(*this);\n}\n\nvoid txio_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid txio_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid txio_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_txio_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, memo);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid txio_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"memo\\\": \"; vnx::write(_out, memo);\n\t_out << \"}\";\n}\n\nvoid txio_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object txio_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.txio_t\";\n\t_object[\"address\"] = address;\n\t_object[\"contract\"] = contract;\n\t_object[\"amount\"] = amount;\n\t_object[\"memo\"] = memo;\n\treturn _object;\n}\n\nvoid txio_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"memo\") {\n\t\t\t_entry.second.to(memo);\n\t\t}\n\t}\n}\n\nvnx::Variant txio_t::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"memo\") {\n\t\treturn vnx::Variant(memo);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid txio_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"memo\") {\n\t\t_value.to(memo);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const txio_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, txio_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* txio_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> txio_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.txio_t\";\n\ttype_code->type_hash = vnx::Hash64(0x32adb93b85c82cf4ull);\n\ttype_code->code_hash = vnx::Hash64(0x7ddcede672a6e7ddull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::txio_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<txio_t>>(); };\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"memo\";\n\t\tfield.code = {33, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::txio_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.memo, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::txio_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_txio_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::txio_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.contract, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.memo, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::txio_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::txio_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::txio_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::txio_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::txio_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/txout_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/txout_t.hxx>\n#include <mmx/txio_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 txout_t::VNX_TYPE_HASH(0xaa91772752216576ull);\nconst vnx::Hash64 txout_t::VNX_CODE_HASH(0xa65c408fd2dafa11ull);\n\nvnx::Hash64 txout_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string txout_t::get_type_name() const {\n\treturn \"mmx.txout_t\";\n}\n\nconst vnx::TypeCode* txout_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_txout_t;\n}\n\nstd::shared_ptr<txout_t> txout_t::create() {\n\treturn std::make_shared<txout_t>();\n}\n\nstd::shared_ptr<txout_t> txout_t::clone() const {\n\treturn std::make_shared<txout_t>(*this);\n}\n\nvoid txout_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid txout_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid txout_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_txout_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, contract);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, amount);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, memo);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid txout_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"contract\\\": \"; vnx::write(_out, contract);\n\t_out << \", \\\"amount\\\": \"; vnx::write(_out, amount);\n\t_out << \", \\\"memo\\\": \"; vnx::write(_out, memo);\n\t_out << \"}\";\n}\n\nvoid txout_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object txout_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.txout_t\";\n\t_object[\"address\"] = address;\n\t_object[\"contract\"] = contract;\n\t_object[\"amount\"] = amount;\n\t_object[\"memo\"] = memo;\n\treturn _object;\n}\n\nvoid txout_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"amount\") {\n\t\t\t_entry.second.to(amount);\n\t\t} else if(_entry.first == \"contract\") {\n\t\t\t_entry.second.to(contract);\n\t\t} else if(_entry.first == \"memo\") {\n\t\t\t_entry.second.to(memo);\n\t\t}\n\t}\n}\n\nvnx::Variant txout_t::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"contract\") {\n\t\treturn vnx::Variant(contract);\n\t}\n\tif(_name == \"amount\") {\n\t\treturn vnx::Variant(amount);\n\t}\n\tif(_name == \"memo\") {\n\t\treturn vnx::Variant(memo);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid txout_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"contract\") {\n\t\t_value.to(contract);\n\t} else if(_name == \"amount\") {\n\t\t_value.to(amount);\n\t} else if(_name == \"memo\") {\n\t\t_value.to(memo);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const txout_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, txout_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* txout_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> txout_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.txout_t\";\n\ttype_code->type_hash = vnx::Hash64(0xaa91772752216576ull);\n\ttype_code->code_hash = vnx::Hash64(0xa65c408fd2dafa11ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::txout_t);\n\ttype_code->parents.resize(1);\n\ttype_code->parents[0] = ::mmx::txio_t::static_get_type_code();\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<txout_t>>(); };\n\ttype_code->fields.resize(4);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"contract\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"amount\";\n\t\tfield.code = {11, 16, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"memo\";\n\t\tfield.code = {33, 32};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::txout_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tin.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.contract, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.amount, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.memo, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::txout_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_txout_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::txout_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.contract, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.amount, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.memo, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::txout_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::txout_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::txout_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::txout_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::txout_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/uint_fraction_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/uint_fraction_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 uint_fraction_t::VNX_TYPE_HASH(0xe5632136b5a3ed5aull);\nconst vnx::Hash64 uint_fraction_t::VNX_CODE_HASH(0xb9b3b6bfa9321e82ull);\n\nvnx::Hash64 uint_fraction_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string uint_fraction_t::get_type_name() const {\n\treturn \"mmx.uint_fraction_t\";\n}\n\nconst vnx::TypeCode* uint_fraction_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_uint_fraction_t;\n}\n\nstd::shared_ptr<uint_fraction_t> uint_fraction_t::create() {\n\treturn std::make_shared<uint_fraction_t>();\n}\n\nstd::shared_ptr<uint_fraction_t> uint_fraction_t::clone() const {\n\treturn std::make_shared<uint_fraction_t>(*this);\n}\n\nvoid uint_fraction_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid uint_fraction_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid uint_fraction_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_uint_fraction_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, value);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, inverse);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid uint_fraction_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"value\\\": \"; vnx::write(_out, value);\n\t_out << \", \\\"inverse\\\": \"; vnx::write(_out, inverse);\n\t_out << \"}\";\n}\n\nvoid uint_fraction_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object uint_fraction_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.uint_fraction_t\";\n\t_object[\"value\"] = value;\n\t_object[\"inverse\"] = inverse;\n\treturn _object;\n}\n\nvoid uint_fraction_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"inverse\") {\n\t\t\t_entry.second.to(inverse);\n\t\t} else if(_entry.first == \"value\") {\n\t\t\t_entry.second.to(value);\n\t\t}\n\t}\n}\n\nvnx::Variant uint_fraction_t::get_field(const std::string& _name) const {\n\tif(_name == \"value\") {\n\t\treturn vnx::Variant(value);\n\t}\n\tif(_name == \"inverse\") {\n\t\treturn vnx::Variant(inverse);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid uint_fraction_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"value\") {\n\t\t_value.to(value);\n\t} else if(_name == \"inverse\") {\n\t\t_value.to(inverse);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const uint_fraction_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, uint_fraction_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* uint_fraction_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> uint_fraction_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.uint_fraction_t\";\n\ttype_code->type_hash = vnx::Hash64(0xe5632136b5a3ed5aull);\n\ttype_code->code_hash = vnx::Hash64(0xb9b3b6bfa9321e82ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::uint_fraction_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<uint_fraction_t>>(); };\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"value\";\n\t\tfield.code = {3};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 4;\n\t\tfield.name = \"inverse\";\n\t\tfield.value = vnx::to_string(1);\n\t\tfield.code = {3};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::uint_fraction_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.value, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.inverse, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::uint_fraction_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_uint_fraction_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::uint_fraction_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(8);\n\tvnx::write_value(_buf + 0, value.value);\n\tvnx::write_value(_buf + 4, value.inverse);\n}\n\nvoid read(std::istream& in, ::mmx::uint_fraction_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::uint_fraction_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::uint_fraction_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::uint_fraction_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::uint_fraction_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/ulong_fraction_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/ulong_fraction_t.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 ulong_fraction_t::VNX_TYPE_HASH(0xe9c2388a9c35ce06ull);\nconst vnx::Hash64 ulong_fraction_t::VNX_CODE_HASH(0xaac983b163951134ull);\n\nvnx::Hash64 ulong_fraction_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string ulong_fraction_t::get_type_name() const {\n\treturn \"mmx.ulong_fraction_t\";\n}\n\nconst vnx::TypeCode* ulong_fraction_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_ulong_fraction_t;\n}\n\nstd::shared_ptr<ulong_fraction_t> ulong_fraction_t::create() {\n\treturn std::make_shared<ulong_fraction_t>();\n}\n\nstd::shared_ptr<ulong_fraction_t> ulong_fraction_t::clone() const {\n\treturn std::make_shared<ulong_fraction_t>(*this);\n}\n\nvoid ulong_fraction_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid ulong_fraction_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid ulong_fraction_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_ulong_fraction_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, value);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, inverse);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid ulong_fraction_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"value\\\": \"; vnx::write(_out, value);\n\t_out << \", \\\"inverse\\\": \"; vnx::write(_out, inverse);\n\t_out << \"}\";\n}\n\nvoid ulong_fraction_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object ulong_fraction_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.ulong_fraction_t\";\n\t_object[\"value\"] = value;\n\t_object[\"inverse\"] = inverse;\n\treturn _object;\n}\n\nvoid ulong_fraction_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"inverse\") {\n\t\t\t_entry.second.to(inverse);\n\t\t} else if(_entry.first == \"value\") {\n\t\t\t_entry.second.to(value);\n\t\t}\n\t}\n}\n\nvnx::Variant ulong_fraction_t::get_field(const std::string& _name) const {\n\tif(_name == \"value\") {\n\t\treturn vnx::Variant(value);\n\t}\n\tif(_name == \"inverse\") {\n\t\treturn vnx::Variant(inverse);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid ulong_fraction_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"value\") {\n\t\t_value.to(value);\n\t} else if(_name == \"inverse\") {\n\t\t_value.to(inverse);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const ulong_fraction_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, ulong_fraction_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* ulong_fraction_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> ulong_fraction_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.ulong_fraction_t\";\n\ttype_code->type_hash = vnx::Hash64(0xe9c2388a9c35ce06ull);\n\ttype_code->code_hash = vnx::Hash64(0xaac983b163951134ull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::ulong_fraction_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<ulong_fraction_t>>(); };\n\ttype_code->fields.resize(2);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"value\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"inverse\";\n\t\tfield.value = vnx::to_string(1);\n\t\tfield.code = {4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::ulong_fraction_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[0]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.value, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[1]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.inverse, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::ulong_fraction_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_ulong_fraction_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::ulong_fraction_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(16);\n\tvnx::write_value(_buf + 0, value.value);\n\tvnx::write_value(_buf + 8, value.inverse);\n}\n\nvoid read(std::istream& in, ::mmx::ulong_fraction_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::ulong_fraction_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::ulong_fraction_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::ulong_fraction_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::ulong_fraction_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/src/virtual_plot_info_t.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/package.hxx>\n#include <mmx/virtual_plot_info_t.hxx>\n#include <mmx/addr_t.hpp>\n#include <mmx/pubkey_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n\nconst vnx::Hash64 virtual_plot_info_t::VNX_TYPE_HASH(0xcbcd7c49be95180eull);\nconst vnx::Hash64 virtual_plot_info_t::VNX_CODE_HASH(0xd4df0d56b713df9eull);\n\nvnx::Hash64 virtual_plot_info_t::get_type_hash() const {\n\treturn VNX_TYPE_HASH;\n}\n\nstd::string virtual_plot_info_t::get_type_name() const {\n\treturn \"mmx.virtual_plot_info_t\";\n}\n\nconst vnx::TypeCode* virtual_plot_info_t::get_type_code() const {\n\treturn mmx::vnx_native_type_code_virtual_plot_info_t;\n}\n\nstd::shared_ptr<virtual_plot_info_t> virtual_plot_info_t::create() {\n\treturn std::make_shared<virtual_plot_info_t>();\n}\n\nstd::shared_ptr<virtual_plot_info_t> virtual_plot_info_t::clone() const {\n\treturn std::make_shared<virtual_plot_info_t>(*this);\n}\n\nvoid virtual_plot_info_t::read(vnx::TypeInput& _in, const vnx::TypeCode* _type_code, const uint16_t* _code) {\n\tvnx::read(_in, *this, _type_code, _code);\n}\n\nvoid virtual_plot_info_t::write(vnx::TypeOutput& _out, const vnx::TypeCode* _type_code, const uint16_t* _code) const {\n\tvnx::write(_out, *this, _type_code, _code);\n}\n\nvoid virtual_plot_info_t::accept(vnx::Visitor& _visitor) const {\n\tconst vnx::TypeCode* _type_code = mmx::vnx_native_type_code_virtual_plot_info_t;\n\t_visitor.type_begin(*_type_code);\n\t_visitor.type_field(_type_code->fields[0], 0); vnx::accept(_visitor, address);\n\t_visitor.type_field(_type_code->fields[1], 1); vnx::accept(_visitor, owner);\n\t_visitor.type_field(_type_code->fields[2], 2); vnx::accept(_visitor, farmer_key);\n\t_visitor.type_field(_type_code->fields[3], 3); vnx::accept(_visitor, reward_address);\n\t_visitor.type_field(_type_code->fields[4], 4); vnx::accept(_visitor, balance);\n\t_visitor.type_field(_type_code->fields[5], 5); vnx::accept(_visitor, size_bytes);\n\t_visitor.type_end(*_type_code);\n}\n\nvoid virtual_plot_info_t::write(std::ostream& _out) const {\n\t_out << \"{\";\n\t_out << \"\\\"address\\\": \"; vnx::write(_out, address);\n\t_out << \", \\\"owner\\\": \"; vnx::write(_out, owner);\n\t_out << \", \\\"farmer_key\\\": \"; vnx::write(_out, farmer_key);\n\t_out << \", \\\"reward_address\\\": \"; vnx::write(_out, reward_address);\n\t_out << \", \\\"balance\\\": \"; vnx::write(_out, balance);\n\t_out << \", \\\"size_bytes\\\": \"; vnx::write(_out, size_bytes);\n\t_out << \"}\";\n}\n\nvoid virtual_plot_info_t::read(std::istream& _in) {\n\tif(auto _json = vnx::read_json(_in)) {\n\t\tfrom_object(_json->to_object());\n\t}\n}\n\nvnx::Object virtual_plot_info_t::to_object() const {\n\tvnx::Object _object;\n\t_object[\"__type\"] = \"mmx.virtual_plot_info_t\";\n\t_object[\"address\"] = address;\n\t_object[\"owner\"] = owner;\n\t_object[\"farmer_key\"] = farmer_key;\n\t_object[\"reward_address\"] = reward_address;\n\t_object[\"balance\"] = balance;\n\t_object[\"size_bytes\"] = size_bytes;\n\treturn _object;\n}\n\nvoid virtual_plot_info_t::from_object(const vnx::Object& _object) {\n\tfor(const auto& _entry : _object.field) {\n\t\tif(_entry.first == \"address\") {\n\t\t\t_entry.second.to(address);\n\t\t} else if(_entry.first == \"balance\") {\n\t\t\t_entry.second.to(balance);\n\t\t} else if(_entry.first == \"farmer_key\") {\n\t\t\t_entry.second.to(farmer_key);\n\t\t} else if(_entry.first == \"owner\") {\n\t\t\t_entry.second.to(owner);\n\t\t} else if(_entry.first == \"reward_address\") {\n\t\t\t_entry.second.to(reward_address);\n\t\t} else if(_entry.first == \"size_bytes\") {\n\t\t\t_entry.second.to(size_bytes);\n\t\t}\n\t}\n}\n\nvnx::Variant virtual_plot_info_t::get_field(const std::string& _name) const {\n\tif(_name == \"address\") {\n\t\treturn vnx::Variant(address);\n\t}\n\tif(_name == \"owner\") {\n\t\treturn vnx::Variant(owner);\n\t}\n\tif(_name == \"farmer_key\") {\n\t\treturn vnx::Variant(farmer_key);\n\t}\n\tif(_name == \"reward_address\") {\n\t\treturn vnx::Variant(reward_address);\n\t}\n\tif(_name == \"balance\") {\n\t\treturn vnx::Variant(balance);\n\t}\n\tif(_name == \"size_bytes\") {\n\t\treturn vnx::Variant(size_bytes);\n\t}\n\treturn vnx::Variant();\n}\n\nvoid virtual_plot_info_t::set_field(const std::string& _name, const vnx::Variant& _value) {\n\tif(_name == \"address\") {\n\t\t_value.to(address);\n\t} else if(_name == \"owner\") {\n\t\t_value.to(owner);\n\t} else if(_name == \"farmer_key\") {\n\t\t_value.to(farmer_key);\n\t} else if(_name == \"reward_address\") {\n\t\t_value.to(reward_address);\n\t} else if(_name == \"balance\") {\n\t\t_value.to(balance);\n\t} else if(_name == \"size_bytes\") {\n\t\t_value.to(size_bytes);\n\t}\n}\n\n/// \\private\nstd::ostream& operator<<(std::ostream& _out, const virtual_plot_info_t& _value) {\n\t_value.write(_out);\n\treturn _out;\n}\n\n/// \\private\nstd::istream& operator>>(std::istream& _in, virtual_plot_info_t& _value) {\n\t_value.read(_in);\n\treturn _in;\n}\n\nconst vnx::TypeCode* virtual_plot_info_t::static_get_type_code() {\n\tconst vnx::TypeCode* type_code = vnx::get_type_code(VNX_TYPE_HASH);\n\tif(!type_code) {\n\t\ttype_code = vnx::register_type_code(static_create_type_code());\n\t}\n\treturn type_code;\n}\n\nstd::shared_ptr<vnx::TypeCode> virtual_plot_info_t::static_create_type_code() {\n\tauto type_code = std::make_shared<vnx::TypeCode>();\n\ttype_code->name = \"mmx.virtual_plot_info_t\";\n\ttype_code->type_hash = vnx::Hash64(0xcbcd7c49be95180eull);\n\ttype_code->code_hash = vnx::Hash64(0xd4df0d56b713df9eull);\n\ttype_code->is_native = true;\n\ttype_code->native_size = sizeof(::mmx::virtual_plot_info_t);\n\ttype_code->create_value = []() -> std::shared_ptr<vnx::Value> { return std::make_shared<vnx::Struct<virtual_plot_info_t>>(); };\n\ttype_code->fields.resize(6);\n\t{\n\t\tauto& field = type_code->fields[0];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"address\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[1];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"owner\";\n\t\tfield.code = {11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[2];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"farmer_key\";\n\t\tfield.code = {11, 33, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[3];\n\t\tfield.is_extended = true;\n\t\tfield.name = \"reward_address\";\n\t\tfield.code = {33, 11, 32, 1};\n\t}\n\t{\n\t\tauto& field = type_code->fields[4];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"balance\";\n\t\tfield.code = {4};\n\t}\n\t{\n\t\tauto& field = type_code->fields[5];\n\t\tfield.data_size = 8;\n\t\tfield.name = \"size_bytes\";\n\t\tfield.code = {4};\n\t}\n\ttype_code->build();\n\treturn type_code;\n}\n\n\n} // namespace mmx\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::virtual_plot_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tTypeInput::recursion_t tag(in);\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_OBJECT:\n\t\t\tcase CODE_ALT_OBJECT: {\n\t\t\t\tObject tmp;\n\t\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\t\tvalue.from_object(tmp);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase CODE_DYNAMIC:\n\t\t\tcase CODE_ALT_DYNAMIC:\n\t\t\t\tvnx::read_dynamic(in, value);\n\t\t\t\treturn;\n\t\t}\n\t}\n\tif(!type_code) {\n\t\tvnx::skip(in, type_code, code);\n\t\treturn;\n\t}\n\tif(code) {\n\t\tswitch(code[0]) {\n\t\t\tcase CODE_STRUCT: type_code = type_code->depends[code[1]]; break;\n\t\t\tcase CODE_ALT_STRUCT: type_code = type_code->depends[vnx::flip_bytes(code[1])]; break;\n\t\t\tdefault: {\n\t\t\t\tvnx::skip(in, type_code, code);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto* const _buf = in.read(type_code->total_field_size);\n\tif(type_code->is_matched) {\n\t\tif(const auto* const _field = type_code->field_map[4]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.balance, _field->code.data());\n\t\t}\n\t\tif(const auto* const _field = type_code->field_map[5]) {\n\t\t\tvnx::read_value(_buf + _field->offset, value.size_bytes, _field->code.data());\n\t\t}\n\t}\n\tfor(const auto* _field : type_code->ext_fields) {\n\t\tswitch(_field->native_index) {\n\t\t\tcase 0: vnx::read(in, value.address, type_code, _field->code.data()); break;\n\t\t\tcase 1: vnx::read(in, value.owner, type_code, _field->code.data()); break;\n\t\t\tcase 2: vnx::read(in, value.farmer_key, type_code, _field->code.data()); break;\n\t\t\tcase 3: vnx::read(in, value.reward_address, type_code, _field->code.data()); break;\n\t\t\tdefault: vnx::skip(in, type_code, _field->code.data());\n\t\t}\n\t}\n}\n\nvoid write(TypeOutput& out, const ::mmx::virtual_plot_info_t& value, const TypeCode* type_code, const uint16_t* code) {\n\tif(code && code[0] == CODE_OBJECT) {\n\t\tvnx::write(out, value.to_object(), nullptr, code);\n\t\treturn;\n\t}\n\tif(!type_code || (code && code[0] == CODE_ANY)) {\n\t\ttype_code = mmx::vnx_native_type_code_virtual_plot_info_t;\n\t\tout.write_type_code(type_code);\n\t\tvnx::write_class_header<::mmx::virtual_plot_info_t>(out);\n\t}\n\telse if(code && code[0] == CODE_STRUCT) {\n\t\ttype_code = type_code->depends[code[1]];\n\t}\n\tauto* const _buf = out.write(16);\n\tvnx::write_value(_buf + 0, value.balance);\n\tvnx::write_value(_buf + 8, value.size_bytes);\n\tvnx::write(out, value.address, type_code, type_code->fields[0].code.data());\n\tvnx::write(out, value.owner, type_code, type_code->fields[1].code.data());\n\tvnx::write(out, value.farmer_key, type_code, type_code->fields[2].code.data());\n\tvnx::write(out, value.reward_address, type_code, type_code->fields[3].code.data());\n}\n\nvoid read(std::istream& in, ::mmx::virtual_plot_info_t& value) {\n\tvalue.read(in);\n}\n\nvoid write(std::ostream& out, const ::mmx::virtual_plot_info_t& value) {\n\tvalue.write(out);\n}\n\nvoid accept(Visitor& visitor, const ::mmx::virtual_plot_info_t& value) {\n\tvalue.accept(visitor);\n}\n\nbool is_equivalent<::mmx::virtual_plot_info_t>::operator()(const uint16_t* code, const TypeCode* type_code) {\n\tif(code[0] != CODE_STRUCT || !type_code) {\n\t\treturn false;\n\t}\n\ttype_code = type_code->depends[code[1]];\n\treturn type_code->type_hash == ::mmx::virtual_plot_info_t::VNX_TYPE_HASH && type_code->is_equivalent;\n}\n\n} // vnx\n"
  },
  {
    "path": "generated/vm/include/mmx/vm/accept_generic.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_vm_ACCEPT_GENERIC_HXX_\n#define INCLUDE_mmx_vm_ACCEPT_GENERIC_HXX_\n\n\n\nnamespace vnx {\n\n\n\n} // namespace vnx\n\n#endif // INCLUDE_mmx_vm_ACCEPT_GENERIC_HXX_\n"
  },
  {
    "path": "generated/vm/include/mmx/vm/package.hxx",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#ifndef INCLUDE_mmx_vm_PACKAGE_HXX_\n#define INCLUDE_mmx_vm_PACKAGE_HXX_\n\n#include <vnx/Type.h>\n\n\n#ifdef MMX_VM_EXPORT_ENABLE\n#include <mmx_vm_export.h>\n#else\n#ifndef MMX_VM_EXPORT\n#define MMX_VM_EXPORT\n#endif\n#endif\n\n\nnamespace mmx {\nnamespace vm {\n\nvoid register_all_types();\n\n\nclass varptr_t;\n\n\n} // namespace mmx\n} // namespace vm\n\n\nnamespace vnx {\n\nvoid read(TypeInput& in, ::mmx::vm::varptr_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid write(TypeOutput& out, const ::mmx::vm::varptr_t& value, const TypeCode* type_code, const uint16_t* code); ///< \\private\n\nvoid read(std::istream& in, ::mmx::vm::varptr_t& value); ///< \\private\n\nvoid write(std::ostream& out, const ::mmx::vm::varptr_t& value); ///< \\private\n\nvoid accept(Visitor& visitor, const ::mmx::vm::varptr_t& value); ///< \\private\n\n\n/// \\private\ntemplate<>\nstruct type<::mmx::vm::varptr_t> {\n\tvoid read(TypeInput& in, ::mmx::vm::varptr_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::read(in, value, type_code, code);\n\t}\n\tvoid write(TypeOutput& out, const ::mmx::vm::varptr_t& value, const TypeCode* type_code, const uint16_t* code) {\n\t\tvnx::write(out, value, type_code, code);\n\t}\n\tvoid read(std::istream& in, ::mmx::vm::varptr_t& value) {\n\t\tvnx::read(in, value);\n\t}\n\tvoid write(std::ostream& out, const ::mmx::vm::varptr_t& value) {\n\t\tvnx::write(out, value);\n\t}\n\tvoid accept(Visitor& visitor, const ::mmx::vm::varptr_t& value) {\n\t\tvnx::accept(visitor, value);\n\t}\n\tconst TypeCode* get_type_code();\n\tvoid create_dynamic_code(std::vector<uint16_t>& code);\n\tvoid create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::vm::varptr_t& value, bool special = false);\n};\n\n\n} // namespace vnx\n\n#endif // INCLUDE_mmx_vm_PACKAGE_HXX_\n"
  },
  {
    "path": "generated/vm/src/package.cpp",
    "content": "\n// AUTO GENERATED by vnxcppcodegen\n\n#include <mmx/vm/varptr_t.hpp>\n\n#include <mmx/vm/package.hxx>\n#include <vnx/vnx.h>\n\n\n\nnamespace vnx {\n\nconst TypeCode* type<::mmx::vm::varptr_t>::get_type_code() {\n\treturn nullptr;\n}\n\nvoid type<::mmx::vm::varptr_t>::create_dynamic_code(std::vector<uint16_t>& code) {\n\tcreate_dynamic_code(code, ::mmx::vm::varptr_t());\n}\n\nvoid type<::mmx::vm::varptr_t>::create_dynamic_code(std::vector<uint16_t>& code, const ::mmx::vm::varptr_t& value, bool special) {\n\tconst std::vector<int> tmp = {12, 1};\n\tcode.insert(code.end(), tmp.begin(), tmp.end());}\n\n\n} // namespace vnx\n\n\nnamespace mmx {\nnamespace vm {\n\n\nvoid register_all_types() {\n}\n\nstatic struct vnx_static_init {\n\tvnx_static_init() {\n\t\tregister_all_types();\n\t}\n} vnx_static_init_;\n\n\n} // namespace mmx\n} // namespace vm\n"
  },
  {
    "path": "include/cuda_sha512.h",
    "content": "/*\n * cuda_sha512.h\n *\n *  Created on: Nov 13, 2023\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_CUDA_SHA512_H_\n#define INCLUDE_MMX_CUDA_SHA512_H_\n\n#include <cuda_runtime.h>\n#include <cstdint>\n\n\n__device__\nstatic const uint64_t SHA512_K[80] = {\n\t0x428a2f98d728ae22ull, 0x7137449123ef65cdull, 0xb5c0fbcfec4d3b2full, 0xe9b5dba58189dbbcull, 0x3956c25bf348b538ull,\n\t0x59f111f1b605d019ull, 0x923f82a4af194f9bull, 0xab1c5ed5da6d8118ull, 0xd807aa98a3030242ull, 0x12835b0145706fbeull,\n\t0x243185be4ee4b28cull, 0x550c7dc3d5ffb4e2ull, 0x72be5d74f27b896full, 0x80deb1fe3b1696b1ull, 0x9bdc06a725c71235ull,\n\t0xc19bf174cf692694ull, 0xe49b69c19ef14ad2ull, 0xefbe4786384f25e3ull, 0x0fc19dc68b8cd5b5ull, 0x240ca1cc77ac9c65ull,\n\t0x2de92c6f592b0275ull, 0x4a7484aa6ea6e483ull, 0x5cb0a9dcbd41fbd4ull, 0x76f988da831153b5ull, 0x983e5152ee66dfabull,\n\t0xa831c66d2db43210ull, 0xb00327c898fb213full, 0xbf597fc7beef0ee4ull, 0xc6e00bf33da88fc2ull, 0xd5a79147930aa725ull,\n\t0x06ca6351e003826full, 0x142929670a0e6e70ull, 0x27b70a8546d22ffcull, 0x2e1b21385c26c926ull, 0x4d2c6dfc5ac42aedull,\n\t0x53380d139d95b3dfull, 0x650a73548baf63deull, 0x766a0abb3c77b2a8ull, 0x81c2c92e47edaee6ull, 0x92722c851482353bull,\n\t0xa2bfe8a14cf10364ull, 0xa81a664bbc423001ull, 0xc24b8b70d0f89791ull, 0xc76c51a30654be30ull, 0xd192e819d6ef5218ull,\n\t0xd69906245565a910ull, 0xf40e35855771202aull, 0x106aa07032bbd1b8ull, 0x19a4c116b8d2d0c8ull, 0x1e376c085141ab53ull,\n\t0x2748774cdf8eeb99ull, 0x34b0bcb5e19b48a8ull, 0x391c0cb3c5c95a63ull, 0x4ed8aa4ae3418acbull, 0x5b9cca4f7763e373ull,\n\t0x682e6ff3d6b2b8a3ull, 0x748f82ee5defb2fcull, 0x78a5636f43172f60ull, 0x84c87814a1f0ab72ull, 0x8cc702081a6439ecull,\n\t0x90befffa23631e28ull, 0xa4506cebde82bde9ull, 0xbef9a3f7b2c67915ull, 0xc67178f2e372532bull, 0xca273eceea26619cull,\n\t0xd186b8c721c0c207ull, 0xeada7dd6cde0eb1eull, 0xf57d4f7fee6ed178ull, 0x06f067aa72176fbaull, 0x0a637dc5a2c898a6ull,\n\t0x113f9804bef90daeull, 0x1b710b35131c471bull, 0x28db77f523047d84ull, 0x32caab7b40c72493ull, 0x3c9ebe0a15c9bebcull,\n\t0x431d67c49c100d4cull, 0x4cc5d4becb3e42b6ull, 0x597f299cfc657e2aull, 0x5fcb6fab3ad6faecull, 0x6c44198c4a475817ull\n};\n\n__device__\nstatic const uint64_t SHA512_INIT[8] = {\n\t0x6a09e667f3bcc908ull, 0xbb67ae8584caa73bull, 0x3c6ef372fe94f82bull, 0xa54ff53a5f1d36f1ull,\n\t0x510e527fade682d1ull, 0x9b05688c2b3e6c1full, 0x1f83d9abfb41bd6bull, 0x5be0cd19137e2179ull\n};\n\n__device__ inline\nuint32_t cuda_bswap_32(const uint32_t y) {\n\treturn (y << 24) | ((y << 8) & 0xFF0000) | ((y >> 8) & 0xFF00) | (y >> 24);\n}\n\n__device__ inline\nuint64_t cuda_bswap_64(const uint64_t y) {\n\treturn (uint64_t(cuda_bswap_32(y)) << 32) | cuda_bswap_32(y >> 32);\n}\n\n// TODO: optimize with __funnelshift_l()\nuint64_t __device__ inline sha512_Ch(uint64_t x, uint64_t y, uint64_t z) { return z ^ (x & (y ^ z)); }\nuint64_t __device__ inline sha512_Maj(uint64_t x, uint64_t y, uint64_t z) { return (x & y) | (z & (x | y)); }\nuint64_t __device__ inline sha512_S0(uint64_t x) { return (x >> 28 | x << 36) ^ (x >> 34 | x << 30) ^ (x >> 39 | x << 25); }\nuint64_t __device__ inline sha512_S1(uint64_t x) { return (x >> 14 | x << 50) ^ (x >> 18 | x << 46) ^ (x >> 41 | x << 23); }\nuint64_t __device__ inline sha512_s0(uint64_t x) { return (x >> 1 | x << 63) ^ (x >> 8 | x << 56) ^ (x >> 7); }\nuint64_t __device__ inline sha512_s1(uint64_t x) { return (x >> 19 | x << 45) ^ (x >> 61 | x << 3) ^ (x >> 6); }\n\n\n__device__ inline\nvoid cuda_sha512_chunk(const uint64_t* msg, uint64_t* state)\n{\n\tuint64_t w[80];\n\n\tfor(int i = 0; i < 16; ++i) {\n\t\tw[i] = cuda_bswap_64(msg[i]);\n\t}\n\n\tuint64_t a = state[0];\n\tuint64_t b = state[1];\n\tuint64_t c = state[2];\n\tuint64_t d = state[3];\n\tuint64_t e = state[4];\n\tuint64_t f = state[5];\n\tuint64_t g = state[6];\n\tuint64_t h = state[7];\n\n#pragma unroll\n\tfor(int i = 0; i < 80; ++i)\n\t{\n\t\tif(i >= 16) {\n\t\t\tconst uint64_t s0 = sha512_s0(w[i-15]);\n\t\t\tconst uint64_t s1 = sha512_s1(w[i-2]);\n\t\t\tw[i] = w[i-16] + s0 + w[i-7] + s1;\n\t\t}\n\n\t\tconst uint64_t S1 = sha512_S1(e);\n\t\tconst uint64_t ch = sha512_Ch(e, f, g);\n\t\tconst uint64_t temp1 = h + S1 + ch + SHA512_K[i] + w[i];\n\t\tconst uint64_t S0 = sha512_S0(a);\n\t\tconst uint64_t maj = sha512_Maj(a, b, c);\n\t\tconst uint64_t temp2 = S0 + maj;\n\n\t\th = g;\n\t\tg = f;\n\t\tf = e;\n\t\te = d + temp1;\n\t\td = c;\n\t\tc = b;\n\t\tb = a;\n\t\ta = temp1 + temp2;\n\t}\n\n\tstate[0] += a;\n\tstate[1] += b;\n\tstate[2] += c;\n\tstate[3] += d;\n\tstate[4] += e;\n\tstate[5] += f;\n\tstate[6] += g;\n\tstate[7] += h;\n}\n\n/*\n * msg needs 17 bytes buffer at the end and must be multiple of 16x 64-bit\n * msg needs to be zero initialized\n */\n__device__ inline\nvoid cuda_sha512(uint64_t* msg, const uint32_t length, uint64_t* hash)\n{\n\tconst uint64_t num_bits = uint64_t(length) * 8;\n\tconst uint32_t total_bytes = length + 17;\n\tconst uint32_t num_chunks = (total_bytes + 127) / 128;\n\n\tmsg[length / 8] |= (uint64_t(0x80) << ((length % 8) * 8));\n\n\tmsg[num_chunks * 16 - 1] = cuda_bswap_64(num_bits);\n\n#pragma unroll\n\tfor(int i = 0; i < 8; ++i) {\n\t\thash[i] = SHA512_INIT[i];\n\t}\n#pragma unroll\n\tfor(uint32_t i = 0; i < num_chunks; ++i) {\n\t\tcuda_sha512_chunk(msg + i * 16, hash);\n\t}\n#pragma unroll\n\tfor(int i = 0; i < 8; ++i) {\n\t\thash[i] = cuda_bswap_64(hash[i]);\n\t}\n}\n\n\n\n#endif /* INCLUDE_MMX_CUDA_SHA512_H_ */\n"
  },
  {
    "path": "include/hmac_sha512.h",
    "content": "\n// Copyright (c) 2014-2018 The Bitcoin Core developers\n// Distributed under the MIT software license, see the accompanying\n// file COPYING or http://www.opensource.org/licenses/mit-license.php.\n\n#ifndef BITCOIN_CRYPTO_HMAC_SHA512_H\n#define BITCOIN_CRYPTO_HMAC_SHA512_H\n\n#include <sha512.h>\n\n#include <stdint.h>\n#include <stdlib.h>\n\n\n/** A hasher class for HMAC-SHA-512. */\nclass HMAC_SHA512\n{\nprivate:\n    SHA512 outer;\n    SHA512 inner;\n\npublic:\n    static const size_t OUTPUT_SIZE = 64;\n\n    HMAC_SHA512(const unsigned char* key, size_t keylen);\n    HMAC_SHA512& Write(const unsigned char* data, size_t len)\n    {\n        inner.Write(data, len);\n        return *this;\n    }\n    void Finalize(unsigned char hash[OUTPUT_SIZE]);\n};\n\n#endif // BITCOIN_CRYPTO_HMAC_SHA512_H\n"
  },
  {
    "path": "include/mmx/DataBase.h",
    "content": "/*\n * DataBase.h\n *\n *  Created on: Jun 6, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_DB_DATABASE_H_\n#define INCLUDE_MMX_DB_DATABASE_H_\n\n#include <vnx/File.h>\n#include <vnx/ThreadPool.h>\n\n#include <fstream>\n#include <mutex>\n\n\nnamespace mmx {\n\nstruct db_val_t {\n\tuint8_t* data = nullptr;\n\tuint32_t size = 0;\n\n\tdb_val_t() = default;\n\tdb_val_t(const uint32_t size) : size(size) {\n\t\tif(size) {\n\t\t\tdata = new uint8_t[size];\n\t\t}\n\t}\n\tdb_val_t(const void* data, const uint32_t size) : db_val_t(size) {\n\t\t::memcpy(this->data, data, size);\n\t}\n\tdb_val_t(void* data, const uint32_t size, bool copy = true) : size(size) {\n\t\tif(copy) {\n\t\t\tthis->data = new uint8_t[size];\n\t\t\t::memcpy(this->data, data, size);\n\t\t} else {\n\t\t\tthis->data = (uint8_t*)data;\n\t\t}\n\t}\n\tdb_val_t(const std::string& value) : db_val_t(value.c_str(), value.size()) {}\n\n\tdb_val_t(const db_val_t&) = delete;\n\tdb_val_t& operator=(const db_val_t&) = delete;\n\n\t~db_val_t() {\n\t\tdelete [] data;\n\t\tdata = nullptr;\n\t\tsize = 0;\n\t}\n\n\tbool operator==(const db_val_t& other) const {\n\t\tif(other.size == size) {\n\t\t\treturn ::memcmp(other.data, data, size) == 0;\n\t\t}\n\t\treturn false;\n\t}\n\tbool operator!=(const db_val_t& other) const {\n\t\tif(other.size == size) {\n\t\t\treturn ::memcmp(other.data, data, size) != 0;\n\t\t}\n\t\treturn true;\n\t}\n\n\ttemplate<typename T>\n\tT to() const {\n\t\tif(size != sizeof(T)) {\n\t\t\tthrow std::logic_error(\"data size mismatch\");\n\t\t}\n\t\treturn *((const T*)data);\n\t}\n\tstd::string to_string() const {\n\t\treturn std::string((const char*)data, size);\n\t}\n\tstd::string to_hex_string() const {\n\t\treturn vnx::to_hex_string(data, size, false, false);\n\t}\n};\n\nclass Table {\nprotected:\n\tstruct block_t {\n\t\tuint32_t level = 0;\n\t\tuint32_t min_version = 0;\n\t\tuint32_t max_version = 0;\n\t\tuint64_t total_count = 0;\n\t\tint64_t index_offset = 0;\n\t\tvnx::File file;\n\t\tstd::string name;\n\t\tstd::vector<int64_t> index;\n\t};\n\n\tstruct key_compare_t {\n\t\tconst Table* table = nullptr;\n\t\tkey_compare_t(const Table* table) : table(table) {}\n\n\t\tbool operator()(const std::shared_ptr<db_val_t>& lhs, const std::shared_ptr<db_val_t>& rhs) const {\n\t\t\treturn table->options.comparator(*lhs, *rhs) < 0;\n\t\t}\n\t};\n\n\tstruct mem_compare_t {\n\t\tconst Table* table = nullptr;\n\t\tmem_compare_t(const Table* table) : table(table) {}\n\n\t\tbool operator()(const std::pair<std::shared_ptr<db_val_t>, uint32_t>& lhs, const std::pair<std::shared_ptr<db_val_t>, uint32_t>& rhs) const {\n\t\t\tconst auto res = table->options.comparator(*lhs.first, *rhs.first);\n\t\t\tif(res == 0) {\n\t\t\t\treturn lhs.second > rhs.second;\n\t\t\t}\n\t\t\treturn res < 0;\n\t\t}\n\t};\n\npublic:\n\tstruct options_t {\n\t\tsize_t level_factor = 4;\n\t\tsize_t max_block_size = 4 * 1024 * 1024;\n\t\tsize_t force_flush_threshold = 100000;\n\t\tstd::function<int(const db_val_t&, const db_val_t&)> comparator = default_comparator;\n\t};\n\n\tconst options_t options;\n\tconst std::string root_path;\n\n\tTable(const std::string& file_path, const options_t& options = default_options);\n\n\tvoid insert(std::shared_ptr<db_val_t> key, std::shared_ptr<db_val_t> value);\n\n\tstd::shared_ptr<db_val_t> find(std::shared_ptr<db_val_t> key, const uint32_t max_version = -1) const;\n\n\tbool commit(const uint32_t new_version, const bool auto_flush = true);\n\n\tvoid revert(const uint32_t new_version);\n\n\tbool do_flush() const;\n\n\tvoid flush();\n\n\tuint32_t current_version() const {\n\t\treturn curr_version;\n\t}\n\n\tclass Iterator {\n\tpublic:\n\t\tIterator() = default;\n\t\tIterator(const Table* table);\n\t\tIterator(std::shared_ptr<const Table> table);\n\t\t~Iterator();\n\n\t\tbool is_valid() const;\n\t\tuint32_t version() const;\n\t\tstd::shared_ptr<db_val_t> key() const;\n\t\tstd::shared_ptr<db_val_t> value() const;\n\n\t\tvoid prev();\n\t\tvoid next();\n\t\tvoid seek_begin();\n\t\tvoid seek_last();\n\t\tvoid seek(std::shared_ptr<db_val_t> key);\n\t\tvoid seek_next(std::shared_ptr<db_val_t> key);\n\t\tvoid seek_prev(std::shared_ptr<db_val_t> key);\n\t\tvoid seek_for_prev(std::shared_ptr<db_val_t> key);\n\tprivate:\n\t\tstruct pointer_t {\n\t\t\tsize_t pos = -1;\n\t\t\tstd::shared_ptr<const block_t> block;\n\t\t\tstd::shared_ptr<db_val_t> value;\n\t\t\tstd::map<std::shared_ptr<db_val_t>, std::pair<std::shared_ptr<db_val_t>, uint32_t>, key_compare_t>::const_iterator iter;\n\t\t};\n\n\t\tstruct compare_t {\n\t\t\tconst Iterator* iter = nullptr;\n\t\t\tcompare_t(const Iterator* iter) : iter(iter) {}\n\t\t\tbool operator()(const std::pair<std::shared_ptr<db_val_t>, uint32_t>& lhs, const std::pair<std::shared_ptr<db_val_t>, uint32_t>& rhs) const;\n\t\t};\n\n\t\tvoid seek(std::shared_ptr<db_val_t> key, const int mode);\n\t\tvoid seek(const std::list<std::shared_ptr<block_t>>& blocks, std::shared_ptr<db_val_t> key, const int mode);\n\t\tstd::map<std::pair<std::shared_ptr<db_val_t>, uint32_t>, pointer_t, key_compare_t>::const_iterator current() const;\n\n\t\tint direction = 0;\n\t\tconst Table* table = nullptr;\n\t\tstd::shared_ptr<const Table> p_table;\n\t\tstd::map<std::pair<std::shared_ptr<db_val_t>, uint32_t>, pointer_t, compare_t> block_map;\n\t};\n\n\tstatic const std::function<int(const db_val_t&, const db_val_t&)> default_comparator;\n\n\tstatic const options_t default_options;\n\nprivate:\n\tstatic constexpr uint32_t entry_overhead = 20;\n\tstatic constexpr uint32_t block_header_size = 30;\n\n\tvoid insert_entry(uint32_t version, std::shared_ptr<db_val_t> key, std::shared_ptr<db_val_t> value);\n\n\tstd::shared_ptr<block_t> read_block(const std::string& name) const;\n\n\tstd::shared_ptr<db_val_t> find(std::shared_ptr<const block_t> block, std::shared_ptr<db_val_t> key, const uint32_t max_version = -1) const;\n\n\tsize_t lower_bound(std::shared_ptr<const block_t> block, uint32_t& version, std::shared_ptr<db_val_t>& key, bool& is_match) const;\n\n\tstd::shared_ptr<block_t> rewrite(std::list<std::shared_ptr<block_t>> blocks, const uint32_t level) const;\n\n\tvoid check_rewrite();\n\n\tvoid write_block_header(vnx::TypeOutput& out, std::shared_ptr<const block_t> block) const;\n\n\tvoid write_block_index(vnx::TypeOutput& out, std::shared_ptr<const block_t> block) const;\n\n\tstd::shared_ptr<block_t> create_block(const uint32_t level, const std::string& name) const;\n\n\tvoid finish_block(std::shared_ptr<block_t> block) const;\n\n\tvoid rename(std::shared_ptr<block_t> block, const uint64_t new_index) const;\n\tvoid rename(std::shared_ptr<block_t> block, const std::string& new_name) const;\n\nprivate:\n\tuint32_t last_flush = 0;\n\tuint32_t curr_version = 0;\n\tuint64_t next_block_id = 0;\n\n\tvnx::File write_log;\n\tstd::list<std::shared_ptr<block_t>> blocks;\n\n\tsize_t mem_block_size = 0;\n\tstd::map<std::shared_ptr<db_val_t>, std::pair<std::shared_ptr<db_val_t>, uint32_t>, key_compare_t> mem_index;\n\tstd::map<std::pair<std::shared_ptr<db_val_t>, uint32_t>, std::shared_ptr<db_val_t>, mem_compare_t> mem_block;\n\n\tmutable std::mutex mutex;\n\tmutable int64_t write_lock = 0;\n\n\tstd::ofstream debug_log;\n\n};\n\nclass DataBase {\npublic:\n\tDataBase(const int num_threads = 0);\n\n\t~DataBase();\n\n\tvoid add(std::shared_ptr<Table> table);\n\n\tvoid commit(const uint32_t new_version);\n\n\tvoid revert(const uint32_t new_version);\n\n\tuint32_t version() const;\n\n\tuint32_t min_version() const;\n\n\tuint32_t recover();\n\n\ttemplate<typename T>\n\tvoid open_async(T& table, const std::string& path) {\n\t\tthreads.add_task([this, &table, path]() {\n\t\t\tadd(table.open(path));\n\t\t});\n\t}\n\n\tvoid sync() {\n\t\tthreads.sync();\n\t}\n\nprivate:\n\tmutable std::mutex mutex;\n\tvnx::ThreadPool threads;\n\tstd::vector<std::shared_ptr<Table>> tables;\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_DB_DATABASE_H_ */\n"
  },
  {
    "path": "include/mmx/ECDSA_Wallet.h",
    "content": "/*\n * ECDSA_Wallet.h\n *\n *  Created on: Dec 11, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_ECDSA_WALLET_H_\n#define INCLUDE_MMX_ECDSA_WALLET_H_\n\n#include <mmx/Transaction.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/solution/PubKey.hxx>\n#include <mmx/spend_options_t.hxx>\n#include <mmx/skey_t.hpp>\n#include <mmx/addr_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/account_t.hxx>\n#include <mmx/hmac_sha512.hpp>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\n\nclass ECDSA_Wallet {\npublic:\n\tconst account_t config;\n\n\tuint32_t default_expire = 100;\n\n\tECDSA_Wallet(\tconst hash_t& seed_value,\n\t\t\t\t\tconst account_t& config, std::shared_ptr<const ChainParams> params)\n\t\t:\tconfig(config), seed_value(seed_value), params(params)\n\t{\n\t\tif(seed_value == hash_t()) {\n\t\t\tthrow std::logic_error(\"seed == zero\");\n\t\t}\n\t\tcreate_farmer_key();\n\t}\n\n\tECDSA_Wallet(\tconst hash_t& seed_value, const std::vector<addr_t>& addresses,\n\t\t\t\t\tconst account_t& config, std::shared_ptr<const ChainParams> params)\n\t\t:\tconfig(config), seed_value(seed_value), params(params)\n\t{\n\t\tif(seed_value == hash_t()) {\n\t\t\tthrow std::logic_error(\"seed == zero\");\n\t\t}\n\t\tcreate_farmer_key();\n\n\t\tsize_t i = 0;\n\t\tfor(const auto& addr : addresses) {\n\t\t\tindex_map[addr] = i++;\n\t\t}\n\t\tthis->addresses = addresses;\n\t}\n\n\tvoid lock()\n\t{\n\t\t// clear memory\n\t\tfor(auto& entry : keypairs) {\n\t\t\tentry.first = skey_t();\n\t\t\tentry.second = pubkey_t();\n\t\t}\n\t\tkeypairs.clear();\n\t\tkeypair_map.clear();\n\t}\n\n\tvoid unlock() {\n\t\tunlock(std::string());\n\t}\n\n\tvoid unlock(const std::string& passphrase)\n\t{\n\t\tif(config.with_passphrase) {\n\t\t\tconst auto finger_print = get_finger_print(seed_value, passphrase);\n\t\t\tif(finger_print != config.finger_print) {\n\t\t\t\tthrow std::logic_error(\"invalid passphrase\");\n\t\t\t}\n\t\t}\n\t\tunlock(hash_t(\"MMX/seed/\" + passphrase));\n\t}\n\n\tvoid unlock(const hash_t& passphrase)\n\t{\n\t\tvnx::optional<addr_t> first_addr;\n\t\tif(addresses.size()) {\n\t\t\tfirst_addr = addresses[0];\n\t\t}\n\t\tconst auto master = kdf_hmac_sha512(seed_value, passphrase, KDF_ITERS);\n\t\tconst auto chain = hmac_sha512_n(master.first, master.second, 11337);\n\t\tconst auto account = hmac_sha512_n(chain.first, chain.second, config.index);\n\n\t\tfor(size_t i = 0; i < config.num_addresses; ++i)\n\t\t{\n\t\t\tstd::pair<skey_t, pubkey_t> keys;\n\t\t\t{\n\t\t\t\tconst auto tmp = hmac_sha512_n(account.first, account.second, i);\n\t\t\t\tkeys.first = skey_t(tmp.first);\n\t\t\t\tkeys.second = pubkey_t(skey_t(tmp.first));\n\t\t\t}\n\t\t\tconst auto addr = keys.second.get_addr();\n\t\t\tif(i == 0) {\n\t\t\t\tif(first_addr && addr != *first_addr) {\n\t\t\t\t\tthrow std::runtime_error(\"invalid passphrase\");\n\t\t\t\t}\n\t\t\t\tkeypairs.resize(config.num_addresses);\n\t\t\t\taddresses.resize(config.num_addresses);\n\t\t\t}\n\t\t\tkeypairs[i] = keys;\n\t\t\tkeypair_map[addr] = i;\n\t\t\taddresses[i] = addr;\n\t\t\tindex_map[addr] = i;\n\t\t}\n\t}\n\n\tbool is_locked() const\n\t{\n\t\treturn addresses.empty() || keypairs.size() < addresses.size();\n\t}\n\n\tskey_t get_skey(const uint32_t index) const\n\t{\n\t\treturn keypairs.at(index).first;\n\t}\n\n\tpubkey_t get_pubkey(const uint32_t index) const\n\t{\n\t\treturn keypairs.at(index).second;\n\t}\n\n\tstd::pair<skey_t, pubkey_t> get_farmer_key() const\n\t{\n\t\treturn farmer_key;\n\t}\n\n\tvnx::optional<addr_t> find_address(const uint32_t index) const\n\t{\n\t\tif(index >= addresses.size()) {\n\t\t\treturn nullptr;\n\t\t}\n\t\treturn addresses[index];\n\t}\n\n\taddr_t get_address(const uint32_t index) const\n\t{\n\t\tif(index >= addresses.size()) {\n\t\t\tthrow std::logic_error(\"address index out of range: \" + std::to_string(index) + \" >= \" + std::to_string(addresses.size()));\n\t\t}\n\t\treturn addresses[index];\n\t}\n\n\tstd::vector<addr_t> get_all_addresses() const\n\t{\n\t\treturn addresses;\n\t}\n\n\tssize_t find_address(const addr_t& address) const\n\t{\n\t\tauto iter = index_map.find(address);\n\t\tif(iter != index_map.end()) {\n\t\t\treturn iter->second;\n\t\t}\n\t\treturn -1;\n\t}\n\n\tsize_t find_address_throw(const addr_t& address) const\n\t{\n\t\tconst auto i = find_address(address);\n\t\tif(i >= 0) {\n\t\t\treturn i;\n\t\t}\n\t\tthrow std::logic_error(\"address not found: \" + address.to_string());\n\t}\n\n\tstd::pair<skey_t, pubkey_t> get_keypair(const uint32_t index) const\n\t{\n\t\treturn keypairs.at(index);\n\t}\n\n\tvnx::optional<std::pair<skey_t, pubkey_t>> find_keypair(const addr_t& addr) const\n\t{\n\t\tauto iter = keypair_map.find(addr);\n\t\tif(iter != keypair_map.end()) {\n\t\t\treturn keypairs[iter->second];\n\t\t}\n\t\treturn nullptr;\n\t}\n\n\tvoid update_cache(\tconst std::map<std::pair<addr_t, addr_t>, uint128>& balances,\n\t\t\t\t\t\tconst std::vector<hash_t>& history, const uint32_t height)\n\t{\n\t\tthis->height = height;\n\t\tbalance_map.clear();\n\t\tbalance_map.insert(balances.begin(), balances.end());\n\n\t\tstd::vector<hash_t> expired;\n\t\tfor(const auto& entry : pending_tx) {\n\t\t\tif(entry.second < height) {\n\t\t\t\texpired.push_back(entry.first);\n\t\t\t}\n\t\t}\n\t\tfor(const auto& txid : expired) {\n\t\t\tpending_tx.erase(txid);\n\t\t\tpending_map.erase(txid);\n\t\t}\n\t\tfor(const auto& txid : history) {\n\t\t\tpending_tx.erase(txid);\n\t\t\tpending_map.erase(txid);\n\t\t}\n\t\tfor(const auto& entry : reserved_map) {\n\t\t\tclamped_sub_assign(balance_map[entry.first], entry.second);\n\t\t}\n\t\tfor(const auto& entry : pending_map) {\n\t\t\tfor(const auto& pending : entry.second) {\n\t\t\t\tclamped_sub_assign(balance_map[pending.first], pending.second);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid update_from(std::shared_ptr<const Transaction> tx)\n\t{\n\t\tif(pending_tx.count(tx->id)) {\n\t\t\treturn;\n\t\t}\n\t\tif(tx->sender) {\n\t\t\tconst auto key = std::make_pair(*tx->sender, addr_t());\n\t\t\tconst auto static_fee = cost_to_fee<std::logic_error>(tx->static_cost, tx->fee_ratio);\n\t\t\tclamped_sub_assign(balance_map[key], static_fee);\n\t\t\tpending_map[tx->id][key] += static_fee;\n\t\t}\n\t\tfor(const auto& in : tx->inputs) {\n\t\t\tif(find_address(in.address) >= 0) {\n\t\t\t\tconst auto key = std::make_pair(in.address, in.contract);\n\t\t\t\tclamped_sub_assign(balance_map[key], in.amount);\n\t\t\t\tpending_map[tx->id][key] += in.amount;\n\t\t\t}\n\t\t}\n\t\tpending_tx[tx->id] = tx->expires;\n\t}\n\n\tvoid gather_inputs(\tstd::shared_ptr<Transaction> tx,\n\t\t\t\t\t\tstd::map<std::pair<addr_t, addr_t>, uint128_t>& spent_map,\n\t\t\t\t\t\tconst uint128_t& amount, const addr_t& currency,\n\t\t\t\t\t\tconst spend_options_t& options = {}) const\n\t{\n\t\tauto left = amount;\n\n\t\t// try to reuse existing inputs if possible\n\t\tfor(auto& in : tx->inputs)\n\t\t{\n\t\t\tif(!left) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(in.contract == currency && find_address(in.address) >= 0)\n\t\t\t{\n\t\t\t\tauto iter = balance_map.find(std::make_pair(in.address, in.contract));\n\t\t\t\tif(iter != balance_map.end())\n\t\t\t\t{\n\t\t\t\t\tauto balance = iter->second;\n\t\t\t\t\t{\n\t\t\t\t\t\tauto iter2 = spent_map.find(iter->first);\n\t\t\t\t\t\tif(iter2 != spent_map.end()) {\n\t\t\t\t\t\t\tbalance -= iter2->second;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tuint128_t amount = 0;\n\t\t\t\t\tif(balance >= left) {\n\t\t\t\t\t\tamount = left;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tamount = balance;\n\t\t\t\t\t}\n\t\t\t\t\tif(amount) {\n\t\t\t\t\t\tin.amount += amount;\n\t\t\t\t\t\tspent_map[iter->first] += amount;\n\t\t\t\t\t\tleft -= amount;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// gather addresses with non-zero balance\n\t\tstd::vector<std::pair<addr_t, uint128_t>> addr_list;\n\t\tfor(const auto& entry : balance_map) {\n\t\t\tif(entry.first.second == currency) {\n\t\t\t\tauto balance = entry.second;\n\t\t\t\tconst auto iter = spent_map.find(entry.first);\n\t\t\t\tif(iter != spent_map.end()) {\n\t\t\t\t\tbalance -= iter->second;\n\t\t\t\t}\n\t\t\t\tif(balance) {\n\t\t\t\t\taddr_list.emplace_back(entry.first.first, balance);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// sort by largest balance first\n\t\tstd::sort(addr_list.begin(), addr_list.end(),\n\t\t\t[](const std::pair<addr_t, uint128_t>& L, const std::pair<addr_t, uint128_t>& R) -> bool {\n\t\t\t\treturn L.second > R.second;\n\t\t\t});\n\n\t\t// create new inputs\n\t\tfor(const auto& entry : addr_list)\n\t\t{\n\t\t\tif(!left) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst auto& address = entry.first;\n\t\t\tconst auto& balance = entry.second;\n\n\t\t\ttxin_t in;\n\t\t\tin.address = address;\n\t\t\tin.contract = currency;\n\t\t\tin.memo = options.memo;\n\t\t\tif(left < balance) {\n\t\t\t\tin.amount = left;\n\t\t\t} else {\n\t\t\t\tin.amount = balance;\n\t\t\t}\n\t\t\tspent_map[std::make_pair(address, currency)] += in.amount;\n\t\t\tleft -= in.amount;\n\t\t\ttx->inputs.push_back(in);\n\t\t}\n\t\tif(left) {\n\t\t\tthrow std::logic_error(\"not enough funds\");\n\t\t}\n\t}\n\n\tvoid sign_off(std::shared_ptr<Transaction> tx, const spend_options_t& options = {})\n\t{\n\t\tbool was_locked = false;\n\t\tif(is_locked()) {\n\t\t\twas_locked = true;\n\t\t\tif(auto passphrase = options.passphrase) {\n\t\t\t\tunlock(*passphrase);\n\t\t\t} else {\n\t\t\t\tthrow std::logic_error(\"wallet is locked\");\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tif(options.nonce) {\n\t\t\t\ttx->nonce = *options.nonce;\n\t\t\t}\n\t\t\ttx->network = params->network;\n\t\t\ttx->finalize();\n\n\t\t\tstd::unordered_map<addr_t, uint32_t> solution_map;\n\n\t\t\tauto sign_msg_ex = [this, tx, &options, &solution_map](const addr_t& owner) -> uint16_t\n\t\t\t{\n\t\t\t\tauto iter = solution_map.find(owner);\n\t\t\t\tif(iter != solution_map.end()) {\n\t\t\t\t\treturn iter->second;\n\t\t\t\t}\n\t\t\t\tif(auto sol = sign_msg(owner, tx->id, options))\n\t\t\t\t{\n\t\t\t\t\tconst auto index = tx->solutions.size();\n\t\t\t\t\tsolution_map[owner] = index;\n\t\t\t\t\ttx->solutions.push_back(sol);\n\t\t\t\t\treturn index;\n\t\t\t\t}\n\t\t\t\treturn -1;\n\t\t\t};\n\n\t\t\t// sign sender\n\t\t\tif(tx->sender && tx->solutions.empty())\n\t\t\t{\n\t\t\t\tsign_msg_ex(*tx->sender);\n\t\t\t}\n\n\t\t\t// sign all inputs\n\t\t\tfor(auto& in : tx->inputs)\n\t\t\t{\n\t\t\t\tif(in.solution != txin_t::NO_SOLUTION) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\taddr_t owner = in.address;\n\t\t\t\t{\n\t\t\t\t\tauto iter = options.owner_map.find(owner);\n\t\t\t\t\tif(iter != options.owner_map.end()) {\n\t\t\t\t\t\tin.flags |= txin_t::IS_EXEC;\n\t\t\t\t\t\towner = iter->second;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tin.solution = sign_msg_ex(owner);\n\t\t\t}\n\n\t\t\t// sign all operations\n\t\t\tfor(auto& op : tx->execute)\n\t\t\t{\n\t\t\t\tif(op->solution != Operation::NO_SOLUTION) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\taddr_t owner = op->address;\n\n\t\t\t\tif(auto exec = std::dynamic_pointer_cast<const operation::Execute>(op)) {\n\t\t\t\t\tif(exec->user) {\n\t\t\t\t\t\towner = *exec->user;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tauto iter = options.owner_map.find(op->address);\n\t\t\t\t\tif(iter != options.owner_map.end()) {\n\t\t\t\t\t\towner = iter->second;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tauto copy = vnx::clone(op);\n\t\t\t\tcopy->solution = sign_msg_ex(owner);\n\t\t\t\top = copy;\n\t\t\t}\n\n\t\t\t// compute final content hash\n\t\t\ttx->static_cost = tx->calc_cost(params);\n\t\t\ttx->content_hash = tx->calc_hash(true);\n\t\t}\n\t\tcatch(...) {\n\t\t\tif(was_locked) {\n\t\t\t\tlock();\n\t\t\t}\n\t\t\tthrow;\n\t\t}\n\t\tif(was_locked) {\n\t\t\tlock();\n\t\t}\n\t}\n\n\tstd::shared_ptr<const Solution> sign_msg(const addr_t& address, const hash_t& msg, const spend_options_t& options = {}) const\n\t{\n\t\tif(is_locked()) {\n\t\t\tthrow std::logic_error(\"wallet is locked\");\n\t\t}\n\t\t// TODO: check for multi-sig via options.contract_map\n\t\tif(auto keys = find_keypair(address)) {\n\t\t\tauto sol = solution::PubKey::create();\n\t\t\tsol->pubkey = keys->second;\n\t\t\tsol->signature = signature_t::sign(keys->first, msg);\n\t\t\treturn sol;\n\t\t}\n\t\treturn nullptr;\n\t}\n\n\tvoid complete(\n\t\t\tstd::shared_ptr<Transaction> tx,\n\t\t\tconst spend_options_t& options = {},\n\t\t\tconst std::vector<std::pair<addr_t, uint128>>& deposit = {})\n\t{\n\t\tbool was_locked = false;\n\t\tif(is_locked()) {\n\t\t\twas_locked = true;\n\t\t\tif(auto passphrase = options.passphrase) {\n\t\t\t\tunlock(*passphrase);\n\t\t\t} else {\n\t\t\t\tthrow std::logic_error(\"wallet is locked\");\n\t\t\t}\n\t\t}\n\t\ttry {\n\t\t\tif(options.note) {\n\t\t\t\ttx->note = *options.note;\n\t\t\t}\n\t\t\tif(options.expire_at) {\n\t\t\t\ttx->expires = std::min(tx->expires, *options.expire_at);\n\t\t\t} else if(options.expire_delta) {\n\t\t\t\ttx->expires = std::min(tx->expires, height + *options.expire_delta);\n\t\t\t} else {\n\t\t\t\ttx->expires = std::min(tx->expires, height + default_expire);\n\t\t\t}\n\t\t\ttx->fee_ratio = std::max(tx->fee_ratio, options.fee_ratio);\n\n\t\t\tstd::map<addr_t, uint128_t> missing;\n\t\t\tfor(const auto& out : tx->outputs) {\n\t\t\t\tmissing[out.contract] += out.amount;\n\t\t\t}\n\t\t\tfor(const auto& op : tx->execute) {\n\t\t\t\tif(auto deposit = std::dynamic_pointer_cast<const operation::Deposit>(op)) {\n\t\t\t\t\tmissing[deposit->currency] += deposit->amount;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(const auto& in : tx->inputs) {\n\t\t\t\tauto& amount = missing[in.contract];\n\t\t\t\tif(in.amount < amount) {\n\t\t\t\t\tamount -= in.amount;\n\t\t\t\t} else {\n\t\t\t\t\tamount = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(const auto& entry : deposit) {\n\t\t\t\tmissing[entry.first] += entry.second;\n\t\t\t}\n\t\t\tstd::map<std::pair<addr_t, addr_t>, uint128_t> spent_map;\n\t\t\tfor(const auto& entry : missing) {\n\t\t\t\tif(const auto& amount = entry.second) {\n\t\t\t\t\tgather_inputs(tx, spent_map, amount, entry.first, options);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst auto static_cost = tx->calc_cost(params);\n\t\t\tconst auto static_fee = cost_to_fee<std::logic_error>(static_cost, tx->fee_ratio);\n\t\t\ttx->max_fee_amount = cost_to_fee<std::logic_error>(static_cost + options.gas_limit, tx->fee_ratio);\n\n\t\t\tif(!tx->sender) {\n\t\t\t\tif(options.sender) {\n\t\t\t\t\ttx->sender = *options.sender;\n\t\t\t\t} else {\n\t\t\t\t\t// pick a sender address\n\t\t\t\t\taddr_t max_address;\n\t\t\t\t\tuint128_t max_amount = 0;\n\t\t\t\t\tfor(const auto& entry : balance_map) {\n\t\t\t\t\t\tif(entry.first.second == addr_t()) {\n\t\t\t\t\t\t\tauto balance = entry.second;\n\t\t\t\t\t\t\tauto iter = spent_map.find(entry.first);\n\t\t\t\t\t\t\tif(iter != spent_map.end()) {\n\t\t\t\t\t\t\t\tbalance -= iter->second;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(balance > max_amount) {\n\t\t\t\t\t\t\t\tmax_amount = balance;\n\t\t\t\t\t\t\t\tmax_address = entry.first.first;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(max_amount >= static_fee) {\n\t\t\t\t\t\ttx->sender = max_address;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow std::logic_error(\"insufficient funds for tx fee\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tsign_off(tx, options);\n\t\t}\n\t\tcatch(...) {\n\t\t\tif(was_locked) {\n\t\t\t\tlock();\n\t\t\t}\n\t\t\tthrow;\n\t\t}\n\t\tif(was_locked) {\n\t\t\tlock();\n\t\t}\n\t}\n\n\tvoid reset_cache()\n\t{\n\t\tlast_update = 0;\n\t\tbalance_map.clear();\n\t\treserved_map.clear();\n\t\texternal_balance_map.clear();\n\t\tpending_tx.clear();\n\t\tpending_map.clear();\n\t}\n\n\tuint32_t height = 0;\n\tint64_t last_update = 0;\n\tstd::map<std::pair<addr_t, addr_t>, uint128_t> balance_map;\t\t\t\t\t\t\t\t\t// [[address, currency] => balance]\n\tstd::map<std::pair<addr_t, addr_t>, uint128_t> reserved_map;\t\t\t\t\t\t\t\t// [[address, currency] => balance]\n\tstd::map<addr_t, uint128_t> external_balance_map;\t\t\t\t\t\t\t\t\t\t\t// [currency => balance]\n\tstd::unordered_map<hash_t, uint32_t> pending_tx;\t\t\t\t\t\t\t\t\t\t\t// [txid => expired height]\n\tstd::unordered_map<hash_t, std::map<std::pair<addr_t, addr_t>, uint128_t>> pending_map;\t\t// [txid => [[address, currency] => balance]]\n\nprivate:\n\tvoid create_farmer_key()\n\t{\n\t\tconst auto master = kdf_hmac_sha512(seed_value, hash_t(\"MMX/farmer_keys\"), KDF_ITERS);\n\t\tconst auto tmp = hmac_sha512_n(master.first, master.second, 0);\n\t\tfarmer_key.first = skey_t(tmp.first);\n\t\tfarmer_key.second = pubkey_t(skey_t(tmp.first));\n\t}\n\nprivate:\n\tconst hash_t seed_value;\n\tstd::vector<addr_t> addresses;\n\tstd::unordered_map<addr_t, size_t> index_map;\n\tstd::vector<std::pair<skey_t, pubkey_t>> keypairs;\n\tstd::unordered_map<addr_t, size_t> keypair_map;\n\tstd::pair<skey_t, pubkey_t> farmer_key;\n\n\tconst std::shared_ptr<const ChainParams> params;\n\n\tstatic constexpr size_t KDF_ITERS = 4096;\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_ECDSA_WALLET_H_ */\n"
  },
  {
    "path": "include/mmx/Farmer.h",
    "content": "/*\n * Farmer.h\n *\n *  Created on: Dec 12, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_FARMER_H_\n#define INCLUDE_MMX_FARMER_H_\n\n#include <mmx/FarmerBase.hxx>\n#include <mmx/WalletAsyncClient.hxx>\n\n#include <vnx/addons/HttpClient.h>\n#include <vnx/addons/HttpClientAsyncClient.hxx>\n\n\nnamespace mmx {\n\nclass Farmer : public FarmerBase {\npublic:\n\tFarmer(const std::string& _vnx_name);\n\nprotected:\n\tvoid init() override;\n\n\tvoid main() override;\n\n\tvnx::Hash64 get_mac_addr() const override;\n\n\tuint64_t get_partial_diff(const addr_t& plot_nft) const override;\n\n\tstd::map<addr_t, uint64_t> get_partial_diffs(const std::vector<addr_t>& plot_nfts) const override;\n\n\tstd::vector<pubkey_t> get_farmer_keys() const override;\n\n\tstd::shared_ptr<const FarmInfo> get_farm_info() const override;\n\n\tstd::shared_ptr<const BlockHeader> sign_block(std::shared_ptr<const BlockHeader> block) const override;\n\n\tsignature_t sign_vote(std::shared_ptr<const ValidatorVote> vote) const override;\n\n\tvoid handle(std::shared_ptr<const FarmInfo> value) override;\n\n\tvoid handle(std::shared_ptr<const ProofResponse> value) override;\n\n\tvoid handle(std::shared_ptr<const Partial> value) override;\n\nprivate:\n\tvoid update();\n\n\tvoid update_difficulty();\n\n\tvoid query_difficulty(const addr_t& contract, const std::string& url);\n\n\tskey_t get_skey(const pubkey_t& pubkey) const;\n\nprivate:\n\tstd::shared_ptr<vnx::Pipe> pipe;\n\tstd::shared_ptr<const ChainParams> params;\n\tstd::shared_ptr<WalletAsyncClient> wallet;\n\tstd::shared_ptr<vnx::addons::HttpClientAsyncClient> http_async;\n\n\tmutable std::map<pubkey_t, skey_t> key_map;\n\tstd::map<hash_t, std::shared_ptr<const vnx::Sample>> info_map;\n\n\tstd::map<addr_t, pooling_stats_t> nft_stats;\n\n\tvnx::Handle<vnx::addons::HttpClient> http_client;\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_FARMER_H_ */\n"
  },
  {
    "path": "include/mmx/Harvester.h",
    "content": "/*\n * Harvester.h\n *\n *  Created on: Dec 11, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_HARVESTER_H_\n#define INCLUDE_MMX_HARVESTER_H_\n\n#include <mmx/HarvesterBase.hxx>\n#include <mmx/FarmerClient.hxx>\n#include <mmx/FarmerAsyncClient.hxx>\n#include <mmx/NodeAsyncClient.hxx>\n#include <mmx/virtual_plot_info_t.hxx>\n#include <mmx/pos/Prover.h>\n\n#include <vnx/ThreadPool.h>\n#include <vnx/addons/HttpInterface.h>\n\n\nnamespace mmx {\n\nclass Harvester : public HarvesterBase {\npublic:\n\tHarvester(const std::string& _vnx_name);\n\nprotected:\n\tvoid init() override;\n\n\tvoid main() override;\n\n\tvoid handle(std::shared_ptr<const Challenge> value) override;\n\n\tvoid reload() override;\n\n\tvoid add_plot_dir(const std::string& path) override;\n\n\tvoid rem_plot_dir(const std::string& path) override;\n\n\tuint64_t get_total_bytes() const override;\n\n\tstd::shared_ptr<const FarmInfo> get_farm_info() const override;\n\n\tvoid http_request_async(std::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\tconst vnx::request_id_t& request_id) const override;\n\n\tvoid http_request_chunk_async(\tstd::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\t\tconst int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& request_id) const override;\n\nprivate:\n\tvoid update();\n\tvoid update_nfts();\n\n\tvoid check_queue();\n\n\tstd::vector<uint32_t> fetch_full_proof(\n\t\t\tstd::shared_ptr<pos::Prover> prover, const uint64_t index) const;\n\n\tvoid lookup_task(std::shared_ptr<const Challenge> value, const int64_t recv_time_ms) const;\n\n\tvoid find_plot_dirs(const std::set<std::string>& dirs, std::set<std::string>& all_dirs, const size_t depth) const;\n\n\t// thread safe\n\tvoid send_response(\tstd::shared_ptr<const Challenge> request, std::shared_ptr<const ProofOfSpace> proof,\n\t\t\t\t\t\tconst int64_t time_begin_ms) const;\n\nprivate:\n\tbool is_ready = false;\n\thash_t harvester_id;\n\tuint64_t total_bytes = 0;\n\tuint64_t total_bytes_effective = 0;\n\n\tvnx::Hash64 farmer_addr;\n\tstd::shared_ptr<FarmerClient> farmer;\n\tstd::shared_ptr<FarmerAsyncClient> farmer_async;\n\tstd::shared_ptr<NodeAsyncClient> node_async;\n\tstd::shared_ptr<vnx::ThreadPool> threads;\n\tstd::shared_ptr<const ChainParams> params;\n\n\tstd::unordered_set<hash_t> already_checked;\n\tstd::unordered_map<hash_t, std::string> id_map;\n\tstd::unordered_map<std::string, std::shared_ptr<pos::Prover>> plot_map;\n\n\tstd::map<addr_t, uint32_t> plot_contract_set;\n\tstd::map<addr_t, plot_nft_info_t> plot_nfts;\n\tstd::map<addr_t, uint64_t> partial_diff;\n\n\tstruct lookup_t {\n\t\tint64_t recv_time_ms = 0;\n\t\tstd::shared_ptr<const Challenge> request;\n\t};\n\tstd::map<uint32_t, lookup_t> lookup_queue;\n\n\tstd::shared_ptr<vnx::Timer> lookup_timer;\n\tstd::shared_ptr<vnx::addons::HttpInterface<Harvester>> http;\n\n\tmutable std::mutex mutex;\n\n\tfriend class vnx::addons::HttpInterface<Harvester>;\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_HARVESTER_H_ */\n"
  },
  {
    "path": "include/mmx/Node.h",
    "content": "/*\n * Node.h\n *\n *  Created on: Dec 7, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_NODE_H_\n#define INCLUDE_MMX_NODE_H_\n\n#include <mmx/NodeBase.hxx>\n#include <mmx/Block.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/RouterAsyncClient.hxx>\n#include <mmx/TimeLordAsyncClient.hxx>\n#include <mmx/contract/Binary.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/txio_entry_t.hpp>\n#include <mmx/OCL_VDF.h>\n#include <mmx/uint128.hpp>\n#include <mmx/tx_index_t.hxx>\n#include <mmx/block_index_t.hxx>\n#include <mmx/trade_log_t.hxx>\n#include <mmx/table.h>\n#include <mmx/multi_table.h>\n#include <mmx/balance_cache_t.h>\n#include <mmx/farmed_block_info_t.hxx>\n#include <mmx/utils.h>\n\n#include <mmx/vm/Engine.h>\n#include <mmx/vm/StorageDB.h>\n#include <mmx/vm/StorageCache.h>\n\n#include <vnx/ThreadPool.h>\n#include <vnx/addons/HttpInterface.h>\n\n#include <unordered_set>\n#include <unordered_map>\n#include <shared_mutex>\n\n\nnamespace mmx {\n\nclass Node : public NodeBase {\npublic:\n\tNode(const std::string& _vnx_value);\n\nprotected:\n\tvoid init() override;\n\n\tvoid main() override;\n\n\tstd::shared_ptr<const ChainParams> get_params() const override;\n\n\tstd::shared_ptr<const NetworkInfo> get_network_info() const override;\n\n\thash_t get_genesis_hash() const override;\n\n\tuint32_t get_height() const override;\n\n\tuint32_t get_vdf_height() const override;\n\n\thash_t get_vdf_peak() const override;\n\n\tvnx::optional<uint32_t> get_synced_height() const override;\n\n\tvnx::optional<uint32_t> get_synced_vdf_height() const override;\n\n\tstd::shared_ptr<const Block> get_block(const hash_t& hash) const override;\n\n\tstd::shared_ptr<const Block> get_block_at(const uint32_t& height) const override;\n\n\tstd::shared_ptr<const BlockHeader> get_header(const hash_t& hash) const override;\n\n\tstd::shared_ptr<const BlockHeader> get_header_at(const uint32_t& height) const override;\n\n\tvnx::optional<hash_t> get_block_hash(const uint32_t& height) const override;\n\n\tvnx::optional<std::pair<hash_t, hash_t>> get_block_hash_ex(const uint32_t& height) const override;\n\n\tvnx::optional<uint32_t> get_tx_height(const hash_t& id) const override;\n\n\tstd::vector<hash_t> get_tx_ids_at(const uint32_t& height) const override;\n\n\tstd::vector<hash_t> get_tx_ids_since(const uint32_t& height) const override;\n\n\tstd::vector<hash_t> get_tx_ids(const uint32_t& limit) const override;\n\n\tvnx::optional<tx_info_t> get_tx_info(const hash_t& id) const override;\n\n\tvnx::optional<tx_info_t> get_tx_info_for(std::shared_ptr<const Transaction> tx) const override;\n\n\tstd::shared_ptr<const Transaction> get_transaction(const hash_t& id, const bool& pending = false) const override;\n\n\tstd::vector<std::shared_ptr<const Transaction>> get_transactions(const std::vector<hash_t>& ids) const override;\n\n\tstd::vector<tx_entry_t> get_history(const std::vector<addr_t>& addresses, const query_filter_t& filter) const override;\n\n\tstd::vector<tx_entry_t> get_history_memo(const std::vector<addr_t>& addresses, const std::string& memo, const query_filter_t& filter) const override;\n\n\tstd::shared_ptr<const Contract> get_contract(const addr_t& address) const override;\n\n\tstd::shared_ptr<const Contract> get_contract_for(const addr_t& address) const override;\n\n\tstd::vector<std::shared_ptr<const Contract>> get_contracts(const std::vector<addr_t>& addresses) const override;\n\n\tstd::vector<addr_t> get_contracts_by(const std::vector<addr_t>& addresses, const vnx::optional<hash_t>& type_hash = nullptr) const override;\n\n\tstd::vector<addr_t> get_contracts_owned_by(const std::vector<addr_t>& addresses, const vnx::optional<hash_t>& type_hash = nullptr) const override;\n\n\texec_result_t validate(std::shared_ptr<const Transaction> tx) const override;\n\n\tvoid add_block(std::shared_ptr<const Block> block) override;\n\n\tvoid add_transaction(std::shared_ptr<const Transaction> tx, const vnx::bool_t& pre_validate = false) override;\n\n\tuint128 get_balance(const addr_t& address, const addr_t& currency) const override;\n\n\tuint128 get_total_balance(const std::vector<addr_t>& addresses, const addr_t& currency) const override;\n\n\tstd::map<addr_t, uint128> get_balances(const addr_t& address, const std::set<addr_t>& whitelist, const int32_t& limit) const override;\n\n\tstd::map<addr_t, balance_t> get_contract_balances(\n\t\t\tconst addr_t& address, const std::set<addr_t>& whitelist, const int32_t& limit) const override;\n\n\tstd::map<addr_t, uint128> get_total_balances(\n\t\t\tconst std::vector<addr_t>& addresses, const std::set<addr_t>& whitelist, const int32_t& limit) const override;\n\n\tstd::map<std::pair<addr_t, addr_t>, uint128> get_all_balances(\n\t\t\tconst std::vector<addr_t>& addresses, const std::set<addr_t>& whitelist, const int32_t& limit) const override;\n\n\tstd::vector<exec_entry_t> get_exec_history(const addr_t& address, const int32_t& limit, const vnx::bool_t& recent) const override;\n\n\tstd::map<std::string, vm::varptr_t> read_storage(const addr_t& contract, const uint32_t& height = -1) const override;\n\n\tstd::map<uint64_t, vm::varptr_t> dump_storage(const addr_t& contract, const uint32_t& height = -1) const override;\n\n\tvm::varptr_t read_storage_var(const addr_t& contract, const uint64_t& address, const uint32_t& height = -1) const override;\n\n\tvm::varptr_t read_storage_entry_var(const addr_t& contract, const uint64_t& address, const uint64_t& key, const uint32_t& height = -1) const override;\n\n\tstd::pair<vm::varptr_t, uint64_t> read_storage_field(const addr_t& contract, const std::string& name, const uint32_t& height = -1) const override;\n\n\tstd::tuple<vm::varptr_t, uint64_t, uint64_t> read_storage_entry_addr(\n\t\t\tconst addr_t& contract, const std::string& name, const addr_t& key, const uint32_t& height = -1) const override;\n\n\tstd::tuple<vm::varptr_t, uint64_t, uint64_t> read_storage_entry_string(\n\t\t\tconst addr_t& contract, const std::string& name, const std::string& key, const uint32_t& height = -1) const override;\n\n\tstd::vector<vm::varptr_t> read_storage_array(const addr_t& contract, const uint64_t& address, const uint32_t& height = -1) const override;\n\n\tstd::map<vm::varptr_t, vm::varptr_t> read_storage_map(const addr_t& contract, const uint64_t& address, const uint32_t& height = -1) const override;\n\n\tstd::map<std::string, vm::varptr_t> read_storage_object(const addr_t& contract, const uint64_t& address, const uint32_t& height = -1) const override;\n\n\tvnx::Variant call_contract(\tconst addr_t& address, const std::string& method, const std::vector<vnx::Variant>& args = {},\n\t\t\t\t\t\t\t\tconst vnx::optional<addr_t>& user = nullptr, const vnx::optional<std::pair<addr_t, uint128>>& deposit = nullptr) const override;\n\n\tuint128 get_total_supply(const addr_t& currency) const override;\n\n\tvnx::optional<plot_nft_info_t> get_plot_nft_info(const addr_t& address) const override;\n\n\taddr_t get_plot_nft_target(const addr_t& address, const vnx::optional<addr_t>& farmer_addr = nullptr) const override;\n\n\toffer_data_t get_offer(const addr_t& address) const override;\n\n\tstd::vector<offer_data_t> fetch_offers(const std::vector<addr_t>& addresses, const vnx::bool_t& state, const vnx::bool_t& closed = false) const override;\n\n\tstd::vector<offer_data_t> get_offers(const uint32_t& since, const vnx::bool_t& state) const override;\n\n\tstd::vector<offer_data_t> get_offers_by(const std::vector<addr_t>& owners, const vnx::bool_t& state) const override;\n\n\tstd::vector<offer_data_t> get_recent_offers(const int32_t& limit, const vnx::bool_t& state) const override;\n\n\tstd::vector<offer_data_t> get_recent_offers_for(\n\t\t\tconst vnx::optional<addr_t>& bid, const vnx::optional<addr_t>& ask, const uint128& min_bid,\n\t\t\tconst int32_t& limit, const vnx::bool_t& state) const override;\n\n\tstd::vector<trade_entry_t> get_trade_history(const int32_t& limit, const uint32_t& since = 0) const override;\n\n\tstd::vector<trade_entry_t> get_trade_history_for(\n\t\t\tconst vnx::optional<addr_t>& bid, const vnx::optional<addr_t>& ask, const int32_t& limit, const uint32_t& since = 0) const override;\n\n\tstd::vector<swap_info_t> get_swaps(\n\t\t\tconst uint32_t& since, const vnx::optional<addr_t>& token, const vnx::optional<addr_t>& currency, const int32_t& limit) const override;\n\n\tswap_info_t get_swap_info(const addr_t& address) const override;\n\n\tswap_user_info_t get_swap_user_info(const addr_t& address, const addr_t& user) const override;\n\n\tstd::vector<swap_entry_t> get_swap_history(const addr_t& address, const int32_t& limit) const override;\n\n\tstd::array<uint128, 2> get_swap_trade_estimate(const addr_t& address, const uint32_t& i, const uint128& amount, const int32_t& num_iter) const override;\n\n\tstd::array<uint128, 2> get_swap_fees_earned(const addr_t& address, const addr_t& user) const override;\n\n\tstd::array<uint128, 2> get_swap_equivalent_liquidity(const addr_t& address, const addr_t& user) const override;\n\n\tstd::map<addr_t, std::array<std::pair<addr_t, uint128>, 2>> get_swap_liquidity_by(const std::vector<addr_t>& addresses) const override;\n\n\tstd::vector<std::shared_ptr<const BlockHeader>> get_farmed_blocks(\n\t\t\tconst std::vector<pubkey_t>& farmer_keys, const vnx::bool_t& full_blocks, const uint32_t& since = 0, const int32_t& limit = -1) const override;\n\n\tfarmed_block_summary_t get_farmed_block_summary(const std::vector<pubkey_t>& farmer_keys, const uint32_t& since = 0) const override;\n\n\tstd::vector<std::pair<pubkey_t, uint32_t>> get_farmer_ranking(const int32_t& limit) const override;\n\n\tstd::tuple<pooling_error_e, std::string> verify_plot_nft_target(const addr_t& address, const addr_t& pool_target) const override;\n\n\tstd::tuple<pooling_error_e, std::string> verify_partial(\n\t\t\tstd::shared_ptr<const Partial> partial, const vnx::optional<addr_t>& pool_target) const override;\n\n\tvoid start_sync(const vnx::bool_t& force) override;\n\n\tvoid revert_sync(const uint32_t& height) override;\n\n\tvoid http_request_async(std::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\tconst vnx::request_id_t& request_id) const override;\n\n\tvoid http_request_chunk_async(\tstd::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\t\tconst int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& request_id) const override;\n\n\tvoid handle(std::shared_ptr<const Block> value) override;\n\n\tvoid handle(std::shared_ptr<const Transaction> tx) override;\n\n\tvoid handle(std::shared_ptr<const ProofOfTime> proof) override;\n\n\tvoid handle(std::shared_ptr<const ProofResponse> value) override;\n\n\tvoid handle(std::shared_ptr<const VDF_Point> value) override;\n\n\tvoid handle(std::shared_ptr<const ValidatorVote> value) override;\n\n\tstd::shared_ptr<vnx::Value> vnx_call_switch(std::shared_ptr<const vnx::Value> method, const vnx::request_id_t& request_id) override;\n\nprivate:\n\tstruct waitcond_t {\n\t\tstd::mutex mutex;\n\t\tstd::condition_variable signal;\n\t\tbool do_wait = true;\n\t};\n\n\tstruct execution_context_t {\n\t\tbool do_profile = false;\n\t\tbool do_trace = false;\n\t\tuint32_t height = 0;\n\t\tstd::shared_ptr<vm::StorageCache> storage;\n\t\tstd::unordered_map<addr_t, std::vector<hash_t>> mutate_map;\t\t\t\t// [contract => TX ids]\n\t\tstd::unordered_map<hash_t, std::unordered_set<hash_t>> wait_map;\t\t// [TX id => TX ids]\n\t\tstd::unordered_map<hash_t, std::shared_ptr<waitcond_t>> signal_map;\t\t// [TX id => condition]\n\t\tvoid wait(const hash_t& txid) const;\n\t\tvoid signal(const hash_t& txid) const;\n\t\tvoid setup_wait(const hash_t& txid, const addr_t& address);\n\t};\n\n\tstruct fork_t {\n\t\tbool is_invalid = false;\n\t\tbool is_validated = false;\n\t\tbool is_connected = false;\n\t\tbool is_vdf_verified = false;\n\t\tbool is_proof_verified = false;\n\t\tbool is_all_proof_verified = false;\n\t\tint64_t recv_time_ms = 0;\t\t\t\t\t// [ms]\n\t\tuint32_t votes = 0;\t\t\t\t\t\t// validator votes\n\t\tuint32_t total_votes = 0;\n\t\tuint32_t fork_length = 0;\n\t\tstd::weak_ptr<fork_t> prev;\n\t\tstd::shared_ptr<const Block> block;\n\t\tstd::shared_ptr<const BlockHeader> root;\n\t\tstd::map<pubkey_t, bool> validators;\n\t\tstd::vector<std::shared_ptr<const VDF_Point>> vdf_points;\n\t\tstd::shared_ptr<const execution_context_t> context;\n\t};\n\n\tstruct tx_map_t {\n\t\tuint32_t height = -1;\n\t\tstd::shared_ptr<const Transaction> tx;\n\t};\n\n\tstruct tx_pool_t {\n\t\tbool is_valid = false;\n\t\tbool is_skipped = false;\n\t\tuint32_t cost = 0;\n\t\tuint32_t fee = 0;\n\t\tuint32_t luck = 0;\t// random value\n\t\tstd::shared_ptr<const Transaction> tx;\n\t};\n\n\tstruct proof_data_t {\n\t\thash_t hash;\n\t\tvnx::Hash64 farmer_mac;\n\t\tstd::shared_ptr<const ProofOfSpace> proof;\n\t};\n\n\tvoid update();\n\tvoid init_chain();\n\tvoid trigger_update();\n\tvoid update_control();\n\n\tvoid verify_vdfs();\n\tvoid verify_votes();\n\tvoid verify_proofs();\n\tvoid verify_block_proofs();\n\n\tvoid print_stats();\n\n\tvoid add_fork(std::shared_ptr<fork_t> fork);\n\n\tbool tx_pool_update(const tx_pool_t& entry, const bool force_add = false);\n\n\tvoid tx_pool_erase(const hash_t& txid);\n\n\tvoid purge_tx_pool();\n\n\tvoid validate_new();\n\n\tvoid on_sync_done(const uint32_t height);\n\n\tvoid on_stuck_timeout();\n\n\tstd::vector<tx_pool_t> validate_for_block(const int64_t deadline_ms);\n\n\tstd::shared_ptr<const Block> make_block(\n\t\t\tstd::shared_ptr<const BlockHeader> prev,\n\t\t\tstd::vector<std::shared_ptr<const VDF_Point>> vdf_points, const hash_t& challenge);\n\n\tint get_offer_state(const addr_t& address) const;\n\n\ttrade_entry_t make_trade_entry(const uint32_t& height, const trade_log_t& log) const;\n\n\tstd::tuple<vm::varptr_t, uint64_t, uint64_t> read_storage_entry_var(\n\t\t\tconst addr_t& contract, const std::string& name, const vm::varptr_t& key, const uint32_t& height = -1) const;\n\n\tvoid sync_more();\n\n\tvoid sync_height(const uint32_t& height);\n\n\tvoid sync_result(const uint32_t& height, const std::vector<std::shared_ptr<const Block>>& blocks);\n\n\tvoid fetch_block(const hash_t& hash);\n\n\tvoid fetch_result(const hash_t& hash, std::shared_ptr<const Block> block);\n\n\tstd::shared_ptr<const BlockHeader> fork_to(const hash_t& state);\n\n\tstd::shared_ptr<const BlockHeader> fork_to(std::shared_ptr<fork_t> fork_head);\n\n\tstd::shared_ptr<fork_t> find_best_fork() const;\n\n\tstd::vector<std::shared_ptr<fork_t>> get_fork_line(std::shared_ptr<fork_t> fork_head = nullptr) const;\n\n\tvoid vote_for_block(std::shared_ptr<fork_t> fork);\n\n\tstd::shared_ptr<execution_context_t> validate(std::shared_ptr<const Block> block) const;\n\n\tstd::shared_ptr<execution_context_t> new_exec_context(const uint32_t height) const;\n\n\tvoid prepare_context(std::shared_ptr<execution_context_t> context, std::shared_ptr<const Transaction> tx) const;\n\n\tvoid execute(\tstd::shared_ptr<const Transaction> tx,\n\t\t\t\t\tstd::shared_ptr<const execution_context_t> context,\n\t\t\t\t\tstd::shared_ptr<const operation::Execute> op,\n\t\t\t\t\tstd::shared_ptr<const Contract> contract,\n\t\t\t\t\tconst addr_t& address,\n\t\t\t\t\tstd::vector<txout_t>& exec_outputs,\n\t\t\t\t\tstd::map<std::pair<addr_t, addr_t>, uint128>& exec_spend_map,\n\t\t\t\t\tstd::shared_ptr<vm::StorageCache> storage_cache,\n\t\t\t\t\tuint64_t& tx_cost, exec_error_t& error, const bool is_init) const;\n\n\tvoid execute(\tstd::shared_ptr<const Transaction> tx,\n\t\t\t\t\tstd::shared_ptr<const execution_context_t> context,\n\t\t\t\t\tstd::shared_ptr<const contract::Executable> executable,\n\t\t\t\t\tstd::vector<txout_t>& exec_outputs,\n\t\t\t\t\tstd::map<std::pair<addr_t, addr_t>, uint128>& exec_spend_map,\n\t\t\t\t\tstd::shared_ptr<vm::StorageCache> storage_cache,\n\t\t\t\t\tstd::shared_ptr<vm::Engine> engine,\n\t\t\t\t\tconst std::string& method_name,\n\t\t\t\t\texec_error_t& error, const bool is_init) const;\n\n\tstd::shared_ptr<const exec_result_t> validate(\n\t\t\tstd::shared_ptr<const Transaction> tx, std::shared_ptr<const execution_context_t> context) const;\n\n\tvoid validate_diff_adjust(const uint64_t& block, const uint64_t& prev) const;\n\n\tvoid commit(std::shared_ptr<const Block> block);\n\n\tvoid update_farmer_ranking();\n\n\tvoid add_proof(std::shared_ptr<const ProofOfSpace> proof, const uint32_t vdf_height, const vnx::Hash64 farmer_mac);\n\n\tvoid verify(std::shared_ptr<const ProofResponse> value) const;\n\n\tvoid verify_proof(std::shared_ptr<const BlockHeader> block) const;\n\n\ttemplate<typename T>\n\tvoid verify_proof_impl(std::shared_ptr<const T> proof, const hash_t& challenge, const uint64_t space_diff, const uint32_t& vdf_height) const;\n\n\tvoid verify_proof(std::shared_ptr<const ProofOfSpace> proof, const hash_t& challenge, const uint64_t space_diff, const uint32_t& vdf_height) const;\n\n\tvoid verify_vdf(std::shared_ptr<const ProofOfTime> proof, const int64_t recv_time);\n\n\tvoid verify_vdf_cpu(std::shared_ptr<const ProofOfTime> proof) const;\n\n\tvoid verify_vdf_success(std::shared_ptr<const VDF_Point> point, const int64_t took_ms);\n\n\tvoid verify_vdf_task(std::shared_ptr<const ProofOfTime> proof, const int64_t recv_time) noexcept;\n\n\tsize_t prefetch_balances(const std::set<std::pair<addr_t, addr_t>>& keys) const;\n\n\tvoid apply(\tstd::shared_ptr<const Block> block,\n\t\t\t\tstd::shared_ptr<const execution_context_t> context);\n\n\tvoid apply(\tstd::shared_ptr<const Block> block,\n\t\t\t\tstd::shared_ptr<const Transaction> tx,\n\t\t\t\tuint32_t& counter);\n\n\tvoid revert(const uint32_t height);\n\n\tvoid reset();\n\n\tstd::shared_ptr<const BlockHeader> get_root() const;\n\n\tstd::shared_ptr<const BlockHeader> get_peak() const;\n\n\tstd::shared_ptr<const BlockHeader> get_block_ex(const hash_t& hash, bool full_block) const;\n\n\tstd::shared_ptr<const BlockHeader> get_block_at_ex(const uint32_t& height, bool full_block) const;\n\n\tstd::shared_ptr<fork_t> find_fork(const hash_t& hash) const;\n\n\tstd::shared_ptr<fork_t> find_prev_fork(std::shared_ptr<fork_t> fork, const size_t distance = 1) const;\n\n\tstd::shared_ptr<const BlockHeader> find_prev(\n\t\t\tstd::shared_ptr<const BlockHeader> block, const size_t distance = 1, bool clamped = false) const;\n\n\tbool find_challenge(std::shared_ptr<const BlockHeader> block, const uint32_t offset, hash_t& challenge, uint64_t& space_diff) const;\n\n\tbool find_challenge(const uint32_t vdf_height, hash_t& challenge, uint64_t& space_diff) const;\n\n\thash_t get_challenge(std::shared_ptr<const BlockHeader> block, const uint32_t offset, uint64_t& space_diff) const;\n\n\tuint64_t get_time_diff(std::shared_ptr<const BlockHeader> infused) const;\n\n\tbool find_infusion(std::shared_ptr<const BlockHeader> block, const uint32_t offset, hash_t& value, uint64_t& num_iters) const;\n\n\thash_t get_infusion(std::shared_ptr<const BlockHeader> block, const uint32_t offset, uint64_t& num_iters) const;\n\n\tstd::shared_ptr<const VDF_Point> find_vdf_point(const hash_t& input, const hash_t& output) const;\n\n\tstd::vector<std::shared_ptr<const VDF_Point>> find_vdf_points(std::shared_ptr<const BlockHeader> block) const;\n\n\tstd::vector<std::shared_ptr<const VDF_Point>> find_next_vdf_points(std::shared_ptr<const BlockHeader> block) const;\n\n\tstd::pair<uint32_t, hash_t> get_vdf_peak_ex() const;\n\n\tstd::set<pubkey_t> get_validators(std::shared_ptr<const BlockHeader> block) const;\n\n\tstd::vector<addr_t> get_all_depends(std::shared_ptr<const contract::Executable> exec) const;\n\n\tstd::vector<addr_t> get_all_depends(const addr_t& address, const uint32_t depth) const;\n\n\tvnx::optional<proof_data_t> find_best_proof(const hash_t& challenge) const;\n\n\tuint64_t calc_block_reward(std::shared_ptr<const BlockHeader> block, const uint64_t total_fees) const;\n\n\tvnx::optional<addr_t> get_vdf_reward_winner(std::shared_ptr<const BlockHeader> block) const;\n\n\tstd::shared_ptr<const BlockHeader> read_block(\n\t\t\tvnx::File& file, bool full_block = true,\n\t\t\tstd::vector<int64_t>* tx_offsets = nullptr) const;\n\n\tvoid write_block(std::shared_ptr<const Block> block, const bool is_main = true);\n\n\ttemplate<typename T>\n\tstd::shared_ptr<const T> get_contract_as(const addr_t& address, uint64_t* read_cost = nullptr, const uint64_t gas_limit = 0) const;\n\n\tstd::shared_ptr<const Contract> get_contract_ex(const addr_t& address, uint64_t* read_cost = nullptr, const uint64_t gas_limit = 0) const;\n\n\tstd::shared_ptr<const Contract> get_contract_for_ex(const addr_t& address, uint64_t* read_cost = nullptr, const uint64_t gas_limit = 0) const;\n\n\tvoid async_api_call(std::shared_ptr<const vnx::Value> method, const vnx::request_id_t& request_id);\n\n\tvoid test_all();\n\n\tstd::shared_ptr<Block> create_test_block(std::shared_ptr<const BlockHeader> prev, const bool valid = true);\n\n\tstd::shared_ptr<fork_t> create_test_fork(std::shared_ptr<const BlockHeader> prev, const bool valid = true);\n\nprivate:\n\thash_t state_hash;\n\tstd::shared_ptr<DataBase> db;\n\tstd::shared_ptr<DataBase> db_blocks;\n\n\thash_uint_uint_table<addr_t, uint32_t, uint32_t, txio_entry_t> txio_log;\t// [[address, height, counter] => entry]\n\thash_uint_uint_table<addr_t, uint32_t, uint32_t, exec_entry_t> exec_log;\t// [[address, height, counter] => entry]\n\thash_uint_uint_table<hash_t, uint32_t, uint32_t, addr_t> memo_log;\t\t\t// [[hash(address | memo), height, counter] => address]\n\n\thash_table<addr_t, std::vector<addr_t>> contract_depends;\t\t\t\t\t// [address => depends]\n\thash_table<addr_t, std::shared_ptr<const Contract>> contract_map;\t\t\t// [address => contract]\n\thash_uint_uint_table<hash_t, uint32_t, uint32_t, addr_t> contract_log;\t\t// [[type hash, height, counter] => contract]\n\thash_uint_uint_table<addr_t, uint32_t, uint32_t, std::pair<addr_t, hash_t>> deploy_map;\t// [[sender, height, counter] => [contract, type]]\n\thash_uint_uint_table<addr_t, uint32_t, uint32_t, std::pair<addr_t, hash_t>> owner_map;\t// [[owner, height, counter] => [contract, type]]\n\n\thash_uint_uint_table<hash_t, uint32_t, uint32_t, addr_t> swap_index;\t\t\t// [[hash(bid, ask), height, counter] => contract]\n\thash_uint_uint_table<hash_t, uint32_t, uint32_t, addr_t> offer_index;\t\t\t// [[hash(bid, ask), height, counter] => contract]\n\thash_uint_uint_table<hash_t, uint32_t, uint32_t, bool> trade_index;\t\t\t\t// [hash(bid, ask), height, counter]\n\tuint_uint_table<uint32_t, uint32_t, trade_log_t> trade_log;\t\t\t\t\t\t// [[height, counter] => info]\n\n\tbalance_table_t<uint128> balance_table;\t\t\t\t\t\t\t\t\t\t// [[address, currency] => balance]\n\tbalance_table_t<std::array<uint128, 2>> swap_liquid_map;\t\t\t\t\t// [[address, swap] => [amount, amount]]\n\thash_table<addr_t, uint128> total_supply_map;\t\t\t\t\t\t\t\t// [currency => supply]\n\n\tstd::unordered_map<hash_t, tx_pool_t> tx_pool;\t\t\t\t\t\t\t\t\t// [txid => transaction] (non-executed only)\n\tstd::unordered_map<addr_t, uint64_t> tx_pool_fees;\t\t\t\t\t\t\t\t// [address => total pending fees]\n\tstd::map<std::pair<hash_t, hash_t>, std::shared_ptr<const Transaction>> tx_pool_index;\t\t// [[key, txid] => tx]\n\tstd::unordered_map<hash_t, std::shared_ptr<fork_t>> fork_tree;\t\t\t\t\t// [block hash => fork] (pending only)\n\tstd::multimap<uint32_t, std::shared_ptr<fork_t>> fork_index;\t\t\t\t\t// [height => fork] (pending only)\n\tstd::unordered_map<hash_t, std::shared_ptr<const BlockHeader>> history;\t\t\t// cache [hash => block header]\n\tstd::multimap<uint32_t, hash_t> history_log;\t\t\t\t\t\t\t\t\t// [height => hash]\n\n\tstd::multimap<hash_t, std::shared_ptr<const VDF_Point>> vdf_tree;\t\t\t\t// [output => proof]\n\tstd::multimap<uint64_t, std::shared_ptr<const VDF_Point>> vdf_index;\t\t\t// [iters => proof]\n\n\tstd::shared_ptr<const BlockHeader> root;\t\t\t\t\t\t\t\t\t\t// root for heaviest chain\n\n\tstd::multimap<uint32_t, hash_t> challenge_map;\t\t\t\t\t\t\t\t\t// [vdf height => challenge]\n\tstd::unordered_map<hash_t, std::vector<proof_data_t>> proof_map;\t\t\t\t// [challenge => sorted proofs]\n\tstd::unordered_map<hash_t, hash_t> created_blocks;\t\t\t\t\t\t\t\t// [proof hash => block hash]\n\tstd::unordered_map<hash_t, std::pair<hash_t, int64_t>> voted_blocks;\t\t\t// [prev => [block hash, time ms]]\n\tstd::map<pubkey_t, vnx::Hash64> farmer_keys;\t\t\t\t\t\t\t\t\t// [key => farmer_mac] our farmer keys\n\n\tstd::string node_version;\n\tstd::string node_commit;\n\n\tbool is_synced = false;\n\tbool update_pending = false;\n\tuint32_t min_pool_fee_ratio = 0;\n\tuint64_t mmx_address_count = 0;\n\n\tstd::shared_ptr<vnx::File> blocks;\n\tstd::shared_ptr<vm::StorageDB> storage;\n\n\thash_table<hash_t, block_index_t> block_index;\t\t\t\t\t\t\t\t// [hash => index] (no revert)\n\tuint_multi_table<uint32_t, hash_t> height_index;\t\t\t\t\t\t\t// [height => hash] (no revert)\n\n\tuint_table<uint32_t, hash_t> height_map;\t\t\t\t\t\t\t\t\t// [height => hash]\n\tuint_table<uint32_t, std::vector<hash_t>> tx_log;\t\t\t\t\t\t\t// [height => txids]\n\thash_table<hash_t, tx_index_t> tx_index;\t\t\t\t\t\t\t\t\t// [txid => index]\n\thash_uint_table<pubkey_t, uint32_t, farmed_block_info_t> farmer_block_map;\t// [[farmer key, height] => info]\n\n\tstd::vector<std::pair<pubkey_t, uint32_t>> farmer_ranking;\t\t\t\t\t// sorted by count DSC [farmer key => num blocks]\n\n\tuint32_t sync_pos = 0;\t\t\t\t\t\t\t\t\t// current sync height\n\tuint32_t sync_start = 0;\t\t\t\t\t\t\t\t// sync start height\n\tuint32_t sync_retry = 0;\n\tuint32_t synced_since = 0;\t\t\t\t\t\t\t\t// height of last sync done\n\tint64_t sync_finish_ms = 0;\t\t\t\t\t\t\t\t// when peak was reached\n\tdouble max_sync_pending = 0;\n\tstd::set<uint32_t> sync_pending;\t\t\t\t\t\t// set of heights\n\tvnx::optional<uint32_t> sync_peak;\t\t\t\t\t\t// max height we can sync\n\tstd::unordered_set<hash_t> fetch_pending;\t\t\t\t// block hash\n\n\tstd::vector<std::pair<std::shared_ptr<const ProofResponse>, int64_t>> proof_queue;\t\t// [data, recv_time_ms]\n\tstd::vector<std::pair<std::shared_ptr<const ProofOfTime>, int64_t>> vdf_queue;\t\t\t// [data, recv_time_ms]\n\tstd::vector<std::pair<std::shared_ptr<const ValidatorVote>, int64_t>> vote_queue;\t\t// [data, recv_time_ms]\n\tstd::unordered_set<hash_t> vdf_verify_pending;\t\t\t\t\t\t\t\t// [proof hash]\n\tstd::map<pubkey_t, int64_t> timelord_trust;\t\t\t\t\t\t\t\t\t// [timelord key => trust]\n\tstd::unordered_map<hash_t, std::shared_ptr<const Transaction>> tx_queue;\t// [content_hash => tx]\n\n\tstd::shared_mutex db_mutex;\t\t\t\t\t\t\t\t// covers DB as well as history\n\tstd::shared_ptr<vnx::ThreadPool> threads;\n\tstd::shared_ptr<vnx::ThreadPool> api_threads;\t\t\t// executed under shared db_mutex lock\n\tstd::shared_ptr<vnx::Timer> stuck_timer;\n\tstd::shared_ptr<vnx::Timer> update_timer;\n\n\tmutable std::mutex mutex;\t\t\t\t\t\t\t\t// network + contract_cache + tx_pool_index\n\tmutable std::shared_ptr<const NetworkInfo> network;\n\tmutable std::unordered_map<addr_t, std::shared_ptr<const Contract>> contract_cache;\n\n\tstd::shared_ptr<const ChainParams> params;\n\tstd::shared_ptr<RouterAsyncClient> router;\n\tstd::shared_ptr<vnx::addons::HttpInterface<Node>> http;\n\n\tstd::mutex vdf_mutex;\n\tstd::condition_variable vdf_signal;\n\tstd::vector<std::shared_ptr<OCL_VDF>> opencl_vdf;\n\tstd::shared_ptr<vnx::ThreadPool> vdf_threads;\n\tbool opencl_vdf_enable = false;\n\n\tstd::mutex fetch_mutex;\n\tint reward_vote = 0;\n\tstd::set<std::string> pending_fetch;\n\tstd::shared_ptr<vnx::ThreadPool> fetch_threads;\n\n\tfriend class vnx::addons::HttpInterface<Node>;\n\n};\n\n\ntemplate<typename T>\nstd::shared_ptr<const T> Node::get_contract_as(const addr_t& address, uint64_t* read_cost, const uint64_t gas_limit) const\n{\n\treturn std::dynamic_pointer_cast<const T>(get_contract_ex(address, read_cost, gas_limit));\n}\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_NODE_H_ */\n"
  },
  {
    "path": "include/mmx/OCL_VDF.h",
    "content": "/*\n * OCL_VDF.h\n *\n *  Created on: Dec 23, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_OCL_VDF_H_\n#define INCLUDE_MMX_OCL_VDF_H_\n\n#include <mmx/ProofOfTime.hxx>\n\n#ifdef WITH_OPENCL\n#include <automy/basic_opencl/Context.h>\n#include <automy/basic_opencl/Program.h>\n#include <automy/basic_opencl/Kernel.h>\n#include <automy/basic_opencl/Buffer1D.h>\n#else\ntypedef void* cl_context;\ntypedef void* cl_device_id;\ntypedef void* cl_platform_id;\n#endif\n\nnamespace mmx {\n\nclass OCL_VDF {\npublic:\n\tOCL_VDF(cl_context context, cl_device_id device);\n\n\tvoid compute(std::shared_ptr<const ProofOfTime> proof);\n\n\tvoid verify(std::shared_ptr<const ProofOfTime> proof);\n\n\tstatic void release();\n\nprivate:\n#ifdef WITH_OPENCL\n\tusing Kernel = automy::basic_opencl::Kernel;\n\tusing Program = automy::basic_opencl::Program;\n\tusing CommandQueue = automy::basic_opencl::CommandQueue;\n\n\ttemplate<typename T>\n\tusing Buffer1D = automy::basic_opencl::Buffer1D<T>;\n\n\tcl_context context = nullptr;\n\n\tsize_t width = 0;\n\tstd::vector<uint8_t> hash;\n\tstd::vector<uint32_t> num_iters;\n\n\tBuffer1D<uint8_t> hash_buf;\n\tBuffer1D<uint32_t> num_iters_buf;\n\n\tstd::shared_ptr<Kernel> kernel;\n\tstd::shared_ptr<CommandQueue> queue;\n\n\tstatic std::mutex g_mutex;\n\tstatic std::shared_ptr<Program> g_program;\n#endif\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_OCL_VDF_H_ */\n"
  },
  {
    "path": "include/mmx/ProofServer.h",
    "content": "/*\n * ProofServer.h\n *\n *  Created on: May 13, 2025\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_PROOFSERVER_H_\n#define INCLUDE_MMX_PROOFSERVER_H_\n\n#include <mmx/ProofServerBase.hxx>\n\n#include <vnx/ThreadPool.h>\n\n\nnamespace mmx {\n\nclass ProofServer : public ProofServerBase {\npublic:\n\tProofServer(const std::string& _vnx_name);\n\nprotected:\n\tvoid init() override;\n\n\tvoid main() override;\n\n\tvoid compute_async(\n\t\t\tconst std::vector<uint32_t>& X_values,\n\t\t\tconst hash_t& id, const int32_t& ksize, const int32_t& xbits, const vnx::request_id_t& request_id) const;\n\nprivate:\n\tstd::shared_ptr<vnx::ThreadPool> threads;\n\n\tmutable uint32_t num_requests = 0;\n\tmutable std::map<std::pair<int, int>, uint32_t> request_map;\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_PROOFSERVER_H_ */\n"
  },
  {
    "path": "include/mmx/Qt_GUI.h",
    "content": "/*\n * Qt_GUI.h\n *\n *  Created on: Jan 22, 2025\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_QT_GUI_H_\n#define INCLUDE_MMX_QT_GUI_H_\n\n#include <string>\n\n\nvoid qt_gui_exec(char** argv, std::string host, std::string api_token, std::string api_token_header);\n\n\n\n#endif /* INCLUDE_MMX_QT_GUI_H_ */\n"
  },
  {
    "path": "include/mmx/Router.h",
    "content": "/*\n * Router.h\n *\n *  Created on: Dec 17, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_ROUTER_H_\n#define INCLUDE_MMX_ROUTER_H_\n\n#include <mmx/RouterBase.hxx>\n#include <mmx/ReceiveNote.hxx>\n#include <mmx/NodeAsyncClient.hxx>\n#include <upnp_mapper.h>\n\n#include <vnx/Buffer.hpp>\n#include <vnx/Input.hpp>\n#include <vnx/Output.hpp>\n#include <vnx/ThreadPool.h>\n\n#include <vnx/addons/HttpInterface.h>\n\n#include <random>\n\n\nnamespace mmx {\n\nclass Router : public RouterBase {\npublic:\n\tRouter(const std::string& _vnx_name);\n\nprotected:\n\tvoid init() override;\n\n\tvoid main() override;\n\n\tvoid discover() override;\n\n\thash_t get_id() const override;\n\n\tnode_info_t get_info() const override;\n\n\tstd::pair<pubkey_t, signature_t> sign_msg(const hash_t& msg) const override;\n\n\tstd::vector<std::string> get_peers(const uint32_t& max_count) const override;\n\n\tstd::vector<std::string> get_known_peers() const override;\n\n\tstd::vector<std::string> get_connected_peers() const override;\n\n\tstd::shared_ptr<const PeerInfo> get_peer_info() const override;\n\n\tvoid kick_peer(const std::string& address) override;\n\n\tvoid get_blocks_at_async(const uint32_t& height, const vnx::request_id_t& request_id) const override;\n\n\tvoid fetch_block_async(const hash_t& hash, const vnx::optional<std::string>& address, const vnx::request_id_t& request_id) const override;\n\n\tvoid fetch_block_at_async(const uint32_t& height, const std::string& address, const vnx::request_id_t& request_id) const override;\n\n\tvoid http_request_async(std::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\tconst vnx::request_id_t& request_id) const override;\n\n\tvoid http_request_chunk_async(\tstd::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\t\tconst int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& request_id) const override;\n\n\tvoid handle(std::shared_ptr<const Block> value) override;\n\n\tvoid handle(std::shared_ptr<const Transaction> value) override;\n\n\tvoid handle(std::shared_ptr<const ProofOfTime> value) override;\n\n\tvoid handle(std::shared_ptr<const ProofResponse> value) override;\n\n\tvoid handle(std::shared_ptr<const VDF_Point> value) override;\n\n\tvoid handle(std::shared_ptr<const ValidatorVote> value) override;\n\nprivate:\n\tstruct send_item_t {\n\t\tbool reliable = false;\n\t\thash_t hash;\n\t\tstd::shared_ptr<const vnx::Value> value;\n\t};\n\n\tstruct peer_t : Super::peer_t {\n\t\tbool is_valid = true;\n\t\tbool is_synced = false;\n\t\tbool is_paused = false;\n\t\tbool is_blocked = false;\n\t\tbool is_outbound = false;\n\t\tuint32_t height = 0;\n\t\tint32_t ping_ms = 0;\n\t\tint64_t last_receive_ms = 0;\n\t\tint64_t connected_since_ms = 0;\n\t\tdouble pending_cost = 0;\n\t\tnode_info_t info;\n\t\thash_t challenge;\n\t\tstd::string address;\n\t\tstd::string host_name;\n\t\tvnx::optional<hash_t> node_id;\n\t\tstd::queue<hash_t> hash_queue;\n\t\tstd::unordered_set<hash_t> sent_hashes;\n\t\tstd::map<int64_t, send_item_t> send_queue;\n\t\tstd::unordered_map<hash_t, double> pending_map;\n\t};\n\n\tstruct sync_job_t {\n\t\tbool is_done = false;\n\t\tuint32_t height = 0;\n\t\tuint32_t num_fetch = 0;\n\t\tint64_t start_time_ms = 0;\n\t\tint64_t last_recv_ms = 0;\n\t\tstd::unordered_set<uint64_t> failed;\n\t\tstd::unordered_set<uint64_t> pending;\n\t\tstd::unordered_set<uint64_t> succeeded;\n\t\tstd::unordered_map<uint64_t, std::pair<hash_t, hash_t>> got_hash;\t// [client, [block hash, content hash]]\n\t\tstd::unordered_map<uint32_t, uint64_t> request_map;\t\t\t\t\t// [request id, client]\n\t\tstd::unordered_map<hash_t, int64_t> pending_blocks;\t\t\t\t\t// [content hash, timeout]\n\t\tstd::unordered_map<hash_t, std::shared_ptr<const Block>> blocks;\t// [content hash, block]\n\t};\n\n\tstruct fetch_job_t {\n\t\tbool is_done = false;\n\t\tvnx::optional<hash_t> hash;\n\t\tvnx::optional<uint32_t> height;\n\t\tvnx::optional<std::string> from_peer;\n\t\tstd::function<void(std::shared_ptr<const Block>)> callback;\n\t\tint64_t start_time_ms = 0;\n\t\tint64_t last_recv_ms = 0;\n\t\tstd::unordered_set<uint64_t> failed;\n\t\tstd::unordered_set<uint64_t> pending;\n\t\tstd::unordered_map<uint32_t, uint64_t> request_map;\t\t\t\t// [request id, client]\n\t};\n\n\tvoid send();\n\n\tvoid update();\n\n\tbool process(std::shared_ptr<const Return> ret = nullptr);\n\n\tvoid connect();\n\n\tvoid query();\n\n\tvoid save_data();\n\n\tvoid ban_peer(uint64_t client, const std::string& reason);\n\n\tvoid connect_to(const std::string& address);\n\n\tvoid print_stats() override;\n\n\tuint32_t send_request(std::shared_ptr<peer_t> peer, std::shared_ptr<const vnx::Value> method, bool reliable = true);\n\n\tuint32_t send_request(uint64_t client, std::shared_ptr<const vnx::Value> method, bool reliable = true);\n\n\tvoid on_vdf(uint64_t client, std::shared_ptr<const ProofOfTime> proof);\n\n\tvoid on_vdf_point(uint64_t client, std::shared_ptr<const VDF_Point> value);\n\n\tvoid on_block(uint64_t client, std::shared_ptr<const Block> block);\n\n\tvoid on_vote(uint64_t client, std::shared_ptr<const ValidatorVote> value);\n\n\tvoid on_proof(uint64_t client, std::shared_ptr<const ProofResponse> response);\n\n\tvoid on_transaction(uint64_t client, std::shared_ptr<const Transaction> tx);\n\n\tvoid on_recv_note(uint64_t client, std::shared_ptr<const ReceiveNote> note);\n\n\tvoid recv_notify(const hash_t& msg_hash);\n\n\tvoid relay(std::shared_ptr<const vnx::Value> msg, const hash_t& msg_hash, const std::set<node_type_e>& filter);\n\n\tvoid broadcast(\tstd::shared_ptr<const vnx::Value> msg, const hash_t& msg_hash, const std::set<node_type_e>& filter,\n\t\t\t\t\tbool reliable, bool synced_only = false);\n\n\tvoid send_to(std::vector<std::shared_ptr<peer_t>> peers, std::shared_ptr<const vnx::Value> msg, const hash_t& msg_hash, bool reliable);\n\n\tbool send_to(uint64_t client, std::shared_ptr<const vnx::Value> msg, bool reliable = true);\n\n\tbool send_to(std::shared_ptr<peer_t> peer, std::shared_ptr<const vnx::Value> msg, bool reliable = true);\n\n\tvoid send_all(std::shared_ptr<const vnx::Value> msg, const std::set<node_type_e>& filter, bool reliable = true);\n\n\ttemplate<typename R, typename T>\n\tvoid send_result(uint64_t client, uint32_t id, const T& value);\n\n\tvoid on_error(uint64_t client, uint32_t id, const vnx::exception& ex);\n\n\tvoid on_request(uint64_t client, std::shared_ptr<const Request> msg);\n\n\tvoid on_return(uint64_t client, std::shared_ptr<const Return> msg);\n\n\tvoid on_msg(uint64_t client, std::shared_ptr<const vnx::Value> msg) override;\n\n\tvoid on_pause(uint64_t client) override;\n\n\tvoid on_resume(uint64_t client) override;\n\n\tvoid on_connect(uint64_t client, const std::string& address) override;\n\n\tvoid on_disconnect(uint64_t client, const std::string& address) override;\n\n\tstd::shared_ptr<Super::peer_t> get_peer_base(uint64_t client) const override;\n\n\tstd::shared_ptr<peer_t> get_peer(uint64_t client) const;\n\n\tstd::shared_ptr<peer_t> find_peer(uint64_t client) const;\n\n\tstd::vector<std::shared_ptr<peer_t>> find_peers(const std::string& address) const;\n\n\tstd::string resolve(const std::string& host_name);\n\n\tbool relay_msg_hash(const hash_t& hash);\n\n\tbool receive_msg_hash(const hash_t& hash, uint64_t client);\n\nprivate:\n\tbool is_connected = false;\n\n\thash_t node_id;\n\tskey_t node_skey;\n\tpubkey_t node_key;\n\tstd::set<std::string> peer_set;\n\tstd::set<std::string> self_addrs;\n\tstd::map<std::string, std::string> host_map;\t\t// [hostname => IP address]\n\tstd::map<std::string, int64_t> peer_retry_map;\t\t// [address => when to try again [sec]]\n\tstd::map<std::string, uint64_t> connect_tasks;\n\tstd::multimap<uint32_t, std::shared_ptr<const ProofOfTime>> vdf_history;\t\t// [vdf_height => proof]\n\n\tstd::set<uint64_t> synced_peers;\n\tstd::unordered_map<uint64_t, std::shared_ptr<peer_t>> peer_map;\n\tstd::multimap<std::string, std::shared_ptr<peer_t>> peer_addr_map;\n\n\tstruct hash_info_t {\n\t\tbool did_relay = false;\n\t};\n\n\tstd::queue<hash_t> hash_queue;\n\tstd::unordered_map<hash_t, hash_info_t> hash_info;\n\n\tstd::map<uint32_t, std::set<pubkey_t>> farmer_credit;\n\tstd::map<pubkey_t, uint32_t> timelord_credit;\n\tstd::set<pubkey_t> our_timelords;\n\n\tdouble tx_upload_credits = 0;\n\tdouble tx_upload_bandwidth = 0;\n\tdouble max_pending_cost_value = 0;\n\n\tmutable std::unordered_map<vnx::request_id_t, std::shared_ptr<sync_job_t>> sync_jobs;\n\tmutable std::unordered_map<vnx::request_id_t, std::shared_ptr<fetch_job_t>> fetch_jobs;\n\n\tstruct {\n\t\tuint32_t height = -1;\n\t\tuint32_t request_id = 0;\n\t\thash_t our_hash;\n\t} peer_check;\n\n\tstd::shared_ptr<NodeAsyncClient> node;\n\tstd::shared_ptr<const ChainParams> params;\n\n\tmutable std::default_random_engine rand_engine;\n\n\tuint32_t next_request_id = 0;\n\tuint32_t verified_vdf_height = 0;\n\tuint32_t verified_peak_height = 0;\n\tint64_t last_query_ms = 0;\n\n\tsize_t tx_counter = 0;\n\tsize_t vdf_counter = 0;\n\tsize_t vote_counter = 0;\n\tsize_t block_counter = 0;\n\tsize_t proof_counter = 0;\n\tsize_t upload_counter = 0;\n\tdouble tx_upload_sum = 0;\n\n\tsize_t tx_drop_counter = 0;\n\tsize_t vdf_drop_counter = 0;\n\tsize_t proof_drop_counter = 0;\n\tsize_t block_drop_counter = 0;\n\n\tstd::shared_ptr<UPNP_Mapper> upnp_mapper;\n\tstd::shared_ptr<vnx::addons::HttpInterface<Router>> http;\n\n\tfriend class vnx::addons::HttpInterface<Router>;\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_ROUTER_H_ */\n"
  },
  {
    "path": "include/mmx/TimeLord.h",
    "content": "/*\n * TimeLord.h\n *\n *  Created on: Dec 6, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_TIMELORD_H_\n#define INCLUDE_MMX_TIMELORD_H_\n\n#include <mmx/TimeLordBase.hxx>\n#include <mmx/pubkey_t.hpp>\n\n#include <vnx/ThreadPool.h>\n\n\nnamespace mmx {\n\nclass TimeLord : public TimeLordBase {\npublic:\n\tTimeLord(const std::string& _vnx_name);\n\nprotected:\n\tvoid init() override;\n\n\tvoid main() override;\n\n\tvoid handle(std::shared_ptr<const IntervalRequest> value) override;\n\n\tvoid stop_vdf() override;\n\nprivate:\n\tstruct vdf_point_t {\n\t\thash_t output;\n\t\tuint64_t num_iters = 0;\n\t};\n\n\tvoid update();\n\n\tvoid start_vdf(vdf_point_t begin);\n\n\tvoid vdf_loop();\n\n\tstatic hash_t compute(const hash_t& input, const uint64_t num_iters);\n\n\tvoid print_info();\n\nprivate:\n\tstd::mutex mutex;\n\tstd::thread vdf_thread;\n\tstd::condition_variable vdf_signal;\n\n\tbool do_run = false;\n\tbool is_reset = false;\n\n\tuint64_t segment_iters = 1000;\n\tuint64_t avg_iters_per_sec = 0;\n\n\tstd::map<uint64_t, hash_t> history;\n\tstd::map<uint64_t, hash_t> infuse;\n\n\tuint64_t peak_iters = 0;\n\tstd::map<uint64_t, std::shared_ptr<const IntervalRequest>> pending;\t\t// [end => request]\n\n\tstd::shared_ptr<vdf_point_t> peak;\n\n\tskey_t timelord_sk;\n\tpubkey_t timelord_key;\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_TIMELORD_H_ */\n"
  },
  {
    "path": "include/mmx/TimeLordRewards.h",
    "content": "/*\n * TimeLordRewards.h\n *\n *  Created on: Mar 20, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_TIMELORDREWARDS_H_\n#define INCLUDE_MMX_TIMELORDREWARDS_H_\n\n#include <mmx/TimeLordRewardsBase.hxx>\n#include <mmx/WalletClient.hxx>\n\n\nnamespace mmx {\n\nclass TimeLordRewards : public TimeLordRewardsBase {\npublic:\n\tTimeLordRewards(const std::string& _vnx_name);\n\nprotected:\n\tvoid main() override;\n\n\tvoid handle(std::shared_ptr<const ProofOfTime> value) override;\n\nprivate:\n\tstd::shared_ptr<WalletClient> wallet;\n\n\tuint32_t last_height = 0;\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_TIMELORDREWARDS_H_ */\n"
  },
  {
    "path": "include/mmx/Wallet.h",
    "content": "/*\n * Wallet.h\n *\n *  Created on: Dec 11, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_WALLET_H_\n#define INCLUDE_MMX_WALLET_H_\n\n#include <mmx/WalletBase.hxx>\n#include <mmx/NodeClient.hxx>\n#include <mmx/ChainParams.hxx>\n#include <mmx/ECDSA_Wallet.h>\n#include <mmx/multi_table.h>\n\n#include <vnx/addons/HttpInterface.h>\n\n\nnamespace mmx {\n\nclass Wallet : public WalletBase {\npublic:\n\tWallet(const std::string& _vnx_name);\n\nprotected:\n\tvoid init() override;\n\n\tvoid main() override;\n\n\tstd::shared_ptr<const Transaction> send(\n\t\t\tconst uint32_t& index, const uint128& amount, const addr_t& dst_addr,\n\t\t\tconst addr_t& currency, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> send_many(\n\t\t\tconst uint32_t& index, const std::vector<std::pair<addr_t, uint128>>& amounts,\n\t\t\tconst addr_t& currency, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> send_from(\n\t\t\tconst uint32_t& index, const uint128& amount, const addr_t& dst_addr, const addr_t& src_addr,\n\t\t\tconst addr_t& currency, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> deploy(\n\t\t\tconst uint32_t& index, std::shared_ptr<const Contract> contract, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> execute(\n\t\t\tconst uint32_t& index, const addr_t& address, const std::string& method,\n\t\t\tconst std::vector<vnx::Variant>& args, const vnx::optional<uint32_t>& user, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> deposit(\n\t\t\tconst uint32_t& index, const addr_t& address, const std::string& method, const std::vector<vnx::Variant>& args,\n\t\t\tconst uint128& amount, const addr_t& currency, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> make_offer(\n\t\t\tconst uint32_t& index, const uint32_t& owner, const uint128& bid_amount, const addr_t& bid_currency,\n\t\t\tconst uint128& ask_amount, const addr_t& ask_currency, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> offer_trade(\n\t\t\tconst uint32_t& index, const addr_t& address, const uint128& amount, const uint32_t& dst_addr, const uint128& price, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> accept_offer(\n\t\t\tconst uint32_t& index, const addr_t& address, const uint32_t& dst_addr, const uint128& price, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> offer_withdraw(\n\t\t\tconst uint32_t& index, const addr_t& address, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> cancel_offer(\n\t\t\tconst uint32_t& index, const addr_t& address, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> swap_trade(\n\t\t\tconst uint32_t& index, const addr_t& address, const uint128& amount, const addr_t& currency,\n\t\t\tconst vnx::optional<uint128>& min_trade, const int32_t& num_iter, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> swap_add_liquid(\n\t\t\tconst uint32_t& index, const addr_t& address, const std::array<uint128, 2>& amount, const uint32_t& pool_idx, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> swap_rem_liquid(\n\t\t\tconst uint32_t& index, const addr_t& address, const std::array<uint128, 2>& amount, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> plotnft_exec(\n\t\t\tconst addr_t& address, const std::string& method, const std::vector<vnx::Variant>& args, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> plotnft_create(\n\t\t\tconst uint32_t& index, const std::string& name, const vnx::optional<uint32_t>& owner, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> complete(\n\t\t\tconst uint32_t& index, std::shared_ptr<const Transaction> tx, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Transaction> sign_off(\n\t\t\tconst uint32_t& index, std::shared_ptr<const Transaction> tx, const spend_options_t& options) const override;\n\n\tstd::shared_ptr<const Solution> sign_msg(const uint32_t& index, const addr_t& address, const hash_t& msg) const override;\n\n\tvoid send_off(const uint32_t& index, std::shared_ptr<const Transaction> tx) const override;\n\n\tvoid mark_spent(const uint32_t& index, const std::map<std::pair<addr_t, addr_t>, uint128>& amounts) override;\n\n\tvoid reserve(const uint32_t& index, const std::map<std::pair<addr_t, addr_t>, uint128>& amounts) override;\n\n\tvoid release(const uint32_t& index, const std::map<std::pair<addr_t, addr_t>, uint128>& amounts) override;\n\n\tvoid release_all() override;\n\n\tvoid reset_cache(const uint32_t& index) override;\n\n\tvoid update_cache(const uint32_t& index) const override;\n\n\tstd::vector<txin_t> gather_inputs_for(\tconst uint32_t& index, const uint128& amount,\n\t\t\t\t\t\t\t\t\t\t\tconst addr_t& currency, const spend_options_t& options) const override;\n\n\tstd::vector<tx_entry_t> get_history(const uint32_t& index, const query_filter_t& filter) const override;\n\n\tstd::vector<tx_log_entry_t> get_tx_log(const uint32_t& index, const int32_t& limit) const override;\n\n\tbalance_t get_balance(const uint32_t& index, const addr_t& currency) const override;\n\n\tstd::map<addr_t, balance_t> get_balances(\n\t\t\tconst uint32_t& index, const vnx::bool_t& with_zero = false) const override;\n\n\tstd::map<addr_t, balance_t> get_total_balances(const std::vector<addr_t>& addresses) const override;\n\n\tstd::map<addr_t, balance_t> get_contract_balances(const addr_t& address) const override;\n\n\tstd::map<addr_t, std::shared_ptr<const Contract>> get_contracts(\n\t\t\tconst uint32_t& index, const vnx::optional<std::string>& type_name, const vnx::optional<hash_t>& type_hash) const override;\n\n\tstd::map<addr_t, std::shared_ptr<const Contract>> get_contracts_owned(\n\t\t\tconst uint32_t& index, const vnx::optional<std::string>& type_name, const vnx::optional<hash_t>& type_hash) const override;\n\n\tstd::vector<offer_data_t> get_offers(const uint32_t& index, const vnx::bool_t& state) const override;\n\n\tstd::map<addr_t, std::array<std::pair<addr_t, uint128>, 2>> get_swap_liquidity(const uint32_t& index) const override;\n\n\taddr_t get_address(const uint32_t& index, const uint32_t& offset) const override;\n\n\tstd::vector<addr_t> get_all_addresses(const int32_t& index) const override;\n\n\tint32_t find_wallet_by_addr(const addr_t& address) const override;\n\n\tstd::pair<skey_t, pubkey_t> get_farmer_keys(const uint32_t& index) const override;\n\n\tstd::vector<std::pair<skey_t, pubkey_t>> get_all_farmer_keys() const override;\n\n\taccount_info_t get_account(const uint32_t& index) const override;\n\n\tstd::vector<account_info_t> get_all_accounts() const override;\n\n\tbool is_locked(const uint32_t& index) const override;\n\n\tvoid lock(const uint32_t& index) override;\n\n\tvoid unlock(const uint32_t& index, const std::string& passphrase) override;\n\n\tvoid add_account(const uint32_t& index, const account_t& config, const vnx::optional<std::string>& passphrase) override;\n\n\tvoid create_account(const account_t& config, const vnx::optional<std::string>& passphrase) override;\n\n\tvoid create_wallet(const account_t& config, const vnx::optional<std::string>& words, const vnx::optional<std::string>& passphrase) override;\n\n\tvoid import_wallet(const account_t& config, std::shared_ptr<const KeyFile> key_file, const vnx::optional<std::string>& passphrase) override;\n\n\tstd::shared_ptr<const KeyFile> export_wallet(const uint32_t& index) const override;\n\n\tvoid remove_account(const uint32_t& index, const uint32_t& account) override;\n\n\tvoid set_address_count(const uint32_t& index, const uint32_t& count) override;\n\n\tstd::set<addr_t> get_token_list() const override;\n\n\tvoid add_token(const addr_t& address) override;\n\n\tvoid rem_token(const addr_t& address) override;\n\n\thash_t get_master_seed(const uint32_t& index) const override;\n\n\tstd::vector<std::string> get_mnemonic_seed(const uint32_t& index) const override;\n\n\tstd::vector<std::string> get_mnemonic_wordlist(const std::string& lang) const override;\n\n\tvoid http_request_async(std::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\tconst vnx::request_id_t& request_id) const override;\n\n\tvoid http_request_chunk_async(\tstd::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\t\tconst int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& request_id) const override;\n\nprivate:\n\tstd::shared_ptr<ECDSA_Wallet> get_wallet(const uint32_t& index) const;\n\n\taddr_t get_plotnft_owner(const addr_t& address) const;\n\nprivate:\n\tstd::shared_ptr<NodeClient> node;\n\n\tstd::vector<std::shared_ptr<ECDSA_Wallet>> wallets;\n\n\tstd::map<uint32_t, std::weak_ptr<vnx::Timer>> lock_timers;\n\n\tmutable mmx::hash_multi_table<addr_t, tx_log_entry_t> tx_log;\n\n\tstd::shared_ptr<const ChainParams> params;\n\tstd::shared_ptr<vnx::addons::HttpInterface<Wallet>> http;\n\n\tfriend class vnx::addons::HttpInterface<Wallet>;\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_WALLET_H_ */\n"
  },
  {
    "path": "include/mmx/WebAPI.h",
    "content": "/*\n * WebAPI.h\n *\n *  Created on: Jan 25, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_WEBAPI_H_\n#define INCLUDE_MMX_WEBAPI_H_\n\n#include <mmx/WebAPIBase.hxx>\n#include <mmx/NodeAsyncClient.hxx>\n#include <mmx/WalletAsyncClient.hxx>\n#include <mmx/FarmerAsyncClient.hxx>\n#include <mmx/Block.hxx>\n\n#include <vnx/LogMsg.hxx>\n\n\nnamespace mmx {\n\nclass RenderContext;\n\nclass WebAPI : public WebAPIBase {\npublic:\n\tWebAPI(const std::string& _vnx_name);\n\nprotected:\n\tvoid init() override;\n\n\tvoid main() override;\n\n\tvoid shutdown() override;\n\n\tvoid http_request_async(std::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\tconst vnx::request_id_t& request_id) const override;\n\n\tvoid http_request_chunk_async(\tstd::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\t\tconst int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& request_id) const override;\n\n\tvoid handle(std::shared_ptr<const Block> block) override;\n\n\tvoid handle(std::shared_ptr<const ProofResponse> value) override;\n\n\tvoid handle(std::shared_ptr<const vnx::LogMsg> value) override;\n\nprivate:\n\tvoid update();\n\n\tstd::shared_ptr<RenderContext> get_context() const;\n\n\tvoid render_header(const vnx::request_id_t& request_id, std::shared_ptr<const BlockHeader> block) const;\n\n\tvoid render_headers(const vnx::request_id_t& request_id, size_t limit, const size_t offset) const;\n\n\tvoid render_block(const vnx::request_id_t& request_id, std::shared_ptr<const Block> block) const;\n\n\tvoid render_blocks(const vnx::request_id_t& request_id, size_t limit, const size_t offset) const;\n\n\tvoid render_transaction(const vnx::request_id_t& request_id, const vnx::optional<tx_info_t>& info) const;\n\n\tvoid render_transactions(const vnx::request_id_t& request_id, size_t limit, const size_t offset, const std::vector<hash_t>& tx_ids) const;\n\n\tvoid render_address(const vnx::request_id_t& request_id, const addr_t& address, const std::map<addr_t, uint128>& balances) const;\n\n\tvoid render_balances(const vnx::request_id_t& request_id, const vnx::optional<addr_t>& currency, const std::map<addr_t, balance_t>& balances) const;\n\n\tvoid render_history(const vnx::request_id_t& request_id, std::vector<tx_entry_t> history) const;\n\n\tvoid render_tx_history(const vnx::request_id_t& request_id, const std::vector<tx_log_entry_t>& history) const;\n\n\tvoid render_block_graph(const vnx::request_id_t& request_id, size_t limit, const size_t step, const uint32_t height) const;\n\n\tvoid get_context(\tconst std::unordered_set<addr_t>& addr_set, const vnx::request_id_t& request_id,\n\t\t\t\t\t\tconst std::function<void(std::shared_ptr<RenderContext>)>& callback) const;\n\n\tvoid resolve_vm_varptr(\tconst addr_t& contract, const vm::varptr_t& var, const vnx::request_id_t& request_id,\n\t\t\t\t\t\t\tconst uint32_t call_depth, const std::function<void(const vnx::Variant&)>& callback) const;\n\n\tvoid respond(const vnx::request_id_t& request_id, std::shared_ptr<const vnx::addons::HttpResponse> response) const;\n\n\tvoid respond(const vnx::request_id_t& request_id, const vnx::Variant& value) const;\n\n\tvoid respond(const vnx::request_id_t& request_id, const vnx::Object& value) const;\n\n\tvoid respond_ex(const vnx::request_id_t& request_id, const std::exception& ex) const;\n\n\tvoid respond_status(const vnx::request_id_t& request_id, const int32_t& status, const std::string& text = \"\") const;\n\nprivate:\n\tstd::shared_ptr<NodeAsyncClient> node;\n\tstd::shared_ptr<WalletAsyncClient> wallet;\n\tstd::shared_ptr<FarmerAsyncClient> farmer;\n\tstd::shared_ptr<const ChainParams> params;\n\n\tstd::list<std::pair<std::shared_ptr<const vnx::LogMsg>, uint64_t>> log_history;\n\tstd::list<std::pair<std::shared_ptr<const ProofResponse>, uint64_t>> proof_history;\n\n\tbool is_synced = false;\n\tuint32_t curr_height = 0;\n\tuint32_t synced_since = 0;\n\tuint64_t log_counter = 0;\n\tuint64_t proof_counter = 0;\n\n\tstatic std::mutex g_config_mutex;\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_WEBAPI_H_ */\n"
  },
  {
    "path": "include/mmx/WebRender.h",
    "content": "/*\n * WebRender.h\n *\n *  Created on: Sep 19, 2024\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_WEBRENDER_H_\n#define INCLUDE_MMX_WEBRENDER_H_\n\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <mmx/fixed128.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <mmx/accept_generic.hxx>\n\n#include <vnx/Visitor.h>\n#include <vnx/Object.hpp>\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\n\ntemplate<typename T>\nvnx::Object web_render(const T& value);\n\ntemplate<typename T>\nvnx::Variant web_render(std::shared_ptr<T> value);\n\n\nclass WebRender {\npublic:\n\tvnx::Object object;\n\tvnx::Variant result;\n\n\tWebRender() = default;\n\n\ttemplate<typename T>\n\tvoid type_begin(int num_fields) {\n\t\tif(auto type_code = T::static_get_type_code()) {\n\t\t\tobject[\"__type\"] = type_code->name;\n\t\t}\n\t}\n\n\ttemplate<typename T>\n\tvoid type_end(int num_fields) {\n\t\tresult = vnx::Variant(object);\n\t}\n\n\tvoid type_field(const std::string& name, const size_t index) {\n\t\tp_value = &object[name];\n\t}\n\n\ttemplate<typename T>\n\tvoid set(const T& value) {\n\t\t*p_value = value;\n\t}\n\n\ttemplate<typename T>\n\tvoid accept(const T& value) {\n\t\tif constexpr(vnx::is_object<T>()) {\n\t\t\tset(web_render(value));\n\t\t} else {\n\t\t\tset(value);\n\t\t}\n\t}\n\n\ttemplate<size_t N>\n\tvoid accept(const bytes_t<N>& value) {\n\t\tset(value.to_string());\n\t}\n\n\tvoid accept(const uint128& value) {\n\t\tset(value.str(10));\n\t}\n\n\tvoid accept(const fixed128& value) {\n\t\tset(value.to_string());\n\t}\n\n\tvoid accept(const hash_t& value) {\n\t\tset(value.to_string());\n\t}\n\n\tvoid accept(const addr_t& value) {\n\t\tset(value.to_string());\n\t}\n\n\tvoid accept(const pubkey_t& value) {\n\t\tset(value.to_string());\n\t}\n\n\tvoid accept(const signature_t& value) {\n\t\tset(value.to_string());\n\t}\n\n\ttemplate<typename T>\n\tvoid accept(const vnx::optional<T>& value) {\n\t\tif(value) {\n\t\t\taccept(*value);\n\t\t} else {\n\t\t\tset(nullptr);\n\t\t}\n\t}\n\n\ttemplate<typename K, typename V>\n\tvoid accept(const std::pair<K, V>& value) {\n\t\tconst auto prev = p_value;\n\t\tstd::array<vnx::Variant, 2> tmp;\n\t\tp_value = &tmp[0];\n\t\taccept(value.first);\n\t\tp_value = &tmp[1];\n\t\taccept(value.second);\n\t\tp_value = prev;\n\t\tset(tmp);\n\t}\n\n\ttemplate<typename T, size_t N>\n\tvoid accept(const std::array<T, N>& value) {\n\t\taccept_range(value.begin(), value.end());\n\t}\n\n\ttemplate<typename T>\n\tvoid accept(const std::vector<T>& value) {\n\t\taccept_range(value.begin(), value.end());\n\t}\n\n\ttemplate<typename T>\n\tvoid accept(const std::set<T>& value) {\n\t\taccept_range(value.begin(), value.end());\n\t}\n\n\ttemplate<typename K, typename V>\n\tvoid accept(const std::map<K, V>& value) {\n\t\taccept_range(value.begin(), value.end());\n\t}\n\n\ttemplate<typename T>\n\tvoid accept_range(const T& begin, const T& end) {\n\t\tconst auto prev = p_value;\n\t\tstd::list<vnx::Variant> tmp;\n\t\tfor(T iter = begin; iter != end; ++iter) {\n\t\t\ttmp.emplace_back();\n\t\t\tp_value = &tmp.back();\n\t\t\taccept(*iter);\n\t\t}\n\t\tp_value = prev;\n\t\tset(tmp);\n\t}\n\n\tvoid accept(const std::vector<uint8_t>& value) {\n\t\tset(vnx::to_hex_string(value.data(), value.size()));\n\t}\n\n\ttemplate<typename T>\n\tvoid accept(std::shared_ptr<T> value) {\n\t\tset(web_render(value));\n\t}\n\nprivate:\n\tvnx::Variant* p_value = &result;\n\n};\n\n\ntemplate<typename T>\nvnx::Object web_render(const T& value) {\n\tWebRender visitor;\n\tvalue.accept_generic(visitor);\n\treturn std::move(visitor.object);\n}\n\ntemplate<typename T>\nvnx::Variant web_render(std::shared_ptr<T> value) {\n\tWebRender visitor;\n\tvnx::accept_generic(visitor, std::shared_ptr<const T>(value));\n\treturn std::move(visitor.result);\n}\n\ntemplate<typename T>\nvnx::Variant web_render_value(const T& value) {\n\tWebRender visitor;\n\tvnx::accept_generic(visitor, value);\n\treturn std::move(visitor.result);\n}\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_WEBRENDER_H_ */\n"
  },
  {
    "path": "include/mmx/addr_t.hpp",
    "content": "/*\n * addr_t.hpp\n *\n *  Created on: Dec 12, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_ADDR_T_HPP_\n#define INCLUDE_MMX_ADDR_T_HPP_\n\n#include <mmx/hash_t.hpp>\n\n\nnamespace mmx {\n\nclass addr_t : public hash_t {\npublic:\n\ttypedef hash_t super_t;\n\n\taddr_t() = default;\n\n\taddr_t(const hash_t& hash);\n\n\taddr_t(const std::string& addr);\n\n\tstd::string to_string() const;\n\n\tvoid from_string(const std::string& addr);\n\n};\n\n\ninline\naddr_t::addr_t(const hash_t& hash)\n\t:\tsuper_t(hash)\n{\n}\n\ninline\naddr_t::addr_t(const std::string& addr) {\n\tfrom_string(addr);\n}\n\ninline\nstd::ostream& operator<<(std::ostream& out, const addr_t& addr) {\n\treturn out << addr.to_string();\n}\n\n} //mmx\n\n\nnamespace vnx {\n\nvoid read(vnx::TypeInput& in, mmx::addr_t& value, const vnx::TypeCode* type_code, const uint16_t* code);\n\ninline\nvoid write(vnx::TypeOutput& out, const mmx::addr_t& value, const vnx::TypeCode* type_code = nullptr, const uint16_t* code = nullptr) {\n\tvnx::write(out, value.bytes, type_code, code);\n}\n\ninline\nvoid read(std::istream& in, mmx::addr_t& value) {\n\tstd::string tmp;\n\tvnx::read(in, tmp);\n\tvalue.from_string(tmp);\n}\n\ninline\nvoid write(std::ostream& out, const mmx::addr_t& value) {\n\tvnx::write(out, value.to_string());\n}\n\ninline\nvoid accept(vnx::Visitor& visitor, const mmx::addr_t& value) {\n\tvnx::accept(visitor, value.to_string());\n}\n\n} // vnx\n\n\nnamespace std {\n\ttemplate<>\n\tstruct hash<typename mmx::addr_t> {\n\t\tsize_t operator()(const mmx::addr_t& x) const {\n\t\t\treturn std::hash<mmx::hash_t>{}(x);\n\t\t}\n\t};\n} // std\n\n#endif /* INCLUDE_MMX_ADDR_T_HPP_ */\n"
  },
  {
    "path": "include/mmx/balance_cache_t.h",
    "content": "/*\n * balance_cache_t.h\n *\n *  Created on: May 8, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_BALANCE_CACHE_T_H_\n#define INCLUDE_MMX_BALANCE_CACHE_T_H_\n\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <mmx/table.h>\n\n#include <map>\n\n\nnamespace mmx {\n\nclass balance_cache_t {\npublic:\n\tbalance_cache_t(const balance_cache_t&) = default;\n\n\tbalance_cache_t(balance_cache_t* parent) : parent(parent) {}\n\n\tbalance_cache_t(const balance_table_t<uint128>* source) : source(source) {}\n\n\tbalance_cache_t& operator=(const balance_cache_t&) = default;\n\n\tuint128* find(const addr_t& address, const addr_t& contract)\n\t{\n\t\tconst auto key = std::make_pair(address, contract);\n\t\tauto iter = balance.find(key);\n\t\tif(iter == balance.end()) {\n\t\t\tif(source) {\n\t\t\t\tuint128 value = 0;\n\t\t\t\tif(source->find(key, value)) {\n\t\t\t\t\titer = balance.emplace(key, value).first;\n\t\t\t\t} else {\n\t\t\t\t\treturn nullptr;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(parent) {\n\t\t\t\tif(auto value = parent->find(address, contract)) {\n\t\t\t\t\titer = balance.emplace(key, *value).first;\n\t\t\t\t} else {\n\t\t\t\t\treturn nullptr;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn &iter->second;\n\t}\n\n\tuint128& get(const addr_t& address, const addr_t& contract)\n\t{\n\t\tif(auto value = find(address, contract)) {\n\t\t\treturn *value;\n\t\t}\n\t\treturn balance[std::make_pair(address, contract)] = 0;\n\t}\n\n\tvoid apply(const balance_cache_t& cache)\n\t{\n\t\tfor(const auto& entry : cache.balance) {\n\t\t\tbalance[entry.first] = entry.second;\n\t\t}\n\t}\n\n\tstd::map<std::pair<addr_t, addr_t>, uint128> balance;\n\nprivate:\n\tbalance_cache_t* parent = nullptr;\n\tconst balance_table_t<uint128>* source = nullptr;\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_BALANCE_CACHE_T_H_ */\n"
  },
  {
    "path": "include/mmx/bls_pubkey_t.hpp",
    "content": "/*\n * bls_pubkey_t.hpp\n *\n *  Created on: Nov 30, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_BLS_PUBKEY_T_HPP_\n#define INCLUDE_MMX_BLS_PUBKEY_T_HPP_\n\n#include <mmx/hash_t.hpp>\n#include <mmx/skey_t.hpp>\n\nnamespace bls {\n\tclass G1Element;\n}\n\n\nnamespace mmx {\n\nclass bls_pubkey_t : public bytes_t<48> {\npublic:\n\ttypedef bytes_t<48> super_t;\n\n\tbls_pubkey_t() = default;\n\n\tbls_pubkey_t(const super_t& bytes);\n\n\tbls_pubkey_t(const bls::G1Element& key);\n\n\thash_t get_addr() const;\n\n\tvoid to(bls::G1Element& key) const;\n\n};\n\ninline\nbls_pubkey_t::bls_pubkey_t(const super_t& bytes)\n\t:\tsuper_t(bytes)\n{\n}\n\n} // mmx\n\n\nnamespace vnx {\n\ninline\nvoid read(vnx::TypeInput& in, mmx::bls_pubkey_t& value, const vnx::TypeCode* type_code, const uint16_t* code) {\n\tvnx::read(in, (mmx::bls_pubkey_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid write(vnx::TypeOutput& out, const mmx::bls_pubkey_t& value, const vnx::TypeCode* type_code = nullptr, const uint16_t* code = nullptr) {\n\tvnx::write(out, (const mmx::bls_pubkey_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid read(std::istream& in, mmx::bls_pubkey_t& value) {\n\tvnx::read(in, (mmx::bls_pubkey_t::super_t&)value);\n}\n\ninline\nvoid write(std::ostream& out, const mmx::bls_pubkey_t& value) {\n\tvnx::write(out, value.to_string());\n}\n\ninline\nvoid accept(vnx::Visitor& visitor, const mmx::bls_pubkey_t& value) {\n\tvnx::accept(visitor, (const mmx::bls_pubkey_t::super_t&)value);\n}\n\n} // vnx\n\n\nnamespace std {\n\ttemplate<>\n\tstruct hash<typename mmx::bls_pubkey_t> {\n\t\tsize_t operator()(const mmx::bls_pubkey_t& x) const {\n\t\t\treturn std::hash<mmx::bls_pubkey_t::super_t>{}(x);\n\t\t}\n\t};\n} // std\n\n#endif /* INCLUDE_MMX_BLS_PUBKEY_T_HPP_ */\n"
  },
  {
    "path": "include/mmx/bls_signature_t.hpp",
    "content": "/*\n * bls_bls_signature_t.hpp\n *\n *  Created on: Nov 30, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_BLS_bls_signature_t_HPP_\n#define INCLUDE_MMX_BLS_bls_signature_t_HPP_\n\n#include <mmx/hash_t.hpp>\n#include <mmx/skey_t.hpp>\n#include <mmx/bls_pubkey_t.hpp>\n\n#include <mutex>\n\nnamespace bls {\n\tclass G2Element;\n}\n\n\nnamespace mmx {\n\nclass bls_signature_t : public bytes_t<96> {\npublic:\n\ttypedef bytes_t<96> super_t;\n\n\tbls_signature_t() = default;\n\n\tbls_signature_t(const bls::G2Element& sig);\n\n\tbool verify(const bls_pubkey_t& pubkey, const hash_t& hash) const;\n\n\tvoid to(bls::G2Element& sig) const;\n\n\tstatic bls_signature_t sign(const skey_t& skey, const hash_t& hash);\n\n\tstatic bls_signature_t sign(const bls::PrivateKey& skey, const hash_t& hash);\n\nprivate:\n\tstruct cache_t {\n\t\tbytes_t<96> sig;\n\t\thash_t hash;\n\t\tbls_pubkey_t pubkey;\n\t};\n\n\tstatic std::mutex mutex;\n\tstatic const size_t hash_salt;\n\tstatic std::array<cache_t, 2048> sig_cache;\n};\n\n} // mmx\n\n\nnamespace vnx {\n\ninline\nvoid read(vnx::TypeInput& in, mmx::bls_signature_t& value, const vnx::TypeCode* type_code, const uint16_t* code) {\n\tvnx::read(in, (mmx::bls_signature_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid write(vnx::TypeOutput& out, const mmx::bls_signature_t& value, const vnx::TypeCode* type_code = nullptr, const uint16_t* code = nullptr) {\n\tvnx::write(out, (const mmx::bls_signature_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid read(std::istream& in, mmx::bls_signature_t& value) {\n\tvnx::read(in, (mmx::bls_signature_t::super_t&)value);\n}\n\ninline\nvoid write(std::ostream& out, const mmx::bls_signature_t& value) {\n\tvnx::write(out, value.to_string());\n}\n\ninline\nvoid accept(vnx::Visitor& visitor, const mmx::bls_signature_t& value) {\n\tvnx::accept(visitor, (const mmx::bls_signature_t::super_t&)value);\n}\n\n} // vnx\n\n#endif /* INCLUDE_MMX_BLS_bls_signature_t_HPP_ */\n"
  },
  {
    "path": "include/mmx/bytes_t.hpp",
    "content": "/*\n * bytes_t.hpp\n *\n *  Created on: Dec 2, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_BYTES_T_HPP_\n#define INCLUDE_MMX_BYTES_T_HPP_\n\n#include <array>\n#include <vector>\n#include <string>\n#include <cstdint>\n\n#include <vnx/Variant.hpp>\n#include <vnx/Hash64.hpp>\n\n\nnamespace mmx {\n\ntemplate<size_t N>\nclass bytes_t {\npublic:\n\tstatic constexpr size_t size_ = N;\n\n\tstd::array<uint8_t, N> bytes = {};\n\n\tbytes_t() = default;\n\n\tbytes_t(const std::vector<uint8_t>& data);\n\n\tbytes_t(const std::array<uint8_t, N>& data);\n\n\tbytes_t(const void* data, const size_t num_bytes);\n\n\texplicit bytes_t(const std::string& str);\n\n\tuint8_t* data();\n\n\tconst uint8_t* data() const;\n\n\tsize_t size() const;\n\n\tbool is_zero() const;\n\n\tvnx::Hash64 crc64() const;\n\n\tstd::string to_string() const;\n\n\tstd::vector<uint8_t> to_vector() const;\n\n\tvoid from_string(const std::string& str);\n\n\ttemplate<typename T>\n\tT to_uint(const bool big_endian = false) const;\n\n\ttemplate<typename T>\n\tbytes_t<N>& from_uint(T value, const bool big_endian = false);\n\n\tuint8_t& operator[](size_t i) {\n\t\treturn bytes[i];\n\t}\n\tconst uint8_t& operator[](size_t i) const {\n\t\treturn bytes[i];\n\t}\n\n\tbool operator==(const bytes_t& other) const {\n\t\treturn bytes == other.bytes;\n\t}\n\n\tbool operator!=(const bytes_t& other) const {\n\t\treturn bytes != other.bytes;\n\t}\n\n};\n\n\ntemplate<size_t N>\nbytes_t<N>::bytes_t(const void* data, const size_t num_bytes)\n{\n\tif(num_bytes != N) {\n\t\tthrow std::logic_error(\"bytes_t(): length mismatch (\"\n\t\t\t\t+ std::to_string(num_bytes) + \" != \" + std::to_string(N) + \")\");\n\t}\n\t::memcpy(bytes.data(), data, num_bytes);\n}\n\ntemplate<size_t N>\nbytes_t<N>::bytes_t(const std::vector<uint8_t>& data)\n\t:\tbytes_t(data.data(), data.size())\n{\n}\n\ntemplate<size_t N>\nbytes_t<N>::bytes_t(const std::array<uint8_t, N>& data)\n\t:\tbytes_t(data.data(), data.size())\n{\n}\n\ntemplate<size_t N>\nbytes_t<N>::bytes_t(const std::string& str)\n{\n\tconst auto tmp = vnx::from_hex_string(str);\n\tif(tmp.size() != N) {\n\t\tthrow std::logic_error(\"bytes_t(std::string&): length mismatch (\"\n\t\t\t\t+ std::to_string(tmp.size()) + \" != \" + std::to_string(N) + \")\");\n\t}\n\t::memcpy(bytes.data(), tmp.data(), N);\n}\n\ntemplate<size_t N>\nuint8_t* bytes_t<N>::data() {\n\treturn bytes.data();\n}\n\ntemplate<size_t N>\nconst uint8_t* bytes_t<N>::data() const {\n\treturn bytes.data();\n}\n\ntemplate<size_t N>\nsize_t bytes_t<N>::size() const {\n\treturn N;\n}\n\ntemplate<size_t N>\nbool bytes_t<N>::is_zero() const {\n\treturn *this == bytes_t();\n}\n\ntemplate<size_t N>\ntemplate<typename T>\nT bytes_t<N>::to_uint(const bool big_endian) const\n{\n\tT out = T();\n\tfor(size_t i = 0; i < N; ++i) {\n\t\tout <<= 8;\n\t\tif(big_endian) {\n\t\t\tout |= bytes[i];\n\t\t} else {\n\t\t\tout |= bytes[N - i - 1];\n\t\t}\n\t}\n\treturn out;\n}\n\ntemplate<size_t N>\ntemplate<typename T>\nbytes_t<N>& bytes_t<N>::from_uint(T value, const bool big_endian)\n{\n\tfor(size_t i = 0; i < N; ++i) {\n\t\tif(big_endian) {\n\t\t\tbytes[N - i - 1] = value;\n\t\t} else {\n\t\t\tbytes[i] = value;\n\t\t}\n\t\tvalue >>= 8;\n\t}\n\treturn *this;\n}\n\ntemplate<size_t N>\nstd::string bytes_t<N>::to_string() const {\n\treturn vnx::to_hex_string(bytes.data(), bytes.size(), false, false);\n}\n\ntemplate<size_t N>\nvnx::Hash64 bytes_t<N>::crc64() const {\n\treturn vnx::Hash64(bytes.data(), bytes.size());\n}\n\ntemplate<size_t N>\nstd::vector<uint8_t> bytes_t<N>::to_vector() const {\n\treturn std::vector<uint8_t>(bytes.begin(), bytes.end());\n}\n\ntemplate<size_t N>\nvoid bytes_t<N>::from_string(const std::string& str) {\n\t*this = bytes_t<N>(str);\n}\n\ntemplate<size_t N>\nbool operator<(const bytes_t<N>& lhs, const bytes_t<N>& rhs) {\n\treturn ::memcmp(lhs.data(), rhs.data(), N) < 0;\n}\n\ntemplate<size_t N>\nbool operator>(const bytes_t<N>& lhs, const bytes_t<N>& rhs) {\n\treturn ::memcmp(lhs.data(), rhs.data(), N) > 0;\n}\n\ntemplate<size_t N>\nstd::ostream& operator<<(std::ostream& out, const bytes_t<N>& bytes) {\n\treturn out << bytes.to_string();\n}\n\ntemplate<size_t N, size_t M>\nbytes_t<N + M> operator+(const bytes_t<N>& lhs, const bytes_t<M>& rhs) {\n\tbytes_t<N + M> res;\n\t::memcpy(res.data(), lhs.data(), N);\n\t::memcpy(res.data() + N, rhs.data(), M);\n\treturn res;\n}\n\ntemplate<size_t N>\nstd::vector<uint8_t> operator+(const std::vector<uint8_t>& lhs, const bytes_t<N>& rhs) {\n\tauto res = lhs;\n\tres.insert(res.end(), rhs.bytes.begin(), rhs.bytes.end());\n\treturn res;\n}\n\ntemplate<size_t N>\nstd::vector<uint8_t> operator+(const bytes_t<N>& lhs, const std::vector<uint8_t>& rhs) {\n\tauto res = lhs.to_vector();\n\tres.insert(res.end(), rhs.begin(), rhs.end());\n\treturn res;\n}\n\ntemplate<size_t N>\nstd::vector<uint8_t> operator+(const std::string& lhs, const bytes_t<N>& rhs) {\n\tstd::vector<uint8_t> res(lhs.begin(), lhs.end());\n\tres.insert(res.end(), rhs.bytes.begin(), rhs.bytes.end());\n\treturn res;\n}\n\ntemplate<size_t N>\nstd::vector<uint8_t> operator+(const bytes_t<N>& lhs, const std::string& rhs) {\n\tauto res = lhs.to_vector();\n\tres.insert(res.end(), rhs.begin(), rhs.end());\n\treturn res;\n}\n\n} // mmx\n\n\nnamespace vnx {\n\ntemplate<size_t N>\nvoid read(vnx::TypeInput& in, mmx::bytes_t<N>& value, const vnx::TypeCode* type_code, const uint16_t* code) {\n\tswitch(code[0]) {\n\t\tcase CODE_STRING:\n\t\tcase CODE_ALT_STRING: {\n\t\t\tstd::string tmp;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\ttry {\n\t\t\t\tvalue.from_string(tmp);\n\t\t\t} catch(...) {\n\t\t\t\tvalue = mmx::bytes_t<N>();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase CODE_UINT64:\n\t\tcase CODE_ALT_UINT64: {\n\t\t\tuint64_t tmp = 0;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\tvalue.from_uint(tmp);\n\t\t\tbreak;\n\t\t}\n\t\tcase CODE_DYNAMIC:\n\t\tcase CODE_ALT_DYNAMIC: {\n\t\t\tvnx::Variant tmp;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\tif(tmp.is_string()) {\n\t\t\t\ttry {\n\t\t\t\t\tvalue.from_string(tmp.to<std::string>());\n\t\t\t\t} catch(...) {\n\t\t\t\t\tvalue = mmx::bytes_t<N>();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttmp.to(value.bytes);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tvnx::read(in, value.bytes, type_code, code);\n\t}\n}\n\ntemplate<size_t N>\nvoid write(vnx::TypeOutput& out, const mmx::bytes_t<N>& value, const vnx::TypeCode* type_code = nullptr, const uint16_t* code = nullptr) {\n\tvnx::write(out, value.bytes, type_code, code);\n}\n\ntemplate<size_t N>\nvoid read(std::istream& in, mmx::bytes_t<N>& value) {\n\tstd::string tmp;\n\tvnx::read(in, tmp);\n\tvalue.from_string(tmp);\n}\n\ntemplate<size_t N>\nvoid write(std::ostream& out, const mmx::bytes_t<N>& value) {\n\tvnx::write(out, value.to_string());\n}\n\ntemplate<size_t N>\nvoid accept(vnx::Visitor& visitor, const mmx::bytes_t<N>& value) {\n\tvisitor.visit(value.data(), value.size());\n}\n\n} // vnx\n\n#endif /* INCLUDE_MMX_BYTES_T_HPP_ */\n"
  },
  {
    "path": "include/mmx/exception.h",
    "content": "/*\n * exception.h\n *\n *  Created on: Sep 3, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_EXCEPTION_H_\n#define INCLUDE_MMX_EXCEPTION_H_\n\n#include <stdexcept>\n\n\nnamespace mmx {\n\nclass static_failure : public std::logic_error {\npublic:\n\tstatic_failure(const std::string& note)\n\t\t:\tlogic_error(note) {}\n\n};\n\nclass invalid_solution : public static_failure {\npublic:\n\tinvalid_solution()\n\t\t:\tstatic_failure(\"invalid solution\") {}\n\n\tinvalid_solution(const std::string& note)\n\t\t:\tstatic_failure(\"invalid solution (\" + note + \")\") {}\n\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_EXCEPTION_H_ */\n"
  },
  {
    "path": "include/mmx/fixed128.hpp",
    "content": "/*\n * fixed128.hpp\n *\n *  Created on: Dec 15, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_FIXED128_HPP_\n#define INCLUDE_MMX_FIXED128_HPP_\n\n#include <mmx/package.hxx>\n#include <mmx/uint128.hpp>\n\n#include <vnx/Input.hpp>\n#include <vnx/Output.hpp>\n#include <vnx/Visitor.h>\n\n\nnamespace mmx {\n\nclass fixed128 {\npublic:\n\tuint128 fixed = uint128();\n\n\tfixed128() = default;\n\n\tfixed128(const uint128& value) {\n\t\tfixed = value * divider;\n\t}\n\n\tfixed128(const uint128_t& value, const int decimals);\n\n\tfixed128(const double& value);\n\n\tfixed128(const std::string& str);\n\n\texplicit fixed128(const char* str) : fixed128(std::string(str)) {}\n\n\tuint128 uint() const {\n\t\treturn fixed / divider;\n\t}\n\n\tuint64_t fractional() const {\n\t\treturn fixed % divider;\n\t}\n\n\tdouble to_value() const;\n\n\tuint128 to_amount(const int decimals) const;\n\n\tstd::string to_string() const;\n\n\toperator bool() const {\n\t\treturn bool(fixed);\n\t}\n\n\toperator uint64_t() const {\n\t\treturn uint();\n\t}\n\n\toperator double() const {\n\t\treturn to_value();\n\t}\n\n\tstatic const uint64_t divider;\n\n\tstatic constexpr int decimals = 15;\n\n};\n\n\ninline\nstd::ostream& operator<<(std::ostream& out, const fixed128& value) {\n\treturn out << value.to_string();\n}\n\n} // mmx\n\n\nnamespace vnx {\n\nvoid read(vnx::TypeInput& in, mmx::fixed128& value, const vnx::TypeCode* type_code, const uint16_t* code);\n\ninline\nvoid write(vnx::TypeOutput& out, const mmx::fixed128& value, const vnx::TypeCode* type_code = nullptr, const uint16_t* code = nullptr) {\n\twrite(out, value.fixed);\n}\n\ninline\nvoid read(std::istream& in, mmx::fixed128& value)\n{\n\tstd::string str;\n\tvnx::read(in, str);\n\tvalue = mmx::fixed128(str);\n}\n\ninline\nvoid write(std::ostream& out, const mmx::fixed128& value) {\n\tvnx::write(out, value.to_string());\n}\n\ninline\nvoid accept(vnx::Visitor& visitor, const mmx::fixed128& value) {\n\tvnx::accept(visitor, value.to_string());\n}\n\n} // vnx\n\n#endif /* INCLUDE_MMX_FIXED128_HPP_ */\n"
  },
  {
    "path": "include/mmx/hash_512_t.hpp",
    "content": "/*\n * hash_512_t.hpp\n *\n *  Created on: Nov 13, 2023\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_HASH_512_T_HPP_\n#define INCLUDE_MMX_HASH_512_T_HPP_\n\n#include <mmx/package.hxx>\n#include <mmx/bytes_t.hpp>\n#include <uint256_t.h>\n\n\nnamespace mmx {\n\nclass hash_512_t : public bytes_t<64> {\npublic:\n\ttypedef bytes_t<64> super_t;\n\n\thash_512_t() = default;\n\n\texplicit hash_512_t(const std::string& data);\n\n\texplicit hash_512_t(const std::vector<uint8_t>& data);\n\n\texplicit hash_512_t(const void* data, const size_t num_bytes);\n\n\tstatic hash_512_t ones();\n\n\tstatic hash_512_t empty();\n\n\tstatic hash_512_t random();\n\n\tstatic hash_512_t from_bytes(const std::vector<uint8_t>& bytes);\n\n\tstatic hash_512_t from_bytes(const std::array<uint8_t, 64>& bytes);\n\n\tstatic hash_512_t from_bytes(const void* data);\n\n};\n\ninline\nhash_512_t::hash_512_t(const std::string& data)\n\t:\thash_512_t(data.data(), data.size())\n{\n}\n\ninline\nhash_512_t::hash_512_t(const std::vector<uint8_t>& data)\n\t:\thash_512_t(data.data(), data.size())\n{\n}\n\ninline\nhash_512_t hash_512_t::ones() {\n\thash_512_t res;\n\t::memset(res.data(), -1, res.size());\n\treturn res;\n}\n\ninline\nhash_512_t hash_512_t::empty() {\n\treturn hash_512_t(nullptr, 0);\n}\n\ninline\nhash_512_t hash_512_t::from_bytes(const std::vector<uint8_t>& bytes)\n{\n\tif(bytes.size() != 64) {\n\t\tthrow std::logic_error(\"hash size mismatch\");\n\t}\n\treturn from_bytes(bytes.data());\n}\n\ninline\nhash_512_t hash_512_t::from_bytes(const std::array<uint8_t, 64>& bytes)\n{\n\treturn from_bytes(bytes.data());\n}\n\ninline\nhash_512_t hash_512_t::from_bytes(const void* data)\n{\n\thash_512_t res;\n\t::memcpy(res.data(), data, 64);\n\treturn res;\n}\n\n} // mmx\n\n\nnamespace vnx {\n\ninline\nvoid read(vnx::TypeInput& in, mmx::hash_512_t& value, const vnx::TypeCode* type_code, const uint16_t* code) {\n\tvnx::read(in, (mmx::hash_512_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid write(vnx::TypeOutput& out, const mmx::hash_512_t& value, const vnx::TypeCode* type_code = nullptr, const uint16_t* code = nullptr) {\n\tvnx::write(out, (const mmx::hash_512_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid read(std::istream& in, mmx::hash_512_t& value) {\n\tvnx::read(in, (mmx::hash_512_t::super_t&)value);\n}\n\ninline\nvoid write(std::ostream& out, const mmx::hash_512_t& value) {\n\tvnx::write(out, value.to_string());\n}\n\ninline\nvoid accept(vnx::Visitor& visitor, const mmx::hash_512_t& value) {\n\tvnx::accept(visitor, (const mmx::hash_512_t::super_t&)value);\n}\n\n} // vnx\n\n#endif /* INCLUDE_MMX_HASH_512_T_HPP_ */\n"
  },
  {
    "path": "include/mmx/hash_t.hpp",
    "content": "/*\n * hash_t.hpp\n *\n *  Created on: Nov 25, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_HASH_T_HPP_\n#define INCLUDE_MMX_HASH_T_HPP_\n\n#include <mmx/package.hxx>\n#include <mmx/bytes_t.hpp>\n#include <uint256_t.h>\n\n\nnamespace mmx {\n\nclass hash_t : public bytes_t<32> {\npublic:\n\ttypedef bytes_t<32> super_t;\n\n\thash_t() = default;\n\n\texplicit hash_t(const std::string& data);\n\n\texplicit hash_t(const std::vector<uint8_t>& data);\n\n\ttemplate<size_t N>\n\texplicit hash_t(const std::array<uint8_t, N>& data);\n\n\ttemplate<size_t N>\n\texplicit hash_t(const bytes_t<N>& data);\n\n\texplicit hash_t(const void* data, const size_t num_bytes);\n\n\tuint256_t to_uint256() const {\n\t\treturn to_uint<uint256_t>();\n\t}\n\n\tstatic hash_t ones();\n\n\tstatic hash_t empty();\n\n\tstatic hash_t random();\n\n\tstatic hash_t secure_random();\n\n\tstatic hash_t from_bytes(const std::vector<uint8_t>& bytes);\n\n\tstatic hash_t from_bytes(const std::array<uint8_t, 32>& bytes);\n\n\tstatic hash_t from_bytes(const void* data);\n\n};\n\ninline\nhash_t::hash_t(const std::string& data)\n\t:\thash_t(data.data(), data.size())\n{\n}\n\ninline\nhash_t::hash_t(const std::vector<uint8_t>& data)\n\t:\thash_t(data.data(), data.size())\n{\n}\n\ntemplate<size_t N>\nhash_t::hash_t(const std::array<uint8_t, N>& data)\n\t:\thash_t(data.data(), data.size())\n{\n}\n\ntemplate<size_t N>\nhash_t::hash_t(const bytes_t<N>& data)\n\t:\thash_t(data.data(), data.size())\n{\n}\n\ninline\nhash_t hash_t::ones() {\n\thash_t res;\n\t::memset(res.data(), -1, res.size());\n\treturn res;\n}\n\ninline\nhash_t hash_t::empty() {\n\treturn hash_t(nullptr, 0);\n}\n\ninline\nhash_t hash_t::from_bytes(const std::vector<uint8_t>& bytes)\n{\n\tif(bytes.size() != 32) {\n\t\tthrow std::logic_error(\"hash size mismatch\");\n\t}\n\treturn from_bytes(bytes.data());\n}\n\ninline\nhash_t hash_t::from_bytes(const std::array<uint8_t, 32>& bytes)\n{\n\treturn from_bytes(bytes.data());\n}\n\ninline\nhash_t hash_t::from_bytes(const void* data)\n{\n\thash_t res;\n\t::memcpy(res.data(), data, 32);\n\treturn res;\n}\n\n} // mmx\n\n\nnamespace vnx {\n\ninline\nvoid read(vnx::TypeInput& in, mmx::hash_t& value, const vnx::TypeCode* type_code, const uint16_t* code) {\n\tvnx::read(in, (mmx::hash_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid write(vnx::TypeOutput& out, const mmx::hash_t& value, const vnx::TypeCode* type_code = nullptr, const uint16_t* code = nullptr) {\n\tvnx::write(out, (const mmx::hash_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid read(std::istream& in, mmx::hash_t& value) {\n\tvnx::read(in, (mmx::hash_t::super_t&)value);\n}\n\ninline\nvoid write(std::ostream& out, const mmx::hash_t& value) {\n\tvnx::write(out, value.to_string());\n}\n\ninline\nvoid accept(vnx::Visitor& visitor, const mmx::hash_t& value) {\n\tvnx::accept(visitor, (const mmx::hash_t::super_t&)value);\n}\n\n} // vnx\n\n\nnamespace std {\n\ttemplate<>\n\tstruct hash<typename mmx::hash_t> {\n\t\tsize_t operator()(const mmx::hash_t& x) const {\n\t\t\tsize_t res = 0;\n\t\t\t::memcpy(&res, x.data(), std::min(x.size(), sizeof(res)));\n\t\t\treturn res;\n\t\t}\n\t};\n} // std\n\n#endif /* INCLUDE_MMX_HASH_T_HPP_ */\n"
  },
  {
    "path": "include/mmx/helpers.h",
    "content": "/*\n * helpers.h\n *\n *  Created on: Dec 29, 2024\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_HELPERS_H_\n#define INCLUDE_MMX_HELPERS_H_\n\n#include <map>\n#include <unordered_map>\n#include <iostream>\n\n#include <vnx/optional.h>\n\n\nnamespace mmx {\n\ntemplate<typename T>\ntypename T::mapped_type find_value(const T& map, const typename T::key_type& key, const typename T::mapped_type& value)\n{\n\tauto iter = map.find(key);\n\tif(iter != map.end()) {\n\t\treturn iter->second;\n\t}\n\treturn value;\n}\n\ntemplate<typename T>\nvnx::optional<typename T::mapped_type> find_value(const T& map, const typename T::key_type& key)\n{\n\tauto iter = map.find(key);\n\tif(iter != map.end()) {\n\t\treturn iter->second;\n\t}\n\treturn nullptr;\n}\n\ninline\nstd::string read_file(const std::string& path)\n{\n\tstd::stringstream buffer;\n\tstd::ifstream stream(path);\n\tif(!stream.good()) {\n\t\tthrow std::runtime_error(\"failed to open file: \" + path);\n\t}\n\tbuffer << stream.rdbuf();\n\treturn buffer.str();\n}\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_HELPERS_H_ */\n"
  },
  {
    "path": "include/mmx/hmac_sha512.hpp",
    "content": "/*\n * hmac_sha512.h\n *\n *  Created on: Sep 11, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_HMAC_SHA512_H_\n#define INCLUDE_MMX_HMAC_SHA512_H_\n\n#include <mmx/hash_t.hpp>\n#include <vnx/Util.hpp>\n\n#include <hmac_sha512.h>\n#include <utility>\n\n\nnamespace mmx {\n\ninline std::pair<hash_t, hash_t> hmac_sha512(const hash_t& seed, const hash_t& key)\n{\n\tHMAC_SHA512 func(key.data(), key.size());\n\tfunc.Write(seed.data(), seed.size());\n\n\tuint8_t tmp[64] = {};\n\tfunc.Finalize(tmp);\n\n\tstd::pair<hash_t, hash_t> out;\n\t::memcpy(out.first.data(), tmp, 32);\n\t::memcpy(out.second.data(), tmp + 32, 32);\n\treturn out;\n}\n\ninline std::pair<hash_t, hash_t> hmac_sha512_n(const hash_t& seed, const hash_t& key, const uint32_t index)\n{\n\tHMAC_SHA512 func(key.data(), key.size());\n\tfunc.Write(seed.data(), seed.size());\n\t{\n\t\tconst auto bindex = vnx::to_big_endian(index);\n\t\tfunc.Write((const uint8_t*)&bindex, sizeof(bindex));\n\t}\n\tuint8_t tmp[64] = {};\n\tfunc.Finalize(tmp);\n\n\tstd::pair<hash_t, hash_t> out;\n\t::memcpy(out.first.data(), tmp, 32);\n\t::memcpy(out.second.data(), tmp + 32, 32);\n\treturn out;\n}\n\ninline std::pair<hash_t, hash_t> kdf_hmac_sha512(const hash_t& seed, const hash_t& key, const uint32_t num_iters)\n{\n\t// This is NOT standard PBKDF2, but a simplified adaptation.\n\tuint8_t tmp[64] = {};\n\n\tHMAC_SHA512 func(key.data(), key.size());\n\tfunc.Write(seed.data(), seed.size());\n\tfunc.Finalize(tmp);\n\n\tfor(uint32_t i = 1; i < num_iters; ++i) {\n\t\tHMAC_SHA512 func(tmp, sizeof(tmp));\n\t\tfunc.Write(seed.data(), seed.size());\n\t\tfunc.Finalize(tmp);\n\t}\n\tstd::pair<hash_t, hash_t> out;\n\t::memcpy(out.first.data(), tmp, 32);\n\t::memcpy(out.second.data(), tmp + 32, 32);\n\treturn out;\n}\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_HMAC_SHA512_H_ */\n"
  },
  {
    "path": "include/mmx/http_request.h",
    "content": "/*\n * http_request.h\n *\n *  Created on: May 6, 2024\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_HTTP_REQUEST_H_\n#define INCLUDE_MMX_HTTP_REQUEST_H_\n\n#include <string>\n\n\nnamespace mmx {\n\nvoid http_request_file(const std::string& url, const std::string& file_path, const std::string& options = \"\");\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_HTTP_REQUEST_H_ */\n"
  },
  {
    "path": "include/mmx/mnemonic.h",
    "content": "/*\n * mnemonic.h\n *\n *  Created on: Sep 12, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_MNEMONIC_H_\n#define INCLUDE_MMX_MNEMONIC_H_\n\n#include <mmx/hash_t.hpp>\n\n#include <string>\n#include <vector>\n\n#ifdef _MSC_VER\n#include <mmx_iface_export.h>\n#else\n#define MMX_IFACE_EXPORT\n#endif\n\nnamespace mmx {\nnamespace mnemonic {\n\nMMX_IFACE_EXPORT extern const std::vector<std::string> wordlist_en;\n\nstd::vector<std::string> seed_to_words(const hash_t& seed, const std::vector<std::string>& wordlist = wordlist_en);\n\nhash_t words_to_seed(const std::vector<std::string>& words, const std::vector<std::string>& wordlist = wordlist_en);\n\nstd::string words_to_string(const std::vector<std::string>& words);\n\nstd::vector<std::string> string_to_words(const std::string& phrase);\n\n\n} // mnemonic\n} // mmx\n\n#endif /* INCLUDE_MMX_MNEMONIC_H_ */\n"
  },
  {
    "path": "include/mmx/multi_table.h",
    "content": "/*\n * multi_table.h\n *\n *  Created on: Jun 21, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_MULTI_TABLE_H_\n#define INCLUDE_MMX_MULTI_TABLE_H_\n\n#include <mmx/table.h>\n\n\nnamespace mmx {\n\ntemplate<typename K, typename V, typename I = uint32_t>\nclass multi_table : protected table<std::pair<K, I>, V> {\nprivate:\n\ttypedef table<std::pair<K, I>, V> super_t;\n\nprotected:\n\tusing super_t::db;\n\tusing super_t::read;\n\tusing super_t::write;\n\npublic:\n\tmulti_table() = default;\n\n\tmulti_table(const std::string& file_path)\n\t\t:\tsuper_t(file_path)\n\t{\n\t}\n\n\tusing super_t::open;\n\tusing super_t::close;\n\n\tvoid insert(const K& key, const V& value)\n\t{\n\t\tinsert_many(key, {value});\n\t}\n\n\tvoid insert_many(const K& key, const std::vector<V>& values)\n\t{\n\t\tstd::pair<K, I> key_(key, std::numeric_limits<I>::max());\n\t\t{\n\t\t\tTable::Iterator iter(db);\n\t\t\titer.seek_prev(write(key_));\n\t\t\tkey_.second = 0;\n\n\t\t\tif(iter.is_valid()) {\n\t\t\t\tstd::pair<K, I> found;\n\t\t\t\tread(iter.key(), found);\n\t\t\t\tif(found.first == key) {\n\t\t\t\t\tkey_.second = found.second + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor(const auto& value : values) {\n\t\t\tif(key_.second == std::numeric_limits<I>::max()) {\n\t\t\t\tthrow std::runtime_error(\"key space overflow (\" + super_t::get_path() + \")\");\n\t\t\t}\n\t\t\tsuper_t::insert(key_, value);\n\t\t\tkey_.second++;\n\t\t}\n\t}\n\n\tsize_t count(const K& key) const\n\t{\n\t\tstd::vector<V> values;\n\t\treturn find(key, values);\n\t}\n\n\tsize_t find(const K& key, std::vector<V>& values, const bool greater_equal = false) const\n\t{\n\t\tvalues.clear();\n\t\tstd::pair<K, I> key_(key, 0);\n\n\t\tTable::Iterator iter(db);\n\t\titer.seek(write(key_));\n\t\twhile(iter.is_valid()) {\n\t\t\tread(iter.key(), key_);\n\t\t\tif(!greater_equal && !(key_.first == key)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tV value;\n\t\t\t\tread(iter.value(), value, super_t::value_type, super_t::value_code);\n\t\t\t\tvalues.push_back(std::move(value));\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\titer.next();\n\t\t}\n\t\treturn values.size();\n\t}\n\n\tsize_t find_last(const K& key, std::vector<V>& values, const size_t limit) const\n\t{\n\t\tvalues.clear();\n\t\tstd::pair<K, I> key_(key, std::numeric_limits<I>::max());\n\n\t\tTable::Iterator iter(db);\n\t\titer.seek_prev(write(key_));\n\t\twhile(iter.is_valid() && values.size() < limit)\n\t\t{\n\t\t\tread(iter.key(), key_);\n\t\t\tif(!(key_.first == key)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tV value;\n\t\t\t\tread(iter.value(), value, super_t::value_type, super_t::value_code);\n\t\t\t\tvalues.push_back(std::move(value));\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\titer.prev();\n\t\t}\n\t\treturn values.size();\n\t}\n\n\tsize_t find_range(const K& begin, const K& end, std::vector<V>& values) const\n\t{\n\t\tvalues.clear();\n\t\tstd::pair<K, I> key_(begin, 0);\n\n\t\tTable::Iterator iter(db);\n\t\titer.seek(write(key_));\n\t\twhile(iter.is_valid()) {\n\t\t\tread(iter.key(), key_);\n\t\t\tif(!(key_.first < end)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tV value;\n\t\t\t\tread(iter.value(), value, super_t::value_type, super_t::value_code);\n\t\t\t\tvalues.push_back(std::move(value));\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\titer.next();\n\t\t}\n\t\treturn values.size();\n\t}\n\n\tsize_t find_range(const K& begin, const K& end, std::vector<std::pair<K, V>>& result) const\n\t{\n\t\tresult.clear();\n\t\tstd::pair<K, I> key_(begin, 0);\n\n\t\tTable::Iterator iter(db);\n\t\titer.seek(write(key_));\n\t\twhile(iter.is_valid()) {\n\t\t\tread(iter.key(), key_);\n\t\t\tif(!(key_.first < end)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tstd::pair<K, V> tmp;\n\t\t\t\ttmp.first = key_.first;\n\t\t\t\tread(iter.value(), tmp.second, super_t::value_type, super_t::value_code);\n\t\t\t\tresult.push_back(std::move(tmp));\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\titer.next();\n\t\t}\n\t\treturn result.size();\n\t}\n\n\tvoid scan(const std::function<bool(const K&, const V&)>& callback) const\n\t{\n\t\tsuper_t::scan([callback](const std::pair<K, I>& key, const V& value) -> bool {\n\t\t\treturn callback(key.first, value);\n\t\t});\n\t}\n\n\tusing super_t::commit;\n\tusing super_t::revert;\n\tusing super_t::flush;\n\tusing super_t::iterator;\n\tusing super_t::get_impl;\n\tusing super_t::get_path;\n\n};\n\n\ntemplate<typename K, typename V, typename I = uint32_t>\nclass uint_multi_table : public multi_table<K, V, I> {\npublic:\n\tuint_multi_table() : multi_table<K, V, I>() {}\n\tuint_multi_table(const std::string& file_path) : multi_table<K, V, I>(file_path) {}\nprotected:\n\tvoid read(std::shared_ptr<const db_val_t> entry, std::pair<K, I>& key) const override {\n\t\tif(entry->size != sizeof(K) + sizeof(I)) {\n\t\t\tthrow std::logic_error(\"key size mismatch: \" + std::to_string(entry->size) + \" (\" + multi_table<K, V, I>::get_path() + \")\");\n\t\t}\n\t\tkey.first = vnx::from_big_endian(*((const K*)entry->data));\n\t\tkey.second = vnx::from_big_endian(*((const I*)(entry->data + sizeof(K))));\n\t}\n\tstd::shared_ptr<db_val_t> write(const std::pair<K, I>& key) const override {\n\t\tauto out = std::make_shared<mmx::db_val_t>(sizeof(K) + sizeof(I));\n\t\tvnx::write_value(out->data, vnx::to_big_endian(key.first));\n\t\tvnx::write_value(out->data + sizeof(K), vnx::to_big_endian(key.second));\n\t\treturn out;\n\t}\n};\n\ntemplate<typename K, typename V, typename I = uint32_t>\nclass hash_multi_table : public multi_table<K, V, I> {\npublic:\n\thash_multi_table() : multi_table<K, V, I>() {}\n\thash_multi_table(const std::string& file_path) : multi_table<K, V, I>(file_path) {}\nprotected:\n\tvoid read(std::shared_ptr<const db_val_t> entry, std::pair<K, I>& key) const override {\n\t\tif(entry->size != key.first.size() + sizeof(I)) {\n\t\t\tthrow std::logic_error(\"key size mismatch: \" + std::to_string(entry->size) + \" (\" + multi_table<K, V, I>::get_path() + \")\");\n\t\t}\n\t\t::memcpy(key.first.data(), entry->data, key.first.size());\n\t\tkey.second = vnx::from_big_endian(*((const I*)(entry->data + key.first.size())));\n\t}\n\tstd::shared_ptr<db_val_t> write(const std::pair<K, I>& key) const override {\n\t\tauto out = std::make_shared<mmx::db_val_t>(key.first.size() + sizeof(I));\n\t\t::memcpy(out->data, key.first.data(), key.first.size());\n\t\tvnx::write_value(out->data + key.first.size(), vnx::to_big_endian(key.second));\n\t\treturn out;\n\t}\n};\n\ntemplate<typename K, typename H, typename V, typename I = uint32_t>\nclass hash_uint_multi_table : public multi_table<std::pair<K, H>, V, I> {\npublic:\n\thash_uint_multi_table() : multi_table<std::pair<K, H>, V, I>() {}\n\thash_uint_multi_table(const std::string& file_path) : multi_table<std::pair<K, H>, V, I>(file_path) {}\nprotected:\n\tvoid read(std::shared_ptr<const db_val_t> entry, std::pair<std::pair<K, H>, I>& key) const override {\n\t\tif(entry->size != key.first.first.size() + sizeof(H) + sizeof(I)) {\n\t\t\tthrow std::logic_error(\"key size mismatch: \" + std::to_string(entry->size) + \" (\" + multi_table<std::pair<K, H>, V, I>::get_path() + \")\");\n\t\t}\n\t\tauto* src = entry->data;\n\t\t::memcpy(key.first.first.data(), src, key.first.first.size()); src += key.first.first.size();\n\t\tkey.first.second = vnx::from_big_endian(*((const H*)src)); src += sizeof(H);\n\t\tkey.second = vnx::from_big_endian(*((const I*)src));\n\t}\n\tstd::shared_ptr<db_val_t> write(const std::pair<std::pair<K, H>, I>& key) const override {\n\t\tauto out = std::make_shared<mmx::db_val_t>(key.first.first.size() + sizeof(H) + sizeof(I));\n\t\tauto* dst = out->data;\n\t\t::memcpy(dst, key.first.first.data(), key.first.first.size()); dst += key.first.first.size();\n\t\tvnx::write_value(dst, vnx::to_big_endian(key.first.second)); dst += sizeof(H);\n\t\tvnx::write_value(dst, vnx::to_big_endian(key.second));\n\t\treturn out;\n\t}\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_MULTI_TABLE_H_ */\n"
  },
  {
    "path": "include/mmx/pos/Prover.h",
    "content": "/*\n * Prover.h\n *\n *  Created on: Feb 6, 2024\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_POS_PROVER_H_\n#define INCLUDE_MMX_POS_PROVER_H_\n\n#include <mmx/PlotHeader.hxx>\n#include <mmx/hash_t.hpp>\n#include <mmx/pos/config.h>\n\n\nnamespace mmx {\nnamespace pos {\n\nstruct proof_data_t\n{\n\tbool valid = false;\n\tuint64_t index = 0;\t\t\t\t\t// final entry index\n\tstd::string error_msg;\t\t\t\t// in case valid == false\n\tstd::vector<uint32_t> proof;\t\t// SSD plots will return full proof as well\n\tbytes_t<META_BYTES_OUT> meta;\n};\n\nclass Prover {\npublic:\n\tbool debug = false;\n\n\tint32_t initial_y_shift = -1024 * 24;\n\n\tProver(const std::string& file_path);\n\n\tstd::vector<proof_data_t> get_qualities(const hash_t& challenge, const int plot_filter) const;\n\n\tproof_data_t get_full_proof(const uint64_t final_index) const;\n\n\tstd::shared_ptr<const PlotHeader> get_header() const {\n\t\treturn header;\n\t}\n\n\tbool has_meta() const {\n\t\treturn header->has_meta;\n\t}\n\n\tstd::string get_file_path() const {\n\t\treturn file_path;\n\t}\n\n\tconst hash_t& get_plot_id() const {\n\t\treturn header->plot_id;\n\t}\n\n\tconst pubkey_t& get_farmer_key() const {\n\t\treturn header->farmer_key;\n\t}\n\n\tconst vnx::optional<addr_t> get_contract() const {\n\t\treturn header->contract;\n\t}\n\n\tint get_ksize() const {\n\t\treturn header->ksize;\n\t}\n\n\tint get_clevel() const {\n\t\treturn header->ksize - header->xbits;\n\t}\n\nprivate:\n\tconst std::string file_path;\n\n\tstd::shared_ptr<const PlotHeader> header;\n\n};\n\n\n} // pos\n} // mmx\n\n#endif /* INCLUDE_MMX_POS_PROVER_H_ */\n"
  },
  {
    "path": "include/mmx/pos/config.h",
    "content": "/*\n * config.h\n *\n *  Created on: Feb 2, 2025\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_POS_CONFIG_H_\n#define INCLUDE_MMX_POS_CONFIG_H_\n\n#include <array>\n#include <cstdint>\n\n\nnamespace mmx {\nnamespace pos {\n\nstatic constexpr int N_META = 14;\nstatic constexpr int N_META_OUT = 12;\nstatic constexpr int N_TABLE = 9;\n\nstatic constexpr int META_BYTES = N_META * 4;\nstatic constexpr int META_BYTES_OUT = N_META_OUT * 4;\n\nstatic constexpr int MEM_HASH_ITER = 256;\n\n\n} // pos\n} // mmx\n\n#endif /* INCLUDE_MMX_POS_CONFIG_H_ */\n"
  },
  {
    "path": "include/mmx/pos/cuda_recompute.h",
    "content": "/*\n * cuda_recompute.h\n *\n *  Created on: Feb 2, 2025\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_POS_CUDA_RECOMPUTE_H_\n#define INCLUDE_MMX_POS_CUDA_RECOMPUTE_H_\n\n#include <mmx/hash_t.hpp>\n#include <mmx/pos/config.h>\n\n#include <cstdint>\n#include <vector>\n#include <string>\n#include <set>\n#include <memory>\n\n\nnamespace mmx {\nnamespace pos {\n\nstruct cuda_device_t {\n\tint index = -1;\n\tstd::string name;\n\tuint32_t max_resident = 0;\n\tuint64_t buffer_size = 0;\n};\n\nstruct cuda_result_t {\n\tuint64_t id = 0;\n\tbool failed = false;\n\tstd::string error;\n\tstd::vector<uint32_t> X;\n\tstd::vector<std::pair<uint32_t, bytes_t<META_BYTES_OUT>>> entries;\n};\n\nbool have_cuda_recompute();\n\nstd::vector<cuda_device_t> get_cuda_devices();\n\nstd::vector<cuda_device_t> get_cuda_devices_used();\n\nvoid cuda_recompute_init(bool enable = true, std::vector<int> device_list = {});\n\nvoid cuda_recompute_shutdown();\n\nuint64_t cuda_recompute(const int ksize, const int xbits, const hash_t& plot_id, const std::vector<uint32_t>& x_values);\n\nstd::shared_ptr<const cuda_result_t> cuda_recompute_poll(const std::set<uint64_t>& jobs);\n\n\n} // pos\n} // mmx\n\n#endif /* INCLUDE_MMX_POS_CUDA_RECOMPUTE_H_ */\n"
  },
  {
    "path": "include/mmx/pos/encoding.h",
    "content": "/*\n * encoding.h\n *\n *  Created on: Nov 20, 2023\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_POS_ENCODING_H_\n#define INCLUDE_MMX_POS_ENCODING_H_\n\n#include <vector>\n#include <cstdint>\n#include <utility>\n#include <stdexcept>\n\n\nnamespace mmx {\nnamespace pos {\n\nstd::vector<uint64_t> encode(const std::vector<uint8_t>& symbols, uint64_t& total_bits);\n\nstd::vector<uint8_t> decode(const std::vector<uint64_t>& bit_stream, const uint64_t num_symbols, const uint64_t bit_offset = 0);\n\n\n// Calculates x * (x-1) / 2. Division is done before multiplication.\nstatic uint64_t GetXEnc(uint32_t x)\n{\n\tuint32_t a = x;\n\tuint32_t b = x - 1;\n\n\tif(a % 2 == 0) {\n\t\ta /= 2;\n\t} else {\n\t\tb /= 2;\n\t}\n\treturn uint64_t(a) * b;\n}\n\nstatic std::pair<uint32_t, uint32_t> LinePointToSquare(uint64_t index)\n{\n\t// Performs a square root, without the use of doubles\n\tuint32_t x = 0;\n\tfor(int i = 31; i >= 0; i--) {\n\t\tconst uint32_t new_x = x + (uint32_t(1) << i);\n\t\tif(GetXEnc(new_x) <= index) {\n\t\t\tx = new_x;\n\t\t}\n\t}\n\treturn std::pair<uint32_t, uint32_t>(x, index - GetXEnc(x));\n}\n\n// Same as LinePointToSquare() but handles the x == y case.\nstatic std::pair<uint32_t, uint32_t> LinePointToSquare3(uint64_t index)\n{\n\tauto res = LinePointToSquare(index);\n\tif(!res.second) {\n\t\t// decode x == y\n\t\t// in this case x is incremented by one and y is zero\n\t\tres.first--;\n\t\tres.second = res.first;\n\t}\n\treturn res;\n}\n\n// Same as LinePointToSquare() but handles the x == y case.\nstatic std::pair<uint32_t, uint32_t> LinePointToSquare2(uint64_t index)\n{\n\tauto res = LinePointToSquare3(index);\n\tres.first--;\n\tres.second--;\n\treturn res;\n}\n\n\n} // pos\n} // mmx\n\n#endif /* INCLUDE_MMX_POS_ENCODING_H_ */\n"
  },
  {
    "path": "include/mmx/pos/mem_hash.h",
    "content": "/*\n * mem_hash.h\n *\n *  Created on: Oct 29, 2023\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_POS_MEM_HASH_H_\n#define INCLUDE_MMX_POS_MEM_HASH_H_\n\n#include <mmx/pos/util.h>\n\n\nnamespace mmx {\nnamespace pos {\n\n/*\n * mem = array of size mem_size\n * key = 64 bytes\n */\nvoid gen_mem_array(uint32_t* mem, const uint8_t* key, const uint32_t mem_size);\n\n/*\n * mem = array of size 1024\n * hash = array of size 128\n */\nvoid calc_mem_hash(uint32_t* mem, uint8_t* hash, const int num_iter);\n\n\n} // pos\n} // mmx\n\n#endif /* INCLUDE_MMX_POS_MEM_HASH_H_ */\n"
  },
  {
    "path": "include/mmx/pos/util.h",
    "content": "/*\n * util.h\n *\n *  Created on: Oct 30, 2023\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_POS_UTIL_H_\n#define INCLUDE_MMX_POS_UTIL_H_\n\n#include <cstdint>\n#include <algorithm>\n\n// compiler-specific byte swap macros.\n#ifdef _MSC_VER\n\t#include <cstdlib>\n\t// https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/byteswap-uint64-byteswap-ulong-byteswap-ushort?view=msvc-160\n\tinline uint16_t bswap_16(uint16_t x) { return _byteswap_ushort(x); }\n\tinline uint32_t bswap_32(uint32_t x) { return _byteswap_ulong(x); }\n\tinline uint64_t bswap_64(uint64_t x) { return _byteswap_uint64(x); }\n#elif defined(__clang__) || defined(__GNUC__)\n\tinline uint16_t bswap_16(uint16_t x) { return __builtin_bswap16(x); }\n\tinline uint32_t bswap_32(uint32_t x) { return __builtin_bswap32(x); }\n\tinline uint64_t bswap_64(uint64_t x) { return __builtin_bswap64(x); }\n#else\n#error \"unknown compiler, don't know how to swap bytes\"\n#endif\n\n#define MMXPOS_HASHROUND(a, b, c, d) \\\n\ta = a + b;              \\\n\td = rotl_32(d ^ a, 16); \\\n\tc = c + d;              \\\n\tb = rotl_32(b ^ c, 12); \\\n\ta = a + b;              \\\n\td = rotl_32(d ^ a, 8);  \\\n\tc = c + d;              \\\n\tb = rotl_32(b ^ c, 7);\n\n\nnamespace mmx {\nnamespace pos {\n\ntemplate<typename Int, typename Int2>\nconstexpr inline Int cdiv(const Int& a, const Int2& b) {\n\treturn (a + b - 1) / b;\n}\n\ninline uint32_t rotl_32(const uint32_t v, int bits)\n{\n#ifdef _MSC_VER\n\treturn _rotl(v, bits);\n#else\n\treturn (v << bits) | (v >> (32 - bits));\n#endif\n}\n\ninline uint64_t rotl_64(const uint64_t v, int bits)\n{\n#ifdef _MSC_VER\n\treturn _rotl64(v, bits);\n#else\n\treturn (v << bits) | (v >> (64 - bits));\n#endif\n}\n\ninline\nuint64_t write_bits(uint64_t* dst, uint64_t value, const uint64_t bit_offset, const uint32_t num_bits)\n{\n\tif(num_bits < 64) {\n\t\tvalue &= ((uint64_t(1) << num_bits) - 1);\n\t}\n\tconst uint32_t shift = bit_offset % 64;\n\tconst uint32_t free_bits = 64 - shift;\n\n\tdst[bit_offset / 64]         |= (value << shift);\n\n\tif(free_bits < num_bits) {\n\t\tdst[bit_offset / 64 + 1] |= (value >> free_bits);\n\t}\n\treturn bit_offset + num_bits;\n}\n\ninline\nuint64_t read_bits(const uint64_t* src, const uint64_t bit_offset, const uint32_t num_bits)\n{\n\tuint32_t count = 0;\n\tuint64_t offset = bit_offset;\n\tuint64_t result = 0;\n\twhile(count < num_bits) {\n\t\tconst uint32_t shift = offset % 64;\n\t\tconst uint32_t bits = std::min<uint32_t>(num_bits - count, 64 - shift);\n\t\tconst uint64_t value = src[offset / 64] >> shift;\n\t\tresult |= value << count;\n\t\tcount += bits;\n\t\toffset += bits;\n\t}\n\tif(num_bits < 64) {\n\t\tresult &= ((uint64_t(1) << num_bits) - 1);\n\t}\n\treturn result;\n}\n\n\n} // pos\n} // mmx\n\n#endif /* INCLUDE_MMX_POS_UTIL_H_ */\n"
  },
  {
    "path": "include/mmx/pos/verify.h",
    "content": "/*\n * verify.h\n *\n *  Created on: Nov 5, 2023\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_POS_VERIFY_H_\n#define INCLUDE_MMX_POS_VERIFY_H_\n\n#include <mmx/hash_t.hpp>\n#include <mmx/pos/config.h>\n\n#include <vector>\n\n\nnamespace mmx {\nnamespace pos {\n\nvoid set_remote_compute(bool enable);\n\nhash_t calc_quality(const hash_t& challenge, const bytes_t<META_BYTES_OUT>& meta);\n\nbool check_post_filter(const hash_t& challenge, const bytes_t<META_BYTES_OUT>& meta, const int post_filter);\n\nstd::vector<std::pair<uint32_t, bytes_t<META_BYTES_OUT>>>\ncompute(const std::vector<uint32_t>& X_values, std::vector<uint32_t>* X_out,\n\t\tconst hash_t& id, const int ksize, const int xbits);\n\nstd::vector<std::pair<uint32_t, bytes_t<META_BYTES_OUT>>>\ncompute_full(\tconst std::vector<uint32_t>& X_in,\n\t\t\t\tconst std::vector<uint32_t>& Y_in,\n\t\t\t\tstd::vector<std::array<uint32_t, N_META>>& M_in,\n\t\t\t\tstd::vector<uint32_t>* X_out,\n\t\t\t\tconst hash_t& id, const int ksize);\n\nhash_t verify(\tconst std::vector<uint32_t>& X_values, const hash_t& challenge, const hash_t& id,\n\t\t\t\tconst int plot_filter, const int post_filter, const int ksize, const bool hard_fork);\n\n\n} // pos\n} // mmx\n\n#endif /* INCLUDE_MMX_POS_VERIFY_H_ */\n"
  },
  {
    "path": "include/mmx/pubkey_t.hpp",
    "content": "/*\n * pubkey_t.hpp\n *\n *  Created on: Nov 25, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_PUBKEY_T_HPP_\n#define INCLUDE_MMX_PUBKEY_T_HPP_\n\n#include <mmx/addr_t.hpp>\n#include <mmx/skey_t.hpp>\n#include <mmx/secp256k1.hpp>\n\n\nnamespace mmx {\n\nclass pubkey_t : public bytes_t<33> {\npublic:\n\ttypedef bytes_t<33> super_t;\n\n\tpubkey_t() = default;\n\n\tpubkey_t(const skey_t& key);\n\n\tpubkey_t(const std::vector<uint8_t>& bytes) : super_t(bytes) {}\n\n\tpubkey_t(const secp256k1_pubkey& key);\n\n\taddr_t get_addr() const;\n\n\tsecp256k1_pubkey to_secp256k1() const;\n\n};\n\ninline\naddr_t pubkey_t::get_addr() const {\n\treturn addr_t(hash_t(bytes));\n}\n\n} // mmx\n\n\nnamespace vnx {\n\ninline\nvoid read(vnx::TypeInput& in, mmx::pubkey_t& value, const vnx::TypeCode* type_code, const uint16_t* code) {\n\tvnx::read(in, (mmx::pubkey_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid write(vnx::TypeOutput& out, const mmx::pubkey_t& value, const vnx::TypeCode* type_code = nullptr, const uint16_t* code = nullptr) {\n\tvnx::write(out, (const mmx::pubkey_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid read(std::istream& in, mmx::pubkey_t& value) {\n\tvnx::read(in, (mmx::pubkey_t::super_t&)value);\n}\n\ninline\nvoid write(std::ostream& out, const mmx::pubkey_t& value) {\n\tvnx::write(out, value.to_string());\n}\n\ninline\nvoid accept(vnx::Visitor& visitor, const mmx::pubkey_t& value) {\n\tvnx::accept(visitor, (const mmx::pubkey_t::super_t&)value);\n}\n\n} // vnx\n\n#endif /* INCLUDE_MMX_PUBKEY_T_HPP_ */\n"
  },
  {
    "path": "include/mmx/secp256k1.hpp",
    "content": "/*\n * secp256k1.hpp\n *\n *  Created on: Nov 28, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_SECP256K1_HPP_\n#define INCLUDE_MMX_SECP256K1_HPP_\n\n#include <secp256k1.h>\n\n#ifdef _MSC_VER\n#include <mmx_iface_export.h>\n#else\n#define MMX_IFACE_EXPORT\n#endif\n\nnamespace mmx {\n\nMMX_IFACE_EXPORT extern const secp256k1_context* g_secp256k1;\n\nvoid secp256k1_init();\n\nvoid secp256k1_free();\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_SECP256K1_HPP_ */\n"
  },
  {
    "path": "include/mmx/signature_t.hpp",
    "content": "/*\n * signature_t.hpp\n *\n *  Created on: Nov 25, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_SIGNATURE_T_HPP_\n#define INCLUDE_MMX_SIGNATURE_T_HPP_\n\n#include <mmx/hash_t.hpp>\n#include <mmx/skey_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/secp256k1.hpp>\n\n#include <mutex>\n\n\nnamespace mmx {\n\nclass signature_t : public bytes_t<64> {\npublic:\n\ttypedef bytes_t<64> super_t;\n\n\tsignature_t() = default;\n\n\tsignature_t(const std::vector<uint8_t>& bytes) : super_t(bytes) {}\n\n\tsignature_t(const secp256k1_ecdsa_signature& sig);\n\n\tbool verify(const pubkey_t& pubkey, const hash_t& hash) const;\n\n\tsecp256k1_ecdsa_signature to_secp256k1() const;\n\n\tsignature_t normalized() const;\n\n\tstatic signature_t sign(const skey_t& skey, const hash_t& hash);\n\n};\n\n} // mmx\n\n\nnamespace vnx {\n\ninline\nvoid read(vnx::TypeInput& in, mmx::signature_t& value, const vnx::TypeCode* type_code, const uint16_t* code) {\n\tvnx::read(in, (mmx::signature_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid write(vnx::TypeOutput& out, const mmx::signature_t& value, const vnx::TypeCode* type_code = nullptr, const uint16_t* code = nullptr) {\n\tvnx::write(out, (const mmx::signature_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid read(std::istream& in, mmx::signature_t& value) {\n\tvnx::read(in, (mmx::signature_t::super_t&)value);\n}\n\ninline\nvoid write(std::ostream& out, const mmx::signature_t& value) {\n\tvnx::write(out, value.to_string());\n}\n\ninline\nvoid accept(vnx::Visitor& visitor, const mmx::signature_t& value) {\n\tvnx::accept(visitor, (const mmx::signature_t::super_t&)value);\n}\n\n} // vnx\n\n#endif /* INCLUDE_MMX_SIGNATURE_T_HPP_ */\n"
  },
  {
    "path": "include/mmx/skey_t.hpp",
    "content": "/*\n * skey_t.hpp\n *\n *  Created on: Nov 25, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_SKEY_T_HPP_\n#define INCLUDE_MMX_SKEY_T_HPP_\n\n#include <mmx/hash_t.hpp>\n#include <mmx/bytes_t.hpp>\n\n\nnamespace mmx {\n\nclass skey_t : public bytes_t<32> {\npublic:\n\ttypedef bytes_t<32> super_t;\n\n\tskey_t() = default;\n\n\texplicit skey_t(const hash_t& hash) : super_t(hash) {}\n\n\t~skey_t() {\n\t\t::memset(data(), 0, size());\n\t}\n\n};\n\n\n} //mmx\n\n\nnamespace vnx {\n\ninline\nvoid read(vnx::TypeInput& in, mmx::skey_t& value, const vnx::TypeCode* type_code, const uint16_t* code) {\n\tvnx::read(in, (mmx::skey_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid write(vnx::TypeOutput& out, const mmx::skey_t& value, const vnx::TypeCode* type_code = nullptr, const uint16_t* code = nullptr) {\n\tvnx::write(out, (const mmx::skey_t::super_t&)value, type_code, code);\n}\n\ninline\nvoid read(std::istream& in, mmx::skey_t& value) {\n\tvnx::read(in, (mmx::skey_t::super_t&)value);\n}\n\ninline\nvoid write(std::ostream& out, const mmx::skey_t& value) {\n\tvnx::write(out, value.to_string());\n}\n\ninline\nvoid accept(vnx::Visitor& visitor, const mmx::skey_t& value) {\n\tvnx::accept(visitor, (const mmx::skey_t::super_t&)value);\n}\n\n} // vnx\n\n#endif /* INCLUDE_MMX_SKEY_T_HPP_ */\n"
  },
  {
    "path": "include/mmx/table.h",
    "content": "/*\n * table.h\n *\n *  Created on: Jun 20, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_TABLE_H_\n#define INCLUDE_MMX_TABLE_H_\n\n#include <mmx/DataBase.h>\n#include <mmx/addr_t.hpp>\n\n#include <vnx/Type.h>\n#include <vnx/Input.hpp>\n#include <vnx/Output.hpp>\n#include <vnx/Memory.hpp>\n#include <vnx/Buffer.hpp>\n#include <vnx/Util.hpp>\n\n#include <tuple>\n\n\nnamespace mmx {\n\nvoid sync_type_codes(const std::string& file_path);\n\ntemplate<typename K, typename V>\nclass table {\npublic:\n\ttable(bool disable_type_codes = true)\n\t\t:\tstream(disable_type_codes)\n\t{\n\t\tvnx::type<V>().create_dynamic_code(value_code);\n\t\tvalue_type = vnx::type<V>().get_type_code();\n\t}\n\n\ttable(const std::string& file_path, bool disable_type_codes = true)\n\t\t:\ttable(disable_type_codes)\n\t{\n\t\topen(file_path);\n\t}\n\n\tvirtual ~table() {\n\t\tclose();\n\t}\n\n\tstd::shared_ptr<Table> open(const std::string& file_path)\n\t{\n\t\tclose();\n\t\treturn db = std::make_shared<Table>(file_path);\n\t}\n\n\tvoid close() {\n\t\tdb = nullptr;\n\t}\n\n\tvoid insert(const K& key, const V& value)\n\t{\n\t\tdb->insert(write(key), write(value, value_type, value_code));\n\t}\n\n\tbool count(const K& key, const uint32_t max_version = -1) const\n\t{\n\t\tV dummy;\n\t\treturn find(key, dummy, max_version);\n\t}\n\n\tbool find(const K& key, V& value, const uint32_t max_version = -1) const\n\t{\n\t\tconst auto entry = db->find(write(key), max_version);\n\t\tif(entry) {\n\t\t\tread(entry, value, value_type, value_code);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tbool find_first(V& value) const\n\t{\n\t\tK dummy;\n\t\treturn find_first(dummy, value);\n\t}\n\n\tbool find_first(K& key, V& value) const\n\t{\n\t\tTable::Iterator iter(db);\n\t\titer.seek_begin();\n\t\tif(iter.is_valid()) {\n\t\t\tread(iter.key(), key);\n\t\t\tread(iter.value(), value, value_type, value_code);\n\t\t\treturn true;\n\t\t}\n\t\tkey = K();\n\t\tvalue = V();\n\t\treturn false;\n\t}\n\n\tbool find_last(V& value) const\n\t{\n\t\tK dummy;\n\t\treturn find_last(dummy, value);\n\t}\n\n\tbool find_last(K& key, V& value) const\n\t{\n\t\tTable::Iterator iter(db);\n\t\titer.seek_last();\n\t\tif(iter.is_valid()) {\n\t\t\tread(iter.key(), key);\n\t\t\tread(iter.value(), value, value_type, value_code);\n\t\t\treturn true;\n\t\t}\n\t\tkey = K();\n\t\tvalue = V();\n\t\treturn false;\n\t}\n\n\tsize_t find_greater_equal(const K& key, std::vector<V>& values, const size_t limit = -1) const\n\t{\n\t\tvalues.clear();\n\n\t\tTable::Iterator iter(db);\n\t\titer.seek(write(key));\n\t\twhile(iter.is_valid() && values.size() < limit) {\n\t\t\ttry {\n\t\t\t\tV value;\n\t\t\t\tread(iter.value(), value, value_type, value_code);\n\t\t\t\tvalues.push_back(std::move(value));\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\titer.next();\n\t\t}\n\t\treturn values.size();\n\t}\n\n\tsize_t find_greater_equal(const K& key, std::vector<std::pair<K, V>>& result, const size_t limit = -1) const\n\t{\n\t\tresult.clear();\n\n\t\tTable::Iterator iter(db);\n\t\titer.seek(write(key));\n\t\twhile(iter.is_valid() && result.size() < limit) {\n\t\t\ttry {\n\t\t\t\tstd::pair<K, V> tmp;\n\t\t\t\tread(iter.key(), tmp.first);\n\t\t\t\tread(iter.value(), tmp, value_type, value_code);\n\t\t\t\tresult.push_back(std::move(tmp));\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\titer.next();\n\t\t}\n\t\treturn result.size();\n\t}\n\n\tsize_t find_range(const K& begin, const K& end, std::vector<V>& values, const size_t limit = -1) const\n\t{\n\t\tvalues.clear();\n\n\t\tTable::Iterator iter(db);\n\t\titer.seek(write(begin));\n\t\twhile(iter.is_valid() && values.size() < limit) {\n\t\t\tK key;\n\t\t\tread(iter.key(), key);\n\t\t\tif(!(key < end)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tV value;\n\t\t\t\tread(iter.value(), value, value_type, value_code);\n\t\t\t\tvalues.push_back(std::move(value));\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\titer.next();\n\t\t}\n\t\treturn values.size();\n\t}\n\n\tsize_t find_range(const K& begin, const K& end, std::vector<std::pair<K, V>>& result, const size_t limit = -1) const\n\t{\n\t\tresult.clear();\n\n\t\tTable::Iterator iter(db);\n\t\titer.seek(write(begin));\n\t\twhile(iter.is_valid() && result.size() < limit) {\n\t\t\tK key;\n\t\t\tread(iter.key(), key);\n\t\t\tif(!(key < end)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tstd::pair<K, V> tmp;\n\t\t\t\ttmp.first = key;\n\t\t\t\tread(iter.value(), tmp.second, value_type, value_code);\n\t\t\t\tresult.push_back(std::move(tmp));\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\titer.next();\n\t\t}\n\t\treturn result.size();\n\t}\n\n\tsize_t find_last_range(const K& begin, const K& end, std::vector<V>& result, const size_t limit) const\n\t{\n\t\tresult.clear();\n\n\t\tTable::Iterator iter(db);\n\t\titer.seek_prev(write(end));\n\t\twhile(iter.is_valid() && result.size() < limit) {\n\t\t\tK key;\n\t\t\tread(iter.key(), key);\n\t\t\tif(!(begin < key || key == begin)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tV value;\n\t\t\t\tread(iter.value(), value, value_type, value_code);\n\t\t\t\tresult.push_back(std::move(value));\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\titer.prev();\n\t\t}\n\t\treturn result.size();\n\t}\n\n\tsize_t find_last_range(const K& begin, const K& end, std::vector<std::pair<K, V>>& result, const size_t limit) const\n\t{\n\t\tresult.clear();\n\n\t\tTable::Iterator iter(db);\n\t\titer.seek_prev(write(end));\n\t\twhile(iter.is_valid() && result.size() < limit) {\n\t\t\tK key;\n\t\t\tread(iter.key(), key);\n\t\t\tif(!(begin < key || key == begin)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tstd::pair<K, V> tmp;\n\t\t\t\ttmp.first = key;\n\t\t\t\tread(iter.value(), tmp.second, value_type, value_code);\n\t\t\t\tresult.push_back(std::move(tmp));\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\titer.prev();\n\t\t}\n\t\treturn result.size();\n\t}\n\n\tvoid scan(const std::function<bool(const K&, const V&)>& callback) const\n\t{\n\t\tTable::Iterator iter(db);\n\t\titer.seek_begin();\n\t\twhile(iter.is_valid()) {\n\t\t\tK key;\n\t\t\tV value;\n\t\t\tbool valid = false;\n\t\t\ttry {\n\t\t\t\tread(iter.key(), key);\n\t\t\t\tread(iter.value(), value, value_type, value_code);\n\t\t\t\tvalid = true;\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\tif(valid) {\n\t\t\t\tif(!callback(key, value)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\titer.next();\n\t\t}\n\t}\n\n\tvoid reverse_scan(const std::function<bool(const K&, const V&)>& callback) const\n\t{\n\t\tTable::Iterator iter(db);\n\t\titer.seek_last();\n\t\twhile(iter.is_valid()) {\n\t\t\tK key;\n\t\t\tV value;\n\t\t\tbool valid = false;\n\t\t\ttry {\n\t\t\t\tread(iter.key(), key);\n\t\t\t\tread(iter.value(), value, value_type, value_code);\n\t\t\t\tvalid = true;\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\tif(valid) {\n\t\t\t\tif(!callback(key, value)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\titer.prev();\n\t\t}\n\t}\n\n\tvoid commit() {\n\t\tdb->commit(db->current_version() + 1);\n\t}\n\n\tvoid commit(const uint32_t new_version) {\n\t\tdb->commit(new_version);\n\t}\n\n\tvoid revert(const uint32_t new_version) {\n\t\tdb->revert(new_version);\n\t}\n\n\tvoid flush() {\n\t\tdb->flush();\n\t}\n\n\tTable::Iterator iterator() const {\n\t\treturn Table::Iterator(db);\n\t}\n\n\tstd::shared_ptr<Table> get_impl() const {\n\t\treturn db;\n\t}\n\n\tstd::string get_path() const {\n\t\treturn db->root_path;\n\t}\n\n\tuint32_t current_version() const {\n\t\treturn db->current_version();\n\t}\n\nprotected:\n\tstruct stream_t {\n\t\tvnx::Memory memory;\n\t\tvnx::Buffer buffer;\n\t\tvnx::MemoryOutputStream stream;\n\t\tvnx::TypeOutput out;\n\t\tstream_t(bool disable_type_codes = true) : stream(&memory), out(&stream) {\n\t\t\tout.disable_type_codes = disable_type_codes;\n\t\t}\n\t};\n\n\tvirtual void read(std::shared_ptr<const db_val_t> entry, K& key) const = 0;\n\n\tvirtual std::shared_ptr<db_val_t> write(const K& key) const = 0;\n\n\tvoid read(std::shared_ptr<const db_val_t> slice, V& value, const vnx::TypeCode* type_code, const std::vector<uint16_t>& code) const\n\t{\n\t\tvnx::PointerInputStream stream(slice->data, slice->size);\n\t\tvnx::TypeInput in(&stream);\n\t\tvnx::read(in, value, type_code, type_code ? nullptr : code.data());\n\t}\n\n\tstd::shared_ptr<db_val_t> write(const V& value, const vnx::TypeCode* type_code, const std::vector<uint16_t>& code)\n\t{\n\t\tstream.out.reset();\n\t\tstream.memory.clear();\n\n\t\tvnx::write(stream.out, value, type_code, type_code ? nullptr : code.data());\n\n\t\tif(stream.memory.get_size()) {\n\t\t\tstream.out.flush();\n\t\t\tstream.buffer = stream.memory;\n\t\t\treturn std::make_shared<db_val_t>(stream.buffer.data(), stream.buffer.size());\n\t\t}\n\t\treturn std::make_shared<db_val_t>(stream.out.get_buffer(), stream.out.get_buffer_pos());\n\t}\n\nprotected:\n\tstd::shared_ptr<Table> db;\n\n\tstream_t stream;\n\tstd::vector<uint16_t> value_code;\n\tconst vnx::TypeCode* value_type = nullptr;\n\n};\n\n\ntemplate<typename K, typename V>\nclass uint_table : public table<K, V> {\npublic:\n\tuint_table() : table<K, V>() {}\n\tuint_table(const std::string& file_path, bool disable_type_codes = true) : table<K, V>(file_path, disable_type_codes) {}\nprotected:\n\tvoid read(std::shared_ptr<const db_val_t> entry, K& key) const override {\n\t\tif(entry->size != sizeof(K)) {\n\t\t\tthrow std::logic_error(\"key size mismatch: \" + std::to_string(entry->size) + \" (\" + table<K, V>::get_path() + \")\");\n\t\t}\n\t\tkey = vnx::from_big_endian(*((const K*)entry->data));\n\t}\n\tstd::shared_ptr<db_val_t> write(const K& key) const override {\n\t\tauto out = std::make_shared<mmx::db_val_t>(sizeof(K));\n\t\tvnx::write_value(out->data, vnx::to_big_endian(key));\n\t\treturn out;\n\t}\n};\n\ntemplate<typename K, typename I, typename V>\nclass uint_uint_table : public table<std::pair<K, I>, V> {\npublic:\n\tuint_uint_table() : table<std::pair<K, I>, V>() {}\n\tuint_uint_table(const std::string& file_path) : table<std::pair<K, I>, V>(file_path) {}\nprotected:\n\tvoid read(std::shared_ptr<const db_val_t> entry, std::pair<K, I>& key) const override {\n\t\tif(entry->size != sizeof(K) + sizeof(I)) {\n\t\t\tthrow std::logic_error(\"key size mismatch: \" + std::to_string(entry->size) + \" (\" + table<std::pair<K, I>, V>::get_path() + \")\");\n\t\t}\n\t\tkey.first = vnx::from_big_endian(*((const K*)entry->data));\n\t\tkey.second = vnx::from_big_endian(*((const I*)(entry->data + sizeof(K))));\n\t}\n\tstd::shared_ptr<db_val_t> write(const std::pair<K, I>& key) const override {\n\t\tauto out = std::make_shared<mmx::db_val_t>(sizeof(K) + sizeof(I));\n\t\tvnx::write_value(out->data, vnx::to_big_endian(key.first));\n\t\tvnx::write_value(out->data + sizeof(K), vnx::to_big_endian(key.second));\n\t\treturn out;\n\t}\n};\n\ntemplate<typename K, typename V>\nclass hash_table : public table<K, V> {\npublic:\n\thash_table() : table<K, V>() {}\n\thash_table(const std::string& file_path) : table<K, V>(file_path) {}\nprotected:\n\tvoid read(std::shared_ptr<const db_val_t> entry, K& key) const override {\n\t\tif(entry->size != key.size()) {\n\t\t\tthrow std::logic_error(\"key size mismatch: \" + std::to_string(entry->size) + \" (\" + table<K, V>::get_path() + \")\");\n\t\t}\n\t\t::memcpy(key.data(), entry->data, key.size());\n\t}\n\tstd::shared_ptr<db_val_t> write(const K& key) const override {\n\t\tauto out = std::make_shared<mmx::db_val_t>(key.size());\n\t\t::memcpy(out->data, key.data(), key.size());\n\t\treturn out;\n\t}\n};\n\ntemplate<typename K, typename H, typename V>\nclass hash_uint_table : public table<std::pair<K, H>, V> {\npublic:\n\thash_uint_table() : table<std::pair<K, H>, V>() {}\n\thash_uint_table(const std::string& file_path) : table<std::pair<K, H>, V>(file_path) {}\nprotected:\n\tvoid read(std::shared_ptr<const db_val_t> entry, std::pair<K, H>& key) const override {\n\t\tauto& hash = key.first;\n\t\tif(entry->size != hash.size() + sizeof(H)) {\n\t\t\tthrow std::logic_error(\"key size mismatch: \" + std::to_string(entry->size) + \" (\" + table<std::pair<K, H>, V>::get_path() + \")\");\n\t\t}\n\t\tauto* src = entry->data;\n\t\t::memcpy(hash.data(), src, hash.size()); src += hash.size();\n\t\tkey.second = vnx::from_big_endian(*((const H*)src)); src += sizeof(H);\n\t}\n\tstd::shared_ptr<db_val_t> write(const std::pair<K, H>& key) const override {\n\t\tconst auto& hash = key.first;\n\t\tauto out = std::make_shared<mmx::db_val_t>(hash.size() + sizeof(H));\n\t\tauto* dst = out->data;\n\t\t::memcpy(dst, hash.data(), hash.size()); dst += hash.size();\n\t\tvnx::write_value(dst, vnx::to_big_endian(key.second)); dst += sizeof(H);\n\t\treturn out;\n\t}\n};\n\ntemplate<typename K, typename H, typename I, typename V>\nclass hash_uint_uint_table : public table<std::tuple<K, H, I>, V> {\npublic:\n\thash_uint_uint_table() : table<std::tuple<K, H, I>, V>() {}\n\thash_uint_uint_table(const std::string& file_path) : table<std::tuple<K, H, I>, V>(file_path) {}\nprotected:\n\tvoid read(std::shared_ptr<const db_val_t> entry, std::tuple<K, H, I>& key) const override {\n\t\tauto& hash = std::get<0>(key);\n\t\tif(entry->size != hash.size() + sizeof(H) + sizeof(I)) {\n\t\t\tthrow std::logic_error(\"key size mismatch: \" + std::to_string(entry->size) + \" (\" + table<std::tuple<K, H, I>, V>::get_path() + \")\");\n\t\t}\n\t\tauto* src = entry->data;\n\t\t::memcpy(hash.data(), src, hash.size()); src += hash.size();\n\t\tstd::get<1>(key) = vnx::from_big_endian(*((const H*)src)); src += sizeof(H);\n\t\tstd::get<2>(key) = vnx::from_big_endian(*((const I*)src));\n\t}\n\tstd::shared_ptr<db_val_t> write(const std::tuple<K, H, I>& key) const override {\n\t\tconst auto& hash = std::get<0>(key);\n\t\tauto out = std::make_shared<mmx::db_val_t>(hash.size() + sizeof(H) + sizeof(I));\n\t\tauto* dst = out->data;\n\t\t::memcpy(dst, hash.data(), hash.size()); dst += hash.size();\n\t\tvnx::write_value(dst, vnx::to_big_endian(std::get<1>(key))); dst += sizeof(H);\n\t\tvnx::write_value(dst, vnx::to_big_endian(std::get<2>(key)));\n\t\treturn out;\n\t}\n};\n\ntemplate<typename V>\nclass balance_table_t : public table<std::pair<addr_t, addr_t>, V> {\npublic:\n\tbalance_table_t() : table<std::pair<addr_t, addr_t>, V>() {}\n\tbalance_table_t(const std::string& file_path) : table<std::pair<addr_t, addr_t>, V>(file_path) {}\nprotected:\n\tvoid read(std::shared_ptr<const db_val_t> entry, std::pair<addr_t, addr_t>& key) const override {\n\t\tif(entry->size != 64) {\n\t\t\tthrow std::logic_error(\"key size mismatch: \" + std::to_string(entry->size) + \" (\" + table<std::pair<addr_t, addr_t>, V>::get_path() + \")\");\n\t\t}\n\t\t::memcpy(key.first.data(), entry->data, 32);\n\t\t::memcpy(key.second.data(), entry->data + 32, 32);\n\t}\n\tstd::shared_ptr<db_val_t> write(const std::pair<addr_t, addr_t>& key) const override {\n\t\tauto out = std::make_shared<mmx::db_val_t>(64);\n\t\t::memcpy(out->data, key.first.data(), 32);\n\t\t::memcpy(out->data + 32, key.second.data(), 32);\n\t\treturn out;\n\t}\n};\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_TABLE_H_ */\n"
  },
  {
    "path": "include/mmx/tree_hash.h",
    "content": "/*\n * tree_hash.h\n *\n *  Created on: Apr 20, 2024\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_TREE_HASH_H_\n#define INCLUDE_MMX_TREE_HASH_H_\n\n#include <mmx/hash_t.hpp>\n\n#include <vector>\n\n\nnamespace mmx {\n\ninline\nhash_t calc_btree_hash(const std::vector<hash_t>& input)\n{\n\tauto tmp = input;\n\twhile(tmp.size() > 1) {\n\t\tstd::vector<hash_t> next;\n\t\tfor(size_t i = 0; i < tmp.size(); i += 2)\n\t\t{\n\t\t\tif(i + 1 < tmp.size()) {\n\t\t\t\tnext.emplace_back(tmp[i] + tmp[i + 1]);\n\t\t\t} else {\n\t\t\t\tnext.push_back(tmp[i]);\n\t\t\t}\n\t\t}\n\t\ttmp = next;\n\t}\n\treturn tmp.empty() ? hash_t() : tmp[0];\n}\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_TREE_HASH_H_ */\n"
  },
  {
    "path": "include/mmx/tx_entry_t.hpp",
    "content": "/*\n * tx_entry_t.hpp\n *\n *  Created on: Oct 19, 2024\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_TX_ENTRY_T_HPP_\n#define INCLUDE_MMX_TX_ENTRY_T_HPP_\n\n#include <mmx/tx_entry_t.hxx>\n\n\nnamespace mmx {\n\ninline\ntx_entry_t tx_entry_t::create_ex(const txio_entry_t& entry, const bool& valid)\n{\n\ttx_entry_t out;\n\tout.txio_entry_t::operator=(entry);\n\tout.is_validated = valid;\n\treturn out;\n}\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_TX_ENTRY_T_HPP_ */\n"
  },
  {
    "path": "include/mmx/txio_entry_t.hpp",
    "content": "/*\n * txio_entry_t.hpp\n *\n *  Created on: Apr 26, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_TXIO_ENTRY_T_HPP_\n#define INCLUDE_MMX_TXIO_ENTRY_T_HPP_\n\n#include <mmx/txio_entry_t.hxx>\n\n\nnamespace mmx {\n\ninline\ntxio_entry_t txio_entry_t::create_ex(const hash_t& txid, const uint32_t& height, const int64_t& time_stamp, const tx_type_e& type, const txio_t& txio)\n{\n\ttxio_entry_t out;\n\tout.txid = txid;\n\tout.height = height;\n\tout.time_stamp = time_stamp;\n\tout.type = type;\n\tout.txio_t::operator=(txio);\n\treturn out;\n}\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_TXIO_ENTRY_T_HPP_ */\n"
  },
  {
    "path": "include/mmx/txio_t.hpp",
    "content": "/*\n * txio_t.hpp\n *\n *  Created on: Sep 16, 2023\n *      Author: mad\n */\n\n#include <mmx/txio_t.hxx>\n\n\nnamespace mmx {\n\nuint64_t txio_t::calc_cost(std::shared_ptr<const ChainParams> params) const\n{\n\treturn params->min_txfee_io\n\t\t\t+ (memo ? std::max<size_t>((memo->size() + 31) / 32, 1) * params->min_txfee_memo : 0);\n}\n\n\n} // mmx\n"
  },
  {
    "path": "include/mmx/uint128.hpp",
    "content": "/*\n * uint128.hpp\n *\n *  Created on: Apr 11, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_UINT128_HPP_\n#define INCLUDE_MMX_UINT128_HPP_\n\n#include <mmx/package.hxx>\n\n#include <uint128_t.h>\n#include <uint256_t.h>\n\n#include <vnx/Input.hpp>\n#include <vnx/Output.hpp>\n#include <vnx/Visitor.h>\n\n#include <cmath>\n\n\nnamespace mmx {\n\nclass uint128 : public uint128_t {\npublic:\n\tuint128() : uint128_t(0) {}\n\n\tuint128(const uint128&) = default;\n\n\tuint128(const uint64_t& value) : uint128_t(value) {}\n\n\tuint128(const uint128_t& value) : uint128_t(value) {}\n\n\tuint128(const uint256_t& value) {\n\t\tif(value >> 128) {\n\t\t\tthrow std::logic_error(\"uint128(uint256_t) overflow\");\n\t\t}\n\t\t*this = value.lower();\n\t}\n\n\tuint128(const std::string& str);\n\n\tstd::string to_string() const {\n\t\treturn str(10);\n\t}\n\n\tstd::string to_hex_string() const {\n\t\treturn \"0x\" + str(16);\n\t}\n\n\tvnx::Variant to_var_arg() const {\n\t\tif((*this) >> 64) {\n\t\t\treturn vnx::Variant(to_hex_string());\n\t\t}\n\t\treturn vnx::Variant(lower());\n\t}\n\n\tdouble to_double() const {\n\t\treturn double(upper()) * pow(2, 64) + double(lower());\n\t}\n\n};\n\n\n} //mmx\n\n\nnamespace vnx {\n\nvoid read(vnx::TypeInput& in, mmx::uint128& value, const vnx::TypeCode* type_code, const uint16_t* code);\n\nvoid write(vnx::TypeOutput& out, const mmx::uint128& value, const vnx::TypeCode* type_code = nullptr, const uint16_t* code = nullptr);\n\ninline\nvoid read(std::istream& in, mmx::uint128& value)\n{\n\tstd::string tmp;\n\tvnx::read(in, tmp);\n\tvalue = mmx::uint128(tmp);\n}\n\ninline\nvoid write(std::ostream& out, const mmx::uint128& value) {\n\tvnx::write(out, value.to_string());\n}\n\ninline\nvoid accept(vnx::Visitor& visitor, const mmx::uint128& value) {\n\tvnx::accept(visitor, value.to_string());\n}\n\n} // vnx\n\n#endif /* INCLUDE_MMX_UINT128_HPP_ */\n"
  },
  {
    "path": "include/mmx/utils.h",
    "content": "/*\n * utils.h\n *\n *  Created on: Dec 10, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_UTILS_H_\n#define INCLUDE_MMX_UTILS_H_\n\n#include <mmx/hash_t.hpp>\n#include <mmx/uint128.hpp>\n#include <mmx/fixed128.hpp>\n#include <mmx/BlockHeader.hxx>\n#include <mmx/ChainParams.hxx>\n\n#include <vnx/Util.hpp>\n#include <vnx/TimeUtil.h>\n#include <vnx/Config.hpp>\n\n#include <uint128_t.h>\n#include <uint256_t.h>\n#include <cmath>\n\n\nnamespace mmx {\n\nbool is_json(const vnx::Variant& var);\n\nuint64_t get_num_bytes(const vnx::Variant& var);\n\ninline\nstd::shared_ptr<const ChainParams> get_params()\n{\n\tauto params = ChainParams::create();\n\tvnx::read_config(\"chain.params\", params);\n\tif(params->challenge_delay <= params->infuse_delay) {\n\t\tthrow std::logic_error(\"challenge_delay <= infuse_delay\");\n\t}\n\tif(params->challenge_interval <= params->challenge_delay) {\n\t\tthrow std::logic_error(\"challenge_interval <= challenge_delay\");\n\t}\n\tif(params->commit_delay >= params->challenge_interval - params->challenge_delay) {\n\t\tthrow std::logic_error(\"commit_delay >= challenge_interval - challenge_delay\");\n\t}\n\tif(params->time_diff_constant % (2 * params->vdf_segment_size)) {\n\t\tthrow std::logic_error(\"time_diff_constant not multiple of 2x vdf_segment_size\");\n\t}\n\tif(params->max_tx_cost > params->max_block_size / 5) {\n\t\tthrow std::logic_error(\"max_tx_cost > band size\");\n\t}\n\treturn params;\n}\n\ninline\ndouble to_value(const uint128_t& amount, const int decimals) {\n\treturn (double(amount.upper()) * pow(2, 64) + double(amount.lower())) * pow(10, -decimals);\n}\n\ninline\ndouble to_value(const uint128_t& amount, std::shared_ptr<const ChainParams> params) {\n\treturn to_value(amount, params->decimals);\n}\n\ninline\nuint128 to_amount(const double value, const int decimals)\n{\n\tif(decimals < 0 || decimals > 18) {\n\t\tthrow std::runtime_error(\"invalid decimals: \" + std::to_string(decimals));\n\t}\n\tif(value == std::numeric_limits<double>::quiet_NaN()) {\n\t\tthrow std::runtime_error(\"invalid value: NaN\");\n\t}\n\tif(value < 0) {\n\t\tthrow std::runtime_error(\"negative value: \" + std::to_string(value));\n\t}\n\tauto shift = uint128_1;\n\tfor(int i = 0; i < decimals; ++i) {\n\t\tshift *= 10;\n\t}\n\tconst double div_64 = pow(2, 64);\n\tconst uint64_t value_128 = value / div_64;\n\tconst uint64_t value_64  = fmod(value, div_64);\n\n\tconst uint256_t amount =\n\t\t\tuint256_t((uint128_t(value_128) << 64) + value_64) * shift\n\t\t\t+ uint64_t(fmod(value, 1) * pow(10, decimals) + 0.5);\n\tif(amount >> 128) {\n\t\tthrow std::runtime_error(\"amount overflow: \" + amount.str(10));\n\t}\n\treturn amount;\n}\n\ninline\nuint128 to_amount(const fixed128& value, const int decimals)\n{\n\treturn value.to_amount(decimals);\n}\n\ninline\nuint128 to_amount(const double value, std::shared_ptr<const ChainParams> params) {\n\treturn to_amount(value, params->decimals);\n}\n\ninline\nbool check_plot_filter(\n\t\tstd::shared_ptr<const ChainParams> params, const hash_t& challenge, const hash_t& plot_id)\n{\n\tconst hash_t hash(std::string(\"plot_filter\") + plot_id + challenge);\n\treturn (hash.to_uint256() >> (256 - params->plot_filter)) == 0;\n}\n\ninline\nbool check_space_fork(std::shared_ptr<const ChainParams> params, const hash_t& challenge, const hash_t& proof_hash)\n{\n\tconst hash_t infuse_hash(std::string(\"proof_infusion_check\") + challenge + proof_hash);\n\n\treturn infuse_hash.to_uint256() % params->challenge_interval == 0;\n}\n\ninline\nhash_t calc_next_challenge(\n\t\tstd::shared_ptr<const ChainParams> params, const hash_t& challenge,\n\t\tconst uint32_t vdf_count, const hash_t& proof_hash, bool& is_space_fork)\n{\n\thash_t out = challenge;\n\tfor(uint32_t i = 0; i < vdf_count; ++i) {\n\t\tout = hash_t(std::string(\"next_challenge\") + out);\n\t}\n\tis_space_fork = check_space_fork(params, out, proof_hash);\n\n\tif(is_space_fork) {\n\t\tout = hash_t(std::string(\"challenge_infusion\") + out + proof_hash);\n\t}\n\treturn out;\n}\n\ninline\nhash_t get_plot_challenge(const hash_t& challenge, const hash_t& plot_id)\n{\n\treturn hash_t(std::string(\"plot_challenge\") + plot_id + challenge);\n}\n\ninline\nuint128_t to_effective_space(const uint128_t num_bytes)\n{\n\treturn (2464 * num_bytes) / 1000;\n}\n\ninline\nuint128_t calc_total_netspace(std::shared_ptr<const ChainParams> params, const uint64_t space_diff)\n{\n\t// the win chance of a k32 at diff 1 is: 0.6979321856\n\t// don't ask why times two, it works\n\tconst auto ideal = uint128_t(space_diff) * params->space_diff_constant * params->avg_proof_count * 2;\n\treturn to_effective_space(ideal);\n}\n\ninline\nbool check_proof_threshold(std::shared_ptr<const ChainParams> params,\n\t\t\t\t\t\t\tconst uint8_t ksize, const hash_t& quality, const uint64_t space_diff, const bool hard_fork)\n{\n\tif(space_diff <= 0) {\n\t\treturn false;\n\t}\n\tconst auto threshold =\n\t\t\t((uint256_1 << 255) / (uint128_t(space_diff) * params->space_diff_constant)) * ((2 * ksize) + 1);\n\n\tauto value = quality.to_uint256();\n\tif(hard_fork) {\n\t\tvalue >>= params->post_filter;\t\t// compensate for post filter\n\t}\n\treturn (value >> (ksize - 1)) < threshold;\n}\n\ninline\nuint16_t get_proof_score(const hash_t& proof_hash)\n{\n\treturn proof_hash.bytes[0];\n}\n\ninline\nuint64_t get_block_iters(std::shared_ptr<const ChainParams> params, const uint64_t time_diff)\n{\n\treturn (time_diff / params->time_diff_divider) * params->time_diff_constant;\n}\n\ninline\nhash_t calc_proof_hash(const hash_t& challenge, const std::vector<uint32_t>& proof_xs)\n{\n\tauto tmp = proof_xs;\n\tfor(auto& x : tmp) {\n\t\tx = vnx::to_little_endian(x);\n\t}\n\t// proof needs to be hashed after challenge, otherwise compression to 256-bit is possible\n\treturn hash_t(challenge + hash_t(tmp.data(), tmp.size() * 4));\n}\n\ninline\nuint64_t calc_project_reward(std::shared_ptr<const ChainParams> params, const uint64_t tx_fees)\n{\n\tconst auto dynamic = (params->project_ratio.value * uint64_t(tx_fees)) / params->project_ratio.inverse;\n\treturn std::min(params->fixed_project_reward + dynamic, tx_fees / 2);\n}\n\ninline\nuint64_t calc_min_reward_deduction(std::shared_ptr<const ChainParams> params, const uint64_t txfee_buffer)\n{\n\tconst uint64_t divider = 8640;\n\tconst uint64_t min_deduction = 1000;\n\treturn std::min(std::max(txfee_buffer / divider, min_deduction), txfee_buffer);\n}\n\ninline\nuint64_t calc_final_block_reward(std::shared_ptr<const ChainParams> params, const uint64_t reward, const uint64_t tx_fees)\n{\n\tconst auto fee_burn = tx_fees / 2;\n\tconst auto fee_deduction = calc_project_reward(params, tx_fees);\n\treturn reward + (tx_fees - std::max(fee_burn, fee_deduction));\n}\n\ninline\nuint64_t calc_new_base_reward(std::shared_ptr<const ChainParams> params, std::shared_ptr<const BlockHeader> prev)\n{\n\tconst auto& base_reward = prev->base_reward;\n\tconst auto& vote_sum = prev->reward_vote_sum;\n\n\tif(prev->reward_vote_count < params->reward_adjust_interval / 2) {\n\t\treturn base_reward;\n\t}\n\tconst auto step_size = std::max<int64_t>(base_reward / params->reward_adjust_div, params->reward_adjust_tick);\n\n\tint64_t reward = base_reward;\n\tif(vote_sum > 0) {\n\t\treward += step_size;\n\t} else if(vote_sum < 0) {\n\t\treward -= step_size;\n\t}\n\treturn std::max<int64_t>(std::min<int64_t>(reward, 4200000000000ll), 0);\n}\n\ninline\nuint64_t get_effective_plot_size(const int ksize)\n{\n\treturn to_effective_space(uint64_t((2 * ksize) + 1) << (ksize - 1));\n}\n\ninline\nuint64_t calc_new_space_diff(std::shared_ptr<const ChainParams> params, std::shared_ptr<const BlockHeader> prev)\n{\n\tconst uint64_t diff = prev->space_diff;\n\tif(diff >> 48) {\n\t\treturn diff - (diff / 1024);\t\t// clamp to 48 bits (should never happen)\n\t}\n\tif(prev->space_fork_len == 0) {\n\t\treturn prev->space_diff;\t\t\t// should only happen at genesis\n\t}\n\tconst uint32_t expected_count = prev->space_fork_len * params->avg_proof_count;\n\n\tconst uint64_t new_diff = (uint128_t(diff) * prev->space_fork_proofs) / expected_count;\n\n\tint64_t delta = new_diff - diff;\n\tdelta /= std::max((16 * params->challenge_interval) / prev->space_fork_len, 1u);\n\n\tif(delta == 0) {\n\t\tdelta = (prev->space_fork_proofs > expected_count ? 1 : -1);\n\t}\n\treturn std::max<int64_t>(diff + delta, 1);\n}\n\ninline\nuint64_t calc_new_netspace_ratio(std::shared_ptr<const ChainParams> params, const uint64_t prev_ratio, const bool is_og_proof)\n{\n\tconst uint64_t value = is_og_proof ? uint64_t(1) << (2 * params->max_diff_adjust) : 0;\n\treturn (prev_ratio * ((uint64_t(1) << params->max_diff_adjust) - 1) + value) >> params->max_diff_adjust;\n}\n\ninline\nuint64_t calc_new_txfee_buffer(std::shared_ptr<const ChainParams> params, std::shared_ptr<const BlockHeader> prev)\n{\n\treturn (prev->txfee_buffer - calc_min_reward_deduction(params, prev->txfee_buffer)) + prev->tx_fees;\n}\n\ninline\nuint128_t calc_block_weight(std::shared_ptr<const ChainParams> params,\n\t\t\t\t\t\t\tstd::shared_ptr<const BlockHeader> block, std::shared_ptr<const BlockHeader> prev)\n{\n\tif(block->proof.empty()) {\n\t\treturn 0;\n\t}\n\tconst auto num_iters = (block->vdf_iters - prev->vdf_iters) / block->vdf_count;\n\tconst auto time_diff = num_iters / params->time_diff_constant;\n\treturn uint128_t(time_diff) * block->proof[0]->difficulty * params->avg_proof_count;\n}\n\ninline\nuint64_t get_vdf_speed(std::shared_ptr<const ChainParams> params, const uint64_t time_diff)\n{\n\treturn (uint128_t(time_diff) * params->time_diff_constant * 1000) / params->time_diff_divider / params->block_interval_ms;\n}\n\ninline\nstd::string get_finger_print(const hash_t& seed_value, const vnx::optional<std::string>& passphrase)\n{\n\thash_t pass_hash;\n\tif(passphrase) {\n\t\tpass_hash = hash_t(\"MMX/fingerprint/\" + *passphrase);\n\t}\n\thash_t hash;\n\tfor(int i = 0; i < 16384; ++i) {\n\t\thash = hash_t(hash + seed_value + pass_hash);\n\t}\n\treturn std::to_string(hash.to_uint<uint32_t>());\n}\n\ninline int64_t get_time_sec() {\n\treturn vnx::get_wall_time_seconds();\n}\n\ninline int64_t get_time_ms() {\n\treturn vnx::get_wall_time_millis();\n}\n\ninline int64_t get_time_us() {\n\treturn vnx::get_wall_time_micros();\n}\n\ntemplate<typename error_t>\nuint64_t cost_to_fee(const uint64_t cost, const uint32_t fee_ratio)\n{\n\tconst auto fee = (uint128_t(cost) * fee_ratio) / 1024;\n\tif(fee.upper()) {\n\t\tthrow error_t(\"fee amount overflow\");\n\t}\n\treturn fee;\n}\n\ntemplate<typename error_t>\nuint64_t fee_to_cost(const uint64_t fee, const uint32_t fee_ratio)\n{\n\tconst auto cost = (uint128_t(fee) * 1024) / fee_ratio;\n\tif(cost.upper()) {\n\t\tthrow error_t(\"cost value overflow\");\n\t}\n\treturn cost;\n}\n\ntemplate<typename T, typename S>\nT clamped_sub(const T L, const S R)\n{\n\tif(L > R) {\n\t\treturn L - R;\n\t}\n\treturn T(0);\n}\n\ntemplate<typename T, typename S>\nvoid clamped_sub_assign(T& L, const S R) {\n\tL = clamped_sub(L, R);\n}\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_UTILS_H_ */\n"
  },
  {
    "path": "include/mmx/vm/Compiler.h",
    "content": "/*\n * Compiler.h\n *\n *  Created on: Dec 19, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_VM_COMPILER_H_\n#define INCLUDE_MMX_VM_COMPILER_H_\n\n#include <mmx/contract/Binary.hxx>\n\n\nnamespace mmx {\nnamespace vm {\n\nstd::shared_ptr<const contract::Binary> compile(const std::string& source, const compile_flags_t& flags = compile_flags_t());\n\nstd::shared_ptr<const contract::Binary> compile_files(const std::vector<std::string>& file_names, const compile_flags_t& flags = compile_flags_t());\n\n\n} // vm\n} // mmx\n\n#endif /* INCLUDE_MMX_VM_COMPILER_H_ */\n"
  },
  {
    "path": "include/mmx/vm/Engine.h",
    "content": "/*\n * Engine.h\n *\n *  Created on: Apr 21, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_VM_ENGINE_H_\n#define INCLUDE_MMX_VM_ENGINE_H_\n\n#include <mmx/addr_t.hpp>\n#include <mmx/txout_t.hxx>\n#include <mmx/vm/var_t.h>\n#include <mmx/vm/varptr_t.hpp>\n#include <mmx/vm/instr_t.h>\n#include <mmx/vm/Storage.h>\n#include <mmx/vm/StorageProxy.h>\n\n#include <set>\n#include <map>\n#include <limits>\n#include <memory>\n#include <string>\n#include <sstream>\n\n\nnamespace mmx {\nnamespace vm {\n\nstatic constexpr uint64_t INSTR_COST = 20;\nstatic constexpr uint64_t INSTR_CALL_COST = 30;\nstatic constexpr uint64_t INSTR_MUL_128_COST = 50;\nstatic constexpr uint64_t INSTR_MUL_256_COST = 200;\nstatic constexpr uint64_t INSTR_DIV_64_COST = 50;\nstatic constexpr uint64_t INSTR_DIV_128_COST = 1000;\nstatic constexpr uint64_t INSTR_DIV_256_COST = 5000;\n\nstatic constexpr uint64_t WRITE_COST = 50;\nstatic constexpr uint64_t WRITE_32_BYTE_COST = 30;\nstatic constexpr uint64_t STOR_READ_COST = 2000;\nstatic constexpr uint64_t STOR_WRITE_COST = 2000;\nstatic constexpr uint64_t STOR_READ_32_BYTE_COST = 50;\nstatic constexpr uint64_t STOR_WRITE_BYTE_COST = 50;\n\nstatic constexpr uint64_t CONV_STRING_UINT_CHAR_COST = 200;\nstatic constexpr uint64_t CONV_UINT_32_STRING_COST = 500;\nstatic constexpr uint64_t CONV_UINT_64_STRING_COST = 1000;\nstatic constexpr uint64_t CONV_UINT_128_STRING_COST = 25000;\nstatic constexpr uint64_t CONV_UINT_256_STRING_COST = 250000;\nstatic constexpr uint64_t CONV_STRING_BECH32_COST = 1000;\nstatic constexpr uint64_t CONV_BECH32_STRING_COST = 1000;\n\nstatic constexpr uint64_t SHA256_BLOCK_COST = 2000;\nstatic constexpr uint64_t ECDSA_VERIFY_COST = 20000;\n\nstatic constexpr uint64_t MAX_KEY_BYTES = 4096;\nstatic constexpr uint64_t MAX_VALUE_BYTES = 1024 * 1024;\nstatic constexpr uint64_t MAX_CALL_RECURSION = 1000;\nstatic constexpr uint64_t MAX_ERASE_RECURSION = 100;\nstatic constexpr uint64_t MAX_COPY_RECURSION = 100;\n\nenum externvar_e : uint32_t {\n\n\tEXTERN_HEIGHT,\n\tEXTERN_TXID,\n\tEXTERN_USER,\n\tEXTERN_BALANCE,\t\t// obsolete\n\tEXTERN_DEPOSIT,\n\tEXTERN_ADDRESS,\n\tEXTERN_NETWORK,\t\t// network identifier\n\n};\n\nenum globalvar_e : uint32_t {\n\n\tGLOBAL_NEXT_ALLOC = 1,\n\tGLOBAL_DYNAMIC_START = 0x1000\n\n};\n\n\nclass Engine {\npublic:\n\tstruct frame_t {\n\t\tuint64_t instr_ptr = 0;\n\t\tuint64_t stack_ptr = 0;\n\t};\n\n\tstd::vector<instr_t> code;\n\tstd::vector<frame_t> call_stack;\n\n\tstd::vector<txout_t> outputs;\n\tstd::vector<txout_t> mint_outputs;\n\n\tuint64_t gas_used = 0;\n\tuint64_t gas_limit = 0;\n\n\tuint32_t error_code = 0;\n\tuint32_t error_addr = -1;\n\n\tconst addr_t contract;\n\n\tbool is_debug = false;\n\tbool do_profile = false;\n\tbool do_trace = false;\n\n\tstd::map<std::string, uint32_t> cost_map;\t\t// key => count\n\n\tstd::function<void(uint32_t level, const std::string& msg)> log_func;\n\tstd::function<void(const std::string& name, const uint64_t data)> event_func;\n\tstd::function<void(const std::string& name, const std::string& method, const uint32_t nargs)> remote_call;\n\tstd::function<void(const addr_t& address, const std::string& field, const uint64_t dst)> read_contract;\n\n\tconst std::shared_ptr<StorageProxy> storage;\n\n\tEngine(const addr_t& contract, std::shared_ptr<Storage> backend, bool read_only);\n\n\tvirtual ~Engine();\n\n\tvoid addref(const uint64_t dst);\n\tvoid unref(const uint64_t dst);\n\n\tvar_t* assign(const uint64_t dst, std::unique_ptr<var_t> value);\n\n\tuint64_t lookup(const uint64_t src, const bool read_only);\n\tuint64_t lookup(const var_t* var, const bool read_only);\n\tuint64_t lookup(const var_t& var, const bool read_only);\n\tuint64_t lookup(const varptr_t& var, const bool read_only);\n\n\tvar_t* write(const uint64_t dst, const var_t* src);\n\tvar_t* write(const uint64_t dst, const var_t& src);\n\tvar_t* write(const uint64_t dst, const varptr_t& var);\n\n\tvar_t* write_entry(const uint64_t dst, const uint64_t key, const var_t& src);\n\tvar_t* write_entry(const uint64_t dst, const uint64_t key, const varptr_t& var);\n\tvoid erase_entry(const uint64_t dst, const uint64_t key);\n\n\tvar_t* write_key(const uint64_t dst, const uint64_t key, const var_t& var);\n\tvar_t* write_key(const uint64_t dst, const var_t& key, const var_t& var);\n\tvar_t* write_key(const uint64_t dst, const varptr_t& key, const varptr_t& var);\n\tvoid erase_key(const uint64_t dst, const uint64_t key);\n\n\tvoid push_back(const uint64_t dst, const var_t& var);\n\tvoid push_back(const uint64_t dst, const varptr_t& var);\n\tvoid push_back(const uint64_t dst, const uint64_t src);\n\tvoid pop_back(const uint64_t dst, const uint64_t& src);\n\n\tvoid erase(const uint64_t dst);\n\n\tvar_t* read(const uint64_t src, const bool mem_only = false);\n\tvar_t& read_fail(const uint64_t src);\n\n\tvar_t* read_entry(const uint64_t src, const uint64_t key);\n\tvar_t& read_entry_fail(const uint64_t src, const uint64_t key);\n\n\tvar_t* read_key(const uint64_t src, const uint64_t key);\n\tvar_t* read_key(const uint64_t src, const var_t& key);\n\tvar_t* read_key(const uint64_t src, const varptr_t& key);\n\tvar_t& read_key_fail(const uint64_t src, const uint64_t key);\n\n\tvoid copy(const uint64_t dst, const uint64_t src);\n\tvoid clone(const uint64_t dst, const uint64_t src);\n\tvoid get(const uint64_t dst, const uint64_t addr, const uint64_t key, const uint8_t flags);\n\tvoid set(const uint64_t addr, const uint64_t key, const uint64_t src, const uint8_t flags);\n\tvoid erase(const uint64_t addr, const uint64_t key, const uint8_t flags);\n\tvoid concat(const uint64_t dst, const uint64_t lhs, const uint64_t rhs);\n\tvoid memcpy(const uint64_t dst, const uint64_t src, const uint64_t count, const uint64_t offset);\n\tvoid conv(const uint64_t dst, const uint64_t src, const uint64_t dflags, const uint64_t sflags);\n\tvoid sha256(const uint64_t dst, const uint64_t src);\n\tvoid verify(const uint64_t dst, const uint64_t msg, const uint64_t pubkey, const uint64_t signature);\n\tvoid log(const uint64_t level, const uint64_t msg);\n\tvoid event(const uint64_t name, const uint64_t data);\n\tvoid send(const uint64_t address, const uint64_t amount, const uint64_t currency, const uint64_t memo);\n\tvoid mint(const uint64_t address, const uint64_t amount, const uint64_t memo);\n\tvoid rcall(const uint64_t name, const uint64_t method, const uint64_t stack_ptr, const uint64_t nargs);\n\tvoid cread(const uint64_t dst, const uint64_t address, const uint64_t field);\n\tvoid read_balance(const uint64_t dst, const uint64_t currency);\n\n\tframe_t& get_frame();\n\tuint64_t get_stack_ptr();\n\tuint64_t deref(const uint64_t src);\n\tuint64_t alloc();\n\n\tvoid init();\n\tvoid begin(const uint64_t instr_ptr);\n\tvoid run();\n\tvoid step();\n\tvoid check_gas();\n\tvoid jump(const uint64_t instr_ptr);\n\tvoid call(const uint64_t instr_ptr, const uint64_t stack_ptr);\n\tbool ret();\n\tvoid exec(const instr_t& instr);\n\n\tvoid commit();\n\n\tvoid clear_stack(const uint64_t offset = 0);\n\n\tvnx::optional<std::string> parse_memo(const uint64_t addr);\n\n\tstd::map<uint64_t, const var_t*> find_entries(const uint64_t dst) const;\n\n\tuint128_t& get_balance(const uint64_t currency_addr);\n\n\tvoid dump_memory(const uint64_t begin = 0, const uint64_t end = -1);\n\n\ttemplate<typename T>\n\tT* read(const uint64_t src, const vartype_e& type);\n\ttemplate<typename T>\n\tT& read_fail(const uint64_t src, const vartype_e& type);\n\ttemplate<typename T>\n\tT* read_key(const uint64_t src, const uint64_t key, const vartype_e& type);\n\ttemplate<typename T>\n\tT& read_key_fail(const uint64_t src, const uint64_t key, const vartype_e& type);\n\nprivate:\n\tvar_t* assign(std::unique_ptr<var_t>& var, std::unique_ptr<var_t> value);\n\tvar_t* write(std::unique_ptr<var_t>& var, const uint64_t* dst, const var_t& src);\n\n\tvoid clear(var_t* var);\n\tvoid erase(std::unique_ptr<var_t>& var);\n\tvoid erase_entries(const uint64_t dst);\n\n\tuint64_t deref_addr(uint32_t src, const bool flag);\n\tuint64_t deref_value(uint32_t src, const bool flag);\n\n\tbool is_true(const uint64_t src);\n\tbool is_true(const var_t& var);\n\nprivate:\n\tbool have_init = false;\n\tstd::map<uint64_t, std::unique_ptr<var_t>> memory;\n\tstd::map<std::pair<uint64_t, uint64_t>, std::unique_ptr<var_t>> entries;\n\tstd::map<const var_t*, uint64_t, varptr_less_t> key_map;\n\tstd::map<addr_t, uint128_t> balance_map;\n\n\tsize_t erase_call_depth = 0;\n\n\tbool first_alloc = true;\n\tuint64_t new_heap_base = -1;\t// start of newly allocated heap for this run\n\n};\n\n\ntemplate<typename T>\nT* Engine::read(const uint64_t src, const vartype_e& type)\n{\n\tif(auto var = read(src)) {\n\t\tif(var->type != type) {\n\t\t\tthrow std::logic_error(\"read type mismatch: expected \"\n\t\t\t\t+ to_string(type) + \", got \" + to_string(var->type));\n\t\t}\n\t\treturn (T*)var;\n\t}\n\treturn nullptr;\n}\n\ntemplate<typename T>\nT& Engine::read_fail(const uint64_t src, const vartype_e& type)\n{\n\tauto& var = read_fail(src);\n\tif(var.type != type) {\n\t\tthrow std::logic_error(\"read type mismatch: expected \"\n\t\t\t\t+ to_string(type) + \", got \" + to_string(var.type));\n\t}\n\treturn (T&)var;\n}\n\ntemplate<typename T>\nT* Engine::read_key(const uint64_t src, const uint64_t key, const vartype_e& type)\n{\n\tif(auto var = read_key(src, key)) {\n\t\tif(var->type != type) {\n\t\t\tthrow std::logic_error(\"read type mismatch: expected \"\n\t\t\t\t+ to_string(type) + \", got \" + to_string(var->type));\n\t\t}\n\t\treturn (T*)var;\n\t}\n\treturn nullptr;\n}\n\ntemplate<typename T>\nT& Engine::read_key_fail(const uint64_t src, const uint64_t key, const vartype_e& type)\n{\n\tauto& var = read_key_fail(src, key);\n\tif(var.type != type) {\n\t\tthrow std::logic_error(\"read type mismatch: expected \"\n\t\t\t\t+ to_string(type) + \", got \" + to_string(var.type));\n\t}\n\treturn (T&)var;\n}\n\n\n} // vm\n} // mmx\n\n#endif /* INCLUDE_MMX_VM_ENGINE_H_ */\n"
  },
  {
    "path": "include/mmx/vm/Storage.h",
    "content": "/*\n * Storage.h\n *\n *  Created on: Apr 22, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_VM_STORAGE_H_\n#define INCLUDE_MMX_VM_STORAGE_H_\n\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <mmx/vm/var_t.h>\n#include <mmx/vm/varptr_t.hpp>\n\n#include <memory>\n\n\nnamespace mmx {\nnamespace vm {\n\nclass Storage {\npublic:\n\tvirtual ~Storage() {}\n\n\tvirtual std::unique_ptr<var_t> read(const addr_t& contract, const uint64_t src) const = 0;\n\n\tvirtual std::unique_ptr<var_t> read(const addr_t& contract, const uint64_t src, const uint64_t key) const = 0;\n\n\tvirtual void write(const addr_t& contract, const uint64_t dst, const var_t& value) = 0;\n\n\tvirtual void write(const addr_t& contract, const uint64_t dst, const uint64_t key, const var_t& value) = 0;\n\n\tvirtual uint64_t lookup(const addr_t& contract, const var_t& value) const = 0;\n\n\n\tvoid write(const addr_t& contract, const uint64_t dst, const varptr_t& value) {\n\t\tif(value) {\n\t\t\twrite(contract, dst, *value);\n\t\t}\n\t}\n\n\tvoid write(const addr_t& contract, const uint64_t dst, const uint64_t key, const varptr_t& value) {\n\t\tif(value) {\n\t\t\twrite(contract, dst, key, *value);\n\t\t}\n\t}\n\n\tuint64_t lookup(const addr_t& contract, const varptr_t& value) const {\n\t\tif(value) {\n\t\t\treturn lookup(contract, *value);\n\t\t}\n\t\treturn 0;\n\t}\n\n\tvirtual void set_balance(const addr_t& contract, const addr_t& currency, const uint128& amount) {\n\t\tthrow std::logic_error(\"not implemented\");\n\t}\n\n\tvirtual std::unique_ptr<uint128> get_balance(const addr_t& contract, const addr_t& currency) {\n\t\tthrow std::logic_error(\"not implemented\");\n\t}\n\n};\n\n\n} // vm\n} // mmx\n\n#endif /* INCLUDE_MMX_VM_STORAGE_H_ */\n"
  },
  {
    "path": "include/mmx/vm/StorageCache.h",
    "content": "/*\n * StorageCache.h\n *\n *  Created on: May 5, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_VM_STORAGECACHE_H_\n#define INCLUDE_MMX_VM_STORAGECACHE_H_\n\n#include <mmx/vm/StorageRAM.h>\n\n\nnamespace mmx {\nnamespace vm {\n\nclass StorageCache : public StorageRAM {\npublic:\n\ttypedef StorageRAM Super;\n\n\tStorageCache(std::shared_ptr<Storage> backend);\n\n\t~StorageCache();\n\n\tstd::unique_ptr<var_t> read(const addr_t& contract, const uint64_t src) const override;\n\n\tstd::unique_ptr<var_t> read(const addr_t& contract, const uint64_t src, const uint64_t key) const override;\n\n\tuint64_t lookup(const addr_t& contract, const var_t& value) const override;\n\n\tvoid commit() const;\n\n\tstd::unique_ptr<uint128> get_balance(const addr_t& contract, const addr_t& currency) override;\n\n\tusing Storage::write;\n\tusing Storage::lookup;\n\nprivate:\n\tstd::shared_ptr<Storage> backend;\n\n};\n\n\n} // vm\n} // mmx\n\n#endif /* INCLUDE_MMX_VM_STORAGECACHE_H_ */\n"
  },
  {
    "path": "include/mmx/vm/StorageDB.h",
    "content": "/*\n * StorageDB.h\n *\n *  Created on: Apr 22, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_VM_STORAGEDB_H_\n#define INCLUDE_MMX_VM_STORAGEDB_H_\n\n#include <mmx/vm/Storage.h>\n#include <mmx/vm/varptr_t.hpp>\n#include <mmx/DataBase.h>\n\n#include <functional>\n\n\nnamespace mmx {\nnamespace vm {\n\nclass StorageDB : public Storage {\npublic:\n\tStorageDB(const std::string& database_path, std::shared_ptr<DataBase> db);\n\n\t~StorageDB();\n\n\tstd::unique_ptr<var_t> read(const addr_t& contract, const uint64_t src) const override;\n\n\tstd::unique_ptr<var_t> read(const addr_t& contract, const uint64_t src, const uint64_t key) const override;\n\n\tstd::unique_ptr<var_t> read_ex(const addr_t& contract, const uint64_t src, const uint32_t height) const;\n\n\tstd::unique_ptr<var_t> read_ex(const addr_t& contract, const uint64_t src, const uint64_t key, const uint32_t height) const;\n\n\tvoid write(const addr_t& contract, const uint64_t dst, const var_t& value) override;\n\n\tvoid write(const addr_t& contract, const uint64_t dst, const uint64_t key, const var_t& value) override;\n\n\tuint64_t lookup(const addr_t& contract, const var_t& value) const override;\n\n\tstd::vector<std::pair<uint64_t, varptr_t>> find_range(\n\t\t\tconst addr_t& contract, const uint64_t begin, const uint64_t end, const uint32_t height = -1) const;\n\n\tstd::vector<std::pair<uint64_t, varptr_t>> find_entries(\n\t\t\tconst addr_t& contract, const uint64_t address, const uint32_t height = -1) const;\n\n\tstd::vector<varptr_t> read_array(\n\t\t\tconst addr_t& contract, const uint64_t address, const uint32_t height = -1) const;\n\n\tvoid set_balance(const addr_t& contract, const addr_t& currency, const uint128& amount) override;\n\n\tstd::unique_ptr<uint128> get_balance(const addr_t& contract, const addr_t& currency) override;\n\n\tstd::function<void(const addr_t&, const addr_t&, const uint128&)> write_balance;\n\n\tstd::function<std::unique_ptr<uint128>(const addr_t&, const addr_t&)> read_balance;\n\n\tusing Storage::write;\n\tusing Storage::lookup;\n\nprivate:\n\tstd::shared_ptr<Table> table;\n\tstd::shared_ptr<Table> table_entries;\n\tstd::shared_ptr<Table> table_index;\n\n};\n\n\n} // vm\n} // mmx\n\n#endif /* INCLUDE_MMX_VM_STORAGEDB_H_ */\n"
  },
  {
    "path": "include/mmx/vm/StorageProxy.h",
    "content": "/*\n * StorageProxy.h\n *\n *  Created on: Apr 24, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_VM_STORAGEPROXY_H_\n#define INCLUDE_MMX_VM_STORAGEPROXY_H_\n\n#include <mmx/vm/Storage.h>\n\n#include <vector>\n\n\nnamespace mmx {\nnamespace vm {\n\nclass Engine;\n\nclass StorageProxy : public Storage {\npublic:\n\tEngine* const engine;\n\n\tconst std::shared_ptr<Storage> backend;\n\n\tconst bool read_only;\n\n\tstruct trace_t {\n\t\tstd::string type;\n\t\taddr_t contract;\n\t\tuint64_t addr = 0;\n\t\tuint64_t key = 0;\n\t\tvarptr_t value;\n\t};\n\tmutable std::vector<trace_t> trace;\n\n\tStorageProxy(Engine* engine, std::shared_ptr<Storage> backend, bool read_only);\n\n\tstd::unique_ptr<var_t> read(const addr_t& contract, const uint64_t src) const override;\n\n\tstd::unique_ptr<var_t> read(const addr_t& contract, const uint64_t src, const uint64_t key) const override;\n\n\tvoid write(const addr_t& contract, const uint64_t dst, const var_t& value) override;\n\n\tvoid write(const addr_t& contract, const uint64_t dst, const uint64_t key, const var_t& value) override;\n\n\tuint64_t lookup(const addr_t& contract, const var_t& value) const override;\n\n\tstd::unique_ptr<uint128> get_balance(const addr_t& contract, const addr_t& currency) override;\n\n\tusing Storage::write;\n\tusing Storage::lookup;\n\nprivate:\n\tstd::unique_ptr<var_t> read_ex(std::unique_ptr<var_t> var) const;\n\n};\n\n\n} // vm\n} // mmx\n\n\n\n#endif /* INCLUDE_MMX_VM_STORAGEPROXY_H_ */\n"
  },
  {
    "path": "include/mmx/vm/StorageRAM.h",
    "content": "/*\n * StorageRAM.h\n *\n *  Created on: Apr 30, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_VM_STORAGERAM_H_\n#define INCLUDE_MMX_VM_STORAGERAM_H_\n\n#include <mmx/vm/Storage.h>\n\n#include <map>\n#include <tuple>\n#include <mutex>\n#include <unordered_map>\n\n\nnamespace mmx {\nnamespace vm {\n\nclass StorageRAM : public Storage {\npublic:\n\t~StorageRAM();\n\n\t// all methods below are thread-safe\n\n\tstd::unique_ptr<var_t> read(const addr_t& contract, const uint64_t src) const override;\n\n\tstd::unique_ptr<var_t> read(const addr_t& contract, const uint64_t src, const uint64_t key) const override;\n\n\tvoid write(const addr_t& contract, const uint64_t dst, const var_t& value) override;\n\n\tvoid write(const addr_t& contract, const uint64_t dst, const uint64_t key, const var_t& value) override;\n\n\tuint64_t lookup(const addr_t& contract, const var_t& value) const override;\n\n\tvoid clear();\n\n\tvoid set_balance(const addr_t& contract, const addr_t& currency, const uint128& amount) override;\n\n\tstd::unique_ptr<uint128> get_balance(const addr_t& contract, const addr_t& currency) override;\n\n\tconst std::map<std::pair<addr_t, uint64_t>, std::unique_ptr<var_t>>& get_memory() const {\n\t\treturn memory;\n\t}\n\n\tconst std::map<std::tuple<addr_t, uint64_t, uint64_t>, std::unique_ptr<var_t>>& get_entries() const {\n\t\treturn entries;\n\t}\n\n\tvoid dump_memory(std::ostream& out) const;\n\n\tusing Storage::write;\n\tusing Storage::lookup;\n\nprotected:\n\tmutable std::mutex mutex;\n\tstd::map<std::pair<addr_t, uint64_t>, std::unique_ptr<var_t>> memory;\n\tstd::map<std::tuple<addr_t, uint64_t, uint64_t>, std::unique_ptr<var_t>> entries;\n\tstd::map<addr_t, std::map<const var_t*, uint64_t, varptr_less_t>> key_map;\n\n\tstd::map<addr_t, std::map<addr_t, uint128>> balance_map;\n\n};\n\n\n} // vm\n} // mmx\n\n#endif /* INCLUDE_MMX_VM_STORAGERAM_H_ */\n"
  },
  {
    "path": "include/mmx/vm/instr_t.h",
    "content": "/*\n * instr_t.h\n *\n *  Created on: Apr 21, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_VM_INSTR_T_H_\n#define INCLUDE_MMX_VM_INSTR_T_H_\n\n#include <cstdint>\n#include <string>\n#include <vector>\n#include <memory>\n\n\nnamespace mmx {\nnamespace vm {\n\nstatic constexpr uint8_t OPFLAG_REF_A = (1 << 0);\nstatic constexpr uint8_t OPFLAG_REF_B = (1 << 1);\nstatic constexpr uint8_t OPFLAG_REF_C = (1 << 2);\nstatic constexpr uint8_t OPFLAG_REF_D = (1 << 3);\nstatic constexpr uint8_t OPFLAG_HARD_FAIL = (1 << 4);\nstatic constexpr uint8_t OPFLAG_CATCH_OVERFLOW = (1 << 5);\nstatic constexpr uint8_t OPFLAG_BITWISE = (1 << 6);\n\nenum opcode_e : uint8_t {\n\n\tOP_NOP,\n\tOP_CLR,\t\t\t// dst\n\tOP_COPY,\t\t// dst, src\n\tOP_CLONE,\t\t// dst, src\n\tOP_JUMP,\t\t// dst\n\tOP_JUMPI,\t\t// dst, cond\n\tOP_JUMPN,\t\t// dst, cond\n\tOP_CALL,\t\t// addr, stack_ptr\n\tOP_RET,\n\n\tOP_ADD = 0x20,\t// dst, lhs, rhs\n\tOP_SUB,\t\t\t// dst, lhs, rhs\n\tOP_MUL,\t\t\t// dst, lhs, rhs\n\tOP_DIV,\t\t\t// dst, lhs, rhs\n\tOP_MOD,\t\t\t// dst, lhs, rhs\n\n\tOP_NOT = 0x40,\t// dst, src\n\tOP_XOR,\t\t\t// dst, lhs, rhs\n\tOP_AND,\t\t\t// dst, lhs, rhs\n\tOP_OR,\t\t\t// dst, lhs, rhs\n\tOP_MIN,\t\t\t// dst, lhs, rhs\n\tOP_MAX,\t\t\t// dst, lhs, rhs\n\tOP_SHL,\t\t\t// dst, src, count\n\tOP_SHR,\t\t\t// dst, src, count\n\n\tOP_CMP_EQ = 0x60,\t// dst, lhs, rhs\n\tOP_CMP_NEQ,\t\t\t// dst, lhs, rhs\n\tOP_CMP_LT,\t\t\t// dst, lhs, rhs\n\tOP_CMP_GT,\t\t\t// dst, lhs, rhs\n\tOP_CMP_LTE,\t\t\t// dst, lhs, rhs\n\tOP_CMP_GTE,\t\t\t// dst, lhs, rhs\n\n\tOP_TYPE = 0x80,\t// dst, addr\n\tOP_SIZE,\t\t// dst, addr\n\tOP_GET,\t\t\t// dst, addr, key\n\tOP_SET,\t\t\t// addr, key, src\n\tOP_ERASE,\t\t// addr, key\n\tOP_PUSH_BACK,\t// addr, src\n\tOP_POP_BACK,\t// dst, src\n\n\tOP_CONV = 0xA0,\t// dst, src, dflags, sflags\n\tOP_CONCAT,\t\t// dst, lhs, rhs\n\tOP_MEMCPY,\t\t// dst, src, count, offset\n\tOP_SHA256,\t\t// dst, src\n\tOP_VERIFY,\t\t// dst, msg, pubkey, signature\n\n\tOP_LOG = 0xC0,\t// level, message\n\tOP_SEND,\t\t// address, amount, currency, memo\n\tOP_MINT,\t\t// address, amount, memo\n\tOP_EVENT,\t\t// name, data\n\tOP_FAIL,\t\t// message, code\n\tOP_RCALL,\t\t// name, method, stack_ptr, nargs (remote call)\n\tOP_CREAD,\t\t// dst, address, field (contract read)\n\tOP_BALANCE,\t\t// dst, currency\n\n};\n\nenum convtype_e : uint32_t {\n\n\tCONVTYPE_DEFAULT = 0,\n\tCONVTYPE_BASE_2,\n\tCONVTYPE_BASE_8,\n\tCONVTYPE_BASE_10,\n\tCONVTYPE_BASE_16,\n\tCONVTYPE_BOOL,\n\tCONVTYPE_UINT,\n\tCONVTYPE_STRING,\n\tCONVTYPE_BINARY,\n\tCONVTYPE_ARRAY,\n\tCONVTYPE_ADDRESS,\n\tCONVTYPE_BIG_ENDIAN,\n\tCONVTYPE_LITTLE_ENDIAN,\n\n};\n\nstruct instr_t {\n\n\topcode_e code = OP_NOP;\n\n\tuint8_t flags = 0;\n\n\tuint32_t a = 0;\n\tuint32_t b = 0;\n\tuint32_t c = 0;\n\tuint32_t d = 0;\n\n\tinstr_t() = default;\n\tinstr_t(opcode_e code, uint8_t flags = 0,\n\t\t\tuint32_t a = 0, uint32_t b = 0, uint32_t c = 0, uint32_t d = 0)\n\t\t:\tcode(code), flags(flags), a(a), b(b), c(c), d(d) {}\n\n};\n\nstruct opcode_info_t {\n\n\tstd::string name;\n\n\tuint32_t nargs = 0;\n\n};\n\nconst opcode_info_t& get_opcode_info(opcode_e code);\n\nstd::vector<uint8_t> serialize(const std::vector<instr_t>& code);\n\nsize_t deserialize(std::vector<instr_t>& code, const void* data, const size_t length);\n\nstd::string to_string(const instr_t& instr);\n\n\n} // vm\n} // mmx\n\n#endif /* INCLUDE_MMX_VM_INSTR_T_H_ */\n"
  },
  {
    "path": "include/mmx/vm/var_t.h",
    "content": "/*\n * var_t.h\n *\n *  Created on: Apr 21, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_VM_VAR_T_H_\n#define INCLUDE_MMX_VM_VAR_T_H_\n\n#include <mmx/hash_t.hpp>\n#include <mmx/addr_t.hpp>\n\n#include <vnx/Util.h>\n#include <uint256_t.h>\n\n#include <limits>\n#include <cstdint>\n#include <cstdlib>\n#include <cstring>\n#include <memory>\n#include <sstream>\n#include <stdexcept>\n\n\nnamespace mmx {\nnamespace vm {\n\nstatic constexpr uint64_t SEG_SIZE = 0x4000000;\nstatic constexpr uint64_t STACK_SIZE = 16 * SEG_SIZE;\n\nstatic constexpr uint64_t MEM_CONST = 0;\nstatic constexpr uint64_t MEM_EXTERN = MEM_CONST + SEG_SIZE;\nstatic constexpr uint64_t MEM_STACK = MEM_EXTERN + SEG_SIZE;\nstatic constexpr uint64_t MEM_STATIC = MEM_STACK + STACK_SIZE;\nstatic constexpr uint64_t MEM_HEAP = uint64_t(1) << 32;\n\nstatic constexpr uint64_t STATIC_SIZE = MEM_HEAP - MEM_STATIC;\n\nstatic constexpr uint8_t FLAG_DIRTY = (1 << 0);\nstatic constexpr uint8_t FLAG_CONST = (1 << 1);\nstatic constexpr uint8_t FLAG_STORED = (1 << 2);\nstatic constexpr uint8_t FLAG_DELETED = (1 << 3);\nstatic constexpr uint8_t FLAG_KEY = (1 << 4);\n\nenum vartype_e : uint8_t {\n\n\tTYPE_NIL,\n\tTYPE_FALSE,\n\tTYPE_TRUE,\n\tTYPE_REF,\n\tTYPE_UINT,\n\tTYPE_STRING,\n\tTYPE_BINARY,\n\tTYPE_ARRAY,\n\tTYPE_MAP,\n\n\tTYPE_UINT16,\n\tTYPE_UINT32,\n\tTYPE_UINT64,\n\tTYPE_UINT128,\n\tTYPE_UINT256,\n\n};\n\nstruct var_t {\n\n\tuint32_t ref_count = 0;\n\n\tuint8_t flags = 0;\n\n\tvartype_e type = TYPE_NIL;\n\n\tvar_t() = default;\n\tvar_t(const var_t& var) : ref_count(var.ref_count), flags(var.flags), type(var.type) {}\n\tvar_t(const vartype_e& type) : type(type) {}\n\tvar_t(const vartype_e& type, const uint8_t& flags) : flags(flags), type(type) {}\n\n\texplicit var_t(bool value) {\n\t\ttype = value ? TYPE_TRUE : TYPE_FALSE;\n\t}\n\n\t// needed to make delete work\n\tvirtual ~var_t() {}\n\n\tvoid addref() {\n\t\tif(flags & FLAG_STORED) {\n\t\t\treturn;\n\t\t}\n\t\tflags |= FLAG_DIRTY;\n\t\tref_count++;\n\t}\n\tbool unref() {\n\t\tif(flags & FLAG_STORED) {\n\t\t\treturn false;\n\t\t}\n\t\tif(!ref_count) {\n\t\t\tthrow std::logic_error(\"var_t::unref() underflow\");\n\t\t}\n\t\tflags |= FLAG_DIRTY;\n\t\treturn (ref_count--) == 1;\n\t}\n\tvar_t* pin() {\n\t\tif(flags & FLAG_STORED) {\n\t\t\treturn this;\n\t\t}\n\t\tif(!ref_count) {\n\t\t\tref_count = 1;\n\t\t\tflags |= FLAG_DIRTY;\n\t\t}\n\t\treturn this;\n\t}\n\n};\n\nstruct ref_t : var_t {\n\n\tuint64_t address = 0;\n\n\tref_t() : var_t(TYPE_REF) {}\n\tref_t(const ref_t&) = default;\n\tref_t(uint64_t address) : ref_t() { this->address = address; }\n\n};\n\nstruct uint_t : var_t {\n\n\tuint256_t value = 0;\n\n\tuint_t() : var_t(TYPE_UINT) {}\n\tuint_t(const uint_t&) = default;\n\tuint_t(const uint256_t& value) : uint_t() { this->value = value; }\n\n};\n\nstruct binary_t : var_t {\n\n\tuint32_t size = 0;\n\tuint32_t capacity = 0;\n\n\tbinary_t(const vartype_e& type) : var_t(type) {}\n\n\tbinary_t(const binary_t&) = delete;\n\tbinary_t& operator=(const binary_t&) = delete;\n\n\t~binary_t() {\n\t\t::free(p_data);\n\t}\n\tuint8_t& operator[](size_t index) {\n\t\treturn *(((uint8_t*)p_data) + index);\n\t}\n\tconst uint8_t& operator[](size_t index) const {\n\t\treturn *(((const uint8_t*)p_data) + index);\n\t}\n\tuint8_t* data(const size_t offset = 0) {\n\t\treturn ((uint8_t*)p_data) + offset;\n\t}\n\tconst uint8_t* data(const size_t offset = 0) const {\n\t\treturn ((const uint8_t*)p_data) + offset;\n\t}\n\tconst char* c_str() const {\n\t\treturn (const char*)p_data;\n\t}\n\tstd::string to_string() const {\n\t\treturn std::string(c_str(), size);\n\t}\n\tstd::string to_hex_string() const {\n\t\treturn vnx::to_hex_string(data(), size, false, false);\n\t}\n\tstd::vector<uint8_t> to_vector() const {\n\t\tstd::vector<uint8_t> out(size);\n\t\t::memcpy(out.data(), p_data, size);\n\t\treturn out;\n\t}\n\thash_t to_hash() const {\n\t\tif(size != 32) {\n\t\t\tthrow std::logic_error(\"to_hash(): binary size != 32: \" + std::to_string(size));\n\t\t}\n\t\treturn hash_t::from_bytes(data());\n\t}\n\taddr_t to_addr() const {\n\t\tif(size != 32) {\n\t\t\tthrow std::logic_error(\"to_addr(): binary size != 32: \" + std::to_string(size));\n\t\t}\n\t\treturn addr_t::from_bytes(data());\n\t}\n\n\tstatic std::unique_ptr<binary_t> clone(const binary_t& src) {\n\t\tauto bin = alloc(src);\n\t\tbin->ref_count = src.ref_count;\n\t\tbin->flags = src.flags;\n\t\treturn bin;\n\t}\n\tstatic std::unique_ptr<binary_t> alloc(const binary_t& src) {\n\t\treturn alloc(src, src.type);\n\t}\n\tstatic std::unique_ptr<binary_t> alloc(const binary_t& src, const vartype_e type) {\n\t\tauto bin = unsafe_alloc(src.size, type);\n\t\tbin->size = src.size;\n\t\t::memcpy(bin->data(), src.data(), bin->size);\n\t\t::memset(bin->data(bin->size), 0, bin->capacity - bin->size);\n\t\treturn bin;\n\t}\n\tstatic std::unique_ptr<binary_t> alloc(const std::string& src, const vartype_e type = TYPE_STRING) {\n\t\tauto bin = unsafe_alloc(src.size(), type);\n\t\tbin->size = src.size();\n\t\t::memcpy(bin->data(), src.c_str(), bin->size);\n\t\t::memset(bin->data(bin->size), 0, bin->capacity - bin->size);\n\t\treturn bin;\n\t}\n\tstatic std::unique_ptr<binary_t> alloc(const void* data, const size_t size, const vartype_e type = TYPE_BINARY) {\n\t\tauto bin = unsafe_alloc(size, type);\n\t\tbin->size = size;\n\t\t::memcpy(bin->data(), data, bin->size);\n\t\t::memset(bin->data(bin->size), 0, bin->capacity - bin->size);\n\t\treturn bin;\n\t}\n\tstatic std::unique_ptr<binary_t> alloc(const size_t size, const vartype_e type) {\n\t\tauto bin = unsafe_alloc(size, type);\n\t\t::memset(bin->data(), 0, bin->capacity);\n\t\tbin->size = size;\n\t\treturn bin;\n\t}\n\tstatic std::unique_ptr<binary_t> unsafe_alloc(size_t size, const vartype_e type) {\n\t\tif(size >= std::numeric_limits<uint32_t>::max()) {\n\t\t\tthrow std::logic_error(\"binary size overflow\");\n\t\t}\n\t\tswitch(type) {\n\t\t\tcase TYPE_BINARY: break;\n\t\t\tcase TYPE_STRING: size += 1; break;\n\t\t\tdefault: throw std::logic_error(\"invalid binary type\");\n\t\t}\n\t\tauto bin = std::make_unique<binary_t>(type);\n\t\tbin->capacity = size;\n\t\tbin->p_data = ::malloc(size);\n\t\treturn bin;\n\t}\n\nprivate:\n\tvoid* p_data = nullptr;\n\n};\n\nstruct array_t : var_t {\n\n\tuint64_t address = 0;\n\tuint32_t size = 0;\n\n\tarray_t() : var_t(TYPE_ARRAY) {}\n\tarray_t(const array_t&) = default;\n\tarray_t(uint32_t size) : array_t() { this->size = size; }\n\n};\n\nstruct map_t : var_t {\n\n\tuint64_t address = 0;\n\n\tmap_t() : var_t(TYPE_MAP) {}\n\tmap_t(const map_t&) = default;\n\n};\n\nclass invalid_type : public std::logic_error {\npublic:\n\tinvalid_type(const var_t& var)\n\t\t:\tlogic_error(\"invalid type: \" + std::to_string(int(var.type))) {}\n};\n\nstd::unique_ptr<var_t> clone(const var_t& src);\n\nstd::unique_ptr<var_t> clone(const var_t* var);\n\nint compare(const var_t& lhs, const var_t& rhs);\n\nint compare(const var_t* lhs, const var_t* rhs);\n\nstd::pair<std::unique_ptr<uint8_t[]>, size_t> serialize(const var_t& src, bool with_rc = true, bool with_vf = true);\n\nsize_t deserialize(std::unique_ptr<var_t>& var, const void* data, const size_t length, bool with_rc = true, bool with_vf = true);\n\nstruct varptr_less_t {\n\tbool operator()(const var_t* const& lhs, const var_t* const& rhs) const {\n\t\treturn compare(lhs, rhs) < 0;\n\t}\n};\n\ninline bool operator<(const var_t& lhs, const var_t& rhs) {\n\treturn compare(lhs, rhs) < 0;\n}\ninline bool operator>(const var_t& lhs, const var_t& rhs) {\n\treturn compare(lhs, rhs) > 0;\n}\ninline bool operator==(const var_t& lhs, const var_t& rhs) {\n\treturn compare(lhs, rhs) == 0;\n}\ninline bool operator!=(const var_t& lhs, const var_t& rhs) {\n\treturn compare(lhs, rhs) != 0;\n}\n\ninline size_t num_bytes(const var_t& var) {\n\tswitch(var.type) {\n\t\tcase TYPE_REF:\n\t\t\treturn 8;\n\t\tcase TYPE_UINT:\n\t\t\treturn 32;\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY:\n\t\t\treturn ((const binary_t&)var).size;\n\t\tcase TYPE_ARRAY:\n\t\t\treturn 8 + 4;\n\t\tcase TYPE_MAP:\n\t\t\treturn 8;\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n}\n\nstd::string to_string(const vartype_e& type);\n\nstd::string to_string(const var_t& var);\n\nstd::string to_string_value(const var_t& var);\n\nstd::string to_string_value_hex(const var_t& var);\n\nuint64_t to_ref(const var_t& var);\n\nuint256_t to_uint(const var_t& var);\n\nhash_t to_hash(const var_t& var);\n\naddr_t to_addr(const var_t& var);\n\nuint32_t get_size(const var_t& var);\n\ninline size_t num_bytes(const var_t* var) {\n\treturn var ? num_bytes(*var) : 0;\n}\n\ninline std::string to_string(const var_t* var) {\n\treturn var ? to_string(*var) : \"nullptr\";\n}\n\ninline std::string to_string_value(const var_t* var) {\n\treturn var ? to_string_value(*var) : \"nullptr\";\n}\n\ninline std::string to_string_value_hex(const var_t* var) {\n\treturn var ? to_string_value_hex(*var) : \"nullptr\";\n}\n\ninline uint64_t to_ref(const var_t* var) {\n\treturn var ? to_ref(*var) : 0;\n}\n\ninline uint256_t to_uint(const var_t* var) {\n\treturn var ? to_uint(*var) : uint256_0;\n}\n\ninline hash_t to_hash(const var_t* var) {\n\treturn var ? to_hash(*var) : hash_t();\n}\n\ninline addr_t to_addr(const var_t* var) {\n\treturn var ? to_addr(*var) : addr_t();\n}\n\ninline uint32_t get_size(const var_t* var) {\n\treturn var ? get_size(*var) : 0;\n}\n\ntemplate<size_t N>\nstd::unique_ptr<binary_t> to_binary(const bytes_t<N>& value) {\n\treturn binary_t::alloc(value.data(), value.size());\n}\n\ninline\nstd::unique_ptr<binary_t> to_binary(const std::string& value, const vartype_e& type = TYPE_STRING) {\n\treturn binary_t::alloc(value, type);\n}\n\ntemplate<typename T>\nstd::string to_hex(const T addr) {\n\tstd::stringstream ss;\n\tss << \"0x\" << std::uppercase << std::hex << addr;\n\treturn ss.str();\n}\n\ntemplate<typename T>\nstd::string to_bin(const T value) {\n\tstd::stringstream ss;\n\tss << \"0b\";\n\tbool enable = false;\n\tfor(int i = sizeof(T) * 8 - 1; i >= 0; --i) {\n\t\tconst bool bit = (value >> i) & 1;\n\t\tif(bit || enable || i == 0) {\n\t\t\tss << (bit ? '1' : '0');\n\t\t\tenable = true;\n\t\t}\n\t}\n\treturn ss.str();\n}\n\n\n} // vm\n} // mmx\n\n#endif /* INCLUDE_MMX_VM_VAR_T_H_ */\n"
  },
  {
    "path": "include/mmx/vm/varptr_t.hpp",
    "content": "/*\n * varptr_t.hpp\n *\n *  Created on: May 12, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_VM_VARPTR_T_HPP_\n#define INCLUDE_MMX_VM_VARPTR_T_HPP_\n\n#include <mmx/vm/var_t.h>\n\n#include <vnx/Input.h>\n#include <vnx/Output.h>\n#include <vnx/Visitor.h>\n\n\nnamespace mmx {\nnamespace vm {\n\nclass varptr_t {\npublic:\n\tvarptr_t() = default;\n\n\tvarptr_t(const varptr_t&) = default;\n\n\tvarptr_t(const std::nullptr_t&) {}\n\n\ttemplate<typename T>\n\tvarptr_t(std::unique_ptr<T> var) {\n\t\tptr = std::move(var);\n\t}\n\n\tvar_t* get() const {\n\t\treturn ptr.get();\n\t}\n\n\toperator bool() const {\n\t\treturn bool(ptr);\n\t}\n\n\tvar_t& operator*() {\n\t\treturn *ptr;\n\t}\n\n\tconst var_t& operator*() const {\n\t\treturn *ptr;\n\t}\n\n\tvar_t* operator->() {\n\t\treturn get();\n\t}\n\n\tconst var_t* operator->() const {\n\t\treturn get();\n\t}\n\nprivate:\n\tstd::shared_ptr<var_t> ptr;\n\n};\n\ninline bool operator<(const varptr_t& lhs, const varptr_t& rhs) {\n\treturn compare(lhs.get(), rhs.get()) < 0;\n}\n\ninline bool operator>(const varptr_t& lhs, const varptr_t& rhs) {\n\treturn compare(lhs.get(), rhs.get()) > 0;\n}\n\ninline bool operator==(const varptr_t& lhs, const varptr_t& rhs) {\n\treturn compare(lhs.get(), rhs.get()) == 0;\n}\n\ninline bool operator!=(const varptr_t& lhs, const varptr_t& rhs) {\n\treturn compare(lhs.get(), rhs.get()) != 0;\n}\n\ninline std::string to_string(const varptr_t& var) {\n\treturn to_string(var.get());\n}\n\ninline std::string to_string_value(const varptr_t& var) {\n\treturn to_string_value(var.get());\n}\n\ninline std::string to_string_value_hex(const varptr_t& var) {\n\treturn to_string_value_hex(var.get());\n}\n\ninline uint64_t to_ref(const varptr_t& var) {\n\treturn to_ref(var.get());\n}\n\ninline uint256_t to_uint(const varptr_t& var) {\n\treturn to_uint(var.get());\n}\n\ninline hash_t to_hash(const varptr_t& var) {\n\treturn to_hash(var.get());\n}\n\ninline addr_t to_addr(const varptr_t& var) {\n\treturn to_addr(var.get());\n}\n\ninline uint32_t get_size(const varptr_t& var) {\n\treturn get_size(var.get());\n}\n\n\n} // vm\n} // mmx\n\n\nnamespace vnx {\n\nvoid read(vnx::TypeInput& in, mmx::vm::varptr_t& value, const vnx::TypeCode* type_code, const uint16_t* code);\nvoid write(vnx::TypeOutput& out, const mmx::vm::varptr_t& value, const vnx::TypeCode* type_code, const uint16_t* code);\n\nvoid read(std::istream& in, mmx::vm::varptr_t& value);\nvoid write(std::ostream& out, const mmx::vm::varptr_t& value);\n\nvoid accept(vnx::Visitor& visitor, const mmx::vm::varptr_t& value);\n\n} // vnx\n\n#endif /* INCLUDE_MMX_VM_VARPTR_T_HPP_ */\n"
  },
  {
    "path": "include/mmx/vm_interface.h",
    "content": "/*\n * vm_interface.h\n *\n *  Created on: May 9, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_VM_INTERFACE_H_\n#define INCLUDE_MMX_VM_INTERFACE_H_\n\n#include <mmx/vm/Engine.h>\n#include <mmx/contract/Binary.hxx>\n\n#include <vnx/Variant.h>\n\n\nnamespace mmx {\nnamespace vm {\n\nconst contract::method_t* find_method(std::shared_ptr<const contract::Binary> binary, const std::string& method_name);\n\nvoid set_deposit(std::shared_ptr<vm::Engine> engine, const addr_t& currency, const uint128& amount);\n\nstd::vector<std::unique_ptr<vm::var_t>> read_constants(std::shared_ptr<const contract::Binary> binary);\n\nvoid load(\tstd::shared_ptr<vm::Engine> engine,\n\t\t\tstd::shared_ptr<const contract::Binary> binary);\n\nvoid copy(std::shared_ptr<vm::Engine> dst, std::shared_ptr<vm::Engine> src, const uint64_t dst_addr, const uint64_t src_addr);\n\nvoid assign(std::shared_ptr<vm::Engine> engine, const uint64_t dst, const vnx::Variant& value);\n\nvnx::Variant read(std::shared_ptr<vm::Engine> engine, const uint64_t address);\n\nvoid set_args(std::shared_ptr<vm::Engine> engine, const std::vector<vnx::Variant>& args);\n\nvoid execute(std::shared_ptr<vm::Engine> engine, const contract::method_t& method, const bool commit);\n\nvoid dump_code(std::ostream& out, std::shared_ptr<const contract::Binary> bin, const vnx::optional<std::string>& method = nullptr);\n\n\n} // vm\n} // mmx\n\n#endif /* INCLUDE_MMX_VM_INTERFACE_H_ */\n"
  },
  {
    "path": "include/mmx/write_bytes.h",
    "content": "/*\n * write_bytes.h\n *\n *  Created on: Nov 27, 2021\n *      Author: mad\n */\n\n#ifndef INCLUDE_MMX_WRITE_BYTES_H_\n#define INCLUDE_MMX_WRITE_BYTES_H_\n\n#include <mmx/hash_t.hpp>\n#include <mmx/uint128.hpp>\n#include <mmx/txin_t.hxx>\n#include <mmx/txout_t.hxx>\n#include <mmx/ulong_fraction_t.hxx>\n#include <mmx/compile_flags_t.hxx>\n#include <mmx/contract/method_t.hxx>\n\n#include <vnx/Util.hpp>\n#include <vnx/Buffer.hpp>\n#include <vnx/Output.hpp>\n#include <vnx/Object.hpp>\n#include <vnx/Variant.hpp>\n#include <vnx/optional.h>\n\n\nnamespace mmx {\n\ntemplate<typename T>\nvoid write_bytes(vnx::OutputBuffer& out, const vnx::optional<T>& value);\n\ntemplate<typename T, size_t N>\nvoid write_bytes(vnx::OutputBuffer& out, const std::array<T, N>& value);\n\ntemplate<typename T>\nvoid write_bytes(vnx::OutputBuffer& out, const std::vector<T>& value);\n\ntemplate<typename T>\nvoid write_bytes(vnx::OutputBuffer& out, const std::set<T>& value);\n\ntemplate<typename K, typename V>\nvoid write_bytes(vnx::OutputBuffer& out, const std::map<K, V>& value);\n\nvoid write_bytes(vnx::OutputBuffer& out, const vnx::Object& value);\n\ntemplate<typename T>\nvoid write_field(vnx::OutputBuffer& out, const std::string& name, const T& value);\n\ninline void write_bytes(vnx::OutputBuffer& out, const bool& value) {\n\tconst uint8_t tmp = value ? 1 : 0;\n\tout.write(&tmp, sizeof(tmp));\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const int64_t& value) {\n\tconst auto tmp = vnx::to_little_endian(value);\n\tout.write(&tmp, sizeof(tmp));\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const int32_t& value) {\n\twrite_bytes(out, int64_t(value));\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const int16_t& value) {\n\twrite_bytes(out, int64_t(value));\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const int8_t& value) {\n\twrite_bytes(out, int64_t(value));\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const uint64_t& value) {\n\tconst auto tmp = vnx::to_little_endian(value);\n\tout.write(&tmp, sizeof(tmp));\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const uint32_t& value) {\n\twrite_bytes(out, uint64_t(value));\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const uint16_t& value) {\n\twrite_bytes(out, uint64_t(value));\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const uint8_t& value) {\n\twrite_bytes(out, uint64_t(value));\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const uint128& value) {\n\twrite_bytes(out, value.lower());\n\twrite_bytes(out, value.upper());\n}\n\ninline void write_bytes_cstr(vnx::OutputBuffer& out, const char* str) {\n\tout.write(str, ::strlen(str));\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const std::string& value)\n{\n\twrite_bytes_cstr(out, \"string<>\");\n\twrite_bytes(out, uint64_t(value.size()));\n\tout.write(value.data(), value.size());\n}\n\ntemplate<size_t N>\nvoid write_bytes(vnx::OutputBuffer& out, const bytes_t<N>& value)\n{\n\twrite_bytes_cstr(out, \"bytes<>\");\n\twrite_bytes(out, uint64_t(value.size()));\n\tout.write(value.data(), value.size());\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const std::vector<uint8_t>& value)\n{\n\twrite_bytes_cstr(out, \"bytes<>\");\n\twrite_bytes(out, uint64_t(value.size()));\n\tout.write(value.data(), value.size());\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const vnx::Buffer& value)\n{\n\twrite_bytes_cstr(out, \"bytes<>\");\n\twrite_bytes(out, uint64_t(value.size()));\n\tout.write(value.data(), value.size());\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const vnx::Variant& value)\n{\n\tif(value.is_null()) {\n\t\twrite_bytes_cstr(out, \"NULL\");\n\t} else if(value.is_bool()) {\n\t\twrite_bytes(out, value.to<bool>());\n\t} else if(value.is_ulong()) {\n\t\twrite_bytes(out, value.to<uint64_t>());\n\t} else if(value.is_long()) {\n\t\twrite_bytes(out, value.to<int64_t>());\n\t} else if(value.is_string()) {\n\t\twrite_bytes(out, value.to<std::string>());\n\t} else if(value.is_array()) {\n\t\twrite_bytes(out, value.to<std::vector<vnx::Variant>>());\n\t} else if(value.is_object()) {\n\t\twrite_bytes(out, value.to_object());\n\t} else {\n\t\twrite_bytes(out, value.data);\n\t}\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const vnx::Object& value)\n{\n\twrite_bytes_cstr(out, \"object<>\");\n\twrite_bytes(out, value.field);\n}\n\ninline void write_bytes_ex(vnx::OutputBuffer& out, const txio_t& value)\n{\n\twrite_bytes(out, value.address);\n\twrite_bytes(out, value.contract);\n\twrite_bytes(out, value.amount);\n\twrite_bytes(out, value.memo);\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const txin_t& value, bool full_hash = false)\n{\n\twrite_bytes_cstr(out, \"txin_t<>\");\n\twrite_bytes_ex(out, value);\n\tif(full_hash) {\n\t\twrite_bytes(out, value.solution);\n\t\twrite_bytes(out, value.flags);\n\t}\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const txout_t& value)\n{\n\twrite_bytes_cstr(out, \"txout_t<>\");\n\twrite_bytes_ex(out, value);\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const ulong_fraction_t& value)\n{\n\twrite_bytes_cstr(out, \"ulong_fraction_t<>\");\n\twrite_bytes(out, value.value);\n\twrite_bytes(out, value.inverse);\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const compile_flags_t& value)\n{\n\twrite_bytes_cstr(out, \"compile_flags_t<>\");\n\twrite_field(out, \"verbose\", value.verbose);\n\twrite_field(out, \"opt_level\", value.opt_level);\n\twrite_field(out, \"catch_overflow\", value.catch_overflow);\n}\n\ninline void write_bytes(vnx::OutputBuffer& out, const contract::method_t& value)\n{\n\twrite_bytes(out, value.get_type_hash());\n\twrite_field(out, \"name\", value.name);\n\twrite_field(out, \"info\", value.info);\n\twrite_field(out, \"is_init\", value.is_init);\n\twrite_field(out, \"is_const\", value.is_const);\n\twrite_field(out, \"is_public\", value.is_public);\n\twrite_field(out, \"is_payable\", value.is_payable);\n\twrite_field(out, \"entry_point\", value.entry_point);\n\twrite_field(out, \"args\", value.args);\n}\n\ntemplate<typename T>\nvoid write_bytes(vnx::OutputBuffer& out, const vnx::optional<T>& value) {\n\twrite_bytes_cstr(out, \"optional<>\");\n\tif(value) {\n\t\twrite_bytes(out, true);\n\t\twrite_bytes(out, *value);\n\t} else {\n\t\twrite_bytes(out, false);\n\t}\n}\n\ntemplate<typename T, typename S>\nvoid write_bytes(vnx::OutputBuffer& out, const std::pair<T, S>& value) {\n\twrite_bytes_cstr(out, \"pair<>\");\n\twrite_bytes(out, value.first);\n\twrite_bytes(out, value.second);\n}\n\ntemplate<typename T, size_t N>\nvoid write_bytes(vnx::OutputBuffer& out, const std::array<T, N>& value) {\n\twrite_bytes_cstr(out, \"vector<>\");\n\twrite_bytes(out, uint64_t(value.size()));\n\tfor(const auto& elem : value) {\n\t\twrite_bytes(out, elem);\n\t}\n}\n\ntemplate<typename T>\nvoid write_bytes(vnx::OutputBuffer& out, const std::vector<T>& value) {\n\twrite_bytes_cstr(out, \"vector<>\");\n\twrite_bytes(out, uint64_t(value.size()));\n\tfor(const auto& elem : value) {\n\t\twrite_bytes(out, elem);\n\t}\n}\n\ntemplate<typename T>\nvoid write_bytes(vnx::OutputBuffer& out, const std::vector<T>& value, bool full_hash) {\n\twrite_bytes_cstr(out, \"vector<>\");\n\twrite_bytes(out, uint64_t(value.size()));\n\tfor(const auto& elem : value) {\n\t\twrite_bytes(out, elem, full_hash);\n\t}\n}\n\ntemplate<typename T>\nvoid write_bytes(vnx::OutputBuffer& out, const std::set<T>& value) {\n\twrite_bytes_cstr(out, \"vector<>\");\n\twrite_bytes(out, uint64_t(value.size()));\n\tfor(const auto& elem : value) {\n\t\twrite_bytes(out, elem);\n\t}\n}\n\ntemplate<typename K, typename V>\nvoid write_bytes(vnx::OutputBuffer& out, const std::map<K, V>& value) {\n\twrite_bytes_cstr(out, \"vector<>\");\n\twrite_bytes(out, uint64_t(value.size()));\n\tfor(const auto& entry : value) {\n\t\twrite_bytes(out, entry);\n\t}\n}\n\ninline void write_field(vnx::OutputBuffer& out, const std::string& name) {\n\twrite_bytes_cstr(out, \"field<>\");\n\twrite_bytes(out, name);\n}\n\ntemplate<typename T>\nvoid write_field(vnx::OutputBuffer& out, const std::string& name, const T& value) {\n\twrite_field(out, name);\n\twrite_bytes(out, value);\n}\n\ntemplate<typename T>\nvoid write_field(vnx::OutputBuffer& out, const std::string& name, const T& value, bool full_hash) {\n\twrite_field(out, name);\n\twrite_bytes(out, value, full_hash);\n}\n\n\n} // mmx\n\n#endif /* INCLUDE_MMX_WRITE_BYTES_H_ */\n"
  },
  {
    "path": "include/sha256_arm.h",
    "content": "/*\n * sha256_arm.h\n *\n *  Created on: Feb 21, 2024\n *      Author: mad, voidxno\n */\n\n#ifndef INCLUDE_SHA256_ARM_H_\n#define INCLUDE_SHA256_ARM_H_\n\n#include <cstdint>\n\nvoid sha256_arm(uint8_t* out, const uint8_t* in, const uint64_t length);\n\nvoid recursive_sha256_arm(uint8_t* hash, const uint64_t num_iters);\n\nvoid recursive_sha256_arm_x2(uint8_t* hash, const uint64_t num_iters);\n\nbool sha256_arm_available();\n\n\n\n#endif /* INCLUDE_SHA256_ARM_H_ */\n"
  },
  {
    "path": "include/sha256_avx2.h",
    "content": "/*\n * sha256_avx2.h\n *\n *  Created on: Jul 19, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_SHA256_AVX2_H_\n#define INCLUDE_SHA256_AVX2_H_\n\n#include <cstdint>\n\nvoid sha256_64_x8(uint8_t* out, uint8_t* in, const uint64_t length);\n\nvoid sha256_avx2_64_x8(uint8_t* out, uint8_t* in, const uint64_t length);\n\nbool avx2_available();\n\n\n#endif /* INCLUDE_SHA256_AVX2_H_ */\n"
  },
  {
    "path": "include/sha256_ni.h",
    "content": "/*\n * sha256_ni.h\n *\n *  Created on: Jul 19, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_SHA256_NI_H_\n#define INCLUDE_SHA256_NI_H_\n\n#include <cstdint>\n\nvoid sha256_ni(uint8_t* out, const uint8_t* in, const uint64_t length);\n\nvoid recursive_sha256_ni(uint8_t* hash, const uint64_t num_iters);\n\nvoid recursive_sha256_ni_x2(uint8_t* hash, const uint64_t num_iters);\n\nbool sha256_ni_available();\n\n\n\n#endif /* INCLUDE_SHA256_NI_H_ */\n"
  },
  {
    "path": "include/sha512.h",
    "content": "// Copyright (c) 2014-2019 The Bitcoin Core developers\n// Distributed under the MIT software license, see the accompanying\n// file COPYING or http://www.opensource.org/licenses/mit-license.php.\n\n#ifndef BITCOIN_CRYPTO_SHA512_H\n#define BITCOIN_CRYPTO_SHA512_H\n\n#include <stdint.h>\n#include <stdlib.h>\n\n/** A hasher class for SHA-512. */\nclass SHA512\n{\nprivate:\n    uint64_t s[8];\n    unsigned char buf[128];\n    uint64_t bytes;\n\npublic:\n    static constexpr size_t OUTPUT_SIZE = 64;\n\n    SHA512();\n    SHA512& Write(const unsigned char* data, size_t len);\n    void Finalize(unsigned char hash[OUTPUT_SIZE]);\n    SHA512& Reset();\n    uint64_t Size() const { return bytes; }\n};\n\n#endif // BITCOIN_CRYPTO_SHA512_H\n"
  },
  {
    "path": "include/upnp_mapper.h",
    "content": "/*\n * upnp.h\n *\n *  Created on: Oct 22, 2022\n *      Author: mad\n */\n\n#ifndef INCLUDE_UPNP_MAPPER_H_\n#define INCLUDE_UPNP_MAPPER_H_\n\n#include <memory>\n#include <string>\n\n\nclass UPNP_Mapper {\npublic:\n\tvirtual ~UPNP_Mapper() {}\n\n\tvirtual void stop() = 0;\n};\n\n\nstd::shared_ptr<UPNP_Mapper> upnp_start_mapping(const int port, const std::string& app_name);\n\n\n#endif /* INCLUDE_UPNP_MAPPER_H_ */\n"
  },
  {
    "path": "interface/Block.vni",
    "content": "package mmx;\n\nclass Block extends BlockHeader {\n\t\n\tvector<Transaction*> tx_list;\n\t\n\t\n\tvoid finalize();\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_tx_hash() const;\n\t\n\tBlockHeader* get_header() const;\n\t\n\tvector<Transaction*> get_transactions() const;\n\t\n\tvector<txio_entry_t> get_inputs(ChainParams* params) const;\n\t\n\tvector<txio_entry_t> get_outputs(ChainParams* params) const;\n\t\n}\n"
  },
  {
    "path": "interface/BlockHeader.vni",
    "content": "package mmx;\n\nclass BlockHeader {\n\t\n\tuint version;\t\t\t\t\t\t// block format\n\tuint support_flags;\t\t\t\t\t// consensus flags\n\t\n\thash_t hash;\n\thash_t prev;\n\t\n\tuint height;\n\tuint vdf_height;\n\tulong nonce;\n\tlong time_stamp;\t\t\t\t\t// UNIX [ms]\n\t\n\tulong time_diff;\n\tulong space_diff;\n\t\n\tuint128 weight;\n\tuint128 total_weight;\n\t\n\tuint vdf_count;\t\t\t\t\t\t// how many blocks delta\n\tulong vdf_iters;\n\thash_t vdf_output;\n\tvector<addr_t> vdf_reward_addr;\t\t\t// for this block\n\toptional<addr_t> vdf_reward_payout;\t\t// for bundle payout\n\t\n\tvector<ProofOfSpace*> proof;\n\t\n\thash_t proof_hash;\n\thash_t challenge;\t\t\t\t\t// for proof lookups\n\t\n\tbool is_space_fork;\t\t\t\t\t// if challenge is infused + space_diff update\n\tuint space_fork_len;\t\t\t\t// current length of space fork\n\tuint space_fork_proofs;\t\t\t\t// total number of proofs since last space fork\n\t\n\tulong reward_amount;\n\toptional<addr_t> reward_addr;\n\toptional<addr_t> reward_contract;\t\t// plot NFT address\n\toptional<addr_t> reward_account;\t\t// farmer account\n\t\n\tchar reward_vote;\t\t\t\t\t// 0 = unchanged, 1 = up, -1 = down\n\tint  reward_vote_sum;\n\tuint reward_vote_count;\n\tulong base_reward;\n\t\n\taddr_t project_addr;\n\t\n\tulong static_cost;\n\tulong total_cost;\n\t\n\tuint tx_count;\n\tulong tx_fees;\n\tulong txfee_buffer;\n\t\n\thash_t tx_hash;\n\t\n\toptional<signature_t> farmer_sig;\n\t\n\thash_t content_hash;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash() const;\n\t\n\thash_t calc_content_hash() const;\n\t\n\tvoid validate() const;\n\t\n\tBlockHeader* get_header() const;\n\t\n\tpubkey_t get_farmer_key() const;\n\t\n\tblock_index_t get_block_index(long file_offset) const;\n\t\n\tvoid set_space_diff(ChainParams* params, BlockHeader* prev);\n\t\n\tvoid set_base_reward(ChainParams* params, BlockHeader* prev);\n\t\n\t\n\tstatic const uint SUPPORT_HARDFORK1 = 0x1;\n\t\n}\n"
  },
  {
    "path": "interface/ChainParams.vni",
    "content": "package mmx;\n\nclass ChainParams {\n\t\n\tuint port;\n\tint  decimals = 6;\n\tuint min_ksize = 29;\n\tuint max_ksize = 32;\n\tuint plot_filter = 4;\t\t\t\t\t// log2\n\tuint post_filter = 10;\t\t\t\t\t// log2\n\t\n\tuint commit_delay = 18;\t\t\t\t\t// for writing to disk (should be less than challenge_interval - challenge_delay)\n\tuint infuse_delay = 6;\t\t\t\t\t// for primary VDF infusion\n\tuint challenge_delay = 9;\t\t\t\t// blocks until new challange is active\n\tuint challenge_interval = 48;\t\t\t// challenge (and difficulty) is for next N blocks\n\tuint max_diff_adjust = 10;\t\t\t\t// per block (1/2^x)\n\tuint max_vdf_count = 100;\t\t\t\t// chain will halt if no proof is found within this time\n\t\n\tuint avg_proof_count = 3;\n\tuint max_proof_count = 50;\n\tuint max_validators = 11;\n\t\n\tulong min_reward = 200000;\n\tulong vdf_reward = 500000;\t\t\t\t// per vdf_reward_interval\n\tuint  vdf_reward_interval = 50;\n\tuint  vdf_segment_size = 50000;\n\t\n\tuint reward_adjust_div = 100;\t\t\t// relative adjustment per reward_adjust_interval\n\tuint reward_adjust_tick = 10000;\t\t// minimum absolute adjustment\n\tuint reward_adjust_interval = 8640;\t\t// [blocks]\n\tuint target_mmx_gold_price = 2000;\t\t// [MMX / ounce]\n\t\n\tulong time_diff_divider = 1000;\t\t\t// fixed-point precision\n\tulong time_diff_constant = 1000000;\n\tulong space_diff_constant = 100000000;\n\t\n\tulong initial_time_diff = 50;\n\tulong initial_space_diff = 10;\n\tulong initial_time_stamp = 0;\t\t\t// genesis time stamp [ms]\n\t\n\tulong min_txfee = 100;\t\t\t\t\t// per tx\n\tulong min_txfee_io = 100;\t\t\t\t// per input / output\n\tulong min_txfee_sign = 1000;\t\t\t// per solution\n\tulong min_txfee_memo = 50;\t\t\t\t// per memo\n\tulong min_txfee_exec = 10000;\t\t\t// per operation\n\tulong min_txfee_deploy = 100000;\t\t// per contract\n\tulong min_txfee_depend = 50000;\t\t\t// per dependency\n\tulong min_txfee_byte = 10;\t\t\t\t// per byte of data\n\tulong min_txfee_read = 1000;\t\t\t// per lookup\n\tulong min_txfee_read_kbyte = 1000;\t\t// per 1000 bytes of data\n\t\n\tulong max_block_size = 10000000;\t\t// max static size\n\tulong max_block_cost = 100000000;\t\t// includes dynamic cost\n\tulong max_tx_cost = 1000000;\n\t\n\tuint max_rcall_depth = 3;\t\t\t\t// max recursion for remote calls\n\tuint max_rcall_width = 10;\t\t\t\t// max total dependencies\n\t\n\tvector<uint> min_fee_ratio;\t\t\t\t// for dynamic block size\n\t\n\tlong block_interval_ms = 10000;\t\t\t// [ms]\n\t\n\tstring network;\n\t\n\taddr_t nft_binary;\n\taddr_t swap_binary;\n\taddr_t offer_binary;\n\taddr_t token_binary;\n\taddr_t plot_nft_binary;\n\taddr_t escrow_binary;\n\taddr_t time_lock_binary;\n\taddr_t relay_binary;\n\t\n\tulong fixed_project_reward = 50000;\n\tuint_fraction_t project_ratio;\n\t\n\tuint reward_activation = 50000;\n\tuint transaction_activation = 100000;\n\t\n\tuint hardfork1_height = 1000000;\t\t// VDF height\n\t\n\t\n\tdouble get_block_time() const;\t\t\t// [sec]\n\t\n}\n"
  },
  {
    "path": "interface/Challenge.vni",
    "content": "package mmx;\n\nclass Challenge {\n\t\n\tuint vdf_height;\n\t\n\thash_t challenge;\n\t\n\tulong difficulty;\n\t\n}\n"
  },
  {
    "path": "interface/Contract.vni",
    "content": "package mmx;\n\nclass Contract {\n\t\n\tuint version;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash(bool full_hash) const;\n\t\n\tulong num_bytes() const;\n\t\n\tulong calc_cost(ChainParams* params) const;\n\t\n\toptional<addr_t> get_owner() const;\n\t\n\tvoid validate(Solution* solution, hash_t txid) const;\n\t\n\tvnx.Variant read_field(string name) const;\n\t\n}\n"
  },
  {
    "path": "interface/FarmInfo.vni",
    "content": "package mmx;\n\nclass FarmInfo {\n\t\n\tvector<string> plot_dirs;\n\t\n\tmap<uchar, uint> plot_count;\t\t\t// [ksize => count]\n\t\n\tmap<string, pair<ulong, ulong>> harvester_bytes;\t\t// [physical, effective]\n\t\n\tmap<addr_t, pooling_info_t> pool_info;\t\t\t\t\t// [plot_nft => pool info]\n\t\n\tmap<addr_t, pooling_stats_t> pool_stats;\t\t\t\t// [plot_nft => pool stats]\n\t\n\tulong total_bytes;\n\tulong total_bytes_effective;\n\tulong total_balance;\t\t\t\t\t// virtual plots [MMX]\n\t\n\toptional<string> harvester;\n\toptional<hash_t> harvester_id;\n\t\n\toptional<addr_t> reward_addr;\n\t\n}\n"
  },
  {
    "path": "interface/IntervalRequest.vni",
    "content": "package mmx;\n\nclass IntervalRequest {\n\t\n\tuint vdf_height;\n\t\n\tulong start;\n\tulong end;\n\t\n\thash_t infuse;\n\t\n\toptional<hash_t> input;\n\t\n}\n"
  },
  {
    "path": "interface/KeyFile.vni",
    "content": "package mmx;\n\nclass KeyFile {\n\t\n\thash_t seed_value;\n\t\n\toptional<string> finger_print;\t\t// set if passphrase used\n\t\n}\n"
  },
  {
    "path": "interface/LookupInfo.vni",
    "content": "package mmx;\n\nclass LookupInfo {\n\t\n\thash_t id;\t\t\t\t// harvester id\n\t\n\tstring name;\n\t\n\tuint vdf_height;\n\t\n\tuint num_passed;\n\tuint num_total;\n\t\n\tlong slow_time_ms;\t\t// slowest plot lookup time\n\tlong total_time_ms;\t\t// for all plots\n\tlong total_delay_ms;\n\t\n\toptional<string> slow_plot;\t\t// slowest plot file path\n\t\n}\n"
  },
  {
    "path": "interface/NetworkInfo.vni",
    "content": "package mmx;\n\nclass NetworkInfo {\n\t\n\tbool is_synced;\n\t\n\tuint height;\n\tuint vdf_height;\n\tuint synced_since;\n\t\n\tlong time_stamp;\t\t\t// UNIX [ms]\n\t\n\tulong time_diff;\n\tulong space_diff;\n\t\n\tulong block_reward;\t\t\t// MMX * 1e6\n\t\n\tulong total_space;\t\t\t// [GB]\n\tulong total_supply;\t\t\t// MMX * 1e6\n\t\n\tulong address_count;\n\t\n\tdouble vdf_speed;\t\t\t// [MH/s]\n\tdouble block_size;\t\t\t// 0 to 1\n\t\n\tulong average_txfee;\t\t// MMX * 1e6\n\t\n\thash_t genesis_hash;\n\t\n\tstring name;\t\t\t\t// network name\n\t\n\tstring node_commit;\n\tstring node_version;\n\t\n}\n"
  },
  {
    "path": "interface/Operation.vni",
    "content": "package mmx;\n\nclass Operation {\n\t\n\tuint version;\n\t\n\taddr_t address;\t\t\t\t\t// zero = deployed contract\n\t\n\tushort solution = -1;\t\t\t// not part of crypto hash\n\t\n\tstatic const ushort NO_SOLUTION = -1;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash(bool full_hash) const;\n\t\n\tulong calc_cost(ChainParams* params) const;\n\t\n}\n"
  },
  {
    "path": "interface/Partial.vni",
    "content": "package mmx;\n\nclass Partial {\n\t\n\tuint vdf_height;\n\t\n\thash_t hash;\n\t\n\taddr_t contract;\t\t\t\t\t// plot NFT\n\t\n\taddr_t account;\t\t\t\t\t\t// payout address\n\t\n\tstring pool_url;\n\t\n\tstring harvester;\t\t\t\t\t// name (defaults to hostname)\n\t\n\tuint lookup_time_ms;\n\t\n\tProofOfSpace* proof;\n\t\n\toptional<signature_t> farmer_sig;\n\t\n\t\n\thash_t calc_hash() const;\n\t\n}\n"
  },
  {
    "path": "interface/PeerInfo.vni",
    "content": "package mmx;\n\nclass PeerInfo {\n\t\n\tvector<peer_info_t> peers;\n\t\n}\n"
  },
  {
    "path": "interface/PlotHeader.vni",
    "content": "package mmx;\n\nclass PlotHeader {\n\t\n\tint version;\n\t\n\tint ksize;\n\tint xbits;\t\t\t// ksize = uncompressed\n\t\n\tbool has_meta;\n\t\n\thash_t seed;\n\thash_t plot_id;\n\t\n\tpubkey_t farmer_key;\n\t\n\toptional<addr_t> contract;\n\t\n\tulong plot_size;\n\t\n\tint park_size_x;\n\tint park_size_y;\n\tint park_size_pd;\n\tint park_size_meta;\n\t\n\tint park_bytes_x;\n\tint park_bytes_y;\n\tint park_bytes_pd;\n\tint park_bytes_meta;\n\t\n\tint entry_bits_x;\n\n\tulong num_entries_y;\n\t\n\tulong table_offset_x = -1;\n\tulong table_offset_y = -1;\n\tulong table_offset_meta = -1;\n\t\n\tvector<ulong> table_offset_pd;\n\t\n}\n"
  },
  {
    "path": "interface/ProofOfSpace.vni",
    "content": "package mmx;\n\nclass ProofOfSpace {\n\t\n\tushort score;\n\t\n\thash_t plot_id;\n\t\n\thash_t challenge;\t\t\t\t// global challenge (not plot local)\n\t\n\tulong difficulty;\n\t\n\tpubkey_t farmer_key;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash() const;\n\t\n\thash_t calc_proof_hash() const;\n\t\n\tvoid validate() const;\n\t\n}\n"
  },
  {
    "path": "interface/ProofOfSpaceNFT.vni",
    "content": "package mmx;\n\nclass ProofOfSpaceNFT extends ProofOfSpace {\n\t\n\tuchar ksize;\n\t\n\thash_t seed;\n\t\n\tvector<uint> proof_xs;\n\t\n\taddr_t contract;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash() const;\n\t\n\thash_t calc_proof_hash() const;\n\t\n\tvoid validate() const;\n\t\n}\n"
  },
  {
    "path": "interface/ProofOfSpaceOG.vni",
    "content": "package mmx;\n\nclass ProofOfSpaceOG extends ProofOfSpace {\n\t\n\tuchar ksize;\n\t\n\thash_t seed;\n\t\n\tvector<uint> proof_xs;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash() const;\n\t\n\thash_t calc_proof_hash() const;\n\t\n\tvoid validate() const;\n\t\n}\n"
  },
  {
    "path": "interface/ProofOfTime.vni",
    "content": "package mmx;\n\nclass ProofOfTime {\n\t\n\tuint version;\n\t\n\thash_t hash;\n\t\n\tuint vdf_height;\n\t\n\tulong start;\t\t\t\t\t\t// [iters]\n\t\n\tulong num_iters;\n\t\n\tuint segment_size;\n\t\n\thash_t input;\n\t\n\thash_t prev;\t\t\t\t\t\t// infused block hash\n\t\n\taddr_t reward_addr;\n\t\n\tvector<hash_t> segments;\n\t\n\tpubkey_t timelord_key;\n\t\n\tsignature_t timelord_sig;\n\t\n\thash_t content_hash;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash() const;\n\t\n\thash_t calc_content_hash() const;\n\t\n\thash_t get_output() const;\t\t\t\t// final segment output\n\t\n\tulong get_vdf_iters() const;\n\t\n\tvoid validate() const;\n\t\n}\n"
  },
  {
    "path": "interface/ProofResponse.vni",
    "content": "package mmx;\n\nclass ProofResponse {\n\t\n\thash_t hash;\n\t\n\tuint vdf_height;\n\t\n\tProofOfSpace* proof;\n\t\n\tsignature_t farmer_sig;\n\t\n\thash_t content_hash;\n\t\n\t// --- below fields are not hashed (for local use only) ---\n\t\n\tvnx.Hash64 farmer_addr;\n\t\n\tstring harvester;\n\t\n\tlong lookup_time_ms;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash() const;\n\t\n\thash_t calc_content_hash() const;\n\t\n\tvoid validate() const;\n\t\n}\n"
  },
  {
    "path": "interface/ReceiveNote.vni",
    "content": "package mmx;\n\nclass ReceiveNote {\n\t\n\tlong time;\t\t\t\t// [usec]\n\t\n\thash_t hash;\n\t\n}\n"
  },
  {
    "path": "interface/Request.vni",
    "content": "package mmx;\n\nclass Request {\n\t\n\tuint id;\n\t\n\tvnx.Value* method;\n\t\n}\n"
  },
  {
    "path": "interface/Return.vni",
    "content": "package mmx;\n\nclass Return {\n\t\n\tuint id;\n\t\n\tvnx.Value* result;\n\t\n}\n"
  },
  {
    "path": "interface/Solution.vni",
    "content": "package mmx;\n\nclass Solution {\n\t\n\tuint version;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash() const;\n\t\n\tulong calc_cost(mmx.ChainParams* params) const;\n\t\n}\n"
  },
  {
    "path": "interface/Transaction.vni",
    "content": "package mmx;\n\nclass Transaction extends TransactionBase {\n\t\n\tuint version;\n\t\n\tuint expires = -1;\t\t\t\t\t// height\n\t\n\tuint fee_ratio = 1024;\t\t\t\t// 1024 = 1.0\n\t\n\tuint static_cost;\n\t\n\tuint max_fee_amount;\n\t\n\ttx_note_e note;\n\t\n\tulong nonce;\n\t\n\tstring network;\n\t\n\toptional<addr_t> sender;\t\t\t// to pay for tx fee (first signature)\n\t\n\tvector<txin_t> inputs;\n\t\n\tvector<txout_t> outputs;\n\t\n\tvector<Operation*> execute;\n\t\n\tvector<Solution*> solutions;\n\t\n\tContract* deploy;\n\t\n\toptional<exec_result_t> exec_result;\n\t\n\thash_t content_hash;\t\t\t\t// full hash including solutions and exec_result\n\t\n\tstatic const uint MAX_SOLUTIONS = 65535;\t\t// limit of 16-bit solution index\n\t\n\t\n\tvoid reset(ChainParams* params);\n\t\n\tvoid update(exec_result_t result, ChainParams* params);\n\t\n\tvoid finalize();\n\t\n\tvoid add_input(addr_t currency, addr_t address, uint128 amount);\n\t\n\tvoid add_output(addr_t currency, addr_t address, uint128 amount, optional<string> memo);\n\t\n\tvoid merge_sign(Transaction* tx);\n\t\n\tbool is_valid(ChainParams* params) const;\n\t\n\tbool is_signed() const;\n\t\n\tbool did_fail() const;\n\t\n\thash_t calc_hash(bool full_hash = false) const;\n\t\n\tulong calc_cost(ChainParams* params) const;\n\t\n\tSolution* get_solution(uint index) const;\n\t\n\tvector<txin_t> get_inputs() const;\n\t\n\tvector<txout_t> get_outputs() const;\n\t\n\tvector<Operation*> get_operations() const;\n\t\n\tmap<addr_t, pair<uint128, uint128>> get_balance() const;\n\t\n\tvector<uchar> hash_serialize(bool full_hash = false) const;\n\t\n\ttx_index_t get_tx_index(ChainParams* params, BlockHeader* block, long file_offset) const;\n\t\n}\n"
  },
  {
    "path": "interface/TransactionBase.vni",
    "content": "package mmx;\n\nclass TransactionBase {\n\t\n\thash_t id;\n\t\n\t\n\thash_t calc_hash(bool full_hash = false) const;\n\t\n\tulong calc_cost(ChainParams* params) const;\n\t\n\tstatic TransactionBase* create_ex(hash_t id);\n\t\n}\n"
  },
  {
    "path": "interface/VDF_Point.vni",
    "content": "package mmx;\n\nclass VDF_Point {\n\t\n\tuint vdf_height;\n\t\n\tulong start;\n\tulong num_iters;\n\t\n\thash_t input;\n\thash_t output;\n\t\n\thash_t prev;\t\t\t\t\t\t// infused block hash\n\t\n\taddr_t reward_addr;\n\t\n\thash_t content_hash;\n\t\n\t// below not included in content_hash\n\t\n\tlong recv_time;\t\t\t\t\t\t\t\t// [ms]\n\t\n\tProofOfTime* proof;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash() const;\n\t\n}\n"
  },
  {
    "path": "interface/ValidatorVote.vni",
    "content": "package mmx;\n\nclass ValidatorVote {\n\t\n\thash_t hash;\t\t\t\t\t// block hash\n\t\n\tpubkey_t farmer_key;\n\t\n\tsignature_t farmer_sig;\n\t\n\thash_t content_hash;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_content_hash() const;\n\t\n}\n"
  },
  {
    "path": "interface/WalletFile.vni",
    "content": "package mmx;\n\nclass WalletFile {\n\t\n\tvector<addr_t> addresses;\n\t\n}\n"
  },
  {
    "path": "interface/account_info_t.vni",
    "content": "package mmx;\n\nstruct account_info_t extends account_t {\n\t\n\toptional<addr_t> address;\n\t\n\tuint account;\n\t\n\t\n\tstatic account_info_t make(uint account, optional<addr_t> address, account_t config);\n\t\n}\n"
  },
  {
    "path": "interface/account_t.vni",
    "content": "package mmx;\n\nstruct account_t {\n\t\n\tuint index;\n\t\n\tuint num_addresses = 1;\n\t\n\tstring name;\n\t\n\tstring key_file;\n\t\n\tstring finger_print;\n\t\n\tbool with_passphrase;\n\t\n\tbool is_hidden;\n\t\n}\n"
  },
  {
    "path": "interface/balance_t.vni",
    "content": "package mmx;\n\nstruct balance_t {\n\t\n\tuint128 spendable;\n\t\n\tuint128 reserved;\n\t\n\tuint128 locked;\n\t\n\tuint128 total;\n\t\n\tbool is_validated;\t\t// if token is in whitelist\n\t\n}\n"
  },
  {
    "path": "interface/block_index_t.vni",
    "content": "package mmx;\n\nstruct block_index_t {\n\t\n\thash_t hash;\n\thash_t content_hash;\n\t\n\tuint static_cost;\n\tuint total_cost;\n\t\n\tlong file_offset;\n\t\n}\n"
  },
  {
    "path": "interface/compile_flags_t.vni",
    "content": "package mmx;\n\nstruct compile_flags_t {\n\t\n\tint verbose = 0;\n\t\n\tint opt_level = 3;\n\t\n\tbool catch_overflow = true;\n\n}\n"
  },
  {
    "path": "interface/contract/Binary.vni",
    "content": "package mmx.contract;\n\nimport mmx.hash_t;\nimport mmx.addr_t;\nimport mmx.compile_flags_t;\n\nclass Binary extends mmx.Contract {\n\t\n\tstring name;\n\t\n\tmap<string, uint> fields;\n\t\n\tmap<string, method_t> methods;\n\t\n\tvector<uchar> constant;\n\t\n\tvector<uchar> binary;\n\t\n\tmap<uint, uint> line_info;\n\t\n\tstring source;\n\t\n\tstring compiler;\n\t\n\tcompile_flags_t build_flags;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash(bool full_hash) const;\n\t\n\tulong num_bytes() const;\n\t\n\toptional<uint> find_field(string name) const;\n\t\n\toptional<method_t> find_method(string name) const;\n\t\n\toptional<uint> find_line(uint address) const;\n\t\n}\n"
  },
  {
    "path": "interface/contract/Data.vni",
    "content": "package mmx.contract;\n\nimport mmx.hash_t;\nimport mmx.addr_t;\n\nclass Data extends mmx.Contract {\n\t\n\tvnx.Variant value;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash(bool full_hash) const;\n\t\n\tulong num_bytes() const;\n\t\n}\n"
  },
  {
    "path": "interface/contract/Executable.vni",
    "content": "package mmx.contract;\n\nimport mmx.hash_t;\nimport mmx.addr_t;\n\nclass Executable extends TokenBase {\n\t\n\taddr_t binary;\n\t\n\tstring init_method = \"init\";\n\t\n\tvector<vnx.Variant> init_args;\n\t\n\tmap<string, addr_t> depends;\n\t\n\t\n\tbool is_valid() const;\n\t\n\taddr_t get_external(string name) const;\n\t\n\thash_t calc_hash(bool full_hash) const;\n\t\n\tulong calc_cost(mmx.ChainParams* params) const;\n\t\n\tulong num_bytes() const;\n\t\n\tvnx.Variant read_field(string name) const;\n\t\n\tvnx.Variant get_arg(uint index) const;\n\t\n}\n"
  },
  {
    "path": "interface/contract/MultiSig.vni",
    "content": "package mmx.contract;\n\nimport mmx.hash_t;\nimport mmx.addr_t;\n\nclass MultiSig extends mmx.Contract {\n\t\n\tuint num_required;\n\t\n\tset<addr_t> owners;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash(bool full_hash) const;\n\t\n\tulong num_bytes() const;\n\t\n\tvoid validate(mmx.Solution* solution, hash_t txid) const;\n\t\n\tvnx.Variant read_field(string name) const;\n\t\n}\n\n"
  },
  {
    "path": "interface/contract/PubKey.vni",
    "content": "package mmx.contract;\n\nimport mmx.hash_t;\nimport mmx.addr_t;\n\nclass PubKey extends mmx.Contract {\n\t\n\taddr_t address;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash(bool full_hash) const;\n\t\n\tulong num_bytes() const;\n\t\n\toptional<addr_t> get_owner() const;\n\t\n\tvoid validate(mmx.Solution* solution, hash_t txid) const;\n\t\n\tvnx.Variant read_field(string name) const;\n\t\n}\n"
  },
  {
    "path": "interface/contract/TokenBase.vni",
    "content": "package mmx.contract;\n\nimport mmx.hash_t;\nimport mmx.addr_t;\n\nclass TokenBase extends mmx.Contract {\n\t\n\tstring name;\n\t\n\tstring symbol;\n\t\n\tint decimals = 0;\n\t\n\tvnx.Variant meta_data;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash(bool full_hash) const;\n\t\n\tulong num_bytes() const;\n\t\n}\n"
  },
  {
    "path": "interface/contract/WebData.vni",
    "content": "package mmx.contract;\n\nimport mmx.hash_t;\nimport mmx.addr_t;\n\nclass WebData extends mmx.Contract {\n\t\n\tstring mime_type;\n\t\n\tvnx.Buffer payload;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash(bool full_hash) const;\n\t\n\tulong num_bytes() const;\n\t\n\tvnx.Variant read_field(string name) const;\n\t\n}\n"
  },
  {
    "path": "interface/contract/method_t.vni",
    "content": "package mmx.contract;\n\nstruct method_t {\n\t\n\tstring name;\n\tstring info;\n\t\n\tbool is_init;\t\t\t// constructor\n\tbool is_const;\n\tbool is_public;\n\tbool is_payable;\n\t\n\tuint entry_point;\n\t\n\tvector<string> args;\n\t\n\t\n\tulong num_bytes() const;\n\t\n}\n"
  },
  {
    "path": "interface/error_code_e.vni",
    "content": "package mmx;\n\nenum error_code_e {\n\t\n\tTX_EXPIRED,\n\tINSUFFICIENT_FUNDS,\n\tINSUFFICIENT_FUNDS_TXFEE,\n\tINVALID_CONTRACT,\n\tINVALID_OPERATION,\n\tTXFEE_OVERRUN,\n\t\n}\n"
  },
  {
    "path": "interface/exec_entry_t.vni",
    "content": "package mmx;\n\nstruct exec_entry_t {\n\t\n\tuint height;\n\t\n\tlong time_stamp;\t\t\t// UNIX [ms]\n\t\n\thash_t txid;\n\t\n\tstring method;\n\t\n\tvector<vnx.Variant> args;\n\t\n\toptional<addr_t> user;\n\t\n\toptional<pair<addr_t, uint128>> deposit;\n\t\n}\n"
  },
  {
    "path": "interface/exec_error_t.vni",
    "content": "package mmx;\n\nstruct exec_error_t {\n\t\n\tuint code;\n\t\n\tuint address = -1;\t\t\t\t// (-1 = unknown)\n\t\n\tuint operation = -1;\t\t\t// index in execute array\n\t\n\toptional<uint> line;\n\t\n\tstring message;\n\t\n\t\n\tstatic const uint MAX_MESSAGE_LENGTH = 160;\t\t// TODO: 120\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash() const;\n\t\n}\n"
  },
  {
    "path": "interface/exec_result_t.vni",
    "content": "package mmx;\n\nstruct exec_result_t {\n\t\n\tbool did_fail;\n\t\n\tuint total_cost;\t\t\t// static cost + exec cost\n\t\n\tuint total_fee;\n\t\n\tvector<txin_t> inputs;\n\t\n\tvector<txout_t> outputs;\n\t\n\toptional<exec_error_t> error;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash() const;\n\t\n\tulong calc_cost(ChainParams* params) const;\n\t\n\tstring get_error_msg() const;\n\t\n}\n"
  },
  {
    "path": "interface/farmed_block_info_t.vni",
    "content": "package mmx;\n\nstruct farmed_block_info_t {\n\t\n\tuint height;\n\tuint reward;\n\t\n\tmmx.addr_t reward_addr;\n\t\n}\n"
  },
  {
    "path": "interface/farmed_block_summary_t.vni",
    "content": "package mmx;\n\nstruct farmed_block_summary_t {\n\t\n\tuint num_blocks;\n\tuint last_height;\n\t\n\tulong total_rewards;\n\t\n\tmap<mmx.addr_t, ulong> reward_map;\n\t\n}\n"
  },
  {
    "path": "interface/node_info_t.vni",
    "content": "package mmx;\n\nstruct node_info_t {\n\t\n\thash_t id;\n\t\n\tuint version;\n\t\n\tnode_type_e type;\n\t\n}\n"
  },
  {
    "path": "interface/node_type_e.vni",
    "content": "package mmx;\n\nenum node_type_e {\n\t\n\tFULL_NODE,\n\tLIGHT_NODE,\n\tAPI_CLIENT,\n\t\n}\n"
  },
  {
    "path": "interface/offer_data_t.vni",
    "content": "package mmx;\n\nstruct offer_data_t {\n\t\n\tuint height;\n\t\n\tuint last_update;\t\t\t// height\n\t\n\tlong time_stamp;\t\t\t// UNIX [ms]\n\t\n\taddr_t owner;\n\taddr_t address;\n\t\n\toptional<addr_t> partner;\n\t\n\taddr_t bid_currency;\n\taddr_t ask_currency;\n\t\n\tuint128 bid_balance;\n\tuint128 ask_balance;\n\t\n\tuint128 ask_amount;\t\t\t// ask amount needed to fully trade offer\n\t\n\tuint128 inv_price;\t\t\t// 64-bit fractional [bid / ask]\n\t\n\tdouble price;\t\t\t\t// [ask / bid]\n\t\n\t\n\tbool is_scam() const;\n\t\n\tbool is_open() const;\n\t\n\tdouble get_price() const;\t// [ask / bid]\n\t\n\tuint128 get_bid_amount(uint128 ask_amount) const;\n\t\n\tuint128 get_ask_amount(uint128 bid_amount) const;\n\t\n}\n"
  },
  {
    "path": "interface/operation/Deposit.vni",
    "content": "package mmx.operation;\n\nimport mmx.hash_t;\nimport mmx.addr_t;\nimport mmx.uint128;\n\nclass Deposit extends Execute {\n\t\n\taddr_t currency;\n\t\n\tuint128 amount;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash(bool full_hash) const;\n\t\n}\n"
  },
  {
    "path": "interface/operation/Execute.vni",
    "content": "package mmx.operation;\n\nimport mmx.hash_t;\nimport mmx.addr_t;\n\nclass Execute extends mmx.Operation {\n\t\n\tstring method;\n\t\n\tvector<vnx.Variant> args;\n\t\n\toptional<addr_t> user;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash(bool full_hash) const;\n\t\n\tulong calc_cost(mmx.ChainParams* params) const;\n\t\n\tvnx.Variant get_arg(uint index) const;\n\t\n}\n"
  },
  {
    "path": "interface/package.vni",
    "content": "package mmx;\n\nextern uint128 = {11, 16, 1};\nextern fixed128 = {11, 16, 1};\n\nextern hash_t = {11, 32, 1};\nextern hash_512_t = {11, 64, 1};\nextern addr_t = {11, 32, 1};\n\nextern skey_t = {11, 32, 1};\nextern pubkey_t = {11, 33, 1};\nextern signature_t = {11, 64, 1};\n"
  },
  {
    "path": "interface/peer_info_t.vni",
    "content": "package mmx;\n\nstruct peer_info_t {\n\t\n\tulong id;\n\t\n\tstring address;\n\t\n\tnode_type_e type;\n\t\n\tint ping_ms;\n\t\n\tuint height;\n\tuint version;\n\t\n\tlong recv_timeout_ms;\t\t\t// delta since last reply [ms]\n\tlong connect_time_ms;\t\t\t// how long peer is connected [ms]\n\t\n\tulong bytes_send;\n\tulong bytes_recv;\n\t\n\tdouble pending_cost;\n\tdouble compression_ratio;\t\t// for send only\n\t\n\tbool is_synced;\n\tbool is_paused;\n\tbool is_blocked;\n\tbool is_outbound;\n\t\n}\n"
  },
  {
    "path": "interface/permission_e.vni",
    "content": "package mmx;\n\nenum permission_e {\n\t\n\tPUBLIC,\t\t\t// for public RPC\n\tREMOTE,\t\t\t// for remote services (harvester, etc)\n\tSPENDING,\t\t// for GUI / CLI\n\tSIGN_BLOCK\t\t// for signing blocks\n\t\n}\n"
  },
  {
    "path": "interface/plot_nft_info_t.vni",
    "content": "package mmx;\n\nstruct plot_nft_info_t {\n\t\n\tstring name;\n\t\n\taddr_t owner;\n\taddr_t address;\n\t\n\tbool is_locked;\n\t\n\toptional<addr_t> target;\n\toptional<uint> unlock_height;\n\t\n\toptional<string> server_url;\n\t\n}\n"
  },
  {
    "path": "interface/pooling_error_e.vni",
    "content": "package mmx;\n\nenum pooling_error_e {\n\t\n\tNONE = 0,\n\tINVALID_PARTIAL,\n\tDUPLICATE_PARTIAL,\n\tPARTIAL_TOO_LATE,\n\tPARTIAL_NOT_GOOD_ENOUGH,\n\tCHALLENGE_REVERTED,\n\tCHALLENGE_NOT_FOUND,\n\tCHALLENGE_NOT_CONFIRMED,\n\tINVALID_PROOF,\n\tINVALID_DIFFICULTY,\n\tINVALID_SIGNATURE,\n\tINVALID_CONTRACT,\n\tINVALID_AUTH_KEY,\n\tINVALID_ACCOUNT,\n\tINVALID_TIMESTAMP,\n\tPOOL_LOST_SYNC,\n\tSERVER_ERROR,\n\t\n}\n"
  },
  {
    "path": "interface/pooling_info_t.vni",
    "content": "package mmx;\n\nstruct pooling_info_t {\n\t\n\taddr_t contract;\n\t\n\toptional<string> name;\n\t\n\toptional<string> server_url;\n\t\n\toptional<addr_t> pool_target;\n\t\n\tulong partial_diff;\n\t\n\tuint plot_count;\n\t\n\tbool is_plot_nft;\n\t\n}\n"
  },
  {
    "path": "interface/pooling_stats_t.vni",
    "content": "package mmx;\n\nstruct pooling_stats_t {\n\t\n\tstring server_url;\n\t\n\tulong partial_diff;\n\t\n\tulong valid_points;\n\tulong failed_points;\n\t\n\tuint total_partials;\t\t\t// valid only\n\tlong total_response_time;\t\t// [ms]\n\t\n\tlong last_partial;\t\t\t\t// UNIX [sec]\n\t\n\tmap<pooling_error_e, uint> error_count;\n\t\n}\n"
  },
  {
    "path": "interface/query_filter_t.vni",
    "content": "package mmx;\n\nstruct query_filter_t {\n\t\n\tuint since;\t\t\t\t\t// included\n\tuint until = -1;\t\t\t// included\n\t\n\tint limit = -1;\t\t\t\t// (-1 = no limit)\n\t\n\tuint max_search;\t\t\t// max number of rows to search (0 = no limit)\n\t\n\tset<addr_t> currency;\n\t\n\toptional<tx_type_e> type;\n\t\n\toptional<string> memo;\n\t\n\tbool white_list;\t\t\t// if to apply whitelist\n\t\n\tbool with_pending;\t\t\t// if to include unconfirmed transactions\n\t\n}\n"
  },
  {
    "path": "interface/solution/MultiSig.vni",
    "content": "package mmx.solution;\n\nimport mmx.hash_t;\nimport mmx.addr_t;\n\nclass MultiSig extends mmx.Solution {\n\t\n\tmap<addr_t, mmx.Solution*> solutions;\n\t\n\tuint num_required;\n\t\n\t\n\tbool is_valid() const;\n\t\n\thash_t calc_hash() const;\n\t\n\tulong calc_cost(mmx.ChainParams* params) const;\n\t\n}\n"
  },
  {
    "path": "interface/solution/PubKey.vni",
    "content": "package mmx.solution;\n\nimport mmx.hash_t;\nimport mmx.pubkey_t;\nimport mmx.signature_t;\n\nclass PubKey extends mmx.Solution {\n\t\n\tpubkey_t pubkey;\n\t\n\tsignature_t signature;\n\t\n\t\n\thash_t calc_hash() const;\n\t\n\tulong calc_cost(mmx.ChainParams* params) const;\n\t\n}\n"
  },
  {
    "path": "interface/spend_options_t.vni",
    "content": "package mmx;\n\nstruct spend_options_t {\n\t\n\tbool auto_send = true;\n\tbool mark_spent = false;\n\t\n\tuint fee_ratio = 1024;\n\t\n\tuint gas_limit = 5000000;\t\t\t\t\t// MMX\n\t\n\toptional<uint> expire_at;\t\t\t\t\t// overrides delta if set\n\toptional<uint> expire_delta;\t\t\t\t// expire at current height + delta\n\t\n\toptional<ulong> nonce;\t\t\t\t\t\t// custom nonce\n\toptional<addr_t> user;\n\toptional<addr_t> sender;\t\t\t\t\t// for tx fee\n\toptional<string> passphrase;\n\toptional<tx_note_e> note;\n\toptional<string> memo;\n\t\n\tmap<addr_t, addr_t> owner_map;\n\tmap<addr_t, Contract*> contract_map;\n\t\n}\n"
  },
  {
    "path": "interface/swap_entry_t.vni",
    "content": "package mmx;\n\nstruct swap_entry_t {\n\t\n\tuint height;\n\t\n\tlong time_stamp;\t\t\t// UNIX [ms]\n\t\n\thash_t txid;\n\t\n\tstring type;\t\t\t\t// [buy, sell, add, remove, payout]\n\t\n\tuchar index;\n\t\n\tuint128 amount;\n\t\n\toptional<double> value;\n\t\n\toptional<string> symbol;\n\t\n\toptional<addr_t> user;\n\t\n}\n"
  },
  {
    "path": "interface/swap_info_t.vni",
    "content": "package mmx;\n\nstruct swap_info_t {\n\t\n\tstring name;\n\t\n\taddr_t address;\n\t\n\taddr_t tokens[2];\n\t\n\tuint128 wallet[2];\n\tuint128 balance[2];\n\tuint128 volume[2];\n\tuint128 fees_paid[2];\n\tuint128 fees_claimed[2];\n\tuint128 user_total[2];\n\t\n\tuint128 volume_1d[2];\n\tuint128 volume_7d[2];\n\t\n\tdouble avg_apy_1d[2];\n\tdouble avg_apy_7d[2];\n\t\n\tvector<double> fee_rates;\n\t\n\tvector<swap_pool_info_t> pools;\n\t\n}\n"
  },
  {
    "path": "interface/swap_pool_info_t.vni",
    "content": "package mmx;\n\nstruct swap_pool_info_t {\n\t\n\tuint128 balance[2];\n\tuint128 fees_paid[2];\n\tuint128 fees_claimed[2];\n\tuint128 user_total[2];\n\t\n}\n"
  },
  {
    "path": "interface/swap_user_info_t.vni",
    "content": "package mmx;\n\nstruct swap_user_info_t {\n\t\n\tint pool_idx = -1;\n\t\n\tuint128 balance[2];\n\t\n\tuint128 last_user_total[2];\n\tuint128 last_fees_paid[2];\n\t\n\tuint128 fees_earned[2];\n\tuint128 equivalent_liquidity[2];\n\t\n\tuint unlock_height;\n\t\n}\n"
  },
  {
    "path": "interface/table_entry_t.vni",
    "content": "package mmx;\n\nstruct table_entry_t {\n\t\n\tuint32 y;\n\tuint8[48] meta;\n\tvector<uint32> x_values;\n\t\n}\n"
  },
  {
    "path": "interface/trade_entry_t.vni",
    "content": "package mmx;\n\nstruct trade_entry_t {\n\t\n\tuint height;\n\t\n\tlong time_stamp;\t\t// UNIX [ms]\n\t\n\taddr_t address;\n\t\n\thash_t txid;\n\t\n\taddr_t bid_currency;\n\taddr_t ask_currency;\n\t\n\tuint128 bid_amount;\n\tuint128 ask_amount;\n\t\n\tdouble price;\t\t\t// [ask / bid]\n\t\n}\n"
  },
  {
    "path": "interface/trade_log_t.vni",
    "content": "package mmx;\n\nstruct trade_log_t {\n\t\n\tlong time_stamp;\t\t\t// UNIX [ms]\n\t\n\thash_t txid;\n\t\n\taddr_t address;\t\t\t\t// offer\n\t\n\tuint128 inv_price;\t\t\t// [bid / ask]\n\t\n\tuint128 ask_amount;\n\t\n\t\n\tuint128 get_bid_amount() const;\n\t\n\tdouble get_price() const;\n\t\n}\n"
  },
  {
    "path": "interface/tx_entry_t.vni",
    "content": "package mmx;\n\nstruct tx_entry_t extends txio_entry_t {\n\t\n\tbool is_validated;\t\t// if token is in whitelist\n\t\n\tbool is_pending;\t\t// if not confirmed yet\n\t\n\t\n\tstatic tx_entry_t create_ex(txio_entry_t entry, bool validated);\n\t\n}\n"
  },
  {
    "path": "interface/tx_index_t.vni",
    "content": "package mmx;\n\nstruct tx_index_t {\n\t\n\tuint height;\n\tuint static_cost;\n\tuint contract_read_cost;\n\t\n\tlong time_stamp;\t\t\t// UNIX [ms]\n\tlong file_offset;\n\t\n}\n"
  },
  {
    "path": "interface/tx_info_t.vni",
    "content": "package mmx;\n\nclass tx_info_t {\n\t\n\thash_t id;\n\t\n\tuint expires;\n\n\tbool did_fail;\n\toptional<uint> height;\n\toptional<long> time_stamp;\t\t// UNIX [ms]\n\toptional<hash_t> block;\n\toptional<string> message;\n\t\n\tuint fee;\n\tuint cost;\n\t\n\ttx_note_e note;\n\t\n\toptional<addr_t> sender;\n\t\n\tvector<txin_t> inputs;\n\tvector<txout_t> outputs;\n\t\n\tvector<Operation*> operations;\n\t\n\tContract* deployed;\n\t\n\tmap<addr_t, uint128> input_amounts;\n\tmap<addr_t, uint128> output_amounts;\n\t\n\tmap<addr_t, Contract*> contracts;\n\t\n}\n"
  },
  {
    "path": "interface/tx_log_entry_t.vni",
    "content": "package mmx;\n\nstruct tx_log_entry_t {\n\t\n\tlong time;\t\t\t\t// [ms]\n\t\n\tTransaction* tx;\n\t\n}\n"
  },
  {
    "path": "interface/tx_note_e.vni",
    "content": "package mmx;\n\nenum tx_note_e {\n\t\n\tREWARD,\n\tTRANSFER,\n\tWITHDRAW,\n\tCLAIM,\n\tBURN,\n\tOFFER,\n\tTRADE,\n\tMINT,\n\tDEPLOY,\n\tMUTATE,\n\tEXECUTE,\n\tDEPOSIT,\n\tREVOKE,\n\tTIMELORD_REWARD\n\t\n}\n"
  },
  {
    "path": "interface/tx_type_e.vni",
    "content": "package mmx;\n\nenum tx_type_e {\n\t\n\tSPEND,\n\tRECEIVE,\n\tTXFEE,\n\tREWARD,\n\tVDF_REWARD,\n\tPROJECT_REWARD,\n\t\n}\n"
  },
  {
    "path": "interface/txin_t.vni",
    "content": "package mmx;\n\nstruct txin_t extends txio_t {\n\t\n\tushort solution = -1;\t\t\t// not part of crypto hash\n\t\n\tuchar flags;\t\t\t\t\t// not part of crypto hash\n\t\n\t\n\tstatic const uchar IS_EXEC = 1;\n\t\n\tstatic const ushort NO_SOLUTION = -1;\n\t\n}\n"
  },
  {
    "path": "interface/txio_entry_t.vni",
    "content": "package mmx;\n\nstruct txio_entry_t extends txio_t {\n\t\n\thash_t txid;\t\t\t// block hash in case type == REWARD\n\t\n\tuint height;\t\t\t// -1 = pending\n\t\n\tlong time_stamp;\t\t// UNIX [ms]\n\t\n\ttx_type_e type;\n\t\n\t\n\tstatic txio_entry_t create_ex(hash_t txid, uint height, long time_stamp, tx_type_e type, txio_t txio);\n\t\n}\n"
  },
  {
    "path": "interface/txio_t.vni",
    "content": "package mmx;\n\nstruct txio_t {\n\t\n\taddr_t address;\n\t\n\taddr_t contract;\n\t\n\tuint128 amount;\n\t\n\toptional<string> memo;\n\t\n\tstatic const uint MAX_MEMO_SIZE = 64;\n\t\n\t\n\tulong calc_cost(ChainParams* params) const;\n\t\n}\n"
  },
  {
    "path": "interface/txout_t.vni",
    "content": "package mmx;\n\nstruct txout_t extends txio_t {\n\t\n}\n"
  },
  {
    "path": "interface/uint_fraction_t.vni",
    "content": "package mmx;\n\nstruct uint_fraction_t {\n\t\n\tuint value;\n\tuint inverse = 1;\n\t\n}\n"
  },
  {
    "path": "interface/ulong_fraction_t.vni",
    "content": "package mmx;\n\nstruct ulong_fraction_t {\n\t\n\tulong value;\n\tulong inverse = 1;\n\t\n}\n"
  },
  {
    "path": "interface/virtual_plot_info_t.vni",
    "content": "package mmx;\n\nstruct virtual_plot_info_t {\n\t\n\taddr_t address;\n\t\n\taddr_t owner;\n\t\n\tpubkey_t farmer_key;\n\t\n\toptional<addr_t> reward_address;\n\t\n\tulong balance;\n\t\n\tulong size_bytes;\n\t\n}\n"
  },
  {
    "path": "interface/vm/package.vni",
    "content": "package mmx.vm;\n\nextern varptr_t = {12, 1};\n"
  },
  {
    "path": "kernel/rsha256.cl",
    "content": "\n__kernel\nvoid rsha256_kernel(__global uint* hash, __global uint* num_iters, uint max_iters)\n{\n\tconst uint id = get_global_id(0);\n\t\n\tconst uint num_iters_org = num_iters[id];\n\tconst uint num_iters_i = min(num_iters_org, max_iters);\n\t\n\tif(num_iters_i == 0) {\n\t\treturn;\n\t}\n\tnum_iters[id] = num_iters_org - num_iters_i;\n\t\n\tuint msg[16];\n\t\n#if __OPENCL_VERSION__ >= 200\n\t__attribute__((opencl_unroll_hint(8)))\n#endif\n\tfor(int i = 0; i < 8; ++i) {\n\t\tmsg[i] = bswap_32(hash[id * 8 + i]);\n\t}\n\tmsg[8] = bswap_32(0x80);\n\t\n#if __OPENCL_VERSION__ >= 200\n\t__attribute__((opencl_unroll_hint(6)))\n#endif\n\tfor(int i = 9; i < 15; ++i) {\n\t\tmsg[i] = 0;\n\t}\n\tmsg[15] = 256;\n\t\n\tuint state[8];\n\t\n\tfor(uint k = 0; k < num_iters_i; ++k)\n\t{\n#if __OPENCL_VERSION__ >= 200\n\t\t__attribute__((opencl_unroll_hint(8)))\n#endif\n\t\tfor(int i = 0; i < 8; ++i) {\n\t\t\tstate[i] = h_init[i];\n\t\t}\n\t\tsha256(msg, state);\n\t\t\n#if __OPENCL_VERSION__ >= 200\n\t\t__attribute__((opencl_unroll_hint(8)))\n#endif\n\t\tfor(int i = 0; i < 8; ++i) {\n\t\t\tmsg[i] = state[i];\n\t\t}\n\t}\n\t\n#if __OPENCL_VERSION__ >= 200\n\t__attribute__((opencl_unroll_hint(8)))\n#endif\n\tfor(int i = 0; i < 8; ++i) {\n\t\thash[id * 8 + i] = bswap_32(state[i]);\n\t}\n}\n"
  },
  {
    "path": "kernel/sha256.cl",
    "content": "/*\n * sha256.cl\n *\n *  Created on: 07.01.2014\n *      Author: mad\n */\n\n__constant uint k[] = {\n   0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n   0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n   0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n   0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n   0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n   0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n   0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n   0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 };\n\n__constant uint h_init[] = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 };\n\n\n#define Zrotr(a, b) rotate((uint)a, (uint)b)\n\n#define ZR25(n) ((Zrotr((n), 25) ^ Zrotr((n), 14) ^ ((n) >> 3U)))\n#define ZR15(n) ((Zrotr((n), 15) ^ Zrotr((n), 13) ^ ((n) >> 10U)))\n#define ZR26(n) ((Zrotr((n), 26) ^ Zrotr((n), 21) ^ Zrotr((n), 7)))\n#define ZR30(n) ((Zrotr((n), 30) ^ Zrotr((n), 19) ^ Zrotr((n), 10)))\n\n#define Ch(x, y, z) (z ^ (x & (y ^ z)))\n#define Ma(x, y, z) ((x & z) | (y & (x | z)))\n\nuint bswap_32(const uint value) {\n\treturn as_uint(as_uchar4(value).s3210);\n}\n\n// msg needs to be byte swapped already\n// output state is not byte swapped\nvoid sha256(\tconst uint* msg,\n\t\t\t\tuint* s )\n{\n\tuint w[64];\n\t\n#if __OPENCL_VERSION__ >= 200\n\t__attribute__((opencl_unroll_hint(16)))\n#endif\n\tfor(int i = 0; i < 16; ++i) {\n\t\tw[i] = msg[i];\n\t}\n\t\n#if __OPENCL_VERSION__ >= 200\n\t__attribute__((opencl_unroll_hint(48)))\n#endif\n\tfor(int i = 16; i < 64; ++i)\n\t{\n\t\tconst uint s0 = ZR25(w[i-15]);\n\t\tconst uint s1 = ZR15(w[i-2]);\n\t\tw[i] = w[i-16] + s0 + w[i-7] + s1;\n\t}\n\t\n\tuint a = s[0];\n\tuint b = s[1];\n\tuint c = s[2];\n\tuint d = s[3];\n\tuint e = s[4];\n\tuint f = s[5];\n\tuint g = s[6];\n\tuint h = s[7];\n\t\n#if __OPENCL_VERSION__ >= 200\n\t__attribute__((opencl_unroll_hint(64)))\n#endif\n\tfor(int i = 0; i < 64; ++i)\n\t{\n\t\tconst uint S1 = ZR26(e);\n\t\t// const uint ch = (e & f) ^ ((~e) & g);\n\t\tconst uint ch = Ch(e, f, g);\n\t\tconst uint temp1 = h + S1 + ch + k[i] + w[i];\n\t\tconst uint S0 = ZR30(a);\n\t\t// const uint maj = (a & b) ^ (a & c) ^ (b & c);\n\t\tconst uint maj = Ma(a, b, c);\n\t\tconst uint temp2 = S0 + maj;\n\t\t\n\t\th = g;\n\t\tg = f;\n\t\tf = e;\n\t\te = d + temp1;\n\t\td = c;\n\t\tc = b;\n\t\tb = a;\n\t\ta = temp1 + temp2;\n\t}\n\t\n\ts[0] += a;\n\ts[1] += b;\n\ts[2] += c;\n\ts[3] += d;\n\ts[4] += e;\n\ts[5] += f;\n\ts[6] += g;\n\ts[7] += h;\n}\n\n\n\n"
  },
  {
    "path": "lib/.gitignore",
    "content": "/.cache\n"
  },
  {
    "path": "lib/bip-0039/english.txt",
    "content": "abandon\nability\nable\nabout\nabove\nabsent\nabsorb\nabstract\nabsurd\nabuse\naccess\naccident\naccount\naccuse\nachieve\nacid\nacoustic\nacquire\nacross\nact\naction\nactor\nactress\nactual\nadapt\nadd\naddict\naddress\nadjust\nadmit\nadult\nadvance\nadvice\naerobic\naffair\nafford\nafraid\nagain\nage\nagent\nagree\nahead\naim\nair\nairport\naisle\nalarm\nalbum\nalcohol\nalert\nalien\nall\nalley\nallow\nalmost\nalone\nalpha\nalready\nalso\nalter\nalways\namateur\namazing\namong\namount\namused\nanalyst\nanchor\nancient\nanger\nangle\nangry\nanimal\nankle\nannounce\nannual\nanother\nanswer\nantenna\nantique\nanxiety\nany\napart\napology\nappear\napple\napprove\napril\narch\narctic\narea\narena\nargue\narm\narmed\narmor\narmy\naround\narrange\narrest\narrive\narrow\nart\nartefact\nartist\nartwork\nask\naspect\nassault\nasset\nassist\nassume\nasthma\nathlete\natom\nattack\nattend\nattitude\nattract\nauction\naudit\naugust\naunt\nauthor\nauto\nautumn\naverage\navocado\navoid\nawake\naware\naway\nawesome\nawful\nawkward\naxis\nbaby\nbachelor\nbacon\nbadge\nbag\nbalance\nbalcony\nball\nbamboo\nbanana\nbanner\nbar\nbarely\nbargain\nbarrel\nbase\nbasic\nbasket\nbattle\nbeach\nbean\nbeauty\nbecause\nbecome\nbeef\nbefore\nbegin\nbehave\nbehind\nbelieve\nbelow\nbelt\nbench\nbenefit\nbest\nbetray\nbetter\nbetween\nbeyond\nbicycle\nbid\nbike\nbind\nbiology\nbird\nbirth\nbitter\nblack\nblade\nblame\nblanket\nblast\nbleak\nbless\nblind\nblood\nblossom\nblouse\nblue\nblur\nblush\nboard\nboat\nbody\nboil\nbomb\nbone\nbonus\nbook\nboost\nborder\nboring\nborrow\nboss\nbottom\nbounce\nbox\nboy\nbracket\nbrain\nbrand\nbrass\nbrave\nbread\nbreeze\nbrick\nbridge\nbrief\nbright\nbring\nbrisk\nbroccoli\nbroken\nbronze\nbroom\nbrother\nbrown\nbrush\nbubble\nbuddy\nbudget\nbuffalo\nbuild\nbulb\nbulk\nbullet\nbundle\nbunker\nburden\nburger\nburst\nbus\nbusiness\nbusy\nbutter\nbuyer\nbuzz\ncabbage\ncabin\ncable\ncactus\ncage\ncake\ncall\ncalm\ncamera\ncamp\ncan\ncanal\ncancel\ncandy\ncannon\ncanoe\ncanvas\ncanyon\ncapable\ncapital\ncaptain\ncar\ncarbon\ncard\ncargo\ncarpet\ncarry\ncart\ncase\ncash\ncasino\ncastle\ncasual\ncat\ncatalog\ncatch\ncategory\ncattle\ncaught\ncause\ncaution\ncave\nceiling\ncelery\ncement\ncensus\ncentury\ncereal\ncertain\nchair\nchalk\nchampion\nchange\nchaos\nchapter\ncharge\nchase\nchat\ncheap\ncheck\ncheese\nchef\ncherry\nchest\nchicken\nchief\nchild\nchimney\nchoice\nchoose\nchronic\nchuckle\nchunk\nchurn\ncigar\ncinnamon\ncircle\ncitizen\ncity\ncivil\nclaim\nclap\nclarify\nclaw\nclay\nclean\nclerk\nclever\nclick\nclient\ncliff\nclimb\nclinic\nclip\nclock\nclog\nclose\ncloth\ncloud\nclown\nclub\nclump\ncluster\nclutch\ncoach\ncoast\ncoconut\ncode\ncoffee\ncoil\ncoin\ncollect\ncolor\ncolumn\ncombine\ncome\ncomfort\ncomic\ncommon\ncompany\nconcert\nconduct\nconfirm\ncongress\nconnect\nconsider\ncontrol\nconvince\ncook\ncool\ncopper\ncopy\ncoral\ncore\ncorn\ncorrect\ncost\ncotton\ncouch\ncountry\ncouple\ncourse\ncousin\ncover\ncoyote\ncrack\ncradle\ncraft\ncram\ncrane\ncrash\ncrater\ncrawl\ncrazy\ncream\ncredit\ncreek\ncrew\ncricket\ncrime\ncrisp\ncritic\ncrop\ncross\ncrouch\ncrowd\ncrucial\ncruel\ncruise\ncrumble\ncrunch\ncrush\ncry\ncrystal\ncube\nculture\ncup\ncupboard\ncurious\ncurrent\ncurtain\ncurve\ncushion\ncustom\ncute\ncycle\ndad\ndamage\ndamp\ndance\ndanger\ndaring\ndash\ndaughter\ndawn\nday\ndeal\ndebate\ndebris\ndecade\ndecember\ndecide\ndecline\ndecorate\ndecrease\ndeer\ndefense\ndefine\ndefy\ndegree\ndelay\ndeliver\ndemand\ndemise\ndenial\ndentist\ndeny\ndepart\ndepend\ndeposit\ndepth\ndeputy\nderive\ndescribe\ndesert\ndesign\ndesk\ndespair\ndestroy\ndetail\ndetect\ndevelop\ndevice\ndevote\ndiagram\ndial\ndiamond\ndiary\ndice\ndiesel\ndiet\ndiffer\ndigital\ndignity\ndilemma\ndinner\ndinosaur\ndirect\ndirt\ndisagree\ndiscover\ndisease\ndish\ndismiss\ndisorder\ndisplay\ndistance\ndivert\ndivide\ndivorce\ndizzy\ndoctor\ndocument\ndog\ndoll\ndolphin\ndomain\ndonate\ndonkey\ndonor\ndoor\ndose\ndouble\ndove\ndraft\ndragon\ndrama\ndrastic\ndraw\ndream\ndress\ndrift\ndrill\ndrink\ndrip\ndrive\ndrop\ndrum\ndry\nduck\ndumb\ndune\nduring\ndust\ndutch\nduty\ndwarf\ndynamic\neager\neagle\nearly\nearn\nearth\neasily\neast\neasy\necho\necology\neconomy\nedge\nedit\neducate\neffort\negg\neight\neither\nelbow\nelder\nelectric\nelegant\nelement\nelephant\nelevator\nelite\nelse\nembark\nembody\nembrace\nemerge\nemotion\nemploy\nempower\nempty\nenable\nenact\nend\nendless\nendorse\nenemy\nenergy\nenforce\nengage\nengine\nenhance\nenjoy\nenlist\nenough\nenrich\nenroll\nensure\nenter\nentire\nentry\nenvelope\nepisode\nequal\nequip\nera\nerase\nerode\nerosion\nerror\nerupt\nescape\nessay\nessence\nestate\neternal\nethics\nevidence\nevil\nevoke\nevolve\nexact\nexample\nexcess\nexchange\nexcite\nexclude\nexcuse\nexecute\nexercise\nexhaust\nexhibit\nexile\nexist\nexit\nexotic\nexpand\nexpect\nexpire\nexplain\nexpose\nexpress\nextend\nextra\neye\neyebrow\nfabric\nface\nfaculty\nfade\nfaint\nfaith\nfall\nfalse\nfame\nfamily\nfamous\nfan\nfancy\nfantasy\nfarm\nfashion\nfat\nfatal\nfather\nfatigue\nfault\nfavorite\nfeature\nfebruary\nfederal\nfee\nfeed\nfeel\nfemale\nfence\nfestival\nfetch\nfever\nfew\nfiber\nfiction\nfield\nfigure\nfile\nfilm\nfilter\nfinal\nfind\nfine\nfinger\nfinish\nfire\nfirm\nfirst\nfiscal\nfish\nfit\nfitness\nfix\nflag\nflame\nflash\nflat\nflavor\nflee\nflight\nflip\nfloat\nflock\nfloor\nflower\nfluid\nflush\nfly\nfoam\nfocus\nfog\nfoil\nfold\nfollow\nfood\nfoot\nforce\nforest\nforget\nfork\nfortune\nforum\nforward\nfossil\nfoster\nfound\nfox\nfragile\nframe\nfrequent\nfresh\nfriend\nfringe\nfrog\nfront\nfrost\nfrown\nfrozen\nfruit\nfuel\nfun\nfunny\nfurnace\nfury\nfuture\ngadget\ngain\ngalaxy\ngallery\ngame\ngap\ngarage\ngarbage\ngarden\ngarlic\ngarment\ngas\ngasp\ngate\ngather\ngauge\ngaze\ngeneral\ngenius\ngenre\ngentle\ngenuine\ngesture\nghost\ngiant\ngift\ngiggle\nginger\ngiraffe\ngirl\ngive\nglad\nglance\nglare\nglass\nglide\nglimpse\nglobe\ngloom\nglory\nglove\nglow\nglue\ngoat\ngoddess\ngold\ngood\ngoose\ngorilla\ngospel\ngossip\ngovern\ngown\ngrab\ngrace\ngrain\ngrant\ngrape\ngrass\ngravity\ngreat\ngreen\ngrid\ngrief\ngrit\ngrocery\ngroup\ngrow\ngrunt\nguard\nguess\nguide\nguilt\nguitar\ngun\ngym\nhabit\nhair\nhalf\nhammer\nhamster\nhand\nhappy\nharbor\nhard\nharsh\nharvest\nhat\nhave\nhawk\nhazard\nhead\nhealth\nheart\nheavy\nhedgehog\nheight\nhello\nhelmet\nhelp\nhen\nhero\nhidden\nhigh\nhill\nhint\nhip\nhire\nhistory\nhobby\nhockey\nhold\nhole\nholiday\nhollow\nhome\nhoney\nhood\nhope\nhorn\nhorror\nhorse\nhospital\nhost\nhotel\nhour\nhover\nhub\nhuge\nhuman\nhumble\nhumor\nhundred\nhungry\nhunt\nhurdle\nhurry\nhurt\nhusband\nhybrid\nice\nicon\nidea\nidentify\nidle\nignore\nill\nillegal\nillness\nimage\nimitate\nimmense\nimmune\nimpact\nimpose\nimprove\nimpulse\ninch\ninclude\nincome\nincrease\nindex\nindicate\nindoor\nindustry\ninfant\ninflict\ninform\ninhale\ninherit\ninitial\ninject\ninjury\ninmate\ninner\ninnocent\ninput\ninquiry\ninsane\ninsect\ninside\ninspire\ninstall\nintact\ninterest\ninto\ninvest\ninvite\ninvolve\niron\nisland\nisolate\nissue\nitem\nivory\njacket\njaguar\njar\njazz\njealous\njeans\njelly\njewel\njob\njoin\njoke\njourney\njoy\njudge\njuice\njump\njungle\njunior\njunk\njust\nkangaroo\nkeen\nkeep\nketchup\nkey\nkick\nkid\nkidney\nkind\nkingdom\nkiss\nkit\nkitchen\nkite\nkitten\nkiwi\nknee\nknife\nknock\nknow\nlab\nlabel\nlabor\nladder\nlady\nlake\nlamp\nlanguage\nlaptop\nlarge\nlater\nlatin\nlaugh\nlaundry\nlava\nlaw\nlawn\nlawsuit\nlayer\nlazy\nleader\nleaf\nlearn\nleave\nlecture\nleft\nleg\nlegal\nlegend\nleisure\nlemon\nlend\nlength\nlens\nleopard\nlesson\nletter\nlevel\nliar\nliberty\nlibrary\nlicense\nlife\nlift\nlight\nlike\nlimb\nlimit\nlink\nlion\nliquid\nlist\nlittle\nlive\nlizard\nload\nloan\nlobster\nlocal\nlock\nlogic\nlonely\nlong\nloop\nlottery\nloud\nlounge\nlove\nloyal\nlucky\nluggage\nlumber\nlunar\nlunch\nluxury\nlyrics\nmachine\nmad\nmagic\nmagnet\nmaid\nmail\nmain\nmajor\nmake\nmammal\nman\nmanage\nmandate\nmango\nmansion\nmanual\nmaple\nmarble\nmarch\nmargin\nmarine\nmarket\nmarriage\nmask\nmass\nmaster\nmatch\nmaterial\nmath\nmatrix\nmatter\nmaximum\nmaze\nmeadow\nmean\nmeasure\nmeat\nmechanic\nmedal\nmedia\nmelody\nmelt\nmember\nmemory\nmention\nmenu\nmercy\nmerge\nmerit\nmerry\nmesh\nmessage\nmetal\nmethod\nmiddle\nmidnight\nmilk\nmillion\nmimic\nmind\nminimum\nminor\nminute\nmiracle\nmirror\nmisery\nmiss\nmistake\nmix\nmixed\nmixture\nmobile\nmodel\nmodify\nmom\nmoment\nmonitor\nmonkey\nmonster\nmonth\nmoon\nmoral\nmore\nmorning\nmosquito\nmother\nmotion\nmotor\nmountain\nmouse\nmove\nmovie\nmuch\nmuffin\nmule\nmultiply\nmuscle\nmuseum\nmushroom\nmusic\nmust\nmutual\nmyself\nmystery\nmyth\nnaive\nname\nnapkin\nnarrow\nnasty\nnation\nnature\nnear\nneck\nneed\nnegative\nneglect\nneither\nnephew\nnerve\nnest\nnet\nnetwork\nneutral\nnever\nnews\nnext\nnice\nnight\nnoble\nnoise\nnominee\nnoodle\nnormal\nnorth\nnose\nnotable\nnote\nnothing\nnotice\nnovel\nnow\nnuclear\nnumber\nnurse\nnut\noak\nobey\nobject\noblige\nobscure\nobserve\nobtain\nobvious\noccur\nocean\noctober\nodor\noff\noffer\noffice\noften\noil\nokay\nold\nolive\nolympic\nomit\nonce\none\nonion\nonline\nonly\nopen\nopera\nopinion\noppose\noption\norange\norbit\norchard\norder\nordinary\norgan\norient\noriginal\norphan\nostrich\nother\noutdoor\nouter\noutput\noutside\noval\noven\nover\nown\nowner\noxygen\noyster\nozone\npact\npaddle\npage\npair\npalace\npalm\npanda\npanel\npanic\npanther\npaper\nparade\nparent\npark\nparrot\nparty\npass\npatch\npath\npatient\npatrol\npattern\npause\npave\npayment\npeace\npeanut\npear\npeasant\npelican\npen\npenalty\npencil\npeople\npepper\nperfect\npermit\nperson\npet\nphone\nphoto\nphrase\nphysical\npiano\npicnic\npicture\npiece\npig\npigeon\npill\npilot\npink\npioneer\npipe\npistol\npitch\npizza\nplace\nplanet\nplastic\nplate\nplay\nplease\npledge\npluck\nplug\nplunge\npoem\npoet\npoint\npolar\npole\npolice\npond\npony\npool\npopular\nportion\nposition\npossible\npost\npotato\npottery\npoverty\npowder\npower\npractice\npraise\npredict\nprefer\nprepare\npresent\npretty\nprevent\nprice\npride\nprimary\nprint\npriority\nprison\nprivate\nprize\nproblem\nprocess\nproduce\nprofit\nprogram\nproject\npromote\nproof\nproperty\nprosper\nprotect\nproud\nprovide\npublic\npudding\npull\npulp\npulse\npumpkin\npunch\npupil\npuppy\npurchase\npurity\npurpose\npurse\npush\nput\npuzzle\npyramid\nquality\nquantum\nquarter\nquestion\nquick\nquit\nquiz\nquote\nrabbit\nraccoon\nrace\nrack\nradar\nradio\nrail\nrain\nraise\nrally\nramp\nranch\nrandom\nrange\nrapid\nrare\nrate\nrather\nraven\nraw\nrazor\nready\nreal\nreason\nrebel\nrebuild\nrecall\nreceive\nrecipe\nrecord\nrecycle\nreduce\nreflect\nreform\nrefuse\nregion\nregret\nregular\nreject\nrelax\nrelease\nrelief\nrely\nremain\nremember\nremind\nremove\nrender\nrenew\nrent\nreopen\nrepair\nrepeat\nreplace\nreport\nrequire\nrescue\nresemble\nresist\nresource\nresponse\nresult\nretire\nretreat\nreturn\nreunion\nreveal\nreview\nreward\nrhythm\nrib\nribbon\nrice\nrich\nride\nridge\nrifle\nright\nrigid\nring\nriot\nripple\nrisk\nritual\nrival\nriver\nroad\nroast\nrobot\nrobust\nrocket\nromance\nroof\nrookie\nroom\nrose\nrotate\nrough\nround\nroute\nroyal\nrubber\nrude\nrug\nrule\nrun\nrunway\nrural\nsad\nsaddle\nsadness\nsafe\nsail\nsalad\nsalmon\nsalon\nsalt\nsalute\nsame\nsample\nsand\nsatisfy\nsatoshi\nsauce\nsausage\nsave\nsay\nscale\nscan\nscare\nscatter\nscene\nscheme\nschool\nscience\nscissors\nscorpion\nscout\nscrap\nscreen\nscript\nscrub\nsea\nsearch\nseason\nseat\nsecond\nsecret\nsection\nsecurity\nseed\nseek\nsegment\nselect\nsell\nseminar\nsenior\nsense\nsentence\nseries\nservice\nsession\nsettle\nsetup\nseven\nshadow\nshaft\nshallow\nshare\nshed\nshell\nsheriff\nshield\nshift\nshine\nship\nshiver\nshock\nshoe\nshoot\nshop\nshort\nshoulder\nshove\nshrimp\nshrug\nshuffle\nshy\nsibling\nsick\nside\nsiege\nsight\nsign\nsilent\nsilk\nsilly\nsilver\nsimilar\nsimple\nsince\nsing\nsiren\nsister\nsituate\nsix\nsize\nskate\nsketch\nski\nskill\nskin\nskirt\nskull\nslab\nslam\nsleep\nslender\nslice\nslide\nslight\nslim\nslogan\nslot\nslow\nslush\nsmall\nsmart\nsmile\nsmoke\nsmooth\nsnack\nsnake\nsnap\nsniff\nsnow\nsoap\nsoccer\nsocial\nsock\nsoda\nsoft\nsolar\nsoldier\nsolid\nsolution\nsolve\nsomeone\nsong\nsoon\nsorry\nsort\nsoul\nsound\nsoup\nsource\nsouth\nspace\nspare\nspatial\nspawn\nspeak\nspecial\nspeed\nspell\nspend\nsphere\nspice\nspider\nspike\nspin\nspirit\nsplit\nspoil\nsponsor\nspoon\nsport\nspot\nspray\nspread\nspring\nspy\nsquare\nsqueeze\nsquirrel\nstable\nstadium\nstaff\nstage\nstairs\nstamp\nstand\nstart\nstate\nstay\nsteak\nsteel\nstem\nstep\nstereo\nstick\nstill\nsting\nstock\nstomach\nstone\nstool\nstory\nstove\nstrategy\nstreet\nstrike\nstrong\nstruggle\nstudent\nstuff\nstumble\nstyle\nsubject\nsubmit\nsubway\nsuccess\nsuch\nsudden\nsuffer\nsugar\nsuggest\nsuit\nsummer\nsun\nsunny\nsunset\nsuper\nsupply\nsupreme\nsure\nsurface\nsurge\nsurprise\nsurround\nsurvey\nsuspect\nsustain\nswallow\nswamp\nswap\nswarm\nswear\nsweet\nswift\nswim\nswing\nswitch\nsword\nsymbol\nsymptom\nsyrup\nsystem\ntable\ntackle\ntag\ntail\ntalent\ntalk\ntank\ntape\ntarget\ntask\ntaste\ntattoo\ntaxi\nteach\nteam\ntell\nten\ntenant\ntennis\ntent\nterm\ntest\ntext\nthank\nthat\ntheme\nthen\ntheory\nthere\nthey\nthing\nthis\nthought\nthree\nthrive\nthrow\nthumb\nthunder\nticket\ntide\ntiger\ntilt\ntimber\ntime\ntiny\ntip\ntired\ntissue\ntitle\ntoast\ntobacco\ntoday\ntoddler\ntoe\ntogether\ntoilet\ntoken\ntomato\ntomorrow\ntone\ntongue\ntonight\ntool\ntooth\ntop\ntopic\ntopple\ntorch\ntornado\ntortoise\ntoss\ntotal\ntourist\ntoward\ntower\ntown\ntoy\ntrack\ntrade\ntraffic\ntragic\ntrain\ntransfer\ntrap\ntrash\ntravel\ntray\ntreat\ntree\ntrend\ntrial\ntribe\ntrick\ntrigger\ntrim\ntrip\ntrophy\ntrouble\ntruck\ntrue\ntruly\ntrumpet\ntrust\ntruth\ntry\ntube\ntuition\ntumble\ntuna\ntunnel\nturkey\nturn\nturtle\ntwelve\ntwenty\ntwice\ntwin\ntwist\ntwo\ntype\ntypical\nugly\numbrella\nunable\nunaware\nuncle\nuncover\nunder\nundo\nunfair\nunfold\nunhappy\nuniform\nunique\nunit\nuniverse\nunknown\nunlock\nuntil\nunusual\nunveil\nupdate\nupgrade\nuphold\nupon\nupper\nupset\nurban\nurge\nusage\nuse\nused\nuseful\nuseless\nusual\nutility\nvacant\nvacuum\nvague\nvalid\nvalley\nvalve\nvan\nvanish\nvapor\nvarious\nvast\nvault\nvehicle\nvelvet\nvendor\nventure\nvenue\nverb\nverify\nversion\nvery\nvessel\nveteran\nviable\nvibrant\nvicious\nvictory\nvideo\nview\nvillage\nvintage\nviolin\nvirtual\nvirus\nvisa\nvisit\nvisual\nvital\nvivid\nvocal\nvoice\nvoid\nvolcano\nvolume\nvote\nvoyage\nwage\nwagon\nwait\nwalk\nwall\nwalnut\nwant\nwarfare\nwarm\nwarrior\nwash\nwasp\nwaste\nwater\nwave\nway\nwealth\nweapon\nwear\nweasel\nweather\nweb\nwedding\nweekend\nweird\nwelcome\nwest\nwet\nwhale\nwhat\nwheat\nwheel\nwhen\nwhere\nwhip\nwhisper\nwide\nwidth\nwife\nwild\nwill\nwin\nwindow\nwine\nwing\nwink\nwinner\nwinter\nwire\nwisdom\nwise\nwish\nwitness\nwolf\nwoman\nwonder\nwood\nwool\nword\nwork\nworld\nworry\nworth\nwrap\nwreck\nwrestle\nwrist\nwrite\nwrong\nyard\nyear\nyellow\nyou\nyoung\nyouth\nzebra\nzero\nzone\nzoo\n"
  },
  {
    "path": "lib/bip-0039/generate_cpp.sh",
    "content": "#!/bin/bash\n\nprintf \"#include <mmx/mnemonic.h>\\n\\n\" > out.cpp\nprintf \"namespace mmx {\\n\" >> out.cpp\nprintf \"namespace mnemonic {\\n\\n\" >> out.cpp\nprintf \"const std::vector<std::string> wordlist_en = {\\n\" >> out.cpp\n\nwhile read word; do\n\tprintf \"\\t\\\"$word\\\",\\n\" >> out.cpp\ndone < $1\n\nprintf \"};\\n}\\n}\" >> out.cpp\n"
  },
  {
    "path": "lib/make_all.sh",
    "content": "#!/bin/bash\n\nset -e\n\nmkdir -p .cache\n\ncd secp256k1\n\nSECP_COMMIT=$(git rev-parse HEAD)\n\nif [[ -f ../.cache/SECP_BUILD && -f .libs/libsecp256k1.a ]]; then\n\tSECP_BUILD=$(cat ../.cache/SECP_BUILD || true)\nfi\n\nif [ \"${SECP_COMMIT}\" != \"${SECP_BUILD}\" ]\nthen\n\techo \"Compiling secp256k1 ${SECP_COMMIT}\"\n\t./autogen.sh > /dev/null\n\tCFLAGS=-fPIC ./configure --disable-shared --disable-tests --disable-benchmark --with-pic > /dev/null\n\tmake clean > /dev/null\n\tmake -j8\n\techo -n ${SECP_COMMIT} > ../.cache/SECP_BUILD\nfi\n\ncd ..\n"
  },
  {
    "path": "make_Debug.cmd",
    "content": "@ECHO OFF\r\nTITLE MMX Make Debug Script\r\n\r\nIF \"%VCPKG_ROOT%\"==\"\" (\r\n\tSET VCPKG_ROOT=C:/dev/vcpkg\r\n)\r\n\r\nIF \"%CMAKE_BUILD_PRESET%\"==\"\" (\r\n\tSET CMAKE_BUILD_PRESET=windows-default\r\n)\r\n\r\ncmake --preset %CMAKE_BUILD_PRESET% && ^\r\ncmake --build --preset %CMAKE_BUILD_PRESET% --config Debug\r\n"
  },
  {
    "path": "make_RelWithDebInfo.cmd",
    "content": "@ECHO OFF\r\nTITLE MMX Make RelWithDebInfo Script\r\n\r\nIF \"%VCPKG_ROOT%\"==\"\" (\r\n\tSET VCPKG_ROOT=C:/dev/vcpkg\r\n)\r\n\r\nIF \"%CMAKE_BUILD_PRESET%\"==\"\" (\r\n\tSET CMAKE_BUILD_PRESET=windows-default\r\n)\r\n\r\ncmake --preset %CMAKE_BUILD_PRESET% && ^\r\ncmake --build --preset %CMAKE_BUILD_PRESET% --config RelWithDebInfo\r\n"
  },
  {
    "path": "make_Release.cmd",
    "content": "@ECHO OFF\r\nTITLE MMX Make Release Script\r\n\r\nIF \"%VCPKG_ROOT%\"==\"\" (\r\n\tSET VCPKG_ROOT=C:/dev/vcpkg\r\n)\r\n\r\nIF \"%CMAKE_BUILD_PRESET%\"==\"\" (\r\n\tSET CMAKE_BUILD_PRESET=windows-default\r\n)\r\n\r\ncmake --preset %CMAKE_BUILD_PRESET% && ^\r\ncmake --build --preset %CMAKE_BUILD_PRESET% --config Release\r\n"
  },
  {
    "path": "make_Release_pack.cmd",
    "content": "@ECHO OFF\r\nTITLE MMX Make Release and Pack Script\r\n\r\nREM Usage\r\nREM CMD\r\nREM SET MMX_VERSION=v0.9.10 && .\\make_release_pack.cmd\r\n\r\nREM PowerShell\r\nREM $env:MMX_VERSION='v0.9.10'; .\\make_release_pack.cmd\r\n\r\nREM SET MMX_VERSION=v0.0.0\r\n\r\nSET MMX_WIN_PACK=TRUE\r\nSET CMAKE_BUILD_PRESET=windows-default\r\n\r\nCALL .\\make_release.cmd && ^\r\nIF \"%MMX_WIN_PACK%\"==\"TRUE\" cpack -C Release --config ./build/%CMAKE_BUILD_PRESET%/CPackConfig.cmake -B ./build/%CMAKE_BUILD_PRESET%/!package\r\n"
  },
  {
    "path": "make_coverage.sh",
    "content": "#!/bin/bash\n\nmkdir -p build\n\ncd build\n\ncmake -DCMAKE_BUILD_TYPE=Debug -DWITH_COVERAGE=1 -DCMAKE_CXX_FLAGS=\"-fmax-errors=1\" $@ ..\n\nmake -j8\n\ncd ..\n\n./scripts/reset_coverage.sh\n"
  },
  {
    "path": "make_debian.sh",
    "content": "#!/bin/bash\n\nset -e\n\n./make_release.sh -DNODE_INSTALL_PATH=\"share/mmx-node\" -DVNX_BUILD_TOOLS=OFF -DMMX_BUILD_TESTS=OFF\n\nVERSION=$(cat config/default/build.json | jq -r .version | sed 's/^v//')\nARCH=${ARCH:-any}\nDIST=${DIST:-generic}\nDST=mmx-node-$VERSION-$ARCH-$DIST\n\nrm -rf $DST\nmkdir -m 755 -p $DST/DEBIAN\nmkdir -m 755 -p $DST/usr\n\necho \"Version: $VERSION\" >> $DST/DEBIAN/control\necho \"Architecture: ${ARCH}\" >> $DST/DEBIAN/control\ncat cmake/debian/${DIST}/control >> $DST/DEBIAN/control\n\ncp -a build/dist/. $DST/usr/\n\nrm -r $DST/usr/include\nrm -r $DST/usr/interface\nrm -r $DST/usr/share/cmake\nfind $DST/usr/ -name \"*.a\" -delete\n\nfakeroot dpkg-deb --build $DST\n\nrm -rf $DST\n"
  },
  {
    "path": "make_debug.sh",
    "content": "#!/bin/bash\n\nset -e\n\ncd lib\n./make_all.sh\ncd ..\n\nmkdir -p build\n\ncd build\n\ncmake -DCMAKE_BUILD_TYPE=Debug -DVNX_ADDONS_BUILD_TESTS=1 -DCMAKE_CXX_FLAGS=\"-fmax-errors=1\" $@ ..\n\nmake -j $(nproc)\n\n"
  },
  {
    "path": "make_devel.sh",
    "content": "#!/bin/bash\n\nset -e\n\ncd lib\n./make_all.sh\ncd ..\n\nmkdir -p build\n\ncd build\n\ncmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DVNX_ADDONS_BUILD_TESTS=1 -DCMAKE_INSTALL_PREFIX=dist -DCMAKE_CXX_FLAGS=\"-fno-omit-frame-pointer -fmax-errors=1\" $@ ..\n\nmake -j $(nproc)\n\n"
  },
  {
    "path": "make_release.sh",
    "content": "#!/bin/bash\n\nset -e\n\ncd lib\n./make_all.sh\ncd ..\n\nmkdir -p build\n\ncd build\n\nrm -rf dist\n\ncmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=dist $@ ..\n\nmake -j $(nproc) install\n"
  },
  {
    "path": "modules/Farmer.vni",
    "content": "package mmx;\n\nmodule Farmer {\n\t\n\tvnx.TopicPtr input_info = \"harvester.info\";\n\tvnx.TopicPtr input_proofs = \"harvester.proof\";\n\tvnx.TopicPtr input_partials = \"harvester.partials\";\n\t\n\tvnx.TopicPtr output_proofs = \"farmer.proof\";\n\tvnx.TopicPtr output_partials = \"farmer.partials\";\n\t\n\tuint harvester_timeout = 60;\t\t\t\t\t// [sec]\n\tuint difficulty_interval = 300;\t\t\t\t\t// [sec]\n\t\n\tstring node_server = \"Node\";\n\tstring wallet_server = \"Wallet\";\n\t\n\toptional<addr_t> reward_addr;\t\t\t\t\t// default = first address of first wallet\n\t\n\toptional<ulong> partial_diff;\t\t\t\t\t// custom partial diff (if pool supports it)\n\toptional<ulong> payout_threshold;\t\t\t\t// custom payout threshold (if pool supports it)\n\t\n\t\n\t@Permission(permission_e.REMOTE)\n\tvnx.Hash64 get_mac_addr() const;\n\t\n\t@Permission(permission_e.REMOTE)\n\tulong get_partial_diff(addr_t plot_nft) const;\n\t\n\t@Permission(permission_e.REMOTE)\n\tmap<addr_t, ulong> get_partial_diffs(vector<addr_t> plot_nfts) const;\n\t\n\t@Permission(permission_e.REMOTE)\n\tvector<pubkey_t> get_farmer_keys() const;\n\t\n\tFarmInfo* get_farm_info() const;\n\t\n\t@Permission(permission_e.SIGN_BLOCK)\n\tBlockHeader* sign_block(BlockHeader* block) const;\n\t\n\t@Permission(permission_e.SIGN_BLOCK)\n\tsignature_t sign_vote(ValidatorVote* vote) const;\n\t\n\t\n\tvoid handle(FarmInfo sample);\n\tvoid handle(ProofResponse sample);\n\tvoid handle(Partial sample);\n\t\n}\n"
  },
  {
    "path": "modules/Harvester.vni",
    "content": "package mmx;\n\nmodule Harvester implements vnx.addons.HttpComponent {\n\t\n\tvnx.TopicPtr input_challenges = \"harvester.challenges\";\n\t\n\tvnx.TopicPtr output_info = \"harvester.info\";\n\tvnx.TopicPtr output_proofs = \"harvester.proof\";\n\tvnx.TopicPtr output_lookups = \"harvester.lookups\";\n\tvnx.TopicPtr output_partials = \"harvester.partials\";\n\t\n\tset<string> plot_dirs;\n\tset<string> dir_blacklist;\n\t\n\tstring node_server = \"Node\";\n\tstring farmer_server = \"Farmer\";\n\tstring config_path;\n\tstring storage_path;\n\t\n\tstring my_name;\t\t\t\t\t\t\t// custom harvester name\n\t\n\tint max_queue_ms = 10000;\t\t\t\t// [ms]\n\t\n\tint reload_interval = 3600;\t\t\t\t// (0 to disable) [sec]\n\tint nft_query_interval = 60;\t\t\t// [sec]\n\t\n\tuint num_threads = 32;\t\t\t\t\t// for plot lookups\n\tuint max_recursion = 4;\t\t\t\t\t// for recursive_search\n\t\n\tbool recursive_search = true;\n\tbool farm_virtual_plots = true;\n\t\n\t\n\tvoid reload();\n\t\n\tvoid add_plot_dir(string path);\n\t\n\tvoid rem_plot_dir(string path);\n\t\n\tFarmInfo* get_farm_info() const;\n\t\n\tulong get_total_bytes() const;\t\t\t// [bytes]\n\t\n\t\n\tvoid handle(Challenge sample);\n\t\n}\n"
  },
  {
    "path": "modules/Node.vni",
    "content": "package mmx;\n\nimport mmx.vm.varptr_t;\n\nmodule Node implements vnx.addons.HttpComponent {\n\t\n\tvnx.TopicPtr input_vdfs = \"network.vdfs\";\n\tvnx.TopicPtr input_votes = \"network.votes\";\n\tvnx.TopicPtr input_proof = \"network.proof\";\n\tvnx.TopicPtr input_blocks = \"network.blocks\";\n\tvnx.TopicPtr input_transactions = \"network.transactions\";\n\tvnx.TopicPtr input_timelord_vdfs = \"timelord.proof\";\n\tvnx.TopicPtr input_harvester_proof = \"farmer.proof\";\n\tvnx.TopicPtr input_vdf_points = \"network.vdf_points\";\n\n\tvnx.TopicPtr output_verified_vdfs = \"node.verified_vdfs\";\n\tvnx.TopicPtr output_verified_votes = \"node.verified_votes\";\n\tvnx.TopicPtr output_verified_proof = \"node.verified_proof\";\n\tvnx.TopicPtr output_verified_blocks = \"node.verified_blocks\";\n\tvnx.TopicPtr output_verified_transactions = \"node.verified_transactions\";\n\tvnx.TopicPtr output_committed_blocks = \"node.committed_blocks\";\n\tvnx.TopicPtr output_transactions = \"node.transactions\";\n\tvnx.TopicPtr output_interval_request = \"timelord.requests\";\n\tvnx.TopicPtr output_challenges = \"harvester.challenges\";\n\tvnx.TopicPtr output_vdf_points = \"node.vdf_points\";\n\tvnx.TopicPtr output_votes = \"node.votes\";\n\t\n\tint max_queue_ms = 10000;\t\t\t\t// [ms]\n\tint update_interval_ms = 1000;\t\t\t// [ms]\n\tint validate_interval_ms = 500;\t\t\t// [ms]\n\tint sync_loss_delay = 60;\t\t\t\t// when to re-sync if stuck [sec]\n\t\n\tuint max_history = 1000;\t\t\t\t// max block header history\n\tuint max_tx_pool = 100;\t\t\t\t\t// number of full blocks\n\tuint max_tx_queue = 10000;\t\t\t\t// pending transactions to verify\n\t\n\tuint max_sync_jobs = 64;\t\t\t\t// number of parallel requests\n\tuint max_sync_ahead = 1000;\t\t\t\t// how many blocks to fetch ahead at most\n\tuint num_sync_retries = 3;\t\t\t\t// how often to retry when reaching a peak\n\tuint revert_height = -1;\t\t\t\t// to revert DB on start\n\t\n\tuint num_threads = 24;\n\tuint num_db_threads = 8;\n\tuint num_api_threads = 8;\n\t\n\tuint commit_threshold = 80;\t\t\t\t// percentage of proofs required\n\tuint max_future_sync = 100;\t\t\t\t// limit syncing into the future [blocks]\n\tuint max_vdf_verify_pending = 2;\t\t// how many VDFs to verify in parallel when synced\n\t\n\tint opencl_device = 0;\t\t\t\t\t// device to use for VDF verification (-1 to disable)\n\tstring opencl_device_name;\t\t\t\t// when specified, opencl_device is a relative index\n\t\n\tbool do_sync = true;\n\tbool show_warnings;\n\tbool vdf_slave_mode;\n\tbool run_tests;\n\tbool exec_debug;\t\t\t\t\t\t// dump memory on exec fail\n\tbool exec_profile;\t\t\t\t\t\t// write execution profiles\n\tbool exec_trace;\t\t\t\t\t\t// write execution traces\n\t\n\tstring storage_path;\n\tstring database_path = \"db/\";\n\tstring router_name = \"Router\";\n\t\n\taddr_t mmx_usd_swap_addr;\n\tstring metalsdev_api_key;\n\t\n\t\n\t@Permission(permission_e.PUBLIC)\n\tChainParams* get_params() const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tNetworkInfo* get_network_info() const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\thash_t get_genesis_hash() const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tuint get_height() const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tuint get_vdf_height() const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\toptional<uint> get_synced_height() const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\toptional<uint> get_synced_vdf_height() const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\thash_t get_vdf_peak() const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tBlock* get_block(hash_t hash) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tBlock* get_block_at(uint height) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tBlockHeader* get_header(hash_t hash) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tBlockHeader* get_header_at(uint height) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\toptional<hash_t> get_block_hash(uint height) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\toptional<pair<hash_t, hash_t>> get_block_hash_ex(uint height) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\toptional<uint> get_tx_height(hash_t id) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\toptional<tx_info_t> get_tx_info(hash_t id) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\toptional<tx_info_t> get_tx_info_for(Transaction* tx) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<hash_t> get_tx_ids(uint limit) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<hash_t> get_tx_ids_at(uint height) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<hash_t> get_tx_ids_since(uint height) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\texec_result_t validate(Transaction* tx) const;\n\t\n\t@Permission(PUBLISH)\n\tvoid add_block(Block* block);\n\t\n\t@Permission(PUBLISH)\n\tvoid add_transaction(Transaction* tx, bool pre_validate);\n\t\n\t// TODO: void await_transactions(vector<hash_t> tx_ids, uint min_confirm = 1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tContract* get_contract(addr_t address) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tContract* get_contract_for(addr_t address) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<Contract*> get_contracts(vector<addr_t> addresses) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<addr_t> get_contracts_by(vector<addr_t> addresses, optional<hash_t> type_hash) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<addr_t> get_contracts_owned_by(vector<addr_t> addresses, optional<hash_t> type_hash) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tTransaction* get_transaction(hash_t id, bool pending) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<Transaction*> get_transactions(vector<hash_t> ids) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<tx_entry_t> get_history(vector<addr_t> addresses, query_filter_t filter) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<tx_entry_t> get_history_memo(vector<addr_t> addresses, string memo, query_filter_t filter) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tuint128 get_balance(addr_t address, addr_t currency) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tmap<addr_t, uint128> get_balances(addr_t address, set<addr_t> whitelist, int limit = 100) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tmap<addr_t, balance_t> get_contract_balances(addr_t address, set<addr_t> whitelist, int limit = 100) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tuint128 get_total_balance(vector<addr_t> addresses, addr_t currency) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tmap<addr_t, uint128> get_total_balances(vector<addr_t> addresses, set<addr_t> whitelist, int limit = 100) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tmap<pair<addr_t, addr_t>, uint128> get_all_balances(vector<addr_t> addresses, set<addr_t> whitelist, int limit = 100) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<exec_entry_t> get_exec_history(addr_t address, int limit = 100, bool recent) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tmap<string, varptr_t> read_storage(addr_t contract, uint height = -1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tmap<ulong, varptr_t> dump_storage(addr_t contract, uint height = -1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvarptr_t read_storage_var(addr_t contract, ulong address, uint height = -1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvarptr_t read_storage_entry_var(addr_t contract, ulong address, ulong key, uint height = -1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tpair<varptr_t, ulong> read_storage_field(addr_t contract, string name, uint height = -1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\ttuple<varptr_t, ulong, ulong> read_storage_entry_addr(addr_t contract, string name, addr_t key, uint height = -1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\ttuple<varptr_t, ulong, ulong> read_storage_entry_string(addr_t contract, string name, string key, uint height = -1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<varptr_t> read_storage_array(addr_t contract, ulong address, uint height = -1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tmap<varptr_t, varptr_t> read_storage_map(addr_t contract, ulong address, uint height = -1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tmap<string, varptr_t> read_storage_object(addr_t contract, ulong address, uint height = -1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvnx.Variant call_contract(addr_t address, string method, vector<vnx.Variant> args, optional<addr_t> user, optional<pair<addr_t, uint128>> deposit) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\toptional<plot_nft_info_t> get_plot_nft_info(addr_t address) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\taddr_t get_plot_nft_target(addr_t address, optional<addr_t> farmer_addr) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\toffer_data_t get_offer(addr_t address) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<offer_data_t> get_offers(uint since, bool state) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<offer_data_t> get_offers_by(vector<addr_t> owners, bool state) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<offer_data_t> fetch_offers(vector<addr_t> addresses, bool state, bool closed) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<offer_data_t> get_recent_offers(int limit = 100, bool state = true) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<offer_data_t> get_recent_offers_for(optional<addr_t> bid, optional<addr_t> ask, uint128 min_bid, int limit = 100, bool state = true) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<trade_entry_t> get_trade_history(int limit = 100, uint since) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<trade_entry_t> get_trade_history_for(optional<addr_t> bid, optional<addr_t> ask, int limit = 100, uint since) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<swap_info_t> get_swaps(uint since, optional<addr_t> token, optional<addr_t> currency, int limit = 100) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tswap_info_t get_swap_info(addr_t address) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tswap_user_info_t get_swap_user_info(addr_t address, addr_t user) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<swap_entry_t> get_swap_history(addr_t address, int limit = 100) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tuint128[2] get_swap_trade_estimate(addr_t address, uint i, uint128 amount, int num_iter = 20) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tuint128[2] get_swap_fees_earned(addr_t address, addr_t user) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tuint128[2] get_swap_equivalent_liquidity(addr_t address, addr_t user) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tmap<addr_t, pair<addr_t, uint128>[2]> get_swap_liquidity_by(vector<addr_t> addresses) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tuint128 get_total_supply(addr_t currency) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<BlockHeader*> get_farmed_blocks(vector<pubkey_t> farmer_keys, bool full_blocks, uint since, int limit = 100) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tfarmed_block_summary_t get_farmed_block_summary(vector<pubkey_t> farmer_keys, uint since) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\tvector<pair<pubkey_t, uint>> get_farmer_ranking(int limit = -1) const;\n\t\n\t@Permission(permission_e.PUBLIC)\n\ttuple<pooling_error_e, string> verify_plot_nft_target(addr_t address, addr_t pool_target) const;\n\t\n\ttuple<pooling_error_e, string> verify_partial(Partial* partial, optional<addr_t> pool_target) const;\n\t\n\tvoid start_sync(bool force);\n\t\n\tvoid revert_sync(uint height);\n\t\n\t\n\tvoid handle(Block value);\n\tvoid handle(Transaction value);\n\tvoid handle(ProofOfTime value);\n\tvoid handle(ProofResponse value);\n\tvoid handle(VDF_Point value);\n\tvoid handle(ValidatorVote value);\n\t\n}\n"
  },
  {
    "path": "modules/ProofServer.vni",
    "content": "package mmx;\n\nmodule ProofServer {\n\t\n\tuint num_threads = 32;\n\t\n\t\n\t@Permission(permission_e.REMOTE)\n\tvector<table_entry_t> compute(vector<uint32> X_values, hash_t id, int ksize, int xbits) const async;\n\t\n}\n"
  },
  {
    "path": "modules/Router.vni",
    "content": "package mmx;\n\nmodule Router extends vnx.addons.MsgServer implements vnx.addons.HttpComponent {\n\t\n\tvnx.TopicPtr input_verified_vdfs = \"node.verified_vdfs\";\n\tvnx.TopicPtr input_verified_votes = \"node.verified_votes\";\n\tvnx.TopicPtr input_verified_proof = \"node.verified_proof\";\n\tvnx.TopicPtr input_verified_blocks = \"node.verified_blocks\";\n\tvnx.TopicPtr input_verified_transactions = \"node.verified_transactions\";\n\tvnx.TopicPtr input_transactions = \"node.transactions\";\n\tvnx.TopicPtr input_vdf_points = \"node.vdf_points\";\n\tvnx.TopicPtr input_vdfs = \"timelord.proof\";\n\t\n\tvnx.TopicPtr output_vdfs = \"network.vdfs\";\n\tvnx.TopicPtr output_votes = \"network.votes\";\n\tvnx.TopicPtr output_proof = \"network.proof\";\n\tvnx.TopicPtr output_blocks = \"network.blocks\";\n\tvnx.TopicPtr output_transactions = \"network.transactions\";\n\tvnx.TopicPtr output_vdf_points = \"network.vdf_points\";\n\t\n\tint max_queue_ms = 1000;\t\t\t\t// [ms]\n\tint send_interval_ms = 20;\t\t\t\t// [ms]\n\tint query_interval_ms = 10000;\t\t\t// [ms]\n\tint update_interval_ms = 1000;\t\t\t// [ms]\n\tint connect_interval_ms = 10000;\t\t// [ms]\n\tint fetch_timeout_ms = 10000;\t\t\t// for fetching data from peers [ms]\n\tint relay_target_ms = 5000;\t\t\t\t// [ms]\n\t\n\tuint sync_loss_delay = 60;\t\t\t\t// when to re-sync [sec]\n\tuint discover_interval = 60;\t\t\t// how often to search for new peers [sec]\n\tuint disconnect_interval = 0;\t\t\t// when to disconnect peers manually (0 = disable) [sec]\n\tuint peer_retry_interval = 360;\t\t\t// how often to try failed peers [min]\n\t\n\tuint num_peers_out = 8;\t\t\t\t\t// maximum outgoing connections to synced peers\n\tuint min_sync_peers = 2;\t\t\t\t// minimum peers needed for syncing\n\tuint max_peer_set = 100;\t\t\t\t// do not ask for more peers than that\n\t\n\tuint max_sent_cache = 20000;\n\tuint max_hash_cache = 100000;\n\tuint max_vdf_segments = 65536;\t\t\t// for relay without verify\n\t\n\tuint node_version = 103;\n\tnode_type_e mode = FULL_NODE;\n\t\n\tbool do_relay = true;\n\tbool open_port = false;\n\t\n\tdouble max_tx_upload = 2;\t\t\t\t// relative to full block per block interval\n\tdouble max_pending_cost = 0.2;\t\t\t// relative to full block per peer\n\tuint priority_queue_size = 262144;\t\t// [bytes]\n\t\n\tset<string> seed_peers;\n\tset<string> fixed_peers;\n\tset<string> block_peers;\n\tset<string> master_nodes;\n\t\n\tstring storage_path;\n\tstring node_server = \"Node\";\n\t\n\t\n\tvoid discover();\n\t\n\thash_t get_id() const;\n\t\n\tnode_info_t get_info() const;\n\t\n\tpair<pubkey_t, signature_t> sign_msg(hash_t msg) const;\n\t\n\tvector<string> get_peers(uint max_count = 10) const;\n\t\n\tvector<string> get_known_peers() const;\n\t\n\tvector<string> get_connected_peers() const;\n\t\n\tPeerInfo* get_peer_info() const;\n\t\n\tvoid kick_peer(string address);\n\t\n\tvector<Block*> get_blocks_at(uint height) const async;\n\t\n\tBlock* fetch_block(hash_t hash, optional<string> address) const async;\n\t\n\tBlock* fetch_block_at(uint height, string address) const async;\n\t\n\t\n\tvoid handle(Block sample);\n\tvoid handle(Transaction sample);\n\tvoid handle(ProofOfTime sample);\n\tvoid handle(ProofResponse sample);\n\tvoid handle(VDF_Point sample);\n\tvoid handle(ValidatorVote sample);\n\t\n}\n"
  },
  {
    "path": "modules/TimeLord.vni",
    "content": "package mmx;\n\nmodule TimeLord {\n\t\n\tvnx.TopicPtr input_request = \"timelord.requests\";\n\t\n\tvnx.TopicPtr output_proofs = \"timelord.proof\";\n\t\n\t\n\tuint max_history = 1000000;\n\t\n\tstring node_server = \"Node\";\n\tstring wallet_server = \"Wallet\";\n\t\n\tstring storage_path;\n\t\n\toptional<addr_t> reward_addr;\t\t\t\t\t// default = first address of first wallet\n\t\n\t\n\tvoid stop_vdf();\n\t\n\tvoid handle(IntervalRequest sample);\n\t\n}\n"
  },
  {
    "path": "modules/Wallet.vni",
    "content": "package mmx;\n\nmodule Wallet implements vnx.addons.HttpComponent {\n\t\n\tvector<string> key_files;\n\t\n\tvector<account_t> accounts;\t\t\t\t// index starts at max_key_files\n\t\n\tstring config_path;\n\tstring storage_path;\n\tstring database_path = \"wallet/\";\n\tstring node_server = \"Node\";\n\t\n\tuint max_key_files = 100;\n\tuint num_addresses = 100;\n\tuint max_addresses = 10000;\n\tuint default_expire = 100;\t\t\t\t// when transactions expire\n\t\n\tint lock_timeout_sec = 600;\t\t\t\t// when to auto-lock after unlock [sec]\n\tint cache_timeout_ms = 1000;\t\t\t// how often to update from node [ms]\n\t\n\tset<addr_t> token_whitelist;\n\t\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* send(uint index, uint128 amount, addr_t dst_addr, addr_t currency, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* send_many(uint index, vector<pair<addr_t, uint128>> amounts, addr_t currency, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* send_from(uint index, uint128 amount, addr_t dst_addr, addr_t src_addr, addr_t currency, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* deploy(uint index, Contract* contract, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* execute(uint index, addr_t address, string method, vector<vnx.Variant> args, optional<uint> user, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* deposit(\tuint index, addr_t address, string method, vector<vnx.Variant> args,\n\t\t\t\t\t\t\tuint128 amount, addr_t currency, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* make_offer(uint index, uint owner, uint128 bid_amount, addr_t bid_currency,\n\t\t\t\t\t\t\tuint128 ask_amount, addr_t ask_currency, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* offer_trade(uint index, addr_t address, uint128 amount, uint dst_addr, uint128 price, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* offer_withdraw(uint index, addr_t address, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* accept_offer(uint index, addr_t address, uint dst_addr, uint128 price, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* cancel_offer(uint index, addr_t address, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* swap_trade(uint index, addr_t address, uint128 amount, addr_t currency, optional<uint128> min_trade, int num_iter = 20, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* swap_add_liquid(uint index, addr_t address, uint128 amount[2], uint pool_idx, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* swap_rem_liquid(uint index, addr_t address, uint128 amount[2], spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* plotnft_exec(addr_t address, string method, vector<vnx.Variant> args, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* plotnft_create(uint index, string name, optional<uint> owner, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* complete(uint index, Transaction* tx, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tTransaction* sign_off(uint index, Transaction* tx, spend_options_t options) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tSolution* sign_msg(uint index, addr_t address, hash_t msg) const;\n\t\n\tvoid send_off(uint index, Transaction* tx) const;\n\t\n\tvoid mark_spent(uint index, map<pair<addr_t, addr_t>, uint128> amounts);\n\t\n\tvoid reserve(uint index, map<pair<addr_t, addr_t>, uint128> amounts);\n\t\n\tvoid release(uint index, map<pair<addr_t, addr_t>, uint128> amounts);\n\t\n\tvoid release_all();\n\t\n\tvoid reset_cache(uint index);\n\t\n\tvoid update_cache(uint index) const;\n\t\n\tvector<tx_entry_t> get_history(uint index, query_filter_t filter) const;\n\t\n\tvector<tx_log_entry_t> get_tx_log(uint index, int limit = 100) const;\n\t\n\tvector<txin_t> gather_inputs_for(uint index, uint128 amount, addr_t currency, spend_options_t options) const;\n\t\n\tbalance_t get_balance(uint index, addr_t currency) const;\n\t\n\tmap<addr_t, balance_t> get_balances(uint index, bool with_zero) const;\n\t\n\tmap<addr_t, balance_t> get_total_balances(vector<addr_t> addresses) const;\n\t\n\tmap<addr_t, balance_t> get_contract_balances(addr_t address) const;\n\t\n\tmap<addr_t, Contract*> get_contracts(uint index, optional<string> type_name, optional<hash_t> type_hash) const;\n\t\n\tmap<addr_t, Contract*> get_contracts_owned(uint index, optional<string> type_name, optional<hash_t> type_hash) const;\n\t\n\tvector<offer_data_t> get_offers(uint index, bool state) const;\n\t\n\tmap<addr_t, pair<addr_t, uint128>[2]> get_swap_liquidity(uint index) const;\n\t\n\taddr_t get_address(uint index, uint offset) const;\n\t\n\tvector<addr_t> get_all_addresses(int index) const;\t\t\t\t// (index == -1) -> all wallets\n\t\n\tint find_wallet_by_addr(addr_t address) const;\n\t\n\taccount_info_t get_account(uint index) const;\n\t\n\tvector<account_info_t> get_all_accounts() const;\n\t\n\tbool is_locked(uint index) const;\n\t\n\tvoid lock(uint index);\n\t\n\tvoid unlock(uint index, string passphrase);\n\t\n\tvoid add_account(uint index, account_t config, optional<string> passphrase);\n\t\n\tvoid create_account(account_t config, optional<string> passphrase);\n\t\n\tvoid create_wallet(account_t config, optional<string> words, optional<string> passphrase);\n\t\n\tvoid import_wallet(account_t config, KeyFile* key_file, optional<string> passphrase);\n\t\n\tvoid remove_account(uint index, uint account);\n\t\n\tvoid set_address_count(uint index, uint count);\n\t\n\tvector<string> get_mnemonic_wordlist(string lang = \"en\") const;\n\t\n\tset<addr_t> get_token_list() const;\n\t\n\tvoid add_token(addr_t address);\n\t\n\tvoid rem_token(addr_t address);\n\t\n\t@Permission(permission_e.SPENDING)\n\tKeyFile* export_wallet(uint index) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\thash_t get_master_seed(uint index) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tvector<string> get_mnemonic_seed(uint index) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tpair<skey_t, pubkey_t> get_farmer_keys(uint index) const;\n\t\n\t@Permission(permission_e.SPENDING)\n\tvector<pair<skey_t, pubkey_t>> get_all_farmer_keys() const;\n\t\n}\n"
  },
  {
    "path": "modules/WebAPI.vni",
    "content": "package mmx;\n\nmodule WebAPI implements vnx.addons.HttpComponent {\n\t\n\tvnx.TopicPtr input_blocks = \"node.verified_blocks\";\n\tvnx.TopicPtr input_proofs = \"harvester.proof\";\n\t\n\tstring node_server = \"Node\";\n\tstring wallet_server = \"Wallet\";\n\tstring farmer_server = \"Farmer\";\n\tstring exchange_server = \"ExchClient\";\n\t\n\tstring config_path;\n\t\n\tuint max_recursion = 100;\n\tuint max_log_history = 10000;\n\t\n\tuint sync_delay = 18;\t\t\t\t\t// blocks after sync for public service\n\t\n\tuint cache_max_age = 0;\t\t\t\t\t// 0 = no-cache\n\t\n\t\n\tvoid shutdown();\n\t\n\tvoid handle(Block sample);\n\tvoid handle(ProofResponse sample);\n\tvoid handle(vnx.LogMsg sample);\n\t\n}\n"
  },
  {
    "path": "run_farmer.sh",
    "content": "#!/bin/bash\n\nsource ./activate.sh\n\nmmx_farmer -c config/${NETWORK}/ config/farmer/ \"${MMX_HOME}config/local/\" $@\n"
  },
  {
    "path": "run_gdb_node.sh",
    "content": "#!/bin/bash\n\nsource ./activate.sh\n\n#./scripts/kill_high_mem.sh mmx_node 8192 &\n\ngdb -ex=run --args ./build/mmx_node -c config/${NETWORK}/ config/node/ \"${MMX_HOME}config/local/\" $@\n\nkill $(jobs -p)\n"
  },
  {
    "path": "run_harvester.sh",
    "content": "#!/bin/bash\n\nsource ./activate.sh\n\nmmx_harvester -c config/${NETWORK}/ config/farmer/ \"${MMX_HOME}config/local/\" $@\n"
  },
  {
    "path": "run_node.sh",
    "content": "#!/bin/bash\n\nsource ./activate.sh\n\nmmx_node -c config/${NETWORK}/ config/node/ \"${MMX_HOME}config/local/\" $@\n"
  },
  {
    "path": "run_timelord.sh",
    "content": "#!/bin/bash\n\nsource ./activate.sh\n\nmmx_timelord -c config/${NETWORK}/ config/timelord/ \"${MMX_HOME}config/local/\" $@\n"
  },
  {
    "path": "run_valgrind_node.sh",
    "content": "#!/bin/bash\n\nsource ./activate.sh\n\nvalgrind ./build/mmx_node -c config/${NETWORK}/ config/node/ \"${MMX_HOME}config/local/\" $@\n\n"
  },
  {
    "path": "run_wallet.sh",
    "content": "#!/bin/bash\n\nsource ./activate.sh\n\nmmx_wallet -c config/${NETWORK}/ config/wallet/ \"${MMX_HOME}config/local/\" $@\n"
  },
  {
    "path": "run_wallet_gui.sh",
    "content": "#!/bin/bash\n\nsource ./activate.sh\n\nNODE=$(cat \"${MMX_HOME}config/local/node\")\n\nNODE=$(zenity --entry --title=\"Remote Node Address\" --text=\"Node IP or hostname:\" --entry-text=\"$NODE\")\n\nif [[ -z \"${NODE}\" ]]; then\n\texit -1\nfi\n\necho \"$NODE\" > \"${MMX_HOME}config/local/node\"\n\nmmx_wallet -c config/${NETWORK}/ config/wallet/ \"${MMX_HOME}config/local/\" --gui $@\n"
  },
  {
    "path": "scripts/bench/test_iops.sh",
    "content": "#!/bin/bash\n\nsudo fio --filename=$1 --direct=0 --rw=randread --bs=48 --ioengine=libaio --iodepth=1024 --runtime=30 --numjobs=16 --time_based --group_reporting --name=iops-test-job --eta-newline=1 --readonly\n"
  },
  {
    "path": "scripts/docker/mmx-testnet/README.md",
    "content": "# Setup\n\nTo enable farming:\n- Edit `compose.yml` to add your plot drives\n- Create folder `~/.mmx_testnet` if not already exists\n- Copy your `wallet*.dat` to `~/.mmx_testnet/wallet.dat` (the one which has your farmer key)\n\nTo enable timelord:\n- Edit `compose.yml` to add `--timelord` to the command line\n\n# Update\n\nTo get the latest image and run it:\n```\ndocker compose pull                 # for CPU only\ndocker compose -f nvidia.yml pull   # for Nvidia GPU\ndocker compose down\n```\nThen start again, see below.\n\n# Run\n\nCPU: `docker compose up -d`\n\nNvidia: `docker compose -f compose.yml -f nvidia.yml up -d`\n\nCheck running: `docker compose ps`\n\nShow logs: `docker compose logs -f`\n\nRestart: `docker compose restart`\n\nNote: Run without `-d` for interactive mode.\n"
  },
  {
    "path": "scripts/docker/mmx-testnet/compose.yml",
    "content": "services:\n  node:\n    image: ghcr.io/madmax43v3r/mmx-node:edge\n    restart: unless-stopped\n    command: \"./run_node.sh --Harvester.plot_dirs /plots/\"\n    volumes:\n      - ~/.mmx_testnet:/data\n      #- /mnt/data1/mmx/OG:/plots/1\n      #- /mnt/data2/mmx/OG:/plots/2\n    ports:\n      - \"12343:12343\"  # Node p2p port. Forward your router to this port for peers to be able to connect\n      - \"127.0.0.1:11381:11380\"  # API port. Set host to 0.0.0.0 in /data/config/local/HttpServer.json for webUI/API access\n      #- \"11333:11333\"  # Harvester port. Uncomment to allow remote harvesters to connect to the farmer\n      #- \"11330:11330\"  # Farmer port. Uncomment to allow remote farmers to connect to the node\n    environment:\n      MMX_ALLOW_REMOTE: 'false'  # Set to true to allow connections from remote harvesters/farmers\n      MMX_FARMER_ENABLED: 'true'  # Set to false to disable local farmer\n      MMX_HARVESTER_ENABLED: 'true'  # Set to false to disable local harvester\n      MMX_NETWORK_OVERRIDE: 'testnet13'\n"
  },
  {
    "path": "scripts/docker/mmx-testnet/nvidia.yml",
    "content": "services:\n  node:\n    image: ghcr.io/madmax43v3r/mmx-node:edge-nvidia\n    runtime: nvidia"
  },
  {
    "path": "scripts/gen_coverage.sh",
    "content": "#!/bin/bash\n\nlcov --directory build/ --capture --output-file coverage.info\n\ngenhtml --demangle-cpp -o build/coverage coverage.info\n\n"
  },
  {
    "path": "scripts/gen_seed_peers.js",
    "content": "\nconst ref = [\"101.207.207.237\", \"104.157.124.160\", \"108.12.226.21\", \"109.206.144.194\", \"109.248.57.198\", \"109.63.193.28\", \"109.67.149.36\", \"112.193.2.141\", \"114.224.30.147\", \"123.112.214.2\", \"123.185.66.220\", \"125.229.48.110\", \"130.0.220.119\", \"135.131.174.76\", \"141.135.6.172\", \"145.255.12.28\", \"159.2.80.240\", \"162.198.119.188\", \"163.58.65.191\", \"176.106.160.193\", \"178.141.159.36\", \"178.205.93.141\", \"183.166.227.12\", \"184.155.122.12\", \"185.219.109.179\", \"188.134.88.65\", \"188.241.36.166\", \"192.168.1.170\", \"195.14.48.110\", \"195.239.203.162\", \"202.131.84.11\", \"203.118.131.219\", \"203.129.18.0\", \"205.250.162.213\", \"212.15.59.91\", \"220.133.2.109\", \"24.35.254.197\", \"36.62.117.220\", \"38.15.38.26\", \"46.65.247.3\", \"47.253.32.11\", \"47.34.208.57\", \"49.231.43.170\", \"5.12.248.227\", \"62.0.93.190\", \"64.254.187.156\", \"67.172.84.54\", \"68.5.105.231\", \"68.6.175.76\", \"69.127.154.48\", \"69.197.174.72\", \"71.166.51.14\", \"71.183.186.77\", \"71.227.39.0\", \"72.80.216.47\", \"73.196.143.58\", \"73.204.157.123\", \"73.205.40.161\", \"73.51.157.106\", \"75.100.41.233\", \"76.232.65.235\", \"76.76.229.88\", \"78.107.240.148\", \"78.82.157.212\", \"80.235.212.62\", \"84.215.10.74\", \"84.215.4.105\", \"84.215.8.184\", \"84.244.36.203\", \"84.52.158.183\", \"86.30.69.50\", \"87.152.18.128\", \"88.69.241.119\", \"89.45.186.200\", \"92.221.123.123\", \"92.234.41.184\", \"94.27.192.108\", \"94.61.16.125\", \"95.105.142.58\", \"95.22.80.4\", \"95.52.90.167\", \"104.157.124.160\", \"109.198.29.98\", \"109.206.144.194\", \"109.67.149.36\", \"119.6.178.16\", \"143.177.124.174\", \"162.118.7.169\", \"162.198.119.188\", \"176.106.160.193\", \"184.146.2.29\", \"184.71.194.234\", \"188.97.174.241\", \"202.131.84.11\", \"203.118.131.219\", \"217.198.130.81\", \"220.133.2.109\", \"222.77.7.0\", \"37.78.112.47\", \"42.3.123.47\", \"46.189.185.59\", \"47.253.32.11\", \"47.34.208.57\", \"66.231.154.77\", \"69.197.174.72\", \"70.19.84.129\", \"71.227.39.0\", \"72.69.130.232\", \"73.51.157.106\", \"75.100.41.233\", \"75.172.49.125\", \"76.128.231.98\", \"76.76.229.88\", \"78.107.240.148\", \"78.180.96.7\", \"79.104.211.73\", \"82.37.10.82\", \"84.215.10.38\", \"84.215.4.105\", \"86.103.60.87\", \"87.118.169.200\", \"89.116.184.19\", \"89.242.3.102\", \"92.55.57.183\", \"93.43.225.93\", \"94.19.237.176\", \"94.253.36.50\", \"95.105.142.58\", \"95.22.80.4\", \"95.31.212.141\", \"97.90.194.187\", \"mmx-th-2.mmx.network\"];\n\nconst list = [\"1.10.230.84\", \"104.157.124.160\", \"107.137.68.128\", \"108.12.226.21\", \"109.198.29.98\", \"110.164.184.5\", \"113.250.145.115\", \"113.53.52.229\", \"119.6.178.16\", \"135.131.174.76\", \"141.135.6.172\", \"143.177.124.174\", \"156.47.99.16\", \"162.118.7.169\", \"162.198.119.188\", \"163.58.65.191\", \"174.166.225.36\", \"176.77.44.137\", \"178.141.191.38\", \"178.34.121.69\", \"183.166.206.176\", \"184.146.2.29\", \"184.71.194.234\", \"188.97.167.199\", \"195.239.203.162\", \"203.129.18.0\", \"212.15.59.91\", \"217.168.252.30\", \"217.198.130.81\", \"42.3.123.47\", \"46.142.230.108\", \"46.142.230.236\", \"46.189.185.59\", \"47.253.32.11\", \"47.34.208.57\", \"49.231.43.170\", \"66.231.154.77\", \"69.197.174.72\", \"70.187.229.11\", \"70.19.84.129\", \"71.227.39.0\", \"73.225.44.243\", \"75.172.49.125\", \"76.128.231.98\", \"76.232.65.235\", \"78.107.240.148\", \"78.180.96.7\", \"79.104.211.73\", \"80.235.212.62\", \"82.37.10.82\", \"82.76.87.170\", \"84.215.4.105\", \"84.90.4.150\", \"86.103.60.176\", \"86.103.61.3\", \"86.30.69.50\", \"87.118.169.200\", \"89.242.3.102\", \"93.43.225.93\", \"94.19.237.176\", \"94.253.34.120\", \"94.27.155.9\", \"95.105.142.58\", \"95.22.80.4\", \"95.31.212.141\", \"mmx-th-1.mmx.network\", \"mmx-th-2.mmx.network\"];\n\nvar out = list.filter(peer => ref.includes(peer));\n\nout = out.filter(peer => !peer.includes(\"mmx.network\"));\n\nconst seed = [\"69.197.174.72\", \"49.231.43.170\", \"110.164.184.5\", \"89.116.184.19\"];\n\nfor(const peer of seed) {\n    if(!out.includes(peer)) {\n        out.push(peer);\n    }\n}\n\nconsole.log(JSON.stringify(out, null, 4));\n"
  },
  {
    "path": "scripts/genesis_setup.sh",
    "content": "#!/bin/bash\n\nset -e\n\nmkdir -p config/$1/chain/params\n\n./build/tools/mmx_compile -n $1 -f src/contract/swap.js -t -o data/$1/tx_swap_binary.dat > config/$1/chain/params/swap_binary\n./build/tools/mmx_compile -n $1 -f src/contract/offer.js -t -o data/$1/tx_offer_binary.dat > config/$1/chain/params/offer_binary\n./build/tools/mmx_compile -n $1 -f src/contract/token.js -t -o data/$1/tx_token_binary.dat > config/$1/chain/params/token_binary\n./build/tools/mmx_compile -n $1 -f src/contract/plot_nft.js -t -o data/$1/tx_plot_nft_binary.dat > config/$1/chain/params/plot_nft_binary\n./build/tools/mmx_compile -n $1 -f src/contract/nft.js -t -o data/$1/tx_nft_binary.dat > config/$1/chain/params/nft_binary\n./build/tools/mmx_compile -n $1 -f src/contract/template.js -t -o data/$1/tx_template_binary.dat > config/$1/chain/params/template_binary\n./build/tools/mmx_compile -n $1 -f src/contract/escrow.js -t -o data/$1/tx_escrow_binary.dat > config/$1/chain/params/escrow_binary\n./build/tools/mmx_compile -n $1 -f src/contract/time_lock.js -t -o data/$1/tx_time_lock_binary.dat > config/$1/chain/params/time_lock_binary\n./build/tools/mmx_compile -n $1 -f src/contract/relay.js -t -o data/$1/tx_relay_binary.dat > config/$1/chain/params/relay_binary\n\necho OK\n"
  },
  {
    "path": "scripts/kill_high_mem.sh",
    "content": "#!/bin/sh\n\nwhile true;\ndo\n    PID=$(pgrep $1)\n    if [ ! -e $PID ]; then\n\t    SIZE=$(ps -q $PID -o rss=)\n\t    SIZEMB=$((SIZE/1024))\n\t    if [ $SIZEMB -gt $2 ]; then\n\t        printf \"Maximum memory of $2 MB exceeded: $SIZEMB MB\\nTerminating process ...\"\n\t        kill $PID\n\t        exit 0\n\t    fi\n    fi\n    sleep 1\ndone\n"
  },
  {
    "path": "scripts/move_storage.sh",
    "content": "#!/bin/bash\n\nif [[ -z \"$1\" ]]; then\n\techo \"Usage: move_storage.sh destination_path/\"\n\texit\nfi\n\nif pgrep -x \"mmx_node\" > /dev/null\nthen\n    echo \"Please stop MMX node first.\"\n    exit\nfi\n\nset -e\nsource ./activate.sh\n\nCURR=\"${PWD}\"\nmkdir -p \"$1\"\ncd \"$1\"\nDST=\"${PWD}/\"\ncd \"${CURR}\"\n\necho \"SRC=${MMX_NETWORK}\"\necho \"DST=${DST}\"\n\necho \"Copying files ...\"\ncp -rv \"${MMX_NETWORK}\" \"${DST}\" || exit\n\necho \"${DST}\" > config/local/MMX_DATA\n\necho \"Deleting old files ...\"\nrm -r \"${MMX_NETWORK}\"\n\necho \"Done\"\n\n"
  },
  {
    "path": "scripts/reset_coverage.sh",
    "content": "#!/bin/bash\n\nfind build/ -name \"*.gcda\" -delete\n"
  },
  {
    "path": "scripts/show_log_stats.sh",
    "content": "#!/bin/bash\n\nexport LC_ALL=en_US.utf-8\n\ncat $1 | grep \"Verified VDF\" | grep -oP \"took [+-]?([0-9]*[.])?[0-9]+\" > vdf_verify\n\necho \"VDF Average =\" $(cat vdf_verify | awk '{ sum += $2 } END { print sum / NR }') sec\necho \"VDF Verify < 1 sec =\" $(cat vdf_verify | awk '{ if ($2 <= 1) sum += 1 } END { print 100 * sum / NR }') %\necho \"VDF Verify > 1 sec =\" $(cat vdf_verify | awk '{ if ($2 > 1) sum += 1 } END { print 100 * sum / NR }') %\necho \"VDF Verify > 2 sec =\" $(cat vdf_verify | awk '{ if ($2 > 2) sum += 1 } END { print 100 * sum / NR }') %\necho \"VDF Verify > 3 sec =\" $(cat vdf_verify | awk '{ if ($2 > 3) sum += 1 } END { print 100 * sum / NR }') %\necho \"VDF Verify > 5 sec =\" $(cat vdf_verify | awk '{ if ($2 > 5) sum += 1 } END { print 100 * sum / NR }') %\necho \"VDF Verify > 8 sec =\" $(cat vdf_verify | awk '{ if ($2 > 8) sum += 1 } END { print 100 * sum / NR }') %\n\ncat $1 | grep -v 16384 | grep -oP \"delay [+-]?([0-9]*[.])?[0-9]+\" > block_delay\n\necho \"Block Delay > 2 sec =\" $(cat block_delay | awk '{ if ($2 > 2) sum += 1 } END { print 100 * sum / NR }') %\necho \"Block Delay > 3 sec =\" $(cat block_delay | awk '{ if ($2 > 3) sum += 1 } END { print 100 * sum / NR }') %\necho \"Block Delay > 5 sec =\" $(cat block_delay | awk '{ if ($2 > 5) sum += 1 } END { print 100 * sum / NR }') %\necho \"Block Delay > 6 sec =\" $(cat block_delay | awk '{ if ($2 > 6) sum += 1 } END { print 100 * sum / NR }') %\necho \"Block Delay > 7 sec =\" $(cat block_delay | awk '{ if ($2 > 7) sum += 1 } END { print 100 * sum / NR }') %\necho \"Block Delay > 8 sec =\" $(cat block_delay | awk '{ if ($2 > 8) sum += 1 } END { print 100 * sum / NR }') %\n\ncat $1 | grep -oP \"height [0-9]+ with score [0-9]+, forked at [0-9]+\" > forked_at\n\necho \"Fork Depth 1  =\" $(cat forked_at | awk '{ if ($2 - $8 == 1) sum += 1 } END { print 100 * sum / NR }') %\necho \"Fork Depth 2  =\" $(cat forked_at | awk '{ if ($2 - $8 == 2) sum += 1 } END { print 100 * sum / NR }') %\necho \"Fork Depth 3  =\" $(cat forked_at | awk '{ if ($2 - $8 == 3) sum += 1 } END { print 100 * sum / NR }') %\necho \"Fork Depth 4  =\" $(cat forked_at | awk '{ if ($2 - $8 == 4) sum += 1 } END { print 100 * sum / NR }') %\necho \"Fork Depth 5  =\" $(cat forked_at | awk '{ if ($2 - $8 == 5) sum += 1 } END { print 100 * sum / NR }') %\necho \"Fork Depth 6  =\" $(cat forked_at | awk '{ if ($2 - $8 == 6) sum += 1 } END { print 100 * sum / NR }') %\necho \"Fork Depth 7  =\" $(cat forked_at | awk '{ if ($2 - $8 == 7) sum += 1 } END { print 100 * sum / NR }') %\necho \"Fork Depth 8  =\" $(cat forked_at | awk '{ if ($2 - $8 == 8) sum += 1 } END { print 100 * sum / NR }') %\necho \"Fork Depth >8 =\" $(cat forked_at | awk '{ if ($2 - $8 > 8) sum += 1 } END { print 100 * sum / NR }') % \"(contains false positives from restarting node)\"\n\nrm forked_at\nrm vdf_verify\nrm block_delay\n"
  },
  {
    "path": "scripts/stats/max_space_fork_len.sh",
    "content": "#!/bin/bash\n\nset -e\n\nMAX_FORK_LEN=0\nHEIGHT=$(mmx node get header | jq .height)\n\nfor((i = 0; i <= HEIGHT; i++)); do\n    FORK_LEN=$(mmx node get header $i | jq .space_fork_len)\n    if [ $FORK_LEN -gt $MAX_FORK_LEN ]; then\n        MAX_FORK_LEN=$FORK_LEN\n    fi\n    echo \"Block $i: $FORK_LEN\"\ndone\n\necho \"Max space fork length: $MAX_FORK_LEN\"\n"
  },
  {
    "path": "scripts/win/activate.cmd",
    "content": "@ECHO OFF\r\n\r\nSET \"MMX_ENV=%~dp0\"\r\nSET \"MMX_ENV=%MMX_ENV:~0,-1%\"\r\nSET \"PATH=%PATH%;%MMX_ENV%\"\r\n\r\nIF \"%MMX_HOME%\"==\"\" (\r\n\tSET \"MMX_HOME=%USERPROFILE%\\.mmx\"\r\n)\r\n\r\nSET \"MMX_HOME=%MMX_HOME%\\\"\r\n\r\nIF \"%MMX_DATA%\"==\"\" (\r\n\tSET \"MMX_DATA=%MMX_HOME%\"\r\n)\r\n\r\nSET \"NETWORK=mainnet\"\r\nSET \"MMX_NETWORK=%MMX_DATA%%NETWORK%\\\"\r\n\r\nECHO NETWORK=%NETWORK%\r\nECHO MMX_HOME=%MMX_HOME%\r\nIF NOT \"%MMX_DATA%\"==\"%MMX_HOME%\" (\r\n\tECHO MMX_DATA=%MMX_DATA%\r\n)\r\n\r\nMKDIR \"%MMX_HOME%config\\local\"\r\nROBOCOPY \"config\\local_init\\\\\" \"%MMX_HOME%config\\local\\\\\" /NFL /NDL /NJH /NJS /E /XC /XN /XO\r\n\r\nIF NOT EXIST \"%MMX_HOME%PASSWD\" (\r\n\tgenerate_passwd > \"%MMX_HOME%PASSWD\"\r\n\r\n\tSET /P PASSWD=<\"%MMX_HOME%PASSWD\"\r\n\tCALL ECHO PASSWD=%%PASSWD%%\r\n\r\n\tCALL vnxpasswd -c config\\default\\ \"%MMX_HOME%config\\local\\\\\" -u mmx-admin -p %%PASSWD%%\r\n)\r\n"
  },
  {
    "path": "scripts/win/mmx_cmd.cmd",
    "content": "@ECHO OFF\r\nCALL .\\activate.cmd\r\n\r\nsetlocal\r\nset PROMPT=[MMX] $P$G\r\nstart \"MMX Environment\" cmd.exe /K \"mmx_help.cmd\"\r\n\r\n:EXIT\r\nendlocal"
  },
  {
    "path": "scripts/win/mmx_help.cmd",
    "content": "@ECHO OFF\r\nECHO mmx wallet create [-f filename]\r\nECHO TODO small help"
  },
  {
    "path": "scripts/win/run_farmer.cmd",
    "content": "@ECHO OFF\r\nTITLE MMX Farmer Run Script\r\n\r\nCALL .\\activate.cmd\r\n\r\nmmx_farmer -c config\\%NETWORK%\\ config\\farmer\\ \"%MMX_HOME%config\\local\\\\\" %*"
  },
  {
    "path": "scripts/win/run_harvester.cmd",
    "content": "@ECHO OFF\r\nTITLE MMX Harvester Run Script\r\n\r\nCALL .\\activate.cmd\r\n\r\nmmx_harvester -c config\\%NETWORK%\\ config\\farmer\\ \"%MMX_HOME%config\\local\\\\\" %*"
  },
  {
    "path": "scripts/win/run_node.cmd",
    "content": "@ECHO OFF\r\nTITLE MMX Node Run Script\r\n\r\nCALL .\\activate.cmd\r\n\r\nmmx_node -c config\\%NETWORK%\\ config\\node\\ \"%MMX_HOME%config\\local\\\\\" %*\r\n\r\nIF \"%~1\"==\"--PauseOnExit\" PAUSE"
  },
  {
    "path": "scripts/win/run_timelord.cmd",
    "content": "@ECHO OFF\r\nTITLE MMX Timelord Run Script\r\n\r\nCALL activate.cmd\r\n\r\nmmx_timelord -c config\\%NETWORK%\\ config\\timelord\\ \"%MMX_HOME%config\\local\\\\\" %*"
  },
  {
    "path": "scripts/win/run_wallet.cmd",
    "content": "@ECHO OFF\r\nTITLE MMX Wallet Run Script\r\n\r\nCALL .\\activate.cmd\r\n\r\nmmx_wallet -c config\\%NETWORK%\\ config\\wallet\\ \"%MMX_HOME%config\\local\\\\\" %*"
  },
  {
    "path": "src/Block.cpp",
    "content": "/*\n * Block.cpp\n *\n *  Created on: Nov 27, 2021\n *      Author: mad\n */\n\n#include <mmx/Block.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/Transaction.hxx>\n#include <mmx/txio_entry_t.hpp>\n#include <mmx/utils.h>\n#include <mmx/tree_hash.h>\n\n\nnamespace mmx {\n\nvnx::bool_t Block::is_valid() const\n{\n\tuint64_t static_cost_sum = 0;\n\tuint64_t total_cost_sum = 0;\n\tuint64_t tx_fees_sum = 0;\n\tfor(const auto& tx : tx_list) {\n\t\tif(!tx || tx->content_hash != tx->calc_hash(true)) {\n\t\t\treturn false;\n\t\t}\n\t\tif(const auto& res = tx->exec_result) {\n\t\t\ttotal_cost_sum += res->total_cost;\n\t\t\ttx_fees_sum += res->total_fee;\n\t\t} else if(height) {\n\t\t\treturn false;\n\t\t}\n\t\tstatic_cost_sum += tx->static_cost;\n\t}\n\treturn BlockHeader::is_valid()\n\t\t\t&& static_cost == static_cost_sum\n\t\t\t&& total_cost == total_cost_sum\n\t\t\t&& tx_fees == tx_fees_sum\n\t\t\t&& tx_count == tx_list.size()\n\t\t\t&& tx_hash == calc_tx_hash();\n}\n\nhash_t Block::calc_tx_hash() const\n{\n\tstd::vector<hash_t> tmp;\n\tfor(const auto& tx : tx_list) {\n\t\ttmp.push_back(tx->content_hash);\n\t}\n\treturn calc_btree_hash(tmp);\n}\n\nvoid Block::finalize()\n{\n\tstatic_cost = 0;\n\ttotal_cost = 0;\n\ttx_fees = 0;\n\tfor(const auto& tx : tx_list) {\n\t\tif(const auto& res = tx->exec_result) {\n\t\t\ttotal_cost += res->total_cost;\n\t\t\ttx_fees += res->total_fee;\n\t\t}\n\t\tstatic_cost += tx->static_cost;\n\t}\n\ttx_count = tx_list.size();\n\ttx_hash = calc_tx_hash();\n\thash = calc_hash();\n}\n\nstd::shared_ptr<const BlockHeader> Block::get_header() const\n{\n\tauto header = BlockHeader::create();\n\theader->operator=(*this);\n\treturn header;\n}\n\nstd::vector<std::shared_ptr<const Transaction>> Block::get_transactions() const {\n\treturn tx_list;\n}\n\nstd::vector<txio_entry_t> Block::get_inputs(std::shared_ptr<const ChainParams> params) const\n{\n\tstd::vector<txio_entry_t> res;\n\tfor(const auto& tx : tx_list) {\n\t\tif(tx->exec_result && tx->sender) {\n\t\t\ttxio_t in;\n\t\t\tin.address = *tx->sender;\n\t\t\tin.amount = tx->exec_result->total_fee;\n\t\t\tres.push_back(txio_entry_t::create_ex(tx->id, height, time_stamp, tx_type_e::TXFEE, in));\n\t\t}\n\t\tif(!tx->exec_result || !tx->exec_result->did_fail) {\n\t\t\tfor(const auto& in : tx->get_inputs()) {\n\t\t\t\tres.push_back(txio_entry_t::create_ex(tx->id, height, time_stamp, tx_type_e::SPEND, in));\n\t\t\t}\n\t\t}\n\t}\n\treturn res;\n}\n\nstd::vector<txio_entry_t> Block::get_outputs(std::shared_ptr<const ChainParams> params) const\n{\n\tstd::vector<txio_entry_t> res;\n\n\tif(vdf_reward_payout) {\n\t\ttxio_t out;\n\t\tout.address = *vdf_reward_payout;\n\t\tout.amount = params->vdf_reward;\n\t\tres.push_back(txio_entry_t::create_ex(hash, height, time_stamp, tx_type_e::VDF_REWARD, out));\n\t}\n\tif(reward_addr && reward_amount) {\n\t\ttxio_t out;\n\t\tout.address = *reward_addr;\n\t\tout.amount = reward_amount;\n\t\tres.push_back(txio_entry_t::create_ex(hash, height, time_stamp, tx_type_e::REWARD, out));\n\t}\n\t{\n\t\ttxio_t out;\n\t\tout.address = project_addr;\n\t\tout.amount = calc_project_reward(params, tx_fees);\n\t\tif(out.amount) {\n\t\t\tres.push_back(txio_entry_t::create_ex(hash, height, time_stamp, tx_type_e::PROJECT_REWARD, out));\n\t\t}\n\t}\n\tfor(const auto& tx : tx_list) {\n\t\tif(!tx->exec_result || !tx->exec_result->did_fail) {\n\t\t\tfor(const auto& out : tx->get_outputs()) {\n\t\t\t\tres.push_back(txio_entry_t::create_ex(tx->id, height, time_stamp, tx_type_e::RECEIVE, out));\n\t\t\t}\n\t\t}\n\t}\n\treturn res;\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/BlockHeader.cpp",
    "content": "/*\n * BlockHeader.cpp\n *\n *  Created on: Nov 30, 2021\n *      Author: mad\n */\n\n#include <mmx/BlockHeader.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\n\nvnx::bool_t BlockHeader::is_valid() const\n{\n\tif(height) {\n\t\tif(proof.empty() || !farmer_sig || vdf_count < 1) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tfor(auto p : proof) {\n\t\tif(!p || !p->is_valid()) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn version == 0\n\t\t\t&& (!reward_amount || reward_addr)\n\t\t\t&& vdf_count == vdf_reward_addr.size()\n\t\t\t&& hash == calc_hash()\n\t\t\t&& content_hash == calc_content_hash();\n}\n\nhash_t BlockHeader::calc_hash() const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\tbuffer.reserve(64 * 1024);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", \t\tversion);\n\twrite_field(out, \"support_flags\", \tsupport_flags);\n\twrite_field(out, \"prev\",\t\t\tprev);\n\twrite_field(out, \"height\", \t\t\theight);\n\twrite_field(out, \"vdf_height\", \t\tvdf_height);\n\twrite_field(out, \"nonce\", \t\t\tnonce);\n\twrite_field(out, \"time_stamp\", \t\ttime_stamp);\n\twrite_field(out, \"time_diff\", \t\ttime_diff);\n\twrite_field(out, \"space_diff\", \t\tspace_diff);\n\twrite_field(out, \"weight\", \t\t\tweight);\n\twrite_field(out, \"total_weight\",\ttotal_weight);\n\twrite_field(out, \"vdf_count\", \t\tvdf_count);\n\twrite_field(out, \"vdf_iters\", \t\tvdf_iters);\n\twrite_field(out, \"vdf_output\", \t\tvdf_output);\n\twrite_field(out, \"vdf_reward_addr\", vdf_reward_addr);\n\twrite_field(out, \"vdf_reward_payout\", vdf_reward_payout);\n\t{\n\t\tstd::vector<hash_t> list;\n\t\tfor(auto p : proof) {\n\t\t\tlist.push_back(p->calc_hash());\n\t\t}\n\t\twrite_field(out, \"proof\", \t\tlist);\n\t}\n\twrite_field(out, \"proof_hash\", \t\tproof_hash);\n\twrite_field(out, \"challenge\", \t\tchallenge);\n\twrite_field(out, \"is_space_fork\",\tis_space_fork);\n\twrite_field(out, \"space_fork_len\",\tspace_fork_len);\n\twrite_field(out, \"space_fork_proofs\", space_fork_proofs);\n\twrite_field(out, \"reward_amount\", \treward_amount);\n\twrite_field(out, \"reward_addr\", \treward_addr);\n\twrite_field(out, \"reward_contract\", reward_contract);\n\twrite_field(out, \"reward_account\", \treward_account);\n\twrite_field(out, \"reward_vote\", \treward_vote);\n\twrite_field(out, \"reward_vote_sum\", reward_vote_sum);\n\twrite_field(out, \"reward_vote_count\", reward_vote_count);\n\twrite_field(out, \"base_reward\", \tbase_reward);\n\twrite_field(out, \"project_addr\", \tproject_addr);\n\twrite_field(out, \"static_cost\", \tstatic_cost);\n\twrite_field(out, \"total_cost\", \t\ttotal_cost);\n\twrite_field(out, \"tx_count\", \t\ttx_count);\n\twrite_field(out, \"tx_fees\", \t\ttx_fees);\n\twrite_field(out, \"txfee_buffer\", \ttxfee_buffer);\n\twrite_field(out, \"tx_hash\", \t\ttx_hash);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nhash_t BlockHeader::calc_content_hash() const\n{\n\tif(farmer_sig) {\n\t\treturn hash_t(hash + (*farmer_sig));\n\t}\n\treturn hash_t(hash.bytes);\n}\n\nvoid BlockHeader::validate() const\n{\n\tif(!farmer_sig) {\n\t\tthrow std::logic_error(\"missing farmer signature\");\n\t}\n\tif(!farmer_sig->verify(get_farmer_key(), hash)) {\n\t\tthrow std::logic_error(\"invalid farmer signature\");\n\t}\n}\n\nstd::shared_ptr<const BlockHeader> BlockHeader::get_header() const\n{\n\treturn vnx::clone(*this);\n}\n\npubkey_t BlockHeader::get_farmer_key() const\n{\n\tif(proof.empty()) {\n\t\tthrow std::logic_error(\"block has no proof\");\n\t}\n\treturn proof[0]->farmer_key;\n}\n\nblock_index_t BlockHeader::get_block_index(const int64_t& file_offset) const\n{\n\tblock_index_t index;\n\tindex.hash = hash;\n\tindex.content_hash = content_hash;\n\tindex.static_cost = static_cost;\n\tindex.total_cost = total_cost;\n\tindex.file_offset = file_offset;\n\treturn index;\n}\n\nvoid BlockHeader::set_space_diff(std::shared_ptr<const ChainParams> params, std::shared_ptr<const BlockHeader> prev)\n{\n\tconst auto proof_count = proof.size();\n\n\tif(is_space_fork) {\n\t\tspace_diff = calc_new_space_diff(params, prev);\n\t\tspace_fork_len = vdf_count;\n\t\tspace_fork_proofs = proof_count;\n\t} else {\n\t\tspace_diff = prev->space_diff;\n\t\tspace_fork_len = prev->space_fork_len + vdf_count;\n\t\tspace_fork_proofs = prev->space_fork_proofs + proof_count;\n\t}\n}\n\nvoid BlockHeader::set_base_reward(std::shared_ptr<const ChainParams> params, std::shared_ptr<const BlockHeader> prev)\n{\n\tif(height % params->reward_adjust_interval == 0) {\n\t\tbase_reward = calc_new_base_reward(params, prev);\n\t\treward_vote_sum = reward_vote;\n\t\treward_vote_count = (reward_vote ? 1 : 0);\n\t} else {\n\t\tbase_reward = prev->base_reward;\n\t\treward_vote_sum = prev->reward_vote_sum + reward_vote;\n\t\treward_vote_count = prev->reward_vote_count + (reward_vote ? 1 : 0);\n\t}\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/ChainParams.cpp",
    "content": "/*\n * ChainParams.cpp\n *\n *  Created on: Sep 28, 2024\n *      Author: mad\n */\n\n#include <mmx/ChainParams.hxx>\n\n\nnamespace mmx {\n\nvnx::float64_t ChainParams::get_block_time() const\n{\n\treturn block_interval_ms * 1e-3;\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Contract.cpp",
    "content": "/*\n * Contract.cpp\n *\n *  Created on: Nov 27, 2021\n *      Author: mad\n */\n\n#include <mmx/Contract.hxx>\n#include <mmx/write_bytes.h>\n\n\nnamespace mmx {\n\nvnx::bool_t Contract::is_valid() const\n{\n\treturn version == 0;\n}\n\nhash_t Contract::calc_hash(const vnx::bool_t& full_hash) const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\nuint64_t Contract::num_bytes() const\n{\n\treturn 16;\n}\n\nuint64_t Contract::calc_cost(std::shared_ptr<const ChainParams> params) const\n{\n\treturn num_bytes() * params->min_txfee_byte;\n}\n\nvnx::optional<addr_t> Contract::get_owner() const\n{\n\treturn nullptr;\n}\n\nvoid Contract::validate(std::shared_ptr<const Solution> solution, const hash_t& txid) const\n{\n\tthrow std::logic_error(\"invalid operation\");\n}\n\nvnx::Variant Contract::read_field(const std::string& name) const\n{\n\tif(name == \"__type\") {\n\t\treturn vnx::Variant(get_type_name());\n\t}\n\treturn get_field(name);\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/DataBase.cpp",
    "content": "/*\n * DataBase.cpp\n *\n *  Created on: Jun 7, 2022\n *      Author: mad\n */\n\n#include <mmx/DataBase.h>\n#include <mmx/utils.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\ntemplate<typename T>\nstd::string to_number(const T& value, const size_t n_zero)\n{\n\tconst auto tmp = std::to_string(value);\n\treturn std::string(n_zero - std::min(n_zero, tmp.length()), '0') + tmp;\n}\n\nuint32_t calc_checksum_32(uint32_t version, std::shared_ptr<db_val_t> key, std::shared_ptr<db_val_t> value)\n{\n\tvnx::CRC64 crc;\n\tcrc.update(version);\n\tcrc.update((const char*)key->data, key->size);\n\tcrc.update((const char*)value->data, value->size);\n\treturn uint32_t(crc.get());\n}\n\nvoid read_key(vnx::TypeInput& in, uint32_t& version, std::shared_ptr<db_val_t>& key)\n{\n\tvnx::read(in, version);\n\n\tuint32_t size = 0;\n\tvnx::read(in, size);\n\tkey = std::make_shared<db_val_t>(size);\n\tin.read(key->data, key->size);\n}\n\nvoid read_key_at(const vnx::File& file, const int64_t offset, uint32_t& version, std::shared_ptr<db_val_t>& key)\n{\n\tvnx::FileSectionInputStream stream(file.get_handle(), offset, -1, 256);\n\tvnx::TypeInput in(&stream);\n\tread_key(in, version, key);\n}\n\nvoid read_value(vnx::TypeInput& in, std::shared_ptr<db_val_t>& value)\n{\n\tuint32_t size = 0;\n\tvnx::read(in, size);\n\tvalue = std::make_shared<db_val_t>(size);\n\tin.read(value->data, value->size);\n}\n\nvoid read_value_at(const vnx::File& file, const int64_t offset, std::shared_ptr<db_val_t> key, std::shared_ptr<db_val_t>& value)\n{\n\tvnx::FileSectionInputStream stream(file.get_handle(), offset + 8 + key->size, -1, 1024);\n\tvnx::TypeInput in(&stream);\n\tread_value(in, value);\n}\n\nvoid read_entry(vnx::TypeInput& in, uint32_t& version, std::shared_ptr<db_val_t>& key, std::shared_ptr<db_val_t>& value)\n{\n\tread_key(in, version, key);\n\tread_value(in, value);\n}\n\nvoid read_entry_sum(vnx::TypeInput& in, uint32_t& version, std::shared_ptr<db_val_t>& key, std::shared_ptr<db_val_t>& value)\n{\n\tread_entry(in, version, key, value);\n\n\tuint32_t sum = 0;\n\tvnx::read(in, sum);\n\tif(sum != calc_checksum_32(version, key, value)) {\n\t\tthrow std::runtime_error(\"read_entry(): checksum fail (version = \" + std::to_string(version)\n\t\t\t\t+ \", key = \" + std::to_string(key->size) + \", value = \" + std::to_string(value->size) + \")\");\n\t}\n}\n\nvoid read_entry_at(const vnx::File& file, const int64_t offset, uint32_t& version, std::shared_ptr<db_val_t>& key, std::shared_ptr<db_val_t>& value)\n{\n\tvnx::FileSectionInputStream stream(file.get_handle(), offset, -1, 1024);\n\tvnx::TypeInput in(&stream);\n\tread_key(in, version, key);\n\tread_value(in, value);\n}\n\nvoid write_entry(vnx::TypeOutput& out, uint32_t version, std::shared_ptr<db_val_t> key, std::shared_ptr<db_val_t> value)\n{\n\tvnx::write(out, version);\n\tvnx::write(out, key->size);\n\tout.write(key->data, key->size);\n\tvnx::write(out, value->size);\n\tout.write(value->data, value->size);\n}\n\nvoid write_entry_sum(vnx::TypeOutput& out, uint32_t version, std::shared_ptr<db_val_t> key, std::shared_ptr<db_val_t> value)\n{\n\twrite_entry(out, version, key, value);\n\tvnx::write(out, calc_checksum_32(version, key, value));\n}\n\nconst std::function<int(const db_val_t&, const db_val_t&)> Table::default_comparator =\n\t[](const db_val_t& lhs, const db_val_t& rhs) -> int {\n\t\tif(lhs.size == rhs.size) {\n\t\t\treturn ::memcmp(lhs.data, rhs.data, lhs.size);\n\t\t}\n\t\treturn lhs.size < rhs.size ? -1 : 1;\n\t};\n\nconst Table::options_t Table::default_options;\n\nTable::Table(const std::string& root_path, const options_t& options)\n\t:\toptions(options), root_path(root_path), mem_index(key_compare_t(this)), mem_block(mem_compare_t(this))\n{\n\tconst auto time_begin = get_time_ms();\n\tvnx::Directory root(root_path);\n\troot.create();\n\n\tdebug_log.open(root_path + \"/debug.log\", std::ios_base::app);\n\n\tstd::map<uint64_t, std::string> block_map;\n\tfor(const auto& file : root.files()) {\n\t\tif(file->get_extension() == \".tmp\") {\n\t\t\tconst auto name = file->get_name(false);\n\t\t\tconst vnx::File new_file(root_path + '/' + name);\n\t\t\tif(!new_file.exists() && new_file.get_extension() == \".dat\") {\n\t\t\t\tdebug_log << \"Renamed \" << name << \".tmp to \" << name << std::endl;\n\t\t\t\tfile->rename(new_file.get_path());\n\t\t\t}\n\t\t}\n\t\tif(file->get_extension() == \".dat\") {\n\t\t\tvnx::Variant name;\n\t\t\tvnx::from_string_value(file->get_name(false), name);\n\t\t\tif(name.is_ulong()) {\n\t\t\t\tconst auto index = name.to<uint64_t>();\n\t\t\t\tblock_map[index] = file->get_name();\n\t\t\t\tnext_block_id = std::max(next_block_id, index + 1);\n\t\t\t}\n\t\t}\n\t}\n\t{\n\t\tstd::vector<std::shared_ptr<block_t>> block_list;\n\t\tfor(const auto& entry : block_map) {\n\t\t\tconst auto block = read_block(entry.second);\n\t\t\tblock_list.push_back(block);\n\t\t\tdebug_log << \"Loaded \" << block->name << \" at level \" << block->level << \" with \" << block->index.size() << \" / \" << block->total_count\n\t\t\t\t\t<< \" entries, min_version = \" << block->min_version << \", max_version = \" << block->max_version << std::endl;\n\t\t}\n\t\tstd::sort(block_list.begin(), block_list.end(),\n\t\t\t[](const std::shared_ptr<block_t>& lhs, const std::shared_ptr<block_t>& rhs) -> bool {\n\t\t\t\tif(lhs->min_version == rhs->min_version) {\n\t\t\t\t\treturn lhs->level > rhs->level;\n\t\t\t\t}\n\t\t\t\treturn lhs->min_version < rhs->min_version;\n\t\t\t});\n\n\t\tstd::shared_ptr<block_t> prev;\n\t\tfor(const auto& block : block_list) {\n\t\t\tif(!prev || block->min_version > prev->max_version) {\n\t\t\t\tcurr_version = block->max_version + 1;\n\t\t\t\tblocks.push_back(block);\n\t\t\t} else {\n\t\t\t\tblock->file.remove();\n\t\t\t\tdebug_log << \"Deleted \" << block->name << std::endl;\n\t\t\t}\n\t\t\tprev = block;\n\t\t}\n\t}\n\tlast_flush = curr_version;\n\n\twrite_log.open(root_path + \"/write_log.dat\", \"ab\");\n\twrite_log.open(\"rb+\");\n\twrite_log.lock_exclusive();\n\t{\n\t\tauto& in = write_log.in;\n\t\tauto offset = in.get_input_pos();\n\t\tbool first_commit = true;\n\t\tconst auto min_version = curr_version;\n\t\tstd::multimap<uint32_t, std::pair<std::shared_ptr<db_val_t>, std::shared_ptr<db_val_t>>> entries;\n\t\twhile(true) {\n\t\t\ttry {\n\t\t\t\tuint32_t version;\n\t\t\t\tstd::shared_ptr<db_val_t> key;\n\t\t\t\tstd::shared_ptr<db_val_t> value;\n\t\t\t\tread_entry_sum(write_log.in, version, key, value);\n\t\t\t\tif(version == uint32_t(-1)) {\n\t\t\t\t\tconst auto cmd = key->to_string();\n\t\t\t\t\tif(cmd == \"commit\" || cmd == \"reset\") {\n\t\t\t\t\t\tcurr_version = value->to<uint32_t>();\n\t\t\t\t\t\tif(first_commit) {\n\t\t\t\t\t\t\tlast_flush = curr_version;\n\t\t\t\t\t\t\tfirst_commit = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(cmd == \"revert\") {\n\t\t\t\t\t\tconst auto height = value->to<uint32_t>();\n\t\t\t\t\t\tcurr_version = height;\n\t\t\t\t\t\tentries.erase(entries.lower_bound(height), entries.end());\n\t\t\t\t\t}\n\t\t\t\t} else if(version >= min_version) {\n\t\t\t\t\tentries.emplace(version, std::make_pair(key, value));\n\t\t\t\t}\n\t\t\t\toffset = in.get_input_pos();\n\t\t\t}\n\t\t\tcatch(const std::underflow_error& ex) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcatch(const std::exception& ex) {\n\t\t\t\tdebug_log << \"Reading from write_log.dat failed with: \" << ex.what() << std::endl;\n\t\t\t}\n\t\t}\n\t\twrite_log.seek_to(offset);\n\n\t\tfor(const auto& entry : entries) {\n\t\t\tinsert_entry(entry.first, entry.second.first, entry.second.second);\n\t\t}\n\t\tdebug_log << \"Loaded \" << mem_index.size() << \" / \" << mem_block.size() << \" entries from write_log.dat\" << std::endl;\n\t}\n\tdebug_log << \"Loaded table at version \" << curr_version << \", took \" << (get_time_ms() - time_begin) / 1e3 << \" sec\" << std::endl;\n\n\trevert(curr_version);\n\n\tcheck_rewrite();\n}\n\nstd::shared_ptr<Table::block_t> Table::read_block(const std::string& name) const\n{\n\t// TODO: handle unexpected read errors here\n\tauto block = std::make_shared<block_t>();\n\tblock->name = name;\n\tblock->file.open(root_path + '/' + name, \"rb\");\n\tblock->file.lock_exclusive();\n\n\tauto& in = block->file.in;\n\tuint16_t format = 0;\n\tvnx::read(in, format);\n\tif(format > 0) {\n\t\tthrow std::runtime_error(\"invalid block format: \" + std::to_string(format));\n\t}\n\tvnx::read(in, block->level);\n\tvnx::read(in, block->min_version);\n\tvnx::read(in, block->max_version);\n\tvnx::read(in, block->total_count);\n\tvnx::read(in, block->index_offset);\n\n\tblock->file.seek_to(block->index_offset);\n\tuint64_t index_size = 0;\n\tvnx::read(in, index_size);\n\tblock->index.resize(index_size);\n\tin.read(block->index.data(), block->index.size() * 8);\n\treturn block;\n}\n\nvoid Table::insert(std::shared_ptr<db_val_t> key, std::shared_ptr<db_val_t> value)\n{\n\tif(!key || !value) {\n\t\tthrow std::logic_error(\"!key || !value\");\n\t}\n\tstd::lock_guard lock(mutex);\n\tif(write_lock) {\n\t\tthrow std::logic_error(\"table is write locked\");\n\t}\n\twrite_entry_sum(write_log.out, curr_version, key, value);\n\tinsert_entry(curr_version, key, value);\n}\n\nvoid Table::insert_entry(uint32_t version, std::shared_ptr<db_val_t> key, std::shared_ptr<db_val_t> value)\n{\n\tauto& entry = mem_block[std::make_pair(key, version)];\n\tif(entry) {\n\t\tmem_block_size -= key->size + entry->size;\n\t}\n\tentry = value;\n\tmem_index[key] = std::make_pair(value, version);\n\tmem_block_size += key->size + value->size;\n}\n\nstd::shared_ptr<db_val_t> Table::find(std::shared_ptr<db_val_t> key, const uint32_t max_version) const\n{\n\tif(!key) {\n\t\treturn nullptr;\n\t}\n\t{\n\t\tauto iter = mem_index.find(key);\n\t\tif(iter != mem_index.end()) {\n\t\t\tif(iter->second.second <= max_version) {\n\t\t\t\treturn iter->second.first;\n\t\t\t} else {\n\t\t\t\tauto iter = mem_block.lower_bound(std::make_pair(key, max_version));\n\t\t\t\twhile(iter != mem_block.end() && *iter->first.first == *key) {\n\t\t\t\t\tif(iter->first.second <= max_version) {\n\t\t\t\t\t\treturn iter->second;\n\t\t\t\t\t} else if(iter != mem_block.begin()) {\n\t\t\t\t\t\titer--;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tfor(auto iter = blocks.rbegin(); iter != blocks.rend(); ++iter) {\n\t\tconst auto& block = *iter;\n\t\tif(block->min_version <= max_version) {\n\t\t\tif(auto value = find(block, key, max_version)) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t}\n\treturn nullptr;\n}\n\nstd::shared_ptr<db_val_t> Table::find(std::shared_ptr<const block_t> block, std::shared_ptr<db_val_t> key, const uint32_t max_version) const\n{\n\tauto res = key;\n\tbool is_match = false;\n\tuint32_t version = -1;\n\tconst auto pos = lower_bound(block, version, res, is_match);\n\n\tstd::shared_ptr<db_val_t> value;\n\tif(is_match) {\n\t\tconst auto offset = block->index[pos] + 8 + key->size;\n\t\tif(offset > block->index_offset) {\n\t\t\tthrow std::logic_error(\"offset > index_offset\");\n\t\t}\n\t\tvnx::FileSectionInputStream stream(block->file.get_handle(), offset, block->index_offset - offset, 1024);\n\t\tvnx::TypeInput in(&stream);\n\t\tread_value(in, value);\n\n\t\twhile(version > max_version) {\n\t\t\ttry {\n\t\t\t\tstd::shared_ptr<db_val_t> key_;\n\t\t\t\tread_entry(in, version, key_, value);\n\t\t\t\tif(*key_ != *key) {\n\t\t\t\t\tvalue = nullptr;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} catch(const std::underflow_error& ex) {\n\t\t\t\tvalue = nullptr;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n}\n\nsize_t Table::lower_bound(std::shared_ptr<const block_t> block, uint32_t& version, std::shared_ptr<db_val_t>& key, bool& is_match) const\n{\n\tif(!key) {\n\t\tthrow std::logic_error(\"!key\");\n\t}\n\tconst auto end = block->index.size();\n\t// find match or successor\n\tsize_t L = 0;\n\tsize_t R = end;\n\twhile(L < R) {\n\t\tconst auto pos = (L + R) / 2;\n\t\tuint32_t version;\n\t\tstd::shared_ptr<db_val_t> key_i;\n\t\tread_key_at(block->file, block->index[pos], version, key_i);\n\t\tif(options.comparator(*key, *key_i) < 0) {\n\t\t\tR = pos;\n\t\t} else {\n\t\t\tL = pos + 1;\n\t\t}\n\t}\n\tif(R > 0) {\n\t\tstd::shared_ptr<db_val_t> key_i;\n\t\tread_key_at(block->file, block->index[R - 1], version, key_i);\n\t\tif(*key == *key_i) {\n\t\t\tis_match = true;\n\t\t\treturn R - 1;\n\t\t}\n\t}\n\tif(R < end) {\n\t\tread_key_at(block->file, block->index[R], version, key);\n\t} else {\n\t\tversion = -1;\n\t\tkey = nullptr;\n\t}\n\tis_match = false;\n\treturn R;\n}\n\nbool Table::commit(const uint32_t new_version, const bool auto_flush)\n{\n\tif(new_version == uint32_t(-1)) {\n\t\tthrow std::logic_error(\"invalid version\");\n\t}\n\tif(new_version <= curr_version) {\n\t\tthrow std::logic_error(\"commit(): new version <= current version\");\n\t}\n\t{\n\t\tconst std::string cmd = \"commit\";\n\t\twrite_entry_sum(write_log.out, -1,\n\t\t\t\tstd::make_shared<db_val_t>(cmd.c_str(), cmd.size()),\n\t\t\t\tstd::make_shared<db_val_t>(&new_version, sizeof(new_version)));\n\t}\n\twrite_log.flush();\n\n\tcurr_version = new_version;\n\n\tconst bool flag = do_flush();\n\tif(flag && auto_flush) {\n\t\tflush();\n\t\treturn false;\n\t}\n\treturn flag;\n}\n\nbool Table::do_flush() const\n{\n\tconst bool normal_flush = (mem_block_size + mem_block.size() * entry_overhead >= options.max_block_size);\n\tconst bool force_flush = (curr_version > last_flush && curr_version - last_flush >= options.force_flush_threshold);\n\treturn normal_flush || force_flush;\n}\n\nvoid Table::revert(const uint32_t new_version)\n{\n\tstd::lock_guard lock(mutex);\n\tif(write_lock) {\n\t\tthrow std::logic_error(\"table is write locked\");\n\t}\n\tif(new_version > curr_version) {\n\t\tthrow std::logic_error(\"revert(): new version > current version\");\n\t}\n\t{\n\t\tconst std::string cmd = \"revert\";\n\t\twrite_entry_sum(write_log.out, -1,\n\t\t\t\tstd::make_shared<db_val_t>(cmd.c_str(), cmd.size()),\n\t\t\t\tstd::make_shared<db_val_t>(&new_version, sizeof(new_version)));\n\t}\n\twrite_log.flush();\n\n\tstd::set<std::string> deleted_blocks;\n\tfor(auto iter = blocks.begin(); iter != blocks.end();) {\n\t\tauto& block = *iter;\n\t\tif(block->min_version >= new_version) {\n\t\t\tblock->file.remove();\n\t\t\tdebug_log << \"Deleted \" << block->name << std::endl;\n\t\t\titer = blocks.erase(iter);\n\t\t\tcontinue;\n\t\t}\n\t\tif(block->max_version >= new_version) {\n\t\t\tconst auto time_begin = get_time_ms();\n\n\t\t\tauto new_block = create_block(block->level, block->name + \".tmp\");\n\t\t\tnew_block->min_version = block->min_version;\n\n\t\t\tauto& src = block->file;\n\t\t\tauto& dst = new_block->file;\n\t\t\tauto& in = src.in;\n\t\t\tauto& out = dst.out;\n\t\t\tsrc.seek_to(block_header_size);\n\t\t\tdst.seek_to(block_header_size);\n\n\t\t\tstd::shared_ptr<db_val_t> prev;\n\t\t\tfor(uint64_t i = 0; i < block->total_count; ++i) {\n\t\t\t\tuint32_t version;\n\t\t\t\tstd::shared_ptr<db_val_t> key;\n\t\t\t\tstd::shared_ptr<db_val_t> value;\n\t\t\t\tread_entry(in, version, key, value);\n\t\t\t\tif(version < new_version) {\n\t\t\t\t\tif(!prev || *key != *prev) {\n\t\t\t\t\t\tnew_block->index.push_back(out.get_output_pos());\n\t\t\t\t\t}\n\t\t\t\t\tnew_block->max_version = std::max(version, new_block->max_version);\n\t\t\t\t\tnew_block->total_count++;\n\t\t\t\t\twrite_entry(out, version, key, value);\n\t\t\t\t\tprev = key;\n\t\t\t\t}\n\t\t\t}\n\t\t\tnew_block->index_offset = out.get_output_pos();\n\n\t\t\tfinish_block(new_block);\n\t\t\tblock->file.close();\n\t\t\trename(new_block, block->name);\n\n\t\t\tdebug_log << \"Rewrote \" << block->name << \" with max_version = \" << new_block->max_version\n\t\t\t\t\t<< \", \" << new_block->index.size() << \" / \" << new_block->total_count << \" entries\"\n\t\t\t\t\t<< \", from \" << block->index.size() << \" / \" << block->total_count << \" entries\"\n\t\t\t\t\t<< \", took \" << (get_time_ms() - time_begin) / 1e3 << \" sec\" << std::endl;\n\t\t\tblock = new_block;\n\t\t}\n\t\titer++;\n\t}\n\n\tfor(auto iter = mem_block.begin(); iter != mem_block.end();) {\n\t\tconst auto& key = iter->first;\n\t\tif(key.second >= new_version) {\n\t\t\tmem_block_size -= key.first->size + iter->second->size;\n\t\t\titer = mem_block.erase(iter);\n\t\t} else {\n\t\t\titer++;\n\t\t}\n\t}\n\tfor(auto iter = mem_index.begin(); iter != mem_index.end();) {\n\t\tconst auto& key = iter->first;\n\t\tif(iter->second.second >= new_version) {\n\t\t\tconst auto found = mem_block.lower_bound(std::make_pair(key, -1));\n\t\t\tif(found != mem_block.end() && *found->first.first == *key) {\n\t\t\t\titer->second = std::make_pair(found->second, found->first.second);\n\t\t\t\titer++;\n\t\t\t} else {\n\t\t\t\titer = mem_index.erase(iter);\n\t\t\t}\n\t\t} else {\n\t\t\titer++;\n\t\t}\n\t}\n\tcurr_version = new_version;\n\tlast_flush = std::min(last_flush, new_version);\n}\n\nvoid Table::flush()\n{\n\tstd::lock_guard lock(mutex);\n\tif(write_lock) {\n\t\tthrow std::logic_error(\"table is write locked\");\n\t}\n\tlast_flush = curr_version;\n\n\tif(mem_block.empty())\n\t{\n\t\twrite_log.open(\"wb\");\n\t\twrite_log.lock_exclusive();\n\t\t{\n\t\t\tconst std::string cmd = \"reset\";\n\t\t\twrite_entry_sum(write_log.out, -1,\n\t\t\t\t\tstd::make_shared<db_val_t>(cmd.c_str(), cmd.size()),\n\t\t\t\t\tstd::make_shared<db_val_t>(&curr_version, sizeof(curr_version)));\n\t\t}\n\t\tdebug_log << \"Force flushed at version \" << curr_version << std::endl;\n\t\treturn;\n\t}\n\tconst auto time_begin = get_time_ms();\n\n\tauto block = create_block(0, \"flush.tmp\");\n\tblock->index.reserve(mem_index.size());\n\n\tauto& out = block->file.out;\n\tblock->file.seek_to(block_header_size);\n\n\tstd::shared_ptr<db_val_t> prev;\n\tfor(const auto& entry : mem_block) {\n\t\tconst auto& version = entry.first.second;\n\t\tconst auto& key = entry.first.first;\n\t\tif(!prev || *key != *prev) {\n\t\t\tblock->index.push_back(out.get_output_pos());\n\t\t}\n\t\tblock->total_count++;\n\t\tblock->min_version = std::min(version, block->min_version);\n\t\tblock->max_version = std::max(version, block->max_version);\n\t\twrite_entry(out, version, key, entry.second);\n\t\tprev = key;\n\t}\n\tblock->index_offset = out.get_output_pos();\n\n\tfinish_block(block);\n\trename(block, next_block_id++);\n\n\tmem_index.clear();\n\tmem_block.clear();\n\tblocks.push_back(block);\n\n\tmem_block_size = 0;\n\n\t// clear log after writing block\n\twrite_log.open(\"wb\");\n\twrite_log.lock_exclusive();\n\n\tdebug_log << \"Flushed \" << block->name << \" with \" << block->index.size() << \" / \" << block->total_count\n\t\t\t<< \" entries, min_version = \" << block->min_version << \", max_version = \" << block->max_version\n\t\t\t<< \", took \" << (get_time_ms() - time_begin) / 1e3 << \" sec\" << std::endl;\n\n\tcheck_rewrite();\n}\n\nstd::shared_ptr<Table::block_t>\nTable::rewrite(std::list<std::shared_ptr<block_t>> blocks, const uint32_t level) const\n{\n\tif(blocks.empty()) {\n\t\tthrow std::logic_error(\"no blocks given\");\n\t}\n\tsize_t total_index_entries = 0;\n\tfor(const auto& block : blocks) {\n\t\tif(block->level + 1 != level) {\n\t\t\tthrow std::logic_error(\"level mismatch\");\n\t\t}\n\t\ttotal_index_entries += block->index.size();\n\t}\n\n\tstruct pointer_t {\n\t\tuint64_t offset = 0;\n\t\tstd::shared_ptr<block_t> block;\n\t\tstd::shared_ptr<db_val_t> value;\n\t};\n\tstd::map<std::pair<std::shared_ptr<db_val_t>, uint32_t>, pointer_t, mem_compare_t> block_map(mem_compare_t(this));\n\n\tfor(const auto& block : blocks) {\n\t\tif(!block->total_count) {\n\t\t\tcontinue;\n\t\t}\n\t\tblock->file.seek_to(block_header_size);\n\n\t\tpointer_t entry;\n\t\tentry.block = block;\n\t\tuint32_t version;\n\t\tstd::shared_ptr<db_val_t> key;\n\t\tread_entry(block->file.in, version, key, entry.value);\n\t\tblock_map[std::make_pair(key, version)] = entry;\n\t}\n\n\tauto block = create_block(level, \"rewrite.tmp\");\n\tblock->index.reserve(total_index_entries);\n\n\tauto& out = block->file.out;\n\tblock->file.seek_to(block_header_size);\n\n\tstd::shared_ptr<db_val_t> prev;\n\twhile(!block_map.empty()) {\n\t\tconst auto iter = block_map.begin();\n\t\tconst auto& key = iter->first.first;\n\t\tconst auto& version = iter->first.second;\n\t\tif(!prev || *key != *prev) {\n\t\t\tblock->index.push_back(out.get_output_pos());\n\t\t}\n\t\tblock->total_count++;\n\t\tblock->min_version = std::min(version, block->min_version);\n\t\tblock->max_version = std::max(version, block->max_version);\n\t\twrite_entry(out, version, key, iter->second.value);\n\t\tprev = key;\n\n\t\tauto entry = iter->second;\n\t\tif(++entry.offset < entry.block->total_count) {\n\t\t\tuint32_t version;\n\t\t\tstd::shared_ptr<db_val_t> key;\n\t\t\tread_entry(entry.block->file.in, version, key, entry.value);\n\t\t\tblock_map[std::make_pair(key, version)] = entry;\n\t\t}\n\t\tblock_map.erase(iter);\n\t}\n\tblock->index_offset = out.get_output_pos();\n\n\tfinish_block(block);\n\treturn block;\n}\n\nvoid Table::check_rewrite()\n{\n\tif(options.level_factor <= 1) {\n\t\treturn;\n\t}\n\tuint32_t level = 0;\n\tauto iter_begin = blocks.begin();\n\tauto iter_end = iter_begin;\n\tstd::list<std::shared_ptr<block_t>> selected;\n\tfor(auto iter = blocks.begin(); iter != blocks.end(); ++iter) {\n\t\tconst auto& block = *iter;\n\t\tif(selected.empty() || block->level == level) {\n\t\t\tselected.push_back(block);\n\t\t\tif(selected.size() > options.level_factor) {\n\t\t\t\titer_end = iter;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tselected.clear();\n\t\t\tselected.push_back(block);\n\t\t\titer_begin = iter;\n\t\t}\n\t\tlevel = block->level;\n\t}\n\tif(selected.size() <= options.level_factor) {\n\t\treturn;\n\t}\n\tselected.pop_back();\n\n\tconst auto time_begin = get_time_ms();\n\n\tconst auto block = rewrite(selected, level + 1);\n\trename(block, next_block_id++);\n\n\tdebug_log << \"Wrote \" << block->name << \" at level \" << block->level\n\t\t\t<< \" with \" << block->index.size() << \" / \" << block->total_count\n\t\t\t<< \" entries, min_version = \" << block->min_version << \", max_version = \" << block->max_version\n\t\t\t<< \", took \" << (get_time_ms() - time_begin) / 1e3 << \" sec\" << std::endl;\n\n\tfor(const auto& block : selected) {\n\t\tblock->file.remove();\n\t\tdebug_log << \"Deleted \" << block->name << std::endl;\n\t}\n\tblocks.insert(iter_begin, block);\n\tblocks.erase(iter_begin, iter_end);\n\n\tcheck_rewrite();\n}\n\nvoid Table::write_block_header(vnx::TypeOutput& out, std::shared_ptr<const block_t> block) const\n{\n\tvnx::write(out, uint16_t(0));\n\tvnx::write(out, block->level);\n\tvnx::write(out, block->min_version);\n\tvnx::write(out, block->max_version);\n\tvnx::write(out, block->total_count);\n\tvnx::write(out, block->index_offset);\n}\n\nvoid Table::write_block_index(vnx::TypeOutput& out, std::shared_ptr<const block_t> block) const\n{\n\tvnx::write(out, uint64_t(block->index.size()));\n\tout.write(block->index.data(), block->index.size() * 8);\n}\n\nstd::shared_ptr<Table::block_t> Table::create_block(const uint32_t level, const std::string& name) const\n{\n\tauto block = std::make_shared<block_t>();\n\tblock->level = level;\n\tblock->name = name;\n\tblock->file.open(root_path + '/' + block->name, \"wb\");\n\tblock->min_version = -1;\n\treturn block;\n}\n\nvoid Table::finish_block(std::shared_ptr<block_t> block) const\n{\n\tauto& file = block->file;\n\n\tfile.seek_begin();\n\twrite_block_header(file.out, block);\n\n\tfile.seek_to(block->index_offset);\n\twrite_block_index(file.out, block);\n\n\tfile.close();\n}\n\nvoid Table::rename(std::shared_ptr<block_t> block, const uint64_t new_index) const\n{\n\trename(block, to_number(new_index, 6) + \".dat\");\n}\n\nvoid Table::rename(std::shared_ptr<block_t> block, const std::string& new_name) const\n{\n\tblock->name = new_name;\n\tblock->file.rename(root_path + '/' + block->name);\n\tblock->file.open(\"rb\");\n\tblock->file.lock_exclusive();\n}\n\nTable::Iterator::Iterator(const Table* table)\n\t:\ttable(table), block_map(compare_t(this))\n{\n\tstd::lock_guard lock(table->mutex);\n\ttable->write_lock++;\n}\n\nTable::Iterator::Iterator(std::shared_ptr<const Table> table)\n\t:\tIterator(table.get())\n{\n\tp_table = table;\n}\n\nTable::Iterator::~Iterator()\n{\n\tstd::lock_guard lock(table->mutex);\n\ttable->write_lock--;\n}\n\nbool Table::Iterator::compare_t::operator()(\n\t\tconst std::pair<std::shared_ptr<db_val_t>, uint32_t>& lhs, const std::pair<std::shared_ptr<db_val_t>, uint32_t>& rhs) const\n{\n\tif(!iter->direction) {\n\t\tthrow std::logic_error(\"!direction\");\n\t}\n\tconst auto res = iter->table->options.comparator(*lhs.first, *rhs.first);\n\tif(res == 0) {\n\t\treturn lhs.second > rhs.second;\n\t}\n\treturn iter->direction > 0 ? res < 0 : res > 0;\n}\n\nbool Table::Iterator::is_valid() const\n{\n\treturn !block_map.empty() && direction;\n}\n\nstd::map<std::pair<std::shared_ptr<db_val_t>, uint32_t>, Table::Iterator::pointer_t, Table::key_compare_t>::const_iterator\nTable::Iterator::current() const\n{\n\tif(!is_valid()) {\n\t\tthrow std::logic_error(\"iterator not valid\");\n\t}\n\treturn block_map.begin();\n}\n\nuint32_t Table::Iterator::version() const\n{\n\treturn current()->first.second;\n}\n\nstd::shared_ptr<db_val_t> Table::Iterator::key() const\n{\n\treturn current()->first.first;\n}\n\nstd::shared_ptr<db_val_t> Table::Iterator::value() const\n{\n\treturn current()->second.value;\n}\n\nvoid Table::Iterator::prev()\n{\n\tif(!is_valid()) {\n\t\tthrow std::logic_error(\"iterator not valid\");\n\t}\n\tif(direction < 0) {\n\t\tauto iter = block_map.begin();\n\t\tconst auto prev = iter->first.first;\n\t\t// iterate until next key\n\t\twhile(iter != block_map.end() && *iter->first.first == *prev) {\n\t\t\tconst auto& entry = iter->second;\n\t\t\tif(const auto& block = entry.block) {\n\t\t\t\tif(entry.pos > 0) {\n\t\t\t\t\tconst auto pos = entry.pos - 1;\n\t\t\t\t\tpointer_t next;\n\t\t\t\t\tnext.block = block;\n\t\t\t\t\tnext.pos = pos;\n\t\t\t\t\tuint32_t version;\n\t\t\t\t\tstd::shared_ptr<db_val_t> key;\n\t\t\t\t\tread_entry_at(entry.block->file, block->index[pos], version, key, next.value);\n\t\t\t\t\tblock_map[std::make_pair(key, version)] = next;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(entry.iter != table->mem_index.begin()) {\n\t\t\t\t\tauto iter = entry.iter; iter--;\n\t\t\t\t\tpointer_t next;\n\t\t\t\t\tnext.iter = iter;\n\t\t\t\t\tnext.value = iter->second.first;\n\t\t\t\t\tblock_map[std::make_pair(iter->first, iter->second.second)] = next;\n\t\t\t\t}\n\t\t\t}\n\t\t\titer = block_map.erase(iter);\n\t\t}\n\t} else {\n\t\tseek_prev(key());\n\t}\n}\n\nvoid Table::Iterator::next()\n{\n\tif(!is_valid()) {\n\t\tthrow std::logic_error(\"iterator not valid\");\n\t}\n\tif(direction > 0) {\n\t\tauto iter = block_map.begin();\n\t\tconst auto prev = iter->first.first;\n\t\t// iterate until next key\n\t\twhile(iter != block_map.end() && *iter->first.first == *prev) {\n\t\t\tconst auto& entry = iter->second;\n\t\t\tif(const auto& block = entry.block) {\n\t\t\t\tconst auto pos = entry.pos + 1;\n\t\t\t\tif(pos < block->index.size()) {\n\t\t\t\t\tpointer_t next;\n\t\t\t\t\tnext.block = block;\n\t\t\t\t\tnext.pos = pos;\n\t\t\t\t\tuint32_t version;\n\t\t\t\t\tstd::shared_ptr<db_val_t> key;\n\t\t\t\t\tread_entry_at(entry.block->file, block->index[pos], version, key, next.value);\n\t\t\t\t\tblock_map[std::make_pair(key, version)] = next;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tauto iter = entry.iter; iter++;\n\t\t\t\tif(iter != table->mem_index.end()) {\n\t\t\t\t\tpointer_t next;\n\t\t\t\t\tnext.iter = iter;\n\t\t\t\t\tnext.value = iter->second.first;\n\t\t\t\t\tblock_map[std::make_pair(iter->first, iter->second.second)] = next;\n\t\t\t\t}\n\t\t\t}\n\t\t\titer = block_map.erase(iter);\n\t\t}\n\t} else {\n\t\tseek_next(key());\n\t}\n}\n\nvoid Table::Iterator::seek_begin()\n{\n\tseek(nullptr, 0);\n}\n\nvoid Table::Iterator::seek_last()\n{\n\tseek(nullptr, -1);\n}\n\nvoid Table::Iterator::seek(std::shared_ptr<db_val_t> key)\n{\n\tseek(key, 0);\n}\n\nvoid Table::Iterator::seek(std::shared_ptr<db_val_t> key, const int mode)\n{\n\tseek(table->blocks, key, mode);\n\n\tconst auto& mem_index = table->mem_index;\n\tif(!mem_index.empty()) {\n\t\tauto iter = mem_index.begin();\n\t\tif(key) {\n\t\t\titer = mem_index.lower_bound(key);\n\t\t} else if(mode < 0) {\n\t\t\titer = mem_index.end();\n\t\t}\n\t\tif(mode < 0) {\n\t\t\tif(iter != mem_index.begin()) {\n\t\t\t\titer--;\n\t\t\t} else {\n\t\t\t\titer = mem_index.end();\n\t\t\t}\n\t\t} else if(mode > 0) {\n\t\t\tif(iter != mem_index.end()) {\n\t\t\t\titer++;\n\t\t\t}\n\t\t}\n\t\tif(iter != mem_index.end()) {\n\t\t\tpointer_t entry;\n\t\t\tentry.iter = iter;\n\t\t\tentry.value = iter->second.first;\n\t\t\tblock_map[std::make_pair(iter->first, iter->second.second)] = entry;\n\t\t}\n\t}\n}\n\nvoid Table::Iterator::seek(const std::list<std::shared_ptr<block_t>>& blocks, std::shared_ptr<db_val_t> key, const int mode)\n{\n\tblock_map.clear();\n\tdirection = mode >= 0 ? 1 : -1;\n\n\tfor(const auto& block : blocks)\n\t{\n\t\tconst auto end = block->index.size();\n\n\t\tbool is_match = false;\n\t\tuint32_t version = -1;\n\t\tsize_t pos = 0;\n\t\tauto res = key;\n\t\tif(res) {\n\t\t\tpos = table->lower_bound(block, version, res, is_match);\n\t\t}\n\t\telse if(mode == 0) {\n\t\t\tif(pos < end) {\n\t\t\t\tread_key_at(block->file, block->index[pos], version, res);\n\t\t\t} else {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\telse if(mode < 0) {\n\t\t\tpos = end;\n\t\t}\n\t\tif(mode < 0) {\n\t\t\tif(pos == 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tread_key_at(block->file, block->index[--pos], version, res);\n\t\t}\n\t\telse if(mode > 0) {\n\t\t\tif(pos + 1 >= end) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tread_key_at(block->file, block->index[++pos], version, res);\n\t\t}\n\t\tif(!res) {\n\t\t\tcontinue;\n\t\t}\n\t\tpointer_t entry;\n\t\tentry.block = block;\n\t\tentry.pos = pos;\n\t\tread_value_at(block->file, block->index[pos], res, entry.value);\n\t\tblock_map[std::make_pair(res, version)] = entry;\n\t}\n}\n\nvoid Table::Iterator::seek_next(std::shared_ptr<db_val_t> key)\n{\n\tseek(key, 1);\n}\n\nvoid Table::Iterator::seek_prev(std::shared_ptr<db_val_t> key)\n{\n\tseek(key, -1);\n}\n\nvoid Table::Iterator::seek_for_prev(std::shared_ptr<db_val_t> key_)\n{\n\tseek(key_);\n\tif(is_valid() && *key() != *key_) {\n\t\tprev();\n\t}\n}\n\n\nDataBase::DataBase(const int num_threads)\n\t:\tthreads(num_threads > 0 ? num_threads : std::max(std::thread::hardware_concurrency(), 4u))\n{\n}\n\nDataBase::~DataBase()\n{\n\tthreads.close();\n}\n\nvoid DataBase::add(std::shared_ptr<Table> table)\n{\n\tstd::lock_guard<std::mutex> lock(mutex);\n\ttables.push_back(table);\n}\n\nvoid DataBase::commit(const uint32_t new_version)\n{\n\tstd::lock_guard<std::mutex> lock(mutex);\n\tfor(const auto& table : tables) {\n\t\tif(table->commit(new_version, false)) {\n\t\t\tthreads.add_task([table]() {\n\t\t\t\ttable->flush();\n\t\t\t});\n\t\t}\n\t}\n\tthreads.sync();\n}\n\nvoid DataBase::revert(const uint32_t new_version)\n{\n\tstd::lock_guard<std::mutex> lock(mutex);\n\tfor(const auto& table : tables) {\n\t\tthreads.add_task([table, new_version]() {\n\t\t\ttable->revert(new_version);\n\t\t});\n\t}\n\tthreads.sync();\n}\n\nuint32_t DataBase::version() const\n{\n\tstd::lock_guard<std::mutex> lock(mutex);\n\tif(tables.empty()) {\n\t\treturn 0;\n\t}\n\treturn tables[0]->current_version();\n}\n\nuint32_t DataBase::min_version() const\n{\n\tstd::lock_guard<std::mutex> lock(mutex);\n\tif(tables.empty()) {\n\t\treturn 0;\n\t}\n\tuint32_t min_version = -1;\n\tfor(const auto& table : tables) {\n\t\tmin_version = std::min(table->current_version(), min_version);\n\t}\n\treturn min_version;\n}\n\nuint32_t DataBase::recover()\n{\n\tconst auto version = min_version();\n\trevert(version);\n\treturn version;\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Farmer.cpp",
    "content": "/*\n * Farmer.cpp\n *\n *  Created on: Dec 12, 2021\n *      Author: mad\n */\n\n#include <mmx/Farmer.h>\n#include <mmx/Transaction.hxx>\n#include <mmx/WebRender.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\n\nFarmer::Farmer(const std::string& _vnx_name)\n\t:\tFarmerBase(_vnx_name)\n{\n}\n\nvoid Farmer::init()\n{\n\tpipe = vnx::open_pipe(vnx_name, this, 1000);\n\tpipe->pause();\n\n\tvnx::open_pipe(vnx_get_id(), this, 1000);\n\n\tsubscribe(input_info, 1000);\n\tsubscribe(input_proofs, 10000);\n\tsubscribe(input_partials, 10000);\n}\n\nvoid Farmer::main()\n{\n\tif(reward_addr) {\n\t\tif(*reward_addr == addr_t()) {\n\t\t\treward_addr = nullptr;\n\t\t} else {\n\t\t\tlog(INFO) << \"Reward address: \" << reward_addr->to_string();\n\t\t}\n\t}\n\tparams = get_params();\n\n\thttp_client = new vnx::addons::HttpClient(vnx_name + \".HttpClient\");\n\thttp_client->output_response = \"farmer.http_response\";\n\thttp_client.start();\n\n\twallet = std::make_shared<WalletAsyncClient>(wallet_server);\n\thttp_async = std::make_shared<vnx::addons::HttpClientAsyncClient>(http_client.get_id());\n\n\twallet->vnx_set_non_blocking(true);\n\thttp_async->vnx_set_non_blocking(true);\n\n\tadd_async_client(wallet);\n\tadd_async_client(http_async);\n\n\tset_timer_millis(60 * 1000, std::bind(&Farmer::update, this));\n\n\tset_timer_millis(int64_t(difficulty_interval) * 1000, std::bind(&Farmer::update_difficulty, this));\n\n\tupdate();\n\n\tSuper::main();\n}\n\nvnx::Hash64 Farmer::get_mac_addr() const\n{\n\treturn vnx_get_id();\n}\n\nuint64_t Farmer::get_partial_diff(const addr_t& plot_nft) const\n{\n\tauto iter = nft_stats.find(plot_nft);\n\tif(iter != nft_stats.end()) {\n\t\tconst auto& stats = iter->second;\n\t\tif(stats.partial_diff > 0) {\n\t\t\treturn stats.partial_diff;\n\t\t}\n\t}\n\treturn 0;\n}\n\nstd::map<addr_t, uint64_t> Farmer::get_partial_diffs(const std::vector<addr_t>& plot_nfts) const\n{\n\tstd::map<addr_t, uint64_t> out;\n\tfor(const auto& addr : plot_nfts) {\n\t\tif(auto diff = get_partial_diff(addr)) {\n\t\t\tout[addr] = diff;\n\t\t}\n\t}\n\treturn out;\n}\n\nstd::vector<pubkey_t> Farmer::get_farmer_keys() const\n{\n\tstd::vector<pubkey_t> out;\n\tfor(const auto& entry : key_map) {\n\t\tout.push_back(entry.first);\n\t}\n\treturn out;\n}\n\nstd::shared_ptr<const FarmInfo> Farmer::get_farm_info() const\n{\n\tauto info = FarmInfo::create();\n\tfor(const auto& entry : info_map) {\n\t\tif(auto value = std::dynamic_pointer_cast<const FarmInfo>(entry.second->value)) {\n\t\t\tif(value->harvester) {\n\t\t\t\tauto& entry = info->harvester_bytes[*value->harvester];\n\t\t\t\tentry.first += value->total_bytes;\n\t\t\t\tentry.second += value->total_bytes_effective;\n\t\t\t}\n\t\t\tfor(const auto& entry : value->plot_count) {\n\t\t\t\tinfo->plot_count[entry.first] += entry.second;\n\t\t\t}\n\t\t\tfor(const auto& dir : value->plot_dirs) {\n\t\t\t\tinfo->plot_dirs.push_back((value->harvester ? *value->harvester + \":\" : \"\") + dir);\n\t\t\t}\n\t\t\tfor(const auto& entry : value->pool_info) {\n\t\t\t\tauto& dst = info->pool_info[entry.first];\n\t\t\t\tconst auto prev_count = dst.plot_count;\n\t\t\t\tdst = entry.second;\n\t\t\t\tdst.plot_count += prev_count;\n\t\t\t}\n\t\t\tinfo->total_bytes += value->total_bytes;\n\t\t\tinfo->total_bytes_effective += value->total_bytes_effective;\n\t\t\tinfo->total_balance += value->total_balance;\n\t\t}\n\t}\n\tfor(auto& entry : info->pool_info) {\n\t\tentry.second.partial_diff = get_partial_diff(entry.first);\n\t}\n\tinfo->pool_stats = nft_stats;\n\tinfo->reward_addr = reward_addr;\n\treturn info;\n}\n\nvoid Farmer::update()\n{\n\tvnx::open_flow(vnx::get_pipe(node_server), vnx::get_pipe(vnx_get_id()));\n\n\twallet->get_all_farmer_keys(\n\t\t[this](const std::vector<std::pair<skey_t, pubkey_t>>& list) {\n\t\t\tfor(const auto& keys : list) {\n\t\t\t\tif(key_map.emplace(keys.second, keys.first).second) {\n\t\t\t\t\tlog(INFO) << \"Got Farmer Key: \" << keys.second;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpipe->resume();\n\t\t},\n\t\t[this](const vnx::exception& ex) {\n\t\t\tlog(WARN) << \"Failed to get keys from wallet: \" << ex.what();\n\t\t});\n\n\tif(!reward_addr) {\n\t\twallet->get_all_accounts(\n\t\t\t[this](const std::vector<account_info_t>& accounts) {\n\t\t\t\tif(!reward_addr) {\n\t\t\t\t\tfor(const auto& entry : accounts) {\n\t\t\t\t\t\tif(entry.address) {\n\t\t\t\t\t\t\treward_addr = entry.address;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(reward_addr) {\n\t\t\t\t\t\tlog(INFO) << \"Reward address: \" << reward_addr->to_string();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlog(WARN) << \"Failed to get reward address from wallet: no wallet available\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t[this](const vnx::exception& ex) {\n\t\t\t\tlog(WARN) << \"Failed to get reward address from wallet: \" << ex.what();\n\t\t\t});\n\t}\n\n\tconst auto now = get_time_us();\n\tfor(auto iter = info_map.begin(); iter != info_map.end();) {\n\t\tif((now - iter->second->recv_time) / 1000000 > harvester_timeout) {\n\t\t\titer = info_map.erase(iter);\n\t\t} else {\n\t\t\titer++;\n\t\t}\n\t}\n}\n\nvoid Farmer::update_difficulty()\n{\n\tfor(const auto& entry : nft_stats) {\n\t\tquery_difficulty(entry.first, entry.second.server_url);\n\t}\n}\n\nvoid Farmer::query_difficulty(const addr_t& contract, const std::string& url)\n{\n\tif(url.empty()) {\n\t\treturn;\n\t}\n\tvnx::addons::http_request_options_t opt;\n\tif(reward_addr) {\n\t\topt.query[\"id\"] = reward_addr->to_string();\n\t}\n\thttp_async->get_json(url + \"/difficulty\", opt,\n\t\t[this, url, contract](const vnx::Variant& value) {\n\t\t\tconst auto res = value.to_object();\n\t\t\tif(auto field = res[\"difficulty\"]) {\n\t\t\t\tconst auto diff = field.to<uint64_t>();\n\t\t\t\tif(diff > 0) {\n\t\t\t\t\tauto& stats = nft_stats[contract];\n\t\t\t\t\tif(stats.partial_diff <= 0) {\n\t\t\t\t\t\tlog(INFO) << \"Got partial difficulty: \" << diff << \" (\" << url << \")\";\n\t\t\t\t\t}\n\t\t\t\t\tstats.partial_diff = diff;\n\t\t\t\t} else {\n\t\t\t\t\tlog(WARN) << \"Got invalid partial difficulty: \" << diff << \" (\" << url << \")\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlog(WARN) << \"Failed to query partial difficulty from \" << url << \": \" << value.to_string();\n\t\t\t}\n\t\t},\n\t\t[this, url](const std::exception& ex) {\n\t\t\tlog(WARN) << \"Failed to query partial difficulty from \" << url << \" due to: \" << ex.what();\n\t\t});\n}\n\nvoid Farmer::handle(std::shared_ptr<const FarmInfo> value)\n{\n\tif(auto sample = vnx_sample) {\n\t\tif(value->harvester_id) {\n\t\t\tinfo_map[*value->harvester_id] = sample;\n\t\t} else if(value->harvester) {\n\t\t\tinfo_map[hash_t(*value->harvester)] = sample;\n\t\t}\n\t}\n\tfor(const auto& entry : value->pool_info) {\n\t\tconst auto& info = entry.second;\n\t\tif(auto url = info.server_url) {\n\t\t\tif(url->size()) {\n\t\t\t\tauto& stats = nft_stats[info.contract];\n\t\t\t\tif(stats.server_url != (*url)) {\n\t\t\t\t\tstats.server_url = *url;\n\t\t\t\t\tquery_difficulty(info.contract, *url);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Farmer::handle(std::shared_ptr<const ProofResponse> value) try\n{\n\tif(!value->is_valid()) {\n\t\tthrow std::logic_error(\"invalid proof\");\n\t}\n\tconst skey_t farmer_sk = get_skey(value->proof->farmer_key);\n\n\tauto out = vnx::clone(value);\n\tout->farmer_sig = signature_t::sign(farmer_sk, value->hash);\n\tout->content_hash = out->calc_content_hash();\n\tpublish(out, output_proofs);\n}\ncatch(const std::exception& ex) {\n\tlog(WARN) << \"Failed to sign proof from harvester '\" << value->harvester << \"' due to: \" << ex.what();\n}\n\nvoid Farmer::handle(std::shared_ptr<const Partial> value) try\n{\n\tif(!value->proof) {\n\t\treturn;\n\t}\n\tauto out = vnx::clone(value);\n\tif(reward_addr) {\n\t\tout->account = *reward_addr;\n\t} else {\n\t\tlog(WARN) << \"Using plot NFT owner as fallback payout address: \" << out->account.to_string();\n\t}\n\tout->hash = out->calc_hash();\n\n\tconst auto farmer_sk = get_skey(value->proof->farmer_key);\n\tout->farmer_sig = signature_t::sign(farmer_sk, out->hash);\n\n\tconst auto payload = vnx::to_pretty_string(web_render(out));\n\n\thttp_async->post_json(out->pool_url + \"/partial\", payload, {},\n\t\t[this, out](std::shared_ptr<const vnx::addons::HttpResponse> response) {\n\t\t\tauto& stats = nft_stats[out->contract];\n\t\t\tstats.last_partial = get_time_sec();\n\t\t\tbool is_valid = false;\n\t\t\tbool have_error = false;\n\t\t\tif(response->is_json()) {\n\t\t\t\tconst auto value = response->parse_json();\n\t\t\t\tif(value.is_object()) {\n\t\t\t\t\tconst auto res = value.to_object();\n\t\t\t\t\tis_valid = res[\"valid\"].to<bool>();\n\t\t\t\t\tif(is_valid) {\n\t\t\t\t\t\tconst auto points = res[\"points\"].to<int64_t>();\n\t\t\t\t\t\tconst auto response_ms = res[\"response_time\"].to<int64_t>();\n\t\t\t\t\t\tstats.valid_points += (points > 0 ? points : out->proof->difficulty);\n\t\t\t\t\t\tstats.total_partials++;\n\t\t\t\t\t\tstats.total_response_time += response_ms;\n\t\t\t\t\t\tlog(INFO) << \"Partial accepted: points = \" << points\n\t\t\t\t\t\t\t\t<< \", response = \" << response_ms / 1e3\n\t\t\t\t\t\t\t\t<< \" sec [\" << out->harvester << \"] (\" << out->pool_url << \")\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst auto code = res[\"error_code\"].to<pooling_error_e>();\n\t\t\t\t\t\tif(code != pooling_error_e::NONE) {\n\t\t\t\t\t\t\thave_error = true;\n\t\t\t\t\t\t\tconst auto message = res[\"error_message\"].to_string_value();\n\t\t\t\t\t\t\tstats.error_count[code]++;\n\t\t\t\t\t\t\tlog(WARN) << \"Partial was rejected due to: \"\n\t\t\t\t\t\t\t\t\t<< code.to_string_value() << \": \" << (message.empty() ? \"???\" : message)\n\t\t\t\t\t\t\t\t\t<< \" [\" << out->harvester << \"] (\" << out->pool_url << \")\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!is_valid) {\n\t\t\t\tif(!have_error) {\n\t\t\t\t\tstats.error_count[pooling_error_e::SERVER_ERROR]++;\n\t\t\t\t\tlog(WARN) << \"Partial failed due to: unknown error [\" << out->harvester << \"] (\" << out->pool_url << \")\";\n\t\t\t\t}\n\t\t\t\tstats.failed_points += out->proof->difficulty;\n\t\t\t}\n\t\t},\n\t\t[this, out](const std::exception& ex) {\n\t\t\tauto& stats = nft_stats[out->contract];\n\t\t\tstats.failed_points += out->proof->difficulty;\n\t\t\tstats.error_count[pooling_error_e::SERVER_ERROR]++;\n\t\t\tlog(WARN) << \"Failed to send partial to \" << out->pool_url << \" due to: \" << ex.what();\n\t\t});\n\n\tpublish(out, output_partials);\n}\ncatch(const std::exception& ex) {\n\tlog(WARN) << \"Failed to process partial from harvester '\" << value->harvester << \"' due to: \" << ex.what();\n}\n\nskey_t Farmer::get_skey(const pubkey_t& pubkey) const\n{\n\tauto iter = key_map.find(pubkey);\n\tif(iter == key_map.end()) {\n\t\tthrow std::logic_error(\"unknown farmer key: \" + pubkey.to_string());\n\t}\n\treturn iter->second;\n}\n\nstd::shared_ptr<const BlockHeader>\nFarmer::sign_block(std::shared_ptr<const BlockHeader> block) const\n{\n\tif(!block) {\n\t\tthrow std::logic_error(\"!block\");\n\t}\n\tif(block->proof.empty()) {\n\t\tthrow std::logic_error(\"!proof\");\n\t}\n\tconst auto farmer_sk = get_skey(block->get_farmer_key());\n\n\tauto out = vnx::clone(block);\n\tout->nonce = vnx::rand64();\n\n\tif(!out->reward_addr) {\n\t\tout->reward_addr = reward_addr;\n\t}\n\tif(out->reward_contract) {\n\t\tout->reward_account = reward_addr;\n\t}\n\tout->hash = out->calc_hash();\n\tout->farmer_sig = signature_t::sign(farmer_sk, out->hash);\n\tout->content_hash = out->calc_content_hash();\n\treturn out;\n}\n\nsignature_t Farmer::sign_vote(std::shared_ptr<const ValidatorVote> vote) const\n{\n\tif(!vote) {\n\t\tthrow std::logic_error(\"!vote\");\n\t}\n\tconst auto farmer_sk = get_skey(vote->farmer_key);\n\tconst hash_t msg(\"MMX/validator/vote/\" + vote->hash + vote->farmer_key);\n\treturn signature_t::sign(farmer_sk, msg);\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Harvester.cpp",
    "content": "/*\n * Harvester.cpp\n *\n *  Created on: Dec 11, 2021\n *      Author: mad\n */\n\n#include <mmx/Harvester.h>\n#include <mmx/FarmerClient.hxx>\n#include <mmx/ProofResponse.hxx>\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/ProofOfSpaceNFT.hxx>\n#include <mmx/LookupInfo.hxx>\n#include <mmx/Partial.hxx>\n#include <mmx/utils.h>\n#include <mmx/pos/verify.h>\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nHarvester::Harvester(const std::string& _vnx_name)\n\t:\tHarvesterBase(_vnx_name)\n{\n\tif(my_name.empty()) {\n\t\tmy_name = vnx::get_host_name();\n\t}\n\tparams = get_params();\n\tharvester_id = hash_t::random();\n}\n\nvoid Harvester::init()\n{\n\tvnx::open_pipe(vnx_name, this, max_queue_ms);\n\n\tsubscribe(input_challenges, max_queue_ms);\n}\n\nvoid Harvester::main()\n{\n\tfarmer = std::make_shared<FarmerClient>(farmer_server);\n\tfarmer_async = std::make_shared<FarmerAsyncClient>(farmer_server);\n\tfarmer_async->vnx_set_non_blocking(true);\n\tnode_async = std::make_shared<NodeAsyncClient>(node_server);\n\tnode_async->vnx_set_non_blocking(true);\n\n\thttp = std::make_shared<vnx::addons::HttpInterface<Harvester>>(this, vnx_name);\n\tadd_async_client(http);\n\tadd_async_client(node_async);\n\tadd_async_client(farmer_async);\n\n\tthreads = std::make_shared<vnx::ThreadPool>(num_threads, num_threads);\n\tlookup_timer = add_timer(std::bind(&Harvester::check_queue, this));\n\n\tset_timer_millis(10000, std::bind(&Harvester::update, this));\n\tset_timer_millis(int64_t(nft_query_interval) * 1000, std::bind(&Harvester::update_nfts, this));\n\n\tif(reload_interval > 0) {\n\t\tset_timer_millis(int64_t(reload_interval) * 1000, std::bind(&Harvester::reload, this));\n\t}\n\n\treload();\n\n\tSuper::main();\n\n\tthreads->close();\n}\n\nvoid Harvester::send_response(\tstd::shared_ptr<const Challenge> request, std::shared_ptr<const ProofOfSpace> proof,\n\t\t\t\t\t\t\t\tconst int64_t time_begin_ms) const\n{\n\t// Note: NEEDS TO BE THREAD SAFE\n\tauto out = ProofResponse::create();\n\tout->proof = proof;\n\tout->vdf_height = request->vdf_height;\n\tout->farmer_addr = farmer_addr;\n\tout->harvester = my_name.substr(0, 1024);\n\tout->lookup_time_ms = get_time_ms() - time_begin_ms;\n\tout->hash = out->calc_hash();\n\tout->content_hash = out->calc_content_hash();\n\n\tconst auto delay_sec = out->lookup_time_ms / 1e3;\n\tlog(INFO) << \"[\" << my_name << \"] Found proof with score \" << proof->score << \" for height \"\n\t\t\t<< request->vdf_height << \", delay \" << delay_sec << \" sec\";\n\n\tpublish(out, output_proofs);\n}\n\nvoid Harvester::check_queue()\n{\n\tconst auto now_ms = get_time_ms();\n\n\tfor(auto iter = lookup_queue.begin(); iter != lookup_queue.end();)\n\t{\n\t\tconst auto& entry = iter->second;\n\t\tconst auto delay_ms = now_ms - entry.recv_time_ms;\n\n\t\tif(delay_ms > params->challenge_delay * params->block_interval_ms) {\n\t\t\tlog(WARN) << \"[\" << my_name << \"] Missed deadline for height \" << entry.request->vdf_height;\n\t\t\titer = lookup_queue.erase(iter);\n\t\t} else {\n\t\t\titer++;\n\t\t}\n\t}\n\tif(!lookup_queue.empty())\n\t{\n\t\tconst auto iter = --lookup_queue.end();\n\t\tconst auto& entry = iter->second;\n\t\tlookup_task(entry.request, entry.recv_time_ms);\n\t\tlookup_queue.erase(iter);\n\t}\n}\n\nvoid Harvester::handle(std::shared_ptr<const Challenge> value)\n{\n\tif(!is_ready) {\n\t\treturn;\n\t}\n\tif(!already_checked.insert(value->challenge).second) {\n\t\treturn;\n\t}\n\tauto& entry = lookup_queue[value->vdf_height];\n\n\tconst auto prev = entry.request;\n\tif(!prev || prev->challenge != value->challenge) {\n\t\tentry.request = value;\n\t\tentry.recv_time_ms = vnx_sample->recv_time / 1000;\n\n\t\t// trigger first lookup if no new challenge received for 10 ms\n\t\tlookup_timer->set_millis(10);\n\t}\n}\n\nstd::vector<uint32_t> Harvester::fetch_full_proof(\n\t\tstd::shared_ptr<pos::Prover> prover, const uint64_t index) const\n{\n\t// Note: NEEDS TO BE THREAD SAFE\n\ttry {\n\t\tconst auto time_begin = get_time_ms();\n\t\tconst auto data = prover->get_full_proof(index);\n\t\tif(data.valid) {\n\t\t\tconst auto elapsed = (get_time_ms() - time_begin) / 1e3;\n\t\t\tlog(elapsed > 20 ? WARN : DEBUG) << \"[\" << my_name << \"] Fetching full proof took \" << elapsed << \" sec (\" << prover->get_file_path() << \")\";\n\t\t\treturn data.proof;\n\t\t} else {\n\t\t\tthrow std::runtime_error(data.error_msg);\n\t\t}\n\t} catch(const std::exception& ex) {\n\t\tlog(WARN) << \"[\" << my_name << \"] Failed to fetch full proof: \" << ex.what() << \" (\" << prover->get_file_path() << \")\";\n\t\tthrow;\n\t}\n}\n\nvoid Harvester::lookup_task(std::shared_ptr<const Challenge> value, const int64_t recv_time_ms) const\n{\n\tstruct pool_conf_t {\n\t\taddr_t owner;\n\t\tuint64_t difficulty = 0;\n\t\tstd::string server_url;\n\t};\n\tstruct lookup_job_t {\n\t\tstd::mutex mutex;\n\t\tstd::condition_variable signal;\n\t\tsize_t total_plots = 0;\n\t\tint64_t slow_time_ms = 0;\n\t\tint64_t time_begin = 0;\n\t\tstd::string slow_plot;\n\t\tstd::unordered_map<addr_t, pool_conf_t> pool_config;\n\t\tstd::atomic<uint64_t> num_left {0};\n\t\tstd::atomic<uint64_t> num_passed {0};\n\t\tstd::atomic<uint32_t> num_proofs {0};\n\t};\n\tconst auto job = std::make_shared<lookup_job_t>();\n\tjob->total_plots = id_map.size();\n\tjob->num_left = job->total_plots;\n\tjob->time_begin = get_time_ms();\n\n\tfor(const auto& entry : plot_nfts) {\n\t\tconst auto& info = entry.second;\n\t\tif(info.is_locked && info.server_url) {\n\t\t\tconst auto server_url = *info.server_url;\n\t\t\tconst auto iter = partial_diff.find(info.address);\n\t\t\tif(iter != partial_diff.end() && iter->second > 0) {\n\t\t\t\tjob->pool_config[info.address] = {info.owner, iter->second, server_url};\n\t\t\t} else {\n\t\t\t\tlog(WARN) << \"Waiting on partial difficulty for pool: \" + server_url;\n\t\t\t}\n\t\t}\n\t}\n\n\tfor(const auto& entry : id_map)\n\t{\n\t\tconst auto iter = plot_map.find(entry.second);\n\t\tif(iter == plot_map.end()) {\n\t\t\tjob->num_left--;\n\t\t\tlog(WARN) << \"Cannot find plot \" << entry.first.to_string();\n\t\t\tcontinue;\n\t\t}\n\t\tconst auto& plot_id = entry.first;\n\t\tconst auto& prover = iter->second;\n\n\t\tthreads->add_task([this, plot_id, prover, value, job, recv_time_ms]()\n\t\t{\n\t\t\tconst auto header = prover->get_header();\n\t\t\tconst auto time_begin = get_time_ms();\n\t\t\tconst bool hard_fork = value->vdf_height >= params->hardfork1_height;\n\t\t\tconst bool passed_filter = check_plot_filter(params, value->challenge, plot_id);\n\n\t\t\tif(passed_filter) try\n\t\t\t{\n\t\t\t\tconst pool_conf_t* pool_config = nullptr;\n\t\t\t\tif(auto contract = header->contract) {\n\t\t\t\t\tauto iter = job->pool_config.find(*contract);\n\t\t\t\t\tif(iter != job->pool_config.end()) {\n\t\t\t\t\t\tpool_config = &iter->second;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst auto challenge = get_plot_challenge(value->challenge, plot_id);\n\t\t\t\tconst auto qualities = prover->get_qualities(challenge, params->plot_filter);\n\n\t\t\t\tfor(const auto& res : qualities) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif(!res.valid) {\n\t\t\t\t\t\t\tlog(WARN) << \"[\" << my_name << \"] Failed to fetch quality: \" << res.error_msg << \" (\" << prover->get_file_path() << \")\";\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(hard_fork && !pos::check_post_filter(challenge, res.meta, params->post_filter)) {\n\t\t\t\t\t\t\tcontinue;\t// failed post filter\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstd::vector<uint32_t> proof_xs;\n\t\t\t\t\t\tif(res.proof.size()) {\n\t\t\t\t\t\t\tproof_xs = res.proof;\t// SSD plot\n\t\t\t\t\t\t} else if(hard_fork) {\n\t\t\t\t\t\t\tproof_xs = fetch_full_proof(prover, res.index);\t\t// HDD plot\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thash_t quality;\n\t\t\t\t\t\tif(hard_fork) {\n\t\t\t\t\t\t\tquality = calc_proof_hash(challenge, proof_xs);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tquality = pos::calc_quality(challenge, res.meta);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst auto is_solo_proof =\n\t\t\t\t\t\t\t\tcheck_proof_threshold(params, header->ksize, quality, value->difficulty, hard_fork);\n\t\t\t\t\t\tconst auto is_partial_proof = pool_config ?\n\t\t\t\t\t\t\t\tcheck_proof_threshold(params, header->ksize, quality, pool_config->difficulty, hard_fork) : false;\n\n\t\t\t\t\t\tuint16_t score = -1;\n\t\t\t\t\t\tif(is_solo_proof || is_partial_proof)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(proof_xs.empty()) {\n\t\t\t\t\t\t\t\tproof_xs = fetch_full_proof(prover, res.index);\t\t// HDD plot\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst auto hash = calc_proof_hash(value->challenge, proof_xs);\n\t\t\t\t\t\t\tscore = get_proof_score(hash);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(is_partial_proof) {\n\t\t\t\t\t\t\tauto proof = std::make_shared<ProofOfSpaceNFT>();\n\t\t\t\t\t\t\tproof->seed = header->seed;\n\t\t\t\t\t\t\tproof->ksize = header->ksize;\n\t\t\t\t\t\t\tproof->plot_id = header->plot_id;\n\t\t\t\t\t\t\tproof->challenge = value->challenge;\n\t\t\t\t\t\t\tproof->difficulty = pool_config->difficulty;\n\t\t\t\t\t\t\tproof->farmer_key = header->farmer_key;\n\t\t\t\t\t\t\tproof->contract = *header->contract;\n\t\t\t\t\t\t\tproof->score = score;\n\t\t\t\t\t\t\tproof->proof_xs = proof_xs;\n\n\t\t\t\t\t\t\tauto out = Partial::create();\n\t\t\t\t\t\t\tout->vdf_height = value->vdf_height;\n\t\t\t\t\t\t\tout->contract = *header->contract;\n\t\t\t\t\t\t\tout->account = pool_config->owner;\n\t\t\t\t\t\t\tout->pool_url = pool_config->server_url;\n\t\t\t\t\t\t\tout->proof = proof;\n\t\t\t\t\t\t\tout->harvester = my_name;\n\t\t\t\t\t\t\tout->lookup_time_ms = get_time_ms() - time_begin;\n\n\t\t\t\t\t\t\tpublish(out, output_partials);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif(is_solo_proof) {\n\t\t\t\t\t\t\tstd::shared_ptr<ProofOfSpace> proof;\n\n\t\t\t\t\t\t\tif(header->contract) {\n\t\t\t\t\t\t\t\tauto out = std::make_shared<ProofOfSpaceNFT>();\n\t\t\t\t\t\t\t\tout->seed = header->seed;\n\t\t\t\t\t\t\t\tout->ksize = header->ksize;\n\t\t\t\t\t\t\t\tout->contract = *header->contract;\n\t\t\t\t\t\t\t\tout->proof_xs = proof_xs;\n\t\t\t\t\t\t\t\tproof = out;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tauto out = std::make_shared<ProofOfSpaceOG>();\n\t\t\t\t\t\t\t\tout->seed = header->seed;\n\t\t\t\t\t\t\t\tout->ksize = header->ksize;\n\t\t\t\t\t\t\t\tout->proof_xs = proof_xs;\n\t\t\t\t\t\t\t\tproof = out;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tproof->score = score;\n\t\t\t\t\t\t\tproof->plot_id = header->plot_id;\n\t\t\t\t\t\t\tproof->challenge = value->challenge;\n\t\t\t\t\t\t\tproof->difficulty = value->difficulty;\n\t\t\t\t\t\t\tproof->farmer_key = header->farmer_key;\n\n\t\t\t\t\t\t\tsend_response(value, proof, recv_time_ms);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch(const std::exception& ex) {\n\t\t\t\t\t\tlog(WARN) << \"[\" << my_name << \"] Failed to process quality \"\n\t\t\t\t\t\t\t\t<< res.index << \": \" << ex.what() << \" (\" << prover->get_file_path() << \")\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"[\" << my_name << \"] Failed to process plot: \" << ex.what() << \" (\" << prover->get_file_path() << \")\";\n\t\t\t}\n\n\t\t\tconst auto time_lookup = get_time_ms() - time_begin;\n\t\t\t{\n\t\t\t\tstd::lock_guard<std::mutex> lock(job->mutex);\n\t\t\t\tif(passed_filter) {\n\t\t\t\t\tif(time_lookup > job->slow_time_ms) {\n\t\t\t\t\t\tjob->slow_time_ms = time_lookup;\n\t\t\t\t\t\tjob->slow_plot = prover->get_file_path();\n\t\t\t\t\t}\n\t\t\t\t\tjob->num_passed++;\n\t\t\t\t}\n\t\t\t\tjob->num_left--;\n\t\t\t}\n\t\t\tjob->signal.notify_all();\n\t\t});\n\t}\n\n\tthreads->add_task([this, value, job, recv_time_ms]()\n\t{\n\t\tstd::unique_lock<std::mutex> lock(job->mutex);\n\t\twhile(job->num_left) {\n\t\t\tjob->signal.wait(lock);\n\t\t}\n\t\tconst auto time_end = get_time_ms();\n\t\t{\n\t\t\tauto out = LookupInfo::create();\n\t\t\tout->id = harvester_id;\n\t\t\tout->name = my_name;\n\t\t\tout->vdf_height = value->vdf_height;\n\t\t\tout->num_total = job->total_plots;\n\t\t\tout->num_passed = job->num_passed;\n\t\t\tout->total_time_ms = time_end - job->time_begin;\n\t\t\tout->total_delay_ms = time_end - recv_time_ms;\n\t\t\tif(job->num_passed) {\n\t\t\t\tout->slow_time_ms = job->slow_time_ms;\n\t\t\t\tout->slow_plot = job->slow_plot;\n\t\t\t}\n\t\t\tpublish(out, output_lookups);\n\t\t}\n\t\tif(job->total_plots) {\n\t\t\tconst auto slow_time = job->slow_time_ms / 1e3;\n\t\t\tif(job->num_passed) {\n\t\t\t\tlog(slow_time > 20 ? WARN : DEBUG) << \"[\" << my_name << \"] Slowest plot took \" << slow_time << \" sec (\" << job->slow_plot << \")\";\n\t\t\t}\n\t\t\tconst auto delay_sec = (time_end - recv_time_ms) / 1e3;\n\t\t\tlog(INFO) << \"[\" << my_name << \"] \" << job->num_passed << \" of \" << job->total_plots\n\t\t\t\t\t<< \" plots were eligible for height \" << value->vdf_height\n\t\t\t\t\t<< \", max lookup \" << slow_time << \" sec, delay \" << delay_sec << \" sec\";\n\t\t}\n\t});\n\n\t// trigger next lookup right away\n\tlookup_timer->set_millis(0);\n}\n\nuint64_t Harvester::get_total_bytes() const\n{\n\treturn total_bytes;\n}\n\nstd::shared_ptr<const FarmInfo> Harvester::get_farm_info() const\n{\n\tauto out = FarmInfo::create();\n\tout->harvester = my_name;\n\tout->harvester_id = harvester_id;\n\tout->plot_dirs = std::vector<std::string>(plot_dirs.begin(), plot_dirs.end());\n\tout->total_bytes = total_bytes;\n\tout->total_bytes_effective = total_bytes_effective;\n\tfor(const auto& entry : plot_map) {\n\t\tif(const auto& prover = entry.second) {\n\t\t\tout->plot_count[prover->get_ksize()]++;\n\t\t}\n\t}\n\tfor(const auto& entry : plot_nfts) {\n\t\tconst auto& nft = entry.second;\n\t\tauto& info = out->pool_info[nft.address];\n\t\tinfo.contract = nft.address;\n\t\tinfo.name = nft.name;\n\t\tinfo.is_plot_nft = true;\n\t\tif(nft.is_locked) {\n\t\t\tinfo.server_url = nft.server_url;\n\t\t\tinfo.pool_target = nft.target;\n\t\t}\n\t\t{\n\t\t\tauto iter = partial_diff.find(nft.address);\n\t\t\tif(iter != partial_diff.end()) {\n\t\t\t\tinfo.partial_diff = iter->second;\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tauto iter = plot_contract_set.find(nft.address);\n\t\t\tif(iter != plot_contract_set.end()) {\n\t\t\t\tinfo.plot_count = iter->second;\n\t\t\t}\n\t\t}\n\t}\n\tfor(const auto& entry : plot_contract_set) {\n\t\tif(!plot_nfts.count(entry.first)) {\n\t\t\tauto& info = out->pool_info[entry.first];\n\t\t\tinfo.contract = entry.first;\n\t\t\tinfo.plot_count = entry.second;\n\t\t}\n\t}\n\treturn out;\n}\n\nvoid Harvester::find_plot_dirs(const std::set<std::string>& dirs, std::set<std::string>& all_dirs, const size_t depth) const\n{\n\tif(depth > max_recursion) {\n\t\treturn;\n\t}\n\tstd::set<std::string> sub_dirs;\n\tfor(const auto& path : dirs) {\n\t\tvnx::Directory dir(path);\n\t\ttry {\n\t\t\tfor(const auto& file : dir.files()) {\n\t\t\t\tif(file && file->get_extension() == \".plot\") {\n\t\t\t\t\tall_dirs.insert(path);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(const auto& sub_dir : dir.directories()) {\n\t\t\t\tconst auto path = sub_dir->get_path();\n\t\t\t\tif(!all_dirs.count(path)) {\n\t\t\t\t\tconst auto name = sub_dir->get_name();\n\t\t\t\t\tif(!dir_blacklist.count(name)) {\n\t\t\t\t\t\tsub_dirs.insert(sub_dir->get_path());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch(const std::exception& ex) {\n\t\t\tlog(WARN) << \"[\" << my_name << \"] \" << ex.what();\n\t\t}\n\t}\n\tif(!sub_dirs.empty()) {\n\t\tfind_plot_dirs(sub_dirs, all_dirs, depth + 1);\n\t}\n}\n\nvoid Harvester::reload()\n{\n\tconst auto time_begin = get_time_ms();\n\n\tstd::set<pubkey_t> farmer_keys;\n\tfor(const auto& key : farmer->get_farmer_keys()) {\n\t\tfarmer_keys.insert(key);\n\t}\n\n\tstd::set<std::string> dir_set;\n\tif(recursive_search) {\n\t\tfind_plot_dirs(plot_dirs, dir_set, 0);\n\t} else {\n\t\tdir_set = plot_dirs;\n\t}\n\tconst std::vector<std::string> dir_list(dir_set.begin(), dir_set.end());\n\n\tstd::mutex mutex;\n\tstd::set<std::string> missing;\n\tfor(const auto& entry : plot_map) {\n\t\tmissing.insert(entry.first);\n\t}\n\tstd::vector<std::string> plot_files;\n\n\tfor(const auto& dir_path : dir_list)\n\t{\n\t\tthreads->add_task([this, dir_path, &plot_files, &missing, &mutex]()\n\t\t{\n\t\t\ttry {\n\t\t\t\tvnx::Directory dir(dir_path);\n\n\t\t\t\tfor(const auto& file : dir.files())\n\t\t\t\t{\n\t\t\t\t\tconst auto file_name = file->get_path();\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\t\t\t\tmissing.erase(file_name);\n\t\t\t\t\t}\n\t\t\t\t\tif(!plot_map.count(file_name) && file->get_extension() == \".plot\" && file->get_name().substr(0, 9) == \"plot-mmx-\")\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\t\t\t\tplot_files.push_back(file_name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"[\" << my_name << \"] \" << ex.what();\n\t\t\t}\n\t\t});\n\t}\n\tthreads->sync();\n\n\tstd::vector<std::pair<std::string, std::shared_ptr<pos::Prover>>> plots;\n\n\tfor(const auto& file_path : plot_files)\n\t{\n\t\tthreads->add_task([this, file_path, &plots, &mutex]()\n\t\t{\n\t\t\ttry {\n\t\t\t\tconst auto prover = std::make_shared<pos::Prover>(file_path);\n\t\t\t\tconst auto ksize = uint32_t(prover->get_ksize());\n\t\t\t\tif(ksize < params->min_ksize || ksize > params->max_ksize) {\n\t\t\t\t\tthrow std::logic_error(\"invalid ksize: \" + std::to_string(ksize));\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\t\t\tplots.emplace_back(file_path, prover);\n\t\t\t\t}\n\t\t\t} catch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"[\" << my_name << \"] Failed to load plot '\" << file_path << \"' due to: \" << ex.what();\n\t\t\t} catch(...) {\n\t\t\t\tlog(WARN) << \"[\" << my_name << \"] Failed to load plot '\" << file_path << \"'\";\n\t\t\t}\n\t\t});\n\t}\n\tthreads->sync();\n\n\t// purge missing plots\n\tfor(const auto& file_name : missing) {\n\t\tplot_map.erase(file_name);\n\t}\n\n\tif(missing.size()) {\n\t\tlog(INFO) << \"[\" << my_name << \"] Lost \" << missing.size() << \" plots\";\n\t}\n\tif(plots.size() && plot_map.size()) {\n\t\tlog(INFO) << \"[\" << my_name << \"] Found \" << plots.size() << \" new plots\";\n\t}\n\n\t// validate and add new plots\n\tfor(const auto& entry : plots)\n\t{\n\t\tconst auto& plot = entry.second;\n\t\ttry {\n\t\t\tconst auto& farmer_key = plot->get_farmer_key();\n\t\t\tif(!farmer_keys.count(farmer_key)) {\n\t\t\t\tthrow std::logic_error(\"unknown farmer key: \" + farmer_key.to_string());\n\t\t\t}\n\t\t\tplot_map.insert(entry);\n\t\t}\n\t\tcatch(const std::exception& ex) {\n\t\t\tlog(WARN) << \"[\" << my_name << \"] Invalid plot: \" << entry.first << \" (\" << ex.what() << \")\";\n\t\t}\n\t}\n\n\tid_map.clear();\n\ttotal_bytes = 0;\n\ttotal_bytes_effective = 0;\n\tfor(const auto& entry : plot_map) {\n\t\tconst auto& prover = entry.second;\n\t\tconst auto& file_name = entry.first;\n\t\tconst auto& plot_id = prover->get_plot_id();\n\n\t\tif(!id_map.emplace(plot_id, file_name).second) {\n\t\t\tlog(WARN) << \"[\" << my_name << \"] Duplicate plot: \" << entry.first << \" (already have: \" << id_map[plot_id] << \")\";\n\t\t}\n\t\ttotal_bytes += vnx::File(file_name).file_size();\n\t\ttotal_bytes_effective += get_effective_plot_size(prover->get_ksize());\n\t}\n\n\t// gather plot NFTs\n\tplot_contract_set.clear();\n\tfor(const auto& entry : plot_map) {\n\t\tif(const auto& addr = entry.second->get_contract()) {\n\t\t\tplot_contract_set[*addr]++;\n\t\t}\n\t}\n\n\tupdate();\n\tupdate_nfts();\n\n\t// check challenges again for new plots\n\tif(plots.size()) {\n\t\tis_ready = false;\n\t\talready_checked.clear();\n\t}\n\tif(!is_ready) {\n\t\tset_timeout_millis(3000, [this]() {\n\t\t\tis_ready = true;\n\t\t});\n\t}\n\tlog(INFO) << \"[\" << my_name << \"] Loaded \" << plot_map.size() << \" plots, \"\n\t\t\t<< total_bytes / pow(1000, 4) << \" TB, \" << total_bytes_effective / pow(1000, 4) << \" TBe\"\n\t\t\t<< \", took \" << (get_time_ms() - time_begin) / 1e3 << \" sec\";\n}\n\nvoid Harvester::add_plot_dir(const std::string& path)\n{\n\tconst std::string cpath = config_path + vnx_name + \".json\";\n\tauto object = vnx::read_config_file(cpath);\n\t{\n\t\tauto& var = object[\"plot_dirs\"];\n\t\tauto tmp = var.to<std::set<std::string>>();\n\t\ttmp.insert(path);\n\t\tvar = tmp;\n\t\tvnx::write_config(vnx_name + \".plot_dirs\", tmp);\n\t}\n\tvnx::write_config_file(cpath, object);\n\n\tplot_dirs.insert(path);\n\treload();\n}\n\nvoid Harvester::rem_plot_dir(const std::string& path)\n{\n\tconst std::string cpath = config_path + vnx_name + \".json\";\n\tauto object = vnx::read_config_file(cpath);\n\t{\n\t\tauto& var = object[\"plot_dirs\"];\n\t\tauto tmp = var.to<std::set<std::string>>();\n\t\ttmp.erase(path);\n\t\tvar = tmp;\n\t\tvnx::write_config(vnx_name + \".plot_dirs\", tmp);\n\t}\n\tvnx::write_config_file(cpath, object);\n\n\tplot_dirs.erase(path);\n\treload();\n}\n\nvoid Harvester::update()\n{\n\tfarmer_async->get_mac_addr(\n\t\t[this](const vnx::Hash64& mac) {\n\t\t\tfarmer_addr = mac;\n\t\t},\n\t\t[this](const std::exception& ex) {\n\t\t\tlog(WARN) << \"Failed to contact farmer: \" << ex.what();\n\t\t});\n\n\tstd::vector<addr_t> pool_nfts;\n\tfor(const auto& entry : plot_nfts) {\n\t\tif(entry.second.server_url) {\n\t\t\tpool_nfts.push_back(entry.first);\n\t\t}\n\t}\n\tfarmer_async->get_partial_diffs(pool_nfts,\n\t\t[this](const std::map<addr_t, uint64_t>& new_diff) {\n\t\t\tfor(const auto& entry : new_diff) {\n\t\t\t\tif(entry.second != partial_diff[entry.first]) {\n\t\t\t\t\tlog(INFO) << \"New partial difficulty: \" << entry.second << \" (\" << entry.first << \")\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tpartial_diff = new_diff;\n\t\t});\n\n\tpublish(get_farm_info(), output_info);\n}\n\nvoid Harvester::update_nfts()\n{\n\tstd::set<addr_t> missing;\n\tfor(const auto& entry : plot_nfts) {\n\t\tmissing.insert(entry.first);\n\t}\n\tauto job = std::make_shared<size_t>(plot_contract_set.size());\n\n\tfor(const auto& entry : plot_contract_set) {\n\t\tconst auto& address = entry.first;\n\t\tnode_async->get_plot_nft_info(address,\n\t\t\t[this, job, address](const vnx::optional<plot_nft_info_t>& info) {\n\t\t\t\tif(info) {\n\t\t\t\t\tif(!plot_nfts.count(address)) {\n\t\t\t\t\t\tlog(INFO) << \"Found PlotNFT \" << (info->name.empty() ? info->address.to_string() : \"'\" + info->name + \"'\")\n\t\t\t\t\t\t\t\t<< \": is_locked = \" << vnx::to_string(info->is_locked)\n\t\t\t\t\t\t\t\t<< \", server_url = \" << vnx::to_string(info->server_url);\n\t\t\t\t\t}\n\t\t\t\t\tplot_nfts[address] = *info;\n\t\t\t\t}\n\t\t\t\tif(--(*job) == 0) {\n\t\t\t\t\tupdate();\n\t\t\t\t\tset_timeout_millis(2000, std::bind(&Harvester::update, this));\n\t\t\t\t}\n\t\t\t},\n\t\t\t[this, address](const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"Failed to query PlotNFT \" << address.to_string() << \" due to: \" << ex.what();\n\t\t\t});\n\t\tmissing.erase(address);\n\t}\n\tfor(const auto& address : missing) {\n\t\tplot_nfts.erase(address);\n\t}\n}\n\nvoid Harvester::http_request_async(\tstd::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\t\tconst vnx::request_id_t& request_id) const\n{\n\thttp->http_request(request, sub_path, request_id, vnx_request->session);\n}\n\nvoid Harvester::http_request_chunk_async(\tstd::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\t\t\t\tconst int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& request_id) const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Node.cpp",
    "content": "/*\n * Node.cpp\n *\n *  Created on: Dec 7, 2021\n *      Author: mad\n */\n\n#include <mmx/Node.h>\n#include <mmx/Challenge.hxx>\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/ProofOfSpaceNFT.hxx>\n#include <mmx/contract/Binary.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/FarmerClient.hxx>\n#include <mmx/utils.h>\n#include <mmx/helpers.h>\n#include <mmx/vm/Engine.h>\n#include <mmx/vm_interface.h>\n#include <mmx/Router.h>\n\n#include <vnx/vnx.h>\n\n#include <tuple>\n#include <atomic>\n#include <algorithm>\n\n#ifdef WITH_JEMALLOC\n#include <jemalloc/jemalloc.h>\n#endif\n\n\nnamespace mmx {\n\nNode::Node(const std::string& _vnx_name)\n\t:\tNodeBase(_vnx_name)\n{\n\tparams = mmx::get_params();\n}\n\nvoid Node::init()\n{\n\tvnx::open_pipe(vnx_name, this, max_queue_ms);\n}\n\nvoid Node::main()\n{\n\tvnx::read_config(\"build.version\", node_version);\n\tvnx::read_config(\"build.commit\", node_commit);\n\n#ifdef WITH_OPENCL\n\tcl_context opencl_context = nullptr;\n\ttry {\n\t\tstd::string platform_name;\n\t\tvnx::read_config(\"opencl.platform\", platform_name);\n\n\t\tconst auto platforms = automy::basic_opencl::get_platforms();\n\n\t\tstruct device_t {\n\t\t\tint index = 0;\n\t\t\tstd::string name;\n\t\t\tstd::string platform;\n\t\t\tcl_device_id device_id;\n\t\t\tcl_platform_id platform_id;\n\t\t};\n\t\tstd::vector<device_t> list;\n\t\tint listsel = -1;\n\n\t\tfor(const auto idp : platforms) {\n\t\t\tconst auto devices = automy::basic_opencl::get_devices(idp, CL_DEVICE_TYPE_GPU);\n\t\t\tconst auto platform = automy::basic_opencl::get_platform_name(idp);\n\t\t\tfor(const auto idd : devices) {\n\t\t\t\tint device_index = 0;\n\t\t\t\tconst auto name = automy::basic_opencl::get_device_name(idd);\n\t\t\t\tfor(const auto& device : list) {\n\t\t\t\t\tif(device.name == name) {\n\t\t\t\t\t\tdevice_index++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlist.push_back({device_index, name, platform, idd, idp});\n\t\t\t\tlog(INFO) << \"Found OpenCL GPU device '\" << name << \"' [\" << device_index << \"] (\" << platform << \")\";\n\t\t\t}\n\t\t}\n\n\t\tstd::vector<std::pair<std::string, int>> device_list;\n\t\tfor(const auto& device : list) {\n\t\t\tdevice_list.emplace_back(device.name, device.index);\n\t\t}\n\t\tvnx::write_config(\"Node.opencl_device_list\", device_list);\n\n\t\tif(opencl_device >= 0) {\n\t\t\tif(list.size()) {\n\t\t\t\tif(!opencl_device_name.empty()) {\n\t\t\t\t\tfor(size_t i = 0; i < list.size() && listsel < 0; ++i) {\n\t\t\t\t\t\tif(opencl_device_name == list[i].name && opencl_device == list[i].index) {\n\t\t\t\t\t\t\tlistsel = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif(platform_name.empty()) {\n\t\t\t\t\t\tplatform_name = list[0].platform;\n\t\t\t\t\t}\n\t\t\t\t\tint devidx = -1;\n\t\t\t\t\tfor(size_t i = 0; i < list.size() && listsel < 0; ++i) {\n\t\t\t\t\t\tif(platform_name == list[i].platform) {\n\t\t\t\t\t\t\tdevidx++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(devidx >= opencl_device) {\n\t\t\t\t\t\t\tlistsel = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(listsel >= 0) {\n\t\t\t\t\tconst auto& device = list[listsel];\n\t\t\t\t\topencl_context = automy::basic_opencl::create_context(device.platform_id, {device.device_id});\n\n\t\t\t\t\t// TODO: optimize vdf_verify_max_pending according to GPU size\n\t\t\t\t\tfor(uint32_t i = 0; i < max_vdf_verify_pending; ++i) {\n\t\t\t\t\t\topencl_vdf.push_back(std::make_shared<OCL_VDF>(opencl_context, device.device_id));\n\t\t\t\t\t}\n\t\t\t\t\tlog(INFO) << \"Using OpenCL GPU device '\" << device.name << \"' [\" << device.index << \"] (\" << device.platform << \")\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlog(WARN) << \"No such OpenCL GPU device '\" << opencl_device_name << \"' [\" << opencl_device << \"]\";\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlog(INFO) << \"No OpenCL devices found\";\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tlog(INFO) << \"No OpenCL device used (disabled)\";\n\t\t}\n\t\tvnx::write_config(\"Node.opencl_device_select\", listsel);\n\t}\n\tcatch(const std::exception& ex) {\n\t\tlog(WARN) << \"Failed to create OpenCL GPU context: \" << ex.what();\n\t}\n#endif\n\n\tif(opencl_vdf.size()) {\n\t\topencl_vdf_enable = true;\n\t} else {\n\t\tmax_vdf_verify_pending = 1;\n\t}\n\tthreads = std::make_shared<vnx::ThreadPool>(num_threads);\n\tapi_threads = std::make_shared<vnx::ThreadPool>(num_api_threads);\n\tvdf_threads = std::make_shared<vnx::ThreadPool>(max_vdf_verify_pending);\n\tfetch_threads = std::make_shared<vnx::ThreadPool>(2);\n\n\trouter = std::make_shared<RouterAsyncClient>(router_name);\n\thttp = std::make_shared<vnx::addons::HttpInterface<Node>>(this, vnx_name);\n\tadd_async_client(router);\n\tadd_async_client(http);\n\n\tvnx::Directory(storage_path).create();\n\tvnx::Directory(database_path).create();\n\n\tconst auto time_begin = get_time_ms();\n\t{\n\t\tdb = std::make_shared<DataBase>(num_db_threads);\n\n\t\tdb->open_async(txio_log, database_path + \"txio_log\");\n\t\tdb->open_async(exec_log, database_path + \"exec_log\");\n\t\tdb->open_async(memo_log, database_path + \"memo_log\");\n\n\t\tdb->open_async(contract_map, database_path + \"contract_map\");\n\t\tdb->open_async(contract_log, database_path + \"contract_log\");\n\t\tdb->open_async(contract_depends, database_path + \"contract_depends\");\n\t\tdb->open_async(deploy_map, database_path + \"deploy_map\");\n\t\tdb->open_async(owner_map, database_path + \"owner_map\");\n\t\tdb->open_async(swap_index, database_path + \"swap_index\");\n\t\tdb->open_async(offer_index, database_path + \"offer_index\");\n\t\tdb->open_async(trade_log, database_path + \"trade_log\");\n\t\tdb->open_async(trade_index, database_path + \"trade_index\");\n\t\tdb->open_async(swap_liquid_map, database_path + \"swap_liquid_map\");\n\n\t\tdb->open_async(tx_log, database_path + \"tx_log\");\n\t\tdb->open_async(tx_index, database_path + \"tx_index\");\n\t\tdb->open_async(height_map, database_path + \"height_map\");\n\t\tdb->open_async(balance_table, database_path + \"balance_table\");\n\t\tdb->open_async(farmer_block_map, database_path + \"farmer_block_map\");\n\t\tdb->open_async(total_supply_map, database_path + \"total_supply_map\");\n\n\t\tdb->sync();\n\t\tdb->recover();\n\t}\n\t{\n\t\tdb_blocks = std::make_shared<DataBase>(2);\n\n\t\tdb_blocks->open_async(block_index, database_path + \"block_index\");\n\t\tdb_blocks->open_async(height_index, database_path + \"height_index\");\n\n\t\tdb_blocks->sync();\n\t\tdb_blocks->recover();\n\t}\n\tstorage = std::make_shared<vm::StorageDB>(database_path, db);\n\n\tstorage->read_balance = [this](const addr_t& address, const addr_t& currency) -> std::unique_ptr<uint128> {\n\t\tuint128 value = 0;\n\t\tif(balance_table.find(std::make_pair(address, currency), value)) {\n\t\t\treturn std::make_unique<uint128>(value);\n\t\t}\n\t\treturn nullptr;\n\t};\n\n\tblocks = std::make_shared<vnx::File>(database_path + \"blocks.dat\");\n\t{\n\t\tconst auto height = std::min(db->min_version(), revert_height);\n\t\trevert(height);\n\t\treset();\n\n\t\tlog(INFO) << \"Loaded DB at height \" << get_height() << \", \" << mmx_address_count << \" addresses, \"\n\t\t\t\t<< farmer_ranking.size() << \" farmers, took \" << (get_time_ms() - time_begin) / 1e3 << \" sec\";\n\t}\n\n\tif(vdf_slave_mode) {\n\t\tsubscribe(input_vdf_points, max_queue_ms);\n\t} else {\n\t\tsubscribe(input_vdfs, max_queue_ms);\n\t}\n\tsubscribe(input_proof, max_queue_ms);\n\tsubscribe(input_votes, max_queue_ms);\n\tsubscribe(input_blocks, max_queue_ms);\n\tsubscribe(input_transactions, max_queue_ms);\n\tsubscribe(input_timelord_vdfs, max_queue_ms);\n\tsubscribe(input_harvester_proof, max_queue_ms);\n\tsubscribe(output_votes, max_queue_ms);\n\n\tset_timer_millis(60 * 1000, std::bind(&Node::print_stats, this));\n\tset_timer_millis(30 * 1000, std::bind(&Node::purge_tx_pool, this));\n\tset_timer_millis(3600 * 1000, std::bind(&Node::update_control, this));\n\tset_timer_millis(validate_interval_ms, std::bind(&Node::validate_new, this));\n\n\tupdate_timer = set_timer_millis(update_interval_ms, std::bind(&Node::update, this));\n\tstuck_timer = set_timer_millis(sync_loss_delay * 1000, std::bind(&Node::on_stuck_timeout, this));\n\n\tif(run_tests) {\n\t\tis_synced = true;\n\t\tconst auto state = state_hash;\n\t\tconst auto version = db_blocks->version();\n\t\tbool failed = false;\n\t\ttry {\n\t\t\ttest_all();\n\t\t} catch(const std::exception& ex) {\n\t\t\tfailed = true;\n\t\t\tlog(WARN) << \"Test failed with: \" << ex.what();\n\t\t}\n\t\tdb_blocks->revert(version);\n\t\tfork_to(state);\n\t\tif(failed) {\n\t\t\treturn;\n\t\t}\n\t\treset();\n\t\tis_synced = false;\n\t}\n\n\tvnx::Handle<mmx::Router> router = new mmx::Router(\"Router\");\n\trouter->node_server = vnx_name;\n\trouter->storage_path = storage_path;\n\trouter.start();\n\n\tif(do_sync) {\n\t\tstart_sync(true);\n\t} else {\n\t\tis_synced = true;\n\t}\n\tupdate();\n\n\tSuper::main();\n\n\tblocks->close();\n\tthreads->close();\n\tapi_threads->close();\n\tvdf_threads->close();\n\tfetch_threads->close();\n\n\topencl_vdf.clear();\n\n#ifdef WITH_OPENCL\n\tOCL_VDF::release();\n\tautomy::basic_opencl::release_context(opencl_context);\n#endif\n}\n\nvoid Node::init_chain()\n{\n\tauto block = Block::create();\n\tblock->nonce = params->port;\n\tblock->time_stamp = params->initial_time_stamp;\n\tblock->time_diff = params->initial_time_diff * params->time_diff_divider;\n\tblock->space_diff = params->initial_space_diff;\n\tblock->vdf_output = hash_t(\"MMX/\" + params->network + \"/vdf/0\");\n\tblock->challenge = hash_t(\"MMX/\" + params->network + \"/challenge/0\");\n\n\tconst bool is_mainnet = params->network == \"mainnet\";\n\tif(is_mainnet) {\n\t\tstd::shared_ptr<const Transaction> tx_rewards;\n\t\tvnx::from_string(read_file(\"data/\" + params->network + \"/tx_testnet_rewards.json\"), tx_rewards);\n\t\tif(!tx_rewards) {\n\t\t\tthrow std::logic_error(\"failed to read testnet rewards\");\n\t\t}\n\t\tblock->tx_list.push_back(tx_rewards);\n\n\t\tuint64_t total_rewards = 0;\n\t\tfor(const auto& out : tx_rewards->outputs) {\n\t\t\ttotal_rewards += out.amount;\n\t\t}\n\t\tlog(INFO) << \"Total testnet rewards: \" << total_rewards / 1000000 << \" MMX\";\n\t}\n\n\tblock->tx_list.push_back(vnx::read_from_file<Transaction>(\"data/\" + params->network + \"/tx_offer_binary.dat\"));\n\tblock->tx_list.push_back(vnx::read_from_file<Transaction>(\"data/\" + params->network + \"/tx_swap_binary.dat\"));\n\tblock->tx_list.push_back(vnx::read_from_file<Transaction>(\"data/\" + params->network + \"/tx_token_binary.dat\"));\n\tblock->tx_list.push_back(vnx::read_from_file<Transaction>(\"data/\" + params->network + \"/tx_plot_nft_binary.dat\"));\n\tblock->tx_list.push_back(vnx::read_from_file<Transaction>(\"data/\" + params->network + \"/tx_nft_binary.dat\"));\n\tblock->tx_list.push_back(vnx::read_from_file<Transaction>(\"data/\" + params->network + \"/tx_template_binary.dat\"));\n\tblock->tx_list.push_back(vnx::read_from_file<Transaction>(\"data/\" + params->network + \"/tx_escrow_binary.dat\"));\n\tblock->tx_list.push_back(vnx::read_from_file<Transaction>(\"data/\" + params->network + \"/tx_time_lock_binary.dat\"));\n\tblock->tx_list.push_back(vnx::read_from_file<Transaction>(\"data/\" + params->network + \"/tx_relay_binary.dat\"));\n\n\tif(is_mainnet) {\n\t\tif(auto tx = vnx::read_from_file<Transaction>(\"data/\" + params->network + \"/tx_project_relay.dat\")) {\n\t\t\tauto exec = std::dynamic_pointer_cast<const contract::Executable>(tx->deploy);\n\t\t\tif(!tx->is_valid(params) || !tx->sender || tx->expires != 0xFFFFFFFF || !exec || exec->binary != params->relay_binary) {\n\t\t\t\tthrow std::logic_error(\"invalid tx_project_relay\");\n\t\t\t}\n\t\t\tblock->project_addr = tx->id;\n\t\t} else {\n\t\t\tthrow std::logic_error(\"failed to load tx_project_relay\");\n\t\t}\n\t} else {\n\t\tblock->project_addr = addr_t(\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\");\n\t}\n\n\tfor(auto tx : block->tx_list) {\n\t\tif(!tx) {\n\t\t\tthrow std::logic_error(\"failed to load genesis transaction\");\n\t\t}\n\t\tif(tx->network != params->network) {\n\t\t\tthrow std::logic_error(\"invalid genesis transaction\");\n\t\t}\n\t}\n\tblock->finalize();\n\tblock->content_hash = block->calc_content_hash();\n\n\tif(!block->is_valid()) {\n\t\tthrow std::logic_error(\"invalid genesis block\");\n\t}\n\tapply(block, nullptr);\n\tcommit(block);\n\n\tlog(INFO) << \"Initialized chain with hash \" << block->hash;\n}\n\nvoid Node::trigger_update()\n{\n\tif(!update_pending) {\n\t\tupdate_pending = true;\n\t\tadd_task(std::bind(&Node::update, this));\n\t}\n}\n\nvoid Node::add_block(std::shared_ptr<const Block> block)\n{\n\ttry {\n\t\tif(!block->is_valid()) {\n\t\t\tthrow std::logic_error(\"invalid block\");\n\t\t}\n\t\t// need to verify farmer_sig before adding to fork tree\n\t\tblock->validate();\n\t}\n\tcatch(const std::exception& ex) {\n\t\tlog(WARN) << \"Pre-validation failed for a block at height \" << block->height << \": \" << ex.what();\n\t\treturn;\n\t}\n\n\tconst auto root = get_root();\n\tif(block->height <= root->height) {\n\t\twrite_block(block, false);\n\t\treturn;\n\t}\n\tauto fork = std::make_shared<fork_t>();\n\tfork->block = block;\n\tadd_fork(fork);\n\n\tif(is_synced) {\n\t\ttrigger_update();\n\t}\n}\n\nvoid Node::add_fork(std::shared_ptr<fork_t> fork)\n{\n\tconst auto root = get_root();\n\tconst auto block = fork->block;\n\tif(block->height <= root->height) {\n\t\treturn;\n\t}\n\tif(!fork->recv_time_ms) {\n\t\tfork->recv_time_ms = get_time_ms();\n\t}\n\tfork->prev = find_fork(block->prev);\n\n\tif(fork_tree.emplace(block->hash, fork).second) {\n\t\tfork_index.emplace(block->height, fork);\n\t}\n}\n\nvoid Node::add_transaction(std::shared_ptr<const Transaction> tx, const vnx::bool_t& pre_validate)\n{\n\tif(tx->exec_result) {\n\t\tauto tmp = vnx::clone(tx);\n\t\ttmp->reset(params);\n\t\ttx = tmp;\n\t}\n\tif(pre_validate) {\n\t\tif(!is_synced) {\n\t\t\tthrow std::logic_error(\"not synced\");\n\t\t}\n\t\tconst auto res = validate(tx);\n\t\tif(res.did_fail) {\n\t\t\tthrow std::runtime_error(res.get_error_msg());\n\t\t}\n\t}\n\tif(tx_queue.size() < max_tx_queue) {\n\t\t// Note: tx->is_valid() already checked by Router\n\t\ttx_queue[tx->content_hash] = tx;\n\t}\n\tif(!vnx_sample) {\n\t\tpublish(tx, output_transactions);\n\t}\n}\n\nvoid Node::handle(std::shared_ptr<const Block> block)\n{\n\tif(is_synced || sync_peak) {\n\t\tadd_block(block);\n\t}\n}\n\nvoid Node::handle(std::shared_ptr<const Transaction> tx)\n{\n\tif(is_synced) {\n\t\tadd_transaction(tx);\n\t}\n}\n\nvoid Node::handle(std::shared_ptr<const ProofOfTime> value)\n{\n\tvdf_queue.emplace_back(value, get_time_ms());\n\ttrigger_update();\n}\n\nvoid Node::handle(std::shared_ptr<const VDF_Point> value)\n{\n\tif(value->vdf_height > get_vdf_height()) {\n\t\tlog(INFO) << \"-------------------------------------------------------------------------------\";\n\t}\n\tif(find_vdf_point(value->input, value->output)) {\n\t\treturn;\t\t// duplicate\n\t}\n\tconst auto vdf_iters = value->start + value->num_iters;\n\tvdf_index.emplace(vdf_iters, value);\n\tvdf_tree.emplace(value->output, value);\n\n\tlog(INFO) << u8\"\\U0001F552 Received VDF point for height \" << value->vdf_height;\n\n\ttrigger_update();\n}\n\nvoid Node::handle(std::shared_ptr<const ProofResponse> value)\n{\n\tproof_queue.emplace_back(value, get_time_ms());\n}\n\nvoid Node::handle(std::shared_ptr<const ValidatorVote> value)\n{\n\tif(!value->is_valid()) {\n\t\treturn;\n\t}\n\tvote_queue.emplace_back(value, get_time_ms());\n\t// verify immediately to speed up relay\n\tverify_votes();\n}\n\n#ifdef WITH_JEMALLOC\nstatic void malloc_stats_callback(void* file, const char* data) {\n\tfwrite(data, 1, strlen(data), (FILE*)file);\n}\n#endif\n\nvoid Node::print_stats()\n{\n#ifdef WITH_JEMALLOC\n\tstatic size_t counter = 0;\n\tif(counter++ % 3 == 0) {\n\t\tconst std::string path = storage_path + \"node_malloc_info.txt\";\n\t\tFILE* file = fopen(path.c_str(), \"w\");\n\t\tmalloc_stats_print(&malloc_stats_callback, file, 0);\n\t\tfclose(file);\n\t}\n#endif\n\t{\n\t\tstd::ofstream file(storage_path + \"timelord_trust.txt\", std::ios::trunc);\n\t\tfor(const auto& entry : timelord_trust) {\n\t\t\tfile << entry.first << \"\\t\" << entry.second << std::endl;\n\t\t}\n\t}\n\tlog(INFO) << fork_tree.size() << \" blocks in memory, \"\n\t\t\t<< tx_pool.size() << \" tx pool, \" << tx_pool_fees.size() << \" tx senders\";\n}\n\nvoid Node::on_stuck_timeout()\n{\n\tif(is_synced) {\n\t\tlog(WARN) << \"Lost sync due to progress timeout!\";\n\t}\n\tstart_sync(false);\n}\n\nvoid Node::start_sync(const vnx::bool_t& force)\n{\n\tif((!is_synced || !do_sync) && !force) {\n\t\treturn;\n\t}\n\t{\n\t\tstd::unique_lock lock(db_mutex);\n\t\tis_synced = false;\n\t}\n\tsync_pos = 0;\n\tsync_peak = nullptr;\n\tsync_retry = 0;\n\tsync_more();\n}\n\nvoid Node::revert_sync(const uint32_t& height)\n{\n\tif(height <= get_root()->height) {\n\t\tlog(WARN) << \"Reverting to height \" << height << \" ...\";\n\t\trevert(height);\n\t\treset();\n\t}\n\tstart_sync(true);\n}\n\nvoid Node::sync_more()\n{\n\tif(is_synced) {\n\t\treturn;\n\t}\n\tconst auto root = get_root();\n\n\tif(!sync_pos) {\n\t\tsync_pos = root->height + 1;\n\t\tsync_start = sync_pos;\n\t\tlog(INFO) << \"Starting sync at height \" << sync_pos;\n\t}\n\tif(sync_pos > root->height && sync_pos - root->height > params->commit_delay + max_sync_ahead) {\n\t\treturn;\t\t// limit blocks in memory during sync\n\t}\n\tconst size_t max_pending = sync_retry ? 2 : std::max(std::min<int>(max_sync_pending, max_sync_jobs), 4);\n\n\twhile(sync_pending.size() < max_pending && (!sync_peak || sync_pos < *sync_peak)) {\n\t\tsync_height(sync_pos++);\n\t}\n}\n\nvoid Node::sync_height(const uint32_t& height)\n{\n\tsync_pending.insert(height);\n\trouter->get_blocks_at(height,\n\t\t\tstd::bind(&Node::sync_result, this, height, std::placeholders::_1),\n\t\t\t[this, height](const vnx::exception& ex) {\n\t\t\t\tsync_pos = std::min(sync_pos, height);\t// reset, try again\n\t\t\t\tsync_pending.erase(height);\n\t\t\t\tlog(WARN) << \"get_blocks_at() failed with: \" << ex.what();\n\t\t\t});\n}\n\nvoid Node::sync_result(const uint32_t& height, const std::vector<std::shared_ptr<const Block>>& result)\n{\n\tsync_pending.erase(height);\n\n\t// filter out blocks too far into the future\n\t// prevent extension attack with invalid VDFs during sync\n\tconst auto max_time_stamp = get_time_ms() + max_future_sync * params->block_interval_ms;\n\n\tstd::vector<std::shared_ptr<const Block>> blocks;\n\tfor(auto block : result) {\n\t\tif(block->time_stamp < max_time_stamp) {\n\t\t\tblocks.push_back(block);\n\t\t} else {\n\t\t\tlog(WARN) << \"Block at height \" << block->height\n\t\t\t\t\t<< \" is too far in the future: \" << vnx::get_date_string(false, block->time_stamp);\n\t\t}\n\t}\n\n\tuint64_t total_size = 0;\n\tfor(auto block : blocks) {\n\t\tadd_block(block);\n\t\ttotal_size += block->static_cost;\n\t}\n\n\tif(height == sync_start) {\n\t\tfor(auto block : blocks) {\n\t\t\tif(!find_prev(block)) {\n\t\t\t\tif(sync_start > 1) {\n\t\t\t\t\tsync_height(--sync_start);\t// walk back in case we missed blocks before\n\t\t\t\t\tlog(WARN) << \"Syncing backwards to height \" << sync_start << \" ...\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlog(DEBUG) << \"Sync connected to our chain at height \" << height << \", hash \" << block->hash;\n\t\t\t}\n\t\t}\n\t}\n\t{\n\t\tconst auto value = max_sync_jobs * (1 - std::min<double>(total_size / double(params->max_block_size), 1));\n\t\tmax_sync_pending = value * 0.1 + max_sync_pending * 0.9;\n\t}\n\tif(!is_synced) {\n\t\tif(blocks.empty()) {\n\t\t\tif(!sync_peak || height < *sync_peak) {\n\t\t\t\tsync_peak = height;\n\t\t\t}\n\t\t}\n\t\tif((height % max_sync_jobs == 0 || sync_pending.empty()) && !sync_retry) {\n\t\t\tupdate();\n\t\t} else {\n\t\t\tsync_more();\n\t\t}\n\t}\n}\n\nvoid Node::fetch_block(const hash_t& hash)\n{\n\tif(!fetch_pending.insert(hash).second) {\n\t\treturn;\n\t}\n\trouter->fetch_block(hash, nullptr,\n\t\t\tstd::bind(&Node::fetch_result, this, hash, std::placeholders::_1),\n\t\t\t[this, hash](const vnx::exception& ex) {\n\t\t\t\tlog(WARN) << \"Fetching block \" << hash << \" failed with: \" << ex.what();\n\t\t\t\tfetch_pending.erase(hash);\n\t\t\t});\n}\n\nvoid Node::fetch_result(const hash_t& hash, std::shared_ptr<const Block> block)\n{\n\tif(block) {\n\t\tadd_block(block);\n\t}\n\tfetch_pending.erase(hash);\n}\n\nstd::shared_ptr<const BlockHeader> Node::fork_to(const hash_t& state)\n{\n\tif(state == state_hash) {\n\t\treturn nullptr;\n\t}\n\tif(auto fork = find_fork(state)) {\n\t\treturn fork_to(fork);\n\t}\n\tconst auto root = get_root();\n\tif(state == root->hash) {\n\t\trevert(root->height + 1);\n\t\treturn nullptr;\n\t}\n\tthrow std::logic_error(\"cannot fork to \" + state.to_string());\n}\n\nstd::shared_ptr<const BlockHeader> Node::fork_to(std::shared_ptr<fork_t> peak)\n{\n\tconst auto prev_state = state_hash;\n\tconst auto fork_line = get_fork_line(peak);\n\n\tif(fork_line.empty()) {\n\t\treturn nullptr;\n\t}\n\tbool did_fork = false;\n\tstd::shared_ptr<const BlockHeader> forked_at;\n\n\tconst auto root_hash = fork_line[0]->block->prev;\n\tif(root_hash != root->hash) {\n\t\tdid_fork = true;\n\t\tlog(WARN) << \"Performing deep fork ...\";\n\t\tconst auto time_begin = get_time_ms();\n\t\tconst auto new_root = get_header(root_hash);\n\t\tif(!new_root) {\n\t\t\tthrow std::logic_error(\"missing alternate root\");\n\t\t}\n\t\ttry {\n\t\t\tforked_at = new_root;\n\t\t\tstd::vector<hash_t> list;\n\t\t\twhile(forked_at) {\n\t\t\t\thash_t hash;\n\t\t\t\tif(height_map.find(forked_at->height, hash) && hash == forked_at->hash) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tlist.push_back(forked_at->hash);\n\t\t\t\tforked_at = find_prev(forked_at);\n\t\t\t}\n\t\t\tif(!forked_at) {\n\t\t\t\tthrow std::logic_error(\"cannot find fork point\");\n\t\t\t}\n\t\t\tstd::reverse(list.begin(), list.end());\n\n\t\t\tlog(WARN) << \"Reverting to height \" << forked_at->height << \" ...\";\n\n\t\t\trevert(forked_at->height + 1);\n\n\t\t\tfor(const auto& hash : list) {\n\t\t\t\tif(auto block = get_block(hash)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tverify_proof(block);\t// need to verify proofs again (in case of backwards sync)\n\t\t\t\t\t\tapply(block, validate(block));\n\t\t\t\t\t}\n\t\t\t\t\tcatch(const std::exception& ex) {\n\t\t\t\t\t\tlog(WARN) << \"Block validation failed for height \" << block->height << \" with: \" << ex.what();\n\t\t\t\t\t\tthrow std::logic_error(\"validation failed\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"failed to read block\");\n\t\t\t\t}\n\t\t\t}\n\t\t\troot = new_root;\n\n\t\t\tlog(INFO) << \"Deep fork to new root at height \" << root->height << \" took \"\n\t\t\t\t\t<< (get_time_ms() - time_begin) / 1e3 << \" sec\";\n\t\t}\n\t\tcatch(const std::exception& ex) {\n\t\t\tlog(WARN) << \"Failed to apply alternate fork: \" << ex.what();\n\n\t\t\t// restore old peak\n\t\t\tstd::vector<std::shared_ptr<const Block>> blocks;\n\t\t\thash_t hash = prev_state;\n\t\t\twhile(auto block = get_block(hash)) {\n\t\t\t\tblocks.push_back(block);\n\t\t\t\tif(block->prev == state_hash) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\thash = block->prev;\n\t\t\t}\n\t\t\tstd::reverse(blocks.begin(), blocks.end());\n\n\t\t\tfor(auto block : blocks) {\n\t\t\t\tapply(block, validate(block));\n\t\t\t}\n\t\t\treset();\n\n\t\t\t// don't try this fork again\n\t\t\tfor(auto fork : fork_line) {\n\t\t\t\tif(auto new_fork = find_fork(fork->block->hash)) {\n\t\t\t\t\tnew_fork->is_invalid = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(auto peak = get_peak()) {\n\t\t\t\tlog(INFO) << \"Restored old peak at height \" << peak->height;\n\t\t\t}\n\t\t\tthrow;\n\t\t}\n\t} else {\n\t\t// normal in-memory fork\n\t\tstd::set<hash_t> main_set;\n\t\tfor(const auto& fork : get_fork_line()) {\n\t\t\tmain_set.insert(fork->block->hash);\n\t\t}\n\n\t\tforked_at = root;\n\t\tfor(const auto& fork : fork_line) {\n\t\t\tconst auto& block = fork->block;\n\t\t\tif(main_set.count(block->hash)) {\n\t\t\t\tforked_at = block;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(forked_at->hash != state_hash) {\n\t\t\tdid_fork = true;\n\t\t\trevert(forked_at->height + 1);\n\t\t}\n\t}\n\n\t// verify and apply\n\tfor(const auto& fork : fork_line)\n\t{\n\t\tconst auto& block = fork->block;\n\t\tif(block->prev != state_hash) {\n\t\t\t// already verified and applied\n\t\t\tcontinue;\n\t\t}\n\t\tif(!fork->is_validated) {\n\t\t\ttry {\n\t\t\t\tfork->context = validate(block);\n\t\t\t\tfork->is_validated = true;\n\t\t\t}\n\t\t\tcatch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"Block validation failed for height \" << block->height << \" with: \" << ex.what();\n\t\t\t\tfork->is_invalid = true;\n\t\t\t\tfork_to(prev_state);\n\t\t\t\tthrow std::logic_error(\"validation failed\");\n\t\t\t}\n\t\t\tif(is_synced) {\n\t\t\t\tfor(auto point : fork->vdf_points) {\n\t\t\t\t\tpublish(point->proof, output_verified_vdfs);\n\t\t\t\t}\n\t\t\t\tpublish(block, output_verified_blocks);\n\t\t\t}\n\t\t}\n\t\tapply(block, fork->context);\n\t}\n\treturn did_fork ? forked_at : nullptr;\n}\n\nstd::shared_ptr<Node::fork_t> Node::find_best_fork() const\n{\n\tconst auto root = get_root();\n\n\tstd::shared_ptr<fork_t> best;\n\tfor(auto iter = fork_index.upper_bound(root->height); iter != fork_index.end(); ++iter)\n\t{\n\t\tconst auto& fork = iter->second;\n\t\tconst auto& block = fork->block;\n\t\tconst auto  prev = fork->prev.lock();\n\n\t\tif(block->height == root->height + 1) {\n\t\t\tfork->root = find_prev(block);\n\t\t\tfork->total_votes = fork->votes;\n\t\t\tfork->is_all_proof_verified = fork->is_proof_verified;\n\t\t} else if(prev) {\n\t\t\tfork->root = prev->root;\n\t\t\tfork->is_invalid = prev->is_invalid || fork->is_invalid;\n\t\t\tfork->total_votes = prev->total_votes + fork->votes;\n\t\t\tfork->is_all_proof_verified = prev->is_all_proof_verified && fork->is_proof_verified;\n\t\t} else {\n\t\t\tfork->is_all_proof_verified = false;\n\t\t}\n\n\t\tif(fork->root && fork->root->hash != root->hash && !sync_pending.empty() && *sync_pending.begin() < root->height) {\n\t\t\tcontinue;\t// wait for backwards sync\n\t\t}\n\n\t\tif(fork->is_all_proof_verified && fork->root && !fork->is_invalid)\n\t\t{\n\t\t\tif(!best) {\n\t\t\t\tbest = fork;\n\t\t\t} else {\n\t\t\t\tconst auto is_deep_fork = fork->root->total_weight >  best->root->total_weight;\n\t\t\t\tconst auto is_same_root = fork->root->total_weight >= best->root->total_weight;\n\t\t\t\tconst auto cond_weight =  block->total_weight >= best->block->total_weight;\n\t\t\t\tconst auto cond_height =  block->height > best->block->height   ? 1 : (block->height == best->block->height ? 0 : -1);\n\t\t\t\tconst auto cond_votes =   fork->total_votes > best->total_votes ? 1 : (fork->total_votes == best->total_votes ? 0 : -1);\n\n\t\t\t\tif(cond_weight && is_deep_fork) {\n\t\t\t\t\tbest = fork;\t// higher peak and root weight (long range attack recovery)\n\t\t\t\t} else if(cond_weight || is_same_root) {\n\t\t\t\t\t// heavier peak or equal root\n\t\t\t\t\tif(cond_votes > 0) {\n\t\t\t\t\t\tbest = fork;\t// more total votes\n\t\t\t\t\t} else if(cond_votes == 0) {\n\t\t\t\t\t\t// same total votes\n\t\t\t\t\t\tif(cond_height > 0) {\n\t\t\t\t\t\t\tbest = fork;\t// longer chain (new block without votes)\n\t\t\t\t\t\t} else if(cond_height == 0) {\n\t\t\t\t\t\t\t// same peak height\n\t\t\t\t\t\t\tif(block->hash < best->block->hash) {\n\t\t\t\t\t\t\t\tbest = fork;\t// race condition (multiple blocks at same time, votes will make better proof win)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn best;\n}\n\nstd::vector<std::shared_ptr<Node::fork_t>> Node::get_fork_line(std::shared_ptr<fork_t> peak) const\n{\n\tconst auto root = get_root();\n\tif(!peak && state_hash == root->hash) {\n\t\treturn {};\n\t}\n\tstd::vector<std::shared_ptr<fork_t>> line;\n\tauto fork = peak ? peak : find_fork(state_hash);\n\twhile(fork) {\n\t\tline.push_back(fork);\n\t\tif(fork->block->height == root->height + 1 && find_prev(fork->block)) {\n\t\t\tstd::reverse(line.begin(), line.end());\n\t\t\treturn line;\n\t\t}\n\t\tfork = fork->prev.lock();\n\t}\n\tthrow std::logic_error(\"disconnected fork\");\n}\n\nvoid Node::vote_for_block(std::shared_ptr<fork_t> fork)\n{\n\tconst auto& block = fork->block;\n\tfor(const auto& entry : fork->validators)\n\t{\n\t\tconst auto& farmer_key = entry.first;\n\t\tif(auto farmer_mac = find_value(farmer_keys, farmer_key)) {\n\t\t\tauto vote = ValidatorVote::create();\n\t\t\tvote->hash = block->hash;\n\t\t\tvote->farmer_key = farmer_key;\n\t\t\ttry {\n\t\t\t\tvote->farmer_sig = FarmerClient(*farmer_mac).sign_vote(vote);\n\t\t\t\tvote->content_hash = vote->calc_content_hash();\n\t\t\t\tpublish(vote, output_votes);\n\t\t\t\tpublish(vote, output_verified_votes);\n\n\t\t\t\tif(voted_blocks.count(block->prev)) {\n\t\t\t\t\tlog(INFO) << \"Voted again for block at height \" << block->height << \": \" << vote->hash;\n\t\t\t\t} else {\n\t\t\t\t\tlog(INFO) << \"Voted for block at height \" << block->height << \": \" << vote->hash;\n\t\t\t\t}\n\t\t\t} catch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"Failed to sign vote for height \" << block->height << \": \" << ex.what();\n\t\t\t}\n\t\t\tvoted_blocks[block->prev] = std::make_pair(vote->hash, get_time_ms());\n\t\t}\n\t}\n}\n\nvoid Node::update_farmer_ranking()\n{\n\tstd::sort(farmer_ranking.begin(), farmer_ranking.end(),\n\t\t[](const std::pair<pubkey_t, uint32_t>& L, const std::pair<pubkey_t, uint32_t>& R) -> bool {\n\t\t\treturn L.second > R.second;\n\t\t});\n}\n\nvoid Node::commit(std::shared_ptr<const Block> block)\n{\n\tconst auto height = block->height;\n\tif(height) {\n\t\tconst auto root = get_root();\n\t\tif(block->prev != root->hash) {\n\t\t\tthrow std::logic_error(\"cannot commit height \" + std::to_string(height) + \" after \" + std::to_string(root->height));\n\t\t}\n\t}\n\tconst auto fork = find_fork(block->hash);\n\t{\n\t\tconst auto begin = challenge_map.begin();\n\t\tconst auto end = challenge_map.upper_bound(block->vdf_height);\n\t\tfor(auto iter = begin; iter != end; ++iter) {\n\t\t\tproof_map.erase(iter->second);\n\t\t}\n\t\tchallenge_map.erase(begin, end);\n\t}\n\t{\n\t\tconst auto begin = vdf_index.begin();\n\t\tconst auto end = vdf_index.upper_bound(block->vdf_iters);\n\t\tfor(auto iter = begin; iter != end; ++iter) {\n\t\t\tvdf_tree.erase(iter->second->output);\n\t\t}\n\t\tvdf_index.erase(begin, end);\n\t}\n\n\tfor(auto iter = fork_index.rbegin(); iter != fork_index.rend(); ++iter)\n\t{\n\t\tconst auto& fork = iter->second;\n\t\tif(auto prev = fork->prev.lock()) {\n\t\t\tprev->fork_length = std::max(prev->fork_length, fork->fork_length + 1);\n\t\t}\n\t}\n\tfork_tree.erase(block->hash);\n\n\tconst auto range = fork_index.equal_range(height);\n\tfor(auto iter = range.first; iter != range.second; ++iter)\n\t{\n\t\tconst auto& fork = iter->second;\n\t\tconst auto& block = fork->block;\n\t\tif(fork_tree.erase(block->hash) && fork->is_proof_verified) {\n\t\t\twrite_block(block, false);\n\t\t}\n\t}\n\tfork_index.erase(height);\n\n\troot = block;\t// update root at end\n\n\thistory[block->hash] = block->get_header();\n\thistory_log.emplace(height, block->hash);\n\n\t// purge history\n\tfor(auto iter = history_log.begin(); iter != history_log.end() && iter->first + max_history < height;) {\n\t\thistory.erase(iter->second);\n\t\titer = history_log.erase(iter);\n\t}\n\n\tif(is_synced) {\n\t\tstd::string ksize = \"N/A\";\n\t\tstd::string score = \"N/A\";\n\t\tif(height) {\n\t\t\tif(auto proof = std::dynamic_pointer_cast<const ProofOfSpaceOG>(block->proof[0])) {\n\t\t\t\tksize = std::to_string(proof->ksize);\n\t\t\t\tscore = std::to_string(proof->score);\n\t\t\t} else if(auto proof = std::dynamic_pointer_cast<const ProofOfSpaceNFT>(block->proof[0])) {\n\t\t\t\tksize = std::to_string(proof->ksize);\n\t\t\t\tscore = std::to_string(proof->score);\n\t\t\t}\n\t\t}\n\t\tNode::log(INFO)\n\t\t\t\t<< \"Committed height \" << height << \" with: ntx = \" << block->tx_list.size()\n\t\t\t\t<< \", k = \" << ksize << \", score = \" << score\n\t\t\t\t<< \", votes = \" << (fork ? fork->votes : 0) << \" of \" << (fork ? fork->validators.size() : 0)\n\t\t\t\t<< \", tdiff = \" << block->time_diff << \", sdiff = \" << block->space_diff;\n\t}\n\tpublish(block, output_committed_blocks, is_synced ? 0 : BLOCKING);\n}\n\nsize_t Node::prefetch_balances(const std::set<std::pair<addr_t, addr_t>>& keys) const\n{\n\tif(keys.size() < 64) {\n\t\treturn 0;\n\t}\n\tstd::atomic<size_t> total {0};\n\tfor(const auto& key : keys) {\n\t\tthreads->add_task([this, &key, &total]() {\n\t\t\ttotal += balance_table.count(key);\n\t\t});\n\t}\n\tthreads->sync();\n\treturn total;\n}\n\nvoid Node::apply(\tstd::shared_ptr<const Block> block,\n\t\t\t\t\tstd::shared_ptr<const execution_context_t> context)\n{\n\tif(block->prev != state_hash) {\n\t\tthrow std::logic_error(\"apply(): prev != state_hash\");\n\t}\n\ttry {\n\t\tuint32_t counter = 0;\n\t\tstd::vector<hash_t> tx_ids;\n\t\tstd::unordered_set<hash_t> tx_set;\n\t\tbalance_cache_t balance_cache(&balance_table);\n\n\t\tconst auto block_inputs = block->get_inputs(params);\n\t\tconst auto block_outputs = block->get_outputs(params);\n\t\t{\n\t\t\tstd::set<std::pair<addr_t, addr_t>> keys;\n\t\t\tfor(const auto& io : block_inputs) {\n\t\t\t\tkeys.emplace(io.address, io.contract);\n\t\t\t}\n\t\t\tfor(const auto& io : block_outputs) {\n\t\t\t\tkeys.emplace(io.address, io.contract);\n\t\t\t}\n\t\t\tprefetch_balances(keys);\n\t\t}\n\t\tstd::unordered_map<addr_t, uint128_t> supply_delta;\n\n\t\tfor(const auto& out : block_outputs)\n\t\t{\n\t\t\tif(out.memo) {\n\t\t\t\tconst auto key = hash_t(out.address + (*out.memo));\n\t\t\t\tmemo_log.insert(std::make_tuple(key, block->height, counter), out.address);\n\t\t\t}\n\t\t\ttxio_log.insert(std::make_tuple(out.address, block->height, counter), out);\n\t\t\tbalance_cache.get(out.address, out.contract) += out.amount;\n\t\t\tsupply_delta[out.contract] += out.amount;\n\t\t\tcounter++;\n\t\t}\n\t\tfor(const auto& in : block_inputs)\n\t\t{\n\t\t\tif(auto balance = balance_cache.find(in.address, in.contract)) {\n\t\t\t\tclamped_sub_assign(*balance, in.amount);\n\t\t\t}\n\t\t\tif(in.memo) {\n\t\t\t\tconst auto key = hash_t(in.address + (*in.memo));\n\t\t\t\tmemo_log.insert(std::make_tuple(key, block->height, counter), in.address);\n\t\t\t}\n\t\t\ttxio_log.insert(std::make_tuple(in.address, block->height, counter), in);\n\t\t\tclamped_sub_assign(supply_delta[in.contract], in.amount);\n\t\t\tcounter++;\n\t\t}\n\t\tfor(const auto& tx : block->get_transactions()) {\n\t\t\tif(tx) {\n\t\t\t\tif(!tx->exec_result || !tx->exec_result->did_fail) {\n\t\t\t\t\tapply(block, tx, counter);\n\t\t\t\t}\n\t\t\t\ttx_pool_erase(tx->id);\n\t\t\t\ttx_set.insert(tx->id);\n\t\t\t\ttx_ids.push_back(tx->id);\n\t\t\t}\n\t\t}\n\t\tif(!tx_ids.empty()) {\n\t\t\ttx_log.insert(block->height, tx_ids);\n\t\t}\n\n\t\tfor(auto iter = tx_queue.begin(); iter != tx_queue.end();) {\n\t\t\tif(tx_set.count(iter->second->id)) {\n\t\t\t\titer = tx_queue.erase(iter);\n\t\t\t} else {\n\t\t\t\titer++;\n\t\t\t}\n\t\t}\n\n\t\tfor(const auto& entry : balance_cache.balance) {\n\t\t\tbalance_table.insert(entry.first, entry.second);\n\t\t}\n\t\tfor(const auto& entry : supply_delta) {\n\t\t\tconst auto& currency = entry.first;\n\t\t\tconst auto& delta = entry.second;\n\t\t\tif(delta) {\n\t\t\t\tuint128 prev = 0;\n\t\t\t\ttotal_supply_map.find(currency, prev);\n\t\t\t\ttotal_supply_map.insert(currency, prev + delta);\n\t\t\t}\n\t\t}\n\n\t\tif(context) {\n\t\t\tif(auto storage = context->storage) {\n\t\t\t\tstorage->commit();\n\t\t\t} else {\n\t\t\t\tthrow std::logic_error(\"storage == nullptr\");\n\t\t\t}\n\t\t}\n\n\t\tif(block->height) {\n\t\t\tfarmed_block_info_t info;\n\t\t\tinfo.height = block->height;\n\t\t\tinfo.reward = block->reward_amount;\n\t\t\tinfo.reward_addr = (block->reward_addr ? *block->reward_addr : addr_t());\n\n\t\t\tconst auto& farmer_key = block->get_farmer_key();\n\t\t\tfarmer_block_map.insert(std::make_pair(farmer_key, block->height), info);\n\n\t\t\tbool found = false;\n\t\t\tfor(auto& entry : farmer_ranking) {\n\t\t\t\tif(entry.first == farmer_key) {\n\t\t\t\t\tentry.second++;\n\t\t\t\t\tfound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!found) {\n\t\t\t\tfarmer_ranking.emplace_back(farmer_key, 1);\n\t\t\t}\n\t\t\tupdate_farmer_ranking();\n\t\t}\n\n\t\twrite_block(block);\n\n\t\theight_map.insert(block->height, block->hash);\n\t\tcontract_cache.clear();\n\n\t\tstate_hash = block->hash;\n\n\t\tdb->commit(block->height + 1);\n\t}\n\tcatch(const std::exception& ex) {\n\t\ttry {\n\t\t\trevert(block->height);\n\t\t} catch(const std::exception& ex) {\n\t\t\tlog(ERROR) << \"revert() failed with: \" << ex.what();\n\t\t}\n\t\tthrow std::runtime_error(\"apply() failed with: \" + std::string(ex.what()));\n\t}\n}\n\nvoid Node::apply(\tstd::shared_ptr<const Block> block,\n\t\t\t\t\tstd::shared_ptr<const Transaction> tx,\n\t\t\t\t\tuint32_t& counter)\n{\n\tif(auto contract = tx->deploy)\n\t{\n\t\tconst auto ticket = counter++;\n\t\tauto type_hash = hash_t(contract->get_type_name());\n\n\t\tcontract_map.insert(tx->id, contract);\n\t\tcontract_log.insert(std::make_tuple(type_hash, block->height, ticket), tx->id);\n\n\t\tif(auto exec = std::dynamic_pointer_cast<const contract::Executable>(contract)) {\n\t\t\ttype_hash = exec->binary;\n\t\t\tif(exec->binary == params->offer_binary) {\n\t\t\t\tconst auto bid_currency = exec->get_arg(1).to<addr_t>();\n\t\t\t\tconst auto ask_currency = exec->get_arg(2).to<addr_t>();\n\t\t\t\toffer_index.insert(std::make_tuple(hash_t(ask_currency + \"ANY\"), block->height, ticket), tx->id);\n\t\t\t\toffer_index.insert(std::make_tuple(hash_t(\"ANY\" + bid_currency), block->height, ticket), tx->id);\n\t\t\t\toffer_index.insert(std::make_tuple(hash_t(ask_currency + bid_currency), block->height, ticket), tx->id);\n\t\t\t}\n\t\t\tif(exec->binary == params->swap_binary) {\n\t\t\t\tconst auto token = exec->get_arg(0).to<addr_t>();\n\t\t\t\tconst auto currency = exec->get_arg(1).to<addr_t>();\n\t\t\t\tswap_index.insert(std::make_tuple(hash_t(token + \"ANY\"), block->height, ticket), tx->id);\n\t\t\t\tswap_index.insert(std::make_tuple(hash_t(\"ANY\" + currency), block->height, ticket), tx->id);\n\t\t\t\tswap_index.insert(std::make_tuple(hash_t(token + currency), block->height, ticket), tx->id);\n\t\t\t}\n\t\t\tint owner_index = -1;\n\t\t\tif(exec->binary == params->plot_nft_binary\n\t\t\t\t|| exec->binary == params->offer_binary\n\t\t\t\t|| exec->binary == params->time_lock_binary) {\n\t\t\t\towner_index = 0;\n\t\t\t} else if(exec->binary == params->escrow_binary) {\n\t\t\t\towner_index = 2;\n\t\t\t}\n\t\t\tif(owner_index >= 0) {\n\t\t\t\towner_map.insert(std::make_tuple(exec->get_arg(owner_index).to<addr_t>(), block->height, ticket), std::make_pair(tx->id, type_hash));\n\t\t\t}\n\t\t\t{\n\t\t\t\tstd::set<addr_t> depends;\n\t\t\t\tfor(const auto& entry : exec->depends) {\n\t\t\t\t\tdepends.insert(entry.second);\n\t\t\t\t}\n\t\t\t\tif(depends.size()) {\n\t\t\t\t\tcontract_depends.insert(tx->id, std::vector<addr_t>(depends.begin(), depends.end()));\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontract_log.insert(std::make_tuple(exec->binary, block->height, ticket), tx->id);\n\t\t}\n\t\tif(tx->sender) {\n\t\t\tdeploy_map.insert(std::make_tuple(*tx->sender, block->height, ticket), std::make_pair(tx->id, type_hash));\n\t\t}\n\t\tif(auto owner = contract->get_owner()) {\n\t\t\towner_map.insert(std::make_tuple(*owner, block->height, ticket), std::make_pair(tx->id, type_hash));\n\t\t}\n\t}\n\tfor(const auto& op : tx->execute)\n\t{\n\t\tconst auto ticket = counter++;\n\t\tconst auto address = (op->address == addr_t() ? addr_t(tx->id) : op->address);\n\t\tconst auto contract = (address == tx->id ? tx->deploy : get_contract(address));\n\n\t\tif(auto exec = std::dynamic_pointer_cast<const operation::Execute>(op)) {\n\t\t\texec_entry_t entry;\n\t\t\tentry.height = block->height;\n\t\t\tentry.time_stamp = block->time_stamp;\n\t\t\tentry.txid = tx->id;\n\t\t\tentry.method = exec->method;\n\t\t\tentry.args = exec->args;\n\t\t\tentry.user = exec->user;\n\t\t\tauto deposit = std::dynamic_pointer_cast<const operation::Deposit>(exec);\n\t\t\tif(deposit) {\n\t\t\t\tentry.deposit = std::make_pair(deposit->currency, deposit->amount);\n\t\t\t}\n\t\t\texec_log.insert(std::make_tuple(address, block->height, ticket), entry);\n\n\t\t\tif(auto executable = std::dynamic_pointer_cast<const contract::Executable>(contract)) {\n\t\t\t\tif(executable->binary == params->swap_binary) {\n\t\t\t\t\tif(exec->user && entry.args.size() > 0) {\n\t\t\t\t\t\tconst auto key = std::make_pair(*exec->user, op->address);\n\t\t\t\t\t\tconst auto index = entry.args[0].to<uint32_t>();\n\t\t\t\t\t\tif(index < 2) {\n\t\t\t\t\t\t\tstd::array<uint128, 2> balance;\n\t\t\t\t\t\t\tswap_liquid_map.find(key, balance);\n\t\t\t\t\t\t\tif(exec->method == \"add_liquid\" && deposit) {\n\t\t\t\t\t\t\t\tbalance[index] += deposit->amount;\n\t\t\t\t\t\t\t\tswap_liquid_map.insert(key, balance);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(exec->method == \"rem_liquid\" && entry.args.size() > 1) {\n\t\t\t\t\t\t\t\tbalance[index] -= entry.args[1].to<uint128>();\n\t\t\t\t\t\t\t\tswap_liquid_map.insert(key, balance);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(exec->method == \"rem_all_liquid\") {\n\t\t\t\t\t\t\t\tbalance = std::array<uint128, 2>();\n\t\t\t\t\t\t\t\tswap_liquid_map.insert(key, balance);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(executable->binary == params->offer_binary) {\n\t\t\t\t\tif((exec->method == \"trade\" || exec->method == \"accept\") && deposit) {\n\t\t\t\t\t\ttrade_log_t log;\n\t\t\t\t\t\tlog.time_stamp = block->time_stamp;\n\t\t\t\t\t\tlog.txid = tx->id;\n\t\t\t\t\t\tlog.address = address;\n\t\t\t\t\t\tlog.ask_amount = deposit->amount;\n\t\t\t\t\t\texec->get_arg(1).to(log.inv_price);\n\t\t\t\t\t\ttrade_log.insert(std::make_pair(block->height, ticket), log);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst auto ask_currency = deposit->currency;\n\t\t\t\t\t\t\tconst auto bid_currency = to_addr(read_storage_field(address, \"bid_currency\").first);\n\t\t\t\t\t\t\ttrade_index.insert(std::make_tuple(hash_t(ask_currency + \"ANY\"), block->height, ticket), true);\n\t\t\t\t\t\t\ttrade_index.insert(std::make_tuple(hash_t(\"ANY\" + bid_currency), block->height, ticket), true);\n\t\t\t\t\t\t\ttrade_index.insert(std::make_tuple(hash_t(ask_currency + bid_currency), block->height, ticket), true);\n\t\t\t\t\t\t} catch(...) {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Node::revert(const uint32_t height)\n{\n\tconst auto time_begin = get_time_ms();\n\n\tconst bool is_deep = !root || height <= root->height;\n\n\tfor(auto block = get_peak(); !is_deep && block && block->height >= height; block = find_prev(block))\n\t{\n\t\t// revert farmer_ranking\n\t\tif(block->height) {\n\t\t\tconst auto& farmer_key = block->get_farmer_key();\n\t\t\tfor(auto& entry : farmer_ranking) {\n\t\t\t\tif(entry.first == farmer_key) {\n\t\t\t\t\tif(entry.second) {\n\t\t\t\t\t\tentry.second--;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// add removed tx back to pool\n\t\tif(is_synced) {\n\t\t\tif(auto full = std::dynamic_pointer_cast<const Block>(block)) {\n\t\t\t\tfor(const auto& tx : full->tx_list) {\n\t\t\t\t\ttx_pool_t entry;\n\t\t\t\t\tauto copy = vnx::clone(tx);\n\t\t\t\t\tcopy->reset(params);\n\t\t\t\t\tentry.tx = copy;\n\t\t\t\t\tentry.fee = tx->exec_result->total_fee;\n\t\t\t\t\tentry.cost = tx->exec_result->total_cost;\n\t\t\t\t\tentry.is_valid = true;\n\t\t\t\t\ttx_pool_update(entry, true);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tdb->revert(height);\n\n\tuint32_t peak = 0;\n\tif(!height_map.find_last(peak, state_hash)) {\n\t\tstate_hash = hash_t();\n\t}\n\tcontract_cache.clear();\n\n\tif(is_deep || farmer_ranking.empty())\n\t{\n\t\t// reset farmer ranking\n\t\tstd::map<pubkey_t, uint32_t> farmer_block_count;\n\t\tfarmer_block_map.scan([&farmer_block_count](const std::pair<pubkey_t, uint32_t>& key, const farmed_block_info_t& info) -> bool {\n\t\t\tfarmer_block_count[key.first]++;\n\t\t\treturn true;\n\t\t});\n\t\tfarmer_ranking.clear();\n\t\tfor(const auto& entry : farmer_block_count) {\n\t\t\tfarmer_ranking.push_back(entry);\n\t\t}\n\t}\n\tupdate_farmer_ranking();\n\n\tconst auto elapsed = (get_time_ms() - time_begin) / 1e3;\n\tif(elapsed > 1) {\n\t\tlog(WARN) << \"Reverting to height \" << peak << \" took \" << elapsed << \" sec\";\n\t}\n}\n\nvoid Node::reset()\n{\n\troot = nullptr;\n\tfork_tree.clear();\n\tfork_index.clear();\n\thistory.clear();\n\thistory_log.clear();\n\tcontract_cache.clear();\n\n\tuint32_t height = 0;\n\tif(height_map.find_last(height, state_hash))\n\t{\n\t\tblocks->open(\"rb+\");\n\n\t\t// check consistency\n\t\twhile(true) {\n\t\t\tif(auto block = get_block_at(height)) {\n\t\t\t\tif(block->is_valid() && block->height == height) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\tlog(WARN) << \"Corrupted block at height \" << height << \", reverting ...\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlog(WARN) << \"Missing block at height \" << height << \", reverting ...\";\n\t\t\t}\n\t\t\tif(height) {\n\t\t\t\trevert(height--);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// get root\n\t\troot = get_header_at(height - std::min(params->commit_delay, height));\n\t\tif(!root) {\n\t\t\tthrow std::logic_error(\"failed to load root block\");\n\t\t}\n\n\t\t// load fork tree\n\t\tstd::vector<hash_t> list;\n\t\theight_index.find_range(root->height, height + 1, list);\n\t\tfor(const auto& hash : list) {\n\t\t\tif(auto block = get_block(hash)) {\n\t\t\t\tauto fork = std::make_shared<fork_t>();\n\t\t\t\tfork->block = block;\n\t\t\t\tfork->is_vdf_verified = true;\n\t\t\t\tadd_fork(fork);\n\t\t\t}\n\t\t}\n\n\t\t// load history\n\t\tfor(auto block = root; block && history.size() < max_history; block = find_prev(block)) {\n\t\t\thistory[block->hash] = block;\n\t\t\thistory_log.emplace(block->height, block->hash);\n\t\t}\n\n\t\t// update address count\n\t\tmmx_address_count = 0;\n\t\tbalance_table.scan([this](const std::pair<addr_t, addr_t>& key, const uint128& value) -> bool {\n\t\t\tif(value >= 1000000 && key.second == addr_t()) {\n\t\t\t\tmmx_address_count++;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t}\n\telse {\n\t\tblocks->open(\"wb\");\n\t\tblocks->open(\"rb+\");\n\t\tdb_blocks->revert(0);\n\t\tinit_chain();\n\t}\n}\n\nstd::shared_ptr<const BlockHeader> Node::get_root() const\n{\n\tif(!root) {\n\t\tthrow std::logic_error(\"have no root\");\n\t}\n\treturn root;\n}\n\nstd::shared_ptr<const BlockHeader> Node::get_peak() const\n{\n\treturn get_header(state_hash);\n}\n\nstd::shared_ptr<Node::fork_t> Node::find_fork(const hash_t& hash) const\n{\n\tauto iter = fork_tree.find(hash);\n\tif(iter != fork_tree.end()) {\n\t\treturn iter->second;\n\t}\n\treturn nullptr;\n}\n\nstd::shared_ptr<Node::fork_t> Node::find_prev_fork(std::shared_ptr<fork_t> fork, const size_t distance) const\n{\n\tfor(size_t i = 0; fork && i < distance; ++i) {\n\t\tfork = fork->prev.lock();\n\t}\n\treturn fork;\n}\n\nstd::shared_ptr<const BlockHeader> Node::find_prev(\tstd::shared_ptr<const BlockHeader> block,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst size_t distance, bool clamped) const\n{\n\tfor(size_t i = 0; block && i < distance && (block->height || !clamped); ++i) {\n\t\tblock = get_header(block->prev);\n\t}\n\treturn block;\n}\n\nbool Node::find_challenge(std::shared_ptr<const BlockHeader> block, const uint32_t offset, hash_t& challenge, uint64_t& space_diff) const\n{\n\tif(offset > params->challenge_delay)\n\t{\n\t\tconst auto advance = offset - params->challenge_delay;\n\t\tif(advance > params->max_vdf_count) {\n\t\t\treturn false;\n\t\t}\n\t\thash_t tmp = block->challenge;\n\t\tfor(uint32_t i = 0; i < advance; ++i) {\n\t\t\ttmp = hash_t(std::string(\"next_challenge\") + tmp);\n\t\t}\n\t\tchallenge = tmp;\n\t\tspace_diff = block->space_diff;\n\t\treturn true;\n\t}\n\tconst uint32_t target = params->challenge_delay - offset;\n\n\tstd::vector<std::shared_ptr<const BlockHeader>> chain = {block};\n\t{\n\t\tstd::shared_ptr<const BlockHeader> iter = block;\n\t\tfor(uint32_t i = 0; i < target; ++i) {\n\t\t\tif(auto block = find_prev(iter)) {\n\t\t\t\tchain.push_back(block);\n\t\t\t\titer = block;\n\t\t\t} else if(iter->height) {\n\t\t\t\treturn false;\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tstd::reverse(chain.begin(), chain.end());\n\n\tstd::vector<std::pair<hash_t, uint64_t>> list;\n\tstd::shared_ptr<const BlockHeader> prev;\n\tfor(auto block : chain) {\n\t\tif(prev) {\n\t\t\tauto tmp = prev->challenge;\n\t\t\tfor(uint32_t i = 1; i < block->vdf_count; ++i) {\n\t\t\t\ttmp = hash_t(std::string(\"next_challenge\") + tmp);\n\t\t\t\tlist.emplace_back(tmp, prev->space_diff);\n\t\t\t}\n\t\t}\n\t\tlist.emplace_back(block->challenge, block->space_diff);\n\t\tprev = block;\n\t}\n\tstd::reverse(list.begin(), list.end());\n\n\twhile(target >= list.size()) {\n\t\t// generate challenges for \"before\" genesis\n\t\tconst auto prev = list.back();\n\t\tlist.emplace_back(hash_t(std::string(\"prev_challenge\") + prev.first), prev.second);\n\t}\n\tconst auto& out = list[target];\n\tchallenge = out.first;\n\tspace_diff = out.second;\n\treturn true;\n}\n\nbool Node::find_challenge(const uint32_t vdf_height, hash_t& challenge, uint64_t& space_diff) const\n{\n\tauto block = get_peak();\n\tif(block) {\n\t\tif(vdf_height > block->vdf_height) {\n\t\t\tif(vdf_height - block->vdf_height > params->max_vdf_count) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} else if(block->vdf_height - vdf_height > max_history) {\n\t\t\treturn false;\n\t\t}\n\t}\n\twhile(block && block->vdf_height > vdf_height) {\n\t\tblock = find_prev(block);\n\t}\n\tif(!block) {\n\t\treturn false;\n\t}\n\treturn find_challenge(block, vdf_height - block->vdf_height, challenge, space_diff);\n}\n\nhash_t Node::get_challenge(std::shared_ptr<const BlockHeader> block, const uint32_t offset, uint64_t& space_diff) const\n{\n\thash_t challenge;\n\tif(!find_challenge(block, offset, challenge, space_diff)) {\n\t\tthrow std::logic_error(\"cannot find challenge\");\n\t}\n\treturn challenge;\n}\n\nuint64_t Node::get_time_diff(std::shared_ptr<const BlockHeader> infused) const\n{\n\tif(auto prev = find_prev(infused, params->commit_delay, true)) {\n\t\treturn prev->time_diff;\n\t}\n\tthrow std::logic_error(\"cannot get time difficulty\");\n}\n\nbool Node::find_infusion(std::shared_ptr<const BlockHeader> block, const uint32_t offset, hash_t& value, uint64_t& num_iters) const\n{\n\tif(offset < params->infuse_delay)\n\t{\n\t\tconst uint32_t delta = params->infuse_delay - offset;\n\t\tconst uint32_t target = block->vdf_height > delta ? block->vdf_height - delta : 0;\n\n\t\twhile(block && block->vdf_height > target) {\n\t\t\tblock = find_prev(block);\n\t\t}\n\t}\n\tif(block) {\n\t\tnum_iters = get_block_iters(params, get_time_diff(block));\n\t\tvalue = block->hash;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nhash_t Node::get_infusion(std::shared_ptr<const BlockHeader> block, const uint32_t offset, uint64_t& num_iters) const\n{\n\thash_t value;\n\tif(!find_infusion(block, offset, value, num_iters)) {\n\t\tthrow std::logic_error(\"cannot find infusion\");\n\t}\n\treturn value;\n}\n\nstd::pair<uint32_t, hash_t> Node::get_vdf_peak_ex() const\n{\n\tif(auto peak = get_peak()) {\n\t\tconst auto points = find_next_vdf_points(peak);\n\t\tif(points.empty()) {\n\t\t\treturn std::make_pair(peak->vdf_height, peak->vdf_output);\n\t\t} else {\n\t\t\treturn std::make_pair(peak->vdf_height + points.size(), points.back()->output);\n\t\t}\n\t}\n\treturn std::make_pair(0, hash_t());\t\t// should never happen\n}\n\nstd::shared_ptr<const VDF_Point>\nNode::find_vdf_point(const hash_t& input, const hash_t& output) const\n{\n\tconst auto range = vdf_tree.equal_range(output);\n\tfor(auto iter = range.first; iter != range.second; ++iter) {\n\t\tconst auto& point = iter->second;\n\t\tif(point->input == input && point->output == output) {\n\t\t\treturn point;\n\t\t}\n\t}\n\treturn nullptr;\n}\n\nstd::vector<std::shared_ptr<const VDF_Point>>\nNode::find_vdf_points(std::shared_ptr<const BlockHeader> block) const\n{\n\tconst auto prev = find_prev(block);\n\tif(!prev) {\n\t\treturn {};\n\t}\n\tstd::vector<std::shared_ptr<const VDF_Point>> out;\n\n\tauto output = block->vdf_output;\n\tauto vdf_iters = prev->vdf_iters;\n\twhile(out.size() < block->vdf_count) {\n\t\thash_t infuse;\n\t\tuint64_t num_iters = 0;\n\t\tconst auto offset = block->vdf_count - out.size() - 1;\n\t\tif(!find_infusion(prev, offset, infuse, num_iters)) {\n\t\t\treturn {};\n\t\t}\n\t\tbool found = false;\n\t\tconst auto range = vdf_tree.equal_range(output);\n\t\tfor(auto iter = range.first; iter != range.second; ++iter)\n\t\t{\n\t\t\tconst auto& point = iter->second;\n\t\t\tif(point->output == output\n\t\t\t\t&& point->prev == infuse\n\t\t\t\t&& point->num_iters == num_iters)\n\t\t\t{\n\t\t\t\toutput = point->input;\n\t\t\t\tvdf_iters += num_iters;\n\t\t\t\tout.push_back(point);\n\t\t\t\tfound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(!found) {\n\t\t\treturn {};\n\t\t}\n\t}\n\tif(output != prev->vdf_output) {\n\t\treturn {};\n\t}\n\tstd::reverse(out.begin(), out.end());\n\treturn out;\n}\n\nstd::vector<std::shared_ptr<const VDF_Point>> Node::find_next_vdf_points(std::shared_ptr<const BlockHeader> block) const\n{\n\tstd::vector<std::shared_ptr<const VDF_Point>> peaks;\n\tstd::unordered_map<hash_t, std::shared_ptr<const VDF_Point>> fork_map;\n\tfork_map[block->vdf_output] = nullptr;\n\n\tauto vdf_iters = block->vdf_iters;\n\tfor(uint32_t i = 0; i < params->max_vdf_count; ++i)\n\t{\n\t\tuint64_t num_iters = 0;\n\t\tconst auto infuse = get_infusion(block, i, num_iters);\n\n\t\tvdf_iters += num_iters;\n\t\tstd::vector<std::shared_ptr<const VDF_Point>> new_peaks;\n\n\t\tconst auto range = vdf_index.equal_range(vdf_iters);\n\t\tfor(auto iter = range.first; iter != range.second; ++iter)\n\t\t{\n\t\t\tconst auto& point = iter->second;\n\t\t\tif(fork_map.count(point->input)\n\t\t\t\t&& point->prev == infuse\n\t\t\t\t&& point->num_iters == num_iters)\n\t\t\t{\n\t\t\t\tfork_map[point->output] = point;\n\t\t\t\tnew_peaks.push_back(point);\n\t\t\t}\n\t\t}\n\t\tif(new_peaks.size()) {\n\t\t\tpeaks = std::move(new_peaks);\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(peaks.empty()) {\n\t\treturn {};\n\t}\n\tstd::sort(peaks.begin(), peaks.end(),\n\t\t[]( const std::shared_ptr<const VDF_Point>& L, const std::shared_ptr<const VDF_Point>& R) -> bool {\n\t\t\treturn L->recv_time < R->recv_time;\n\t\t});\n\n\tstd::vector<std::shared_ptr<const VDF_Point>> out;\n\tfor(auto point = peaks[0]; point; point = fork_map[point->input]) {\n\t\tout.push_back(point);\n\t}\n\tstd::reverse(out.begin(), out.end());\n\treturn out;\n}\n\nstd::set<pubkey_t> Node::get_validators(std::shared_ptr<const BlockHeader> block) const\n{\n\tblock = find_prev(block, params->commit_delay);\n\n\tstd::set<pubkey_t> set;\n\tfor(uint32_t k = 0; block && k < max_history && set.size() < params->max_validators; ++k)\n\t{\n\t\tif(block->proof.size()) {\n\t\t\tset.insert(block->proof[0]->farmer_key);\n\t\t}\n\t\tblock = find_prev(block);\n\t}\n\treturn set;\n}\n\nstd::vector<addr_t> Node::get_all_depends(std::shared_ptr<const contract::Executable> exec) const\n{\n\tstd::set<addr_t> out;\n\tfor(const auto& entry : exec->depends) {\n\t\tout.insert(entry.second);\n\t}\n\tif(out.size() > params->max_rcall_width) {\n\t\tthrow std::logic_error(\"remote call width overflow\");\n\t}\n\tfor(const auto& address : std::vector<addr_t>(out.begin(), out.end())) {\n\t\tconst auto tmp = get_all_depends(address, 2);\n\t\tout.insert(tmp.begin(), tmp.end());\n\t}\n\tif(out.size() > params->max_rcall_width) {\n\t\tthrow std::logic_error(\"remote call width overflow\");\n\t}\n\treturn std::vector<addr_t>(out.begin(), out.end());\n}\n\nstd::vector<addr_t> Node::get_all_depends(const addr_t& address, const uint32_t depth) const\n{\n\tstd::set<addr_t> out;\n\tstd::vector<addr_t> list;\n\tif(contract_depends.find(address, list)) {\n\t\tfor(const auto& address : list) {\n\t\t\tconst auto tmp = get_all_depends(address, depth + 1);\n\t\t\tout.insert(tmp.begin(), tmp.end());\n\t\t}\n\t\tout.insert(list.begin(), list.end());\n\t}\n\tif(out.size() && depth > params->max_rcall_depth) {\n\t\tthrow std::logic_error(\"remote call depth overflow\");\n\t}\n\tif(out.size() > params->max_rcall_width) {\n\t\tthrow std::logic_error(\"remote call width overflow\");\n\t}\n\treturn std::vector<addr_t>(out.begin(), out.end());\n}\n\nvnx::optional<Node::proof_data_t> Node::find_best_proof(const hash_t& challenge) const\n{\n\tconst auto iter = proof_map.find(challenge);\n\tif(iter != proof_map.end()) {\n\t\tconst auto& list = iter->second;\n\t\tif(list.size()) {\n\t\t\treturn list.front();\n\t\t}\n\t}\n\treturn nullptr;\n}\n\nuint64_t Node::calc_block_reward(std::shared_ptr<const BlockHeader> block, const uint64_t total_fees) const\n{\n\tif(block->proof.empty()) {\n\t\treturn 0;\n\t}\n\tif(block->height < params->reward_activation) {\n\t\treturn 0;\n\t}\n\tuint64_t base_reward = 0;\n\tuint64_t reward_deduction = 0;\n\tif(auto prev = find_prev(block)) {\n\t\tbase_reward = prev->base_reward;\n\t\treward_deduction = calc_min_reward_deduction(params, prev->txfee_buffer);\n\t}\n\tuint64_t reward = base_reward;\n\tif(params->min_reward > reward_deduction) {\n\t\treward += params->min_reward - reward_deduction;\n\t}\n\treturn mmx::calc_final_block_reward(params, reward, total_fees);\n}\n\nvnx::optional<addr_t> Node::get_vdf_reward_winner(std::shared_ptr<const BlockHeader> block) const\n{\n\tstd::map<addr_t, uint32_t> win_map;\n\tfor(uint32_t i = 0; i < params->vdf_reward_interval; ++i) {\n\t\tif(auto prev = find_prev(block)) {\n\t\t\tfor(const auto& addr : prev->vdf_reward_addr) {\n\t\t\t\twin_map[addr]++;\n\t\t\t}\n\t\t\tblock = prev;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\thash_t max_hash;\n\tuint32_t max_count = 0;\n\tvnx::optional<addr_t> out;\n\n\tfor(const auto& entry : win_map) {\n\t\tconst auto& address = entry.first;\n\t\tconst auto& count = entry.second;\n\t\tconst hash_t hash(address + block->proof_hash);\n\t\tif(count > max_count || (count == max_count && hash < max_hash)) {\n\t\t\tout = address;\n\t\t\tmax_count = count;\n\t\t\tmax_hash = hash;\n\t\t}\n\t}\n\treturn out;\n}\n\nstd::shared_ptr<const BlockHeader> Node::read_block(\n\t\tvnx::File& file, bool full_block, std::vector<int64_t>* tx_offsets) const\n{\n\t// THREAD SAFE (for concurrent reads)\n\tauto& in = file.in;\n\tif(tx_offsets) {\n\t\ttx_offsets->clear();\n\t}\n\ttry {\n\t\tif(auto header = std::dynamic_pointer_cast<const BlockHeader>(vnx::read(in))) {\n\t\t\tif(full_block) {\n\t\t\t\tauto block = Block::create();\n\t\t\t\tblock->BlockHeader::operator=(*header);\n\t\t\t\twhile(true) {\n\t\t\t\t\tconst auto offset = in.get_input_pos();\n\t\t\t\t\tif(auto value = vnx::read(in)) {\n\t\t\t\t\t\tif(auto tx = std::dynamic_pointer_cast<const Transaction>(value)) {\n\t\t\t\t\t\t\tif(tx_offsets) {\n\t\t\t\t\t\t\t\ttx_offsets->push_back(offset);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tblock->tx_list.push_back(tx);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow std::logic_error(\"expected transaction\");\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\theader = block;\n\t\t\t}\n\t\t\treturn header;\n\t\t}\n\t} catch(const std::exception& ex) {\n\t\tlog(WARN) << \"Failed to read block: \" << ex.what();\n\t}\n\treturn nullptr;\n}\n\nvoid Node::write_block(std::shared_ptr<const Block> block, const bool is_main)\n{\n\ttry {\n\t\tblock_index_t index;\n\t\tif(block_index.find(block->hash, index))\n\t\t{\n\t\t\tblocks->seek_to(index.file_offset);\n\n\t\t\tstd::vector<int64_t> tx_offsets;\n\t\t\tif(auto block = read_block(*blocks, true, &tx_offsets)) {\n\t\t\t\tif(!block->is_valid()) {\n\t\t\t\t\tthrow std::logic_error(\"invalid block\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow std::logic_error(\"failed to read block\");\n\t\t\t}\n\t\t\tif(tx_offsets.size() != block->tx_count) {\n\t\t\t\tthrow std::logic_error(\"tx count mismatch\");\n\t\t\t}\n\t\t\tif(block->tx_list.size() != block->tx_count) {\n\t\t\t\tthrow std::logic_error(\"tx count mismatch\");\n\t\t\t}\n\t\t\tif(is_main) {\n\t\t\t\tfor(uint32_t i = 0; i < block->tx_count; ++i) {\n\t\t\t\t\tconst auto& tx = block->tx_list[i];\n\t\t\t\t\ttx_index.insert(tx->id, tx->get_tx_index(params, block, tx_offsets[i]));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t} catch(const std::exception& ex) {\n\t\tlog(WARN) << \"Stored block at height \" << block->height << \" is corrupted: \" << ex.what();\n\t}\n\tblocks->seek_end();\n\tauto& out = blocks->out;\n\tconst auto offset = out.get_output_pos();\n\n\tvnx::write(out, block->get_header());\n\n\tstd::vector<std::pair<hash_t, tx_index_t>> tx_list;\n\tfor(const auto& tx : block->tx_list) {\n\t\tif(is_main) {\n\t\t\ttx_list.emplace_back(tx->id, tx->get_tx_index(params, block, out.get_output_pos()));\n\t\t}\n\t\tvnx::write(out, tx);\n\t}\n\tfor(const auto& entry : tx_list) {\n\t\ttx_index.insert(entry.first, entry.second);\n\t}\n\tvnx::write(out, nullptr);\t// end of block\n\tblocks->flush();\n\n\tblock_index.insert(block->hash, block->get_block_index(offset));\n\t{\n\t\tstd::vector<hash_t> list;\n\t\theight_index.find(block->height, list);\n\t\tif(std::find(list.begin(), list.end(), block->hash) == list.end()) {\n\t\t\theight_index.insert(block->height, block->hash);\n\t\t}\n\t}\n\tdb_blocks->commit(db_blocks->version() + 1);\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Node_api.cpp",
    "content": "/*\n * Node_api.cpp\n *\n *  Created on: Jun 30, 2024\n *      Author: mad\n */\n\n#include <mmx/Node.h>\n#include <mmx/contract/PubKey.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/ProofOfSpaceNFT.hxx>\n#include <mmx/tx_entry_t.hpp>\n#include <mmx/vm/Engine.h>\n#include <mmx/vm_interface.h>\n#include <mmx/helpers.h>\n\n#include <mmx/Node_get_block.hxx>\n#include <mmx/Node_get_block_at.hxx>\n#include <mmx/Node_get_header.hxx>\n#include <mmx/Node_get_header_at.hxx>\n#include <mmx/Node_get_tx_ids.hxx>\n#include <mmx/Node_get_tx_ids_at.hxx>\n#include <mmx/Node_get_tx_ids_since.hxx>\n#include <mmx/Node_get_tx_height.hxx>\n#include <mmx/Node_get_tx_info.hxx>\n#include <mmx/Node_get_tx_info_for.hxx>\n#include <mmx/Node_get_transaction.hxx>\n#include <mmx/Node_get_transactions.hxx>\n#include <mmx/Node_get_history.hxx>\n#include <mmx/Node_get_history_memo.hxx>\n#include <mmx/Node_get_contract.hxx>\n#include <mmx/Node_get_contract_for.hxx>\n#include <mmx/Node_get_contracts.hxx>\n#include <mmx/Node_get_contracts_by.hxx>\n#include <mmx/Node_get_contracts_owned_by.hxx>\n#include <mmx/Node_get_balance.hxx>\n#include <mmx/Node_get_total_balance.hxx>\n#include <mmx/Node_get_balances.hxx>\n#include <mmx/Node_get_contract_balances.hxx>\n#include <mmx/Node_get_total_balances.hxx>\n#include <mmx/Node_get_all_balances.hxx>\n#include <mmx/Node_get_exec_history.hxx>\n#include <mmx/Node_read_storage.hxx>\n#include <mmx/Node_dump_storage.hxx>\n#include <mmx/Node_read_storage_var.hxx>\n#include <mmx/Node_read_storage_entry_var.hxx>\n#include <mmx/Node_read_storage_field.hxx>\n#include <mmx/Node_read_storage_entry_addr.hxx>\n#include <mmx/Node_read_storage_entry_string.hxx>\n#include <mmx/Node_read_storage_array.hxx>\n#include <mmx/Node_read_storage_map.hxx>\n#include <mmx/Node_read_storage_object.hxx>\n#include <mmx/Node_call_contract.hxx>\n#include <mmx/Node_get_total_supply.hxx>\n#include <mmx/Node_get_offer.hxx>\n#include <mmx/Node_fetch_offers.hxx>\n#include <mmx/Node_get_offers.hxx>\n#include <mmx/Node_get_offers_by.hxx>\n#include <mmx/Node_get_recent_offers.hxx>\n#include <mmx/Node_get_recent_offers_for.hxx>\n#include <mmx/Node_get_trade_history.hxx>\n#include <mmx/Node_get_trade_history_for.hxx>\n#include <mmx/Node_get_swaps.hxx>\n#include <mmx/Node_get_swap_info.hxx>\n#include <mmx/Node_get_swap_user_info.hxx>\n#include <mmx/Node_get_swap_history.hxx>\n#include <mmx/Node_get_swap_trade_estimate.hxx>\n#include <mmx/Node_get_swap_fees_earned.hxx>\n#include <mmx/Node_get_swap_equivalent_liquidity.hxx>\n#include <mmx/Node_get_swap_liquidity_by.hxx>\n#include <mmx/Node_get_farmed_blocks.hxx>\n#include <mmx/Node_get_farmer_ranking.hxx>\n#include <mmx/Node_get_farmed_block_summary.hxx>\n#include <mmx/Node_get_plot_nft_info.hxx>\n#include <mmx/Node_get_plot_nft_target.hxx>\n#include <mmx/Node_validate.hxx>\n#include <mmx/Node_verify_plot_nft_target.hxx>\n#include <mmx/Node_verify_partial.hxx>\n#include <mmx/Node_get_vdf_peak.hxx>\n#include <mmx/Node_get_vdf_height.hxx>\n\n#include <vnx/vnx.h>\n#include <vnx/InternalError.hxx>\n\n#include <shared_mutex>\n\n\nnamespace mmx {\n\nstd::shared_ptr<const ChainParams> Node::get_params() const {\n\treturn params;\n}\n\nstd::shared_ptr<const NetworkInfo> Node::get_network_info() const\n{\n\tif(const auto peak = get_peak()) {\n\t\tif(!network || peak->height != network->height || is_synced != network->is_synced)\n\t\t{\n\t\t\tauto info = NetworkInfo::create();\n\t\t\tinfo->is_synced = is_synced;\n\t\t\tinfo->height = peak->height;\n\t\t\tinfo->vdf_height = peak->vdf_height;\n\t\t\tinfo->time_stamp = peak->time_stamp;\n\t\t\tinfo->synced_since = synced_since;\n\t\t\tinfo->name = params->network;\n\t\t\tinfo->node_version = node_version;\n\t\t\tinfo->node_commit = node_commit;\n\t\t\tinfo->time_diff = peak->time_diff;\n\t\t\tinfo->space_diff = peak->space_diff;\n\t\t\tinfo->vdf_speed = get_vdf_speed(params, peak->time_diff) / 1e6;\n\t\t\tconst auto avg_txfee = calc_min_reward_deduction(params, peak->txfee_buffer);\n\t\t\tinfo->block_reward = (peak->height >= params->reward_activation ?\n\t\t\t\t\t(peak->base_reward + std::max<int64_t>(params->min_reward - avg_txfee, 0)) : 0);\n\t\t\tinfo->total_space = calc_total_netspace(params, peak->space_diff) / 1000 / 1000 / 1000;\n\t\t\tinfo->total_supply = get_total_supply(addr_t());\n\t\t\tinfo->address_count = mmx_address_count;\n\t\t\tinfo->genesis_hash = get_genesis_hash();\n\t\t\tinfo->average_txfee = avg_txfee;\n\t\t\t{\n\t\t\t\tsize_t num_blocks = 0;\n\t\t\t\tfor(const auto& fork : get_fork_line()) {\n\t\t\t\t\tif(fork->block->farmer_sig) {\n\t\t\t\t\t\tinfo->block_size += fork->block->static_cost / double(params->max_block_size);\n\t\t\t\t\t\tnum_blocks++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(num_blocks) {\n\t\t\t\t\tinfo->block_size /= num_blocks;\n\t\t\t\t}\n\t\t\t}\n\t\t\tnetwork = info;\n\t\t}\n\t}\n\treturn network;\n}\n\nhash_t Node::get_genesis_hash() const\n{\n\tif(auto block = get_header_at(0)) {\n\t\treturn block->hash;\n\t}\n\tthrow std::logic_error(\"have no genesis\");\n}\n\nuint32_t Node::get_height() const\n{\n\tif(auto block = get_peak()) {\n\t\treturn block->height;\n\t}\n\tthrow std::logic_error(\"have no peak\");\n}\n\nvnx::optional<uint32_t> Node::get_synced_height() const\n{\n\tif(is_synced) {\n\t\treturn get_height();\n\t}\n\treturn nullptr;\n}\n\nvnx::optional<uint32_t> Node::get_synced_vdf_height() const\n{\n\tif(is_synced) {\n\t\treturn get_vdf_height();\n\t}\n\treturn nullptr;\n}\n\nstd::shared_ptr<const Block> Node::get_block(const hash_t& hash) const\n{\n\treturn std::dynamic_pointer_cast<const Block>(get_block_ex(hash, true));\n}\n\nstd::shared_ptr<const BlockHeader> Node::get_block_ex(const hash_t& hash, bool full_block) const\n{\n\t// THREAD SAFE (for concurrent reads)\n\tauto iter = fork_tree.find(hash);\n\tif(iter != fork_tree.end()) {\n\t\treturn iter->second->block;\n\t}\n\tif(!full_block) {\n\t\tauto iter = history.find(hash);\n\t\tif(iter != history.end()) {\n\t\t\treturn iter->second;\n\t\t}\n\t}\n\tblock_index_t entry;\n\tif(block_index.find(hash, entry)) {\n\t\tvnx::File file(blocks->get_path());\n\t\tfile.open(\"rb\");\n\t\tfile.seek_to(entry.file_offset);\n\t\treturn read_block(file, full_block);\n\t}\n\treturn nullptr;\n}\n\nstd::shared_ptr<const Block> Node::get_block_at(const uint32_t& height) const\n{\n\treturn std::dynamic_pointer_cast<const Block>(get_block_at_ex(height, true));\n}\n\nstd::shared_ptr<const BlockHeader> Node::get_block_at_ex(const uint32_t& height, bool full_block) const\n{\n\tif(auto hash = get_block_hash(height)) {\n\t\treturn get_block_ex(*hash, full_block);\n\t}\n\treturn nullptr;\n}\n\nstd::shared_ptr<const BlockHeader> Node::get_header(const hash_t& hash) const\n{\n\treturn get_block_ex(hash, false);\n}\n\nstd::shared_ptr<const BlockHeader> Node::get_header_at(const uint32_t& height) const\n{\n\treturn get_block_at_ex(height, false);\n}\n\nvnx::optional<hash_t> Node::get_block_hash(const uint32_t& height) const\n{\n\thash_t hash;\n\tif(height_map.find(height, hash)) {\n\t\treturn hash;\n\t}\n\treturn nullptr;\n}\n\nvnx::optional<std::pair<hash_t, hash_t>> Node::get_block_hash_ex(const uint32_t& height) const\n{\n\tif(auto hash = get_block_hash(height)) {\n\t\tblock_index_t entry;\n\t\tif(block_index.find(*hash, entry)) {\n\t\t\treturn std::make_pair(*hash, entry.content_hash);\n\t\t}\n\t}\n\treturn nullptr;\n}\n\nstd::vector<hash_t> Node::get_tx_ids(const uint32_t& limit) const\n{\n\tstd::vector<hash_t> out;\n\ttx_log.reverse_scan([&out, limit](const uint32_t&, const std::vector<hash_t>& list) -> bool {\n\t\tfor(const auto& id : list) {\n\t\t\tif(out.size() < limit) {\n\t\t\t\tout.push_back(id);\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn out.size() < limit;\n\t});\n\treturn out;\n}\n\nstd::vector<hash_t> Node::get_tx_ids_at(const uint32_t& height) const\n{\n\tstd::vector<hash_t> list;\n\ttx_log.find(height, list);\n\treturn list;\n}\n\nstd::vector<hash_t> Node::get_tx_ids_since(const uint32_t& height) const\n{\n\tstd::vector<std::vector<hash_t>> list;\n\ttx_log.find_greater_equal(height, list);\n\n\tstd::vector<hash_t> out;\n\tfor(const auto& entry : list) {\n\t\tout.insert(out.end(), entry.begin(), entry.end());\n\t}\n\treturn out;\n}\n\nvnx::optional<uint32_t> Node::get_tx_height(const hash_t& id) const\n{\n\ttx_index_t entry;\n\tif(tx_index.find(id, entry)) {\n\t\treturn entry.height;\n\t}\n\treturn nullptr;\n}\n\nvnx::optional<tx_info_t> Node::get_tx_info(const hash_t& id) const\n{\n\tif(auto tx = get_transaction(id, true)) {\n\t\treturn get_tx_info_for(tx);\n\t}\n\treturn nullptr;\n}\n\nvnx::optional<tx_info_t> Node::get_tx_info_for(std::shared_ptr<const Transaction> tx) const\n{\n\tif(!tx) {\n\t\treturn nullptr;\n\t}\n\ttx_info_t info;\n\tinfo.id = tx->id;\n\tinfo.expires = tx->expires;\n\t{\n\t\ttx_index_t entry;\n\t\tif(tx_index.find(tx->id, entry)) {\n\t\t\tinfo.height = entry.height;\n\t\t\tinfo.time_stamp = entry.time_stamp;\n\t\t\tinfo.block = get_block_hash(entry.height);\n\t\t}\n\t}\n\tif(tx->exec_result) {\n\t\tinfo.fee = tx->exec_result->total_fee;\n\t\tinfo.cost = tx->exec_result->total_cost;\n\t\tinfo.did_fail = tx->exec_result->did_fail;\n\t\tinfo.message = tx->exec_result->get_error_msg();\n\t} else {\n\t\tinfo.cost = tx->static_cost;\n\t}\n\tinfo.note = tx->note;\n\tinfo.sender = tx->sender;\n\tinfo.inputs = tx->get_inputs();\n\tinfo.outputs = tx->get_outputs();\n\tinfo.operations = tx->get_operations();\n\tinfo.deployed = tx->deploy;\n\n\tstd::set<addr_t> contracts;\n\tfor(const auto& in : info.inputs) {\n\t\tcontracts.insert(in.contract);\n\t\tinfo.input_amounts[in.contract] += in.amount;\n\t}\n\tfor(const auto& out : info.outputs) {\n\t\tcontracts.insert(out.contract);\n\t\tinfo.output_amounts[out.contract] += out.amount;\n\t}\n\tfor(const auto& op : tx->execute) {\n\t\tif(op) {\n\t\t\tcontracts.insert(op->address);\n\t\t}\n\t}\n\tfor(const auto& addr : contracts) {\n\t\tif(auto contract = get_contract(addr)) {\n\t\t\tinfo.contracts[addr] = contract;\n\t\t}\n\t}\n\treturn info;\n}\n\nstd::shared_ptr<const Transaction> Node::get_transaction(const hash_t& id, const bool& pending) const\n{\n\tif(pending) {\n\t\tauto iter = tx_pool.find(id);\n\t\tif(iter != tx_pool.end()) {\n\t\t\treturn iter->second.tx;\n\t\t}\n\t\tfor(const auto& entry : tx_queue) {\n\t\t\tif(const auto& tx = entry.second) {\n\t\t\t\tif(tx->id == id) {\n\t\t\t\t\treturn tx;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\ttx_index_t entry;\n\tif(tx_index.find(id, entry)) {\n\t\tvnx::File file(blocks->get_path());\n\t\tfile.open(\"rb\");\n\t\tfile.seek_to(entry.file_offset);\n\t\tconst auto value = vnx::read(file.in);\n\t\tif(auto tx = std::dynamic_pointer_cast<const Transaction>(value)) {\n\t\t\treturn tx;\n\t\t}\n\t}\n\treturn nullptr;\n}\n\nstd::vector<std::shared_ptr<const Transaction>> Node::get_transactions(const std::vector<hash_t>& ids) const\n{\n\tstd::vector<std::shared_ptr<const Transaction>> list;\n\tfor(const auto& id : ids) {\n\t\tstd::shared_ptr<const Transaction> tx;\n\t\ttry {\n\t\t\ttx = get_transaction(id);\n\t\t} catch(...) {\n\t\t\t// ignore\n\t\t}\n\t\tlist.push_back(tx);\n\t}\n\treturn list;\n}\n\ninline bool filter_txio(const txio_entry_t& entry, const query_filter_t& filter)\n{\n\tif(filter.type && entry.type != *filter.type) {\n\t\treturn false;\n\t}\n\tif(!filter.currency.empty() && !filter.currency.count(entry.contract)) {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nstd::vector<tx_entry_t> Node::get_history(const std::vector<addr_t>& addresses, const query_filter_t& filter) const\n{\n\tif(const auto& memo = filter.memo) {\n\t\treturn get_history_memo(addresses, *memo, filter);\n\t}\n\tif(filter.limit == 0) {\n\t\treturn {};\n\t}\n\tstd::map<addr_t, uint32_t> count_map;\n\tstd::map<addr_t, std::tuple<addr_t, uint32_t, uint32_t>> state_map;\n\n\tconst std::set<addr_t> address_set(addresses.begin(), addresses.end());\n\tfor(const auto& address : address_set) {\n\t\tstate_map[address] = std::make_tuple(address, filter.until, -1);\n\t}\n\tconst uint32_t chunk_size = 100;\n\tconst uint64_t max_search = filter.max_search ? filter.max_search : -1;\n\n\tuint64_t num_search = 0;\n\tstd::vector<tx_entry_t> res;\n\twhile(!state_map.empty() && num_search < max_search) {\n\t\tstd::vector<addr_t> done;\n\t\tfor(auto& entry : state_map) {\n\t\t\tconst auto& address = entry.first;\n\t\t\tstd::vector<std::pair<std::tuple<addr_t, uint32_t, uint32_t>, txio_entry_t>> entries;\n\t\t\tnum_search += txio_log.find_last_range(\n\t\t\t\t\tstd::make_tuple(address, filter.since, 0), entry.second, entries, chunk_size);\n\n\t\t\tauto& count = count_map[address];\n\t\t\tfor(const auto& entry : entries) {\n\t\t\t\tif(filter_txio(entry.second, filter)) {\n\t\t\t\t\tres.push_back(tx_entry_t::create_ex(entry.second));\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(entries.size()) {\n\t\t\t\tentry.second = entries.back().first;\n\t\t\t}\n\t\t\tif(entries.size() < chunk_size || count >= uint32_t(filter.limit)) {\n\t\t\t\tdone.push_back(address);\n\t\t\t}\n\t\t}\n\t\tfor(const auto& address : done) {\n\t\t\t// add remaining entries for last block\n\t\t\tauto end = state_map[address];\n\t\t\tauto begin = end;\n\t\t\tstd::get<2>(begin) = 0;\n\t\t\tstd::vector<txio_entry_t> more;\n\t\t\tnum_search += txio_log.find_last_range(begin, end, more, -1);\n\t\t\tfor(const auto& entry : more) {\n\t\t\t\tif(filter_txio(entry, filter)) {\n\t\t\t\t\tres.push_back(tx_entry_t::create_ex(entry));\n\t\t\t\t}\n\t\t\t}\n\t\t\tstate_map.erase(address);\n\t\t}\n\t}\n\n\tif(filter.with_pending) {\n\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\tfor(const auto& address : address_set) {\n\t\t\tconst auto begin = tx_pool_index.lower_bound(std::make_pair(address, hash_t()));\n\t\t\tconst auto end = tx_pool_index.upper_bound(std::make_pair(address, hash_t::ones()));\n\t\t\tfor(auto iter = begin; iter != end; ++iter) {\n\t\t\t\tif(auto tx = iter->second) {\n\t\t\t\t\tfor(const auto& in : tx->get_inputs()) {\n\t\t\t\t\t\tif(address_set.count(in.address)) {\n\t\t\t\t\t\t\ttx_entry_t entry;\n\t\t\t\t\t\t\tentry.txio_t::operator=(in);\n\t\t\t\t\t\t\tentry.type = tx_type_e::SPEND;\n\t\t\t\t\t\t\tentry.txid = tx->id;\n\t\t\t\t\t\t\tentry.height = -1;\n\t\t\t\t\t\t\tentry.is_pending = true;\n\t\t\t\t\t\t\tres.push_back(entry);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor(const auto& out : tx->get_outputs()) {\n\t\t\t\t\t\tif(address_set.count(out.address)) {\n\t\t\t\t\t\t\ttx_entry_t entry;\n\t\t\t\t\t\t\tentry.txio_t::operator=(out);\n\t\t\t\t\t\t\tentry.type = tx_type_e::RECEIVE;\n\t\t\t\t\t\t\tentry.txid = tx->id;\n\t\t\t\t\t\t\tentry.height = -1;\n\t\t\t\t\t\t\tentry.is_pending = true;\n\t\t\t\t\t\t\tres.push_back(entry);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tstd::sort(res.begin(), res.end(), [](const tx_entry_t& L, const tx_entry_t& R) -> bool {\n\t\treturn std::make_tuple(L.height, L.txid, L.type, L.contract, L.address, L.memo, L.amount) >\n\t\t\t   std::make_tuple(R.height, R.txid, R.type, R.contract, R.address, R.memo, R.amount);\n\t});\n\tif(filter.limit > 0 && res.size() > size_t(filter.limit)) {\n\t\tsize_t i = filter.limit - 1;\n\t\tfor(const auto cutoff = res[i].height; i < res.size() && res[i].height == cutoff; ++i);\n\t\tres.resize(i);\n\t}\n\treturn res;\n}\n\nstd::vector<tx_entry_t> Node::get_history_memo(const std::vector<addr_t>& addresses, const std::string& memo, const query_filter_t& filter) const\n{\n\tif(filter.limit == 0) {\n\t\treturn {};\n\t}\n\tstd::map<addr_t, uint32_t> count_map;\n\tstd::map<addr_t, std::tuple<hash_t, uint32_t, uint32_t>> state_map;\n\n\tconst std::set<addr_t> address_set(addresses.begin(), addresses.end());\n\tfor(const auto& address : address_set) {\n\t\tstate_map[address] = std::make_tuple(hash_t(address + memo), filter.until, -1);\n\t}\n\tconst uint32_t chunk_size = 100;\n\tconst uint64_t max_search = filter.max_search ? filter.max_search : -1;\n\n\tuint64_t num_search = 0;\n\tstd::vector<tx_entry_t> res;\n\twhile(!state_map.empty() && num_search < max_search) {\n\t\tstd::vector<addr_t> done;\n\t\tfor(auto& entry : state_map) {\n\t\t\tconst auto& address = entry.first;\n\t\t\tconst auto& key = std::get<0>(entry.second);\n\n\t\t\tstd::vector<std::pair<std::tuple<hash_t, uint32_t, uint32_t>, addr_t>> entries;\n\t\t\tnum_search += memo_log.find_last_range(std::make_tuple(key, filter.since, 0), entry.second, entries, chunk_size);\n\n\t\t\tauto& count = count_map[address];\n\t\t\tfor(const auto& index : entries) {\n\t\t\t\ttxio_entry_t entry;\n\t\t\t\tif(txio_log.find(std::make_tuple(index.second, std::get<1>(index.first), std::get<2>(index.first)), entry)) {\n\t\t\t\t\tif(filter_txio(entry, filter)) {\n\t\t\t\t\t\tres.push_back(tx_entry_t::create_ex(entry));\n\t\t\t\t\t\tcount++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(entries.size()) {\n\t\t\t\tentry.second = entries.back().first;\n\t\t\t}\n\t\t\tif(entries.size() < chunk_size || count >= uint32_t(filter.limit)) {\n\t\t\t\tdone.push_back(address);\n\t\t\t}\n\t\t}\n\t\tfor(const auto& address : done) {\n\t\t\tstate_map.erase(address);\n\t\t}\n\t}\n\n\tif(filter.with_pending) {\n\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\tfor(const auto& address : address_set) {\n\t\t\tconst hash_t key(address + memo);\n\t\t\tconst auto begin = tx_pool_index.lower_bound(std::make_pair(key, hash_t()));\n\t\t\tconst auto end = tx_pool_index.upper_bound(std::make_pair(key, hash_t::ones()));\n\t\t\tfor(auto iter = begin; iter != end; ++iter) {\n\t\t\t\tif(auto tx = iter->second) {\n\t\t\t\t\tfor(const auto& out : tx->get_outputs()) {\n\t\t\t\t\t\tif(address_set.count(out.address) && out.memo && (*out.memo) == memo) {\n\t\t\t\t\t\t\ttx_entry_t entry;\n\t\t\t\t\t\t\tentry.txio_t::operator=(out);\n\t\t\t\t\t\t\tentry.type = tx_type_e::RECEIVE;\n\t\t\t\t\t\t\tentry.txid = tx->id;\n\t\t\t\t\t\t\tentry.height = -1;\n\t\t\t\t\t\t\tentry.is_pending = true;\n\t\t\t\t\t\t\tres.push_back(entry);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tstd::sort(res.begin(), res.end(), [](const tx_entry_t& L, const tx_entry_t& R) -> bool {\n\t\treturn std::make_tuple(L.height, L.txid, L.type, L.contract, L.address, L.memo, L.amount) >\n\t\t\t   std::make_tuple(R.height, R.txid, R.type, R.contract, R.address, R.memo, R.amount);\n\t});\n\tif(filter.limit > 0 && res.size() > size_t(filter.limit)) {\n\t\tsize_t i = filter.limit - 1;\n\t\tfor(const auto cutoff = res[i].height; i < res.size() && res[i].height == cutoff; ++i);\n\t\tres.resize(i);\n\t}\n\treturn res;\n}\n\nstd::shared_ptr<const Contract> Node::get_contract(const addr_t& address) const\n{\n\treturn get_contract_ex(address);\n}\n\nstd::shared_ptr<const Contract> Node::get_contract_ex(const addr_t& address, uint64_t* read_cost, const uint64_t gas_limit) const\n{\n\tif(read_cost) {\n\t\ttx_index_t index;\n\t\ttx_index.find(address, index);\n\n\t\tconst auto cost = params->min_txfee_read + index.contract_read_cost;\n\t\tif(*read_cost + cost > gas_limit) {\n\t\t\tthrow std::runtime_error(\"not enough gas to read contract\");\n\t\t}\n\t\t*read_cost += cost;\n\t}\n\tstd::shared_ptr<const Contract> contract;\n\t{\n\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\tcontract = find_value(contract_cache, address, nullptr);\n\t}\n\tif(!contract) {\n\t\tcontract_map.find(address, contract);\n\n\t\tif(std::dynamic_pointer_cast<const contract::Binary>(contract))\n\t\t{\n\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\tif((contract_cache.size() + 1) >> 16) {\n\t\t\t\tcontract_cache.clear();\n\t\t\t}\n\t\t\tcontract_cache[address] = contract;\n\t\t}\n\t}\n\treturn contract;\n}\n\nstd::shared_ptr<const Contract> Node::get_contract_for(const addr_t& address) const\n{\n\treturn get_contract_for_ex(address);\n}\n\nstd::shared_ptr<const Contract> Node::get_contract_for_ex(const addr_t& address, uint64_t* read_cost, const uint64_t gas_limit) const\n{\n\tif(auto contract = get_contract_ex(address, read_cost, gas_limit)) {\n\t\treturn contract;\n\t}\n\tauto pubkey = contract::PubKey::create();\n\tpubkey->address = address;\n\treturn pubkey;\n}\n\nstd::vector<std::shared_ptr<const Contract>> Node::get_contracts(const std::vector<addr_t>& addresses) const\n{\n\tstd::vector<std::shared_ptr<const Contract>> res;\n\tfor(const auto& addr : addresses) {\n\t\tres.push_back(get_contract(addr));\n\t}\n\treturn res;\n}\n\nstd::vector<addr_t> Node::get_contracts_by(const std::vector<addr_t>& addresses, const vnx::optional<hash_t>& type_hash) const\n{\n\tstd::vector<addr_t> result;\n\tfor(const auto& address : addresses) {\n\t\tstd::vector<std::pair<addr_t, hash_t>> list;\n\t\tdeploy_map.find_range(std::make_tuple(address, 0, 0), std::make_tuple(address, -1, -1), list);\n\t\tfor(const auto& entry : list) {\n\t\t\tif(!type_hash || entry.second == *type_hash) {\n\t\t\t\tresult.push_back(entry.first);\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nstd::vector<addr_t> Node::get_contracts_owned_by(const std::vector<addr_t>& addresses, const vnx::optional<hash_t>& type_hash) const\n{\n\tstd::vector<addr_t> result;\n\tfor(const auto& address : addresses) {\n\t\tstd::vector<std::pair<addr_t, hash_t>> list;\n\t\towner_map.find_range(std::make_tuple(address, 0, 0), std::make_tuple(address, -1, -1), list);\n\t\tfor(const auto& entry : list) {\n\t\t\tif(!type_hash || entry.second == *type_hash) {\n\t\t\t\tresult.push_back(entry.first);\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nuint128 Node::get_balance(const addr_t& address, const addr_t& currency) const\n{\n\tuint128 value = 0;\n\tbalance_table.find(std::make_pair(address, currency), value);\n\treturn value;\n}\n\nuint128 Node::get_total_balance(const std::vector<addr_t>& addresses, const addr_t& currency) const\n{\n\tuint128 total = 0;\n\tfor(const auto& address : std::set<addr_t>(addresses.begin(), addresses.end())) {\n\t\ttotal += get_balance(address, currency);\n\t}\n\treturn total;\n}\n\nstd::map<addr_t, uint128> Node::get_balances(const addr_t& address, const std::set<addr_t>& whitelist, const int32_t& limit) const\n{\n\treturn get_total_balances({address}, whitelist, limit);\n}\n\nstd::map<addr_t, balance_t> Node::get_contract_balances(\n\t\tconst addr_t& address, const std::set<addr_t>& whitelist, const int32_t& limit) const\n{\n\tbool is_locked = false;\n\tif(auto exec = get_contract_as<contract::Executable>(address)) {\n\t\tif(auto bin = get_contract_as<contract::Binary>(exec->binary)) {\n\t\t\tconst std::string method = \"is_locked\";\n\t\t\tif(vm::find_method(bin, method)) {\n\t\t\t\tis_locked = call_contract(address, method, {}).to<bool>();\n\t\t\t}\n\t\t}\n\t}\n\tstd::map<addr_t, balance_t> out;\n\tfor(const auto& entry : get_total_balances({address}, whitelist, limit)) {\n\t\tconst auto& amount = entry.second;\n\t\tauto& balance = out[entry.first];\n\t\tif(is_locked) {\n\t\t\tbalance.locked = amount;\n\t\t} else {\n\t\t\tbalance.spendable = amount;\n\t\t}\n\t\tbalance.total = amount;\n\t\tbalance.is_validated = !whitelist.empty();\n\t}\n\treturn out;\n}\n\nstd::map<addr_t, uint128> Node::get_total_balances(\n\t\tconst std::vector<addr_t>& addresses, const std::set<addr_t>& whitelist, const int32_t& limit) const\n{\n\tstd::map<addr_t, uint128> totals;\n\tfor(const auto& address : std::set<addr_t>(addresses.begin(), addresses.end())) {\n\t\tif(whitelist.empty()) {\n\t\t\tstd::vector<std::pair<std::pair<addr_t, addr_t>, uint128>> result;\n\t\t\tbalance_table.find_range(std::make_pair(address, addr_t()), std::make_pair(address, addr_t::ones()), result, limit);\n\t\t\tfor(const auto& entry : result) {\n\t\t\t\tif(entry.second) {\n\t\t\t\t\ttotals[entry.first.second] += entry.second;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(const auto& currency : whitelist) {\n\t\t\t\tuint128 balance;\n\t\t\t\tbalance_table.find(std::make_pair(address, currency), balance);\n\t\t\t\tif(balance) {\n\t\t\t\t\ttotals[currency] += balance;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn totals;\n}\n\nstd::map<std::pair<addr_t, addr_t>, uint128> Node::get_all_balances(\n\t\tconst std::vector<addr_t>& addresses, const std::set<addr_t>& whitelist, const int32_t& limit) const\n{\n\tstd::map<std::pair<addr_t, addr_t>, uint128> totals;\n\tfor(const auto& address : std::set<addr_t>(addresses.begin(), addresses.end())) {\n\t\tif(whitelist.empty()) {\n\t\t\tstd::vector<std::pair<std::pair<addr_t, addr_t>, uint128>> result;\n\t\t\tbalance_table.find_range(std::make_pair(address, addr_t()), std::make_pair(address, addr_t::ones()), result, limit);\n\t\t\tfor(const auto& entry : result) {\n\t\t\t\tif(entry.second) {\n\t\t\t\t\ttotals[entry.first] += entry.second;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(const auto& currency : whitelist) {\n\t\t\t\tuint128 balance;\n\t\t\t\tbalance_table.find(std::make_pair(address, currency), balance);\n\t\t\t\tif(balance) {\n\t\t\t\t\ttotals[std::make_pair(address, currency)] += balance;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn totals;\n}\n\nstd::vector<exec_entry_t> Node::get_exec_history(const addr_t& address, const int32_t& limit, const vnx::bool_t& recent) const\n{\n\tstd::vector<exec_entry_t> entries;\n\tif(recent) {\n\t\texec_log.find_last_range(std::make_tuple(address, 0, 0), std::make_tuple(address, -1, -1), entries, limit);\n\t} else {\n\t\texec_log.find_range(std::make_tuple(address, 0, 0), std::make_tuple(address, -1, -1), entries, limit);\n\t}\n\treturn entries;\n}\n\nstd::map<std::string, vm::varptr_t> Node::read_storage(const addr_t& contract, const uint32_t& height) const\n{\n\tstd::map<std::string, vm::varptr_t> out;\n\tif(auto exec = std::dynamic_pointer_cast<const contract::Executable>(get_contract(contract))) {\n\t\tif(auto bin = std::dynamic_pointer_cast<const contract::Binary>(get_contract(exec->binary))) {\n\t\t\tfor(const auto& entry : bin->fields) {\n\t\t\t\tif(auto var = storage->read(contract, entry.second)) {\n\t\t\t\t\tout[entry.first] = std::move(var);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn out;\n}\n\nstd::map<uint64_t, vm::varptr_t> Node::dump_storage(const addr_t& contract, const uint32_t& height) const\n{\n\tconst auto entries = storage->find_range(contract, vm::MEM_STATIC, -1, height);\n\treturn std::map<uint64_t, vm::varptr_t>(entries.begin(), entries.end());\n}\n\nvm::varptr_t Node::read_storage_var(const addr_t& contract, const uint64_t& address, const uint32_t& height) const\n{\n\treturn storage->read_ex(contract, address, height);\n}\n\nvm::varptr_t Node::read_storage_entry_var(const addr_t& contract, const uint64_t& address, const uint64_t& key, const uint32_t& height) const\n{\n\treturn storage->read_ex(contract, address, key, height);\n}\n\nstd::pair<vm::varptr_t, uint64_t> Node::read_storage_field(const addr_t& contract, const std::string& name, const uint32_t& height) const\n{\n\tif(auto exec = get_contract_as<contract::Executable>(contract)) {\n\t\tif(auto bin = get_contract_as<contract::Binary>(exec->binary)) {\n\t\t\tif(auto addr = bin->find_field(name)) {\n\t\t\t\treturn std::make_pair(read_storage_var(contract, *addr, height), *addr);\n\t\t\t}\n\t\t}\n\t}\n\treturn {};\n}\n\nstd::tuple<vm::varptr_t, uint64_t, uint64_t> Node::read_storage_entry_var(const addr_t& contract, const std::string& name, const vm::varptr_t& key, const uint32_t& height) const\n{\n\tconst auto field = read_storage_field(contract, name, height);\n\tif(auto var = field.first) {\n\t\tuint64_t address = field.second;\n\t\tif(var->type == vm::TYPE_REF) {\n\t\t\taddress = vm::to_ref(var);\n\t\t}\n\t\tif(auto entry = storage->lookup(contract, key)) {\n\t\t\treturn std::make_tuple(read_storage_entry_var(contract, address, entry, height), address, entry);\n\t\t}\n\t}\n\treturn {};\n}\n\nstd::tuple<vm::varptr_t, uint64_t, uint64_t> Node::read_storage_entry_addr(const addr_t& contract, const std::string& name, const addr_t& key, const uint32_t& height) const\n{\n\treturn read_storage_entry_var(contract, name, vm::to_binary(key), height);\n}\n\nstd::tuple<vm::varptr_t, uint64_t, uint64_t> Node::read_storage_entry_string(const addr_t& contract, const std::string& name, const std::string& key, const uint32_t& height) const\n{\n\treturn read_storage_entry_var(contract, name, vm::to_binary(key), height);\n}\n\nstd::vector<vm::varptr_t> Node::read_storage_array(const addr_t& contract, const uint64_t& address, const uint32_t& height) const\n{\n\treturn storage->read_array(contract, address, height);\n}\n\nstd::map<vm::varptr_t, vm::varptr_t> Node::read_storage_map(const addr_t& contract, const uint64_t& address, const uint32_t& height) const\n{\n\tstd::map<vm::varptr_t, vm::varptr_t> out;\n\tif(auto exec = std::dynamic_pointer_cast<const contract::Executable>(get_contract(contract))) {\n\t\tif(auto bin = std::dynamic_pointer_cast<const contract::Binary>(get_contract(exec->binary))) {\n\t\t\tauto engine = std::make_shared<vm::Engine>(contract, storage, true);\n\t\t\tengine->gas_limit = params->max_tx_cost;\n\t\t\tvm::load(engine, bin);\n\t\t\tfor(const auto& entry : storage->find_entries(contract, address, height)) {\n\t\t\t\t// need to use engine to support constant keys\n\t\t\t\tif(auto key = engine->read(entry.first)) {\n\t\t\t\t\tout[vm::clone(key)] = entry.second;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn out;\n}\n\nstd::map<std::string, vm::varptr_t> Node::read_storage_object(const addr_t& contract, const uint64_t& address, const uint32_t& height) const\n{\n\tstd::map<std::string, vm::varptr_t> out;\n\tfor(const auto& entry : read_storage_map(contract, address, height)) {\n\t\tout[to_string_value(entry.first)] = entry.second;\n\t}\n\treturn out;\n}\n\nvnx::Variant Node::call_contract(\n\t\tconst addr_t& address, const std::string& method, const std::vector<vnx::Variant>& args,\n\t\tconst vnx::optional<addr_t>& user, const vnx::optional<std::pair<addr_t, uint128>>& deposit) const\n{\n\t// Note: consensus relevant\n\tif(auto exec = get_contract_as<contract::Executable>(address)) {\n\t\tif(auto bin = get_contract_as<contract::Binary>(exec->binary)) {\n\t\t\tauto func = vm::find_method(bin, method);\n\t\t\tif(!func) {\n\t\t\t\tthrow std::runtime_error(\"no such method: \" + method);\n\t\t\t}\n\t\t\tauto engine = std::make_shared<vm::Engine>(address, storage, func->is_const);\n\t\t\tengine->gas_limit = params->max_tx_cost;\n\t\t\tvm::load(engine, bin);\n\t\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_TXID, vm::var_t());\n\t\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_HEIGHT, vm::uint_t(get_height()));\n\t\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_ADDRESS, vm::to_binary(address));\n\t\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_NETWORK, vm::to_binary(params->network));\n\t\t\tif(user) {\n\t\t\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_USER, vm::to_binary(*user));\n\t\t\t} else {\n\t\t\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_USER, vm::var_t());\n\t\t\t}\n\t\t\tif(deposit) {\n\t\t\t\tvm::set_deposit(engine, deposit->first, deposit->second);\n\t\t\t}\n\t\t\tvm::set_args(engine, args);\n\t\t\ttry {\n\t\t\t\tvm::execute(engine, *func, false);\n\t\t\t} catch(const std::exception& ex) {\n\t\t\t\tif(auto line = bin->find_line(engine->error_addr)) {\n\t\t\t\t\tthrow std::runtime_error(\"exception at 0x\" + vnx::to_hex_string(engine->error_addr) + \", line \" + std::to_string(*line) + \": \" + ex.what());\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::runtime_error(\"exception at 0x\" + vnx::to_hex_string(engine->error_addr) + \": \" + ex.what());\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn vm::read(engine, vm::MEM_STACK);\n\t\t}\n\t\tthrow std::runtime_error(\"no such binary\");\n\t}\n\tthrow std::runtime_error(\"no such contract\");\n}\n\nuint128 Node::get_total_supply(const addr_t& currency) const\n{\n\tuint128 total = 0;\n\ttotal_supply_map.find(currency, total);\n\treturn clamped_sub(total, get_balance(addr_t(), currency));\n}\n\nvnx::optional<plot_nft_info_t> Node::get_plot_nft_info(const addr_t& address) const\n{\n\tif(auto exec = get_contract_as<contract::Executable>(address)) {\n\t\tif(exec->binary == params->plot_nft_binary) {\n\t\t\tauto data = read_storage(address);\n\t\t\tplot_nft_info_t info;\n\t\t\tinfo.name = exec->name;\n\t\t\tinfo.owner = to_addr(data[\"owner\"]);\n\t\t\tinfo.address = address;\n\t\t\tconst auto& unlock_height = data[\"unlock_height\"];\n\t\t\tif(unlock_height && unlock_height->type == vm::TYPE_UINT) {\n\t\t\t\tconst uint32_t unlock_at = to_uint(unlock_height);\n\t\t\t\tinfo.unlock_height = unlock_at;\n\t\t\t\tinfo.is_locked = get_height() < unlock_at;\n\t\t\t} else {\n\t\t\t\tinfo.is_locked = true;\n\t\t\t}\n\t\t\tif(info.is_locked) {\n\t\t\t\tinfo.target = to_addr(data[\"target\"]);\n\t\t\t}\n\t\t\tconst auto server_url = data[\"server_url\"];\n\t\t\tif(server_url && server_url->type == vm::TYPE_STRING) {\n\t\t\t\tinfo.server_url = to_string_value(server_url);\n\t\t\t}\n\t\t\treturn info;\n\t\t}\n\t}\n\treturn nullptr;\n}\n\naddr_t Node::get_plot_nft_target(const addr_t& address, const vnx::optional<addr_t>& farmer_addr) const\n{\n\t// Note: consensus relevant\n\tif(auto exec = get_contract_as<contract::Executable>(address)) try {\n\t\tif(auto bin = get_contract_as<contract::Binary>(exec->binary)) {\n\t\t\tconst std::string method = \"mmx_reward_target\";\n\t\t\tif(vm::find_method(bin, method)) {\n\t\t\t\tvnx::Variant arg0;\n\t\t\t\tif(farmer_addr) {\n\t\t\t\t\targ0 = farmer_addr->to_string();\n\t\t\t\t}\n\t\t\t\treturn call_contract(address, method, {arg0}).to<addr_t>();\n\t\t\t}\n\t\t}\n\t}\n\tcatch(const std::exception& ex) {\n\t\tthrow std::logic_error(\"mmx_reward_target() failed with: \" + std::string(ex.what()));\n\t}\n\treturn address;\n}\n\noffer_data_t Node::get_offer(const addr_t& address) const\n{\n\tauto data = read_storage(address);\n\tif(data.empty()) {\n\t\tthrow std::runtime_error(\"no such offer: \" + address.to_string());\n\t}\n\toffer_data_t out;\n\tout.address = address;\n\t{\n\t\ttx_index_t entry;\n\t\tif(tx_index.find(address, entry)) {\n\t\t\tout.height = entry.height;\n\t\t\tout.time_stamp = entry.time_stamp;\n\t\t}\n\t}\n\tif(auto partner = data[\"partner\"]) {\n\t\tif(partner->type != vm::TYPE_NIL) {\n\t\t\tout.partner = to_addr(partner);\n\t\t}\n\t}\n\tout.owner = to_addr(data[\"owner\"]);\n\tout.bid_currency = to_addr(data[\"bid_currency\"]);\n\tout.ask_currency = to_addr(data[\"ask_currency\"]);\n\tout.bid_balance = get_balance(address, out.bid_currency);\n\tout.ask_balance = get_balance(address, out.ask_currency);\n\tout.inv_price = to_uint(data[\"inv_price\"]);\n\tout.last_update = to_uint(data[\"last_update\"]);\n\tout.price = out.get_price();\n\tout.ask_amount = out.get_ask_amount(out.bid_balance);\n\treturn out;\n}\n\nint Node::get_offer_state(const addr_t& address) const\n{\n\tif(get_balance(address, to_addr(read_storage_field(address, \"bid_currency\").first))) {\n\t\treturn 1;\n\t}\n\tif(get_balance(address, to_addr(read_storage_field(address, \"ask_currency\").first))) {\n\t\treturn 2;\n\t}\n\treturn 0;\n}\n\nstd::vector<offer_data_t> Node::fetch_offers(const std::vector<addr_t>& addresses, const vnx::bool_t& state, const vnx::bool_t& closed) const\n{\n\tstd::vector<offer_data_t> out;\n\tfor(const auto& address : addresses) {\n\t\tconst int offer_state = state ? get_offer_state(address) : -1;\n\t\tif(!state || offer_state == 1 || (closed && offer_state == 2)) {\n\t\t\tconst auto data = get_offer(address);\n\t\t\tif(!data.partner && !data.is_scam()) {\n\t\t\t\tout.push_back(data);\n\t\t\t}\n\t\t}\n\t}\n\treturn out;\n}\n\nstd::vector<offer_data_t> Node::get_offers(const uint32_t& since, const vnx::bool_t& state) const\n{\n\tstd::vector<addr_t> entries;\n\tcontract_log.find_range(std::make_tuple(params->offer_binary, since, 0), std::make_tuple(params->offer_binary, -1, -1), entries);\n\treturn fetch_offers(entries, state);\n}\n\nstd::vector<offer_data_t> Node::get_offers_by(const std::vector<addr_t>& owners, const vnx::bool_t& state) const\n{\n\treturn fetch_offers(get_contracts_owned_by(owners, params->offer_binary), state, true);\n}\n\nstd::vector<offer_data_t> Node::get_recent_offers(const int32_t& limit, const vnx::bool_t& state) const\n{\n\tstd::vector<offer_data_t> result;\n\tstd::tuple<hash_t, uint32_t, uint32_t> offer_log_end(params->offer_binary, -1, -1);\n\tstd::tuple<hash_t, uint32_t, uint32_t> offer_log_begin(params->offer_binary, 0, 0);\n\n\twhile(result.size() < size_t(limit)) {\n\t\tstd::vector<std::pair<std::tuple<hash_t, uint32_t, uint32_t>, addr_t>> entries;\n\t\tif(!contract_log.find_last_range(offer_log_begin, offer_log_end, entries, std::max<size_t>(limit, 100))) {\n\t\t\tbreak;\n\t\t}\n\t\toffer_log_end = entries.back().first;\n\n\t\tstd::vector<addr_t> list;\n\t\tfor(const auto& entry : entries) {\n\t\t\tlist.push_back(entry.second);\n\t\t}\n\t\tconst auto tmp = fetch_offers(list, state);\n\t\tresult.insert(result.end(), tmp.begin(), tmp.end());\n\t}\n\tresult.resize(std::min(result.size(), size_t(limit)));\n\treturn result;\n}\n\nstd::vector<offer_data_t> Node::get_recent_offers_for(\n\t\tconst vnx::optional<addr_t>& bid, const vnx::optional<addr_t>& ask, const uint128& min_bid, const int32_t& limit, const vnx::bool_t& state) const\n{\n\tstd::vector<offer_data_t> result;\n\tif(!bid && !ask) {\n\t\tresult = get_recent_offers(limit, state);\n\t} else {\n\t\thash_t key;\n\t\tif(bid && ask) {\n\t\t\tkey = hash_t(*ask + *bid);\n\t\t} else if(bid) {\n\t\t\tkey = hash_t(\"ANY\" + *bid);\n\t\t} else if(ask) {\n\t\t\tkey = hash_t(*ask + \"ANY\");\n\t\t}\n\t\tstd::tuple<hash_t, uint32_t, uint32_t> search_end(key, -1, -1);\n\t\twhile(result.size() < size_t(limit)) {\n\t\t\tstd::vector<std::pair<std::tuple<hash_t, uint32_t, uint32_t>, addr_t>> list;\n\t\t\tif(!offer_index.find_last_range(std::make_tuple(key, 0, 0), search_end, list, limit)) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tstd::vector<addr_t> addresses;\n\t\t\tfor(const auto& entry : list) {\n\t\t\t\taddresses.push_back(entry.second);\n\t\t\t}\n\t\t\tfor(const auto& entry : fetch_offers(addresses, state)) {\n\t\t\t\tif(entry.bid_balance >= min_bid) {\n\t\t\t\t\tresult.push_back(entry);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsearch_end = list.back().first;\n\t\t}\n\t}\n\tstd::sort(result.begin(), result.end(),\n\t\t[](const offer_data_t& L, const offer_data_t& R) -> bool {\n\t\t\treturn std::make_pair(L.height, L.address) > std::make_pair(R.height, R.address);\n\t\t});\n\tresult.resize(std::min(result.size(), size_t(limit)));\n\treturn result;\n}\n\ntrade_entry_t Node::make_trade_entry(const uint32_t& height, const trade_log_t& log) const\n{\n\ttrade_entry_t out;\n\tout.height = height;\n\tout.time_stamp = log.time_stamp;\n\tout.address = log.address;\n\tout.txid = log.txid;\n\tout.ask_amount = log.ask_amount;\n\tout.bid_amount = log.get_bid_amount();\n\tout.price = log.get_price();\n\tout.bid_currency = to_addr(read_storage_field(log.address, \"bid_currency\").first);\n\tout.ask_currency = to_addr(read_storage_field(log.address, \"ask_currency\").first);\n\treturn out;\n}\n\nstd::vector<trade_entry_t> Node::get_trade_history(const int32_t& limit, const uint32_t& since) const\n{\n\tstd::vector<std::pair<std::pair<uint32_t, uint32_t>, trade_log_t>> entries;\n\ttrade_log.find_last_range(std::make_pair(since, 0), std::make_pair(-1, -1), entries, limit);\n\n\tstd::vector<trade_entry_t> result;\n\tfor(const auto& entry : entries) {\n\t\tresult.push_back(make_trade_entry(entry.first.first, entry.second));\n\t}\n\treturn result;\n}\n\nstd::vector<trade_entry_t> Node::get_trade_history_for(\n\t\t\tconst vnx::optional<addr_t>& bid, const vnx::optional<addr_t>& ask, const int32_t& limit, const uint32_t& since) const\n{\n\tif(!bid && !ask) {\n\t\treturn get_trade_history(limit, since);\n\t}\n\thash_t key;\n\tif(bid && ask) {\n\t\tkey = hash_t((*ask) + (*bid));\n\t} else if(bid) {\n\t\tkey = hash_t(\"ANY\" + (*bid));\n\t} else if(ask) {\n\t\tkey = hash_t((*ask) + \"ANY\");\n\t}\n\tstd::vector<std::pair<std::tuple<hash_t, uint32_t, uint32_t>, bool>> entries;\n\ttrade_index.find_last_range(std::make_tuple(key, since, 0), std::make_tuple(key, -1, -1), entries, limit);\n\n\tstd::vector<trade_entry_t> result;\n\tfor(const auto& entry : entries) {\n\t\tconst auto& height = std::get<1>(entry.first);\n\t\tconst auto& counter = std::get<2>(entry.first);\n\t\ttrade_log_t log;\n\t\tif(trade_log.find(std::make_pair(height, counter), log)) {\n\t\t\tresult.push_back(make_trade_entry(height, log));\n\t\t}\n\t}\n\treturn result;\n}\n\nstd::vector<swap_info_t> Node::get_swaps(\n\t\tconst uint32_t& since, const vnx::optional<addr_t>& token, const vnx::optional<addr_t>& currency, const int32_t& limit) const\n{\n\tstd::vector<addr_t> list;\n\tif(!token && !currency) {\n\t\tcontract_log.find_range(std::make_tuple(params->swap_binary, since, 0), std::make_tuple(params->swap_binary, -1, -1), list, limit);\n\t} else {\n\t\thash_t key;\n\t\tif(token && currency) {\n\t\t\tkey = hash_t(*token + *currency);\n\t\t} else if(token) {\n\t\t\tkey = hash_t(*token + \"ANY\");\n\t\t} else if(currency) {\n\t\t\tkey = hash_t(\"ANY\" + *currency);\n\t\t}\n\t\tswap_index.find_range(std::make_tuple(key, since, 0), std::make_tuple(key, -1, -1), list, limit);\n\t}\n\n\tstd::vector<swap_info_t> result;\n\tfor(const auto& address : list) {\n\t\tresult.push_back(get_swap_info(address));\n\t}\n\tif(token) {\n\t\tstd::sort(result.begin(), result.end(), [](const swap_info_t& L, const swap_info_t& R) -> bool {\n\t\t\treturn L.balance[0] > R.balance[0];\n\t\t});\n\t} else if(currency) {\n\t\tstd::sort(result.begin(), result.end(), [](const swap_info_t& L, const swap_info_t& R) -> bool {\n\t\t\treturn L.balance[1] > R.balance[1];\n\t\t});\n\t} else {\n\t\tstd::sort(result.begin(), result.end(), [](const swap_info_t& L, const swap_info_t& R) -> bool {\n\t\t\tif(!L.user_total[0] || !L.user_total[1]) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif(!R.user_total[0] || !R.user_total[1]) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn (L.avg_apy_7d[0] + L.avg_apy_7d[1]) > (R.avg_apy_7d[0] + R.avg_apy_7d[1]);\n\t\t});\n\t}\n\treturn result;\n}\n\nswap_info_t Node::get_swap_info(const addr_t& address) const\n{\n\tauto swap = get_contract_as<const contract::Executable>(address);\n\tif(!swap) {\n\t\tthrow std::runtime_error(\"no such swap: \" + address.to_string());\n\t}\n\tconst auto height = get_height();\n\n\tswap_info_t out;\n\tout.name = swap->name;\n\tout.address = address;\n\n\tauto data = read_storage(address);\n\tconst auto ref_volume = to_ref(data[\"volume\"]);\n\tconst auto tokens = read_storage_array(address, to_ref(data[\"tokens\"]));\n\tconst auto volume = read_storage_array(address, ref_volume);\n\tfor(size_t i = 0; i < 2 && i < tokens.size(); ++i) {\n\t\tout.tokens[i] = to_addr(tokens[i]);\n\t\tout.volume[i] = to_uint(volume[i]);\n\t\tout.wallet[i] = get_balance(address, out.tokens[i]);\n\t}\n\n\tconst auto fee_rates = read_storage_array(address, to_ref(data[\"fee_rates\"]));\n\tfor(const auto& value : fee_rates) {\n\t\tout.fee_rates.push_back(uint128(to_uint(value)).to_double() / pow(2, 64));\n\t}\n\tconst auto state = read_storage_array(address, to_ref(data[\"state\"]));\n\n\tuint256_t prev_fees_paid_1d[2] = {};\n\tuint256_t prev_fees_paid_7d[2] = {};\n\n\tfor(const auto& entry : state) {\n\t\tauto obj = read_storage_object(address, to_ref(entry));\n\t\tconst auto balance = read_storage_array(address, to_ref(obj[\"balance\"]));\n\t\tconst auto fees_paid = read_storage_array(address, to_ref(obj[\"fees_paid\"]));\n\t\tconst auto fees_claimed = read_storage_array(address, to_ref(obj[\"fees_claimed\"]));\n\t\tconst auto user_total = read_storage_array(address, to_ref(obj[\"user_total\"]));\n\n\t\tswap_pool_info_t pool;\n\t\tfor(size_t i = 0; i < 2 && i < balance.size(); ++i) {\n\t\t\tpool.balance[i] = to_uint(balance[i]);\n\t\t}\n\t\tfor(size_t i = 0; i < 2 && i < fees_paid.size(); ++i) {\n\t\t\tpool.fees_paid[i] = to_uint(fees_paid[i]);\n\t\t}\n\t\tfor(size_t i = 0; i < 2 && i < fees_claimed.size(); ++i) {\n\t\t\tpool.fees_claimed[i] = to_uint(fees_claimed[i]);\n\t\t}\n\t\tfor(size_t i = 0; i < 2 && i < user_total.size(); ++i) {\n\t\t\tpool.user_total[i] = to_uint(user_total[i]);\n\t\t}\n\t\tfor(size_t i = 0; i < 2; ++i) {\n\t\t\tout.balance[i] += pool.balance[i];\n\t\t\tout.fees_paid[i] += pool.fees_paid[i];\n\t\t\tout.fees_claimed[i] += pool.fees_claimed[i];\n\t\t\tout.user_total[i] += pool.user_total[i];\n\t\t}\n\t\tconst auto ref_fees_paid = to_ref(obj[\"fees_paid\"]);\n\t\t{\n\t\t\tconst auto prev_fees_paid = read_storage_array(address, ref_fees_paid, height - std::min(8640u, height));\n\t\t\tfor(size_t i = 0; i < 2 && i < prev_fees_paid.size(); ++i) {\n\t\t\t\tprev_fees_paid_1d[i] += to_uint(prev_fees_paid[i]);\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tconst auto prev_fees_paid = read_storage_array(address, ref_fees_paid, height - std::min(60480u, height));\n\t\t\tfor(size_t i = 0; i < 2 && i < prev_fees_paid.size(); ++i) {\n\t\t\t\tprev_fees_paid_7d[i] += to_uint(prev_fees_paid[i]);\n\t\t\t}\n\t\t}\n\t\tout.pools.push_back(pool);\n\t}\n\n\tout.volume_1d = out.volume;\n\tout.volume_7d = out.volume;\n\t{\n\t\tconst auto prev_volume = read_storage_array(address, ref_volume, height - std::min(8640u, height));\n\t\tfor(size_t i = 0; i < 2 && i < prev_volume.size(); ++i) {\n\t\t\tout.volume_1d[i] = out.volume[i] - to_uint(prev_volume[i]);\n\t\t}\n\t}\n\t{\n\t\tconst auto prev_volume = read_storage_array(address, ref_volume, height - std::min(60480u, height));\n\t\tfor(size_t i = 0; i < 2 && i < prev_volume.size(); ++i) {\n\t\t\tout.volume_7d[i] = out.volume[i] - to_uint(prev_volume[i]);\n\t\t}\n\t}\n\tfor(size_t i = 0; i < 2; ++i) {\n\t\tout.avg_apy_1d[i] = uint128(365 * (out.fees_paid[i] - prev_fees_paid_1d[i])).to_double() / out.user_total[i].to_double();\n\t}\n\tfor(size_t i = 0; i < 2; ++i) {\n\t\tout.avg_apy_7d[i] = uint128(52 * (out.fees_paid[i] - prev_fees_paid_7d[i])).to_double() / out.user_total[i].to_double();\n\t}\n\treturn out;\n}\n\nswap_user_info_t Node::get_swap_user_info(const addr_t& address, const addr_t& user) const\n{\n\tswap_user_info_t out;\n\tconst auto key = storage->lookup(address, vm::to_binary(user));\n\tconst auto users = read_storage_field(address, \"users\");\n\tconst auto user_ref = storage->read(address, to_ref(users.first), key);\n\tif(!user_ref) {\n\t\treturn out;\n\t}\n\tauto data = read_storage_object(address, to_ref(user_ref.get()));\n\n\tout.pool_idx = to_uint(data[\"pool_idx\"]).lower().lower();\n\tout.unlock_height = to_uint(data[\"unlock_height\"]);\n\tconst auto balance = read_storage_array(address, to_ref(data[\"balance\"]));\n\tconst auto last_user_total = read_storage_array(address, to_ref(data[\"last_user_total\"]));\n\tconst auto last_fees_paid = read_storage_array(address, to_ref(data[\"last_fees_paid\"]));\n\tfor(size_t i = 0; i < 2 && i < balance.size(); ++i) {\n\t\tout.balance[i] = to_uint(balance[i]);\n\t}\n\tfor(size_t i = 0; i < 2 && i < last_user_total.size(); ++i) {\n\t\tout.last_user_total[i] = to_uint(last_user_total[i]);\n\t}\n\tfor(size_t i = 0; i < 2 && i < last_fees_paid.size(); ++i) {\n\t\tout.last_fees_paid[i] = to_uint(last_fees_paid[i]);\n\t}\n\tout.fees_earned = get_swap_fees_earned(address, user);\n\tout.equivalent_liquidity = get_swap_equivalent_liquidity(address, user);\n\treturn out;\n}\n\nstd::vector<swap_entry_t> Node::get_swap_history(const addr_t& address, const int32_t& limit) const\n{\n\tconst auto info = get_swap_info(address);\n\tstd::array<std::shared_ptr<const contract::TokenBase>, 2> tokens;\n\tfor(int i = 0; i < 2; ++i) {\n\t\ttokens[i] = get_contract_as<const contract::TokenBase>(info.tokens[i]);\n\t}\n\n\tstd::vector<swap_entry_t> result;\n\tfor(const auto& entry : get_exec_history(address, limit, true)) {\n\t\tswap_entry_t out;\n\t\tout.height = entry.height;\n\t\tout.time_stamp = entry.time_stamp;\n\t\tout.txid = entry.txid;\n\t\tout.user = entry.user;\n\t\tout.index = -1;\n\t\tif(entry.method == \"trade\") {\n\t\t\tif(entry.deposit && entry.args.size() >= 2) {\n\t\t\t\tconst auto index = entry.args[0].to<uint32_t>();\n\t\t\t\tout.type = (index ? \"BUY\" : \"SELL\");\n\t\t\t\tout.index = index;\n\t\t\t\tout.amount = entry.deposit->second;\n\t\t\t\tout.user = entry.args[1].to<addr_t>();\n\t\t\t}\n\t\t} else if(entry.method == \"add_liquid\" || entry.method == \"rem_liquid\") {\n\t\t\tout.type = (entry.method == \"add_liquid\") ? \"ADD\" : \"REMOVE\";\n\t\t\tif(entry.args.size() >= 1) {\n\t\t\t\tout.index = entry.args[0].to<uint32_t>();\n\t\t\t\tif(entry.deposit) {\n\t\t\t\t\tout.amount = entry.deposit->second;\n\t\t\t\t} else if(entry.args.size() >= 2) {\n\t\t\t\t\tout.amount = entry.args[1].to<uint128>();\n\t\t\t\t}\n\t\t\t}\n\t\t} else if(entry.method == \"rem_all_liquid\") {\n\t\t\tout.type = \"REMOVE_ALL\";\n\t\t} else if(entry.method == \"payout\") {\n\t\t\tout.type = \"PAYOUT\";\n\t\t} else if(entry.method == \"switch_pool\") {\n\t\t\tout.type = \"SWITCH\";\n\t\t}\n\t\tif(out.index < 2) {\n\t\t\tif(auto token = tokens[out.index]) {\n\t\t\t\tout.value = to_value(out.amount, token->decimals);\n\t\t\t\tout.symbol = token->symbol;\n\t\t\t} else if(info.tokens[out.index] == addr_t()) {\n\t\t\t\tout.value = to_value(out.amount, params->decimals);\n\t\t\t\tout.symbol = \"MMX\";\n\t\t\t}\n\t\t}\n\t\tresult.push_back(out);\n\t}\n\treturn result;\n}\n\nstd::array<uint128, 2> Node::get_swap_trade_estimate(const addr_t& address, const uint32_t& i, const uint128& amount, const int32_t& num_iter) const\n{\n\tconst auto info = get_swap_info(address);\n\n\tstd::vector<vnx::Variant> args;\n\targs.emplace_back(i);\n\targs.emplace_back(address.to_string());\n\targs.emplace_back(nullptr);\n\targs.emplace_back(num_iter);\n\tconst auto ret = call_contract(address, \"trade\", args, nullptr, std::make_pair(info.tokens[i], amount)).to<std::array<uint128, 2>>();\n\treturn {ret[0] - ret[1], ret[1]};\n}\n\nstd::array<uint128, 2> Node::get_swap_fees_earned(const addr_t& address, const addr_t& user) const\n{\n\treturn call_contract(address, \"get_earned_fees\", {vnx::Variant(user.to_string())}).to<std::array<uint128, 2>>();\n}\n\nstd::array<uint128, 2> Node::get_swap_equivalent_liquidity(const addr_t& address, const addr_t& user) const\n{\n\treturn call_contract(address, \"rem_all_liquid\", {vnx::Variant(true)}, user).to<std::array<uint128, 2>>();\n}\n\nstd::map<addr_t, std::array<std::pair<addr_t, uint128>, 2>> Node::get_swap_liquidity_by(const std::vector<addr_t>& addresses) const\n{\n\tstd::map<addr_t, std::array<uint128, 2>> swaps;\n\tfor(const auto& address : addresses) {\n\t\tstd::vector<std::pair<std::pair<addr_t, addr_t>, std::array<uint128, 2>>> entries;\n\t\tswap_liquid_map.find_range(std::make_pair(address, addr_t()), std::make_pair(address, addr_t::ones()), entries);\n\t\tfor(const auto& entry : entries) {\n\t\t\tauto& out = swaps[entry.first.second];\n\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\tout[i] += entry.second[i];\n\t\t\t}\n\t\t}\n\t}\n\tstd::map<addr_t, std::array<std::pair<addr_t, uint128>, 2>> result;\n\tfor(const auto& entry : swaps) {\n\t\tauto& out = result[entry.first];\n\t\tconst auto info = get_swap_info(entry.first);\n\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\tout[i] = std::make_pair(info.tokens[i], entry.second[i]);\n\t\t}\n\t}\n\treturn result;\n}\n\nstd::vector<std::shared_ptr<const BlockHeader>> Node::get_farmed_blocks(\n\t\tconst std::vector<pubkey_t>& farmer_keys, const vnx::bool_t& full_blocks, const uint32_t& since, const int32_t& limit) const\n{\n\tstd::vector<farmed_block_info_t> entries;\n\tfor(const auto& key : farmer_keys) {\n\t\tstd::vector<farmed_block_info_t> tmp;\n\t\tfarmer_block_map.find_last_range(std::make_pair(key, since), std::make_pair(key, -1), tmp, size_t(limit));\n\t\tentries.insert(entries.end(), tmp.begin(), tmp.end());\n\t}\n\t// need to sort in case multiple keys\n\tstd::sort(entries.begin(), entries.end(), [](const farmed_block_info_t& L, const farmed_block_info_t& R) -> bool {\n\t\treturn L.height > R.height;\n\t});\n\tif(limit >= 0) {\n\t\tif(entries.size() > size_t(limit)) {\n\t\t\tentries.resize(limit);\n\t\t}\n\t} else {\n\t\tstd::reverse(entries.begin(), entries.end());\n\t}\n\tstd::vector<std::shared_ptr<const BlockHeader>> out;\n\tfor(const auto& entry : entries) {\n\t\tout.push_back(get_block_at_ex(entry.height, full_blocks));\n\t}\n\treturn out;\n}\n\nfarmed_block_summary_t Node::get_farmed_block_summary(const std::vector<pubkey_t>& farmer_keys, const uint32_t& since) const\n{\n\tfarmed_block_summary_t out;\n\tfor(const auto& key : farmer_keys) {\n\t\tstd::vector<farmed_block_info_t> tmp;\n\t\tfarmer_block_map.find_range(std::make_pair(key, since), std::make_pair(key, -1), tmp);\n\t\tfor(const auto& entry : tmp) {\n\t\t\tout.num_blocks++;\n\t\t\tout.last_height = std::max(entry.height, out.last_height);\n\t\t\tout.total_rewards += entry.reward;\n\t\t\tout.reward_map[entry.reward_addr] += entry.reward;\n\t\t}\n\t}\n\treturn out;\n}\n\nstd::vector<std::pair<pubkey_t, uint32_t>> Node::get_farmer_ranking(const int32_t& limit) const\n{\n\tif(limit < 0) {\n\t\treturn farmer_ranking;\n\t}\n\tstd::vector<std::pair<pubkey_t, uint32_t>> out;\n\tfor(const auto& entry : farmer_ranking) {\n\t\tif(out.size() < size_t(limit)) {\n\t\t\tout.push_back(entry);\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn out;\n}\n\nstd::tuple<pooling_error_e, std::string> Node::verify_plot_nft_target(const addr_t& address, const addr_t& pool_target) const\n{\n\tif(!is_synced) {\n\t\tthrow std::logic_error(\"out of sync\");\n\t}\n\ttry {\n\t\tconst auto exec = get_contract_as<contract::Executable>(address);\n\t\tif(!exec || exec->binary != params->plot_nft_binary) {\n\t\t\treturn {pooling_error_e::INVALID_CONTRACT, \"Not a Plot NFT contract: \" + address.to_string()};\n\t\t}\n\t\tconst auto target = get_plot_nft_target(address);\n\t\tif(target != pool_target) {\n\t\t\treturn {pooling_error_e::INVALID_CONTRACT, \"Plot NFT not pointing at expected pool target: \" + target.to_string()};\n\t\t}\n\t} catch(const std::exception& ex) {\n\t\treturn {pooling_error_e::INVALID_CONTRACT, \"Plot NFT target resolution failed with: \" + std::string(ex.what())};\n\t}\n\treturn {pooling_error_e::NONE, \"\"};\n}\n\nstd::tuple<pooling_error_e, std::string> Node::verify_partial(\n\t\tstd::shared_ptr<const Partial> partial, const vnx::optional<addr_t>& pool_target) const\n{\n\tif(!is_synced) {\n\t\tthrow std::logic_error(\"out of sync\");\n\t}\n\tif(!partial) {\n\t\tthrow std::logic_error(\"partial == null\");\n\t}\n\tif(!partial->proof) {\n\t\treturn {pooling_error_e::INVALID_PROOF, \"Partial has no proof\"};\n\t}\n\tif(partial->hash != partial->calc_hash()) {\n\t\treturn {pooling_error_e::INVALID_SIGNATURE, \"Message hash mismatch\"};\n\t}\n\tif(!partial->farmer_sig) {\n\t\treturn {pooling_error_e::INVALID_SIGNATURE, \"Missing signature\"};\n\t}\n\tif(!partial->farmer_sig->verify(partial->proof->farmer_key, partial->hash)) {\n\t\treturn {pooling_error_e::INVALID_SIGNATURE, \"Signature verification failed\"};\n\t}\n\tif(partial->vdf_height > get_vdf_height()) {\n\t\treturn {pooling_error_e::CHALLENGE_NOT_CONFIRMED, \"Partial height not reached yet\"};\n\t}\n\n\thash_t challenge;\n\tuint64_t space_diff = 0;\n\tif(!find_challenge(partial->vdf_height, challenge, space_diff)) {\n\t\treturn {pooling_error_e::CHALLENGE_NOT_FOUND, \"Could not find challenge\"};\n\t}\n\tif(partial->proof->challenge != challenge) {\n\t\treturn {pooling_error_e::CHALLENGE_REVERTED, \"Challenge mismatch, expected \" + challenge.to_string()};\n\t}\n\n\ttry {\n\t\tverify_proof(partial->proof, challenge, partial->proof->difficulty, partial->vdf_height);\n\t} catch(const std::exception& ex) {\n\t\treturn {pooling_error_e::INVALID_PROOF, \"Invalid proof: \" + std::string(ex.what())};\n\t}\n\n\tif(pool_target) {\n\t\tif(auto nft = std::dynamic_pointer_cast<const ProofOfSpaceNFT>(partial->proof))\n\t\t{\n\t\t\tif(partial->contract != nft->contract) {\n\t\t\t\treturn {pooling_error_e::INVALID_CONTRACT, \"Partial 'contract' does not match proof of space\"};\n\t\t\t}\n\t\t\tconst auto ret = verify_plot_nft_target(nft->contract, *pool_target);\n\t\t\tif(std::get<0>(ret) != pooling_error_e::NONE) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} else {\n\t\t\treturn {pooling_error_e::INVALID_CONTRACT, \"Invalid proof type: \" + partial->proof->get_type_name()};\n\t\t}\n\t}\n\treturn {pooling_error_e::NONE, \"\"};\n}\n\nuint32_t Node::get_vdf_height() const\n{\n\treturn get_vdf_peak_ex().first;\n}\n\nhash_t Node::get_vdf_peak() const\n{\n\treturn get_vdf_peak_ex().second;\n}\n\nvoid Node::http_request_async(\tstd::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\tconst vnx::request_id_t& request_id) const\n{\n\thttp->http_request(request, sub_path, request_id, vnx_request->session);\n}\n\nvoid Node::http_request_chunk_async(std::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\t\tconst int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& request_id) const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\nvoid Node::async_api_call(std::shared_ptr<const vnx::Value> method, const vnx::request_id_t& request_id)\n{\n\ttry {\n\t\tstd::shared_ptr<vnx::Value> ret;\n\t\t{\n\t\t\tstd::shared_lock lock(db_mutex);\n\t\t\tret = NodeBase::vnx_call_switch(method, request_id);\n\t\t}\n\t\tvnx_async_return(request_id, ret);\n\t}\n\tcatch(const std::exception& ex) {\n\t\tvnx_async_return_ex(request_id, ex);\n\t}\n\tcatch(...) {\n\t\tvnx_async_return(request_id, vnx::InternalError::create());\n\t}\n}\n\nstd::shared_ptr<vnx::Value> Node::vnx_call_switch(std::shared_ptr<const vnx::Value> method, const vnx::request_id_t& request_id)\n{\n\tswitch(method->get_type_hash())\n\t{\n\t\t// Note: NOT thread-safe:\n\t\t// - http_request()\n\t\t// - get_network_info()\n\t\tcase Node_get_block::VNX_TYPE_ID:\n\t\tcase Node_get_block_at::VNX_TYPE_ID:\n\t\tcase Node_get_header::VNX_TYPE_ID:\n\t\tcase Node_get_header_at::VNX_TYPE_ID:\n\t\tcase Node_get_tx_ids::VNX_TYPE_ID:\n\t\tcase Node_get_tx_ids_at::VNX_TYPE_ID:\n\t\tcase Node_get_tx_ids_since::VNX_TYPE_ID:\n\t\tcase Node_get_tx_height::VNX_TYPE_ID:\n\t\tcase Node_get_tx_info::VNX_TYPE_ID:\n\t\tcase Node_get_tx_info_for::VNX_TYPE_ID:\n\t\tcase Node_get_transaction::VNX_TYPE_ID:\n\t\tcase Node_get_transactions::VNX_TYPE_ID:\n\t\tcase Node_get_history::VNX_TYPE_ID:\n\t\tcase Node_get_history_memo::VNX_TYPE_ID:\n\t\tcase Node_get_contract::VNX_TYPE_ID:\n\t\tcase Node_get_contract_for::VNX_TYPE_ID:\n\t\tcase Node_get_contracts::VNX_TYPE_ID:\n\t\tcase Node_get_contracts_by::VNX_TYPE_ID:\n\t\tcase Node_get_contracts_owned_by::VNX_TYPE_ID:\n\t\tcase Node_get_balance::VNX_TYPE_ID:\n\t\tcase Node_get_total_balance::VNX_TYPE_ID:\n\t\tcase Node_get_balances::VNX_TYPE_ID:\n\t\tcase Node_get_contract_balances::VNX_TYPE_ID:\n\t\tcase Node_get_total_balances::VNX_TYPE_ID:\n\t\tcase Node_get_all_balances::VNX_TYPE_ID:\n\t\tcase Node_get_exec_history::VNX_TYPE_ID:\n\t\tcase Node_read_storage::VNX_TYPE_ID:\n\t\tcase Node_dump_storage::VNX_TYPE_ID:\n\t\tcase Node_read_storage_var::VNX_TYPE_ID:\n\t\tcase Node_read_storage_entry_var::VNX_TYPE_ID:\n\t\tcase Node_read_storage_field::VNX_TYPE_ID:\n\t\tcase Node_read_storage_entry_addr::VNX_TYPE_ID:\n\t\tcase Node_read_storage_entry_string::VNX_TYPE_ID:\n\t\tcase Node_read_storage_array::VNX_TYPE_ID:\n\t\tcase Node_read_storage_map::VNX_TYPE_ID:\n\t\tcase Node_read_storage_object::VNX_TYPE_ID:\n\t\tcase Node_call_contract::VNX_TYPE_ID:\n\t\tcase Node_get_total_supply::VNX_TYPE_ID:\n\t\tcase Node_get_offer::VNX_TYPE_ID:\n\t\tcase Node_fetch_offers::VNX_TYPE_ID:\n\t\tcase Node_get_offers::VNX_TYPE_ID:\n\t\tcase Node_get_offers_by::VNX_TYPE_ID:\n\t\tcase Node_get_recent_offers::VNX_TYPE_ID:\n\t\tcase Node_get_recent_offers_for::VNX_TYPE_ID:\n\t\tcase Node_get_trade_history::VNX_TYPE_ID:\n\t\tcase Node_get_trade_history_for::VNX_TYPE_ID:\n\t\tcase Node_get_swaps::VNX_TYPE_ID:\n\t\tcase Node_get_swap_info::VNX_TYPE_ID:\n\t\tcase Node_get_swap_user_info::VNX_TYPE_ID:\n\t\tcase Node_get_swap_history::VNX_TYPE_ID:\n\t\tcase Node_get_swap_trade_estimate::VNX_TYPE_ID:\n\t\tcase Node_get_swap_fees_earned::VNX_TYPE_ID:\n\t\tcase Node_get_swap_equivalent_liquidity::VNX_TYPE_ID:\n\t\tcase Node_get_swap_liquidity_by::VNX_TYPE_ID:\n\t\tcase Node_get_farmed_blocks::VNX_TYPE_ID:\n\t\tcase Node_get_farmer_ranking::VNX_TYPE_ID:\n\t\tcase Node_get_farmed_block_summary::VNX_TYPE_ID:\n\t\tcase Node_get_plot_nft_info::VNX_TYPE_ID:\n\t\tcase Node_get_plot_nft_target::VNX_TYPE_ID:\n\t\tcase Node_validate::VNX_TYPE_ID:\n\t\tcase Node_verify_plot_nft_target::VNX_TYPE_ID:\n\t\tcase Node_verify_partial::VNX_TYPE_ID:\n\t\tcase Node_get_vdf_peak::VNX_TYPE_ID:\n\t\tcase Node_get_vdf_height::VNX_TYPE_ID:\n\t\t\tapi_threads->add_task(std::bind(&Node::async_api_call, this, method, request_id));\n\t\t\treturn nullptr;\n\t\tdefault:\n\t\t\treturn NodeBase::vnx_call_switch(method, request_id);\n\t}\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Node_control.cpp",
    "content": "/*\n * Node_control.cpp\n *\n *  Created on: May 6, 2024\n *      Author: mad\n */\n\n#include <mmx/Node.h>\n#include <mmx/http_request.h>\n#include <mmx/contract/TokenBase.hxx>\n\n#include <vnx/vnx.h>\n#include <url.h>\n\n\nstatic bool is_expired(const std::string& file_path, const int64_t max_age_sec = 3600 * 24)\n{\n\tvnx::File file(file_path);\n\treturn !file.exists() || file.last_write_time() + max_age_sec < mmx::get_time_sec();\n}\n\n\nnamespace mmx {\n\nvoid Node::update_control()\n{\n\tconst auto fetch_func = [this](const std::string& url, const std::string& file_path, const std::string& key, const std::string& options = \"\") {\n\t\ttry {\n\t\t\thttp_request_file(url, file_path, options);\n\t\t\tif(vnx::do_run()) {\n\t\t\t\tadd_task(std::bind(&Node::update_control, this));\n\t\t\t}\n\t\t}\n\t\tcatch(const std::exception& ex) {\n\t\t\tlog(WARN) << \"Failed to fetch \" << Url::Url(url).setQuery({}).str();\n\t\t}\n\t\tif(vnx::do_run()) {\n\t\t\tstd::lock_guard<std::mutex> lock(fetch_mutex);\n\t\t\tpending_fetch.erase(key);\n\t\t}\n\t};\n\n\tstd::lock_guard<std::mutex> lock(fetch_mutex);\n\n\tbool try_again = false;\n\n\tvnx::optional<double> metalsdev_price;\n\t{\n\t\tconst std::string file_path = storage_path + \"metalsdev_xau_usd.json\";\n\n\t\tif(is_expired(file_path)) {\n\t\t\tconst std::string key = \"api.metals.dev\";\n\t\t\tif(pending_fetch.insert(key).second) {\n\t\t\t\tstd::string param;\n\t\t\t\tif(metalsdev_api_key.empty()) {\n\t\t\t\t\tconst auto tmp = vnx::from_hex_string(\"6170695f6b65793d554a4f4f584b43364756575739484e4a494b594e3537394e4a494b594e\");\n\t\t\t\t\tparam = std::string((const char*)tmp.data(), tmp.size());\n\t\t\t\t} else {\n\t\t\t\t\tparam = \"api_key=\" + metalsdev_api_key;\n\t\t\t\t}\n\t\t\t\tfetch_threads->add_task(std::bind(\n\t\t\t\t\t\tfetch_func, \"https://api.metals.dev/v1/metal/spot?\" + param + \"&metal=gold&currency=USD\", file_path, key));\n\t\t\t}\n\t\t\ttry_again = true;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tstd::ifstream stream(file_path);\n\t\t\t\tconst auto json = vnx::read_json(stream, true);\n\t\t\t\tif(!json) {\n\t\t\t\t\tthrow std::logic_error(\"empty file\");\n\t\t\t\t}\n\t\t\t\tconst auto object = json->to_object();\n\n\t\t\t\tif(object[\"status\"].to_string_value() != \"success\") {\n\t\t\t\t\tthrow std::logic_error(\"bad status: \" + object[\"status\"].to_string_value());\n\t\t\t\t}\n\t\t\t\tif(object[\"metal\"].to_string_value() != \"gold\") {\n\t\t\t\t\tthrow std::logic_error(\"expected gold\");\n\t\t\t\t}\n\t\t\t\tif(object[\"unit\"].to_string_value() != \"toz\") {\n\t\t\t\t\tthrow std::logic_error(\"expected unit toz\");\n\t\t\t\t}\n\t\t\t\tif(object[\"currency\"].to_string_value() != \"USD\") {\n\t\t\t\t\tthrow std::logic_error(\"expected currency USD\");\n\t\t\t\t}\n\t\t\t\tconst auto rate = object[\"rate\"].to_object();\n\t\t\t\tconst auto price = rate[\"price\"].to<double>();\n\t\t\t\tif(price <= 0) {\n\t\t\t\t\tthrow std::logic_error(\"invalid price: \" + std::to_string(price));\n\t\t\t\t}\n\t\t\t\tmetalsdev_price = price;\n\t\t\t\tlog(INFO) << \"Got metals.dev XAU price: \" << price << \" USD\";\n\t\t\t}\n\t\t\tcatch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"Failed to parse \" << file_path << \": \" << ex.what();\n\t\t\t}\n\t\t}\n\t}\n\n\tvnx::optional<double> swissquote_price;\n\t{\n\t\tconst std::string file_path = storage_path + \"swissquote_xau_usd.json\";\n\n\t\tif(is_expired(file_path)) {\n\t\t\tconst std::string key = \"forex-data-feed.swissquote.com\";\n\t\t\tif(pending_fetch.insert(key).second) {\n\t\t\t\tfetch_threads->add_task(std::bind(\n\t\t\t\t\t\tfetch_func, \"https://forex-data-feed.swissquote.com/public-quotes/bboquotes/instrument/XAU/USD\", file_path, key));\n\t\t\t}\n\t\t\ttry_again = true;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tstd::ifstream stream(file_path);\n\t\t\t\tconst auto json = vnx::read_json(stream, true);\n\t\t\t\tif(!json) {\n\t\t\t\t\tthrow std::logic_error(\"empty file\");\n\t\t\t\t}\n\t\t\t\tconst auto array = std::dynamic_pointer_cast<vnx::JSON_Array>(json);\n\t\t\t\tif(!array) {\n\t\t\t\t\tthrow std::logic_error(\"top level not an array\");\n\t\t\t\t}\n\t\t\t\tconst auto list = array->get_values();\n\t\t\t\tif(list.empty()) {\n\t\t\t\t\tthrow std::logic_error(\"empty list\");\n\t\t\t\t}\n\t\t\t\tconst auto MT5 = list[0]->to_object();\n\t\t\t\tconst auto profiles = MT5[\"spreadProfilePrices\"].to<std::vector<vnx::Variant>>();\n\t\t\t\tif(profiles.empty()) {\n\t\t\t\t\tthrow std::logic_error(\"found no MT5 profiles\");\n\t\t\t\t}\n\t\t\t\tconst auto prime = profiles[0].to_object();\n\n\t\t\t\tconst auto bid = prime[\"bid\"].to<double>();\n\t\t\t\tconst auto ask = prime[\"ask\"].to<double>();\n\t\t\t\tif(bid <= 0 || ask <= 0 || bid / ask > 1.1) {\n\t\t\t\t\tthrow std::logic_error(\"invalid bid or ask price: \" + std::to_string(bid) + \" / \" + std::to_string(ask));\n\t\t\t\t}\n\t\t\t\tconst auto price = (bid + ask) / 2;\n\t\t\t\tswissquote_price = price;\n\t\t\t\tlog(INFO) << \"Got swissquote.com XAU price: \" << price << \" USD\";\n\t\t\t}\n\t\t\tcatch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"Failed to parse \" << file_path << \": \" << ex.what();\n\t\t\t}\n\t\t}\n\t}\n\n\tdouble gold_price_usd = 0;\n\tif(metalsdev_price) {\n\t\tgold_price_usd = *metalsdev_price;\n\t} else if(swissquote_price) {\n\t\tgold_price_usd = *swissquote_price;\n\t} else {\n\t\tif(!try_again) {\n\t\t\treward_vote = 0;\n\t\t\tlog(WARN) << \"Failed to query XAU price information!\";\n\t\t}\n\t\treturn;\n\t}\n\n\tstd::vector<double> mmx_price_inputs_usd;\n\n\tif(mmx_usd_swap_addr != addr_t()) try {\n\t\tconst auto swap_info = get_swap_info(mmx_usd_swap_addr);\n\t\tconst auto usd_contract_addr = swap_info.tokens[1];\n\t\tconst auto usd_contract = get_contract_as<mmx::contract::TokenBase>(usd_contract_addr);\n\t\tif(!usd_contract) {\n\t\t\tthrow std::runtime_error(\"could not find USD contract: \" + usd_contract_addr.to_string());\n\t\t}\n\t\tif(!swap_info.balance[0] || !swap_info.balance[1]) {\n\t\t\tthrow std::runtime_error(\"missing swap liquidity\");\n\t\t}\n\t\tconst auto price = to_value(swap_info.balance[1], usd_contract->decimals) / to_value(swap_info.balance[0], params->decimals);\n\t\tmmx_price_inputs_usd.push_back(price);\n\t}\n\tcatch(const std::exception& ex) {\n\t\tlog(WARN) << \"Failed to get MMX swap price: \" << ex.what();\n\t}\n\n\t{\n\t\tconst std::string file_path = storage_path + \"safetrade_mmx_usdt.json\";\n\n\t\tif(is_expired(file_path)) {\n\t\t\tconst std::string key = \"safetrade.com\";\n\t\t\tif(pending_fetch.insert(key).second) {\n\t\t\t\tconst auto tmp = vnx::from_hex_string(\"2d482022757365722d6167656e743a204d4d582d4e6f64652d313133333722\");\n\t\t\t\tconst std::string options((const char*)tmp.data(), tmp.size());\n\t\t\t\tfetch_threads->add_task(std::bind(\n\t\t\t\t\t\tfetch_func, \"https://safe.trade/api/v2/trade/public/currencies/mmx\", file_path, key, options));\n\t\t\t}\n\t\t\ttry_again = true;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tstd::ifstream stream(file_path);\n\t\t\t\tconst auto json = vnx::read_json(stream, true);\n\t\t\t\tif(!json) {\n\t\t\t\t\tthrow std::logic_error(\"empty file\");\n\t\t\t\t}\n\t\t\t\tconst auto object = json->to_object();\n\n\t\t\t\tif(object[\"status\"].to_string_value() != \"enabled\") {\n\t\t\t\t\tthrow std::logic_error(\"bad status: \" + object[\"status\"].to_string_value());\n\t\t\t\t}\n\t\t\t\tif(object[\"id\"].to_string_value() != \"mmx\") {\n\t\t\t\t\tthrow std::logic_error(\"expected MMX\");\n\t\t\t\t}\n\t\t\t\tconst auto price = std::stod(object[\"price\"].to_string_value());\n\t\t\t\tif(price <= 0) {\n\t\t\t\t\tthrow std::logic_error(\"invalid price: \" + std::to_string(price));\n\t\t\t\t}\n\t\t\t\tmmx_price_inputs_usd.push_back(price);\n\t\t\t\tlog(INFO) << \"Got safetrade.com MMX price: \" << price << \" USD\";\n\t\t\t}\n\t\t\tcatch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"Failed to parse \" << file_path << \": \" << ex.what();\n\t\t\t}\n\t\t}\n\t}\n\n\tif(mmx_price_inputs_usd.empty()) {\n\t\tif(!try_again) {\n\t\t\treward_vote = 0;\n\t\t\tlog(INFO) << \"Reward voting is disabled due to lack of MMX swap / exchange\";\n\t\t}\n\t\treturn;\n\t}\n\tstd::sort(mmx_price_inputs_usd.begin(), mmx_price_inputs_usd.end());\n\n\tdouble mmx_price_usd = 0;\n\tif(mmx_price_inputs_usd.size() % 2) {\n\t\tmmx_price_usd = mmx_price_inputs_usd[mmx_price_inputs_usd.size() / 2];\n\t} else {\n\t\tconst auto low = mmx_price_inputs_usd.size() / 2;\n\t\tmmx_price_usd = (mmx_price_inputs_usd[low] + mmx_price_inputs_usd[low + 1]) / 2;\n\t}\n\tconst auto current = gold_price_usd / mmx_price_usd;\n\n\tif(current > params->target_mmx_gold_price * 1.01) {\n\t\treward_vote = -1;\n\t}\n\telse if(current < params->target_mmx_gold_price / 1.01) {\n\t\treward_vote = 1;\n\t}\n\telse {\n\t\treward_vote = 0;\n\t}\n\tlog(INFO) << u8\"\\U0001F4B5 MMX price = \" << mmx_price_usd << \" USD, XAU price = \" << gold_price_usd << \" USD, MMX per ounce = \"\n\t\t\t<< current << \" MMX (target \" << params->target_mmx_gold_price << \"), reward vote = \" << reward_vote;\n}\n\n\n\n\n\n\n\n} // mmx\n"
  },
  {
    "path": "src/Node_tests.cpp",
    "content": "/*\n * Node_tests.cpp\n *\n *  Created on: Jan 5, 2025\n *      Author: mad\n */\n\n#include <mmx/Node.h>\n#include <mmx/ProofOfSpaceOG.hxx>\n\n#include <algorithm>\n\n\nnamespace mmx {\n\nstd::shared_ptr<Block> Node::create_test_block(std::shared_ptr<const BlockHeader> prev, const bool valid)\n{\n\tconst skey_t farmer_sk(hash_t(\"test\"));\n\tconst pubkey_t farmer_key(farmer_sk);\n\n\tconst auto proof = ProofOfSpaceOG::create();\n\tproof->ksize = 32;\n\tproof->score = 256;\n\tproof->farmer_key = farmer_key;\n\tproof->challenge = hash_t::random();\n\tget_challenge(prev, 1, proof->difficulty);\n\tproof->proof_xs.resize(256);\n\tstd::generate(proof->proof_xs.begin(), proof->proof_xs.end(),\n\t\t[]() { return vnx::rand64(); });\n\n\tproof_data_t proof_data;\n\tproof_data.hash = proof->calc_proof_hash();\n\tproof_data.proof = proof;\n\n\tauto& proofs = proof_map[proof->challenge];\n\tproofs.clear();\n\tfor(uint32_t i = 0; i < params->max_proof_count; ++i) {\n\t\tproofs.push_back(proof_data);\n\t}\n\n\tauto point = VDF_Point::create();\n\tpoint->vdf_height = prev->vdf_height + 1;\n\tpoint->start = prev->vdf_iters;\n\tpoint->input = prev->vdf_output;\n\tpoint->output = hash_t::random();\n\tpoint->prev = get_infusion(prev, 0, point->num_iters);\n\tpoint->content_hash = point->calc_hash();\n\n\tvdf_tree.emplace(point->output, point);\n\tvdf_index.emplace(point->start + point->num_iters, point);\n\n\tconst auto prev_state = state_hash;\n\ttry {\n\t\tauto out = vnx::clone(make_block(prev, {point}, proof->challenge));\n\t\tout->nonce = 1337;\n\t\tout->reward_addr = hash_t(\"test\");\n\t\tif(!valid) {\n\t\t\tout->reward_vote = 2;\n\t\t}\n\t\tout->hash = out->calc_hash();\n\t\tout->farmer_sig = signature_t::sign(farmer_sk, out->hash);\n\t\tout->content_hash = out->calc_content_hash();\n\t\tfork_to(prev_state);\n\t\treturn out;\n\t} catch(...) {\n\t\tfork_to(prev_state);\n\t\tthrow;\n\t}\n}\n\nstd::shared_ptr<Node::fork_t> Node::create_test_fork(std::shared_ptr<const BlockHeader> prev, const bool valid)\n{\n\tauto fork = std::make_shared<fork_t>();\n\tfork->block = create_test_block(prev, valid);\n\tfork->is_vdf_verified = true;\n\tfork->is_proof_verified = true;\n\treturn fork;\n}\n\nvoid Node::test_all()\n{\n\tconst auto old_peak = get_peak();\n\tconst auto old_root = get_root();\n\tconst auto version = db_blocks->version();\n\n\tlog(INFO) << \"Running tests ...\";\n\tlog(INFO) << \"Root is at height \" << old_root->height << \" hash \" << old_root->hash;\n\tlog(INFO) << \"Peak is at height \" << old_peak->height << \" hash \" << old_peak->hash;\n\n\t// simple revert\n\t{\n\t\tconst int length = 5;\n\n\t\tstd::shared_ptr<fork_t> start;\n\n\t\tauto block = old_peak;\n\t\tfor(int i = 0; i < length; ++i) {\n\t\t\tauto fork = create_test_fork(block);\n\t\t\tif(!start) {\n\t\t\t\tstart = fork;\n\t\t\t}\n\t\t\tadd_fork(fork);\n\t\t\tblock = fork->block;\n\t\t}\n\t\tlog(INFO) << \"Extended peak to height \" << block->height << \" hash \" << block->hash;\n\n\t\tupdate();\n\n\t\tif(get_peak()->hash != block->hash) {\n\t\t\tthrow std::logic_error(\"extending chain failed\");\n\t\t}\n\t\tstart->is_invalid = true;\n\n\t\tupdate();\n\n\t\tif(get_peak()->hash != old_peak->hash) {\n\t\t\tthrow std::logic_error(\"revert failed\");\n\t\t}\n\t\tlog(INFO) << \"(1/5) passed\";\n\t}\n\n\tdb_blocks->revert(version);\n\tfork_to(old_peak->hash);\n\treset();\n\n\t// normal forking\n\t{\n\t\tconst int depth = 5;\n\t\tconst int length = 10;\n\n\t\tauto block = old_peak;\n\t\tfor(int i = 0; i < depth && block && block->height > root->height; ++i) {\n\t\t\tblock = find_prev(block);\n\t\t}\n\t\tif(!block) {\n\t\t\tthrow std::logic_error(\"cannot walk back from peak\");\n\t\t}\n\t\tlog(INFO) << \"Starting new fork at height \" << block->height << \" hash \" << block->hash;\n\n\t\tstd::shared_ptr<fork_t> start;\n\n\t\tfor(int i = 0; i < length; ++i) {\n\t\t\tauto fork = create_test_fork(block);\n\t\t\tif(!start) {\n\t\t\t\tstart = fork;\n\t\t\t}\n\t\t\tadd_fork(fork);\n\t\t\tblock = fork->block;\n\t\t}\n\t\tlog(INFO) << \"Created new fork at peak height \" << block->height << \" hash \" << block->hash;\n\n\t\tupdate();\n\n\t\tif(get_peak()->hash != block->hash) {\n\t\t\tthrow std::logic_error(\"normal forking failed\");\n\t\t}\n\n\t\tstart->is_invalid = true;\n\t\tupdate();\n\n\t\tif(get_peak()->hash != old_peak->hash) {\n\t\t\tthrow std::logic_error(\"failed to revert invalid fork\");\n\t\t}\n\t\tlog(INFO) << \"(2/5) passed\";\n\t}\n\n\tdb_blocks->revert(version);\n\tfork_to(old_peak->hash);\n\treset();\n\n\t// failed normal forking\n\t{\n\t\tconst int depth = 4;\n\t\tconst int length = 6;\n\n\t\tauto block = old_peak;\n\t\tfor(int i = 0; i < depth && block && block->height > root->height; ++i) {\n\t\t\tblock = find_prev(block);\n\t\t}\n\t\tif(!block) {\n\t\t\tthrow std::logic_error(\"cannot walk back from peak\");\n\t\t}\n\t\tlog(INFO) << \"Starting new fork at height \" << block->height << \" hash \" << block->hash;\n\n\t\tstd::shared_ptr<fork_t> start;\n\n\t\tfor(int i = 0; i < length; ++i) {\n\t\t\tauto fork = create_test_fork(block, i > 0);\n\t\t\tfork->is_validated = true;\n\t\t\tif(!start) {\n\t\t\t\tstart = fork;\n\t\t\t}\n\t\t\tadd_fork(fork);\n\t\t\tblock = fork->block;\n\t\t}\n\t\tlog(INFO) << \"Created new fork at peak height \" << block->height << \" hash \" << block->hash;\n\n\t\tstart->is_validated = false;\n\t\tupdate();\n\n\t\tif(get_peak()->hash != old_peak->hash) {\n\t\t\tthrow std::logic_error(\"normal forking did not fail\");\n\t\t}\n\t\tlog(INFO) << \"(3/5) passed\";\n\t}\n\n\tdb_blocks->revert(version);\n\tfork_to(old_peak->hash);\n\treset();\n\n\t// deep forking\n\t{\n\t\tconst int depth = params->commit_delay;\n\t\tconst int length = 30;\n\n\t\tauto block = old_peak;\n\t\tfor(int i = 0; i < depth && block && block->height > root->height; ++i) {\n\t\t\tblock = find_prev(block);\n\t\t}\n\t\tif(!block) {\n\t\t\tthrow std::logic_error(\"cannot walk back from peak\");\n\t\t}\n\t\tlog(INFO) << \"Starting new fork at height \" << block->height << \" hash \" << block->hash;\n\n\t\tfor(int i = 0; i < length; ++i) {\n\t\t\tauto fork = create_test_fork(block);\n\t\t\tadd_fork(fork);\n\t\t\tblock = fork->block;\n\t\t}\n\t\tlog(INFO) << \"Created new fork at peak height \" << block->height << \" hash \" << block->hash;\n\n\t\tupdate();\n\n\t\tif(get_peak()->hash != block->hash) {\n\t\t\tthrow std::logic_error(\"advancing failed\");\n\t\t}\n\n\t\tfor(auto fork : get_fork_line()) {\n\t\t\tfork->is_invalid = true;\n\t\t}\n\t\tupdate();\n\n\t\tlog(INFO) << \"New peak is at height \" << get_peak()->height << \", is_invalid = \" << find_fork(state_hash)->is_invalid;\n\n\t\tif(get_peak()->hash != old_peak->hash) {\n\t\t\tlog(INFO) << get_peak()->hash << \" != \" << old_peak->hash;\n\t\t\tthrow std::logic_error(\"deep forking failed\");\n\t\t}\n\t\tlog(INFO) << \"(4/5) passed\";\n\t}\n\n\tdb_blocks->revert(version);\n\tfork_to(old_peak->hash);\n\treset();\n\n\t// failed deep forking\n\t{\n\t\tconst int length = 10;\n\n\t\tauto block = root;\n\t\tlog(INFO) << \"Starting new fork at height \" << block->height << \" hash \" << block->hash;\n\n\t\tstd::shared_ptr<fork_t> trap;\n\n\t\tfor(int i = 0; i < length; ++i) {\n\t\t\tauto fork = create_test_fork(block, false);\n\t\t\tfork->is_validated = true;\n\t\t\tadd_fork(fork);\n\t\t\tblock = fork->block;\n\t\t\ttrap = fork;\n\t\t}\n\t\tlog(INFO) << \"Created new fork at peak height \" << block->height << \" hash \" << block->hash;\n\n\t\tblock = get_peak();\n\t\tfor(int i = 0; i < length / 2; ++i) {\n\t\t\tauto fork = create_test_fork(block);\n\t\t\tadd_fork(fork);\n\t\t\tblock = fork->block;\n\t\t}\n\t\tupdate();\n\n\t\tauto new_peak = block;\n\t\tlog(INFO) << \"Extended peak to height \" << block->height << \" hash \" << block->hash;\n\n\t\ttrap->is_validated = false;\n\n\t\tbool did_fail = true;\n\t\ttry {\n\t\t\tfork_to(trap);\n\t\t\tdid_fail = false;\n\t\t} catch(const std::exception& ex) {\n\t\t\tlog(INFO) << \"Failed as expected with: \" << ex.what();\n\t\t}\n\t\tif(!did_fail) {\n\t\t\tthrow std::logic_error(\"expected deep fork to fail\");\n\t\t}\n\t\tif(get_peak()->hash != new_peak->hash) {\n\t\t\tthrow std::logic_error(\"old peak was not restored\");\n\t\t}\n\t\tlog(INFO) << \"(5/5) passed\";\n\t}\n\n\tdb_blocks->revert(version);\n\tfork_to(old_peak->hash);\n\treset();\n\n\tauto peak = get_peak();\n\tlog(INFO) << \"Peak is at height \" << peak->height << \" hash \" << peak->hash;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n} // mmx\n"
  },
  {
    "path": "src/Node_update.cpp",
    "content": "/*\n * Node_update.cpp\n *\n *  Created on: Jan 20, 2022\n *      Author: mad\n */\n\n#include <mmx/Node.h>\n#include <mmx/FarmerClient.hxx>\n#include <mmx/Challenge.hxx>\n#include <mmx/IntervalRequest.hxx>\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/ProofOfSpaceNFT.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/utils.h>\n#include <mmx/helpers.h>\n\n#include <vnx/vnx.h>\n#include <random>\n\n\nnamespace mmx {\n\nvoid Node::verify_vdfs()\n{\n\tif(vdf_queue.empty() || vdf_verify_pending.size() >= max_vdf_verify_pending) {\n\t\treturn;\n\t}\n\tconst auto time_now = get_time_ms();\n\tconst auto vdf_timeout = 10 * params->block_interval_ms;\n\tconst auto root = get_root();\n\n\tstruct vdf_fork_t {\n\t\tuint32_t height = 0;\n\t\tint64_t trust = 0;\n\t\tint64_t recv_time = 0;\n\t\tstd::shared_ptr<const ProofOfTime> proof;\n\t};\n\tstd::vector<std::shared_ptr<vdf_fork_t>> try_now;\n\tstd::vector<std::pair<std::shared_ptr<const ProofOfTime>, int64_t>> try_again;\n\n\tstd::unordered_map<hash_t, uint32_t> height_map;\t// [output => vdf_height] based on verified proofs and VDFs only\n\tfor(const auto& entry : fork_index) {\n\t\tconst auto& fork = entry.second;\n\t\tif(fork->is_all_proof_verified) {\n\t\t\theight_map[fork->block->vdf_output] = fork->block->vdf_height;\n\t\t}\n\t}\n\theight_map[root->vdf_output] = root->vdf_height;\n\n\tfor(const auto& entry : vdf_index) {\n\t\tconst auto& point = entry.second;\n\t\tif(auto height = find_value(height_map, point->input)) {\n\t\t\theight_map[point->output] = (*height) + 1;\n\t\t}\n\t}\n\n\tfor(const auto& entry : vdf_queue)\n\t{\n\t\tconst auto& proof = entry.first;\n\t\tif(proof->start < root->vdf_iters) {\n\t\t\tcontinue;\t\t// too old\n\t\t}\n\t\tif(time_now - entry.second > vdf_timeout) {\n\t\t\tcontinue;\t\t// timeout\n\t\t}\n\t\tif(find_vdf_point(proof->input, proof->get_output())) {\n\t\t\tcontinue;\t\t// already verified\n\t\t}\n\t\tif(!get_header(proof->prev) || !height_map.count(proof->input)) {\n\t\t\ttry_again.push_back(entry);\t// wait for previous block / VDF\n\t\t\tcontinue;\n\t\t}\n\t\tauto out = std::make_shared<vdf_fork_t>();\n\t\tout->height = find_value(height_map, proof->input, 0);\n\t\tout->trust = find_value(timelord_trust, proof->timelord_key, 0);\n\t\tout->recv_time = entry.second;\n\t\tout->proof = proof;\n\t\ttry_now.emplace_back(out);\n\t}\n\n\tstd::sort(try_now.begin(), try_now.end(),\n\t\t[]( const std::shared_ptr<vdf_fork_t>& L, const std::shared_ptr<vdf_fork_t>& R) -> bool {\n\t\t\treturn std::make_pair(L->height, L->trust) > std::make_pair(R->height, R->trust);\n\t\t});\n\n\tfor(const auto& fork : try_now)\n\t{\n\t\tconst auto& proof = fork->proof;\n\t\tif(vdf_verify_pending.count(proof->hash)) {\n\t\t\tcontinue;\t\t// duplicate\n\t\t}\n\t\tif(vdf_verify_pending.size() >= max_vdf_verify_pending) {\n\t\t\ttry_again.emplace_back(proof, fork->recv_time);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tverify_vdf(proof, fork->recv_time);\n\t\t} catch(const std::exception& ex) {\n\t\t\tlog(WARN) << \"VDF static verification for height \" << proof->vdf_height << \" failed with: \" << ex.what();\n\t\t}\n\t}\n\tvdf_queue = std::move(try_again);\n}\n\nvoid Node::verify_votes()\n{\n\tconst auto time_now = get_time_ms();\n\tconst auto vote_timeout = 3 * params->block_interval_ms;\n\n\tstd::vector<std::pair<std::shared_ptr<const ValidatorVote>, int64_t>> try_again;\n\n\tfor(const auto& entry : vote_queue) {\n\t\tif(time_now - entry.second > vote_timeout) {\n\t\t\tcontinue;\t\t// timeout\n\t\t}\n\t\tconst auto& vote = entry.first;\n\t\t// Note: is_valid() already checked in handle()\n\t\ttry {\n\t\t\tif(auto fork = find_fork(vote->hash)) {\n\t\t\t\tif(fork->is_proof_verified) {\n\t\t\t\t\tconst auto& block = fork->block;\n\t\t\t\t\tconst auto best_proof = find_best_proof(block->proof[0]->challenge);\n\t\t\t\t\tif(!best_proof || block->proof_hash != best_proof->hash) {\n\t\t\t\t\t\tthrow std::logic_error(\"block has weaker proof\");\n\t\t\t\t\t}\n\t\t\t\t\tauto iter = fork->validators.find(vote->farmer_key);\n\t\t\t\t\tif(iter != fork->validators.end()) {\n\t\t\t\t\t\tif(!iter->second) {\n\t\t\t\t\t\t\titer->second = true;\n\t\t\t\t\t\t\tfork->votes++;\n\t\t\t\t\t\t\tpublish(vote, output_verified_votes);\n\n\t\t\t\t\t\t\tif(is_synced) {\n\t\t\t\t\t\t\t\tconst auto delay_ms = entry.second - fork->recv_time_ms;\n\t\t\t\t\t\t\t\tif(fork->votes == params->max_validators / 2 + 1) {\n\t\t\t\t\t\t\t\t\tlog(INFO) << \"\\xF0\\x9F\\x97\\xB3\\xEF\\xB8\\x8F  Received majority vote for block at height \" << fork->block->height\n\t\t\t\t\t\t\t\t\t\t\t<< \", delay \" << delay_ms / 1e3 << \" sec\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlog(DEBUG) << \"Received vote for block at height \" << fork->block->height\n\t\t\t\t\t\t\t\t\t\t<< \", total is now \" << fork->votes << \", delay \" << delay_ms / 1e3 << \" sec\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow std::logic_error(\"farmer is not a validator for this block\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry_again.push_back(entry);\n\t\t}\n\t\tcatch(const std::exception& ex) {\n\t\t\tlog(DEBUG) << \"Got invalid vote for block \" << vote->hash << \": \" << ex.what();\n\t\t}\n\t}\n\tvote_queue = std::move(try_again);\n}\n\nvoid Node::verify_proofs()\n{\n\tconst auto time_now = get_time_ms();\n\tconst auto proof_timeout = 10 * params->block_interval_ms;\n\tconst auto vdf_height = get_vdf_height();\n\n\tstd::mutex mutex;\n\tstd::vector<std::pair<std::shared_ptr<const ProofResponse>, int64_t>> try_again;\n\n\tfor(const auto& entry : proof_queue) {\n\t\tconst auto& res = entry.first;\n\t\tif(time_now - entry.second > proof_timeout) {\n\t\t\tcontinue;\t\t// timeout\n\t\t}\n\t\tif(res->vdf_height >= vdf_height + params->challenge_delay) {\n\t\t\ttry_again.push_back(entry);\t\t// wait for challenge to confirm\n\t\t\tcontinue;\n\t\t}\n\t\tthreads->add_task([this, res, &mutex, &try_again]() {\n\t\t\ttry {\n\t\t\t\tverify(res);\n\t\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\t\tadd_proof(res->proof, res->vdf_height, res->farmer_addr);\n\t\t\t\tlog(DEBUG) << \"Got proof for VDF height \" << res->vdf_height << \" with score \" << res->proof->score;\n\t\t\t}\n\t\t\tcatch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"Got invalid proof for VDF height \" << res->vdf_height << \": \" << ex.what();\n\t\t\t}\n\t\t});\n\t}\n\tthreads->sync();\n\n\tproof_queue = std::move(try_again);\n}\n\nvoid Node::verify_block_proofs()\n{\n\tstd::mutex mutex;\n\tconst auto root = get_root();\n\n\tfor(const auto& entry : fork_index)\n\t{\n\t\tconst auto& fork = entry.second;\n\t\tconst auto& block = fork->block;\n\t\tif(block->height == root->height + 1) {\n\t\t\tif(!fork->is_connected) {\n\t\t\t\tfork->is_connected = (find_prev(block, params->commit_delay + params->infuse_delay, true) != nullptr);\n\t\t\t}\n\t\t} else {\n\t\t\tif(!fork->prev.lock()) {\n\t\t\t\tfork->prev = find_fork(block->prev);\n\t\t\t}\n\t\t\tif(auto prev = fork->prev.lock()) {\n\t\t\t\tif(prev->is_invalid) {\n\t\t\t\t\tfork->is_invalid = true;\n\t\t\t\t}\n\t\t\t\tfork->is_connected = prev->is_connected;\n\t\t\t} else {\n\t\t\t\tfork->is_connected = false;\n\t\t\t}\n\t\t}\n\t\tif(!fork->is_connected || fork->is_invalid || fork->is_proof_verified) {\n\t\t\tcontinue;\n\t\t}\n\t\tif(!fork->is_vdf_verified) {\n\t\t\tconst auto vdf_points = find_vdf_points(block);\n\t\t\tif(vdf_points.size()) {\n\t\t\t\tfork->vdf_points = vdf_points;\n\t\t\t\tfork->is_vdf_verified = true;\n\t\t\t} else if(!is_synced) {\n\t\t\t\t// we don't verify VDFs during sync\n\t\t\t\t// the voting system will revert any invalid extension after one block\n\t\t\t\t// just need to make sure not to commit too far with low proof counts\n\t\t\t\tfork->is_vdf_verified = true;\n\t\t\t}\n\t\t}\n\t\tif(fork->is_vdf_verified) {\n\t\t\tthreads->add_task([this, fork, &mutex]() {\n\t\t\t\tconst auto& block = fork->block;\n\t\t\t\ttry {\n\t\t\t\t\tverify_proof(block);\n\t\t\t\t\tfork->is_proof_verified = true;\n\n\t\t\t\t\tif(auto proof = block->proof[0]) {\n\t\t\t\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\t\t\t\tadd_proof(proof, block->vdf_height, vnx::Hash64());\n\t\t\t\t\t}\n\t\t\t\t\tfor(auto key : get_validators(block)) {\n\t\t\t\t\t\tfork->validators[key] = false;\n\t\t\t\t\t}\n\t\t\t\t} catch(const std::exception& ex) {\n\t\t\t\t\tfork->is_invalid = true;\n\t\t\t\t\tlog(WARN) << \"Proof verification failed for a block at height \" << block->height << \": \" << ex.what();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\tthreads->sync();\n}\n\nvoid Node::update()\n{\n\tstd::unique_lock lock(db_mutex);\n\n\tconst auto time_begin = get_time_ms();\n\tupdate_pending = false;\n\n\tverify_proofs();\n\n\tverify_block_proofs();\n\n\tverify_votes();\t\t// after block proofs\n\n\tconst auto prev_peak = get_peak();\n\tstd::shared_ptr<const BlockHeader> forked_at;\n\n\t// choose best fork\n\twhile(vnx::do_run())\n\t{\n\t\tforked_at = nullptr;\n\t\tconst auto best_fork = find_best_fork();\n\n\t\tif(!best_fork || best_fork->block->hash == state_hash) {\n\t\t\tbreak;\t// no change\n\t\t}\n\n\t\t// verify and apply new fork\n\t\ttry {\n\t\t\tforked_at = fork_to(best_fork);\n\t\t}\n\t\tcatch(const std::exception& ex) {\n\t\t\tbest_fork->is_invalid = true;\n\t\t\tlog(WARN) << \"Forking to height \" << best_fork->block->height << \" failed with: \" << ex.what();\n\t\t\tcontinue;\t// try again\n\t\t}\n\t\tbreak;\n\t}\n\n\tverify_vdfs();\t// after peak update\n\n\tconst auto peak = get_peak();\n\tif(!peak) {\n\t\tlog(WARN) << \"Have no peak!\";\n\t\treturn;\n\t}\n\tuint32_t fork_weight = 0;\n\tconst auto fork = find_fork(peak->hash);\n\n\t// commit to disk\n\tif(root && peak->height > root->height)\n\t{\n\t\tconst auto fork_line = get_fork_line(fork);\n\n\t\tuint64_t total_proofs = 0;\n\t\tfor(const auto& fork : fork_line) {\n\t\t\ttotal_proofs += fork->block->proof.size();\n\t\t}\n\t\tconst auto vdf_delta = peak->vdf_height - root->vdf_height;\n\n\t\tfork_weight = (total_proofs * 100) / (vdf_delta * params->avg_proof_count);\n\n\t\t// make sure not to commit \"weak\" forks\n\t\t// prevent extension attack without valid VDF during sync\n\t\tconst auto commit_delay = fork_weight >= commit_threshold ? params->commit_delay : 3 * max_future_sync;\n\n\t\tfor(const auto& fork : fork_line) {\n\t\t\tconst auto& block = fork->block;\n\t\t\tif(block->height + commit_delay <= peak->height\n\t\t\t\t&& !sync_pending.count(block->height)\n\t\t\t\t&& (is_synced || block->height < sync_pos))\n\t\t\t{\n\t\t\t\tcommit(block);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tconst auto root = get_root();\n\tconst auto now_ms = get_time_ms();\n\tconst auto elapsed = (now_ms - time_begin) / 1e3;\n\tconst auto fork_line = get_fork_line(fork);\n\n\tif(!prev_peak || peak->hash != prev_peak->hash)\n\t{\n\t\tif(fork) {\n\t\t\tstd::stringstream msg;\n\t\t\tmsg << u8\"\\U0001F4BE New peak at height \" << peak->height << \" / \" << peak->vdf_height << \" with score \";\n\t\t\tif(peak->proof.size()) {\n\t\t\t\tmsg << peak->proof[0]->score;\n\t\t\t} else {\n\t\t\t\tmsg << \"N/A\";\n\t\t\t}\n\t\t\tmsg << \", weight \" << fork_weight;\n\t\t\tif(is_synced) {\n\t\t\t\tmsg << \", vote \" << fork->total_votes;\n\t\t\t\tif(forked_at) {\n\t\t\t\t\tmsg << \", forked at \" << forked_at->height;\n\t\t\t\t}\n\t\t\t\tif(fork->vdf_points.size()) {\n\t\t\t\t\tmsg << \", delay \" << (fork->recv_time_ms - fork->vdf_points.back()->recv_time) / 1e3 << \" sec\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmsg << \", \" << sync_pending.size() << \" pending\";\n\t\t\t}\n\t\t\tmsg << \", took \" << elapsed << \" sec\";\n\t\t\tlog(INFO) << msg.str();\n\t\t}\n\t\tif(forked_at && prev_peak) {\n\t\t\tconst auto depth = prev_peak->height - forked_at->height;\n\t\t\tif(depth > 1) {\n\t\t\t\tlog(WARN) << \"Forked \" << depth << \" blocks deep, down to height \" << forked_at->height;\n\t\t\t}\n\t\t}\n\t\tstuck_timer->reset();\n\t}\n\n\tif(!is_synced && sync_peak && sync_pending.empty())\n\t{\n\t\tif(sync_retry < num_sync_retries) {\n\t\t\tif(now_ms - sync_finish_ms > params->block_interval_ms / 2) {\n\t\t\t\tsync_pos = *sync_peak - 1;\n\t\t\t\tsync_peak = nullptr;\n\t\t\t\tsync_finish_ms = now_ms;\n\t\t\t\tsync_retry++;\n\t\t\t\tlog(INFO) << \"Reached sync peak at height \" << sync_pos;\n\t\t\t}\n\t\t} else {\n\t\t\tis_synced = true;\n\t\t\ton_sync_done(peak->height);\n\t\t}\n\t}\n\tif(!is_synced) {\n\t\tsync_more();\n\t\tupdate_timer->reset();\n\t\treturn;\n\t}\n\n\t{\n\t\tconst auto vdf_points = find_next_vdf_points(peak);\n\t\tconst auto vdf_output = vdf_points.empty() ? peak->vdf_output : vdf_points.back()->output;\n\n\t\tconst auto vdf_advance = std::min<uint32_t>(\n\t\t\t\tvdf_points.size() + params->infuse_delay, params->max_vdf_count);\n\n\t\t// request next VDF proofs\n\t\tauto vdf_iters = peak->vdf_iters;\n\t\tfor(uint32_t i = 0; i <= vdf_advance; ++i)\n\t\t{\n\t\t\tuint64_t num_iters = 0;\n\t\t\tconst auto infuse = get_infusion(peak, i, num_iters);\n\n\t\t\tauto req = IntervalRequest::create();\n\t\t\treq->vdf_height = peak->vdf_height + i + 1;\n\t\t\treq->start = vdf_iters;\n\t\t\treq->end = vdf_iters + num_iters;\n\t\t\treq->infuse = infuse;\n\n\t\t\tif(i == vdf_points.size()) {\n\t\t\t\treq->input = vdf_output;\t// for start or restart\n\t\t\t}\n\t\t\tpublish(req, output_interval_request);\n\n\t\t\tvdf_iters += num_iters;\n\t\t}\n\n\t\tconst auto challenge_advance = std::min<uint32_t>(\n\t\t\t\tvdf_points.size() + params->challenge_delay - 1, params->max_vdf_count);\n\n\t\t// publish challenges\n\t\tfor(uint32_t i = 1; i <= challenge_advance; ++i)\n\t\t{\n\t\t\tuint64_t space_diff = 0;\n\t\t\tconst auto challenge = get_challenge(peak, i, space_diff);\n\n\t\t\tauto value = Challenge::create();\n\t\t\tvalue->vdf_height = peak->vdf_height + i;\n\t\t\tvalue->challenge = challenge;\n\t\t\tvalue->difficulty = space_diff;\n\n\t\t\tpublish(value, output_challenges);\n\t\t}\n\t}\n\n\t// vote for new peak\n\tif(fork && peak->height && voted_blocks.count(peak->prev) == 0)\n\t{\n\t\t// make sure peak is from best proof seen\n\t\tconst auto proof = find_best_proof(peak->proof[0]->challenge);\n\t\tif(proof && peak->proof_hash == proof->hash) {\n\t\t\tvote_for_block(fork);\n\t\t}\n\t}\n\n\t// check for orphaned votes\n\tfor(const auto& fork : fork_line) {\n\t\tconst auto& block = fork->block;\n\t\tif(auto vote = find_value(voted_blocks, block->prev)) {\n\t\t\tif(vote->first != block->hash) {\n\t\t\t\t// our voted for block was orphaned\n\t\t\t\t// vote again for new block if more than one block interval has elapsed\n\t\t\t\t// this prevents vote fragmentation in case of double signing\n\t\t\t\tif(now_ms - vote->second > params->block_interval_ms) {\n\t\t\t\t\tvote_for_block(fork);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// try to replace current peak\n\t// in case another farmer made a block when they shouldn't\n\tif(peak->height) {\n\t\tconst auto challenge = peak->proof[0]->challenge;\n\n\t\tif(auto proof = find_best_proof(challenge))\n\t\t{\n\t\t\tif(vnx::get_pipe(proof->farmer_mac))\n\t\t\t{\n\t\t\t\tif(!created_blocks.count(proof->hash))\n\t\t\t\t{\n\t\t\t\t\tif(auto prev = find_prev(peak))\n\t\t\t\t\t{\n\t\t\t\t\t\tconst auto vdf_points = find_next_vdf_points(prev);\n\t\t\t\t\t\tif(vdf_points.size()) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif(auto block = make_block(prev, vdf_points, challenge)) {\n\t\t\t\t\t\t\t\t\tadd_block(block);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch(const std::exception& ex) {\n\t\t\t\t\t\t\t\tlog(WARN) << \"Failed to create block at height \" << peak->height << \": \" << ex.what();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfork_to(peak->hash);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// try to extend peak\n\t{\n\t\tconst auto vdf_points = find_next_vdf_points(peak);\n\t\tif(vdf_points.size())\n\t\t{\n\t\t\thash_t challenge;\n\t\t\tuint64_t space_diff = 0;\n\t\t\tif(find_challenge(peak, vdf_points.size(), challenge, space_diff))\n\t\t\t{\n\t\t\t\tif(auto proof = find_best_proof(challenge))\n\t\t\t\t{\n\t\t\t\t\tif(vnx::get_pipe(proof->farmer_mac))\n\t\t\t\t\t{\n\t\t\t\t\t\tif(!created_blocks.count(proof->hash)) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif(auto block = make_block(peak, vdf_points, challenge)) {\n\t\t\t\t\t\t\t\t\tadd_block(block);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch(const std::exception& ex) {\n\t\t\t\t\t\t\t\tlog(WARN) << \"Failed to create block at height \" << peak->height + 1 << \": \" << ex.what();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfork_to(peak->hash);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Node::on_sync_done(const uint32_t height)\n{\n\tlog(INFO) << \"Finished sync at height \" << height;\n\tsynced_since = height;\n\tupdate_control();\n}\n\nbool Node::tx_pool_update(const tx_pool_t& entry, const bool force_add)\n{\n\tif(entry.is_skipped) {\n\t\tthrow std::logic_error(\"tx_pool_update(): entry is_skipped\");\n\t}\n\tif(const auto& tx = entry.tx) {\n\t\tif(tx->sender) {\n\t\t\tconst auto& sender = *tx->sender;\n\t\t\tconst auto iter = tx_pool.find(tx->id);\n\t\t\tconst auto fees = tx_pool_fees.find(sender);\n\t\t\tauto new_total = (fees != tx_pool_fees.end()) ? fees->second : 0;\n\t\t\tif(iter != tx_pool.end()) {\n\t\t\t\tnew_total -= iter->second.fee;\n\t\t\t}\n\t\t\tnew_total += entry.fee;\n\n\t\t\tif(!force_add && new_total > get_balance(sender, addr_t())) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif(fees != tx_pool_fees.end()) {\n\t\t\t\tfees->second = new_total;\n\t\t\t} else {\n\t\t\t\ttx_pool_fees[sender] = new_total;\n\t\t\t}\n\t\t\tif(iter != tx_pool.end()) {\n\t\t\t\titer->second = entry;\n\t\t\t} else {\n\t\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\n\t\t\t\tfor(const auto& in : tx->get_inputs()) {\n\t\t\t\t\ttx_pool_index.emplace(std::make_pair(in.address, tx->id), tx);\n\t\t\t\t}\n\t\t\t\tfor(const auto& out : tx->get_outputs()) {\n\t\t\t\t\ttx_pool_index.emplace(std::make_pair(out.address, tx->id), tx);\n\t\t\t\t\tif(out.memo) {\n\t\t\t\t\t\ttx_pool_index.emplace(std::make_pair(hash_t(out.address + (*out.memo)), tx->id), tx);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttx_pool[tx->id] = entry;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nvoid Node::tx_pool_erase(const hash_t& txid)\n{\n\tconst auto iter = tx_pool.find(txid);\n\tif(iter != tx_pool.end()) {\n\t\tif(const auto& tx = iter->second.tx) {\n\t\t\tif(const auto& sender = tx->sender) {\n\t\t\t\tconst auto iter2 = tx_pool_fees.find(*sender);\n\t\t\t\tif(iter2 != tx_pool_fees.end()) {\n\t\t\t\t\tif((iter2->second -= iter->second.fee) == 0) {\n\t\t\t\t\t\ttx_pool_fees.erase(iter2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\n\t\t\tfor(const auto& in : tx->get_inputs()) {\n\t\t\t\ttx_pool_index.erase(std::make_pair(in.address, tx->id));\n\t\t\t}\n\t\t\tfor(const auto& out : tx->get_outputs()) {\n\t\t\t\ttx_pool_index.erase(std::make_pair(out.address, tx->id));\n\t\t\t\tif(out.memo) {\n\t\t\t\t\ttx_pool_index.erase(std::make_pair(hash_t(out.address + (*out.memo)), tx->id));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\ttx_pool.erase(iter);\n\t}\n}\n\nvoid Node::purge_tx_pool()\n{\n\tconst auto time_begin = get_time_ms();\n\n\tstd::vector<tx_pool_t> all_tx;\n\tall_tx.reserve(tx_pool.size());\n\tfor(const auto& entry : tx_pool) {\n\t\tall_tx.push_back(entry.second);\n\t}\n\n\t// sort transactions by fee ratio\n\tstd::sort(all_tx.begin(), all_tx.end(),\n\t\t[](const tx_pool_t& lhs, const tx_pool_t& rhs) -> bool {\n\t\t\tconst auto L = lhs.tx->fee_ratio;\n\t\t\tconst auto R = rhs.tx->fee_ratio;\n\t\t\treturn (L == R) ? lhs.luck < rhs.luck : L > R;\n\t\t});\n\n\tsize_t num_purged = 0;\n\tuint64_t total_pool_size = 0;\n\tstd::unordered_map<addr_t, std::pair<uint64_t, uint64_t>> sender_map;\t// [sender => [balance, total fee]]\n\n\tconst uint64_t max_pool_size = uint64_t(max_tx_pool) * params->max_block_size;\n\n\t// purge transactions from pool if overflowing\n\tfor(const auto& entry : all_tx) {\n\t\tconst auto& tx = entry.tx;\n\t\tbool fee_overspend = false;\n\t\tif(tx->sender) {\n\t\t\tconst auto sender = *tx->sender;\n\t\t\tconst auto iter = sender_map.emplace(sender, std::make_pair(0, 0));\n\t\t\tauto& balance = iter.first->second.first;\n\t\t\tauto& total_fee = iter.first->second.second;\n\t\t\tif(iter.second) {\n\t\t\t\tbalance = get_balance(sender, addr_t());\n\t\t\t}\n\t\t\ttotal_fee += entry.fee;\n\t\t\tfee_overspend = total_fee > balance;\n\t\t}\n\t\tif(!fee_overspend) {\n\t\t\ttotal_pool_size += tx->static_cost;\n\t\t}\n\t\tif(total_pool_size > max_pool_size || fee_overspend) {\n\t\t\ttx_pool_erase(tx->id);\n\t\t\tnum_purged++;\n\t\t} else {\n\t\t\tmin_pool_fee_ratio = tx->fee_ratio;\n\t\t}\n\t}\n\tif(total_pool_size < 9 * max_pool_size / 10) {\n\t\tmin_pool_fee_ratio = 0;\n\t}\n\tif(total_pool_size || num_purged) {\n\t\tlog(INFO) << uint64_t((total_pool_size * 10000) / max_pool_size) / 100. << \" % mem pool, \"\n\t\t\t\t<< min_pool_fee_ratio / 1024. << \" min fee ratio, \" << num_purged << \" purged, took \"\n\t\t\t\t<< (get_time_ms() - time_begin) / 1e3 << \" sec\";\n\t}\n}\n\nvoid Node::validate_new()\n{\n\tconst auto peak = get_peak();\n\tif(!peak || !is_synced) {\n\t\treturn;\n\t}\n\tconst auto deadline_ms = get_time_ms() + validate_interval_ms / 2;\t\t// limit to 50% CPU\n\n\tstd::default_random_engine luck_gen(vnx::rand64());\n\n\t// select non-overlapping set\n\tstd::vector<tx_pool_t> tx_list;\n\tstd::unordered_set<hash_t> tx_set;\n\ttx_list.reserve(max_tx_queue);\n\ttx_set.reserve(max_tx_queue);\n\tfor(const auto& entry : tx_queue) {\n\t\tif(const auto& tx = entry.second) {\n\t\t\tif(tx_set.insert(tx->id).second) {\n\t\t\t\ttx_pool_t tmp;\n\t\t\t\ttmp.tx = tx;\n\t\t\t\ttmp.luck = luck_gen();\n\t\t\t\ttx_list.push_back(tmp);\n\t\t\t}\n\t\t}\n\t}\n\tauto context = new_exec_context(peak->height + 1);\n\n\t// prepare synchronization\n\tfor(auto& entry : tx_list) {\n\t\ttry {\n\t\t\tentry.is_valid = true;\n\t\t\tprepare_context(context, entry.tx);\n\t\t} catch(...) {\n\t\t\tentry.is_valid = false;\n\t\t}\n\t}\n\n\t// verify transactions in parallel\n\tfor(auto& entry : tx_list) {\n\t\tif(!entry.is_valid) {\n\t\t\tcontinue;\n\t\t}\n\t\tthreads->add_task([this, &entry, context, deadline_ms]() {\n\t\t\tif(get_time_ms() > deadline_ms) {\n\t\t\t\tentry.is_skipped = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tentry.is_valid = false;\n\n\t\t\tauto& tx = entry.tx;\n\t\t\tif(tx->exec_result) {\n\t\t\t\tauto tmp = vnx::clone(tx);\n\t\t\t\ttmp->reset(params);\n\t\t\t\ttx = tmp;\n\t\t\t}\n\t\t\tcontext->wait(tx->id);\n\t\t\ttry {\n\t\t\t\tif(auto result = validate(tx, context)) {\n\t\t\t\t\tentry.cost = result->total_cost;\n\t\t\t\t\tentry.fee = result->total_fee;\n\t\t\t\t\tentry.is_valid = true;\n\t\t\t\t}\n\t\t\t} catch(const std::exception& ex) {\n\t\t\t\tif(show_warnings) {\n\t\t\t\t\tlog(WARN) << \"TX validation failed with: \" << ex.what() << \" (\" << tx->id << \")\";\n\t\t\t\t}\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\tcontext->signal(tx->id);\n\t\t});\n\t}\n\tthreads->sync();\n\n\t// update tx pool\n\tfor(const auto& entry : tx_list) {\n\t\tif(!entry.is_skipped) {\n\t\t\tconst auto& tx = entry.tx;\n\t\t\tif(entry.is_valid) {\n\t\t\t\tif(tx_pool_update(entry)) {\n\t\t\t\t\tpublish(tx, output_verified_transactions);\n\t\t\t\t}\n\t\t\t}\n\t\t\ttx_queue.erase(tx->content_hash);\n\t\t}\n\t}\n}\n\nstd::vector<Node::tx_pool_t> Node::validate_for_block(const int64_t deadline_ms)\n{\n\tconst auto peak = get_peak();\n\tconst auto context = new_exec_context(peak->height + 1);\n\n\tstd::vector<tx_pool_t> all_tx;\n\tall_tx.reserve(tx_pool.size());\n\tfor(const auto& entry : tx_pool) {\n\t\tall_tx.push_back(entry.second);\n\t}\n\n\t// sort transactions by fee ratio\n\tstd::sort(all_tx.begin(), all_tx.end(),\n\t\t[](const tx_pool_t& lhs, const tx_pool_t& rhs) -> bool {\n\t\t\treturn lhs.tx->fee_ratio > rhs.tx->fee_ratio;\n\t\t});\n\n\tstd::vector<tx_pool_t> tx_list;\n\tuint64_t total_verify_cost = 0;\n\n\t// select transactions to verify\n\tfor(const auto& entry : all_tx) {\n\t\tif(total_verify_cost + entry.cost <= params->max_block_cost) {\n\t\t\ttx_list.push_back(entry);\n\t\t\ttotal_verify_cost += entry.cost;\n\t\t}\n\t}\n\n\t// prepare synchronization\n\tfor(auto& entry : tx_list) {\n\t\ttry {\n\t\t\tentry.is_valid = true;\n\t\t\tprepare_context(context, entry.tx);\n\t\t} catch(...) {\n\t\t\tentry.is_valid = false;\n\t\t}\n\t}\n\n\t// verify transactions in parallel\n\tfor(auto& entry : tx_list) {\n\t\tif(!entry.is_valid) {\n\t\t\tcontinue;\n\t\t}\n\t\tthreads->add_task([this, &entry, context, deadline_ms]() {\n\t\t\tif(get_time_ms() > deadline_ms) {\n\t\t\t\tentry.is_skipped = true;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tentry.is_valid = false;\n\n\t\t\tauto& tx = entry.tx;\n\t\t\tif(tx->exec_result) {\n\t\t\t\tauto tmp = vnx::clone(tx);\n\t\t\t\ttmp->reset(params);\n\t\t\t\ttx = tmp;\n\t\t\t}\n\t\t\tcontext->wait(tx->id);\n\t\t\ttry {\n\t\t\t\tauto result = validate(tx, context);\n\t\t\t\tif(!result) {\n\t\t\t\t\tthrow std::logic_error(\"!result\");\n\t\t\t\t}\n\t\t\t\tauto tmp = vnx::clone(tx);\n\t\t\t\ttmp->update(*result, params);\n\t\t\t\ttx = tmp;\n\t\t\t\tentry.cost = result->total_cost;\n\t\t\t\tentry.fee = result->total_fee;\n\t\t\t\tentry.is_valid = true;\n\t\t\t} catch(const std::exception& ex) {\n\t\t\t\tif(show_warnings) {\n\t\t\t\t\tlog(WARN) << \"TX validation failed with: \" << ex.what() << \" (\" << tx->id << \")\";\n\t\t\t\t}\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\tcontext->signal(tx->id);\n\t\t});\n\t}\n\tthreads->sync();\n\n\tuint32_t num_skipped = 0;\n\tuint64_t total_cost = 0;\n\tuint64_t static_cost = 0;\n\tstd::vector<tx_pool_t> result;\n\tbalance_cache_t balance_cache(&balance_table);\n\n\t// select final set of transactions\n\tfor(auto& entry : tx_list)\n\t{\n\t\tif(entry.is_skipped) {\n\t\t\tnum_skipped++;\n\t\t\tcontinue;\n\t\t}\n\t\tif(!entry.is_valid) {\n\t\t\ttx_pool_erase(entry.tx->id);\n\t\t\tcontinue;\n\t\t}\n\t\tconst auto tx = entry.tx;\n\n\t\tif(static_cost + tx->static_cost > params->max_block_size || total_cost + entry.cost > params->max_block_cost) {\n\t\t\tcontinue;\n\t\t}\n\t\tbool passed = true;\n\t\tbalance_cache_t tmp_cache(&balance_cache);\n\t\t{\n\t\t\tconst auto balance = tmp_cache.find(*tx->sender, addr_t());\n\t\t\tif(balance && entry.fee <= *balance) {\n\t\t\t\t*balance -= entry.fee;\n\t\t\t} else {\n\t\t\t\tpassed = false;\n\t\t\t}\n\t\t}\n\t\tif(!tx->exec_result->did_fail) {\n\t\t\tfor(const auto& in : tx->inputs) {\n\t\t\t\tconst auto balance = tmp_cache.find(in.address, in.contract);\n\t\t\t\tif(balance && in.amount <= *balance) {\n\t\t\t\t\t*balance -= in.amount;\n\t\t\t\t} else {\n\t\t\t\t\tpassed = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(!passed) {\n\t\t\tcontinue;\n\t\t}\n\t\tbalance_cache.apply(tmp_cache);\n\n\t\ttotal_cost += entry.cost;\n\t\tstatic_cost += tx->static_cost;\n\t\tresult.push_back(entry);\n\t}\n\tif(num_skipped) {\n\t\tlog(WARN) << \"Skipped \" << num_skipped << \" transactions due to block creation deadline\";\n\t}\n\n\tconst uint32_t N = params->min_fee_ratio.size();\n\tif(N == 0) {\n\t\treturn result;\n\t}\n\tstd::vector<uint64_t> band_avail(N);\n\tfor(uint64_t i = 0; i < N; ++i) {\n\t\tband_avail[i] = ((i + 1) * params->max_block_size) / N - (i * params->max_block_size) / N;\n\t}\n\tuint32_t i = N - 1;\n\tstd::vector<tx_pool_t> out;\n\tfor(const auto& entry : result) {\n\t\tconst auto& tx = entry.tx;\n\t\twhile(i && (!band_avail[i] || tx->fee_ratio < params->min_fee_ratio[i] * 1024)) {\n\t\t\ti--;\n\t\t}\n\t\tif(tx->static_cost > band_avail[i]) {\n\t\t\tif(i) {\n\t\t\t\t// we assume band size is always >= max_tx_cost (so band_avail never goes negative here)\n\t\t\t\tband_avail[i - 1] -= tx->static_cost - band_avail[i];\n\t\t\t\tband_avail[i] = 0;\n\t\t\t} else {\n\t\t\t\tcontinue;\t// no room left for this tx\n\t\t\t}\n\t\t} else {\n\t\t\tband_avail[i] -= tx->static_cost;\n\t\t}\n\t\tout.push_back(entry);\n\t}\n\treturn out;\n}\n\nstd::shared_ptr<const Block> Node::make_block(\n\t\tstd::shared_ptr<const BlockHeader> prev, std::vector<std::shared_ptr<const VDF_Point>> vdf_points, const hash_t& challenge)\n{\n\tif(vdf_points.empty()) {\n\t\treturn nullptr;\n\t}\n\tconst auto proof = find_value(proof_map, challenge, std::vector<proof_data_t>());\n\tif(proof.empty()) {\n\t\treturn nullptr;\n\t}\n\tconst auto time_begin = get_time_ms();\n\n\t// reset state to previous block\n\tfork_to(prev->hash);\n\n\tauto block = Block::create();\n\tblock->prev = prev->hash;\n\tblock->height = prev->height + 1;\n\tblock->time_diff = prev->time_diff;\n\tblock->vdf_count = vdf_points.size();\n\tblock->vdf_height = prev->vdf_height + block->vdf_count;\n\tblock->reward_vote = reward_vote;\n\tblock->project_addr = prev->project_addr;\n\tblock->txfee_buffer = calc_new_txfee_buffer(params, prev);\n\tblock->support_flags |= Block::SUPPORT_HARDFORK1;\n\n\tblock->vdf_iters = prev->vdf_iters;\n\tfor(auto point : vdf_points) {\n\t\tblock->vdf_iters += point->num_iters;\n\t\tblock->vdf_output = point->output;\n\t\tblock->vdf_reward_addr.push_back(point->reward_addr);\n\t}\n\n\tfor(size_t i = 0; i < proof.size() && i < params->max_proof_count; ++i) {\n\t\tblock->proof.push_back(proof[i].proof);\n\t}\n\tblock->proof_hash = proof[0].hash;\n\n\tblock->challenge = calc_next_challenge(params, prev->challenge, block->vdf_count, block->proof_hash, block->is_space_fork);\n\n\tif(block->height % params->vdf_reward_interval == 0) {\n\t\tblock->vdf_reward_payout = get_vdf_reward_winner(block);\n\t}\n\n\tif(auto nft = std::dynamic_pointer_cast<const ProofOfSpaceNFT>(block->proof[0])) {\n\t\tblock->reward_contract = nft->contract;\n\t}\n\n\tif(auto contract = block->reward_contract) {\n\t\tconst addr_t any = hash_t::random();\n\t\tconst auto address = get_plot_nft_target(*contract, any);\n\t\tif(address != any) {\n\t\t\tblock->reward_addr = address;\n\t\t}\n\t}\n\n\tif(auto ref = find_prev(prev, 100))\n\t{\n\t\t// set new time diff\n\t\tconst auto delta_ms = prev->time_stamp - ref->time_stamp;\n\t\tconst auto delta_blocks = prev->height - ref->height;\n\t\tconst auto factor = double(params->block_interval_ms * delta_blocks) / delta_ms;\n\n\t\tconst auto delay = params->commit_delay + params->infuse_delay;\n\t\tconst auto begin = find_prev(ref, delay, true);\n\t\tconst auto end =   find_prev(prev, delay, true);\n\n\t\tif(begin && end) {\n\t\t\tconst auto avg_diff = (begin->time_diff + end->time_diff) / 2;\n\t\t\tblock->time_diff = std::max<int64_t>(avg_diff * factor + 0.5, params->time_diff_divider);\n\t\t}\n\n\t\t// limit time diff update\n\t\tconst auto max_update = std::max<uint64_t>(prev->time_diff >> params->max_diff_adjust, 1);\n\t\tif(prev->time_diff > max_update) {\n\t\t\tblock->time_diff = std::max(block->time_diff, prev->time_diff - max_update);\n\t\t}\n\t\tblock->time_diff = std::min(block->time_diff, prev->time_diff + max_update);\n\t}\n\t{\n\t\t// set time stamp\n\t\tauto delta_ms = time_begin - prev->time_stamp;\n\t\tdelta_ms = std::min(delta_ms, block->vdf_count * params->block_interval_ms * 2);\n\t\tdelta_ms = std::max(delta_ms, block->vdf_count * params->block_interval_ms / 2);\n\t\tblock->time_stamp = prev->time_stamp + delta_ms;\n\t}\n\n\tuint64_t total_fees = 0;\n\tif(block->height >= params->transaction_activation) {\n\t\ttry {\n\t\t\tconst auto deadline = get_time_ms() + params->block_interval_ms / 2;\n\t\t\tconst auto tx_list = validate_for_block(deadline);\n\t\t\t// select transactions\n\t\t\tfor(const auto& entry : tx_list) {\n\t\t\t\tblock->tx_list.push_back(entry.tx);\n\t\t\t\ttotal_fees += entry.fee;\n\t\t\t}\n\t\t} catch(const std::exception& ex) {\n\t\t\tlog(WARN) << \"Making empty block due to: \" << ex.what();\n\t\t}\n\t}\n\n\tblock->weight = calc_block_weight(params, block, prev);\n\tblock->total_weight = prev->total_weight + block->weight;\n\tblock->reward_amount = calc_block_reward(block, total_fees);\n\tblock->set_space_diff(params, prev);\n\tblock->set_base_reward(params, prev);\n\tblock->finalize();\n\n\tif(auto farmer_mac = proof[0].farmer_mac)\n\t{\n\t\tconst auto result = FarmerClient(farmer_mac).sign_block(block);\n\t\tif(!result) {\n\t\t\tlog(WARN) << \"Farmer refused to sign block at height \" << block->height;\n\t\t\treturn nullptr;\n\t\t}\n\t\tblock->BlockHeader::operator=(*result);\n\t}\n\tcreated_blocks[block->proof_hash] = block->hash;\n\n\tconst auto elapsed = (get_time_ms() - time_begin) / 1e3;\n\tlog(INFO) << u8\"\\U0001F911 Created block at height \" << block->height << \" with: ntx = \" << block->tx_count\n\t\t\t<< \", score = \" << block->proof[0]->score << \", reward = \" << to_value(block->reward_amount, params) << \" MMX\"\n\t\t\t<< \", fees = \" << to_value(total_fees, params) << \" MMX\" << \", took \" << elapsed << \" sec\";\n\treturn block;\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Node_validate.cpp",
    "content": "/*\n * Node_validate.cpp\n *\n *  Created on: Jan 20, 2022\n *      Author: mad\n */\n\n#include <mmx/Node.h>\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/ProofOfSpaceNFT.hxx>\n#include <mmx/contract/PubKey.hxx>\n#include <mmx/contract/MultiSig.hxx>\n#include <mmx/contract/Binary.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/utils.h>\n#include <mmx/vm_interface.h>\n#include <mmx/exception.h>\n#include <mmx/error_code_e.hxx>\n#include <mmx/txio_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nvoid Node::execution_context_t::wait(const hash_t& txid) const\n{\n\tauto iter = wait_map.find(txid);\n\tif(iter != wait_map.end()) {\n\t\tfor(const auto& prev : iter->second) {\n\t\t\tauto iter = signal_map.find(prev);\n\t\t\tif(iter != signal_map.end()) {\n\t\t\t\tauto& entry = iter->second;\n\t\t\t\t{\n\t\t\t\t\tstd::unique_lock<std::mutex> lock(entry->mutex);\n\t\t\t\t\twhile(entry->do_wait) {\n\t\t\t\t\t\tentry->signal.wait(lock);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Node::execution_context_t::signal(const hash_t& txid) const\n{\n\tauto iter = signal_map.find(txid);\n\tif(iter != signal_map.end()) {\n\t\tauto& entry = iter->second;\n\t\t{\n\t\t\tstd::lock_guard lock(entry->mutex);\n\t\t\tentry->do_wait = false;\n\t\t}\n\t\tentry->signal.notify_all();\n\t}\n}\n\nvoid Node::execution_context_t::setup_wait(const hash_t& txid, const addr_t& address)\n{\n\tconst auto& list = mutate_map[address];\n\tif(!list.empty()) {\n\t\twait_map[txid].insert(list.back());\n\t}\n}\n\nstd::shared_ptr<Node::execution_context_t> Node::new_exec_context(const uint32_t height) const\n{\n\tauto context = std::make_shared<execution_context_t>();\n\tcontext->height = height;\n\tcontext->storage = std::make_shared<vm::StorageCache>(storage);\n\treturn context;\n}\n\nvoid Node::prepare_context(std::shared_ptr<execution_context_t> context, std::shared_ptr<const Transaction> tx) const\n{\n\tstd::set<addr_t> mutate_set;\n\tif(tx->deploy) {\n\t\tmutate_set.insert(tx->id);\n\t}\n\tfor(const auto& op : tx->get_operations()) {\n\t\tmutate_set.insert(op->address == addr_t() ? tx->id : op->address);\n\t}\n\tfor(const auto& address : std::vector<addr_t>(mutate_set.begin(), mutate_set.end()))\n\t{\n\t\tstd::vector<addr_t> depends;\n\t\tif(address == tx->id) {\n\t\t\tif(auto exec = std::dynamic_pointer_cast<const contract::Executable>(tx->deploy)) {\n\t\t\t\tdepends = get_all_depends(exec);\n\t\t\t}\n\t\t} else {\n\t\t\tdepends = get_all_depends(address, 1);\n\t\t}\n\t\tmutate_set.insert(depends.begin(), depends.end());\n\t}\n\tfor(const auto& address : mutate_set) {\n\t\tcontext->setup_wait(tx->id, address);\n\t\tcontext->mutate_map[address].push_back(tx->id);\n\t}\n\tif(!mutate_set.empty()) {\n\t\tcontext->signal_map.emplace(tx->id, std::make_shared<waitcond_t>());\n\t}\n}\n\nstd::shared_ptr<Node::execution_context_t> Node::validate(std::shared_ptr<const Block> block) const\n{\n\t/*\n\t * The following fields have already been verified in `Node::verify_proof()` or see note:\n\t * - vdf_height\n\t * - vdf_count\t\t\t\t(Node::find_vdf_points() + Node::verify_proof())\n\t * - vdf_iters\n\t * - vdf_output\t\t\t\t(Node::find_vdf_points())\n\t * - vdf_reward_addr\t\t(Node::find_vdf_points())\n\t * - proof\n\t * - proof_hash\n\t * - challenge\n\t * - is_space_fork\n\t * - time_diff\n\t * - space_diff\n\t * - proof_score_sum\n\t * - proof_score_count\n\t * - weight\n\t * - total_weight\n\t */\n\n\tif(!block->is_valid()) {\n\t\tthrow std::logic_error(\"static validation failed\");\n\t}\n\tblock->validate();\n\n\tconst auto prev = find_prev(block);\n\tif(!prev) {\n\t\tthrow std::logic_error(\"missing prev\");\n\t}\n\tif(prev->hash != state_hash) {\n\t\tthrow std::logic_error(\"state mismatch\");\n\t}\n\tif(block->version != 0) {\n\t\tthrow std::logic_error(\"invalid version\");\n\t}\n\tif(block->height != prev->height + 1) {\n\t\tthrow std::logic_error(\"invalid height\");\n\t}\n\tif(block->space_fork_len > params->challenge_interval * 100) {\n\t\tthrow std::logic_error(\"space fork too long\");\n\t}\n\tif(block->time_stamp - prev->time_stamp > block->vdf_count * params->block_interval_ms * 2) {\n\t\tthrow std::logic_error(\"time stamp delta too high\");\n\t}\n\tif(block->time_stamp - prev->time_stamp < block->vdf_count * params->block_interval_ms / 2) {\n\t\tthrow std::logic_error(\"time stamp delta too low\");\n\t}\n\tif(block->time_diff < params->time_diff_divider || block->space_diff == 0) {\n\t\tthrow std::logic_error(\"invalid difficulty\");\n\t}\n\tif(block->static_cost > params->max_block_size) {\n\t\tthrow std::logic_error(\"block size too high: \" + std::to_string(block->static_cost));\n\t}\n\tif(block->total_cost > params->max_block_cost) {\n\t\tthrow std::logic_error(\"block cost too high: \" + std::to_string(block->total_cost));\n\t}\n\tconst auto txfee_buffer = calc_new_txfee_buffer(params, prev);\n\tif(block->txfee_buffer != txfee_buffer) {\n\t\tthrow std::logic_error(\"invalid txfee_buffer: \" + std::to_string(block->txfee_buffer) + \" != \" + std::to_string(txfee_buffer));\n\t}\n\tif(block->reward_vote > 1 || block->reward_vote < -1) {\n\t\tthrow std::logic_error(\"invalid reward_vote: \" + std::to_string(block->reward_vote));\n\t}\n\tvnx::optional<addr_t> reward_contract;\n\n\tif(block->reward_addr) {\n\t\tif(auto proof = std::dynamic_pointer_cast<const ProofOfSpaceNFT>(block->proof[0])) {\n\t\t\treward_contract = proof->contract;\n\t\t}\n\t}\n\tif(block->reward_contract != reward_contract) {\n\t\tthrow std::logic_error(\"invalid reward_contract\");\n\t}\n\tif(reward_contract) {\n\t\taddr_t target;\n\t\ttry {\n\t\t\ttarget = get_plot_nft_target(*reward_contract, block->reward_account);\n\t\t} catch(const std::exception& ex) {\n\t\t\tthrow std::logic_error(\"reward_addr resolution failed with: \" + std::string(ex.what()));\n\t\t}\n\t\tif(!block->reward_addr || (*block->reward_addr) != target) {\n\t\t\tthrow std::logic_error(\"invalid reward_addr for reward_contract: expected \" + target.to_string());\n\t\t}\n\t}\n\n\tif(block->height % params->vdf_reward_interval == 0)\n\t{\n\t\tconst auto address = get_vdf_reward_winner(block);\n\t\tif(block->vdf_reward_payout != address) {\n\t\t\tthrow std::logic_error(\"invalid vdf_reward_payout\");\n\t\t}\n\t} else {\n\t\tif(block->vdf_reward_payout) {\n\t\t\tthrow std::logic_error(\"invalid vdf_reward_payout (must be null)\");\n\t\t}\n\t}\n\n\tif(block->height % params->reward_adjust_interval == 0)\n\t{\n\t\tconst auto base_reward = calc_new_base_reward(params, prev);\n\t\tif(block->base_reward != base_reward) {\n\t\t\tthrow std::logic_error(\"invalid base_reward: \" + std::to_string(block->base_reward) + \" != \" + std::to_string(base_reward));\n\t\t}\n\t\tif(block->reward_vote_sum != block->reward_vote) {\n\t\t\tthrow std::logic_error(\"invalid reward_vote_sum\");\n\t\t}\n\t\tif(block->reward_vote_count != (block->reward_vote ? 1 : 0)) {\n\t\t\tthrow std::logic_error(\"invalid reward_vote_count\");\n\t\t}\n\t} else {\n\t\tif(block->base_reward != prev->base_reward) {\n\t\t\tthrow std::logic_error(\"invalid base_reward\");\n\t\t}\n\t\tif(block->reward_vote_sum != prev->reward_vote_sum + block->reward_vote) {\n\t\t\tthrow std::logic_error(\"invalid reward_vote_sum\");\n\t\t}\n\t\tif(block->reward_vote_count != prev->reward_vote_count + (block->reward_vote ? 1 : 0)) {\n\t\t\tthrow std::logic_error(\"invalid reward_vote_count\");\n\t\t}\n\t}\n\n\tif(block->height < params->transaction_activation && block->tx_count) {\n\t\tthrow std::logic_error(\"transactions not activated yet\");\n\t}\n\tif(block->project_addr != prev->project_addr) {\n\t\tthrow std::logic_error(\"invalid project_addr\");\n\t}\n\n\t{\n\t\tstd::set<std::pair<addr_t, addr_t>> keys;\n\t\tfor(const auto& tx : block->tx_list) {\n\t\t\tif(tx->sender) {\n\t\t\t\tkeys.emplace(*tx->sender, addr_t());\n\t\t\t}\n\t\t\tfor(const auto& in : tx->inputs) {\n\t\t\t\tkeys.emplace(in.address, in.contract);\n\t\t\t}\n\t\t}\n\t\tprefetch_balances(keys);\n\t}\n\n\tauto context = new_exec_context(block->height);\n\t{\n\t\tstd::unordered_set<addr_t> tx_set;\n\t\ttx_set.reserve(block->tx_count);\n\n\t\tbalance_cache_t balance_cache(&balance_table);\n\n\t\tstd::shared_ptr<const Transaction> prev;\n\n\t\tfor(const auto& tx : block->tx_list) {\n\t\t\tif(!tx) {\n\t\t\t\tthrow std::logic_error(\"null transaction\");\n\t\t\t}\n\t\t\tif(!tx->sender) {\n\t\t\t\tthrow std::logic_error(\"transaction missing sender\");\n\t\t\t}\n\t\t\tif(!tx->exec_result) {\n\t\t\t\tthrow std::logic_error(\"transaction missing exec_result\");\n\t\t\t}\n\t\t\tif(!tx_set.insert(tx->id).second) {\n\t\t\t\tthrow std::logic_error(\"duplicate transaction in same block\");\n\t\t\t}\n\t\t\tif(prev) {\n\t\t\t\tif(tx->fee_ratio > prev->fee_ratio) {\n\t\t\t\t\tthrow std::logic_error(\"invalid tx order (fee_ratio)\");\n\t\t\t\t}\n\t\t\t}\n\t\t\t{\n\t\t\t\t// subtract tx fee\n\t\t\t\tconst auto balance = balance_cache.find(*tx->sender, addr_t());\n\t\t\t\tconst auto total_fee = tx->exec_result->total_fee;\n\t\t\t\tif(!balance || total_fee > *balance) {\n\t\t\t\t\tthrow std::logic_error(\"insufficient funds to cover transaction fee\");\n\t\t\t\t}\n\t\t\t\t*balance -= total_fee;\n\t\t\t}\n\t\t\tif(!tx->exec_result->did_fail) {\n\t\t\t\t// Note: exec_inputs are checked during tx validation\n\t\t\t\tfor(const auto& in : tx->inputs) {\n\t\t\t\t\tconst auto balance = balance_cache.find(in.address, in.contract);\n\t\t\t\t\tif(!balance || in.amount > *balance) {\n\t\t\t\t\t\tthrow std::logic_error(\"insufficient funds to cover input\");\n\t\t\t\t\t}\n\t\t\t\t\t*balance -= in.amount;\n\t\t\t\t}\n\t\t\t}\n\t\t\tprepare_context(context, tx);\n\t\t\tprev = tx;\n\t\t}\n\t}\n\t// minimum fee_ratio depending on block size\n\t{\n\t\tconst uint32_t N = params->min_fee_ratio.size();\n\t\tif(N) {\n\t\t\tuint64_t i = 0;\n\t\t\tuint64_t total_size = 0;\n\t\t\tfor(auto iter = block->tx_list.rbegin(); iter != block->tx_list.rend(); ++iter)\n\t\t\t{\n\t\t\t\tconst auto& tx = *iter;\t\t\t\t// tx == nullptr already checked above\n\t\t\t\ttotal_size += tx->static_cost;\n\n\t\t\t\twhile(total_size > ((i + 1) * params->max_block_size) / N) {\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tif(i >= N) {\n\t\t\t\t\tthrow std::logic_error(\"block size overflow\");\n\t\t\t\t}\n\t\t\t\tconst auto min_ratio = params->min_fee_ratio[i] * 1024;\n\t\t\t\tif(tx->fee_ratio < min_ratio) {\n\t\t\t\t\tthrow std::logic_error(\"transaction fee_ratio too small: \" + std::to_string(tx->fee_ratio) + \" < \" + std::to_string(min_ratio));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\thash_t failed_tx;\n\tstd::mutex mutex;\n\tstd::exception_ptr failed_ex;\n\n\tfor(const auto& tx : block->tx_list) {\n\t\tthreads->add_task([this, tx, context, &mutex, &failed_tx, &failed_ex]() {\n\t\t\tcontext->wait(tx->id);\n\t\t\ttry {\n\t\t\t\tif(validate(tx, context)) {\n\t\t\t\t\tthrow std::logic_error(\"missing exec_result\");\n\t\t\t\t}\n\t\t\t} catch(...) {\n\t\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\t\tfailed_tx = tx->id;\n\t\t\t\tfailed_ex = std::current_exception();\n\t\t\t}\n\t\t\tcontext->signal(tx->id);\n\t\t});\n\t}\n\tthreads->sync();\n\n\tif(failed_ex) {\n\t\ttry {\n\t\t\tstd::rethrow_exception(failed_ex);\n\t\t} catch(const std::exception& ex) {\n\t\t\tthrow std::logic_error(std::string(ex.what()) + \" (\" + failed_tx.to_string() + \")\");\n\t\t}\n\t}\n\tif(block->reward_addr) {\n\t\tconst auto amount = calc_block_reward(block, block->tx_fees);\n\t\tif(block->reward_amount != amount) {\n\t\t\tthrow std::logic_error(\"invalid reward_amount: \"\n\t\t\t\t\t+ std::to_string(block->reward_amount) + \" != \" + std::to_string(amount));\n\t\t}\n\t} else {\n\t\tif(block->reward_amount) {\n\t\t\tthrow std::logic_error(\"invalid reward_amount\");\n\t\t}\n\t}\n\treturn context;\n}\n\nexec_result_t Node::validate(std::shared_ptr<const Transaction> tx) const\n{\n\tif(tx->exec_result) {\n\t\tthrow std::logic_error(\"exec_result not null\");\n\t}\n\tconst auto height = get_height() + 1;\n\n\tif(height < params->transaction_activation) {\n\t\tthrow std::logic_error(\"transactions not live yet\");\n\t}\n\tauto context = new_exec_context(height);\n\tcontext->do_profile = exec_profile;\n\tcontext->do_trace = exec_trace;\n\tprepare_context(context, tx);\n\n\tconst auto result = validate(tx, context);\n\tif(!result) {\n\t\tthrow std::logic_error(\"!result\");\n\t}\n\treturn *result;\n}\n\nvoid Node::execute(\tstd::shared_ptr<const Transaction> tx,\n\t\t\t\t\tstd::shared_ptr<const execution_context_t> context,\n\t\t\t\t\tstd::shared_ptr<const operation::Execute> op,\n\t\t\t\t\tstd::shared_ptr<const Contract> contract,\n\t\t\t\t\tconst addr_t& address,\n\t\t\t\t\tstd::vector<txout_t>& exec_outputs,\n\t\t\t\t\tstd::map<std::pair<addr_t, addr_t>, uint128>& exec_spend_map,\n\t\t\t\t\tstd::shared_ptr<vm::StorageCache> storage_cache,\n\t\t\t\t\tuint64_t& tx_cost, exec_error_t& error, const bool is_init) const\n{\n\tauto executable = std::dynamic_pointer_cast<const contract::Executable>(contract);\n\tif(!executable) {\n\t\tthrow std::logic_error(\"not an executable: \" + address.to_string());\n\t}\n\tauto engine = std::make_shared<vm::Engine>(address, storage_cache, false);\n\tengine->do_profile = context->do_profile;\n\tengine->do_trace = context->do_trace;\n\t{\n\t\tconst auto avail_gas = fee_to_cost<mmx::static_failure>(tx->max_fee_amount, tx->fee_ratio);\n\t\tengine->gas_limit = std::min(avail_gas - std::min(tx_cost, avail_gas), params->max_tx_cost);\n\t}\n\tif(op->user) {\n\t\tconst auto contract = get_contract_for_ex(*op->user, &engine->gas_used, engine->gas_limit);\n\t\tcontract->validate(tx->get_solution(op->solution), tx->id);\n\n\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_USER, vm::to_binary(*op->user));\n\t} else {\n\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_USER, vm::var_t());\n\t}\n\tengine->write(vm::MEM_EXTERN + vm::EXTERN_ADDRESS, vm::to_binary(address));\n\tengine->write(vm::MEM_EXTERN + vm::EXTERN_NETWORK, vm::to_binary(params->network));\n\n\tif(auto deposit = std::dynamic_pointer_cast<const operation::Deposit>(op)) {\n\t\t{\n\t\t\tuint128 amount = deposit->amount;\n\t\t\tif(auto value = storage_cache->get_balance(address, deposit->currency)) {\n\t\t\t\tamount += *value;\n\t\t\t}\n\t\t\tstorage_cache->set_balance(address, deposit->currency, amount);\n\t\t}\n\t\tvm::set_deposit(engine, deposit->currency, deposit->amount);\n\t}\n\tvm::set_args(engine, op->args);\n\n\tstd::exception_ptr failed_ex;\n\ttry {\n\t\texecute(tx, context, executable, exec_outputs, exec_spend_map, storage_cache, engine, op->method, error, is_init);\n\t} catch(...) {\n\t\tfailed_ex = std::current_exception();\n\t}\n\t// decouple gas checking from consensus by clamping cost to limit\n\ttx_cost += std::min(engine->gas_used, engine->gas_limit);\n\n\tif(engine->do_profile) {\n\t\tstd::ofstream out(\"profile_\" + executable->binary.to_string() + \"_\" + op->method + \"_\" + std::to_string(get_time_us()) + \".json\");\n\t\tout << vnx::to_pretty_string(engine->cost_map);\n\t}\n\tif(engine->do_trace) {\n\t\tstd::ofstream out(\"trace_\" + executable->binary.to_string() + \"_\" + op->method + \"_\" + std::to_string(get_time_us()) + \".json\");\n\t\tfor(const auto& t : engine->storage->trace) {\n\t\t\tout << t.type << \"\\taddr = 0x\" << vnx::to_hex_string(t.addr)\n\t\t\t\t\t<< \"\\tkey = 0x\" << vnx::to_hex_string(t.key) << \"\\tvalue = \" << to_string(t.value) << std::endl;\n\t\t}\n\t}\n\tif(failed_ex) {\n\t\tstd::rethrow_exception(failed_ex);\n\t}\n}\n\nvoid Node::execute(\tstd::shared_ptr<const Transaction> tx,\n\t\t\t\t\tstd::shared_ptr<const execution_context_t> context,\n\t\t\t\t\tstd::shared_ptr<const contract::Executable> executable,\n\t\t\t\t\tstd::vector<txout_t>& exec_outputs,\n\t\t\t\t\tstd::map<std::pair<addr_t, addr_t>, uint128>& exec_spend_map,\n\t\t\t\t\tstd::shared_ptr<vm::StorageCache> storage_cache,\n\t\t\t\t\tstd::shared_ptr<vm::Engine> engine,\n\t\t\t\t\tconst std::string& method_name,\n\t\t\t\t\texec_error_t& error, const bool is_init) const\n{\n\t{\n\t\tauto iter = context->mutate_map.find(engine->contract);\n\t\tif(iter == context->mutate_map.end()) {\n\t\t\tthrow std::logic_error(\"contract not locked\");\n\t\t}\n\t\tconst auto& list = iter->second;\n\t\tif(std::find(list.begin(), list.end(), tx->id) == list.end()) {\n\t\t\tthrow std::logic_error(\"transaction did not lock contract: \" + engine->contract.to_string());\n\t\t}\n\t}\n\tconst auto binary = get_contract_as<contract::Binary>(executable->binary, &engine->gas_used, engine->gas_limit);\n\tif(!binary) {\n\t\tthrow std::logic_error(\"no such binary: \" + executable->binary.to_string());\n\t}\n\tauto method = vm::find_method(binary, method_name);\n\tif(!method) {\n\t\tthrow std::logic_error(\"no such method: \" + method_name);\n\t}\n\tif(is_init) {\n\t\tif(!method->is_init) {\n\t\t\tthrow std::logic_error(\"not a constructor: \" + method_name);\n\t\t}\n\t} else {\n\t\tif(!method->is_public) {\n\t\t\tthrow std::logic_error(\"method is not public: \" + method_name);\n\t\t}\n\t}\n\tvm::load(engine, binary);\n\n\tstd::map<addr_t, std::shared_ptr<const Contract>> contract_cache;\n\tcontract_cache[tx->id] = tx->deploy;\n\n\tengine->remote_call = [this, tx, context, executable, storage_cache, &engine, &contract_cache, &exec_outputs, &exec_spend_map, &error]\n\t\t(const std::string& name, const std::string& method, const uint32_t nargs)\n\t{\n\t\tconst auto address = executable->get_external(name);\n\n\t\tauto& fetch = contract_cache[address];\n\t\tif(!fetch) {\n\t\t\tfetch = get_contract_ex(address, &engine->gas_used, engine->gas_limit);\n\t\t}\n\t\tconst auto contract = std::dynamic_pointer_cast<const contract::Executable>(fetch);\n\t\tif(!contract) {\n\t\t\tthrow std::logic_error(\"not an executable: \" + address.to_string());\n\t\t}\n\t\tengine->gas_used += params->min_txfee_exec;\n\t\tengine->check_gas();\n\n\t\tconst auto child = std::make_shared<vm::Engine>(address, storage_cache, false);\n\t\tchild->gas_limit = engine->gas_limit - std::min(engine->gas_used, engine->gas_limit);\n\n\t\tconst auto stack_ptr = engine->get_stack_ptr();\n\t\tfor(uint32_t i = 0; i < nargs; ++i) {\n\t\t\tvm::copy(child, engine, vm::MEM_STACK + 1 + i, stack_ptr + 1 + i);\n\t\t}\n\t\tchild->write(vm::MEM_EXTERN + vm::EXTERN_USER, vm::to_binary(engine->contract));\n\t\tchild->write(vm::MEM_EXTERN + vm::EXTERN_ADDRESS, vm::to_binary(address));\n\t\tchild->write(vm::MEM_EXTERN + vm::EXTERN_NETWORK, vm::to_binary(params->network));\n\n\t\texecute(tx, context, contract, exec_outputs, exec_spend_map, storage_cache, child, method, error, false);\n\n\t\tvm::copy(engine, child, stack_ptr, vm::MEM_STACK);\n\n\t\tengine->gas_used += child->gas_used;\n\t\tengine->check_gas();\n\t};\n\n\tengine->read_contract = [this, tx, executable, &engine, &contract_cache]\n\t\t(const addr_t& address, const std::string& field, const uint64_t dst)\n\t{\n\t\tauto& contract = contract_cache[address];\n\t\tif(!contract) {\n\t\t\tcontract = get_contract_ex(address, &engine->gas_used, engine->gas_limit);\n\t\t}\n\t\tif(!contract) {\n\t\t\tthrow std::logic_error(\"no such contract: \" + address.to_string());\n\t\t}\n\t\tvm::assign(engine, dst, contract->read_field(field));\n\t\tengine->check_gas();\n\t};\n\n\tengine->write(vm::MEM_EXTERN + vm::EXTERN_HEIGHT, vm::uint_t(context->height));\n\tengine->write(vm::MEM_EXTERN + vm::EXTERN_TXID, vm::to_binary(tx->id));\n\n\ttry {\n\t\tvm::execute(engine, *method, true);\n\t} catch(...) {\n\t\terror.code = engine->error_code;\n\t\terror.address = engine->error_addr;\n\n\t\tif(auto line = binary->find_line(error.address)) {\n\t\t\terror.line = *line;\n\t\t}\n\t\tif(exec_debug) {\n\t\t\tengine->dump_memory();\n\t\t}\n\t\tthrow;\n\t}\n\n\tfor(const auto& out : engine->outputs) {\n\t\t{\n\t\t\tauto amount = storage_cache->get_balance(engine->contract, out.contract);\n\t\t\tif(!amount || out.amount > *amount) {\n\t\t\t\tthrow std::logic_error(\"contract over-spend\");\n\t\t\t}\n\t\t\t*amount -= out.amount;\n\t\t\tstorage_cache->set_balance(engine->contract, out.contract, *amount);\n\t\t}\n\t\texec_outputs.push_back(out);\n\t\texec_spend_map[std::make_pair(engine->contract, out.contract)] += out.amount;\n\t}\n\texec_outputs.insert(exec_outputs.end(), engine->mint_outputs.begin(), engine->mint_outputs.end());\n}\n\nstd::shared_ptr<const exec_result_t>\nNode::validate(\tstd::shared_ptr<const Transaction> tx,\n\t\t\t\tstd::shared_ptr<const execution_context_t> context) const\n{\n\tif(!tx->is_valid(params)) {\n\t\tthrow mmx::static_failure(\"invalid tx\");\n\t}\n\tif(tx->static_cost > params->max_tx_cost) {\n\t\tthrow mmx::static_failure(\"static_cost > max_tx_cost\");\n\t}\n\tif(uint64_t(tx->max_fee_amount) >> 32) {\n\t\tthrow mmx::static_failure(\"max fee amount >= 2^32\");\n\t}\n\tif(tx_index.count(tx->id)) {\n\t\tthrow mmx::static_failure(\"duplicate tx\");\n\t}\n\tconst uint64_t gas_limit = std::min(\n\t\t\tfee_to_cost<mmx::static_failure>(tx->max_fee_amount, tx->fee_ratio), params->max_tx_cost);\n\tconst uint64_t static_fee = cost_to_fee<mmx::static_failure>(tx->static_cost, tx->fee_ratio);\n\n\tuint64_t tx_cost = tx->static_cost;\n\tstd::vector<txin_t> exec_inputs;\n\tstd::vector<txout_t> exec_outputs;\n\tbalance_cache_t balance_cache(&balance_table);\n\tauto storage_cache = std::make_shared<vm::StorageCache>(context->storage);\n\tstd::unordered_map<addr_t, uint128> amounts;\n\tstd::map<std::pair<addr_t, addr_t>, uint128> deposit_map;\n\tstd::map<std::pair<addr_t, addr_t>, uint128> exec_spend_map;\n\tstd::exception_ptr failed_ex;\n\texec_error_t error;\n\n\tif(static_fee > tx->max_fee_amount) {\n\t\tthrow mmx::static_failure(\"static transaction fee > max_fee_amount: \"\n\t\t\t\t+ std::to_string(static_fee) + \" > \" + std::to_string(tx->max_fee_amount));\n\t}\n\tif(!tx->sender) {\n\t\tthrow mmx::static_failure(\"missing transaction sender\");\n\t}\n\tif(tx->solutions.empty()) {\n\t\tthrow mmx::static_failure(\"missing sender signature\");\n\t}\n\t{\n\t\t// validate tx sender\n\t\tauto pubkey = contract::PubKey::create();\n\t\tpubkey->address = *tx->sender;\n\t\tpubkey->validate(tx->solutions[0], tx->id);\n\t}\n\n\tconst auto balance = balance_cache.find(*tx->sender, addr_t());\n\tif(!balance || static_fee > *balance) {\n\t\terror.code = error_code_e::INSUFFICIENT_FUNDS_TXFEE;\n\t\tthrow mmx::static_failure(\"insufficient funds for transaction fee: \"\n\t\t\t\t+ std::to_string(static_fee) + \" > \" + (balance ? balance->str(10) : \"0\"));\n\t}\n\t*balance -= static_fee;\n\n\ttry {\n\t\tif(tx->expires < context->height) {\n\t\t\terror.code = error_code_e::TX_EXPIRED;\n\t\t\tthrow std::logic_error(\"transaction expired at height \" + std::to_string(tx->expires));\n\t\t}\n\t\terror.address = 0;\n\n\t\tfor(const auto& in : tx->inputs)\n\t\t{\n\t\t\tconst auto balance = balance_cache.find(in.address, in.contract);\n\t\t\tif(!balance || in.amount > *balance) {\n\t\t\t\terror.code = error_code_e::INSUFFICIENT_FUNDS;\n\t\t\t\tthrow std::logic_error(\"insufficient funds for \" + in.address.to_string());\n\t\t\t}\n\t\t\tconst auto solution = tx->get_solution(in.solution);\n\t\t\tif(!solution) {\n\t\t\t\tthrow mmx::invalid_solution(\"missing solution\");\n\t\t\t}\n\t\t\tstd::shared_ptr<const Contract> contract;\n\n\t\t\tif(in.flags & txin_t::IS_EXEC) {\n\t\t\t\tcontract = get_contract_ex(in.address, &tx_cost, gas_limit);\n\t\t\t} else {\n\t\t\t\tauto pubkey = contract::PubKey::create();\n\t\t\t\tpubkey->address = in.address;\n\t\t\t\tcontract = pubkey;\n\t\t\t}\n\t\t\tif(!contract) {\n\t\t\t\tthrow std::logic_error(\"no such contract: \" + in.address.to_string());\n\t\t\t}\n\t\t\tcontract->validate(solution, tx->id);\n\n\t\t\t*balance -= in.amount;\n\t\t\tamounts[in.contract] += in.amount;\n\t\t\terror.address++;\n\t\t}\n\t\terror.address = 0;\n\n\t\tfor(const auto& out : tx->outputs)\n\t\t{\n\t\t\tif(out.amount == 0) {\n\t\t\t\tthrow std::logic_error(\"zero amount output\");\n\t\t\t}\n\t\t\tauto& value = amounts[out.contract];\n\t\t\tif(out.amount > value) {\n\t\t\t\tthrow std::logic_error(\"transaction over-spend\");\n\t\t\t}\n\t\t\tvalue -= out.amount;\n\t\t\terror.address++;\n\t\t}\n\t\terror.address = -1;\n\n\t\tif(tx->deploy)\n\t\t{\n\t\t\tif(!tx->deploy->is_valid()) {\n\t\t\t\terror.code = error_code_e::INVALID_CONTRACT;\n\t\t\t\tthrow std::logic_error(\"invalid contract\");\n\t\t\t}\n\n\t\t\tif(auto exec = std::dynamic_pointer_cast<const contract::Executable>(tx->deploy))\n\t\t\t{\n\t\t\t\t// make sure all dependencies exist (prevent limit bypass)\n\t\t\t\tfor(const auto& entry : exec->depends) {\n\t\t\t\t\tif(!tx_index.count(entry.second)) {\n\t\t\t\t\t\terror.code = error_code_e::INVALID_CONTRACT;\n\t\t\t\t\t\tthrow std::logic_error(\"missing dependency: \" + entry.first);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tauto op = operation::Execute::create();\n\t\t\t\top->method = exec->init_method;\n\t\t\t\top->args = exec->init_args;\n\t\t\t\texecute(tx, context, op, exec, tx->id, exec_outputs, exec_spend_map, storage_cache, tx_cost, error, true);\n\t\t\t}\n\t\t}\n\t\terror.operation = 0;\n\n\t\tfor(const auto& op : tx->get_operations())\n\t\t{\n\t\t\tif(!op || !op->is_valid()) {\n\t\t\t\terror.code = error_code_e::INVALID_OPERATION;\n\t\t\t\tthrow std::logic_error(\"invalid operation\");\n\t\t\t}\n\t\t\tconst auto address = (op->address == addr_t() ? addr_t(tx->id) : op->address);\n\t\t\tconst auto contract = (address == tx->id ? tx->deploy : get_contract_ex(address, &tx_cost, gas_limit));\n\t\t\tif(!contract) {\n\t\t\t\tthrow std::logic_error(\"no such contract: \" + address.to_string());\n\t\t\t}\n\n\t\t\tif(auto deposit = std::dynamic_pointer_cast<const operation::Deposit>(op))\n\t\t\t{\n\t\t\t\tauto& value = amounts[deposit->currency];\n\t\t\t\tif(deposit->amount > value) {\n\t\t\t\t\tthrow std::logic_error(\"deposit over-spend\");\n\t\t\t\t}\n\t\t\t\tvalue -= deposit->amount;\n\n\t\t\t\tdeposit_map[std::make_pair(address, deposit->currency)] += deposit->amount;\n\t\t\t}\n\t\t\tif(auto exec = std::dynamic_pointer_cast<const operation::Execute>(op))\n\t\t\t{\n\t\t\t\tconst auto solution = tx->get_solution(op->solution);\n\t\t\t\texecute(tx, context, exec, contract, address, exec_outputs, exec_spend_map, storage_cache, tx_cost, error, false);\n\t\t\t}\n\t\t\terror.operation++;\n\t\t}\n\t\terror.operation = -1;\n\n\t\t// create exec inputs\n\t\tfor(const auto& entry : exec_spend_map) {\n\t\t\tauto amount_left = entry.second;\n\t\t\t{\n\t\t\t\t// use deposit amounts first\n\t\t\t\tauto& deposit = deposit_map[entry.first];\n\t\t\t\tconst auto amount = std::min(deposit, amount_left);\n\t\t\t\tdeposit -= amount;\n\t\t\t\tamount_left -= amount;\n\t\t\t}\n\t\t\tif(amount_left) {\n\t\t\t\ttxin_t in;\n\t\t\t\tin.address = entry.first.first;\n\t\t\t\tin.contract = entry.first.second;\n\t\t\t\tin.amount = amount_left;\n\t\t\t\texec_inputs.push_back(in);\n\t\t\t}\n\t\t}\n\n\t\t// create deposit outputs\n\t\tfor(const auto& entry : deposit_map) {\n\t\t\tif(const auto& amount = entry.second) {\n\t\t\t\ttxout_t out;\n\t\t\t\tout.address = entry.first.first;\n\t\t\t\tout.contract = entry.first.second;\n\t\t\t\tout.amount = amount;\n\t\t\t\texec_outputs.push_back(out);\n\t\t\t}\n\t\t}\n\n\t\t// check for left-over amounts\n\t\tfor(const auto& entry : amounts) {\n\t\t\tif(entry.second) {\n\t\t\t\tif(!tx->deploy) {\n\t\t\t\t\tthrow std::logic_error(\"implicit deposit without deploy\");\n\t\t\t\t}\n\t\t\t\tif(const auto& amount = entry.second) {\n\t\t\t\t\ttxout_t out;\n\t\t\t\t\tout.address = tx->id;\n\t\t\t\t\tout.contract = entry.first;\n\t\t\t\t\tout.amount = amount;\n\t\t\t\t\texec_outputs.push_back(out);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(!tx->exec_result) {\n\t\t\tfor(const auto& in: exec_inputs) {\n\t\t\t\ttx_cost += in.calc_cost(params);\n\t\t\t}\n\t\t\tfor(const auto& out: exec_outputs) {\n\t\t\t\ttx_cost += out.calc_cost(params);\n\t\t\t}\n\t\t}\n\t\tif(tx_cost > params->max_tx_cost) {\n\t\t\tthrow mmx::static_failure(\"transaction cost > max_tx_cost\");\n\t\t}\n\t\tif(tx_cost >> 32) {\n\t\t\tthrow mmx::static_failure(\"transaction cost >= 2^32\");\n\t\t}\n\t} catch(const mmx::static_failure& ex) {\n\t\tthrow;\n\t} catch(...) {\n\t\tfailed_ex = std::current_exception();\n\t}\n\tuint64_t tx_fee = 0;\n\n\ttry {\n\t\tconst auto total_fee = cost_to_fee<mmx::static_failure>(tx_cost, tx->fee_ratio);\n\n\t\ttx_fee = std::min<uint64_t>(total_fee, tx->max_fee_amount);\n\n\t\tconst auto dynamic_fee = tx_fee - static_fee;\n\t\tconst auto balance = balance_cache.find(*tx->sender, addr_t());\n\t\tif(!balance || dynamic_fee > *balance) {\n\t\t\terror.code = error_code_e::INSUFFICIENT_FUNDS_TXFEE;\n\t\t\tthrow mmx::static_failure(\"insufficient funds for transaction fee: \"\n\t\t\t\t\t+ std::to_string(dynamic_fee) + \" > \" + (balance ? balance->str(10) : \"0\"));\n\t\t}\n\t\t*balance -= dynamic_fee;\n\n\t\tif(total_fee > tx->max_fee_amount && !failed_ex) {\n\t\t\terror.code = error_code_e::TXFEE_OVERRUN;\n\t\t\tthrow std::logic_error(\"transaction fee > max_fee_amount: \" + std::to_string(total_fee) + \" > \" + std::to_string(tx->max_fee_amount));\n\t\t}\n\t} catch(const mmx::static_failure& ex) {\n\t\tthrow;\n\t} catch(...) {\n\t\tfailed_ex = std::current_exception();\n\t}\n\tstd::shared_ptr<exec_result_t> out;\n\n\tif(auto result = tx->exec_result) {\n\t\tif(!result->did_fail && failed_ex) {\n\t\t\ttry {\n\t\t\t\tstd::rethrow_exception(failed_ex);\n\t\t\t} catch(const std::exception& ex) {\n\t\t\t\tthrow std::logic_error(\"unexpected execution failure: \" + std::string(ex.what()));\n\t\t\t} catch(...) {\n\t\t\t\tthrow std::logic_error(\"unexpected execution failure\");\n\t\t\t}\n\t\t}\n\t\tif(result->did_fail && !failed_ex) {\n\t\t\tif(result->error) {\n\t\t\t\tthrow std::logic_error(\"expected execution failure: \" + result->error->message);\n\t\t\t} else {\n\t\t\t\tthrow std::logic_error(\"expected execution failure\");\n\t\t\t}\n\t\t}\n\t\tif(result->total_cost != tx_cost) {\n\t\t\tthrow std::logic_error(\"transaction cost mismatch: \"\n\t\t\t\t\t+ std::to_string(result->total_cost) + \" != \" + std::to_string(tx_cost));\n\t\t}\n\t\tif(result->total_fee != tx_fee) {\n\t\t\tthrow std::logic_error(\"transaction fee mismatch: \"\n\t\t\t\t\t+ std::to_string(result->total_fee) + \" != \" + std::to_string(tx_fee));\n\t\t}\n\t\tif(result->did_fail) {\n\t\t\tif(result->inputs.size() || result->outputs.size()) {\n\t\t\t\tthrow std::logic_error(\"failed transaction cannot have execution inputs / outputs\");\n\t\t\t}\n\t\t} else {\n\t\t\tif(result->inputs.size() != exec_inputs.size()) {\n\t\t\t\tthrow std::logic_error(\"execution input count mismatch: \"\n\t\t\t\t\t\t+ std::to_string(result->inputs.size()) + \" != \" + std::to_string(exec_inputs.size()));\n\t\t\t}\n\t\t\tif(result->outputs.size() != exec_outputs.size()) {\n\t\t\t\tthrow std::logic_error(\"execution output count mismatch: \"\n\t\t\t\t\t\t+ std::to_string(result->outputs.size()) + \" != \" + std::to_string(exec_outputs.size()));\n\t\t\t}\n\t\t\tfor(size_t i = 0; i < exec_inputs.size(); ++i) {\n\t\t\t\tconst auto& lhs = exec_inputs[i];\n\t\t\t\tconst auto& rhs = result->inputs[i];\n\t\t\t\tif(lhs.contract != rhs.contract || lhs.address != rhs.address || lhs.amount != rhs.amount || lhs.memo != rhs.memo || lhs.flags != rhs.flags) {\n\t\t\t\t\tthrow std::logic_error(\"execution input mismatch at index \" + std::to_string(i));\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(size_t i = 0; i < exec_outputs.size(); ++i) {\n\t\t\t\tconst auto& lhs = exec_outputs[i];\n\t\t\t\tconst auto& rhs = result->outputs[i];\n\t\t\t\tif(lhs.contract != rhs.contract || lhs.address != rhs.address || lhs.amount != rhs.amount || lhs.memo != rhs.memo) {\n\t\t\t\t\tthrow std::logic_error(\"execution output mismatch at index \" + std::to_string(i));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(result->error) {\n\t\t\tif(result->error->code != error.code) {\n\t\t\t\tthrow std::logic_error(\"error code mismatch\");\n\t\t\t}\n\t\t\tif(result->error->address != error.address) {\n\t\t\t\tthrow std::logic_error(\"error address mismatch\");\n\t\t\t}\n\t\t\tif(result->error->operation != error.operation) {\n\t\t\t\tthrow std::logic_error(\"error operation mismatch\");\n\t\t\t}\n\t\t\t// Note: error line and message are not enforced by consensus\n\t\t\t// Note: message length already checked in is_valid()\n\t\t} else if(result->did_fail) {\n\t\t\tthrow std::logic_error(\"missing error information\");\n\t\t}\n\t} else {\n\t\tout = std::make_shared<exec_result_t>();\n\t\tout->total_cost = tx_cost;\n\t\tout->total_fee = tx_fee;\n\n\t\tif(failed_ex) {\n\t\t\ttry {\n\t\t\t\tstd::rethrow_exception(failed_ex);\n\t\t\t} catch(const std::exception& ex) {\n\t\t\t\tstd::string msg = ex.what();\n\t\t\t\tmsg.resize(std::min<size_t>(msg.size(), exec_error_t::MAX_MESSAGE_LENGTH));\n\t\t\t\terror.message = msg;\n\t\t\t}\n\t\t\tout->error = error;\n\t\t\tout->did_fail = true;\n\t\t} else {\n\t\t\tout->inputs = exec_inputs;\n\t\t\tout->outputs = exec_outputs;\n\t\t}\n\t}\n\n\tif(!failed_ex) {\n\t\tstorage_cache->commit();\n\t}\n\treturn out;\n}\n\nvoid Node::validate_diff_adjust(const uint64_t& block, const uint64_t& prev) const\n{\n\tconst auto max_update = std::max<uint64_t>(prev >> params->max_diff_adjust, 1);\n\tif(block > prev && block - prev > max_update) {\n\t\tthrow std::logic_error(\"invalid difficulty adjustment upwards\");\n\t}\n\tif(prev > block && prev - block > max_update) {\n\t\tthrow std::logic_error(\"invalid difficulty adjustment downwards\");\n\t}\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Node_verify.cpp",
    "content": "/*\n * Node_verify.cpp\n *\n *  Created on: Jan 20, 2022\n *      Author: mad\n */\n\n#include <mmx/Node.h>\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/ProofOfSpaceNFT.hxx>\n#include <mmx/pos/verify.h>\n#include <mmx/utils.h>\n\n#include <vnx/vnx.h>\n#include <sha256_avx2.h>\n#include <sha256_ni.h>\n#include <sha256_arm.h>\n\n\nnamespace mmx {\n\nvoid Node::add_proof(std::shared_ptr<const ProofOfSpace> proof, const uint32_t vdf_height, const vnx::Hash64 farmer_mac)\n{\n\tauto& list = proof_map[proof->challenge];\n\n\tconst auto hash = proof->calc_proof_hash();\n\tfor(const auto& entry : list) {\n\t\tif(hash == entry.hash) {\n\t\t\treturn;\t\t// prevent replay attack\n\t\t}\n\t}\n\tif(list.empty()) {\n\t\tchallenge_map.emplace(vdf_height, proof->challenge);\n\t}\n\tif(vnx::get_pipe(farmer_mac)) {\n\t\tfarmer_keys[proof->farmer_key] = farmer_mac;\n\t}\n\tproof_data_t data;\n\tdata.hash = hash;\n\tdata.proof = proof;\n\tdata.farmer_mac = farmer_mac;\n\tlist.push_back(data);\n\n\tstd::sort(list.begin(), list.end(),\n\t\t[](const proof_data_t& L, const proof_data_t& R) -> bool {\n\t\t\treturn L.hash < R.hash;\n\t\t});\n}\n\nvoid Node::verify(std::shared_ptr<const ProofResponse> value) const\n{\n\tif(!value->is_valid()) {\n\t\tthrow std::logic_error(\"invalid response\");\n\t}\n\tvalue->validate();\n\n\tif(auto root = get_root()) {\n\t\tif(value->vdf_height <= root->vdf_height) {\n\t\t\tthrow std::logic_error(\"proof too old\");\n\t\t}\n\t}\n\thash_t challenge;\n\tuint64_t space_diff = 0;\n\tif(!find_challenge(value->vdf_height, challenge, space_diff)) {\n\t\tthrow std::logic_error(\"cannot find challenge\");\n\t}\n\tverify_proof(value->proof, challenge, space_diff, value->vdf_height);\n\n\tpublish(value, output_verified_proof);\n}\n\nvoid Node::verify_proof(std::shared_ptr<const BlockHeader> block) const\n{\n\t// NOTE: NEEDS TO BE THREAD SAFE\n\tconst auto prev = find_prev(block);\n\tif(!prev) {\n\t\tthrow std::logic_error(\"cannot verify\");\n\t}\n\tif(block->vdf_count > params->max_vdf_count) {\n\t\tthrow std::logic_error(\"invalid vdf_count\");\n\t}\n\tif(block->vdf_height != prev->vdf_height + block->vdf_count) {\n\t\tthrow std::logic_error(\"invalid vdf_height\");\n\t}\n\tconst auto proof_count = block->proof.size();\n\n\tif(proof_count == 0) {\n\t\tthrow std::logic_error(\"missing proof\");\n\t}\n\tif(proof_count > params->max_proof_count) {\n\t\tthrow std::logic_error(\"too many proofs\");\n\t}\n\t{\n\t\thash_t prev;\n\t\tstd::set<hash_t> set;\n\t\tfor(auto proof : block->proof) {\n\t\t\tconst auto hash = proof->calc_proof_hash();\n\t\t\tif(hash < prev) {\n\t\t\t\tthrow std::logic_error(\"invalid proof order\");\n\t\t\t}\n\t\t\tif(set.empty() && block->proof_hash != hash) {\n\t\t\t\tthrow std::logic_error(\"invalid proof_hash\");\n\t\t\t}\n\t\t\tif(!set.insert(hash).second) {\n\t\t\t\tthrow std::logic_error(\"duplicate proof\");\n\t\t\t}\n\t\t\tprev = hash;\n\t\t}\n\t}\n\n\tuint64_t expected_iters = prev->vdf_iters;\n\tfor(uint32_t i = 0; i < block->vdf_count; ++i) {\n\t\tuint64_t num_iters = 0;\n\t\tget_infusion(prev, i, num_iters);\n\t\texpected_iters += num_iters;\n\t}\n\tif(block->vdf_iters != expected_iters) {\n\t\tthrow std::logic_error(\"invalid vdf_iters: \" + std::to_string(block->vdf_iters) + \" != \" + std::to_string(expected_iters));\n\t}\n\tif(block->time_diff < params->time_diff_divider) {\n\t\tthrow std::logic_error(\"time_diff too low\");\n\t}\n\tvalidate_diff_adjust(block->time_diff, prev->time_diff);\t// need to check here to avoid VDF verify attack\n\n\t// need to verify challenge and space_diff update here\n\tbool is_space_fork = false;\n\tconst auto next_challenge = calc_next_challenge(params, prev->challenge, block->vdf_count, block->proof_hash, is_space_fork);\n\tif(block->challenge != next_challenge) {\n\t\tthrow std::logic_error(\"invalid challenge\");\n\t}\n\tif(block->is_space_fork != is_space_fork) {\n\t\tthrow std::logic_error(\"invalid is_space_fork\");\n\t}\n\n\tif(is_space_fork) {\n\t\tconst auto space_diff = calc_new_space_diff(params, prev);\n\t\tif(block->space_diff != space_diff) {\n\t\t\tthrow std::logic_error(\"invalid space_diff: \" + std::to_string(block->space_diff) + \" != \" + std::to_string(space_diff));\n\t\t}\n\t\tif(block->space_fork_len != block->vdf_count) {\n\t\t\tthrow std::logic_error(\"invalid space_fork_len at space fork\");\n\t\t}\n\t\tif(block->space_fork_proofs != proof_count) {\n\t\t\tthrow std::logic_error(\"invalid space_fork_proofs at space fork\");\n\t\t}\n\t} else {\n\t\tif(block->space_diff != prev->space_diff) {\n\t\t\tthrow std::logic_error(\"invalid space_diff change\");\n\t\t}\n\t\tif(block->space_fork_len != prev->space_fork_len + block->vdf_count) {\n\t\t\tthrow std::logic_error(\"invalid space_fork_len\");\n\t\t}\n\t\tif(block->space_fork_proofs != prev->space_fork_proofs + proof_count) {\n\t\t\tthrow std::logic_error(\"invalid space_fork_proofs\");\n\t\t}\n\t}\n\n\tconst auto weight = calc_block_weight(params, block, prev);\n\tconst auto total_weight = prev->total_weight + block->weight;\n\tif(block->weight != weight) {\n\t\tthrow std::logic_error(\"invalid block weight: \" + block->weight.str(10) + \" != \" + weight.str(10));\n\t}\n\tif(block->total_weight != total_weight) {\n\t\tthrow std::logic_error(\"invalid total weight: \" + block->total_weight.str(10) + \" != \" + total_weight.str(10));\n\t}\n\n\tuint64_t space_diff = 0;\n\tconst auto challenge = get_challenge(block, 0, space_diff);\n\n\tfor(auto proof : block->proof) {\n\t\tverify_proof(proof, challenge, space_diff, block->vdf_height);\n\t}\n}\n\ntemplate<typename T>\nvoid Node::verify_proof_impl(\n\t\tstd::shared_ptr<const T> proof, const hash_t& challenge, const uint64_t space_diff, const uint32_t& vdf_height) const\n{\n\tif(proof->ksize < params->min_ksize) {\n\t\tthrow std::logic_error(\"ksize too low\");\n\t}\n\tif(proof->ksize > params->max_ksize) {\n\t\tthrow std::logic_error(\"ksize too high\");\n\t}\n\tconst bool hard_fork = vdf_height >= params->hardfork1_height;\n\tconst auto plot_challenge = get_plot_challenge(challenge, proof->plot_id);\n\n\tconst auto quality = pos::verify(\n\t\t\tproof->proof_xs, plot_challenge, proof->plot_id,\n\t\t\tparams->plot_filter, params->post_filter, proof->ksize, hard_fork);\n\n\tif(!check_proof_threshold(params, proof->ksize, quality, space_diff, hard_fork)) {\n\t\tthrow std::logic_error(\"not good enough\");\n\t}\n}\n\nvoid Node::verify_proof(std::shared_ptr<const ProofOfSpace> proof, const hash_t& challenge, const uint64_t space_diff, const uint32_t& vdf_height) const\n{\n\tif(space_diff <= 0) {\n\t\tthrow std::logic_error(\"difficulty zero\");\n\t}\n\tif(!proof || !proof->is_valid()) {\n\t\tthrow std::logic_error(\"invalid proof\");\n\t}\n\tif(proof->challenge != challenge) {\n\t\tthrow std::logic_error(\"invalid challenge\");\n\t}\n\tif(proof->difficulty != space_diff) {\n\t\tthrow std::logic_error(\"invalid difficulty\");\n\t}\n\tproof->validate();\n\n\tif(!check_plot_filter(params, challenge, proof->plot_id)) {\n\t\tthrow std::logic_error(\"plot filter failed\");\n\t}\n\tconst auto og_proof = std::dynamic_pointer_cast<const ProofOfSpaceOG>(proof);\n\tconst auto nft_proof = std::dynamic_pointer_cast<const ProofOfSpaceNFT>(proof);\n\n\tif(og_proof) {\n\t\tverify_proof_impl(og_proof, challenge, space_diff, vdf_height);\n\t} else if(nft_proof) {\n\t\tverify_proof_impl(nft_proof, challenge, space_diff, vdf_height);\n\t} else {\n\t\tthrow std::logic_error(\"invalid proof type: \" + proof->get_type_name());\n\t}\n\tconst auto score = get_proof_score(proof->calc_proof_hash());\n\tif(score != proof->score) {\n\t\tthrow std::logic_error(\"proof score mismatch: expected \" + std::to_string(proof->score) + \" but got \" + std::to_string(score));\n\t}\n}\n\nvoid Node::verify_vdf(std::shared_ptr<const ProofOfTime> proof, const int64_t recv_time)\n{\n\tif(!proof->is_valid()) {\n\t\tthrow std::logic_error(\"static validation failed\");\n\t}\n\tproof->validate();\n\n\tconst auto prev = get_header(proof->prev);\n\tif(!prev) {\n\t\tthrow std::logic_error(\"could not find infused block\");\n\t}\n\tconst auto num_iters = get_block_iters(params, get_time_diff(prev));\n\n\tif(proof->num_iters != num_iters) {\n\t\tthrow std::logic_error(\"invalid num_iters: \" + std::to_string(proof->num_iters));\n\t}\n\tif(proof->segment_size != params->vdf_segment_size) {\n\t\tthrow std::logic_error(\"invalid segment size: \" + std::to_string(proof->segment_size));\n\t}\n\tif(proof->segments.size() * proof->segment_size != num_iters) {\n\t\tthrow std::logic_error(\"invalid segment count: \" + std::to_string(proof->segments.size()));\n\t}\n\tvdf_threads->add_task(std::bind(&Node::verify_vdf_task, this, proof, recv_time));\n\tvdf_verify_pending.insert(proof->hash);\n\ttimelord_trust[proof->timelord_key]--;\n}\n\nvoid Node::verify_vdf_cpu(std::shared_ptr<const ProofOfTime> proof) const\n{\n\tstatic bool have_sha_ni = sha256_ni_available();\n\tstatic bool have_sha_arm = sha256_arm_available();\n\n\tconst auto& segments = proof->segments;\n\tbool is_valid = !segments.empty();\n\tsize_t invalid_segment = -1;\n\n\tconstexpr uint32_t batch_size = 16;\n\tconst uint32_t num_iters = proof->segment_size;\n\tconst uint32_t num_chunks = (segments.size() + batch_size - 1) / batch_size;\n\n#pragma omp parallel for\n\tfor(int chunk = 0; chunk < int(num_chunks); ++chunk)\n\t{\n\t\tif(!is_valid) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst auto num_lanes = std::min<uint32_t>(batch_size, segments.size() - chunk * batch_size);\n\n\t\thash_t point[batch_size];\n\t\tuint8_t hash[batch_size][32];\n\t\tuint8_t input[batch_size][64];\n\n\t\tfor(uint32_t j = 0; j < num_lanes; ++j)\n\t\t{\n\t\t\tconst uint32_t i = chunk * batch_size + j;\n\t\t\tif(i > 0) {\n\t\t\t\tpoint[j] = segments[i - 1];\n\t\t\t} else {\n\t\t\t\tpoint[j] = hash_t(proof->input + proof->prev);\n\t\t\t\tpoint[j] = hash_t(point[j] + proof->reward_addr);\n\t\t\t}\n\t\t}\n\t\tif(have_sha_ni || have_sha_arm) {\n\t\t\t// Note: `num_lanes` is always a multiple of 2 (based on chain params)\n\t\t\tfor(uint32_t j = 0; j < num_lanes; j += 2)\n\t\t\t{\n\t\t\t\tuint8_t hashx2[32 * 2];\n\t\t\t\t::memcpy(hashx2, point[j].data(), 32);\n\t\t\t\t::memcpy(hashx2 + 32, point[j + 1].data(), 32);\n\t\t\t\tif(have_sha_ni) {\n\t\t\t\t\trecursive_sha256_ni_x2(hashx2, num_iters);\n\t\t\t\t} else if(have_sha_arm) {\n\t\t\t\t\trecursive_sha256_arm_x2(hashx2, num_iters);\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"invalid feature state\");\n\t\t\t\t}\n\t\t\t\t::memcpy(point[j].data(), hashx2, 32);\n\t\t\t\t::memcpy(point[j + 1].data(), hashx2 + 32, 32);\n\t\t\t}\n\t\t} else {\n\t\t\tfor(uint32_t k = 0; k < num_iters; ++k)\n\t\t\t{\n\t\t\t\tfor(uint32_t j = 0; j < num_lanes; ++j) {\n\t\t\t\t\t::memcpy(input[j], point[j].data(), 32);\n\t\t\t\t}\n\t\t\t\tsha256_64_x8(hash[0], input[0], 32);\n\t\t\t\tsha256_64_x8(hash[8], input[8], 32);\n\n\t\t\t\tfor(uint32_t j = 0; j < num_lanes; ++j) {\n\t\t\t\t\t::memcpy(point[j].data(), hash[j], 32);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor(uint32_t j = 0; j < num_lanes; ++j)\n\t\t{\n\t\t\tconst uint32_t i = chunk * batch_size + j;\n\t\t\tif(point[j] != segments[i]) {\n\t\t\t\tis_valid = false;\n\t\t\t\tinvalid_segment = i;\n\t\t\t}\n\t\t}\n\t}\n\tif(!is_valid) {\n\t\tthrow std::logic_error(\"invalid output on segment \" + std::to_string(invalid_segment));\n\t}\n}\n\nvoid Node::verify_vdf_success(std::shared_ptr<const VDF_Point> point, const int64_t took_ms)\n{\n\tconst auto peak = get_peak();\n\tconst auto proof = point->proof;\n\tconst auto chain = find_next_vdf_points(peak);\n\n\tbool is_advance = false;\n\tif(chain.empty()) {\n\t\tis_advance = point->input == peak->vdf_output;\n\t} else {\n\t\tconst auto prev = chain.back();\n\t\tis_advance = point->input == prev->output;\n\t}\n\n\tif(is_advance) {\n\t\tif(chain.size() >= params->max_vdf_count) {\n\t\t\tlog(WARN) << \"VDF chain reached maximum length, discarded VDF for height \" << point->vdf_height;\n\t\t\treturn;\n\t\t}\n\t\tif(is_synced) {\n\t\t\tlog(INFO) << \"-------------------------------------------------------------------------------\";\n\t\t}\n\t\tstuck_timer->reset();\t// make sure we keep sync status\n\t\ttimelord_trust[proof->timelord_key] += 2;\n\n\t\tpublish(proof, output_verified_vdfs);\n\t}\n\tconst auto vdf_iters = point->start + point->num_iters;\n\n\tvdf_tree.emplace(point->output, point);\n\tvdf_index.emplace(vdf_iters, point);\n\tvdf_verify_pending.erase(proof->hash);\n\n\tpublish(point, output_vdf_points);\n\n\tif(took_ms > params->block_interval_ms) {\n\t\tlog(WARN) << \"VDF verification took longer than block interval, unable to keep sync!\";\n\t} else if(took_ms > params->block_interval_ms / 2) {\n\t\tlog(WARN) << \"VDF verification took longer than recommended: \" << took_ms / 1e3 << \" sec\";\n\t}\n\n\tstd::shared_ptr<const VDF_Point> prev;\n\t{\n\t\tconst auto iter = vdf_tree.find(point->input);\n\t\tif(iter != vdf_tree.end()) {\n\t\t\tprev = iter->second;\n\t\t}\n\t}\n\tstd::stringstream ss_delta;\n\tif(prev) {\n\t\tss_delta << \", delta = \" << (point->recv_time - prev->recv_time) / 1e3 << \" sec\" ;\n\t}\n\tconst char* clocks[] = {\n\t\t\tu8\"\\U0001F550\", u8\"\\U0001F551\", u8\"\\U0001F552\", u8\"\\U0001F553\", u8\"\\U0001F554\", u8\"\\U0001F555\",\n\t\t\tu8\"\\U0001F556\", u8\"\\U0001F557\", u8\"\\U0001F558\", u8\"\\U0001F559\", u8\"\\U0001F55A\", u8\"\\U0001F55B\" };\n\n\tlog(INFO) << clocks[point->vdf_height % 12] << \" Verified VDF for height \"\n\t\t\t<< point->vdf_height << ss_delta.str() << \", took \" << took_ms / 1e3 << \" sec\";\n\n\ttrigger_update();\n}\n\nvoid Node::verify_vdf_task(std::shared_ptr<const ProofOfTime> proof, const int64_t recv_time) noexcept\n{\n\tstd::shared_ptr<OCL_VDF> engine;\n\ttry {\n\t\tif(opencl_vdf_enable) {\n\t\t\tstd::unique_lock lock(vdf_mutex);\n\t\t\twhile(opencl_vdf.empty()) {\n\t\t\t\tvdf_signal.wait(lock);\n\t\t\t}\n\t\t\tengine = opencl_vdf.back();\n\t\t\topencl_vdf.pop_back();\n\t\t}\n\t\tconst auto begin = get_time_ms();\n\n\t\tif(engine) {\n\t\t\tengine->compute(proof);\n\t\t\tengine->verify(proof);\n\t\t} else {\n\t\t\tverify_vdf_cpu(proof);\n\t\t}\n\t\tconst auto took_ms = get_time_ms() - begin;\n\n\t\tauto point = VDF_Point::create();\n\t\tpoint->vdf_height = proof->vdf_height;\n\t\tpoint->start = proof->start;\n\t\tpoint->num_iters = proof->num_iters;\n\t\tpoint->input = proof->input;\n\t\tpoint->output = proof->get_output();\n\t\tpoint->prev = proof->prev;\n\t\tpoint->reward_addr = proof->reward_addr;\n\t\tpoint->recv_time = recv_time;\n\t\tpoint->proof = proof;\n\t\tpoint->content_hash = point->calc_hash();\n\n\t\tadd_task(std::bind(&Node::verify_vdf_success, this, point, took_ms));\n\t}\n\tcatch(const std::exception& ex) {\n\t\tadd_task([this, proof]() {\n\t\t\tauto& trust = timelord_trust[proof->timelord_key];\n\t\t\ttrust = std::min<int64_t>(trust, 0) - 100;\n\t\t\tvdf_verify_pending.erase(proof->hash);\n\t\t\ttrigger_update();\n\t\t});\n\t\tlog(WARN) << \"VDF verification for height \" << proof->vdf_height << \" failed with: \" << ex.what();\n\t}\n\n\tif(engine) {\n\t\tstd::unique_lock lock(vdf_mutex);\n\t\topencl_vdf.push_back(engine);\n\t}\n\tvdf_signal.notify_all();\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/OCL_VDF.cpp",
    "content": "/*\n * OCL_VDF.cpp\n *\n *  Created on: Dec 23, 2021\n *      Author: mad\n */\n\n#include <mmx/OCL_VDF.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\n#ifdef WITH_OPENCL\n\nstd::mutex OCL_VDF::g_mutex;\nstd::shared_ptr<OCL_VDF::Program> OCL_VDF::g_program;\n\n\nOCL_VDF::OCL_VDF(cl_context context, cl_device_id device)\n\t:\tcontext(context)\n{\n\tstd::lock_guard<std::mutex> lock(g_mutex);\n\n\tif(!g_program) {\n\t\tstd::string kernel_path = \"kernel/\";\n\t\tvnx::read_config(\"opencl.kernel_path\", kernel_path);\n\n\t\tauto program = Program::create(context);\n\t\tprogram->add_include_path(kernel_path);\n\t\tprogram->add_source(\"sha256.cl\");\n\t\tprogram->add_source(\"rsha256.cl\");\n\t\tprogram->create_from_source();\n\t\tif(!program->build({device})) {\n\t\t\tstd::string text;\n\t\t\tfor(const auto& line : program->build_log) {\n\t\t\t\ttext += line + \"\\n\";\n\t\t\t}\n\t\t\tvnx::log_error() << \"OCL_VDF: build failed with:\" << std::endl << text;\n\t\t\tthrow std::runtime_error(\"build failed\");\n\t\t}\n\t\tg_program = program;\n\t}\n\tkernel = g_program->create_kernel(\"rsha256_kernel\");\n\n\tif(!kernel) {\n\t\tthrow std::runtime_error(\"rsha256 missing\");\n\t}\n\tqueue = automy::basic_opencl::create_command_queue(context, device);\n}\n\nvoid OCL_VDF::compute(std::shared_ptr<const ProofOfTime> proof)\n{\n\tconst size_t local = 64;\n\tconst size_t width = proof->segments.size() + (local - (proof->segments.size() % local)) % local;\n\tif(!width) {\n\t\tthrow std::logic_error(\"no segments\");\n\t}\n\thash.resize(width * 32);\n\t{\n\t\tauto input = proof->input;\n\t\tinput = hash_t(input + proof->prev);\n\t\tinput = hash_t(input + proof->reward_addr);\n\n\t\tfor(size_t i = 0; i < proof->segments.size(); ++i)\n\t\t{\n\t\t\t::memcpy(hash.data() + i * 32, input.data(), input.size());\n\t\t\tinput = proof->segments[i];\n\t\t}\n\t}\n\n\tnum_iters.resize(width);\n\tfor(size_t i = 0; i < proof->segments.size(); ++i) {\n\t\tnum_iters[i] = proof->segment_size;\n\t}\n\n\thash_buf.alloc_min(context, width * 32);\n\tnum_iters_buf.alloc_min(context, width);\n\n\thash_buf.upload(queue, hash, false);\n\tnum_iters_buf.upload(queue, num_iters, false);\n\n\tconst uint32_t max_iters = 2500;\n\n\tkernel->set(\"hash\", hash_buf);\n\tkernel->set(\"num_iters\", num_iters_buf);\n\tkernel->set(\"max_iters\", max_iters);\n\n\tfor(uint32_t k = 0; k < proof->segment_size; k += max_iters) {\n\t\tkernel->enqueue(queue, width, local);\n\t}\n\tqueue->flush();\n}\n\nvoid OCL_VDF::verify(std::shared_ptr<const ProofOfTime> proof)\n{\n\thash_buf.download(queue, hash.data(), true);\n\n\tfor(size_t i = 0; i < proof->segments.size(); ++i)\n\t{\n\t\tif(::memcmp(hash.data() + i * 32, proof->segments[i].data(), 32)) {\n\t\t\tthrow std::logic_error(\"invalid output at segment \" + std::to_string(i));\n\t\t}\n\t}\n}\n\nvoid OCL_VDF::release()\n{\n\tstd::lock_guard<std::mutex> lock(g_mutex);\n\tg_program = nullptr;\n}\n\n#else\n\nOCL_VDF::OCL_VDF(cl_context context, cl_device_id device) {\n\tthrow std::logic_error(\"did not compile with OpenCL support\");\n}\n\nvoid OCL_VDF::compute(std::shared_ptr<const ProofOfTime> proof) {}\n\nvoid OCL_VDF::verify(std::shared_ptr<const ProofOfTime> proof) {}\n\nvoid OCL_VDF::release() {}\n\n#endif // WITH_OPENCL\n\n} // mmx\n"
  },
  {
    "path": "src/Operation.cpp",
    "content": "/*\n * Operation.cpp\n *\n *  Created on: Nov 27, 2021\n *      Author: mad\n */\n\n#include <mmx/Operation.hxx>\n#include <mmx/write_bytes.h>\n\n\nnamespace mmx {\n\nvnx::bool_t Operation::is_valid() const\n{\n\treturn version == 0;\n}\n\nhash_t Operation::calc_hash(const vnx::bool_t& full_hash) const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\nuint64_t Operation::calc_cost(std::shared_ptr<const ChainParams> params) const\n{\n\treturn 0;\n}\n\n} // mmx\n"
  },
  {
    "path": "src/Partial.cpp",
    "content": "/*\n * Partial.cpp\n *\n *  Created on: Sep 18, 2024\n *      Author: mad\n */\n\n#include <mmx/Partial.hxx>\n#include <mmx/ProofOfSpaceNFT.hxx>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nhash_t Partial::calc_hash() const\n{\n\tstd::string tmp = get_type_name() + \"/\";\n\ttmp += \"vdf_height:\" + std::to_string(vdf_height);\n\ttmp += \"contract:\" + contract.to_string();\n\ttmp += \"account:\" + account.to_string();\n\ttmp += \"pool_url:\" + pool_url;\n\ttmp += \"harvester:\" + harvester;\n\ttmp += \"lookup_time_ms:\" + std::to_string(lookup_time_ms);\n\ttmp += \"proof:\";\n\n\tif(proof) {\n\t\ttmp += proof->get_type_name() + \"/\";\n\t\ttmp += \"score:\" + std::to_string(proof->score);\n\t\ttmp += \"plot_id:\" + proof->plot_id.to_string();\n\t\ttmp += \"challenge:\" + proof->challenge.to_string();\n\t\ttmp += \"difficulty:\" + std::to_string(proof->difficulty);\n\t\ttmp += \"farmer_key:\" + proof->farmer_key.to_string();\n\t}\n\tif(auto nft = std::dynamic_pointer_cast<const ProofOfSpaceNFT>(proof))\n\t{\n\t\ttmp += \"ksize:\" + std::to_string(nft->ksize);\n\t\ttmp += \"seed:\" + nft->seed.to_string();\n\t\ttmp += \"proof_xs:\";\n\t\tfor(const auto& x : nft->proof_xs) {\n\t\t\ttmp += std::to_string(x) + \",\";\n\t\t}\n\t\ttmp += \"contract:\" + nft->contract.to_string();\n\t}\n\treturn hash_t(tmp);\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/ProofOfSpace.cpp",
    "content": "/*\n * ProofOfSpace.cpp\n *\n *  Created on: Apr 13, 2022\n *      Author: mad\n */\n\n#include <mmx/ProofOfSpace.hxx>\n#include <mmx/write_bytes.h>\n\n\nnamespace mmx {\n\nvnx::bool_t ProofOfSpace::is_valid() const\n{\n\treturn true;\n}\n\nmmx::hash_t ProofOfSpace::calc_hash() const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\nmmx::hash_t ProofOfSpace::calc_proof_hash() const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\nvoid ProofOfSpace::validate() const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/ProofOfSpaceNFT.cpp",
    "content": "/*\n * ProofOfSpaceNFT.cpp\n *\n *  Created on: Apr 13, 2022\n *      Author: mad\n */\n\n#include <mmx/ProofOfSpaceNFT.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\n\nvnx::bool_t ProofOfSpaceNFT::is_valid() const\n{\n\treturn Super::is_valid() && ksize > 0 && proof_xs.size() <= 256;\n}\n\nmmx::hash_t ProofOfSpaceNFT::calc_hash() const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\tbuffer.reserve(4 * 1024);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"score\", \t\tscore);\n\twrite_field(out, \"plot_id\", \tplot_id);\n\twrite_field(out, \"challenge\", \tchallenge);\n\twrite_field(out, \"difficulty\",\tdifficulty);\n\twrite_field(out, \"farmer_key\", \tfarmer_key);\n\twrite_field(out, \"ksize\", \t\tksize);\n\twrite_field(out, \"seed\", \t\tseed);\n\twrite_field(out, \"proof_xs\", \tproof_xs);\n\twrite_field(out, \"contract\", \tcontract);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nmmx::hash_t ProofOfSpaceNFT::calc_proof_hash() const\n{\n\treturn mmx::calc_proof_hash(challenge, proof_xs);\n}\n\nvoid ProofOfSpaceNFT::validate() const\n{\n\tconst hash_t id(std::string(\"MMX/PLOTID/NFT\") + bytes_t<1>(&ksize, 1) + seed + farmer_key + contract);\n\n\tif(id != plot_id) {\n\t\tthrow std::logic_error(\"invalid plot id\");\n\t}\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/ProofOfSpaceOG.cpp",
    "content": "/*\n * ProofOfSpaceOG.cpp\n *\n *  Created on: Nov 30, 2021\n *      Author: mad\n */\n\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\n\nvnx::bool_t ProofOfSpaceOG::is_valid() const\n{\n\treturn Super::is_valid() && ksize > 0 && proof_xs.size() <= 256;\n}\n\nmmx::hash_t ProofOfSpaceOG::calc_hash() const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\tbuffer.reserve(4 * 1024);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"score\", \t\tscore);\n\twrite_field(out, \"plot_id\", \tplot_id);\n\twrite_field(out, \"challenge\", \tchallenge);\n\twrite_field(out, \"difficulty\",\tdifficulty);\n\twrite_field(out, \"farmer_key\", \tfarmer_key);\n\twrite_field(out, \"ksize\", \t\tksize);\n\twrite_field(out, \"seed\", \t\tseed);\n\twrite_field(out, \"proof_xs\", \tproof_xs);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nmmx::hash_t ProofOfSpaceOG::calc_proof_hash() const\n{\n\treturn mmx::calc_proof_hash(challenge, proof_xs);\n}\n\nvoid ProofOfSpaceOG::validate() const\n{\n\tconst hash_t id(std::string(\"MMX/PLOTID/OG\") + bytes_t<1>(&ksize, 1) + seed + farmer_key);\n\n\tif(id != plot_id) {\n\t\tthrow std::logic_error(\"invalid plot id\");\n\t}\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/ProofOfTime.cpp",
    "content": "/*\n * ProofOfTime.cpp\n *\n *  Created on: Nov 30, 2021\n *      Author: mad\n */\n\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/write_bytes.h>\n\n\nnamespace mmx {\n\nbool ProofOfTime::is_valid() const\n{\n\treturn version == 0\n\t\t&& vdf_height\n\t\t&& num_iters\n\t\t&& segments.size()\n\t\t&& hash == calc_hash()\n\t\t&& content_hash == calc_content_hash();\n}\n\nhash_t ProofOfTime::calc_hash() const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\tbuffer.reserve(64 * 1024);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", \tversion);\n\twrite_field(out, \"vdf_height\", \tvdf_height);\n\twrite_field(out, \"start\", \t\tstart);\n\twrite_field(out, \"num_iters\", \tnum_iters);\n\twrite_field(out, \"segment_size\", segment_size);\n\twrite_field(out, \"input\", \t\tinput);\n\twrite_field(out, \"prev\", \t\tprev);\n\twrite_field(out, \"reward_addr\", reward_addr);\n\twrite_field(out, \"segments\", \tsegments);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nhash_t ProofOfTime::calc_content_hash() const\n{\n\treturn hash_t(hash + timelord_key + timelord_sig);\n}\n\nhash_t ProofOfTime::get_output() const\n{\n\tif(segments.empty()) {\n\t\treturn hash_t();\n\t}\n\treturn segments.back();\n}\n\nuint64_t ProofOfTime::get_vdf_iters() const\n{\n\treturn start + num_iters;\n}\n\nvoid ProofOfTime::validate() const\n{\n\tif(!timelord_sig.verify(timelord_key, hash)) {\n\t\tthrow std::logic_error(\"invalid timelord signature\");\n\t}\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/ProofResponse.cpp",
    "content": "/*\n * ProofResponse.cpp\n *\n *  Created on: Apr 1, 2022\n *      Author: mad\n */\n\n#include <mmx/ProofResponse.hxx>\n#include <mmx/write_bytes.h>\n\n\nnamespace mmx {\n\nbool ProofResponse::is_valid() const\n{\n\treturn proof\n\t\t\t&& proof->is_valid()\n\t\t\t&& harvester.size() < 1024\n\t\t\t&& hash == calc_hash()\n\t\t\t&& content_hash == calc_content_hash();\n}\n\nhash_t ProofResponse::calc_hash() const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\t// Note: farmer_addr, harvester and lookup_time_ms are not hashed (local info only)\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"vdf_height\",\tvdf_height);\n\twrite_field(out, \"proof\", \t\tproof ? proof->calc_hash() : hash_t());\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nhash_t ProofResponse::calc_content_hash() const\n{\n\treturn hash_t(hash + farmer_sig);\n}\n\nvoid ProofResponse::validate() const\n{\n\tif(!proof) {\n\t\tthrow std::logic_error(\"missing proof\");\n\t}\n\tproof->validate();\n\n\tif(!farmer_sig.verify(proof->farmer_key, hash)) {\n\t\tthrow std::logic_error(\"invalid farmer signature\");\n\t}\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/ProofServer.cpp",
    "content": "/*\n * ProofServer.cpp\n *\n *  Created on: May 13, 2025\n *      Author: mad\n */\n\n#include <mmx/ProofServer.h>\n#include <mmx/pos/verify.h>\n\n\nnamespace mmx {\n\nProofServer::ProofServer(const std::string& _vnx_name)\n\t:\tProofServerBase(_vnx_name)\n{\n}\n\nvoid ProofServer::init()\n{\n\tvnx::open_pipe(vnx_name, this, 20000);\n}\n\nvoid ProofServer::main()\n{\n\tthreads = std::make_shared<vnx::ThreadPool>(num_threads, 100);\n\n\tset_timer_millis(60 * 1000, [this]() {\n\t\tif(num_requests) {\n\t\t\tstd::stringstream ss;\n\t\t\tfor(const auto& entry : request_map) {\n\t\t\t\tss << \", \" << entry.second << \" k\" << entry.first.first << \"-C\" << entry.first.second;\n\t\t\t}\n\t\t\tlog(INFO) << num_requests << \" requests/min\" << ss.str();\n\t\t}\n\t\tnum_requests = 0;\n\t\trequest_map.clear();\n\t});\n\n\tSuper::main();\n\n\tthreads->close();\n}\n\nvoid ProofServer::compute_async(\n\t\tconst std::vector<uint32_t>& X_values, const hash_t& id, const int32_t& ksize, const int32_t& xbits,\n\t\tconst vnx::request_id_t& request_id) const\n{\n\tthreads->add_task([=]()\n\t{\n\t\ttry {\n\t\t\tstd::vector<uint32_t> X_out;\n\t\t\tconst auto res = pos::compute(X_values, &X_out, id, ksize, xbits);\n\n\t\t\tstd::vector<table_entry_t> out;\n\t\t\tif(res.size()) {\n\t\t\t\tconst auto x_count = X_out.size() / res.size();\n\n\t\t\t\tfor(size_t i = 0; i < res.size(); ++i) {\n\t\t\t\t\ttable_entry_t tmp;\n\t\t\t\t\ttmp.y = res[i].first;\n\t\t\t\t\ttmp.meta = res[i].second.bytes;\n\t\t\t\t\tfor(size_t k = 0; k < x_count; ++k) {\n\t\t\t\t\t\ttmp.x_values.push_back(X_out[i * x_count + k]);\n\t\t\t\t\t}\n\t\t\t\t\tout.push_back(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t\tcompute_async_return(request_id, out);\n\t\t}\n\t\tcatch(const std::exception& ex) {\n\t\t\tvnx_async_return_ex(request_id, ex);\n\t\t}\n\t});\n\n\tnum_requests++;\n\trequest_map[std::make_pair(ksize, xbits)]++;\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Qt_GUI.cpp",
    "content": "/*\n * Qt_GUI.cpp\n *\n *  Created on: Jan 22, 2025\n *      Author: mad\n */\n\n#include <mmx/Qt_GUI.h>\n#include <vnx/vnx.h>\n\n#ifdef WITH_QT\n\n#include <QIcon>\n#include <QApplication>\n#include <QWebEngineView>\n#include <QLoggingCategory>\n#include <QWebEngineSettings>\n#include <QWebEngineProfile>\n#include <QWebEngineScript>\n#include <QWebEngineScriptCollection>\n#include <QWebEngineUrlRequestInterceptor>\n\n\nclass RequestInterceptor : public QWebEngineUrlRequestInterceptor {\npublic:\n\tstd::string api_host;\n\tstd::string api_token;\n\tstd::string api_token_header;\n\texplicit RequestInterceptor(QObject* parent = nullptr) : QWebEngineUrlRequestInterceptor(parent) {}\n\tvirtual ~RequestInterceptor() = default;\n\tvoid interceptRequest(QWebEngineUrlRequestInfo& info) override {\n\t\tconst auto host = info.requestUrl().host().toStdString() + \":\" + std::to_string(info.requestUrl().port());\n\t\tif(host == api_host) {\n\t\t\tinfo.setHttpHeader(QByteArray::fromStdString(api_token_header), QByteArray::fromStdString(api_token));\n\t\t}\n\t}\n};\n\nvoid qt_log_func(QtMsgType type, const QMessageLogContext &context, const QString &msg) {\n    vnx::log_debug() << \"QT: \" << msg.toStdString() << \" (\" << context.file << \":\" << context.line << \")\";\n}\n\nvoid qt_gui_exec(char** argv, std::string host, std::string api_token, std::string api_token_header)\n{\n\tqInstallMessageHandler(qt_log_func);\n\n\tstd::string version;\n\tvnx::read_config(\"build.version\", version);\n\n\tconst auto full_url = \"http://\" + host + \"/gui/\";\n\n\tint argc = 1;\n\tQApplication app(argc, argv);\n\n\tconst auto interceptor = new RequestInterceptor();\n\tinterceptor->api_host = host;\n\tinterceptor->api_token = api_token;\n\tinterceptor->api_token_header = api_token_header;\n\n\tQWebEngineScript script;\n\tscript.setSourceCode(\"window.mmx_qtgui = true;\");\n\tscript.setInjectionPoint(QWebEngineScript::DocumentCreation);\n\tscript.setWorldId(QWebEngineScript::MainWorld);\n\n\tQWebEngineView view;\n\tview.page()->profile()->setRequestInterceptor(interceptor);\n\tview.page()->settings()->setAttribute(QWebEngineSettings::JavascriptCanAccessClipboard, true);\n\tview.page()->settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, true);\n\tview.page()->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true);\n\tview.page()->scripts().insert(script);\n\tview.setUrl(QUrl(QString::fromStdString(full_url)));\n\tview.setWindowTitle(QString::fromStdString(\"MMX - \" + version));\n\tview.setWindowIcon(QIcon(\"www/web-gui/public/assets/img/logo_circle_color_cy256.png\"));\n\tview.resize(1300, 1000);\n\tview.show();\n\n\tapp.exec();\n}\n\n\n\n#endif // WITH_QT\n"
  },
  {
    "path": "src/Router.cpp",
    "content": "/*\n * Router.cpp\n *\n *  Created on: Dec 17, 2021\n *      Author: mad\n */\n\n#include <mmx/Router.h>\n#include <mmx/hash_t.hpp>\n#include <mmx/skey_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/utils.h>\n#include <mmx/helpers.h>\n\n#include <mmx/Return.hxx>\n#include <mmx/Request.hxx>\n#include <mmx/Router_get_id.hxx>\n#include <mmx/Router_get_id_return.hxx>\n#include <mmx/Router_get_info.hxx>\n#include <mmx/Router_get_info_return.hxx>\n#include <mmx/Router_get_peers.hxx>\n#include <mmx/Router_get_peers_return.hxx>\n#include <mmx/Router_sign_msg.hxx>\n#include <mmx/Router_sign_msg_return.hxx>\n#include <mmx/Node_get_height.hxx>\n#include <mmx/Node_get_height_return.hxx>\n#include <mmx/Node_get_synced_height.hxx>\n#include <mmx/Node_get_synced_height_return.hxx>\n#include <mmx/Node_get_header.hxx>\n#include <mmx/Node_get_header_return.hxx>\n#include <mmx/Node_get_header_at.hxx>\n#include <mmx/Node_get_header_at_return.hxx>\n#include <mmx/Node_get_block.hxx>\n#include <mmx/Node_get_block_return.hxx>\n#include <mmx/Node_get_block_at.hxx>\n#include <mmx/Node_get_block_at_return.hxx>\n#include <mmx/Node_get_block_hash.hxx>\n#include <mmx/Node_get_block_hash_return.hxx>\n#include <mmx/Node_get_block_hash_ex.hxx>\n#include <mmx/Node_get_block_hash_ex_return.hxx>\n#include <mmx/Node_get_tx_ids_at.hxx>\n#include <mmx/Node_get_tx_ids_at_return.hxx>\n\n#include <vnx/vnx.h>\n#include <vnx/NoSuchMethod.hxx>\n#include <vnx/OverflowException.hxx>\n\n#include <algorithm>\n\n\nnamespace mmx {\n\nRouter::Router(const std::string& _vnx_name)\n\t:\tRouterBase(_vnx_name),\n\t\trand_engine(get_time_us())\n{\n\tparams = get_params();\n\tport = params->port;\n}\n\nvoid Router::init()\n{\n\tSuper::init();\n\tvnx::open_pipe(vnx_name, this, max_queue_ms);\n}\n\nvoid Router::main()\n{\n\tif(num_peers_out < 1) {\n\t\tthrow std::logic_error(\"num_peers_out < 1\");\n\t}\n\tif(min_sync_peers < 1) {\n\t\tthrow std::logic_error(\"min_sync_peers < 1\");\n\t}\n\tmin_sync_peers = std::min(min_sync_peers, num_peers_out);\n\n\tif(max_connections >= 0) {\n\t\tif(num_peers_out > uint32_t(max_connections)) {\n\t\t\tthrow std::logic_error(\"num_peers_out > max_connections\");\n\t\t}\n\t\tif(min_sync_peers > uint32_t(max_connections)) {\n\t\t\tthrow std::logic_error(\"min_sync_peers > max_connections\");\n\t\t}\n\t}\n\tfixed_peers.insert(master_nodes.begin(), master_nodes.end());\n\t{\n\t\tconst auto max_block_size = to_value(params->max_block_size, params);\n\t\ttx_upload_bandwidth = max_tx_upload * max_block_size / params->get_block_time();\n\t\tmax_pending_cost_value = max_pending_cost * max_block_size;\n\t}\n\tlog(INFO) << \"Global TX upload limit: \" << tx_upload_bandwidth << \" MMX/s\";\n\tlog(INFO) << \"Peer TX pending limit: \" << max_pending_cost_value << \" MMX\";\n\n\tsubscribe(input_verified_vdfs, max_queue_ms);\n\tsubscribe(input_verified_votes, max_queue_ms);\n\tsubscribe(input_verified_proof, max_queue_ms);\n\tsubscribe(input_verified_blocks, max_queue_ms);\n\tsubscribe(input_verified_transactions, max_queue_ms);\n\tsubscribe(input_transactions, max_queue_ms);\n\tsubscribe(input_vdf_points, max_queue_ms);\n\tsubscribe(input_vdfs, max_queue_ms);\n\n\tnode_skey = skey_t(hash_t::random());\n\tnode_key = pubkey_t(node_skey);\n\tnode_id = node_key.get_addr();\n\t{\n\t\tvnx::File file(storage_path + \"known_peers.dat\");\n\t\tif(file.exists()) {\n\t\t\tstd::vector<std::string> peers;\n\t\t\ttry {\n\t\t\t\tfile.open(\"rb\");\n\t\t\t\tvnx::read_generic(file.in, peers);\n\t\t\t\tfile.close();\n\t\t\t}\n\t\t\tcatch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"Failed to read peers from file: \" << ex.what();\n\t\t\t}\n\t\t\tpeer_set.insert(peers.begin(), peers.end());\n\t\t}\n\t}\n\tlog(INFO) << \"Node ID: \" << node_id;\n\tlog(INFO) << \"Loaded \" << peer_set.size() << \" known peers\";\n\n\tnode = std::make_shared<NodeAsyncClient>(node_server);\n\tnode->vnx_set_non_blocking(true);\n\tadd_async_client(node);\n\n\thttp = std::make_shared<vnx::addons::HttpInterface<Router>>(this, vnx_name);\n\tadd_async_client(http);\n\n\tif(open_port) {\n\t\tupnp_mapper = upnp_start_mapping(port, \"MMX Node\");\n\t\tlog(upnp_mapper ? INFO : WARN) << \"UPnP supported: \" << (upnp_mapper ? \"yes\" : \"no\");\n\t}\n\n\tset_timer_millis(send_interval_ms, std::bind(&Router::send, this));\n\tset_timer_millis(query_interval_ms, std::bind(&Router::query, this));\n\tset_timer_millis(update_interval_ms, std::bind(&Router::update, this));\n\tset_timer_millis(connect_interval_ms, std::bind(&Router::connect, this));\n\tset_timer_millis(discover_interval * 1000, std::bind(&Router::discover, this));\n\tset_timer_millis(5 * 60 * 1000, std::bind(&Router::save_data, this));\n\n\tconnect();\n\n\tSuper::main();\n\n\tsave_data();\n\n\tif(upnp_mapper) {\n\t\tupnp_mapper->stop();\n\t}\n}\n\nhash_t Router::get_id() const\n{\n\treturn node_id;\n}\n\nnode_info_t Router::get_info() const\n{\n\tnode_info_t info;\n\tinfo.id = node_id;\n\tinfo.version = node_version;\n\tinfo.type = mode;\n\treturn info;\n}\n\nstd::pair<pubkey_t, signature_t> Router::sign_msg(const hash_t& msg) const\n{\n\treturn std::make_pair(node_key, signature_t::sign(node_skey, msg));\n}\n\nstatic\nbool is_valid_address(const std::string& addr)\n{\n\tif(addr.empty() || addr.substr(0, 4) == \"127.\" || addr == \"0.0.0.0\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\nstatic\nbool is_public_address(const std::string& addr)\n{\n\tif(!is_valid_address(addr) || addr.substr(0, 3) == \"10.\" || addr.substr(0, 8) == \"192.168.\") {\n\t\treturn false;\n\t}\n\treturn true;\n}\n\ntemplate<typename T, typename R>\nstd::vector<T> get_subset(const std::set<T>& candidates, const size_t max_count, R& engine)\n{\n\tstd::vector<T> result(candidates.begin(), candidates.end());\n\tif(max_count < result.size()) {\n\t\tstd::shuffle(result.begin(), result.end(), engine);\n\t\tresult.resize(max_count);\n\t}\n\treturn result;\n}\n\nstd::vector<std::string> Router::get_peers(const uint32_t& max_count) const\n{\n\tauto peers = get_known_peers();\n\tconst auto connected = get_connected_peers();\n\tpeers.insert(peers.end(), connected.begin(), connected.end());\n\n\tstd::set<std::string> valid;\n\tfor(const auto& addr : peers) {\n\t\tif(is_public_address(addr)) {\n\t\t\tvalid.insert(addr);\n\t\t}\n\t}\n\treturn get_subset(valid, max_count, rand_engine);\n}\n\nstd::vector<std::string> Router::get_known_peers() const\n{\n\treturn std::vector<std::string>(peer_set.begin(), peer_set.end());\n}\n\nstd::vector<std::string> Router::get_connected_peers() const\n{\n\tstd::vector<std::string> res;\n\tfor(const auto& entry : peer_map) {\n\t\tres.push_back(entry.second->address);\n\t}\n\treturn res;\n}\n\nstd::shared_ptr<const PeerInfo> Router::get_peer_info() const\n{\n\tconst auto now_ms = get_time_ms();\n\n\tauto info = PeerInfo::create();\n\tfor(const auto& entry : peer_map) {\n\t\tconst auto& state = entry.second;\n\t\tpeer_info_t peer;\n\t\tpeer.id = entry.first;\n\t\tpeer.type = state->info.type;\n\t\tpeer.address = state->address;\n\t\tpeer.height = state->height;\n\t\tpeer.version = state->info.version;\n\t\tpeer.ping_ms = state->ping_ms;\n\t\tpeer.bytes_send = state->bytes_send;\n\t\tpeer.bytes_recv = state->bytes_recv;\n\t\tpeer.pending_cost = state->pending_cost;\n\t\tpeer.compression_ratio = state->bytes_send_raw / double(state->bytes_send);\n\t\tpeer.is_synced = state->is_synced;\n\t\tpeer.is_paused = state->is_paused;\n\t\tpeer.is_blocked = state->is_blocked;\n\t\tpeer.is_outbound = state->is_outbound;\n\t\tpeer.recv_timeout_ms = now_ms - state->last_receive_ms;\n\t\tpeer.connect_time_ms = now_ms - state->connected_since_ms;\n\t\tinfo->peers.push_back(peer);\n\t}\n\tstd::sort(info->peers.begin(), info->peers.end(),\n\t\t[](const peer_info_t& lhs, const peer_info_t& rhs) -> bool {\n\t\t\treturn lhs.connect_time_ms > rhs.connect_time_ms;\n\t\t});\n\treturn info;\n}\n\nvoid Router::kick_peer(const std::string& address)\n{\n\tfor(auto peer : find_peers(address)) {\n\t\tban_peer(peer->client, \"kicked manually\");\n\t}\n}\n\nvoid Router::get_blocks_at_async(const uint32_t& height, const vnx::request_id_t& request_id) const\n{\n\tauto job = std::make_shared<sync_job_t>();\n\tjob->height = height;\n\tjob->start_time_ms = get_time_ms();\n\tsync_jobs[request_id] = job;\n\t((Router*)this)->process();\n}\n\nvoid Router::fetch_block_async(const hash_t& hash, const vnx::optional<std::string>& address, const vnx::request_id_t& request_id) const\n{\n\tauto job = std::make_shared<fetch_job_t>();\n\tjob->hash = hash;\n\tjob->from_peer = address;\n\tjob->callback = std::bind(&Router::fetch_block_async_return, this, request_id, std::placeholders::_1);\n\tjob->start_time_ms = get_time_ms();\n\tfetch_jobs[request_id] = job;\n\t((Router*)this)->process();\n}\n\nvoid Router::fetch_block_at_async(const uint32_t& height, const std::string& address, const vnx::request_id_t& request_id) const\n{\n\tauto job = std::make_shared<fetch_job_t>();\n\tjob->height = height;\n\tjob->from_peer = address;\n\tjob->callback = std::bind(&Router::fetch_block_at_async_return, this, request_id, std::placeholders::_1);\n\tjob->start_time_ms = get_time_ms();\n\tfetch_jobs[request_id] = job;\n\t((Router*)this)->process();\n}\n\nvoid Router::handle(std::shared_ptr<const Block> block)\n{\n\tconst auto& hash = block->content_hash;\n\tconst auto is_ours = !hash_info.count(hash);\n\t// block does not give any credits (to avoid denial of service attack by farmer)\n\tif(relay_msg_hash(hash)) {\n\t\tif(is_ours) {\n\t\t\tlog(INFO) << \"Broadcasting block for height \" << block->height;\n\t\t}\n\t\tbroadcast(block, hash, {node_type_e::FULL_NODE, node_type_e::LIGHT_NODE}, is_ours);\n\t\tblock_counter++;\n\t}\n\t// don't erase current height, to prevent lesser block erasing better proof credit\n\tvdf_history.erase(vdf_history.begin(), vdf_history.upper_bound(verified_vdf_height));\n\tfarmer_credit.erase(farmer_credit.begin(), farmer_credit.upper_bound(verified_vdf_height));\n\n\tverified_vdf_height = block->vdf_height;\n\tverified_peak_height = block->height;\n}\n\nvoid Router::handle(std::shared_ptr<const Transaction> tx)\n{\n\tconst auto& hash = tx->content_hash;\n\tif(relay_msg_hash(hash)) {\n\t\tif(vnx_sample->topic == input_transactions) {\n\t\t\tbroadcast(tx, hash, {node_type_e::FULL_NODE}, true, true);\n\t\t} else {\n\t\t\trelay(tx, hash, {node_type_e::FULL_NODE});\n\t\t}\n\t\ttx_counter++;\n\t}\n}\n\nvoid Router::handle(std::shared_ptr<const ProofOfTime> value)\n{\n\tif(vnx_sample && vnx_sample->topic == input_vdfs)\n\t{\n\t\tif(our_timelords.insert(value->timelord_key).second) {\n\t\t\tlog(INFO) << \"Our Timelord: \" << value->timelord_key;\n\t\t}\n\t\tif(value->vdf_height <= verified_vdf_height) {\n\t\t\treturn;\t\t// too slow\n\t\t}\n\t}\n\tconst bool is_ours = our_timelords.count(value->timelord_key);\n\n\tconst auto& hash = value->content_hash;\n\tif(relay_msg_hash(hash)) {\n\t\tif(is_ours) {\n\t\t\tlog(INFO) << u8\"\\U0000231B Broadcasting VDF for height \" << value->vdf_height;\n\t\t}\n\t\tbroadcast(value, hash, {node_type_e::FULL_NODE, node_type_e::LIGHT_NODE}, is_ours);\n\n\t\tvdf_history.emplace(value->vdf_height, value);\n\t\tvdf_counter++;\n\t}\n\ttimelord_credit[value->timelord_key] = 1;\n\n\tverified_vdf_height = std::max(verified_vdf_height, value->vdf_height);\n}\n\nvoid Router::handle(std::shared_ptr<const VDF_Point> value)\n{\n\tif(value->proof) {\n\t\tauto tmp = vnx::clone(value);\n\t\ttmp->proof = nullptr;\n\t\tvalue = tmp;\n\t}\n\tconst auto& hash = value->content_hash;\n\tif(relay_msg_hash(hash)) {\n\t\tbroadcast(value, hash, {node_type_e::FULL_NODE, node_type_e::LIGHT_NODE}, true);\n\t}\n}\n\nvoid Router::handle(std::shared_ptr<const ProofResponse> value)\n{\n\tif(!value->proof) {\n\t\treturn;\n\t}\n\tconst auto is_ours = bool(vnx::get_pipe(value->farmer_addr));\n\n\tconst auto& hash = value->content_hash;\n\tif(relay_msg_hash(hash)) {\n\t\tif(is_ours) {\n\t\t\tlog(DEBUG) << \"Broadcasting proof for height \" << value->vdf_height << \" with score \" << value->proof->score;\n\t\t}\n\t\tauto copy = vnx::clone(value);\n\t\tcopy->harvester.clear();\t\t\t// clear local information\n\t\tcopy->farmer_addr = vnx::Hash64();\t// clear local information\n\t\tbroadcast(copy, hash, {node_type_e::FULL_NODE}, is_ours);\n\n\t\tfarmer_credit[value->vdf_height].insert(value->proof->farmer_key);\n\t\tproof_counter++;\n\t}\n}\n\nvoid Router::handle(std::shared_ptr<const ValidatorVote> value)\n{\n\tconst auto& hash = value->content_hash;\n\tif(relay_msg_hash(hash)) {\n\t\tbroadcast(value, hash, {node_type_e::FULL_NODE, node_type_e::LIGHT_NODE}, false);\n\t\tvote_counter++;\n\t}\n}\n\nuint32_t Router::send_request(std::shared_ptr<peer_t> peer, std::shared_ptr<const vnx::Value> method, bool reliable)\n{\n\tauto req = Request::create();\n\treq->id = next_request_id++;\n\treq->method = method;\n\tsend_to(peer, req, reliable);\n\treturn req->id;\n}\n\nuint32_t Router::send_request(uint64_t client, std::shared_ptr<const vnx::Value> method, bool reliable)\n{\n\tauto req = Request::create();\n\treq->id = next_request_id++;\n\treq->method = method;\n\tsend_to(client, req, reliable);\n\treturn req->id;\n}\n\nvoid Router::update()\n{\n\tconst auto now_ms = get_time_ms();\n\n\tfor(const auto& entry : peer_map) {\n\t\tconst auto& peer = entry.second;\n\t\tpeer->pending_cost = std::max<double>(peer->pending_cost, 0) * 0.999;\n\n\t\t// clear old hashes\n\t\twhile(peer->hash_queue.size() > max_sent_cache) {\n\t\t\tpeer->sent_hashes.erase(peer->hash_queue.front());\n\t\t\tpeer->hash_queue.pop();\n\t\t}\n\t\t// check for timeout\n\t\tif(connection_timeout_ms > 0 && now_ms - std::max(peer->last_receive_ms, peer->connected_since_ms) > connection_timeout_ms) {\n\t\t\tlog(INFO) << \"Peer \" << peer->address << \" timed out\";\n\t\t\tdisconnect(entry.first);\n\t\t}\n\t\t// check for manual disconnect\n\t\tif(disconnect_interval && !peer->is_outbound && (now_ms - peer->connected_since_ms) / 1000 > disconnect_interval) {\n\t\t\tlog(INFO) << \"Disconnecting peer \" << peer->address << \" due to interval exceeded\";\n\t\t\tdisconnect(entry.first);\n\t\t}\n\t}\n\n\t// clear seen hashes\n\twhile(hash_queue.size() > max_hash_cache) {\n\t\thash_info.erase(hash_queue.front());\n\t\thash_queue.pop();\n\t}\n\n\t// check if we lost sync due to response timeout\n\t{\n\t\tsize_t num_peers = 0;\n\t\tfor(const auto& entry : peer_map) {\n\t\t\tconst auto& peer = entry.second;\n\t\t\tif(peer->is_synced && now_ms - peer->last_receive_ms < sync_loss_delay * 1000) {\n\t\t\t\tnum_peers++;\n\t\t\t}\n\t\t}\n\t\tif(num_peers < min_sync_peers) {\n\t\t\tnode->get_synced_height([this](const vnx::optional<uint32_t>& height) {\n\t\t\t\tif(is_connected && height) {\n\t\t\t\t\tlog(WARN) << \"Lost sync with network due to loss of synced peers or timeout!\";\n\t\t\t\t\tis_connected = false;\n\t\t\t\t\tnode->start_sync();\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tis_connected = true;\n\t\t}\n\t}\n\n\tif(synced_peers.size() >= min_sync_peers)\n\t{\n\t\t// check for sync job timeouts\n\t\tfor(auto& entry : sync_jobs) {\n\t\t\tauto& job = entry.second;\n\t\t\tif(now_ms - std::max(job->start_time_ms, job->last_recv_ms) > fetch_timeout_ms) {\n\t\t\t\tfor(auto client : job->pending) {\n\t\t\t\t\tsynced_peers.erase(client);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tconst auto height = job->height;\n\t\t\t\t\tjob = std::make_shared<sync_job_t>();\n\t\t\t\t\tjob->height = height;\n\t\t\t\t}\n\t\t\t\tjob->start_time_ms = now_ms;\n\t\t\t\tlog(WARN) << \"Timeout on sync job for height \" << job->height << \": \"\n\t\t\t\t\t\t<< job->got_hash.size() << \" reply, \" << job->num_fetch << \" fetch, \"\n\t\t\t\t\t\t<< job->failed.size() << \" failed, \" << job->pending.size() << \" pending, \"\n\t\t\t\t\t\t<< job->succeeded.size() << \" succeeded\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// check for fetch job timeouts\n\tfor(auto iter = fetch_jobs.begin(); iter != fetch_jobs.end();) {\n\t\tconst auto job = iter->second;\n\t\tif(now_ms - std::max(job->start_time_ms, job->last_recv_ms) > fetch_timeout_ms) {\n\t\t\tvnx_async_return_ex_what(iter->first, \"fetch timeout\");\n\t\t\titer = fetch_jobs.erase(iter);\n\t\t} else {\n\t\t\titer++;\n\t\t}\n\t}\n\n\tprocess();\n}\n\nbool Router::process(std::shared_ptr<const Return> ret)\n{\n\tconst auto now_ms = get_time_ms();\n\n\tbool did_consume = false;\n\tfor(auto& entry : sync_jobs)\n\t{\n\t\tconst auto& request_id = entry.first;\n\t\tauto& job = entry.second;\n\t\tconst auto elapsed_ms = now_ms - job->start_time_ms;\n\t\tif(ret) {\n\t\t\t// check for any returns\n\t\t\tauto iter = job->request_map.find(ret->id);\n\t\t\tif(iter != job->request_map.end()) {\n\t\t\t\tconst auto client = iter->second;\n\t\t\t\tif(auto result = std::dynamic_pointer_cast<const Node_get_block_hash_ex_return>(ret->result)) {\n\t\t\t\t\tif(auto hash = result->_ret_0) {\n\t\t\t\t\t\tif(job->blocks.count(hash->second)) {\n\t\t\t\t\t\t\tjob->succeeded.insert(client);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tjob->got_hash[client] = *hash;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tjob->failed.insert(client);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(auto result = std::dynamic_pointer_cast<const Node_get_block_return>(ret->result)) {\n\t\t\t\t\tif(auto block = result->_ret_0) {\n\t\t\t\t\t\tconst auto& hash = block->content_hash;\n\t\t\t\t\t\tif(block->is_valid()) {\n\t\t\t\t\t\t\tfor(const auto& entry : job->got_hash) {\n\t\t\t\t\t\t\t\tif(entry.second.second == hash) {\n\t\t\t\t\t\t\t\t\tjob->succeeded.insert(entry.first);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tjob->succeeded.insert(client);\n\t\t\t\t\t\t\tjob->blocks[hash] = block;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tban_peer(client, \"they sent us an invalid block\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tjob->pending_blocks.erase(hash);\n\t\t\t\t\t}\n\t\t\t\t\tif(!job->succeeded.count(client)) {\n\t\t\t\t\t\tjob->failed.insert(client);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(auto result = std::dynamic_pointer_cast<const vnx::Exception>(ret->result)) {\n\t\t\t\t\tauto got_hash = job->got_hash.find(client);\n\t\t\t\t\tif(got_hash != job->got_hash.end()) {\n\t\t\t\t\t\tjob->pending_blocks.erase(got_hash->second.second);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tjob->pending.erase(client);\n\t\t\t\tjob->request_map.erase(iter);\n\t\t\t\tjob->last_recv_ms = now_ms;\n\t\t\t\tdid_consume = true;\n\t\t\t} else {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\t// check for disconnects\n\t\tfor(auto iter = job->pending.begin(); iter != job->pending.end();) {\n\t\t\tconst auto client = *iter;\n\t\t\tif(synced_peers.count(client)) {\n\t\t\t\titer++;\n\t\t\t} else {\n\t\t\t\tauto iter2 = job->got_hash.find(client);\n\t\t\t\tif(iter2 != job->got_hash.end()) {\n\t\t\t\t\tjob->pending_blocks.erase(iter2->second.second);\n\t\t\t\t\tjob->got_hash.erase(iter2);\n\t\t\t\t}\n\t\t\t\titer = job->pending.erase(iter);\n\t\t\t}\n\t\t}\n\t\tconst auto num_returns = job->failed.size() + job->succeeded.size();\n\t\tif(num_returns < min_sync_peers) {\n\t\t\t// fetch block hashes\n\t\t\tconst auto max_pending = min_sync_peers + 3;\n\t\t\tconst auto num_pending = job->pending.size() + job->got_hash.size();\n\t\t\tif(num_pending < max_pending) {\n\t\t\t\tstd::set<uint64_t> clients;\n\t\t\t\tfor(auto client : synced_peers) {\n\t\t\t\t\tif(!job->failed.count(client) && !job->pending.count(client)\n\t\t\t\t\t\t&& !job->succeeded.count(client) && !job->got_hash.count(client))\n\t\t\t\t\t{\n\t\t\t\t\t\tclients.insert(client);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor(const auto client : get_subset(clients, max_pending - num_pending, rand_engine)) {\n\t\t\t\t\tauto req = Node_get_block_hash_ex::create();\n\t\t\t\t\treq->height = job->height;\n\t\t\t\t\tconst auto id = send_request(client, req);\n\t\t\t\t\tjob->request_map[id] = client;\n\t\t\t\t\tjob->pending.insert(client);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// fetch blocks\n\t\t\tstd::set<std::pair<uint64_t, std::pair<hash_t, hash_t>>> clients;\n\t\t\tfor(const auto& entry : job->got_hash) {\n\t\t\t\tconst auto& hash = entry.second;\n\t\t\t\tif(!job->blocks.count(hash.second)) {\n\t\t\t\t\tconst auto client = entry.first;\n\t\t\t\t\tif(!job->failed.count(client) && !job->pending.count(client) && !job->succeeded.count(client)) {\n\t\t\t\t\t\tclients.emplace(client, hash);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(const auto& entry : get_subset(clients, clients.size(), rand_engine)) {\n\t\t\t\tconst auto client = entry.first;\n\t\t\t\tconst auto& hash = entry.second;\n\t\t\t\tauto pending = job->pending_blocks.find(hash.second);\n\t\t\t\tif(pending == job->pending_blocks.end() || now_ms > pending->second) {\n\t\t\t\t\tauto req = Node_get_block::create();\n\t\t\t\t\treq->hash = hash.first;\n\t\t\t\t\tconst auto id = send_request(client, req);\n\t\t\t\t\tjob->request_map[id] = client;\n\t\t\t\t\tjob->pending.insert(client);\n\t\t\t\t\tjob->pending_blocks[hash.second] = now_ms + fetch_timeout_ms / 8;\n\t\t\t\t\tjob->num_fetch++;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tuint64_t max_block_size = 0;\n\t\t\tfor(const auto& entry : job->blocks) {\n\t\t\t\tmax_block_size = std::max(entry.second->static_cost, max_block_size);\n\t\t\t}\n\t\t\tlog(DEBUG) << \"Got \" << job->blocks.size() << \" blocks for height \" << job->height << \" by fetching \"\n\t\t\t\t\t<< job->num_fetch << \" times, \" << job->got_hash.size() << \" reply, \" << job->failed.size() << \" failed\"\n\t\t\t\t\t<< \", size = \" << to_value(max_block_size, params) << \" MMX\" << \", took \" << elapsed_ms / 1e3 << \" sec\";\n\t\t\t// we are done with the job\n\t\t\tstd::vector<std::shared_ptr<const Block>> blocks;\n\t\t\tfor(const auto& entry : job->blocks) {\n\t\t\t\tblocks.push_back(entry.second);\n\t\t\t}\n\t\t\tjob->is_done = true;\n\t\t\tget_blocks_at_async_return(request_id, blocks);\n\t\t}\n\t}\n\tfor(auto iter = sync_jobs.begin(); iter != sync_jobs.end();) {\n\t\tif(iter->second->is_done) {\n\t\t\titer = sync_jobs.erase(iter);\n\t\t} else {\n\t\t\titer++;\n\t\t}\n\t}\n\n\tfor(const auto& entry : fetch_jobs)\n\t{\n\t\tconst auto& request_id = entry.first;\n\t\tconst auto& job = entry.second;\n\t\tif(ret) {\n\t\t\t// check for any returns\n\t\t\tauto iter = job->request_map.find(ret->id);\n\t\t\tif(iter != job->request_map.end()) {\n\t\t\t\tconst auto client = iter->second;\n\t\t\t\tif(auto result = std::dynamic_pointer_cast<const Node_get_block_at_return>(ret->result)) {\n\t\t\t\t\tif(job->height) {\n\t\t\t\t\t\tjob->is_done = true;\n\t\t\t\t\t\tjob->callback(result->_ret_0);\n\t\t\t\t\t}\n\t\t\t\t} else if(auto result = std::dynamic_pointer_cast<const Node_get_block_return>(ret->result)) {\n\t\t\t\t\tif(job->hash) {\n\t\t\t\t\t\tif(result->_ret_0 || job->from_peer) {\n\t\t\t\t\t\t\tjob->is_done = true;\n\t\t\t\t\t\t\tjob->callback(result->_ret_0);\n\t\t\t\t\t\t\tlog(DEBUG) << \"Got block \" << *job->hash << \" by fetching \"\n\t\t\t\t\t\t\t\t\t<< job->pending.size() + job->failed.size() << \" times, \" << job->failed.size() << \" failed, took\"\n\t\t\t\t\t\t\t\t\t<< (now_ms - job->start_time_ms) / 1e3 << \" sec\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tjob->failed.insert(client);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if(job->from_peer) {\n\t\t\t\t\tjob->is_done = true;\n\t\t\t\t\tvnx_async_return_ex_what(request_id, \"request failed\");\n\t\t\t\t} else {\n\t\t\t\t\tjob->failed.insert(client);\n\t\t\t\t}\n\t\t\t\tjob->pending.erase(client);\n\t\t\t\tjob->request_map.erase(iter);\n\t\t\t\tjob->last_recv_ms = now_ms;\n\t\t\t\tdid_consume = true;\n\t\t\t} else {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif(job->is_done) {\n\t\t\tcontinue;\n\t\t}\n\t\t// check for disconnects\n\t\tfor(auto iter = job->pending.begin(); iter != job->pending.end();) {\n\t\t\tif(synced_peers.count(*iter)) {\n\t\t\t\titer++;\n\t\t\t} else {\n\t\t\t\titer = job->pending.erase(iter);\n\t\t\t}\n\t\t}\n\t\tif(auto address = job->from_peer) {\n\t\t\tif(job->request_map.empty()) {\n\t\t\t\tstd::shared_ptr<peer_t> peer;\n\t\t\t\t{\n\t\t\t\t\tconst auto peers = find_peers(*address);\n\t\t\t\t\tif(!peers.empty()) {\n\t\t\t\t\t\tpeer = peers[0];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(!peer) {\n\t\t\t\t\tjob->is_done = true;\n\t\t\t\t\tvnx_async_return_ex_what(request_id, \"no such peer\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(auto hash = job->hash) {\n\t\t\t\t\tauto req = Node_get_block::create();\n\t\t\t\t\treq->hash = *hash;\n\t\t\t\t\tconst auto id = send_request(peer, req);\n\t\t\t\t\tjob->request_map[id] = peer->client;\n\t\t\t\t}\n\t\t\t\tif(auto height = job->height) {\n\t\t\t\t\tauto req = Node_get_block_at::create();\n\t\t\t\t\treq->height = *height;\n\t\t\t\t\tconst auto id = send_request(peer, req);\n\t\t\t\t\tjob->request_map[id] = peer->client;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if(auto hash = job->hash) {\n\t\t\tauto clients = synced_peers;\n\t\t\tfor(auto id : job->failed) {\n\t\t\t\tclients.erase(id);\n\t\t\t}\n\t\t\tfor(auto id : job->pending) {\n\t\t\t\tclients.erase(id);\n\t\t\t}\n\t\t\tif(clients.empty() && job->pending.empty()) {\n\t\t\t\tjob->is_done = true;\n\t\t\t\tjob->callback(nullptr);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif(job->pending.size() < min_sync_peers) {\n\t\t\t\tfor(auto client : get_subset(clients, min_sync_peers - job->pending.size(), rand_engine)) {\n\t\t\t\t\tauto req = Node_get_block::create();\n\t\t\t\t\treq->hash = *hash;\n\t\t\t\t\tconst auto id = send_request(client, req);\n\t\t\t\t\tjob->request_map[id] = client;\n\t\t\t\t\tjob->pending.insert(client);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tjob->is_done = true;\n\t\t\tvnx_async_return_ex_what(request_id, \"invalid request\");\n\t\t}\n\t}\n\tfor(auto iter = fetch_jobs.begin(); iter != fetch_jobs.end();) {\n\t\tif(iter->second->is_done) {\n\t\t\titer = fetch_jobs.erase(iter);\n\t\t} else {\n\t\t\titer++;\n\t\t}\n\t}\n\treturn did_consume;\n}\n\nstd::string Router::resolve(const std::string& host_name)\n{\n\tif(auto address = find_value(host_map, host_name)) {\n\t\treturn *address;\n\t}\n\ttry {\n\t\treturn host_map[host_name] = vnx::resolve_host(host_name);\n\t} catch(const std::exception& ex) {\n\t\tlog(DEBUG) << ex.what();\n\t}\n\treturn std::string();\n}\n\nvoid Router::connect_to(const std::string& host_name)\n{\n\tif(connect_tasks.count(host_name)) {\n\t\treturn;\n\t}\n\tlog(DEBUG) << \"Trying to connect to \" << host_name;\n\ttry {\n\t\tconst auto address = vnx::resolve_host(host_name);\n\t\tif(address != host_name) {\n\t\t\tlog(INFO) << \"Peer host \" << host_name << \" resolves to \" << address;\n\t\t}\n\t\thost_map[host_name] = address;\n\n\t\tvnx::TcpEndpoint peer;\n\t\tpeer.host_name = host_name;\n\t\tpeer.port = params->port;\n\n\t\tconst auto client = connect_client(peer);\n\t\tconnect_tasks[host_name] = client;\n\t}\n\tcatch(const std::exception& ex) {\n\t\tif(show_warnings) {\n\t\t\tlog(WARN) << \"Connecting to peer \" << host_name << \" failed with: \" << ex.what();\n\t\t}\n\t}\n}\n\nvoid Router::connect()\n{\n\tconst auto now_ms = get_time_ms();\n\tconst auto now_sec = now_ms / 1000;\n\n\t// connect to fixed peers\n\tfor(const auto& host_name : fixed_peers) {\n\t\tif(!peer_addr_map.count(resolve(host_name))) {\n\t\t\tconnect_to(host_name);\n\t\t}\n\t}\n\n\tstd::set<std::shared_ptr<peer_t>> outbound_synced;\n\tstd::set<std::shared_ptr<peer_t>> outbound_not_synced;\n\tfor(const auto& entry : peer_map) {\n\t\tconst auto& peer = entry.second;\n\t\tif(peer->is_outbound && !fixed_peers.count(peer->host_name)) {\n\t\t\tif(peer->is_synced) {\n\t\t\t\toutbound_synced.insert(peer);\n\t\t\t}\n\t\t\telse if(now_ms - peer->connected_since_ms > connection_timeout_ms) {\n\t\t\t\toutbound_not_synced.insert(peer);\n\t\t\t}\n\t\t}\n\t}\n\n\t// connect to new peers\n\t{\n\t\tstd::set<std::string> try_peers;\n\t\tstd::set<std::string> all_peers = peer_set;\n\n\t\tfor(const auto& entry : peer_retry_map) {\n\t\t\tall_peers.insert(entry.first);\n\t\t}\n\t\tall_peers.insert(seed_peers.begin(), seed_peers.end());\n\n\t\tfor(const auto& host_name : all_peers)\n\t\t{\n\t\t\tconst auto address = resolve(host_name);\n\t\t\tif(!is_valid_address(address)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif(outbound_synced.size() >= num_peers_out) {\n\t\t\t\tauto iter = peer_retry_map.find(address);\n\t\t\t\tif(iter != peer_retry_map.end()) {\n\t\t\t\t\tif(now_sec < iter->second) {\n\t\t\t\t\t\tcontinue;\t// wait before trying again\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// randomize re-checking\n\t\t\t\t\tpeer_retry_map[address] = now_sec + vnx::rand64() % (peer_retry_interval * 60);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!peer_addr_map.count(address) && !connect_tasks.count(host_name)\n\t\t\t\t&& !block_peers.count(address) && !block_peers.count(host_name))\n\t\t\t{\n\t\t\t\ttry_peers.insert(address);\n\t\t\t}\n\t\t}\n\n\t\tfor(const auto& address : get_subset(try_peers, num_peers_out, rand_engine))\n\t\t{\n\t\t\tif(connect_tasks.size() >= 2 * num_peers_out) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconnect_to(address);\n\t\t\tpeer_retry_map.erase(address);\n\t\t}\n\t}\n\n\t// disconnect if we have too many outbound synced peers\n\t{\n\t\tsize_t num_disconnect = 0;\n\t\tif(outbound_synced.size() > num_peers_out + 1) {\n\t\t\tnum_disconnect = outbound_synced.size() - num_peers_out;\n\t\t}\n\t\tfor(const auto& peer : get_subset(outbound_synced, num_disconnect, rand_engine)) {\n\t\t\tlog(DEBUG) << \"Disconnecting from \" << peer->address << \" to reduce connections to synced peers\";\n\t\t\tdisconnect(peer->client);\n\t\t}\n\t}\n\n\t// disconnect if we have too many outbound non-synced peers\n\t{\n\t\tsize_t num_disconnect = 0;\n\t\tif(outbound_not_synced.size() > num_peers_out) {\n\t\t\tnum_disconnect = outbound_not_synced.size() - num_peers_out;\n\t\t}\n\t\tfor(const auto& peer : get_subset(outbound_not_synced, num_disconnect, rand_engine)) {\n\t\t\tlog(DEBUG) << \"Disconnecting from \" << peer->address << \" to reduce connections to non-synced peers\";\n\t\t\tdisconnect(peer->client);\n\t\t}\n\t}\n}\n\nvoid Router::query()\n{\n\tconst auto now_ms = get_time_ms();\n\t{\n\t\tauto req = Request::create();\n\t\treq->id = next_request_id++;\n\t\treq->method = Node_get_synced_height::create();\n\t\tsend_all(req, {node_type_e::FULL_NODE, node_type_e::LIGHT_NODE}, false);\n\t}\n\tlast_query_ms = now_ms;\n}\n\nvoid Router::discover()\n{\n\tif(peer_set.size() < max_peer_set) {\n\t\tauto req = Request::create();\n\t\treq->id = next_request_id++;\n\t\treq->method = Router_get_peers::create();\n\t\tsend_all(req, {node_type_e::FULL_NODE}, false);\n\t}\n\n\t// check peers and disconnect forks\n\tnode->get_synced_height(\n\t\t[this](const vnx::optional<uint32_t>& sync_height) {\n\t\t\tif(sync_height) {\n\t\t\t\tauto method = Node_get_block_hash::create();\n\t\t\t\tmethod->height = *sync_height - 2 * params->commit_delay;\n\t\t\t\tnode->get_block_hash(method->height,\n\t\t\t\t\t[this, method](const vnx::optional<hash_t>& hash) {\n\t\t\t\t\t\tif(hash) {\n\t\t\t\t\t\t\tauto req = Request::create();\n\t\t\t\t\t\t\treq->id = next_request_id++;\n\t\t\t\t\t\t\treq->method = method;\n\t\t\t\t\t\t\tsend_all(req, {node_type_e::FULL_NODE, node_type_e::LIGHT_NODE}, false);\n\n\t\t\t\t\t\t\tpeer_check.height = method->height;\n\t\t\t\t\t\t\tpeer_check.our_hash = *hash;\n\t\t\t\t\t\t\tpeer_check.request_id = req->id;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\t\t});\n}\n\nvoid Router::save_data()\n{\n\t{\n\t\tvnx::File file(storage_path + \"known_peers.dat\");\n\t\ttry {\n\t\t\tfile.open(\"wb\");\n\t\t\tconst auto peers = get_known_peers();\n\t\t\tvnx::write_generic(file.out, std::set<std::string>(peers.begin(), peers.end()));\n\t\t\tfile.close();\n\t\t}\n\t\tcatch(const std::exception& ex) {\n\t\t\tlog(WARN) << \"Failed to write peers to file: \" << ex.what();\n\t\t}\n\t}\n\t{\n\t\tstd::ofstream file(storage_path + \"timelord_credit.txt\", std::ios::trunc);\n\t\tfor(const auto& entry : timelord_credit) {\n\t\t\tfile << entry.first << \"\\t\" << entry.second << std::endl;\n\t\t}\n\t}\n}\n\nvoid Router::print_stats()\n{\n\tlog(INFO) << float(tx_counter * 1000) / stats_interval_ms\n\t\t\t  << \" tx/s, \" << float(vdf_counter * 1000) / stats_interval_ms\n\t\t\t  << \" vdf/s, \" << float(proof_counter * 1000) / stats_interval_ms\n\t\t\t  << \" proof/s, \" << float(block_counter * 1000) / stats_interval_ms\n\t\t\t  << \" block/s, \" << float(vote_counter * 1000) / stats_interval_ms\n\t\t\t  << \" votes/s, \" << synced_peers.size() << \" / \" <<  peer_map.size() << \" / \" << peer_set.size()\n\t\t\t  << \" peers, \" << timelord_credit.size() << \" timelords, \"\n\t\t\t  << float(tx_upload_sum * 1000) / stats_interval_ms << \" MMX/s tx upload, \"\n\t\t\t  << tx_drop_counter << \" / \" << vdf_drop_counter << \" / \" << proof_drop_counter << \" / \" << block_drop_counter << \" dropped\";\n\ttx_counter = 0;\n\ttx_upload_sum = 0;\n\tvdf_counter = 0;\n\tvote_counter = 0;\n\tproof_counter = 0;\n\tblock_counter = 0;\n\tupload_counter = 0;\n\ttx_drop_counter = 0;\n\tvdf_drop_counter = 0;\n\tproof_drop_counter = 0;\n\tblock_drop_counter = 0;\n}\n\nvoid Router::ban_peer(uint64_t client, const std::string& reason)\n{\n\tif(block_peers.size() >= 1000000) {\n\t\tlog(WARN) << \"block_peers overflow\";\n\t\tblock_peers.erase(block_peers.begin());\n\t}\n\tif(auto peer = find_peer(client)) {\n\t\tblock_peers.insert(peer->address);\n\t\tdisconnect(client);\n\t\tlog(WARN) << \"Banned peer \" << peer->address << \" because: \" << reason;\n\t}\n}\n\nvoid Router::on_vdf(uint64_t client, std::shared_ptr<const ProofOfTime> value)\n{\n\tif(value->vdf_height + params->commit_delay < verified_vdf_height) {\n\t\treturn; \t// prevent replay attack of old signed data\n\t}\n\tif(!value->is_valid()) {\n\t\tdisconnect(client);\n\t\treturn;\n\t}\n\tconst auto& hash = value->content_hash;\n\tif(receive_msg_hash(hash, client)) {\n\t\ttry {\n\t\t\tvalue->validate();\n\t\t} catch(const std::exception& ex) {\n\t\t\tdisconnect(client);\n\t\t\treturn;\n\t\t}\n\t\tif(value->segments.size() < max_vdf_segments) {\n\t\t\tauto iter = timelord_credit.find(value->timelord_key);\n\t\t\tif(iter != timelord_credit.end() && iter->second > 0) {\n\t\t\t\tif(relay_msg_hash(hash)) {\n\t\t\t\t\titer->second--;\n\t\t\t\t\trelay(value, hash, {node_type_e::FULL_NODE, node_type_e::LIGHT_NODE});\n\t\t\t\t\tvdf_counter++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tlog(DEBUG) << \"Timelord \" << value->timelord_key << \" has no credit to relay VDF for height \" << value->vdf_height << \", verifying first.\";\n\t\t\t}\n\t\t}\n\t\tpublish(value, output_vdfs);\n\t}\n}\n\nvoid Router::on_block(uint64_t client, std::shared_ptr<const Block> block)\n{\n\tif(block->height + params->commit_delay < verified_peak_height) {\n\t\treturn;\t\t// prevent replay attack of old signed data\n\t}\n\tif(!block->is_valid()) {\n\t\tdisconnect(client);\n\t\treturn;\n\t}\n\tconst auto& hash = block->content_hash;\n\tif(receive_msg_hash(hash, client)) {\n\t\ttry {\n\t\t\tblock->validate();\n\t\t} catch(const std::exception& ex) {\n\t\t\tdisconnect(client);\n\t\t\treturn;\n\t\t}\n\t\tconst auto farmer_key = block->proof[0]->farmer_key;\n\n\t\tauto iter = farmer_credit.find(block->vdf_height);\n\t\tif(iter != farmer_credit.end() && iter->second.erase(farmer_key)) {\n\t\t\tif(relay_msg_hash(hash)) {\n\t\t\t\trelay(block, hash, {node_type_e::FULL_NODE, node_type_e::LIGHT_NODE});\n\t\t\t\tblock_counter++;\n\t\t\t}\n\t\t} else {\n\t\t\tlog(DEBUG) << \"Farmer \" << farmer_key << \" has no credit to relay block for height \" << block->height << \", verifying first.\";\n\t\t}\n\t\tpublish(block, output_blocks);\n\t}\n}\n\nvoid Router::on_vote(uint64_t client, std::shared_ptr<const ValidatorVote> value)\n{\n\tif(!value->is_valid()) {\n\t\tdisconnect(client);\n\t\treturn;\n\t}\n\tif(receive_msg_hash(value->content_hash, client)) {\n\t\tpublish(value, output_votes);\n\t}\n}\n\nvoid Router::on_proof(uint64_t client, std::shared_ptr<const ProofResponse> value)\n{\n\tif(!value->is_valid()) {\n\t\tdisconnect(client);\n\t\treturn;\n\t}\n\tif(receive_msg_hash(value->content_hash, client)) {\n\t\tpublish(value, output_proof);\n\t}\n}\n\nvoid Router::on_vdf_point(uint64_t client, std::shared_ptr<const VDF_Point> value)\n{\n\tif(auto peer = find_peer(client)) {\n\t\tif(master_nodes.count(peer->host_name)) {\n\t\t\tif(value->is_valid()) {\n\t\t\t\tif(receive_msg_hash(value->content_hash, client)) {\n\t\t\t\t\tauto copy = vnx::clone(value);\n\t\t\t\t\tcopy->recv_time = get_time_ms();\n\t\t\t\t\tpublish(copy, output_vdf_points);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nvoid Router::on_transaction(uint64_t client, std::shared_ptr<const Transaction> tx)\n{\n\tif(!tx->is_valid(params) || tx->exec_result) {\n\t\tdisconnect(client);\n\t\treturn;\n\t}\n\tif(receive_msg_hash(tx->content_hash, client)) {\n\t\tpublish(tx, output_transactions);\n\t}\n}\n\nvoid Router::on_recv_note(uint64_t client, std::shared_ptr<const ReceiveNote> note)\n{\n\tif(auto peer = find_peer(client)) {\n\t\tif(peer->sent_hashes.insert(note->hash).second) {\n\t\t\tpeer->hash_queue.push(note->hash);\n\t\t}\n\t\tauto iter = peer->pending_map.find(note->hash);\n\t\tif(iter != peer->pending_map.end()) {\n\t\t\tpeer->pending_cost = std::max<double>(peer->pending_cost - iter->second, 0);\n\t\t\tpeer->pending_map.erase(iter);\n\t\t}\n\t}\n}\n\nvoid Router::recv_notify(const hash_t& msg_hash)\n{\n\tauto note = ReceiveNote::create();\n\tnote->time = get_time_us();\n\tnote->hash = msg_hash;\n\tfor(const auto& entry : peer_map) {\n\t\tsend_to(entry.second, note, true);\n\t}\n}\n\nvoid Router::send()\n{\n\tconst auto now = get_time_us();\n\ttx_upload_credits += tx_upload_bandwidth * send_interval_ms / 1000;\n\ttx_upload_credits = std::min(tx_upload_credits, tx_upload_bandwidth);\n\n\tfor(const auto& entry : peer_map) {\n\t\tconst auto& peer = entry.second;\n\t\tfor(auto iter = peer->send_queue.begin(); iter != peer->send_queue.end() && iter->first < now;) {\n\t\t\tconst auto& item = iter->second;\n\t\t\tif(!peer->sent_hashes.count(item.hash)) {\n\t\t\t\tif(send_to(peer, item.value, item.reliable)) {\n\t\t\t\t\tif(peer->sent_hashes.insert(item.hash).second) {\n\t\t\t\t\t\tpeer->hash_queue.push(item.hash);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\titer = peer->send_queue.erase(iter);\n\t\t}\n\t}\n}\n\nvoid Router::send_to(\tstd::vector<std::shared_ptr<peer_t>> peers, std::shared_ptr<const vnx::Value> msg,\n\t\t\t\t\t\tconst hash_t& msg_hash, bool reliable)\n{\n\tstd::shuffle(peers.begin(), peers.end(), rand_engine);\n\n\tconst auto now = get_time_us();\n\tconst auto interval = (relay_target_ms * 1000) / (1 + peers.size());\n\tfor(size_t i = 0; i < peers.size(); ++i) {\n\t\tsend_item_t item;\n\t\titem.hash = msg_hash;\n\t\titem.value = msg;\n\t\titem.reliable = reliable;\n\t\tpeers[i]->send_queue.emplace(now + interval * i, item);\n\t}\n}\n\nvoid Router::relay(std::shared_ptr<const vnx::Value> msg, const hash_t& msg_hash, const std::set<node_type_e>& filter)\n{\n\tif(do_relay) {\n\t\tbroadcast(msg, msg_hash, filter, false);\n\t}\n}\n\nvoid Router::broadcast(\tstd::shared_ptr<const vnx::Value> msg, const hash_t& msg_hash,\n\t\t\t\t\t\tconst std::set<node_type_e>& filter, bool reliable, bool synced_only)\n{\n\tstd::vector<std::shared_ptr<peer_t>> peers;\n\tfor(const auto& entry : peer_map) {\n\t\tconst auto& peer = entry.second;\n\t\tif(!synced_only || peer->is_synced) {\n\t\t\tif(filter.empty() || filter.count(peer->info.type)) {\n\t\t\t\tpeers.push_back(peer);\n\t\t\t}\n\t\t}\n\t}\n\tsend_to(peers, msg, msg_hash, reliable);\n}\n\nbool Router::send_to(uint64_t client, std::shared_ptr<const vnx::Value> msg, bool reliable)\n{\n\tif(auto peer = find_peer(client)) {\n\t\treturn send_to(peer, msg, reliable);\n\t}\n\treturn false;\n}\n\nbool Router::send_to(std::shared_ptr<peer_t> peer, std::shared_ptr<const vnx::Value> msg, bool reliable)\n{\n\tif(!peer->is_valid) {\n\t\treturn false;\n\t}\n\tif(!reliable && peer->is_blocked) {\n\t\tbool drop = true;\n\t\tswitch(msg->get_type_hash()) {\n\t\t\tcase Block::VNX_TYPE_ID:\n\t\t\tcase ProofOfTime::VNX_TYPE_ID:\n\t\t\tcase ProofResponse::VNX_TYPE_ID:\n\t\t\t\tif(peer->write_queue_size < priority_queue_size) {\n\t\t\t\t\tdrop = false;\n\t\t\t\t}\n\t\t}\n\t\tif(drop) {\n\t\t\tswitch(msg->get_type_hash()) {\n\t\t\t\tcase Block::VNX_TYPE_ID: block_drop_counter++; break;\n\t\t\t\tcase Transaction::VNX_TYPE_ID: tx_drop_counter++; break;\n\t\t\t\tcase ProofOfTime::VNX_TYPE_ID: vdf_drop_counter++; break;\n\t\t\t\tcase ProofResponse::VNX_TYPE_ID: proof_drop_counter++; break;\n\t\t\t\tdefault:\n\t\t\t\t\tif(auto req = std::dynamic_pointer_cast<const Request>(msg)) {\n\t\t\t\t\t\tauto ret = Return::create();\n\t\t\t\t\t\tret->id = req->id;\n\t\t\t\t\t\tret->result = vnx::OverflowException::create();\n\t\t\t\t\t\tadd_task(std::bind(&Router::on_return, this, peer->client, ret));\n\t\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\tif(!reliable) {\n\t\tif(auto tx = std::dynamic_pointer_cast<const Transaction>(msg)) {\n\t\t\tif(peer->pending_cost >= max_pending_cost_value) {\n\t\t\t\ttx_drop_counter++;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tstd::uniform_real_distribution<double> dist(0, 1);\n\t\t\tif(dist(rand_engine) > tx_upload_credits / tx_upload_bandwidth) {\n\t\t\t\ttx_drop_counter++;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst auto cost = to_value(tx->static_cost, params);\n\t\t\tif(peer->pending_map.emplace(tx->content_hash, cost).second) {\n\t\t\t\tpeer->pending_cost += cost;\n\t\t\t}\n\t\t\ttx_upload_credits = std::max(tx_upload_credits - cost, 0.);\n\t\t\ttx_upload_sum += cost;\n\t\t}\n\t}\n\treturn Super::send_to(peer, msg);\n}\n\nvoid Router::send_all(std::shared_ptr<const vnx::Value> msg, const std::set<node_type_e>& filter, bool reliable)\n{\n\tfor(const auto& entry : peer_map) {\n\t\tconst auto& peer = entry.second;\n\t\tif(filter.empty() || filter.count(peer->info.type)) {\n\t\t\tsend_to(peer, msg, reliable);\n\t\t}\n\t}\n}\n\ntemplate<typename R, typename T>\nvoid Router::send_result(uint64_t client, uint32_t id, const T& value)\n{\n\tauto ret = Return::create();\n\tret->id = id;\n\tauto result = R::create();\n\tresult->_ret_0 = value;\n\tret->result = result;\n\tsend_to(client, ret);\n}\n\nvoid Router::on_error(uint64_t client, uint32_t id, const vnx::exception& ex)\n{\n\tauto ret = Return::create();\n\tret->id = id;\n\tret->result = ex.value();\n\tsend_to(client, ret);\n}\n\nvoid Router::on_request(uint64_t client, std::shared_ptr<const Request> msg)\n{\n\tconst auto method = msg->method;\n\tif(!method) {\n\t\treturn;\n\t}\n\tif(auto peer = find_peer(client)) {\n\t\tif(peer->is_blocked) {\n\t\t\tauto ret = Return::create();\n\t\t\tret->id = msg->id;\n\t\t\tret->result = vnx::OverflowException::create();\n\t\t\tsend_to(client, ret);\n\t\t\tpeer->is_paused = true;\n\t\t\treturn;\n\t\t}\n\t}\n\tswitch(method->get_type_hash())\n\t{\n\t\tcase Router_get_id::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Router_get_id>(method)) {\n\t\t\t\tsend_result<Router_get_id_return>(client, msg->id, get_id());\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Router_get_info::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Router_get_info>(method)) {\n\t\t\t\tsend_result<Router_get_info_return>(client, msg->id, get_info());\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Router_sign_msg::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Router_sign_msg>(method)) {\n\t\t\t\tsend_result<Router_sign_msg_return>(client, msg->id, sign_msg(value->msg));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Router_get_peers::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Router_get_peers>(method)) {\n\t\t\t\tsend_result<Router_get_peers_return>(client, msg->id, get_peers(value->max_count));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_height::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_height>(method)) {\n\t\t\t\tnode->get_height(\n\t\t\t\t\t\t[=](const uint32_t& height) {\n\t\t\t\t\t\t\tsend_result<Node_get_height_return>(client, msg->id, height);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstd::bind(&Router::on_error, this, client, msg->id, std::placeholders::_1));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_synced_height::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_synced_height>(method)) {\n\t\t\t\tnode->get_synced_height(\n\t\t\t\t\t\t[=](const vnx::optional<uint32_t>& height) {\n\t\t\t\t\t\t\tsend_result<Node_get_synced_height_return>(client, msg->id, height);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstd::bind(&Router::on_error, this, client, msg->id, std::placeholders::_1));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_block::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_block>(method)) {\n\t\t\t\tnode->get_block(value->hash,\n\t\t\t\t\t\t[=](std::shared_ptr<const Block> block) {\n\t\t\t\t\t\t\tupload_counter++;\n\t\t\t\t\t\t\tsend_result<Node_get_block_return>(client, msg->id, block);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstd::bind(&Router::on_error, this, client, msg->id, std::placeholders::_1));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_block_at::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_block_at>(method)) {\n\t\t\t\tnode->get_block_at(value->height,\n\t\t\t\t\t\t[=](std::shared_ptr<const Block> block) {\n\t\t\t\t\t\t\tupload_counter++;\n\t\t\t\t\t\t\tsend_result<Node_get_block_at_return>(client, msg->id, block);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstd::bind(&Router::on_error, this, client, msg->id, std::placeholders::_1));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_block_hash::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_block_hash>(method)) {\n\t\t\t\tnode->get_block_hash(value->height,\n\t\t\t\t\t\t[=](const vnx::optional<hash_t>& hash) {\n\t\t\t\t\t\t\tsend_result<Node_get_block_hash_return>(client, msg->id, hash);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstd::bind(&Router::on_error, this, client, msg->id, std::placeholders::_1));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_block_hash_ex::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_block_hash_ex>(method)) {\n\t\t\t\tnode->get_block_hash_ex(value->height,\n\t\t\t\t\t\t[=](const vnx::optional<std::pair<hash_t, hash_t>>& hash) {\n\t\t\t\t\t\t\tsend_result<Node_get_block_hash_ex_return>(client, msg->id, hash);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstd::bind(&Router::on_error, this, client, msg->id, std::placeholders::_1));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_header::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_header>(method)) {\n\t\t\t\tnode->get_header(value->hash,\n\t\t\t\t\t\t[=](std::shared_ptr<const BlockHeader> block) {\n\t\t\t\t\t\t\tsend_result<Node_get_header_return>(client, msg->id, block);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstd::bind(&Router::on_error, this, client, msg->id, std::placeholders::_1));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_header_at::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_header_at>(method)) {\n\t\t\t\tnode->get_header_at(value->height,\n\t\t\t\t\t\t[=](std::shared_ptr<const BlockHeader> block) {\n\t\t\t\t\t\t\tsend_result<Node_get_header_at_return>(client, msg->id, block);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstd::bind(&Router::on_error, this, client, msg->id, std::placeholders::_1));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_tx_ids_at::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_tx_ids_at>(method)) {\n\t\t\t\tnode->get_tx_ids_at(value->height,\n\t\t\t\t\t\t[=](const std::vector<hash_t>& ids) {\n\t\t\t\t\t\t\tsend_result<Node_get_tx_ids_at_return>(client, msg->id, ids);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstd::bind(&Router::on_error, this, client, msg->id, std::placeholders::_1));\n\t\t\t}\n\t\t\tbreak;\n\t\tdefault: {\n\t\t\tauto ret = Return::create();\n\t\t\tret->id = msg->id;\n\t\t\tret->result = vnx::NoSuchMethod::create();\n\t\t\tsend_to(client, ret);\n\t\t}\n\t}\n}\n\nvoid Router::on_return(uint64_t client, std::shared_ptr<const Return> msg)\n{\n\tif(process(msg)) {\n\t\treturn;\n\t}\n\tconst auto result = msg->result;\n\tif(!result) {\n\t\treturn;\n\t}\n\tswitch(result->get_type_hash())\n\t{\n\t\tcase Router_get_id_return::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Router_get_id_return>(result)) {\n\t\t\t\tconst auto& id = value->_ret_0;\n\t\t\t\tif(id == get_id()) {\n\t\t\t\t\tif(auto peer = find_peer(client)) {\n\t\t\t\t\t\tlog(INFO) << \"Discovered our own address: \" << peer->address;\n\t\t\t\t\t\tself_addrs.insert(peer->address);\n\t\t\t\t\t\tblock_peers.insert(peer->address);\n\t\t\t\t\t}\n\t\t\t\t\tdisconnect(client);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Router_get_info_return::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Router_get_info_return>(result)) {\n\t\t\t\tif(auto peer = find_peer(client)) {\n\t\t\t\t\tconst auto& info = value->_ret_0;\n\t\t\t\t\tif(info.version >= 103) {\n\t\t\t\t\t\tauto req = Router_sign_msg::create();\n\t\t\t\t\t\treq->msg = peer->challenge;\n\t\t\t\t\t\tsend_request(peer, req);\n\t\t\t\t\t}\n\t\t\t\t\tpeer->info = info;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Router_sign_msg_return::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Router_sign_msg_return>(result)) {\n\t\t\t\tif(auto peer = find_peer(client)) {\n\t\t\t\t\tconst auto& key = value->_ret_0.first;\n\t\t\t\t\tconst auto& sig = value->_ret_0.second;\n\t\t\t\t\tconst auto id = key.get_addr();\n\t\t\t\t\tif(id == peer->info.id && sig.verify(key, peer->challenge)) {\n\t\t\t\t\t\tfor(const auto& entry : peer_map) {\n\t\t\t\t\t\t\tconst auto& existing = entry.second;\n\t\t\t\t\t\t\tif(existing->node_id && id == *existing->node_id) {\n\t\t\t\t\t\t\t\tlog(INFO) << \"Replacing connection to \" << existing->address << \" with new address \" << peer->address;\n\t\t\t\t\t\t\t\tdisconnect(existing->client);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpeer->node_id = id;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlog(WARN) << \"Node ID verification for peer \" << peer->address << \" failed!\";\n\t\t\t\t\t\tdisconnect(client);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Router_get_peers_return::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Router_get_peers_return>(result)) {\n\t\t\t\tsize_t i = 0;\n\t\t\t\tfor(const auto& address : value->_ret_0) {\n\t\t\t\t\tif(is_valid_address(address) && vnx::is_valid_ip_addr(address)) {\n\t\t\t\t\t\tpeer_retry_map.emplace(address, 0);\n\t\t\t\t\t}\n\t\t\t\t\tif(++i >= 10) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_height_return::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_height_return>(result)) {\n\t\t\t\tif(auto peer = find_peer(client)) {\n\t\t\t\t\tpeer->height = value->_ret_0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_synced_height_return::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_synced_height_return>(result)) {\n\t\t\t\tif(auto peer = find_peer(client)) {\n\t\t\t\t\tif(last_query_ms) {\n\t\t\t\t\t\tpeer->ping_ms = get_time_ms() - last_query_ms;\n\t\t\t\t\t}\n\t\t\t\t\tif(auto height = value->_ret_0) {\n\t\t\t\t\t\tif(!peer->is_synced) {\n\t\t\t\t\t\t\tlog(INFO) << \"Peer \" << peer->address << \" is synced at height \" << *height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpeer->height = *height;\n\t\t\t\t\t\tpeer->is_synced = true;\n\t\t\t\t\t\tif(peer->info.type == node_type_e::FULL_NODE) {\n\t\t\t\t\t\t\tsynced_peers.insert(client);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tif(peer->is_synced) {\n\t\t\t\t\t\t\tlog(INFO) << \"Peer \" << peer->address << \" is not synced\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpeer->is_synced = false;\n\t\t\t\t\t\tsynced_peers.erase(client);\n\n\t\t\t\t\t\t// check their height\n\t\t\t\t\t\tsend_request(client, Node_get_height::create());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\tcase Node_get_block_hash_return::VNX_TYPE_ID:\n\t\t\tif(auto value = std::dynamic_pointer_cast<const Node_get_block_hash_return>(result)) {\n\t\t\t\tif(msg->id == peer_check.request_id) {\n\t\t\t\t\tconst auto hash = value->_ret_0;\n\t\t\t\t\tif(!hash || *hash != peer_check.our_hash) {\n\t\t\t\t\t\tif(auto peer = find_peer(client)) {\n\t\t\t\t\t\t\tif(peer->is_synced) {\n\t\t\t\t\t\t\t\tlog(INFO) << \"Peer \" << peer->address << \" is on different chain at height \" << peer_check.height;\n\t\t\t\t\t\t\t\tdisconnect(client);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t}\n}\n\nvoid Router::on_msg(uint64_t client, std::shared_ptr<const vnx::Value> msg)\n{\n\tif(auto peer = find_peer(client)) {\n\t\tpeer->last_receive_ms = get_time_ms();\n\t}\n\tswitch(msg->get_type_hash())\n\t{\n\tcase ProofOfTime::VNX_TYPE_ID:\n\t\tif(auto value = std::dynamic_pointer_cast<const ProofOfTime>(msg)) {\n\t\t\ton_vdf(client, value);\n\t\t}\n\t\tbreak;\n\tcase VDF_Point::VNX_TYPE_ID:\n\t\tif(auto value = std::dynamic_pointer_cast<const VDF_Point>(msg)) {\n\t\t\ton_vdf_point(client, value);\n\t\t}\n\t\tbreak;\n\tcase ProofResponse::VNX_TYPE_ID:\n\t\tif(auto value = std::dynamic_pointer_cast<const ProofResponse>(msg)) {\n\t\t\ton_proof(client, value);\n\t\t}\n\t\tbreak;\n\tcase Block::VNX_TYPE_ID:\n\t\tif(auto value = std::dynamic_pointer_cast<const Block>(msg)) {\n\t\t\ton_block(client, value);\n\t\t}\n\t\tbreak;\n\tcase ValidatorVote::VNX_TYPE_ID:\n\t\tif(auto value = std::dynamic_pointer_cast<const ValidatorVote>(msg)) {\n\t\t\ton_vote(client, value);\n\t\t}\n\t\tbreak;\n\tcase Transaction::VNX_TYPE_ID:\n\t\tif(auto value = std::dynamic_pointer_cast<const Transaction>(msg)) {\n\t\t\ton_transaction(client, value);\n\t\t}\n\t\tbreak;\n\tcase Request::VNX_TYPE_ID:\n\t\tif(auto value = std::dynamic_pointer_cast<const Request>(msg)) {\n\t\t\ton_request(client, value);\n\t\t}\n\t\tbreak;\n\tcase Return::VNX_TYPE_ID:\n\t\tif(auto value = std::dynamic_pointer_cast<const Return>(msg)) {\n\t\t\ton_return(client, value);\n\t\t}\n\t\tbreak;\n\tcase ReceiveNote::VNX_TYPE_ID:\n\t\tif(auto value = std::dynamic_pointer_cast<const ReceiveNote>(msg)) {\n\t\t\ton_recv_note(client, value);\n\t\t}\n\t\tbreak;\n\t}\n}\n\nvoid Router::on_pause(uint64_t client)\n{\n\tif(auto peer = find_peer(client)) {\n\t\tpeer->is_blocked = true;\n\t}\n}\n\nvoid Router::on_resume(uint64_t client)\n{\n\tif(auto peer = find_peer(client)) {\n\t\tif(peer->is_paused) {\n\t\t\tresume(client);\t\t// continue receiving as well again\n\t\t\tpeer->is_paused = false;\n\t\t}\n\t\tpeer->is_blocked = false;\n\t}\n}\n\nvoid Router::on_connect(uint64_t client, const std::string& host_name)\n{\n\tconst auto address = resolve(host_name);\n\tif(block_peers.count(address)) {\n\t\tdisconnect(client);\n\t\treturn;\n\t}\n\tauto peer = std::make_shared<peer_t>();\n\tpeer->client = client;\n\tpeer->address = address;\n\tpeer->host_name = host_name;\n\tpeer->challenge = hash_t::random();\n\tpeer->info.type = node_type_e::FULL_NODE;\t// assume full node\n\tpeer->connected_since_ms = get_time_ms();\n\t{\n\t\tconst auto it = connect_tasks.find(host_name);\n\t\tif(it != connect_tasks.end() && it->second == client) {\n\t\t\t// we connected to them\n\t\t\tpeer->is_outbound = true;\n\t\t\tpeer_set.insert(address);\n\t\t\tconnect_tasks.erase(it);\n\t\t}\n\t}\n\tpeer_map[client] = peer;\n\tpeer_addr_map.emplace(address, peer);\n\n\tsend_request(peer, Router_get_id::create());\n\tsend_request(peer, Router_get_info::create());\n\tsend_request(peer, Node_get_synced_height::create());\n\n\tif(peer_set.size() < max_peer_set) {\n\t\tsend_request(peer, Router_get_peers::create());\n\t}\n\tfor(const auto& entry : vdf_history) {\n\t\tsend_to(peer, entry.second);\t// make sure peer has all needed VDFs for next block\n\t}\n\tlog(DEBUG) << \"Connected to peer \" << peer->address;\n}\n\nvoid Router::on_disconnect(uint64_t client, const std::string& host_name)\n{\n\tif(auto peer = find_peer(client)) {\n\t\tpeer->is_valid = false;\n\t}\n\t// async processing to allow for() loops over peer_map, etc\n\tadd_task([this, client, host_name]() {\n\t\tif(auto peer = find_peer(client)) {\n\t\t\tconst auto range = peer_addr_map.equal_range(peer->address);\n\t\t\tfor(auto iter = range.first; iter != range.second; ++iter) {\n\t\t\t\tif(iter->second == peer) {\n\t\t\t\t\tpeer_addr_map.erase(iter);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlog(DEBUG) << \"Peer \" << host_name << \" disconnected\";\n\t\t}\n\t\tconst auto address = resolve(host_name);\n\t\t{\n\t\t\tconst auto it = connect_tasks.find(host_name);\n\t\t\tif(it != connect_tasks.end() && it->second == client) {\n\t\t\t\tlog(DEBUG) << \"Failed to connect to \" << host_name;\n\t\t\t\tpeer_set.erase(host_name);\n\t\t\t\tpeer_set.erase(address);\n\t\t\t\tconnect_tasks.erase(it);\n\t\t\t}\n\t\t}\n\t\tpeer_map.erase(client);\n\t\tsynced_peers.erase(client);\n\t\tpeer_retry_map[address] = get_time_sec() + peer_retry_interval * 60;\n\t});\n}\n\nstd::shared_ptr<Router::Super::peer_t> Router::get_peer_base(uint64_t client) const\n{\n\treturn get_peer(client);\n}\n\nstd::shared_ptr<Router::peer_t> Router::get_peer(uint64_t client) const\n{\n\tif(auto peer = find_peer(client)) {\n\t\treturn peer;\n\t}\n\tthrow std::logic_error(\"no such peer\");\n}\n\nstd::shared_ptr<Router::peer_t> Router::find_peer(uint64_t client) const\n{\n\tauto iter = peer_map.find(client);\n\tif(iter != peer_map.end()) {\n\t\treturn iter->second;\n\t}\n\treturn nullptr;\n}\n\nstd::vector<std::shared_ptr<Router::peer_t>> Router::find_peers(const std::string& address) const\n{\n\tstd::vector<std::shared_ptr<Router::peer_t>> out;\n\tconst auto range = peer_addr_map.equal_range(address);\n\tfor(auto iter = range.first; iter != range.second; ++iter) {\n\t\tout.push_back(iter->second);\n\t}\n\treturn out;\n}\n\nbool Router::relay_msg_hash(const hash_t& hash)\n{\n\tconst auto ret = hash_info.emplace(hash, hash_info_t());\n\tif(ret.second) {\n\t\trecv_notify(hash);\n\t\thash_queue.push(hash);\n\t}\n\tauto& did_relay = ret.first->second.did_relay;\n\tif(!did_relay) {\n\t\tdid_relay = true;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nbool Router::receive_msg_hash(const hash_t& hash, uint64_t client)\n{\n\tconst auto ret = hash_info.emplace(hash, hash_info_t());\n\tif(ret.second) {\n\t\trecv_notify(hash);\n\t\thash_queue.push(hash);\n\t}\n\tif(auto peer = find_peer(client)) {\n\t\tif(peer->sent_hashes.insert(hash).second) {\n\t\t\tpeer->hash_queue.push(hash);\n\t\t}\n\t}\n\treturn ret.second;\n}\n\nvoid Router::http_request_async(std::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\tconst vnx::request_id_t& request_id) const\n{\n\thttp->http_request(request, sub_path, request_id, vnx_request->session);\n}\n\nvoid Router::http_request_chunk_async(\tstd::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\t\t\tconst int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& request_id) const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Solution.cpp",
    "content": "/*\n * Solution.cpp\n *\n *  Created on: Jan 15, 2022\n *      Author: mad\n */\n\n#include <mmx/Solution.hxx>\n\n\nnamespace mmx {\n\nvnx::bool_t Solution::is_valid() const\n{\n\treturn version == 0;\n}\n\nhash_t Solution::calc_hash() const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\nuint64_t Solution::calc_cost(std::shared_ptr<const ChainParams> params) const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/TimeLord.cpp",
    "content": "/*\n * TimeLord.cpp\n *\n *  Created on: Dec 6, 2021\n *      Author: mad\n */\n\n#include <mmx/TimeLord.h>\n#include <mmx/ProofOfTime.hxx>\n#include <mmx/WalletClient.hxx>\n#include <mmx/utils.h>\n#include <mmx/helpers.h>\n\n#include <vnx/vnx.h>\n\n#include <sha256_ni.h>\n#include <sha256_arm.h>\n\n\nnamespace mmx {\n\nTimeLord::TimeLord(const std::string& _vnx_name)\n\t:\tTimeLordBase(_vnx_name)\n{\n\tsegment_iters = get_params()->vdf_segment_size;\n}\n\nvoid TimeLord::init()\n{\n\tsubscribe(input_request, 1000);\n\n\tvnx::open_pipe(vnx_name, this, 1000);\n}\n\nvoid TimeLord::main()\n{\n\tif(!reward_addr) {\n\t\ttry {\n\t\t\tWalletClient wallet(wallet_server);\n\t\t\tfor(const auto& entry : wallet.get_all_accounts()) {\n\t\t\t\tif(entry.address) {\n\t\t\t\t\treward_addr = entry.address;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!reward_addr) {\n\t\t\t\tthrow std::logic_error(\"no wallet available\");\n\t\t\t}\n\t\t}\n\t\tcatch(const std::exception& ex) {\n\t\t\tlog(WARN) << \"Failed to get reward address from wallet: \" << ex.what();\n\t\t}\n\t}\n\tif(reward_addr) {\n\t\tlog(INFO) << \"Reward address: \" << reward_addr->to_string();\n\t} else {\n\t\tlog(WARN) << \"Reward is disabled!\";\n\t}\n\t{\n\t\tvnx::File file(storage_path + \"timelord_sk.dat\");\n\t\tif(file.exists()) {\n\t\t\ttry {\n\t\t\t\tfile.open(\"rb\");\n\t\t\t\tvnx::read_generic(file.in, timelord_sk);\n\t\t\t\tfile.close();\n\t\t\t}\n\t\t\tcatch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"Failed to read key from file: \" << ex.what();\n\t\t\t}\n\t\t}\n\t\tif(timelord_sk == skey_t()) {\n\t\t\ttimelord_sk = skey_t(hash_t::random());\n\t\t\ttry {\n\t\t\t\tfile.open(\"wb\");\n\t\t\t\tvnx::write_generic(file.out, timelord_sk);\n\t\t\t\tfile.close();\n\t\t\t}\n\t\t\tcatch(const std::exception& ex) {\n\t\t\t\tlog(WARN) << \"Failed to write key to file: \" << ex.what();\n\t\t\t}\n\t\t}\n\t\ttimelord_key = pubkey_t(timelord_sk);\n\t\tlog(INFO) << \"Timelord Key: \" << timelord_key;\n\t}\n\n\tset_timer_millis(10000, std::bind(&TimeLord::print_info, this));\n\n\tset_timer_millis(2000, [this]() {\n\t\tpeak_iters = 0;\t\t// force new output\n\t});\n\n\tlog(DEBUG) << \"vdf_segment_size = \" << segment_iters;\n\n\tvdf_thread = std::thread(&TimeLord::vdf_loop, this);\n\n\tSuper::main();\n\n\tvdf_signal.notify_all();\n\tvdf_thread.join();\n}\n\nvoid TimeLord::start_vdf(vdf_point_t begin)\n{\n\tif(!do_run) {\n\t\tdo_run = true;\n\t\tis_reset = true;\n\t\tpeak = std::make_shared<vdf_point_t>(begin);\n\t\tlog(INFO) << \"Started VDF at \" << begin.num_iters;\n\t\tvdf_signal.notify_all();\n\t}\n}\n\nvoid TimeLord::stop_vdf()\n{\n\tstd::lock_guard<std::mutex> lock(mutex);\n\tdo_run = false;\n\tpeak = nullptr;\n\tpeak_iters = 0;\n\thistory.clear();\n\tinfuse.clear();\n}\n\nvoid TimeLord::handle(std::shared_ptr<const IntervalRequest> req)\n{\n\tstd::lock_guard<std::mutex> lock(mutex);\n\n\tconst auto start = req->start;\n\tconst auto end = req->end;\n\n\t// clear obsolete requests + infusions in-between\n\tinfuse.erase( infuse.upper_bound(start),  infuse.lower_bound(end));\n\tpending.erase(pending.upper_bound(start), pending.lower_bound(end));\n\n\t{\n\t\tconst bool passed = peak && start <= peak->num_iters;\n\n\t\tbool is_fork = false;\n\t\tauto iter = infuse.find(start);\n\t\tif(iter != infuse.end()) {\n\t\t\tif(passed && req->infuse != iter->second) {\n\t\t\t\tis_fork = true;\n\t\t\t\tlog(WARN) << \"Infusion value at \" << start << \" changed, restarting ...\";\n\t\t\t}\n\t\t} else {\n\t\t\tif(passed) {\n\t\t\t\tis_fork = true;\n\t\t\t\tlog(WARN) << \"Missed infusion at \" << start << \" iterations, restarting ...\";\n\t\t\t}\n\t\t\tlog(DEBUG) << \"Infusing at \" << start << \" iterations: \" << req->infuse;\n\t\t}\n\t\tinfuse[start] = req->infuse;\n\n\t\tif(is_fork) {\n\t\t\tvdf_point_t begin;\n\t\t\tbegin.output = history[start];\n\t\t\tbegin.num_iters = start;\n\t\t\tpeak = std::make_shared<vdf_point_t>(begin);\n\t\t\tis_reset = true;\n\t\t}\n\t}\n\n\tif(auto input = req->input)\n\t{\n\t\tvdf_point_t begin;\n\t\tbegin.output = *input;\n\t\tbegin.num_iters = start;\n\n\t\tif(do_run) {\n\t\t\tconst bool is_fork = peak\n\t\t\t\t\t&& find_value(history, start) != input\n\t\t\t\t\t&& (!is_reset || start > peak->num_iters);\n\t\t\tif(is_fork) {\n\t\t\t\tif(start >= peak->num_iters) {\n\t\t\t\t\tif(!is_reset) {\n\t\t\t\t\t\tlog(DEBUG) << \"Another Timelord was faster, restarting ...\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlog(INFO) << \"Our VDF forked from the network, restarting ...\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!peak || is_fork || begin.num_iters > peak->num_iters) {\n\t\t\t\t// another timelord is faster\n\t\t\t\tpeak = std::make_shared<vdf_point_t>(begin);\n\t\t\t\tis_reset = true;\n\t\t\t}\n\t\t} else {\n\t\t\tstart_vdf(begin);\n\t\t}\n\t}\n\n\tif(is_reset) {\n\t\tpeak_iters = 0;\n\t}\n\tif(req->end > peak_iters) {\n\t\tpending[end] = req;\n\t}\n\tif(peak && peak->num_iters >= end) {\n\t\tadd_task(std::bind(&TimeLord::update, this));\n\t}\n}\n\nvoid TimeLord::update()\n{\n\tstd::unique_lock<std::mutex> lock(mutex);\n\n\t// clear old requests first\n\tif(!history.empty()) {\n\t\tconst auto begin = history.begin()->first;\n\t\tpending.erase(pending.begin(), pending.lower_bound(begin));\n\t}\n\tstd::vector<std::shared_ptr<ProofOfTime>> out;\n\n\tfor(auto iter = pending.begin(); iter != pending.end();)\n\t{\n\t\tconst auto req = iter->second;\n\n\t\tauto end = history.find(req->end);\n\t\tif(end != history.end())\n\t\t{\n\t\t\tauto begin = history.find(req->start);\n\t\t\tif(begin != history.end())\n\t\t\t{\n\t\t\t\tauto proof = ProofOfTime::create();\n\t\t\t\tproof->vdf_height = req->vdf_height;\n\t\t\t\tproof->start = req->start;\n\t\t\t\tproof->num_iters = req->end - req->start;\n\t\t\t\tproof->segment_size = segment_iters;\n\t\t\t\tproof->input = begin->second;\n\t\t\t\tproof->prev = req->infuse;\n\t\t\t\tproof->reward_addr = reward_addr ? *reward_addr : addr_t();\n\t\t\t\tproof->timelord_key = timelord_key;\n\t\t\t\tproof->segments.reserve(1024);\n\n\t\t\t\tend++;\n\t\t\t\tbegin++;\n\t\t\t\tfor(auto iter = begin; iter != end; ++iter) {\n\t\t\t\t\tproof->segments.push_back(iter->second);\n\t\t\t\t}\n\t\t\t\tout.push_back(proof);\n\t\t\t\tpeak_iters = req->end;\n\t\t\t}\n\t\t\titer = pending.erase(iter);\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\twhile(infuse.size() > 1000) {\n\t\tinfuse.erase(infuse.begin());\n\t}\n\twhile(history.size() > max_history) {\n\t\thistory.erase(history.begin());\n\t}\n\n\tlock.unlock();\t// --------------------------------------------------------------------------------------------\n\n\tfor(auto proof : out) {\n\t\tproof->hash = proof->calc_hash();\n\t\tproof->timelord_sig = signature_t::sign(timelord_sk, proof->hash);\n\t\tproof->content_hash = proof->calc_content_hash();\n\n\t\tpublish(proof, output_proofs);\n\n\t\tlog(DEBUG) << \"Created VDF for height \" << proof->vdf_height << \" with \" << proof->segments.size() << \" segments\";\n\t}\n}\n\nvoid TimeLord::vdf_loop()\n{\n\tvdf_point_t point;\n\tbool is_running = false;\n\n\twhile(vnx_do_run()) {\n\t\t{\n\t\t\tstd::unique_lock<std::mutex> lock(mutex);\n\n\t\t\twhile(vnx_do_run() && !do_run) {\n\t\t\t\tif(is_running) {\n\t\t\t\t\tis_running = false;\n\t\t\t\t\tlog(INFO) << \"Stopped VDF\";\n\t\t\t\t}\n\t\t\t\tvdf_signal.wait(lock);\n\t\t\t}\n\t\t\tis_running = true;\n\n\t\t\tif(is_reset) {\n\t\t\t\tpoint = *peak;\n\t\t\t\thistory.clear();\n\t\t\t\tis_reset = false;\n\t\t\t\tlog(DEBUG) << \"Restarted VDF at \" << point.num_iters;\n\t\t\t} else {\n\t\t\t\tif(!peak) {\n\t\t\t\t\tpeak = std::make_shared<vdf_point_t>();\n\t\t\t\t}\n\t\t\t\t*peak = point;\n\t\t\t}\n\t\t\thistory[point.num_iters] = point.output;\n\n\t\t\tif(pending.count(point.num_iters)) {\n\t\t\t\tadd_task(std::bind(&TimeLord::update, this));\n\t\t\t}\n\n\t\t\t// apply infusion\n\t\t\tauto iter = infuse.find(point.num_iters);\n\t\t\tif(iter != infuse.end()) {\n\t\t\t\tpoint.output = hash_t(point.output + iter->second);\n\t\t\t\tpoint.output = hash_t(point.output + (reward_addr ? *reward_addr : addr_t()));\n\t\t\t}\n\t\t}\n\t\tconst auto time_begin = get_time_us();\n\n\t\tpoint.output = compute(point.output, segment_iters);\n\t\tpoint.num_iters += segment_iters;\n\n\t\t// update estimated speed\n\t\tconst auto time_end = get_time_us();\n\t\tif(time_end > time_begin) {\n\t\t\tconst auto speed = (segment_iters * 1000000) / (time_end - time_begin);\n\t\t\tavg_iters_per_sec = (avg_iters_per_sec * 1023 + speed) / 1024;\n\t\t}\n\t}\n}\n\nhash_t TimeLord::compute(const hash_t& input, const uint64_t num_iters)\n{\n\tstatic bool have_sha_ni = sha256_ni_available();\n\tstatic bool have_sha_arm = sha256_arm_available();\n\n\thash_t hash = input;\n\tif(have_sha_ni) {\n\t\trecursive_sha256_ni(hash.data(), num_iters);\n\t} else if(have_sha_arm) {\n\t\trecursive_sha256_arm(hash.data(), num_iters);\n\t} else {\n\t\tfor(uint64_t i = 0; i < num_iters; ++i) {\n\t\t\thash = hash_t(hash.bytes);\n\t\t}\n\t}\n\treturn hash;\n}\n\nvoid TimeLord::print_info()\n{\n\tif(do_run) {\n\t\tlog(INFO) << double(avg_iters_per_sec) / 1e6 << \" MH/s\";\n\t}\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Transaction.cpp",
    "content": "/*\n * Transaction.cpp\n *\n *  Created on: Nov 27, 2021\n *      Author: mad\n */\n\n#include <mmx/Transaction.hxx>\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/solution/PubKey.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/txio_t.hpp>\n\n\nnamespace mmx {\n\nhash_t TransactionBase::calc_hash(const vnx::bool_t& full_hash) const {\n\treturn id;\n}\n\nuint64_t TransactionBase::calc_cost(std::shared_ptr<const ChainParams> params) const {\n\treturn 0;\n}\n\nstd::shared_ptr<const TransactionBase> TransactionBase::create_ex(const hash_t& id)\n{\n\tauto tx = TransactionBase::create();\n\ttx->id = id;\n\treturn tx;\n}\n\nvoid Transaction::reset(std::shared_ptr<const ChainParams> params)\n{\n\texec_result = nullptr;\n\tstatic_cost = calc_cost(params);\n\tcontent_hash = calc_hash(true);\n}\n\nvoid Transaction::update(const exec_result_t& result, std::shared_ptr<const ChainParams> params)\n{\n\texec_result = result;\n\tstatic_cost = calc_cost(params);\n\tcontent_hash = calc_hash(true);\n}\n\nvoid Transaction::finalize()\n{\n\twhile(!nonce) {\n\t\tnonce = vnx::rand64();\n\t}\n\tid = calc_hash();\n}\n\nvnx::bool_t Transaction::is_valid(std::shared_ptr<const ChainParams> params) const\n{\n\tif(!params) {\n\t\tthrow std::logic_error(\"!params\");\n\t}\n\tfor(const auto& in : inputs) {\n\t\tif(in.memo && in.memo->size() > txio_t::MAX_MEMO_SIZE) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tfor(const auto& out : outputs) {\n\t\tif(out.memo && out.memo->size() > txio_t::MAX_MEMO_SIZE) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tfor(const auto& op : execute) {\n\t\tif(!op || !op->is_valid()) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tfor(const auto& sol : solutions) {\n\t\tif(!sol || !sol->is_valid()) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn version == 0 && nonce\n\t\t\t&& fee_ratio >= 1024\n\t\t\t&& network == params->network\n\t\t\t&& solutions.size() <= MAX_SOLUTIONS\n\t\t\t&& (!exec_result || exec_result->is_valid())\n\t\t\t&& static_cost == calc_cost(params)\n\t\t\t&& id == calc_hash()\n\t\t\t&& content_hash == calc_hash(true);\n}\n\nvnx::bool_t Transaction::did_fail() const\n{\n\tif(!exec_result) {\n\t\tthrow std::logic_error(\"tx not executed yet\");\n\t}\n\treturn exec_result->did_fail;\n}\n\nstd::vector<uint8_t> Transaction::hash_serialize(const vnx::bool_t& full_hash) const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\tbuffer.reserve(4 * 1024);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", version);\n\twrite_field(out, \"expires\", expires);\n\twrite_field(out, \"fee_ratio\", fee_ratio);\n\twrite_field(out, \"max_fee_amount\", max_fee_amount);\n\twrite_field(out, \"note\", \tnote);\n\twrite_field(out, \"nonce\", \tnonce);\n\twrite_field(out, \"network\", network);\n\twrite_field(out, \"sender\",\tsender);\n\twrite_field(out, \"inputs\",\tinputs, full_hash);\n\twrite_field(out, \"outputs\", outputs);\n\twrite_field(out, \"execute\");\n\twrite_bytes(out, uint32_t(execute.size()));\n\tfor(const auto& op : execute) {\n\t\twrite_bytes(out, op ? op->calc_hash(full_hash) : hash_t());\n\t}\n\twrite_field(out, \"deploy\", deploy ? deploy->calc_hash(full_hash) : hash_t());\n\n\tif(full_hash) {\n\t\twrite_field(out, \"static_cost\", static_cost);\n\t\twrite_field(out, \"solutions\");\n\t\twrite_bytes(out, uint32_t(solutions.size()));\n\t\tfor(const auto& sol : solutions) {\n\t\t\twrite_bytes(out, sol ? sol->calc_hash() : hash_t());\n\t\t}\n\t\twrite_field(out, \"exec_result\", exec_result ? exec_result->calc_hash() : hash_t());\n\t}\n\tout.flush();\n\n\treturn buffer;\n}\n\nhash_t Transaction::calc_hash(const vnx::bool_t& full_hash) const\n{\n\treturn hash_t(hash_serialize(full_hash));\n}\n\nvoid Transaction::add_input(const addr_t& currency, const addr_t& address, const uint128& amount)\n{\n\ttxin_t in;\n\tin.address = address;\n\tin.contract = currency;\n\tin.amount = amount;\n\tinputs.push_back(in);\n}\n\nvoid Transaction::add_output(const addr_t& currency, const addr_t& address, const uint128& amount, const vnx::optional<std::string>& memo)\n{\n\tif(memo && memo->size() > txio_t::MAX_MEMO_SIZE) {\n\t\tthrow std::logic_error(\"memo too long\");\n\t}\n\ttxout_t out;\n\tout.address = address;\n\tout.contract = currency;\n\tout.amount = amount;\n\tout.memo = memo;\n\toutputs.push_back(out);\n}\n\nstd::shared_ptr<const Solution> Transaction::get_solution(const uint32_t& index) const\n{\n\tif(index < solutions.size()) {\n\t\treturn solutions[index];\n\t}\n\treturn nullptr;\n}\n\nstd::vector<txin_t> Transaction::get_inputs() const\n{\n\tauto res = inputs;\n\tif(exec_result) {\n\t\tres.insert(res.end(), exec_result->inputs.begin(), exec_result->inputs.end());\n\t}\n\treturn res;\n}\n\nstd::vector<txout_t> Transaction::get_outputs() const\n{\n\tauto res = outputs;\n\tif(exec_result) {\n\t\tres.insert(res.end(), exec_result->outputs.begin(), exec_result->outputs.end());\n\t}\n\treturn res;\n}\n\nstd::vector<std::shared_ptr<const Operation>> Transaction::get_operations() const\n{\n\treturn execute;\n}\n\nuint64_t Transaction::calc_cost(std::shared_ptr<const ChainParams> params) const\n{\n\tif(!params) {\n\t\tthrow std::logic_error(\"!params\");\n\t}\n\tuint128_t cost = params->min_txfee;\n\tcost += execute.size() * params->min_txfee_exec;\n\n\tif(exec_result) {\n\t\tcost += exec_result->calc_cost(params);\n\t}\n\tfor(const auto& in : inputs) {\n\t\tcost += in.calc_cost(params);\n\t}\n\tfor(const auto& out : outputs) {\n\t\tcost += out.calc_cost(params);\n\t}\n\tfor(const auto& op : execute) {\n\t\tif(op) {\n\t\t\tcost += op->calc_cost(params);\n\t\t}\n\t}\n\tfor(const auto& sol : solutions) {\n\t\tif(sol) {\n\t\t\tcost += sol->calc_cost(params);\n\t\t}\n\t}\n\tif(deploy) {\n\t\tcost += params->min_txfee_deploy + deploy->calc_cost(params);\n\t}\n\tif(cost >> 64) {\n\t\tthrow std::logic_error(\"tx cost amount overflow\");\n\t}\n\treturn cost;\n}\n\nvoid Transaction::merge_sign(std::shared_ptr<const Transaction> tx)\n{\n\tstd::unordered_map<uint32_t, uint32_t> import_map;\n\tfor(size_t i = 0; i < inputs.size() && i < tx->inputs.size(); ++i)\n\t{\n\t\tauto& our = inputs[i];\n\t\tconst auto& other = tx->inputs[i];\n\n\t\tif(other.solution < tx->solutions.size() && our.solution >= solutions.size())\n\t\t{\n\t\t\tauto iter = import_map.find(other.solution);\n\t\t\tif(iter != import_map.end()) {\n\t\t\t\tour.solution = iter->second;\n\t\t\t} else {\n\t\t\t\tour.solution = solutions.size();\n\t\t\t\timport_map[other.solution] = our.solution;\n\t\t\t\tsolutions.push_back(tx->solutions[other.solution]);\n\t\t\t}\n\t\t}\n\t}\n}\n\nvnx::bool_t Transaction::is_signed() const\n{\n\tfor(const auto& in : inputs) {\n\t\tif(in.solution >= solutions.size()) {\n\t\t\treturn false;\n\t\t}\n\t\t// TODO: handle multi-sig\n\t}\n\treturn true;\n}\n\nstd::map<addr_t, std::pair<uint128, uint128>> Transaction::get_balance() const\n{\n\tstd::map<addr_t, std::pair<uint128, uint128>> balance;\n\tfor(const auto& in : get_inputs()) {\n\t\tbalance[in.contract].first += in.amount;\n\t}\n\tfor(const auto& out : get_outputs()) {\n\t\tbalance[out.contract].second += out.amount;\n\t}\n\treturn balance;\n}\n\ntx_index_t Transaction::get_tx_index(std::shared_ptr<const ChainParams> params, std::shared_ptr<const BlockHeader> block, const int64_t& file_offset) const\n{\n\ttx_index_t index;\n\tindex.height = block->height;\n\tindex.time_stamp = block->time_stamp;\n\tindex.file_offset = file_offset;\n\tindex.static_cost = static_cost;\n\tif(deploy) {\n\t\tindex.contract_read_cost = (deploy->num_bytes() * params->min_txfee_read_kbyte) / 1000;\n\t}\n\treturn index;\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/VDF_Point.cpp",
    "content": "/*\n * VDF_Point.cpp\n *\n *  Created on: Jul 7, 2024\n *      Author: mad\n */\n\n#include <mmx/VDF_Point.hxx>\n#include <mmx/write_bytes.h>\n\n\nnamespace mmx {\n\nvnx::bool_t VDF_Point::is_valid() const\n{\n\treturn content_hash == calc_hash();\n}\n\nhash_t VDF_Point::calc_hash() const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\tbuffer.reserve(4 * 1024);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"vdf_height\", \tvdf_height);\n\twrite_field(out, \"start\", \t\tstart);\n\twrite_field(out, \"num_iters\", \tnum_iters);\n\twrite_field(out, \"input\", \t\tinput);\n\twrite_field(out, \"output\", \t\toutput);\n\twrite_field(out, \"prev\", \t\tprev);\n\twrite_field(out, \"reward_addr\", reward_addr);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/ValidatorVote.cpp",
    "content": "/*\n * ValidatorVote.cpp\n *\n *  Created on: Dec 29, 2024\n *      Author: mad\n */\n\n#include <mmx/ValidatorVote.hxx>\n\n\nnamespace mmx {\n\nbool ValidatorVote::is_valid() const\n{\n\treturn content_hash == calc_content_hash()\n\t\t&& farmer_sig.verify(farmer_key, hash_t(\"MMX/validator/vote/\" + hash + farmer_key));\n}\n\nhash_t ValidatorVote::calc_content_hash() const\n{\n\treturn hash_t(hash + farmer_key + farmer_sig);\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/Wallet.cpp",
    "content": "/*\n * Wallet.cpp\n *\n *  Created on: Dec 11, 2021\n *      Author: mad\n */\n\n#include <mmx/Wallet.h>\n#include <mmx/KeyFile.hxx>\n#include <mmx/WalletFile.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/solution/PubKey.hxx>\n#include <mmx/mnemonic.h>\n#include <mmx/utils.h>\n#include <mmx/vm_interface.h>\n\n#include <vnx/vnx.h>\n#include <algorithm>\n#include <filesystem>\n\n\nnamespace mmx {\n\nstatic std::string get_info_file_name(const account_t& config)\n{\n\tconst auto suffix = config.index ? \"_\" + std::to_string(config.index) : \"\";\n\treturn \"info_\" + config.finger_print + suffix + \".dat\";\n}\n\nWallet::Wallet(const std::string& _vnx_name)\n\t:\tWalletBase(_vnx_name)\n{\n}\n\nvoid Wallet::init()\n{\n\tvnx::open_pipe(vnx_name, this, 1000);\n}\n\nvoid Wallet::main()\n{\n\tif(num_addresses > max_addresses) {\n\t\tthrow std::logic_error(\"num_addresses > max_addresses\");\n\t}\n\tif(vnx::File(storage_path + \"wallet.dat\").exists()) {\n\t\tif(key_files.empty()) {\n\t\t\tkey_files.push_back(\"wallet.dat\");\n\t\t}\n\t} else if(key_files.size() == 1 && key_files[0] == \"wallet.dat\") {\n\t\tkey_files.clear();\n\t}\n\tif(key_files.size() > max_key_files) {\n\t\tthrow std::logic_error(\"too many key files\");\n\t}\n\tparams = get_params();\n\ttoken_whitelist.insert(addr_t());\n\n\tvnx::Directory(config_path).create();\n\tvnx::Directory(storage_path).create();\n\tvnx::Directory(database_path).create();\n\n\ttx_log.open(database_path + \"tx_log\");\n\n\tnode = std::make_shared<NodeClient>(node_server);\n\thttp = std::make_shared<vnx::addons::HttpInterface<Wallet>>(this, vnx_name);\n\tadd_async_client(http);\n\n\tfor(size_t i = 0; i < key_files.size(); ++i) {\n\t\taccount_t config;\n\t\tconfig.key_file = key_files[i];\n\t\tconfig.num_addresses = num_addresses;\n\t\ttry {\n\t\t\tadd_account(i, config, nullptr);\n\t\t} catch(const std::exception& ex) {\n\t\t\tlog(WARN) << ex.what();\n\t\t}\n\t}\n\tfor(size_t i = 0; i < accounts.size(); ++i) {\n\t\ttry {\n\t\t\tif(!accounts[i].is_hidden) {\n\t\t\t\tadd_account(max_key_files + i, accounts[i], nullptr);\n\t\t\t}\n\t\t} catch(const std::exception& ex) {\n\t\t\tlog(WARN) << ex.what();\n\t\t}\n\t}\n\n\tSuper::main();\n}\n\nstd::shared_ptr<ECDSA_Wallet> Wallet::get_wallet(const uint32_t& index) const\n{\n\tif(index >= wallets.size()) {\n\t\tthrow std::logic_error(\"invalid wallet index: \" + std::to_string(index));\n\t}\n\tif(auto wallet = wallets[index]) {\n\t\treturn wallet;\n\t}\n\tthrow std::logic_error(\"no such wallet\");\n}\n\nstd::shared_ptr<const Transaction>\nWallet::send(\tconst uint32_t& index, const uint128& amount, const addr_t& dst_addr,\n\t\t\t\tconst addr_t& currency, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tif(amount == 0) {\n\t\tthrow std::logic_error(\"amount cannot be zero\");\n\t}\n\tif(dst_addr == addr_t()) {\n\t\tthrow std::logic_error(\"dst_addr cannot be zero\");\n\t}\n\tauto tx = Transaction::create();\n\ttx->note = tx_note_e::TRANSFER;\n\ttx->add_output(currency, dst_addr, amount, options.memo);\n\n\twallet->complete(tx, options);\n\n\tif(tx->is_signed()) {\n\t\tif(options.auto_send) {\n\t\t\tsend_off(index, tx);\n\t\t\tlog(INFO) << \"Sent \" << amount << \" with cost \" << tx->static_cost << \" to \" << dst_addr << \" (\" << tx->id << \")\";\n\t\t} else {\n\t\t\ttx->exec_result = node->validate(tx);\n\t\t}\n\t}\n\tif(options.mark_spent) {\n\t\twallet->update_from(tx);\n\t}\n\treturn tx;\n}\n\nstd::shared_ptr<const Transaction>\nWallet::send_many(\tconst uint32_t& index, const std::vector<std::pair<addr_t, uint128>>& amounts,\n\t\t\t\t\tconst addr_t& currency, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tauto tx = Transaction::create();\n\ttx->note = tx_note_e::TRANSFER;\n\n\tfor(const auto& entry : amounts) {\n\t\tif(entry.first == addr_t()) {\n\t\t\tthrow std::logic_error(\"address cannot be zero\");\n\t\t}\n\t\tif(entry.second == 0) {\n\t\t\tthrow std::logic_error(\"amount cannot be zero\");\n\t\t}\n\t\ttx->add_output(currency, entry.first, entry.second, options.memo);\n\t}\n\twallet->complete(tx, options);\n\n\tif(tx->is_signed()) {\n\t\tif(options.auto_send) {\n\t\t\tsend_off(index, tx);\n\t\t\tlog(INFO) << \"Sent many with cost \" << tx->static_cost << \" (\" << tx->id << \")\";\n\t\t} else {\n\t\t\ttx->exec_result = node->validate(tx);\n\t\t}\n\t}\n\tif(options.mark_spent) {\n\t\twallet->update_from(tx);\n\t}\n\treturn tx;\n}\n\nstd::shared_ptr<const Transaction>\nWallet::send_from(\tconst uint32_t& index, const uint128& amount,\n\t\t\t\t\tconst addr_t& dst_addr, const addr_t& src_addr,\n\t\t\t\t\tconst addr_t& currency, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tauto options_ = options;\n\tif(auto contract = node->get_contract(src_addr)) {\n\t\tif(auto owner = contract->get_owner()) {\n\t\t\toptions_.owner_map.emplace(src_addr, *owner);\n\t\t} else {\n\t\t\t// TODO: handle MultiSig\n\t\t\tthrow std::logic_error(\"contract has no owner\");\n\t\t}\n\t}\n\tif(amount == 0) {\n\t\tthrow std::logic_error(\"amount cannot be zero\");\n\t}\n\tif(dst_addr == addr_t()) {\n\t\tthrow std::logic_error(\"dst_addr cannot be zero\");\n\t}\n\tauto tx = Transaction::create();\n\ttx->note = tx_note_e::WITHDRAW;\n\ttx->add_input(currency, src_addr, amount);\n\ttx->add_output(currency, dst_addr, amount, options.memo);\n\n\twallet->complete(tx, options_);\n\n\tif(tx->is_signed()) {\n\t\tif(options.auto_send) {\n\t\t\tsend_off(index, tx);\n\t\t\tlog(INFO) << \"Sent \" << amount << \" with cost \" << tx->static_cost << \" to \" << dst_addr << \" (\" << tx->id << \")\";\n\t\t} else {\n\t\t\ttx->exec_result = node->validate(tx);\n\t\t}\n\t}\n\tif(options.mark_spent) {\n\t\twallet->update_from(tx);\n\t}\n\treturn tx;\n}\n\nstd::shared_ptr<const Transaction>\nWallet::deploy(const uint32_t& index, std::shared_ptr<const Contract> contract, const spend_options_t& options) const\n{\n\tif(!contract) {\n\t\tthrow std::logic_error(\"contract cannot be null\");\n\t}\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tif(!contract || !contract->is_valid()) {\n\t\tthrow std::logic_error(\"invalid contract\");\n\t}\n\tauto tx = Transaction::create();\n\ttx->note = tx_note_e::DEPLOY;\n\ttx->deploy = contract;\n\n\twallet->complete(tx, options);\n\n\tif(tx->is_signed()) {\n\t\tif(options.auto_send) {\n\t\t\tsend_off(index, tx);\n\t\t\tlog(INFO) << \"Deployed \" << contract->get_type_name() << \" with cost \" << tx->static_cost << \" as \" << addr_t(tx->id) << \" (\" << tx->id << \")\";\n\t\t} else {\n\t\t\ttx->exec_result = node->validate(tx);\n\t\t}\n\t}\n\tif(options.mark_spent) {\n\t\twallet->update_from(tx);\n\t}\n\treturn tx;\n}\n\nstd::shared_ptr<const Transaction> Wallet::execute(\n\t\t\tconst uint32_t& index, const addr_t& address, const std::string& method,\n\t\t\tconst std::vector<vnx::Variant>& args, const vnx::optional<uint32_t>& user, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tauto op = operation::Execute::create();\n\top->address = address;\n\top->method = method;\n\top->args = args;\n\top->user = user ? wallet->get_address(*user) : options.user;\n\n\tauto tx = Transaction::create();\n\ttx->note = tx_note_e::EXECUTE;\n\ttx->execute.push_back(op);\n\n\twallet->complete(tx, options);\n\n\tif(tx->is_signed()) {\n\t\tif(options.auto_send) {\n\t\t\tsend_off(index, tx);\n\t\t\tlog(INFO) << \"Executed \" << method << \"() on [\" << address << \"] with cost \" << tx->static_cost << \" (\" << tx->id << \")\";\n\t\t} else {\n\t\t\ttx->exec_result = node->validate(tx);\n\t\t}\n\t}\n\tif(options.mark_spent) {\n\t\twallet->update_from(tx);\n\t}\n\treturn tx;\n}\n\nstd::shared_ptr<const Transaction> Wallet::deposit(\n\t\t\tconst uint32_t& index, const addr_t& address, const std::string& method, const std::vector<vnx::Variant>& args,\n\t\t\tconst uint128& amount, const addr_t& currency, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tauto op = operation::Deposit::create();\n\top->address = address;\n\top->method = method;\n\top->args = args;\n\top->amount = amount;\n\top->currency = currency;\n\top->user = options.user;\n\n\tauto tx = Transaction::create();\n\ttx->note = tx_note_e::DEPOSIT;\n\ttx->execute.push_back(op);\n\n\twallet->complete(tx, options);\n\n\tif(tx->is_signed()) {\n\t\tif(options.auto_send) {\n\t\t\tsend_off(index, tx);\n\t\t\tlog(INFO) << \"Executed \" << method << \"() on [\" << address << \"] with cost \" << tx->static_cost << \" (\" << tx->id << \")\";\n\t\t} else {\n\t\t\ttx->exec_result = node->validate(tx);\n\t\t}\n\t}\n\tif(options.mark_spent) {\n\t\twallet->update_from(tx);\n\t}\n\treturn tx;\n}\n\nstd::shared_ptr<const Transaction> Wallet::make_offer(\n\t\t\tconst uint32_t& index, const uint32_t& owner, const uint128& bid_amount, const addr_t& bid_currency,\n\t\t\tconst uint128& ask_amount, const addr_t& ask_currency, const spend_options_t& options) const\n{\n\tif(bid_amount == 0 || ask_amount == 0) {\n\t\tthrow std::logic_error(\"amount cannot be zero\");\n\t}\n\tconst auto inv_price = (uint256_t(bid_amount) << 64) / ask_amount;\n\tif(inv_price >> 128) {\n\t\tthrow std::logic_error(\"price out of range\");\n\t}\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tconst auto owner_addr = wallet->get_address(owner);\n\n\tauto offer = contract::Executable::create();\n\toffer->binary = params->offer_binary;\n\toffer->init_method = \"init\";\n\toffer->init_args.emplace_back(owner_addr.to_string());\n\toffer->init_args.emplace_back(bid_currency.to_string());\n\toffer->init_args.emplace_back(ask_currency.to_string());\n\toffer->init_args.emplace_back(uint128(inv_price).to_hex_string());\n\toffer->init_args.emplace_back();\n\n\tauto tx = Transaction::create();\n\ttx->note = tx_note_e::OFFER;\n\ttx->deploy = offer;\n\n\tstd::vector<std::pair<addr_t, uint128>> deposit;\n\tdeposit.emplace_back(bid_currency, bid_amount);\n\n\twallet->complete(tx, options, deposit);\n\n\tif(tx->is_signed()) {\n\t\tif(options.auto_send) {\n\t\t\tsend_off(index, tx);\n\t\t\tlog(INFO) << \"Offering \" << bid_amount << \" [\" << bid_currency << \"] for \" << ask_amount\n\t\t\t\t\t<< \" [\" << ask_currency << \"] with cost \" << tx->static_cost << \" (\" << tx->id << \")\";\n\t\t} else {\n\t\t\ttx->exec_result = node->validate(tx);\n\t\t}\n\t}\n\tif(options.mark_spent) {\n\t\twallet->update_from(tx);\n\t}\n\treturn tx;\n}\n\nstd::shared_ptr<const Transaction> Wallet::offer_trade(\n\t\t\tconst uint32_t& index, const addr_t& address, const uint128& amount,\n\t\t\tconst uint32_t& dst_addr, const uint128& price, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\tconst auto offer = node->get_offer(address);\n\n\tstd::vector<vnx::Variant> args;\n\targs.emplace_back(wallet->get_address(dst_addr).to_string());\n\targs.emplace_back(price.to_hex_string());\n\n\tauto options_ = options;\n\toptions_.note = tx_note_e::TRADE;\n\treturn deposit(index, address, \"trade\", args, amount, offer.ask_currency, options_);\n}\n\nstd::shared_ptr<const Transaction> Wallet::accept_offer(\n\t\t\tconst uint32_t& index, const addr_t& address,\n\t\t\tconst uint32_t& dst_addr, const uint128& price, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\tconst auto offer = node->get_offer(address);\n\n\tstd::vector<vnx::Variant> args;\n\targs.emplace_back(wallet->get_address(dst_addr).to_string());\n\targs.emplace_back(price.to_hex_string());\n\n\tauto options_ = options;\n\toptions_.note = tx_note_e::TRADE;\n\treturn deposit(index, address, \"accept\", args, offer.ask_amount, offer.ask_currency, options_);\n}\n\nstd::shared_ptr<const Transaction> Wallet::cancel_offer(\n\t\t\tconst uint32_t& index, const addr_t& address, const spend_options_t& options) const\n{\n\tconst auto offer = node->get_offer(address);\n\n\tauto options_ = options;\n\toptions_.user = offer.owner;\n\treturn execute(index, address, \"cancel\", {}, nullptr, options_);\n}\n\nstd::shared_ptr<const Transaction> Wallet::offer_withdraw(\n\t\t\tconst uint32_t& index, const addr_t& address, const spend_options_t& options) const\n{\n\tconst auto offer = node->get_offer(address);\n\n\tauto options_ = options;\n\toptions_.user = offer.owner;\n\treturn execute(index, address, \"withdraw\", {}, nullptr, options_);\n}\n\nstd::shared_ptr<const Transaction> Wallet::swap_trade(\n\t\tconst uint32_t& index, const addr_t& address, const uint128& amount, const addr_t& currency,\n\t\tconst vnx::optional<uint128>& min_trade, const int32_t& num_iter, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\tconst auto info = node->get_swap_info(address);\n\tint token = -1;\n\tfor(int i = 0; i < 2; ++i) {\n\t\tif(currency == info.tokens[i]) {\n\t\t\ttoken = i;\n\t\t}\n\t}\n\tif(token < 0) {\n\t\tthrow std::logic_error(\"invalid currency for swap\");\n\t}\n\tstd::vector<vnx::Variant> args;\n\targs.emplace_back(token);\n\targs.emplace_back(wallet->get_address(0).to_string());\n\targs.emplace_back(min_trade ? min_trade->to_var_arg() : vnx::Variant());\n\targs.emplace_back(num_iter);\n\n\tauto options_ = options;\n\toptions_.note = tx_note_e::TRADE;\n\treturn deposit(index, address, \"trade\", args, amount, currency, options_);\n}\n\nstd::shared_ptr<const Transaction> Wallet::swap_add_liquid(\n\t\tconst uint32_t& index, const addr_t& address, const std::array<uint128, 2>& amount, const uint32_t& pool_idx, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tauto tx = Transaction::create();\n\ttx->note = tx_note_e::DEPOSIT;\n\n\tconst auto info = node->get_swap_info(address);\n\tfor(size_t i = 0; i < 2; ++i) {\n\t\tif(amount[i]) {\n\t\t\tauto op = operation::Deposit::create();\n\t\t\top->address = address;\n\t\t\top->method = \"add_liquid\";\n\t\t\top->args = {vnx::Variant(i), vnx::Variant(pool_idx)};\n\t\t\top->amount = amount[i];\n\t\t\top->currency = info.tokens[i];\n\t\t\top->user = wallet->get_address(0);\n\t\t\ttx->execute.push_back(op);\n\t\t}\n\t}\n\twallet->complete(tx, options);\n\n\tif(tx->is_signed()) {\n\t\tif(options.auto_send) {\n\t\t\tsend_off(index, tx);\n\t\t\tlog(INFO) << \"Added liquidity to [\" << address << \"] with cost \" << tx->static_cost << \" (\" << tx->id << \")\";\n\t\t} else {\n\t\t\ttx->exec_result = node->validate(tx);\n\t\t}\n\t}\n\tif(options.mark_spent) {\n\t\twallet->update_from(tx);\n\t}\n\treturn tx;\n}\n\nstd::shared_ptr<const Transaction> Wallet::swap_rem_liquid(\n\t\tconst uint32_t& index, const addr_t& address, const std::array<uint128, 2>& amount, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tauto tx = Transaction::create();\n\ttx->note = tx_note_e::WITHDRAW;\n\t{\n\t\tauto op = operation::Execute::create();\n\t\top->address = address;\n\t\top->method = \"payout\";\n\t\top->user = wallet->get_address(0);\n\t\ttx->execute.push_back(op);\n\t}\n\tfor(size_t i = 0; i < 2; ++i) {\n\t\tif(amount[i]) {\n\t\t\tauto op = operation::Execute::create();\n\t\t\top->address = address;\n\t\t\top->method = \"rem_liquid\";\n\t\t\top->args = {vnx::Variant(i), amount[i].to_var_arg(), vnx::Variant(false)};\n\t\t\top->user = wallet->get_address(0);\n\t\t\ttx->execute.push_back(op);\n\t\t}\n\t}\n\twallet->complete(tx, options);\n\n\tif(tx->is_signed()) {\n\t\tif(options.auto_send) {\n\t\t\tsend_off(index, tx);\n\t\t\tlog(INFO) << \"Removed liquidity from [\" << address << \"] with cost \" << tx->static_cost << \" (\" << tx->id << \")\";\n\t\t} else {\n\t\t\ttx->exec_result = node->validate(tx);\n\t\t}\n\t}\n\tif(options.mark_spent) {\n\t\twallet->update_from(tx);\n\t}\n\treturn tx;\n}\n\nstd::shared_ptr<const Transaction> Wallet::plotnft_exec(\n\t\tconst addr_t& address, const std::string& method, const std::vector<vnx::Variant>& args, const spend_options_t& options_) const\n{\n\tconst auto owner = get_plotnft_owner(address);\n\tconst auto index = find_wallet_by_addr(owner);\n\tauto options = options_;\n\toptions.user = owner;\n\treturn execute(index, address, method, args, nullptr, options);\n}\n\nstd::shared_ptr<const Transaction> Wallet::plotnft_create(\n\t\t\tconst uint32_t& index, const std::string& name, const vnx::optional<uint32_t>& owner, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\n\tauto nft = contract::Executable::create();\n\tnft->name = name;\n\tnft->binary = params->plot_nft_binary;\n\tnft->init_args.emplace_back(wallet->get_address(owner ? *owner : 0).to_string());\n\treturn deploy(index, nft, options);\n}\n\nstd::shared_ptr<const Transaction> Wallet::complete(\n\t\tconst uint32_t& index, std::shared_ptr<const Transaction> tx, const spend_options_t& options) const\n{\n\tif(!tx) {\n\t\treturn nullptr;\n\t}\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tauto copy = vnx::clone(tx);\n\twallet->complete(copy, options);\n\treturn copy;\n}\n\nstd::shared_ptr<const Transaction> Wallet::sign_off(\n\t\tconst uint32_t& index, std::shared_ptr<const Transaction> tx, const spend_options_t& options) const\n{\n\tif(!tx) {\n\t\treturn nullptr;\n\t}\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tauto copy = vnx::clone(tx);\n\twallet->sign_off(copy, options);\n\treturn copy;\n}\n\nstd::shared_ptr<const Solution> Wallet::sign_msg(const uint32_t& index, const addr_t& address, const hash_t& msg) const\n{\n\tconst auto wallet = get_wallet(index);\n\treturn wallet->sign_msg(address, msg);\n}\n\nvoid Wallet::send_off(const uint32_t& index, std::shared_ptr<const Transaction> tx) const\n{\n\tif(!tx) {\n\t\treturn;\n\t}\n\t{\n\t\tauto iter = lock_timers.find(index);\n\t\tif(iter != lock_timers.end()) {\n\t\t\tif(auto timer = iter->second.lock()) {\n\t\t\t\ttimer->reset();\t\t// reset auto-lock timer\n\t\t\t}\n\t\t}\n\t}\n\tconst auto wallet = get_wallet(index);\n\tnode->add_transaction(tx, true);\n\twallet->update_from(tx);\n\t{\n\t\ttx_log_entry_t entry;\n\t\tentry.time = get_time_ms();\n\t\tentry.tx = tx;\n\t\ttx_log.insert(wallet->get_address(0), entry);\n\t\ttx_log.commit();\n\t}\n}\n\nvoid Wallet::mark_spent(const uint32_t& index, const std::map<std::pair<addr_t, addr_t>, uint128>& amounts)\n{\n\tconst auto wallet = get_wallet(index);\n\t// TODO\n}\n\nvoid Wallet::reserve(const uint32_t& index, const std::map<std::pair<addr_t, addr_t>, uint128>& amounts)\n{\n\tconst auto wallet = get_wallet(index);\n\t// TODO\n}\n\nvoid Wallet::release(const uint32_t& index, const std::map<std::pair<addr_t, addr_t>, uint128>& amounts)\n{\n\tconst auto wallet = get_wallet(index);\n\t// TODO\n}\n\nvoid Wallet::release_all()\n{\n\tfor(auto wallet : wallets) {\n\t\tif(wallet) {\n\t\t\twallet->reserved_map.clear();\n\t\t}\n\t}\n}\n\nvoid Wallet::reset_cache(const uint32_t& index)\n{\n\tconst auto wallet = get_wallet(index);\n\twallet->reset_cache();\n\tupdate_cache(index);\n}\n\nvoid Wallet::update_cache(const uint32_t& index) const\n{\n\tconst auto wallet = get_wallet(index);\n\tconst auto now = get_time_ms();\n\n\tif(now - wallet->last_update > cache_timeout_ms)\n\t{\n\t\tconst auto height = node->get_height();\n\t\tconst auto addresses = wallet->get_all_addresses();\n\t\tconst auto balances = node->get_all_balances(addresses, token_whitelist);\n\t\tconst auto contracts = node->get_contracts_owned_by(addresses);\n\t\tconst auto liquidity = node->get_swap_liquidity_by(addresses);\n\t\tconst auto history = wallet->pending_tx.empty() ? std::vector<hash_t>() :\n\t\t\t\tnode->get_tx_ids_since(wallet->height - std::min(params->commit_delay, wallet->height));\n\n\t\twallet->external_balance_map.clear();\n\t\tfor(const auto& entry : node->get_total_balances(contracts, token_whitelist)) {\n\t\t\twallet->external_balance_map[entry.first] += entry.second;\n\t\t}\n\t\tfor(const auto& entry: liquidity) {\n\t\t\tfor(const auto& entry2 : entry.second) {\n\t\t\t\twallet->external_balance_map[entry2.first] += entry2.second;\n\t\t\t}\n\t\t}\n\t\twallet->update_cache(balances, history, height);\n\t\twallet->last_update = now;\n\t}\n}\n\nstd::vector<txin_t> Wallet::gather_inputs_for(\tconst uint32_t& index, const uint128& amount,\n\t\t\t\t\t\t\t\t\t\t\t\tconst addr_t& currency, const spend_options_t& options) const\n{\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tauto tx = Transaction::create();\n\tstd::map<std::pair<addr_t, addr_t>, uint128_t> spent_map;\n\twallet->gather_inputs(tx, spent_map, amount, currency, options);\n\treturn tx->inputs;\n}\n\nstd::vector<tx_entry_t> Wallet::get_history(const uint32_t& index, const query_filter_t& filter_) const\n{\n\tconst auto wallet = get_wallet(index);\n\n\tauto filter = filter_;\n\tif(filter.white_list) {\n\t\tfilter.currency = token_whitelist;\n\t}\n\tstd::vector<tx_entry_t> result;\n\tfor(auto& entry : node->get_history(wallet->get_all_addresses(), filter)) {\n\t\tentry.is_validated = filter.white_list || token_whitelist.count(entry.contract);\n\t\tresult.push_back(entry);\n\t}\n\treturn result;\n}\n\nstd::vector<tx_log_entry_t> Wallet::get_tx_log(const uint32_t& index, const int32_t& limit) const\n{\n\tconst auto wallet = get_wallet(index);\n\n\tstd::vector<tx_log_entry_t> res;\n\ttx_log.find_last(wallet->get_address(0), res, limit);\n\treturn res;\n}\n\nbalance_t Wallet::get_balance(const uint32_t& index, const addr_t& currency) const\n{\n\tconst auto balances = get_balances(index);\n\n\tauto iter = balances.find(currency);\n\tif(iter != balances.end()) {\n\t\treturn iter->second;\n\t}\n\treturn balance_t();\n}\n\nstd::map<addr_t, balance_t> Wallet::get_balances(\n\t\tconst uint32_t& index, const vnx::bool_t& with_zero) const\n{\n\tconst auto wallet = get_wallet(index);\n\tupdate_cache(index);\n\n\tstd::map<addr_t, balance_t> amounts;\n\tif(with_zero) {\n\t\tfor(const auto& currency : token_whitelist) {\n\t\t\tamounts[currency] = balance_t();\n\t\t}\n\t}\n\tfor(const auto& entry : wallet->balance_map) {\n\t\tamounts[entry.first.second].spendable += entry.second;\n\t}\n\tfor(const auto& entry : wallet->reserved_map) {\n\t\tamounts[entry.first.second].reserved += entry.second;\n\t}\n\tfor(const auto& entry : wallet->pending_map) {\n\t\tfor(const auto& entry2 : entry.second) {\n\t\t\tamounts[entry2.first.second].reserved += entry2.second;\n\t\t}\n\t}\n\tfor(const auto& entry : wallet->external_balance_map) {\n\t\tamounts[entry.first].locked += entry.second;\n\t}\n\tfor(auto& entry : amounts) {\n\t\tentry.second.total = entry.second.spendable + entry.second.reserved + entry.second.locked;\n\t\tentry.second.is_validated = token_whitelist.count(entry.first);\n\t}\n\treturn amounts;\n}\n\nstd::map<addr_t, balance_t> Wallet::get_total_balances(const std::vector<addr_t>& addresses) const\n{\n\tstd::map<addr_t, balance_t> amounts;\n\tfor(const auto& entry : node->get_total_balances(addresses, token_whitelist)) {\n\t\tauto& balance = amounts[entry.first];\n\t\tbalance.total = entry.second;\n\t\tbalance.spendable = balance.total;\n\t\tbalance.is_validated = true;\n\t}\n\treturn amounts;\n}\n\nstd::map<addr_t, balance_t> Wallet::get_contract_balances(const addr_t& address) const\n{\n\treturn node->get_contract_balances(address, token_whitelist);\n}\n\nstd::map<addr_t, std::shared_ptr<const Contract>> Wallet::get_contracts(\n\t\tconst uint32_t& index, const vnx::optional<std::string>& type_name, const vnx::optional<hash_t>& type_hash) const\n{\n\tconst auto wallet = get_wallet(index);\n\tconst auto addresses = node->get_contracts_by(wallet->get_all_addresses(), type_hash);\n\tconst auto contracts = node->get_contracts(addresses);\n\n\tstd::map<addr_t, std::shared_ptr<const Contract>> result;\n\tfor(size_t i = 0; i < addresses.size() && i < contracts.size(); ++i) {\n\t\tif(auto contract = contracts[i]) {\n\t\t\tif(!type_name || contract->get_type_name() == *type_name) {\n\t\t\t\tresult[addresses[i]] = contract;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nstd::map<addr_t, std::shared_ptr<const Contract>> Wallet::get_contracts_owned(\n\t\tconst uint32_t& index, const vnx::optional<std::string>& type_name, const vnx::optional<hash_t>& type_hash) const\n{\n\tconst auto wallet = get_wallet(index);\n\tconst auto addresses = node->get_contracts_owned_by(wallet->get_all_addresses(), type_hash);\n\tconst auto contracts = node->get_contracts(addresses);\n\n\tstd::map<addr_t, std::shared_ptr<const Contract>> result;\n\tfor(size_t i = 0; i < addresses.size() && i < contracts.size(); ++i) {\n\t\tif(auto contract = contracts[i]) {\n\t\t\tif(!type_name || contract->get_type_name() == *type_name) {\n\t\t\t\tresult[addresses[i]] = contract;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nstd::vector<offer_data_t> Wallet::get_offers(const uint32_t& index, const vnx::bool_t& state) const\n{\n\tconst auto wallet = get_wallet(index);\n\treturn node->get_offers_by(wallet->get_all_addresses(), state);\n}\n\nstd::map<addr_t, std::array<std::pair<addr_t, uint128>, 2>> Wallet::get_swap_liquidity(const uint32_t& index) const\n{\n\tconst auto wallet = get_wallet(index);\n\treturn node->get_swap_liquidity_by(wallet->get_all_addresses());\n}\n\naddr_t Wallet::get_address(const uint32_t& index, const uint32_t& offset) const\n{\n\tconst auto wallet = get_wallet(index);\n\treturn wallet->get_address(offset);\n}\n\nstd::vector<addr_t> Wallet::get_all_addresses(const int32_t& index) const\n{\n\tif(index >= 0) {\n\t\treturn get_wallet(index)->get_all_addresses();\n\t}\n\tstd::vector<addr_t> list;\n\tfor(const auto& wallet : wallets) {\n\t\tif(wallet) {\n\t\t\tconst auto set = wallet->get_all_addresses();\n\t\t\tlist.insert(list.end(), set.begin(), set.end());\n\t\t}\n\t}\n\treturn list;\n}\n\nint32_t Wallet::find_wallet_by_addr(const addr_t& address) const\n{\n\tfor(size_t i = 0; i < wallets.size(); ++i) {\n\t\tif(auto wallet = wallets[i]) {\n\t\t\tif(wallet->find_address(address) >= 0) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t}\n\tthrow std::logic_error(\"wallet for address not found: \" + address.to_string());\n}\n\nstd::pair<skey_t, pubkey_t> Wallet::get_farmer_keys(const uint32_t& index) const\n{\n\tif(auto wallet = wallets.at(index)) {\n\t\treturn wallet->get_farmer_key();\n\t}\n\tthrow std::logic_error(\"invalid wallet\");\n}\n\nstd::vector<std::pair<skey_t, pubkey_t>> Wallet::get_all_farmer_keys() const\n{\n\tstd::vector<std::pair<skey_t, pubkey_t>> res;\n\tfor(auto wallet : wallets) {\n\t\tif(wallet) {\n\t\t\tres.push_back(wallet->get_farmer_key());\n\t\t}\n\t}\n\treturn res;\n}\n\naccount_info_t Wallet::get_account(const uint32_t& index) const\n{\n\tconst auto wallet = get_wallet(index);\n\treturn account_info_t::make(index, wallet->find_address(0), wallet->config);\n}\n\nstd::vector<account_info_t> Wallet::get_all_accounts() const\n{\n\tstd::vector<account_info_t> res;\n\tfor(size_t i = 0; i < wallets.size(); ++i) {\n\t\tif(auto wallet = wallets[i]) {\n\t\t\tres.push_back(account_info_t::make(i, wallet->find_address(0), wallet->config));\n\t\t}\n\t}\n\treturn res;\n}\n\nbool Wallet::is_locked(const uint32_t& index) const\n{\n\treturn get_wallet(index)->is_locked();\n}\n\nvoid Wallet::lock(const uint32_t& index)\n{\n\tget_wallet(index)->lock();\n}\n\nvoid Wallet::unlock(const uint32_t& index, const std::string& passphrase)\n{\n\tconst auto wallet = get_wallet(index);\n\twallet->unlock(passphrase);\n\n\tif(wallet->config.with_passphrase) {\n\t\tif(lock_timeout_sec > 0) {\n\t\t\tauto& timer = lock_timers[index];\n\t\t\tif(auto t = timer.lock()) {\n\t\t\t\tt->stop();\n\t\t\t}\n\t\t\ttimer = set_timeout_millis(int64_t(lock_timeout_sec) * 1000, [this, index, wallet]() {\n\t\t\t\twallet->lock();\n\t\t\t\tlock_timers.erase(index);\n\t\t\t});\n\t\t}\n\t\ttry {\n\t\t\tauto info = WalletFile::create();\n\t\t\tinfo->addresses = wallet->get_all_addresses();\n\t\t\tvnx::write_to_file(database_path + get_info_file_name(wallet->config), info);\n\t\t} catch(const std::exception& ex) {\n\t\t\tlog(ERROR) << \"Failed to store wallet info: \" << ex.what();\n\t\t}\n\t}\n}\n\nvoid Wallet::add_account(const uint32_t& index, const account_t& config, const vnx::optional<std::string>& passphrase)\n{\n\tif(index >= wallets.size()) {\n\t\twallets.resize(index + 1);\n\t} else if(wallets[index]) {\n\t\tthrow std::logic_error(\"account already exists: \" + std::to_string(index));\n\t}\n\tconst auto key_path = storage_path + config.key_file;\n\n\tif(auto key_file = vnx::read_from_file<KeyFile>(key_path)) {\n\t\tstd::shared_ptr<ECDSA_Wallet> wallet;\n\t\tif(config.with_passphrase && !passphrase) {\n\t\t\tconst auto info_path = database_path + get_info_file_name(config);\n\t\t\tconst auto info = vnx::read_from_file<WalletFile>(info_path);\n\t\t\tif(!info) {\n\t\t\t\tlog(WARN) << \"Missing info file: \" << info_path;\n\t\t\t}\n\t\t\twallet = std::make_shared<ECDSA_Wallet>(\n\t\t\t\t\tkey_file->seed_value, (info ? info->addresses : std::vector<addr_t>()), config, params);\n\t\t\twallets[index] = wallet;\n\t\t} else {\n\t\t\tauto config_ = config;\n\t\t\tif(config_.finger_print.empty()) {\n\t\t\t\tconfig_.finger_print = get_finger_print(key_file->seed_value, passphrase);\n\t\t\t}\n\t\t\twallet = std::make_shared<ECDSA_Wallet>(key_file->seed_value, config_, params);\n\t\t\twallets[index] = wallet;\n\t\t\tif(passphrase) {\n\t\t\t\tunlock(index, *passphrase);\n\t\t\t\twallet->lock();\n\t\t\t} else {\n\t\t\t\tunlock(index, \"\");\n\t\t\t}\n\t\t}\n\t\twallet->default_expire = default_expire;\n\t} else {\n\t\tthrow std::runtime_error(\"failed to read key file: \" + key_path);\n\t}\n\tstd::filesystem::permissions(key_path, std::filesystem::perms::owner_read | std::filesystem::perms::owner_write);\n}\n\nvoid Wallet::create_account(const account_t& config, const vnx::optional<std::string>& passphrase)\n{\n\tif(config.num_addresses < 1) {\n\t\tthrow std::logic_error(\"num_addresses < 1\");\n\t}\n\tif(config.num_addresses > max_addresses) {\n\t\tthrow std::logic_error(\"num_addresses > max_addresses\");\n\t}\n\tconst auto index = std::max<uint32_t>(max_key_files, wallets.size());\n\tadd_account(index, config, passphrase);\n\taccounts.push_back(config);\n\n\tconst std::string path = config_path + vnx_name + \".json\";\n\t{\n\t\tauto object = vnx::read_config_file(path);\n\t\tobject[\"accounts+\"] = accounts;\n\t\tvnx::write_config_file(path, object);\n\t}\n}\n\nvoid Wallet::create_wallet(const account_t& config, const vnx::optional<std::string>& words, const vnx::optional<std::string>& passphrase)\n{\n\tauto key_file = KeyFile::create();\n\tif(words) {\n\t\tkey_file->seed_value = mnemonic::words_to_seed(mnemonic::string_to_words(*words));\n\t} else {\n\t\tkey_file->seed_value = hash_t::secure_random();\n\t}\n\tif(passphrase) {\n\t\tkey_file->finger_print = get_finger_print(key_file->seed_value, passphrase);\n\t}\n\timport_wallet(config, key_file, passphrase);\n}\n\nvoid Wallet::import_wallet(const account_t& config_, std::shared_ptr<const KeyFile> key_file, const vnx::optional<std::string>& passphrase)\n{\n\tif(!key_file) {\n\t\tthrow std::logic_error(\"!key_file\");\n\t}\n\tconst auto finger_print = get_finger_print(key_file->seed_value, passphrase);\n\n\tif(key_file->finger_print) {\n\t\tif(finger_print != *key_file->finger_print) {\n\t\t\tthrow std::logic_error(passphrase ? \"wrong passphrase\" : \"passphrase needed\");\n\t\t}\n\t}\n\tauto config = config_;\n\tif(!config.num_addresses) {\n\t\tconfig.num_addresses = num_addresses;\n\t}\n\tconfig.with_passphrase = passphrase;\n\tconfig.finger_print = finger_print;\n\n\tif(config.key_file.empty()) {\n\t\tconfig.key_file = \"wallet_\" + config.finger_print + \".dat\";\n\t}\n\tconst auto key_path = storage_path + config.key_file;\n\n\tconst auto existing = vnx::read_from_file<KeyFile>(key_path);\n\tif(existing) {\n\t\tif(existing->seed_value != key_file->seed_value) {\n\t\t\tthrow std::logic_error(\"key file already exists\");\n\t\t}\n\t}\n\tvnx::write_to_file(key_path, key_file);\n\ttry {\n\t\tcreate_account(config, passphrase);\n\t} catch(...) {\n\t\tif(!existing) {\n\t\t\tvnx::File(key_path).remove();\n\t\t}\n\t\tthrow;\n\t}\n\tstd::filesystem::permissions(key_path, std::filesystem::perms::owner_read | std::filesystem::perms::owner_write);\n}\n\nstd::shared_ptr<const KeyFile> Wallet::export_wallet(const uint32_t& index) const\n{\n\tconst auto wallet = get_wallet(index);\n\n\tif(auto key_file = vnx::read_from_file<KeyFile>(storage_path + wallet->config.key_file)) {\n\t\treturn key_file;\n\t}\n\tthrow std::logic_error(\"failed to read key file\");\n}\n\nvoid Wallet::remove_account(const uint32_t& index, const uint32_t& account)\n{\n\tif(index < max_key_files) {\n\t\tthrow std::logic_error(\"cannot remove wallet\");\n\t}\n\tconst auto wallet = get_wallet(index);\n\n\tconst std::string path = config_path + vnx_name + \".json\";\n\t{\n\t\tauto config = vnx::read_config_file(path);\n\t\tconst auto offset = index - max_key_files;\n\t\tif(offset < accounts.size()) {\n\t\t\taccounts[offset].is_hidden = true;\n\t\t} else {\n\t\t\tthrow std::logic_error(\"cannot remove wallet\");\n\t\t}\n\t\tconfig[\"accounts+\"] = accounts;\n\t\tvnx::write_config_file(path, config);\n\t}\n\twallets[index] = nullptr;\n}\n\nvoid Wallet::set_address_count(const uint32_t& index, const uint32_t& count)\n{\n\tif(count < 1 || count > max_addresses) {\n\t\tthrow std::logic_error(\"invalid address count\");\n\t}\n\tconst std::string path = config_path + vnx_name + \".json\";\n\t{\n\t\tauto config = vnx::read_config_file(path);\n\t\tif(index >= max_key_files) {\n\t\t\tconst auto offset = index - max_key_files;\n\t\t\tif(offset < accounts.size()) {\n\t\t\t\taccounts[offset].num_addresses = count;\n\t\t\t} else {\n\t\t\t\tthrow std::logic_error(\"cannot find wallet\");\n\t\t\t}\n\t\t\tconfig[\"accounts+\"] = accounts;\n\n\t\t\twallets[index] = nullptr;\n\t\t\tadd_account(index, accounts[offset], nullptr);\n\t\t} else {\n\t\t\tnum_addresses = count;\n\t\t\tconfig[\"num_addresses\"] = count;\n\t\t\twallets.clear();\n\t\t\tadd_task(std::bind(&Wallet::vnx_restart, this));\n\t\t}\n\t\tvnx::write_config_file(path, config);\n\t}\n}\n\nstd::set<addr_t> Wallet::get_token_list() const\n{\n\tconst std::vector<addr_t> addresses(token_whitelist.begin(), token_whitelist.end());\n\tconst auto list = node->get_contracts(addresses);\n\n\tstd::set<addr_t> out {addr_t()};\n\tfor(size_t i = 0; i < list.size(); ++i) {\n\t\tif(std::dynamic_pointer_cast<const contract::TokenBase>(list[i])) {\n\t\t\tout.insert(addresses[i]);\n\t\t}\n\t}\n\treturn out;\n}\n\nvoid Wallet::add_token(const addr_t& address)\n{\n\tconst std::string path = config_path + vnx_name + \".json\";\n\tauto object = vnx::read_config_file(path);\n\t{\n\t\tauto& whitelist = object[\"token_whitelist+\"];\n\t\tstd::set<std::string> tmp;\n\t\tfor(const auto& token : whitelist.to<std::set<addr_t>>()) {\n\t\t\ttmp.insert(token.to_string());\n\t\t}\n\t\ttmp.insert(address.to_string());\n\t\twhitelist = tmp;\n\t}\n\tvnx::write_config_file(path, object);\n\ttoken_whitelist.insert(address);\n}\n\nvoid Wallet::rem_token(const addr_t& address)\n{\n\tconst std::string path = config_path + vnx_name + \".json\";\n\tauto object = vnx::read_config_file(path);\n\t{\n\t\tauto& whitelist = object[\"token_whitelist+\"];\n\t\tstd::set<std::string> tmp;\n\t\tfor(const auto& token : whitelist.to<std::set<addr_t>>()) {\n\t\t\ttmp.insert(token.to_string());\n\t\t}\n\t\tif(!tmp.erase(address.to_string())) {\n\t\t\tthrow std::logic_error(\"cannot remove token: \" + address.to_string());\n\t\t}\n\t\twhitelist = tmp;\n\t}\n\tvnx::write_config_file(path, object);\n\n\tif(address != addr_t()) {\n\t\ttoken_whitelist.erase(address);\n\t}\n}\n\nhash_t Wallet::get_master_seed(const uint32_t& index) const\n{\n\treturn export_wallet(index)->seed_value;\n}\n\nstd::vector<std::string> Wallet::get_mnemonic_seed(const uint32_t& index) const\n{\n\treturn mnemonic::seed_to_words(export_wallet(index)->seed_value);\n}\n\nstd::vector<std::string> Wallet::get_mnemonic_wordlist(const std::string& lang) const\n{\n\tif(lang == \"en\") {\n\t\treturn mnemonic::wordlist_en;\n\t}\n\tthrow std::logic_error(\"unknown language\");\n}\n\naddr_t Wallet::get_plotnft_owner(const addr_t& address) const\n{\n\tif(auto info = node->get_plot_nft_info(address)) {\n\t\treturn info->owner;\n\t}\n\tthrow std::logic_error(\"not a plot NFT: \" + address.to_string());\n}\n\nvoid Wallet::http_request_async(std::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\tconst vnx::request_id_t& request_id) const\n{\n\thttp->http_request(request, sub_path, request_id, vnx_request->session);\n}\n\nvoid Wallet::http_request_chunk_async(\tstd::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\t\t\tconst int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& request_id) const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/WebAPI.cpp",
    "content": "/*\n * WebAPI.cpp\n *\n *  Created on: Jan 25, 2022\n *      Author: mad\n */\n\n#include <mmx/WebAPI.h>\n#include <mmx/uint128.hpp>\n#include <mmx/fixed128.hpp>\n#include <mmx/mnemonic.h>\n#include <mmx/utils.h>\n\n#include <mmx/contract/Data.hxx>\n#include <mmx/contract/MultiSig.hxx>\n#include <mmx/contract/TokenBase.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/solution/PubKey.hxx>\n#include <mmx/solution/MultiSig.hxx>\n#include <mmx/permission_e.hxx>\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/ProofOfSpaceNFT.hxx>\n#include <mmx/vm_interface.h>\n\n#include <mmx/accept_generic.hxx>\n#include <mmx/contract/accept_generic.hxx>\n#include <mmx/solution/accept_generic.hxx>\n#include <mmx/operation/accept_generic.hxx>\n\n#include <vnx/vnx.h>\n#include <vnx/ProcessClient.hxx>\n\n#include <cmath>\n\n\nnamespace mmx {\n\nstruct currency_t {\n\tbool is_nft = false;\n\tint decimals = 0;\n\tstd::string name;\n\tstd::string symbol;\n};\n\nclass RenderContext {\npublic:\n\tRenderContext(std::shared_ptr<const ChainParams> params)\n\t\t:\tparams(params)\n\t{\n\t\tauto& currency = currency_map[addr_t()];\n\t\tcurrency.decimals = params->decimals;\n\t\tcurrency.symbol = \"MMX\";\n\t}\n\n\tbool have_contract(const addr_t& address) const {\n\t\treturn currency_map.count(address);\n\t}\n\n\tconst currency_t* find_currency(const addr_t& address) const {\n\t\tauto iter = currency_map.find(address);\n\t\tif(iter != currency_map.end()) {\n\t\t\treturn &iter->second;\n\t\t}\n\t\treturn nullptr;\n\t}\n\n\tconst currency_t* get_currency(const addr_t& address) const {\n\t\tif(auto out = find_currency(address)) {\n\t\t\treturn out;\n\t\t}\n\t\tthrow std::logic_error(\"invalid currency\");\n\t}\n\n\tvoid add_contract(const addr_t& address, std::shared_ptr<const Contract> contract)\n\t{\n\t\tif(auto token = std::dynamic_pointer_cast<const contract::TokenBase>(contract)) {\n\t\t\tauto& currency = currency_map[address];\n\t\t\tcurrency.decimals = token->decimals;\n\t\t\tcurrency.symbol = token->symbol;\n\t\t\tcurrency.name = token->name;\n\t\t}\n\t\tif(auto exe = std::dynamic_pointer_cast<const contract::Executable>(contract)) {\n\t\t\tif(exe->binary == params->nft_binary) {\n\t\t\t\tauto& currency = currency_map[address];\n\t\t\t\tcurrency.is_nft = true;\n\t\t\t\tcurrency.symbol = \"NFT\";\n\t\t\t}\n\t\t}\n\t}\n\n\tbool hide_proof = false;\n\tuint32_t curr_height = 0;\n\tstd::shared_ptr<const ChainParams> params;\n\tstd::unordered_map<addr_t, currency_t> currency_map;\n};\n\n\nstd::mutex WebAPI::g_config_mutex;\n\nWebAPI::WebAPI(const std::string& _vnx_name)\n\t:\tWebAPIBase(_vnx_name)\n{\n\tparams = mmx::get_params();\n}\n\nvoid WebAPI::init()\n{\n\tvnx::open_pipe(vnx_name, this, 3000);\n\tvnx::open_pipe(vnx_get_id(), this, 3000);\n\n\tsubscribe(vnx::log_out, 10000);\n}\n\nvoid WebAPI::main()\n{\n\tsubscribe(input_blocks, 10000);\n\tsubscribe(input_proofs, 10000);\n\n\tnode = std::make_shared<NodeAsyncClient>(node_server);\n\twallet = std::make_shared<WalletAsyncClient>(wallet_server);\n\tfarmer = std::make_shared<FarmerAsyncClient>(farmer_server);\n\tadd_async_client(node);\n\tadd_async_client(wallet);\n\tadd_async_client(farmer);\n\n\tset_timer_millis(1000, std::bind(&WebAPI::update, this));\n\n\tupdate();\n\n\tSuper::main();\n}\n\nvoid WebAPI::update()\n{\n\tnode->get_height(\n\t\t[this](const uint32_t& height) {\n\t\t\tcurr_height = height;\n\t\t});\n\tnode->get_synced_height(\n\t\t[this](const vnx::optional<uint32_t>& height) {\n\t\t\tif(!is_synced && height) {\n\t\t\t\tsynced_since = *height;\n\t\t\t}\n\t\t\tis_synced = height;\n\t\t});\n}\n\nvoid WebAPI::handle(std::shared_ptr<const Block> block)\n{\n}\n\nvoid WebAPI::handle(std::shared_ptr<const ProofResponse> value)\n{\n\tproof_history.emplace_back(value, proof_counter++);\n\twhile(proof_history.size() > max_log_history) {\n\t\tproof_history.pop_front();\n\t}\n}\n\nvoid WebAPI::handle(std::shared_ptr<const vnx::LogMsg> value)\n{\n\tlog_history.emplace_back(value, log_counter++);\n\twhile(log_history.size() > max_log_history) {\n\t\tlog_history.pop_front();\n\t}\n}\n\nstatic vnx::Object to_amount_object(const uint128& amount, const int decimals)\n{\n\tvnx::Object res;\n\tres[\"value\"] = to_value(amount, decimals);\n\tres[\"amount\"] = amount.to_string();\n\treturn res;\n}\n\nstatic vnx::Object to_amount_object_str(const uint128& amount, const int decimals)\n{\n\tvnx::Object res;\n\tres[\"value\"] = fixed128(amount, decimals).to_string();\n\tres[\"amount\"] = amount.to_string();\n\treturn res;\n}\n\nstatic uint64_t parse_uint64(const vnx::Variant& value)\n{\n\tuint64_t tmp = 0;\n\tvnx::from_string(value.to_string_value(), tmp);\n\treturn tmp;\n}\n\nstatic std::shared_ptr<Transaction> parse_tx(const vnx::Object& obj)\n{\n\tauto tx = Transaction::create();\n\ttx->from_object(obj);\n\ttx->nonce = parse_uint64(obj[\"nonce\"]);\n\treturn tx;\n}\n\n\ntemplate<typename T>\nvnx::Object render(const T& value, std::shared_ptr<const RenderContext> context = nullptr);\n\ntemplate<typename T>\nvnx::Variant render(std::shared_ptr<const T> value, std::shared_ptr<const RenderContext> context = nullptr);\n\nclass Render {\npublic:\n\tvnx::Object object;\n\tvnx::Variant result;\n\n\tRender() = default;\n\tRender(std::shared_ptr<const RenderContext> context) : context(context) {}\n\n\ttemplate<typename T>\n\tvoid type_begin(int num_fields) {\n\t\tif(auto type_code = T::static_get_type_code()) {\n\t\t\tobject[\"__type\"] = type_code->name;\n\t\t}\n\t}\n\n\ttemplate<typename T>\n\tvoid type_end(int num_fields) {\n\t\tresult = vnx::Variant(object);\n\t}\n\n\tvoid type_field(const std::string& name, const size_t index) {\n\t\tp_value = &object[name];\n\t}\n\n\ttemplate<typename T>\n\tvoid set(const T& value) {\n\t\t*p_value = value;\n\t}\n\n\ttemplate<typename T>\n\tvoid accept(const T& value) {\n\t\tif constexpr(vnx::is_object<T>()) {\n\t\t\tset(render(value, context));\n\t\t} else {\n\t\t\tset(value);\n\t\t}\n\t}\n\n\ttemplate<size_t N>\n\tvoid accept(const bytes_t<N>& value) {\n\t\tset(value.to_string());\n\t}\n\n\tvoid accept(const uint64_t& value) {\n\t\tif(value >> 53) {\n\t\t\tset(std::to_string(value));\n\t\t} else {\n\t\t\tset(value);\n\t\t}\n\t}\n\n\tvoid accept(const uint128& value) {\n\t\tset(value.to_string());\n\t}\n\n\tvoid accept(const fixed128& value) {\n\t\tset(value.to_string());\n\t}\n\n\tvoid accept(const hash_t& value) {\n\t\tset(value.to_string());\n\t}\n\n\tvoid accept(const addr_t& value) {\n\t\tset(value.to_string());\n\t}\n\n\tvoid accept(const pubkey_t& value) {\n\t\tset(value.to_string());\n\t}\n\n\tvoid accept(const signature_t& value) {\n\t\tset(value.to_string());\n\t}\n\n\ttemplate<typename T>\n\tvoid accept(const vnx::optional<T>& value) {\n\t\tif(value) {\n\t\t\taccept(*value);\n\t\t} else {\n\t\t\tset(nullptr);\n\t\t}\n\t}\n\n\ttemplate<typename K, typename V>\n\tvoid accept(const std::pair<K, V>& value) {\n\t\tconst auto prev = p_value;\n\t\tstd::array<vnx::Variant, 2> tmp;\n\t\tp_value = &tmp[0];\n\t\taccept(value.first);\n\t\tp_value = &tmp[1];\n\t\taccept(value.second);\n\t\tp_value = prev;\n\t\tset(tmp);\n\t}\n\n\ttemplate<typename T, size_t N>\n\tvoid accept(const std::array<T, N>& value) {\n\t\taccept_range(value.begin(), value.end());\n\t}\n\n\ttemplate<typename T>\n\tvoid accept(const std::vector<T>& value) {\n\t\taccept_range(value.begin(), value.end());\n\t}\n\n\ttemplate<typename T>\n\tvoid accept(const std::set<T>& value) {\n\t\taccept_range(value.begin(), value.end());\n\t}\n\n\ttemplate<typename K, typename V>\n\tvoid accept(const std::map<K, V>& value) {\n\t\taccept_range(value.begin(), value.end());\n\t}\n\n\ttemplate<typename T>\n\tvoid accept_range(const T& begin, const T& end) {\n\t\tconst auto prev = p_value;\n\t\tstd::list<vnx::Variant> tmp;\n\t\tfor(T iter = begin; iter != end; ++iter) {\n\t\t\ttmp.emplace_back();\n\t\t\tp_value = &tmp.back();\n\t\t\taccept(*iter);\n\t\t}\n\t\tp_value = prev;\n\t\tset(tmp);\n\t}\n\n\tvoid accept(const std::vector<uint8_t>& value) {\n\t\tset(vnx::to_hex_string(value.data(), value.size()));\n\t}\n\n\ttemplate<typename T>\n\tvoid accept(std::shared_ptr<const T> value) {\n\t\tset(render(value, context));\n\t}\n\n\tvnx::Object augment(vnx::Object out, const addr_t& contract, const uint128_t& amount) {\n\t\tif(context) {\n\t\t\tif(auto info = context->find_currency(contract)) {\n\t\t\t\tif(info->is_nft) {\n\t\t\t\t\tout[\"is_nft\"] = true;\n\t\t\t\t} else {\n\t\t\t\t\tout[\"symbol\"] = info->symbol;\n\t\t\t\t\tout[\"value\"] = to_value(amount, info->decimals);\n\t\t\t\t\tout[\"decimals\"] = info->decimals;\n\t\t\t\t}\n\t\t\t}\n\t\t\tout[\"is_native\"] = contract == addr_t();\n\t\t}\n\t\treturn out;\n\t}\n\n\tvoid accept(const txio_t& value) {\n\t\tset(augment(render(value), value.contract, value.amount));\n\t}\n\n\tvoid accept(const txin_t& value) {\n\t\tset(augment(render(value), value.contract, value.amount));\n\t}\n\n\tvoid accept(const txout_t& value) {\n\t\tset(augment(render(value), value.contract, value.amount));\n\t}\n\n\tvnx::Object to_output(const addr_t& contract, const uint128_t amount) {\n\t\tvnx::Object tmp;\n\t\ttmp[\"amount\"] = amount.str(10);\n\t\ttmp[\"contract\"] = contract.to_string();\n\t\tif(contract == addr_t()) {\n\t\t\ttmp[\"is_native\"] = true;\n\t\t}\n\t\treturn augment(tmp, contract, amount);\n\t}\n\n\tvoid accept(const tx_info_t& value) {\n\t\tauto tmp = render(value, context);\n\t\tif(context) {\n\t\t\ttmp[\"fee\"] = to_amount_object(value.fee, context->params->decimals);\n\t\t\ttmp[\"cost\"] = to_amount_object(value.cost, context->params->decimals);\n\t\t\tif(value.time_stamp) {\n\t\t\t\ttmp[\"time\"] = (*value.time_stamp) / 1e3;\n\t\t\t}\n\t\t\tif(auto height = value.height) {\n\t\t\t\ttmp[\"confirm\"] = context->curr_height >= *height ? 1 + context->curr_height - *height : 0;\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tstd::vector<vnx::Object> rows;\n\t\t\tfor(const auto& entry : value.input_amounts) {\n\t\t\t\trows.push_back(to_output(entry.first, entry.second));\n\t\t\t}\n\t\t\ttmp[\"input_amounts\"] = rows;\n\t\t}\n\t\t{\n\t\t\tstd::vector<vnx::Object> rows;\n\t\t\tfor(const auto& entry : value.output_amounts) {\n\t\t\t\trows.push_back(to_output(entry.first, entry.second));\n\t\t\t}\n\t\t\ttmp[\"output_amounts\"] = rows;\n\t\t}\n\t\tif(value.deployed) {\n\t\t\ttmp[\"address\"] = addr_t(value.id).to_string();\n\t\t}\n\t\ttmp.erase(\"contracts\");\n\t\tset(tmp);\n\t}\n\n\tvoid accept(const tx_type_e& value) {\n\t\tset(value.to_string_value());\n\t}\n\n\tvoid accept(const tx_entry_t& value) {\n\t\tauto tmp = augment(render(value, context), value.contract, value.amount);\n\t\ttmp[\"time\"] = value.time_stamp / 1e3;\n\t\tset(tmp);\n\t}\n\n\tvoid accept(const exec_result_t& value) {\n\t\tauto tmp = render(value, context);\n\t\tif(context) {\n\t\t\ttmp[\"total_fee_value\"] = to_value(value.total_fee, context->params->decimals);\n\t\t}\n\t\tset(tmp);\n\t}\n\n\tvoid accept(const offer_data_t& value) {\n\t\tauto tmp = render(value, context);\n\t\tif(context) {\n\t\t\tconst auto bid_currency = context->find_currency(value.bid_currency);\n\t\t\tconst auto ask_currency = context->find_currency(value.ask_currency);\n\t\t\tif(bid_currency) {\n\t\t\t\ttmp[\"bid_balance_value\"] = to_value(value.bid_balance, bid_currency->decimals);\n\t\t\t\ttmp[\"bid_symbol\"] = bid_currency->symbol;\n\t\t\t\ttmp[\"bid_decimals\"] = bid_currency->decimals;\n\t\t\t}\n\t\t\tif(ask_currency) {\n\t\t\t\ttmp[\"ask_balance_value\"] = to_value(value.ask_balance, ask_currency->decimals);\n\t\t\t\ttmp[\"ask_symbol\"] = ask_currency->symbol;\n\t\t\t\ttmp[\"ask_decimals\"] = ask_currency->decimals;\n\t\t\t\ttmp[\"ask_value\"] = to_value(value.ask_amount, ask_currency->decimals);\n\t\t\t}\n\t\t\tif(bid_currency && ask_currency) {\n\t\t\t\ttmp[\"display_price\"] = value.price * pow(10, bid_currency->decimals - ask_currency->decimals);\n\t\t\t}\n\t\t\ttmp[\"time\"] = value.time_stamp / 1e3;\n\t\t}\n\t\tset(tmp);\n\t}\n\n\tvoid accept(const trade_entry_t& value) {\n\t\tauto tmp = render(value, context);\n\t\tif(context) {\n\t\t\tconst auto bid_currency = context->find_currency(value.bid_currency);\n\t\t\tconst auto ask_currency = context->find_currency(value.ask_currency);\n\t\t\tif(bid_currency) {\n\t\t\t\ttmp[\"bid_value\"] = to_value(value.bid_amount, bid_currency->decimals);\n\t\t\t\ttmp[\"bid_symbol\"] = bid_currency->symbol;\n\t\t\t}\n\t\t\tif(ask_currency) {\n\t\t\t\ttmp[\"ask_value\"] = to_value(value.ask_amount, ask_currency->decimals);\n\t\t\t\ttmp[\"ask_symbol\"] = ask_currency->symbol;\n\t\t\t}\n\t\t\tif(bid_currency && ask_currency) {\n\t\t\t\ttmp[\"display_price\"] = value.price * pow(10, bid_currency->decimals - ask_currency->decimals);\n\t\t\t}\n\t\t\ttmp[\"time\"] = value.time_stamp / 1e3;\n\t\t}\n\t\tset(tmp);\n\t}\n\n\tvoid accept(const swap_info_t& value) {\n\t\tauto tmp = render(value, context);\n\t\tconst std::vector<vnx::Object> empty = {to_amount_object(0, 0), to_amount_object(0, 0)};\n\t\tstd::vector<int> decimals(2);\n\t\tstd::vector<std::string> symbols(2);\n\t\tstd::vector<vnx::Object> wallet(empty);\n\t\tstd::vector<vnx::Object> balance(empty);\n\t\tstd::vector<vnx::Object> fees_paid(empty);\n\t\tstd::vector<vnx::Object> fees_claimed(empty);\n\t\tstd::vector<vnx::Object> user_total(empty);\n\t\tstd::vector<vnx::Object> volume_1d(empty);\n\t\tstd::vector<vnx::Object> volume_7d(empty);\n\t\tstd::vector<vnx::Object> pools;\n\t\tif(context) {\n\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\tif(auto token = context->find_currency(value.tokens[i])) {\n\t\t\t\t\tsymbols[i] = token->symbol;\n\t\t\t\t\tdecimals[i] = token->decimals;\n\t\t\t\t\twallet[i] = to_amount_object(value.wallet[i], token->decimals);\n\t\t\t\t\tbalance[i] = to_amount_object(value.balance[i], token->decimals);\n\t\t\t\t\tfees_paid[i] = to_amount_object(value.fees_paid[i], token->decimals);\n\t\t\t\t\tfees_claimed[i] = to_amount_object(value.fees_claimed[i], token->decimals);\n\t\t\t\t\tuser_total[i] = to_amount_object(value.user_total[i], token->decimals);\n\t\t\t\t\tvolume_1d[i] = to_amount_object(value.volume_1d[i], token->decimals);\n\t\t\t\t\tvolume_7d[i] = to_amount_object(value.volume_7d[i], token->decimals);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(const auto& info : value.pools) {\n\t\t\t\tvnx::Object tmp;\n\t\t\t\tstd::vector<vnx::Object> balance(empty);\n\t\t\t\tstd::vector<vnx::Object> fees_paid(empty);\n\t\t\t\tstd::vector<vnx::Object> fees_claimed(empty);\n\t\t\t\tstd::vector<vnx::Object> user_total(empty);\n\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\tif(auto token = context->find_currency(value.tokens[i])) {\n\t\t\t\t\t\tbalance[i] = to_amount_object(info.balance[i], token->decimals);\n\t\t\t\t\t\tfees_paid[i] = to_amount_object(info.fees_paid[i], token->decimals);\n\t\t\t\t\t\tfees_claimed[i] = to_amount_object(info.fees_claimed[i], token->decimals);\n\t\t\t\t\t\tuser_total[i] = to_amount_object(info.user_total[i], token->decimals);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttmp[\"price\"] = to_value(info.balance[1], decimals[1]) / to_value(info.balance[0], decimals[0]);\n\t\t\t\ttmp[\"balance\"] = balance;\n\t\t\t\ttmp[\"fees_paid\"] = fees_paid;\n\t\t\t\ttmp[\"fees_claimed\"] = fees_claimed;\n\t\t\t\ttmp[\"user_total\"] = user_total;\n\t\t\t\tpools.push_back(tmp);\n\t\t\t}\n\t\t}\n\t\ttmp[\"symbols\"] = symbols;\n\t\ttmp[\"decimals\"] = decimals;\n\t\ttmp[\"wallet\"] = wallet;\n\t\ttmp[\"balance\"] = balance;\n\t\ttmp[\"fees_paid\"] = fees_paid;\n\t\ttmp[\"fees_claimed\"] = fees_claimed;\n\t\ttmp[\"user_total\"] = user_total;\n\t\ttmp[\"volume_1d\"] = volume_1d;\n\t\ttmp[\"volume_7d\"] = volume_7d;\n\t\ttmp[\"pools\"] = pools;\n\t\ttmp[\"price\"] = to_value(value.balance[1], decimals[1]) / to_value(value.balance[0], decimals[0]);\n\t\tset(tmp);\n\t}\n\n\tvoid accept(const swap_entry_t& value) {\n\t\tauto tmp = render(value, context);\n\t\tif(context) {\n\t\t\ttmp[\"time\"] = value.time_stamp / 1e3;\n\t\t}\n\t\tset(tmp);\n\t}\n\n\tvoid accept(const exec_entry_t& value) {\n\t\tauto tmp = render(value, context);\n\t\tif(context) {\n\t\t\tif(value.deposit) {\n\t\t\t\tvnx::Object deposit;\n\t\t\t\tconst auto currency = value.deposit->first;\n\t\t\t\tdeposit[\"currency\"] = currency.to_string();\n\t\t\t\tif(auto token = context->find_currency(currency)) {\n\t\t\t\t\tdeposit[\"amount\"] = to_amount_object(value.deposit->second, token->decimals);\n\t\t\t\t}\n\t\t\t\ttmp[\"deposit\"] = deposit;\n\t\t\t}\n\t\t\ttmp[\"time\"] = value.time_stamp / 1e3;\n\t\t}\n\t\tset(tmp);\n\t}\n\n//\tvoid accept(std::shared_ptr<const Transaction> value) {\n//\t\tset(render(value, context));\n//\t}\n\n//\tvoid accept(std::shared_ptr<const TransactionBase> base) {\n//\t\tif(auto value = std::dynamic_pointer_cast<const Transaction>(base)) {\n//\t\t\tset(render(value, context));\n//\t\t} else {\n//\t\t\tset(base);\n//\t\t}\n//\t}\n\n\tvoid accept(std::shared_ptr<const Operation> base) {\n\t\tif(auto value = std::dynamic_pointer_cast<const operation::Deposit>(base)) {\n\t\t\tset(render(value, context));\n\t\t} else if(auto value = std::dynamic_pointer_cast<const operation::Execute>(base)) {\n\t\t\tset(render(value, context));\n\t\t} else {\n\t\t\tset(base);\n\t\t}\n\t}\n\n\tvoid accept(std::shared_ptr<const Solution> base) {\n\t\tif(auto value = std::dynamic_pointer_cast<const solution::PubKey>(base)) {\n\t\t\tset(render(value, context));\n\t\t} else if(auto value = std::dynamic_pointer_cast<const solution::MultiSig>(base)) {\n\t\t\tset(render(value, context));\n\t\t} else {\n\t\t\tset(base);\n\t\t}\n\t}\n\n\tvoid accept(std::shared_ptr<const Contract> base) {\n\t\tif(auto value = std::dynamic_pointer_cast<const contract::Data>(base)) {\n\t\t\tset(render(value, context));\n\t\t} else if(auto value = std::dynamic_pointer_cast<const contract::MultiSig>(base)) {\n\t\t\tset(render(value, context));\n\t\t} else if(auto value = std::dynamic_pointer_cast<const contract::TokenBase>(base)) {\n\t\t\tset(render(value, context));\n\t\t} else if(auto value = std::dynamic_pointer_cast<const contract::Binary>(base)) {\n\t\t\tset(render(value, context));\n\t\t} else if(auto value = std::dynamic_pointer_cast<const contract::PubKey>(base)) {\n\t\t\tset(render(value, context));\n\t\t} else if(auto value = std::dynamic_pointer_cast<const contract::WebData>(base)) {\n\t\t\tset(render(value, context));\n\t\t} else {\n\t\t\tset(base);\n\t\t}\n\t}\n\n\tvoid accept(std::shared_ptr<const ProofOfSpace> value) {\n\t\tif(value) {\n\t\t\tauto tmp = render(value, context).to_object();\n\t\t\tif(context && context->hide_proof) {\n\t\t\t\ttmp.erase(\"proof_xs\");\n\t\t\t}\n\t\t\tset(tmp);\n\t\t} else {\n\t\t\tset(render(value, context));\n\t\t}\n\t}\n\n\tvoid augment_block_header(vnx::Object& tmp, std::shared_ptr<const BlockHeader> value) {\n\t\tif(context) {\n\t\t\ttmp[\"tx_fees\"] = to_amount_object(value->tx_fees, context->params->decimals);\n\t\t\ttmp[\"total_cost\"] = to_amount_object(value->total_cost, context->params->decimals);\n\t\t\ttmp[\"static_cost\"] = to_amount_object(value->static_cost, context->params->decimals);\n\t\t\ttmp[\"reward_amount\"] = to_amount_object(value->reward_amount, context->params->decimals);\n\t\t\ttmp[\"base_reward\"] = to_amount_object(value->base_reward, context->params->decimals);\n\t\t\ttmp[\"vdf_reward\"] = to_amount_object(value->vdf_reward_payout ? context->params->vdf_reward : 0, context->params->decimals);\n\t\t\ttmp[\"project_reward\"] = to_amount_object(calc_project_reward(context->params, value->tx_fees), context->params->decimals);\n\t\t\ttmp[\"txfee_buffer\"] = to_amount_object(value->txfee_buffer, context->params->decimals);\n\t\t\ttmp[\"average_txfee\"] = to_amount_object(calc_min_reward_deduction(context->params, value->txfee_buffer), context->params->decimals);\n\t\t\ttmp[\"static_cost_ratio\"] = double(value->static_cost) / context->params->max_block_size;\n\t\t\ttmp[\"total_cost_ratio\"] = double(value->total_cost) / context->params->max_block_cost;\n\t\t}\n\t\tif(value->proof.size()) {\n\t\t\tconst auto& proof = value->proof[0];\n\t\t\ttmp[\"score\"] = proof->score;\n\t\t\ttmp[\"ksize\"] = proof->get_field(\"ksize\");\n\t\t\ttmp[\"farmer_key\"] = proof->farmer_key.to_string();\n\t\t}\n\t\ttmp[\"time\"] = value->time_stamp / 1e3;\n\t}\n\n\tvoid accept(std::shared_ptr<const BlockHeader> value) {\n\t\tif(auto block = std::dynamic_pointer_cast<const Block>(value)) {\n\t\t\taccept(block);\n\t\t} else if(value) {\n\t\t\tauto tmp = render(*value, context);\n\t\t\taugment_block_header(tmp, value);\n\t\t\tset(tmp);\n\t\t} else {\n\t\t\tset(render(value));\n\t\t}\n\t}\n\n\tvoid accept(std::shared_ptr<const Block> value) {\n\t\tif(value) {\n\t\t\tauto tmp = render(*value, context);\n\t\t\taugment_block_header(tmp, value);\n\t\t\tset(tmp);\n\t\t} else {\n\t\t\tset(render(value));\n\t\t}\n\t}\n\n\tstd::shared_ptr<const RenderContext> context;\n\nprivate:\n\tvnx::Variant* p_value = &result;\n\n};\n\ntemplate<typename T>\nvnx::Object render(const T& value, std::shared_ptr<const RenderContext> context) {\n\tRender visitor(context);\n\tvalue.accept_generic(visitor);\n\treturn std::move(visitor.object);\n}\n\ntemplate<typename T>\nvnx::Variant render(std::shared_ptr<const T> value, std::shared_ptr<const RenderContext> context) {\n\tRender visitor(context);\n\tvnx::accept_generic(visitor, value);\n\treturn std::move(visitor.result);\n}\n\ntemplate<typename T>\nvnx::Variant render_value(const T& value, std::shared_ptr<const RenderContext> context = nullptr) {\n\tRender visitor(context);\n\tvisitor.accept(value);\n\treturn std::move(visitor.result);\n}\n\ntemplate<typename T>\nvnx::Object render_object(const T& value, std::shared_ptr<const RenderContext> context = nullptr) {\n\treturn render_value(value, context).to_object();\n}\n\nstd::shared_ptr<RenderContext> WebAPI::get_context() const\n{\n\tauto context = std::make_shared<RenderContext>(params);\n\tcontext->curr_height = curr_height;\n\treturn context;\n}\n\nvoid WebAPI::render_header(const vnx::request_id_t& request_id, std::shared_ptr<const BlockHeader> block) const\n{\n\tif(!block) {\n\t\trespond_status(request_id, 204);\n\t\treturn;\n\t}\n\trespond(request_id, render_value(block, get_context()));\n}\n\nvoid WebAPI::render_headers(const vnx::request_id_t& request_id, size_t limit, const size_t offset) const\n{\n\tlimit = std::min(limit, offset);\n\n\tstruct job_t {\n\t\tsize_t num_left = 0;\n\t\tvnx::request_id_t request_id;\n\t\tstd::vector<vnx::Variant> result;\n\t};\n\tauto job = std::make_shared<job_t>();\n\tjob->num_left = limit;\n\tjob->request_id = request_id;\n\tjob->result.resize(limit);\n\n\tif(!job->num_left) {\n\t\trespond(request_id, render_value(job->result));\n\t\treturn;\n\t}\n\tconst auto context = get_context();\n\tcontext->hide_proof = true;\n\n\tfor(size_t i = 0; i < limit; ++i) {\n\t\tnode->get_header_at(offset - i,\n\t\t\t[this, job, context, i](std::shared_ptr<const BlockHeader> block) {\n\t\t\t\tjob->result[i] = render_value(block, context);\n\t\t\t\tif(--job->num_left == 0) {\n\t\t\t\t\trespond(job->request_id, render_value(job->result));\n\t\t\t\t}\n\t\t\t});\n\t}\n}\n\nvoid WebAPI::render_block_graph(const vnx::request_id_t& request_id, size_t limit, const size_t step, const uint32_t height) const\n{\n\tlimit = std::min(limit, (height + step - 1) / step);\n\n\tstruct job_t {\n\t\tsize_t num_left = 0;\n\t\tvnx::request_id_t request_id;\n\t\tstd::vector<vnx::Object> result;\n\t};\n\tauto job = std::make_shared<job_t>();\n\tjob->num_left = limit;\n\tjob->request_id = request_id;\n\tjob->result.resize(limit);\n\n\tif(!job->num_left) {\n\t\trespond(request_id, render_value(job->result));\n\t\treturn;\n\t}\n\tfor(size_t i = 0; i < limit; ++i) {\n\t\tnode->get_header_at(height - i * step,\n\t\t\t[this, job, i](std::shared_ptr<const BlockHeader> block) {\n\t\t\t\tif(block) {\n\t\t\t\t\tauto& out = job->result[i];\n\t\t\t\t\tout[\"height\"] = block->height;\n\t\t\t\t\tout[\"tx_count\"] = block->tx_count;\n\t\t\t\t\tout[\"netspace\"] = double(uint64_t(calc_total_netspace(params, block->space_diff) / 1000 / 1000 / 1000)) * pow(1000, -2);\n\t\t\t\t\tout[\"vdf_speed\"] = get_vdf_speed(params, block->time_diff) / 1e6;\n\t\t\t\t\tif(block->proof.size()) {\n\t\t\t\t\t\tout[\"score\"] = block->proof[0]->score;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tout[\"score\"] = nullptr;\n\t\t\t\t\t}\n\t\t\t\t\tout[\"reward\"] = to_value(block->reward_amount, params->decimals);\n\t\t\t\t\tout[\"tx_fees\"] = to_value(block->tx_fees, params->decimals);\n\t\t\t\t\tout[\"base_reward\"] = to_value(block->base_reward, params->decimals);\n\t\t\t\t}\n\t\t\t\tif(--job->num_left == 0) {\n\t\t\t\t\trespond(job->request_id, render_value(job->result));\n\t\t\t\t}\n\t\t\t});\n\t}\n}\n\nvoid WebAPI::render_block(const vnx::request_id_t& request_id, std::shared_ptr<const Block> block) const\n{\n\tif(!block) {\n\t\trespond_status(request_id, 204);\n\t\treturn;\n\t}\n\tstd::unordered_set<addr_t> addr_set;\n\tfor(const auto& base : block->tx_list) {\n\t\tif(auto tx = std::dynamic_pointer_cast<const Transaction>(base)) {\n\t\t\tfor(const auto& in : tx->get_inputs()) {\n\t\t\t\taddr_set.insert(in.contract);\n\t\t\t}\n\t\t\tfor(const auto& out : tx->get_outputs()) {\n\t\t\t\taddr_set.insert(out.contract);\n\t\t\t}\n\t\t\tfor(const auto& op : tx->execute) {\n\t\t\t\tif(op) {\n\t\t\t\t\taddr_set.insert(op->address);\n\t\t\t\t}\n\t\t\t\tif(auto deposit = std::dynamic_pointer_cast<const operation::Deposit>(op)) {\n\t\t\t\t\taddr_set.insert(deposit->currency);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tget_context(addr_set, request_id,\n\t\t[this, request_id, block](std::shared_ptr<const RenderContext> context) {\n\t\t\trespond(request_id, render_value(block, context));\n\t\t});\n}\n\nvoid WebAPI::render_blocks(const vnx::request_id_t& request_id, size_t limit, const size_t offset) const\n{\n\tlimit = std::min(limit, offset);\n\n\tstruct job_t {\n\t\tsize_t num_left = 0;\n\t\tvnx::request_id_t request_id;\n\t\tstd::vector<vnx::Variant> result;\n\t};\n\tauto job = std::make_shared<job_t>();\n\tjob->num_left = limit;\n\tjob->request_id = request_id;\n\tjob->result.resize(limit);\n\n\tif(!job->num_left) {\n\t\trespond(request_id, render_value(job->result));\n\t\treturn;\n\t}\n\tfor(size_t i = 0; i < limit; ++i) {\n\t\tnode->get_block_at(offset - i,\n\t\t\t[this, job, i](std::shared_ptr<const Block> block) {\n\t\t\t\tjob->result[i] = render_value(block, get_context());\n\t\t\t\tif(--job->num_left == 0) {\n\t\t\t\t\trespond(job->request_id, render_value(job->result));\n\t\t\t\t}\n\t\t\t});\n\t}\n}\n\nvoid WebAPI::render_transaction(const vnx::request_id_t& request_id, const vnx::optional<tx_info_t>& info) const\n{\n\tif(!info) {\n\t\trespond_status(request_id, 204);\n\t\treturn;\n\t}\n\tauto context = get_context();\n\tfor(const auto& entry : info->contracts) {\n\t\tcontext->add_contract(entry.first, entry.second);\n\t}\n\trespond(request_id, render_value(info, context));\n}\n\nvoid WebAPI::render_transactions(\tconst vnx::request_id_t& request_id, size_t limit, const size_t offset,\n\t\t\t\t\t\t\t\t\tconst std::vector<hash_t>& tx_ids) const\n{\n\tlimit = std::min(limit, tx_ids.size() - std::min(offset, tx_ids.size()));\n\n\tstruct job_t {\n\t\tsize_t num_left = 0;\n\t\tvnx::request_id_t request_id;\n\t\tstd::vector<vnx::Variant> result;\n\t};\n\tauto job = std::make_shared<job_t>();\n\tjob->num_left = limit;\n\tjob->request_id = request_id;\n\tjob->result.resize(limit);\n\n\tif(!job->num_left) {\n\t\trespond(request_id, render_value(job->result));\n\t\treturn;\n\t}\n\tfor(size_t i = 0; i < limit; ++i) {\n\t\tconst auto txid = tx_ids[offset + i];\n\t\tnode->get_tx_info(txid,\n\t\t\t[this, job, txid, i](const vnx::optional<tx_info_t>& info) {\n\t\t\t\tif(info && info->id == txid) {\n\t\t\t\t\tauto context = get_context();\n\t\t\t\t\tfor(const auto& entry : info->contracts) {\n\t\t\t\t\t\tcontext->add_contract(entry.first, entry.second);\n\t\t\t\t\t}\n\t\t\t\t\tjob->result[i] = render_value(info, context);\n\t\t\t\t}\n\t\t\t\tif(--job->num_left == 0) {\n\t\t\t\t\tstd::vector<vnx::Variant> out;\n\t\t\t\t\tfor(auto& entry : job->result) {\n\t\t\t\t\t\tif(!entry.empty()) {\n\t\t\t\t\t\t\tout.push_back(std::move(entry));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\trespond(job->request_id, render_value(out));\n\t\t\t\t}\n\t\t\t});\n\t}\n}\n\nvoid WebAPI::render_address(const vnx::request_id_t& request_id, const addr_t& address, const std::map<addr_t, uint128>& balances) const\n{\n\tstd::unordered_set<addr_t> addr_set;\n\tfor(const auto& entry : balances) {\n\t\taddr_set.insert(entry.first);\n\t}\n\tget_context(addr_set, request_id,\n\t\t[this, request_id, address, balances](std::shared_ptr<const RenderContext> context) {\n\t\t\tRender visitor(context);\n\t\t\tstd::vector<vnx::Object> rows;\n\t\t\tfor(const auto& entry : balances) {\n\t\t\t\trows.push_back(visitor.to_output(entry.first, entry.second));\n\t\t\t}\n\t\t\tnode->get_contract(address,\n\t\t\t\t[this, request_id, rows](std::shared_ptr<const Contract> contract) {\n\t\t\t\t\tvnx::Object out;\n\t\t\t\t\tout[\"balances\"] = rows;\n\t\t\t\t\tout[\"contract\"] = render_value(contract);\n\t\t\t\t\trespond(request_id, out);\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t});\n}\n\nvoid WebAPI::render_balances(const vnx::request_id_t& request_id, const vnx::optional<addr_t>& currency, const std::map<addr_t, balance_t>& balances) const\n{\n\tstd::unordered_set<addr_t> addr_set;\n\tfor(const auto& entry : balances) {\n\t\taddr_set.insert(entry.first);\n\t}\n\tget_context(addr_set, request_id,\n\t\t[this, request_id, currency, balances](std::shared_ptr<const RenderContext> context) {\n\t\t\tRender visitor(context);\n\t\t\tstd::vector<vnx::Object> rows;\n\t\t\tstd::vector<addr_t> nfts;\n\t\t\tfor(const auto& entry : balances) {\n\t\t\t\tif(currency && entry.first != *currency) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(auto currency = context->find_currency(entry.first)) {\n\t\t\t\t\tif(currency->is_nft) {\n\t\t\t\t\t\tnfts.push_back(entry.first);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst auto& balance = entry.second;\n\t\t\t\t\t\tvnx::Object row;\n\t\t\t\t\t\trow[\"total\"] = to_value(balance.total, currency->decimals);\n\t\t\t\t\t\trow[\"spendable\"] = to_value(balance.spendable, currency->decimals);\n\t\t\t\t\t\trow[\"reserved\"] = to_value(balance.reserved, currency->decimals);\n\t\t\t\t\t\trow[\"locked\"] = to_value(balance.locked, currency->decimals);\n\t\t\t\t\t\trow[\"symbol\"] = currency->symbol;\n\t\t\t\t\t\trow[\"decimals\"] = currency->decimals;\n\t\t\t\t\t\trow[\"contract\"] = entry.first.to_string();\n\t\t\t\t\t\tif(entry.first == addr_t()) {\n\t\t\t\t\t\t\trow[\"is_native\"] = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trow[\"is_validated\"] = balance.is_validated;\n\t\t\t\t\t\trows.push_back(row);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(currency) {\n\t\t\t\tif(rows.empty()) {\n\t\t\t\t\tif(nfts.empty()) {\n\t\t\t\t\t\trespond(request_id, vnx::Variant());\n\t\t\t\t\t} else {\n\t\t\t\t\t\trespond(request_id, vnx::Variant(true));\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\trespond(request_id, rows[0]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvnx::Object out;\n\t\t\t\tout[\"nfts\"] = render_value(nfts);\n\t\t\t\tout[\"balances\"] = rows;\n\t\t\t\trespond(request_id, out);\n\t\t\t}\n\t\t});\n}\n\nvoid WebAPI::render_history(const vnx::request_id_t& request_id, std::vector<tx_entry_t> history) const\n{\n\tstd::unordered_set<addr_t> addr_set;\n\tfor(const auto& entry : history) {\n\t\taddr_set.insert(entry.contract);\n\t}\n\tget_context(addr_set, request_id,\n\t\t[this, request_id, history](std::shared_ptr<const RenderContext> context) {\n\t\t\trespond(request_id, render_value(history, context));\n\t\t});\n}\n\nvoid WebAPI::render_tx_history(const vnx::request_id_t& request_id, const std::vector<tx_log_entry_t>& history) const\n{\n\tstruct job_t {\n\t\tsize_t num_left = 0;\n\t\tvnx::request_id_t request_id;\n\t\tstd::vector<vnx::Object> result;\n\t};\n\tauto job = std::make_shared<job_t>();\n\tjob->num_left = history.size();\n\tjob->request_id = request_id;\n\tjob->result.resize(history.size());\n\n\tif(!job->num_left) {\n\t\trespond(request_id, render_value(job->result));\n\t\treturn;\n\t}\n\tconst auto context = get_context();\n\n\tfor(size_t i = 0; i < history.size(); ++i) {\n\t\tconst auto& entry = history[i];\n\t\tconst auto& tx = entry.tx;\n\t\tnode->get_tx_info(tx->id,\n\t\t\t[this, context, job, entry, tx, i](const vnx::optional<tx_info_t>& info) {\n\t\t\t\tauto& out = job->result[i];\n\t\t\t\tif(info) {\n\t\t\t\t\tout = render_object(*info, context);\n\t\t\t\t\tif(auto height = info->height) {\n\t\t\t\t\t\tout[\"confirm\"] = curr_height >= *height ? curr_height - *height + 1 : 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tout[\"confirm\"] = 0;\n\t\t\t\t\t}\n\t\t\t\t\tif(info->did_fail) {\n\t\t\t\t\t\tout[\"state\"] = \"failed\";\n\t\t\t\t\t} else if(!info->height) {\n\t\t\t\t\t\tif(curr_height > tx->expires) {\n\t\t\t\t\t\t\tout[\"state\"] = \"expired\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tout[\"state\"] = \"pending\";\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tout[\"state\"] = \"confirmed\";\n\t\t\t\t\t}\n\t\t\t\t} else if(curr_height > tx->expires) {\n\t\t\t\t\tout[\"state\"] = \"expired\";\n\t\t\t\t} else {\n\t\t\t\t\tout[\"state\"] = \"pending\";\n\t\t\t\t}\n\t\t\t\tout[\"time\"] = entry.time;\n\t\t\t\tout[\"id\"] = tx->id.to_string();\n\t\t\t\tout[\"note\"] = tx->note.to_string_value();\n\n\t\t\t\tif(--job->num_left == 0) {\n\t\t\t\t\trespond(job->request_id, render_value(job->result));\n\t\t\t\t}\n\t\t\t});\n\t}\n}\n\nvoid WebAPI::shutdown()\n{\n\t((WebAPI*)this)->set_timeout_millis(1000, []() {\n\t\tvnx::ProcessClient client(\"vnx.process\");\n\t\tclient.trigger_shutdown_async();\n\t});\n}\n\ntemplate<typename T>\nvoid require(std::shared_ptr<const vnx::Session> session, const T& perm)\n{\n\tif(!session->has_permission(perm.to_string_value_full())) {\n\t\tthrow vnx::permission_denied(perm);\n\t}\n}\n\ntemplate<typename T>\nT get_param(const std::map<std::string, std::string>& map, const std::string& name, const T& def = T())\n{\n\tauto iter = map.find(name);\n\tif(iter != map.end()) {\n\t\treturn vnx::from_string_value<T>(iter->second);\n\t}\n\treturn def;\n}\n\nvoid WebAPI::http_request_async(std::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\tconst vnx::request_id_t& request_id) const\n{\n\tauto session = request->session;\n\tif(!session) {\n\t\tthrow std::logic_error(\"not logged in\");\n\t}\n\tauto vnx_session = vnx::get_session(session->vsid);\n\tif(!vnx_session) {\n\t\tthrow std::logic_error(\"invalid session\");\n\t}\n\tif(request->method != \"HEAD\" && request->method != \"GET\" && request->method != \"POST\") {\n\t\tthrow std::logic_error(\"invalid method: \" + request->method);\n\t}\n\tconst bool is_private = vnx_session->has_permission(\"vnx.permission_e.CONST_REQUEST\");\n\tconst bool is_public = !is_private;\n\n\tif(is_public) {\n\t\tif(!is_synced || curr_height - synced_since < sync_delay) {\n\t\t\trespond_status(request_id, 503, \"lost sync with network\");\n\t\t\treturn;\n\t\t}\n\t\tif(\t\tsub_path.rfind(\"/wallet/\", 0) == 0\n\t\t\t||\tsub_path.rfind(\"/farm/\", 0) == 0)\n\t\t{\n\t\t\tthrow vnx::permission_denied();\n\t\t}\n\t}\n\tconst auto& query = request->query_params;\n\n\tbool have_args = false;\n\tvnx::Object args;\n\tif(request->content_type.find(\"application/json\") == 0\n\t\t|| request->content_type.find(\"text/plain\") == 0)\n\t{\n\t\thave_args = true;\n\t\tvnx::from_string(request->payload.as_string(), args);\n\t}\n\n\tif(sub_path == \"/config/get\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::READ_CONFIG);\n\t\tstd::lock_guard lock(g_config_mutex);\n\t\tconst auto key = get_param<std::string>(query, \"key\");\n\t\tif(key.size()) {\n\t\t\trespond(request_id, vnx::get_config(key, true));\n\t\t} else {\n\t\t\tvnx::Object object;\n\t\t\tconst auto config = vnx::get_all_configs(true);\n\t\t\tobject.field = std::map<std::string, vnx::Variant>(config.begin(), config.end());\n\t\t\trespond(request_id, object);\n\t\t}\n\t}\n\telse if(sub_path == \"/config/set\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::WRITE_CONFIG);\n\t\tstd::lock_guard lock(g_config_mutex);\n\t\tconst auto iter_key = args.field.find(\"key\");\n\t\tconst auto iter_value = args.field.find(\"value\");\n\t\tif(iter_key != args.field.end() && iter_value != args.field.end())\n\t\t{\n\t\t\tconst auto key = iter_key->second.to_string_value();\n\t\t\tconst auto value = iter_value->second;\n\n\t\t\tif(vnx::is_config_protected(key)) {\n\t\t\t\tthrow std::logic_error(\"config is protected\");\n\t\t\t}\n\t\t\tvnx::set_config(key, value);\n\n\t\t\tconst bool tmp_only = args[\"tmp_only\"];\n\t\t\tif(!tmp_only) {\n\t\t\t\tstd::string file;\n\t\t\t\tvnx::optional<std::string> field;\n\t\t\t\t{\n\t\t\t\t\tconst auto pos = key.find('.');\n\t\t\t\t\tif(pos == std::string::npos) {\n\t\t\t\t\t\tfile = key;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfile = key.substr(0, pos) + \".json\";\n\t\t\t\t\t\tfield = key.substr(pos + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(field) {\n\t\t\t\t\tconst auto path = config_path + file;\n\t\t\t\t\tauto object = vnx::read_config_file(path);\n\t\t\t\t\tobject[*field] = value;\n\t\t\t\t\tvnx::write_config_file(path, object);\n\t\t\t\t\tlog(INFO) << \"Updated '\" << *field << \"'\" << \": \" << value << \" (in \" << path << \")\";\n\t\t\t\t} else {\n\t\t\t\t\tconst auto path = config_path + file;\n\t\t\t\t\tstd::ofstream(path) << value << std::endl;\n\t\t\t\t\tlog(INFO) << \"Updated \" << path << \": \" << value;\n\t\t\t\t}\n\t\t\t}\n\t\t\trespond_status(request_id, 200);\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST config/set {key, value, [tmp_only]}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/exit\" || sub_path == \"/node/exit\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::SHUTDOWN);\n\t\t((WebAPI*)this)->shutdown();\n\t\trespond_status(request_id, 200);\n\t}\n\telse if(sub_path == \"/chain/info\") {\n\t\trespond(request_id, render(params));\n\t}\n\telse if(sub_path == \"/node/info\") {\n\t\tnode->get_network_info(\n\t\t\t[this, request_id](std::shared_ptr<const NetworkInfo> info) {\n\t\t\t\tvnx::Object res;\n\t\t\t\tif(info) {\n\t\t\t\t\tauto context = get_context();\n\t\t\t\t\tres = render(*info);\n\t\t\t\t\tres[\"time\"] = info->time_stamp / 1e3;\n\t\t\t\t\tres[\"block_reward\"] = to_amount_object(info->block_reward, params->decimals);\n\t\t\t\t\tres[\"average_txfee\"] = to_amount_object(info->average_txfee, params->decimals);\n\t\t\t\t}\n\t\t\t\trespond(request_id, res);\n\t\t\t},\n\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t}\n\telse if(sub_path == \"/node/log\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::VIEW);\n\t\tconst auto iter_limit = query.find(\"limit\");\n\t\tconst auto iter_level = query.find(\"level\");\n\t\tconst auto iter_module = query.find(\"module\");\n\t\tconst int level = iter_level != query.end() ? vnx::from_string<int32_t>(iter_level->second) : 3;\n\t\tconst size_t limit = iter_limit != query.end() ? std::max<int64_t>(vnx::from_string<int64_t>(iter_limit->second), 0) : 100;\n\t\tstd::vector<vnx::Object> res;\n\t\tfor(auto iter = log_history.rbegin(); iter != log_history.rend(); ++iter) {\n\t\t\tif(res.size() >= limit) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst auto& msg = iter->first;\n\t\t\tif(msg->level <= level) {\n\t\t\t\tif(iter_module == query.end() || msg->module == iter_module->second) {\n\t\t\t\t\tauto tmp = msg->to_object();\n\t\t\t\t\ttmp[\"id\"] = iter->second;\n\t\t\t\t\tres.push_back(tmp);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\trespond(request_id, render_value(res));\n\t}\n\telse if(sub_path == \"/node/graph/blocks\") {\n\t\tconst auto iter_limit = query.find(\"limit\");\n\t\tconst auto iter_step = query.find(\"step\");\n\t\tconst uint32_t limit = iter_limit != query.end() ? std::max<int64_t>(vnx::from_string<int64_t>(iter_limit->second), 0) : 1000;\n\t\tconst uint32_t step = iter_step != query.end() ? std::max<int64_t>(vnx::from_string<int64_t>(iter_step->second), 0) : 90;\n\t\tif(is_public && limit > 1000) {\n\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t}\n\t\tnode->get_height(\n\t\t\t\t[this, request_id, limit, step](const uint32_t& height) {\n\t\t\t\t\trender_block_graph(request_id, limit, step, height);\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t}\n\telse if(sub_path == \"/header\") {\n\t\tconst auto iter_hash = query.find(\"hash\");\n\t\tconst auto iter_height = query.find(\"height\");\n\t\tif(iter_hash != query.end()) {\n\t\t\tnode->get_header(vnx::from_string_value<hash_t>(iter_hash->second),\n\t\t\t\tstd::bind(&WebAPI::render_header, this, request_id, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t}\n\t\telse if(iter_height != query.end()) {\n\t\t\tnode->get_header_at(vnx::from_string_value<uint32_t>(iter_height->second),\n\t\t\t\tstd::bind(&WebAPI::render_header, this, request_id, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"header?hash|height\");\n\t\t}\n\t}\n\telse if(sub_path == \"/headers\") {\n\t\tauto limit = get_param<uint32_t>(query, \"limit\");\n\t\tif(limit > 1000) {\n\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t}\n\t\tif(is_public && limit > 100) {\n\t\t\tthrow std::logic_error(\"limit > 100\");\n\t\t}\n\t\tconst auto offset = get_param<uint32_t>(query, \"offset\");\n\t\tif(offset && limit) {\n\t\t\trender_headers(request_id, limit, offset);\n\t\t} else if(!offset) {\n\t\t\tif(!limit) {\n\t\t\t\tlimit = 20;\n\t\t\t}\n\t\t\tnode->get_height(\n\t\t\t\t[this, request_id, limit](const uint32_t& height) {\n\t\t\t\t\trender_headers(request_id, limit, height);\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"headers?limit|offset\");\n\t\t}\n\t}\n\telse if(sub_path == \"/block\") {\n\t\tconst auto iter_hash = query.find(\"hash\");\n\t\tconst auto iter_height = query.find(\"height\");\n\t\tif(iter_hash != query.end()) {\n\t\t\tnode->get_block(vnx::from_string_value<hash_t>(iter_hash->second),\n\t\t\t\tstd::bind(&WebAPI::render_block, this, request_id, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t}\n\t\telse if(iter_height != query.end()) {\n\t\t\tnode->get_block_at(vnx::from_string_value<uint32_t>(iter_height->second),\n\t\t\t\tstd::bind(&WebAPI::render_block, this, request_id, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"block?hash|height\");\n\t\t}\n\t}\n\telse if(sub_path == \"/blocks\") {\n\t\tif(is_public) {\n\t\t\tthrow vnx::permission_denied();\n\t\t}\n\t\tconst auto iter_limit = query.find(\"limit\");\n\t\tconst auto iter_offset = query.find(\"offset\");\n\t\tif(iter_limit != query.end() && iter_offset != query.end()) {\n\t\t\tconst size_t limit = std::max<int64_t>(vnx::from_string<int64_t>(iter_limit->second), 0);\n\t\t\tconst size_t offset = vnx::from_string<int64_t>(iter_offset->second);\n\t\t\trender_blocks(request_id, limit, offset);\n\t\t} else if(iter_offset == query.end()) {\n\t\t\tconst uint32_t limit = iter_limit != query.end() ?\n\t\t\t\t\tstd::max<int64_t>(vnx::from_string<int64_t>(iter_limit->second), 0) : 20;\n\t\t\tnode->get_height(\n\t\t\t\t[this, request_id, limit](const uint32_t& height) {\n\t\t\t\t\trender_blocks(request_id, limit, height);\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"blocks?limit|offset\");\n\t\t}\n\t}\n\telse if(sub_path == \"/transaction\") {\n\t\tconst auto iter_id = query.find(\"id\");\n\t\tif(iter_id != query.end()) {\n\t\t\tnode->get_tx_info(vnx::from_string_value<hash_t>(iter_id->second),\n\t\t\t\tstd::bind(&WebAPI::render_transaction, this, request_id, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"transaction?id\");\n\t\t}\n\t}\n\telse if(sub_path == \"/transactions\") {\n\t\tconst auto height = get_param<vnx::optional<uint32_t>>(query, \"height\");\n\t\tconst auto offset = get_param<uint32_t>(query, \"offset\");\n\t\t      auto limit = get_param<uint32_t>(query, \"limit\");\n\t\tif(height) {\n\t\t\tif(!limit) {\n\t\t\t\tlimit = (is_public ? 100 : -1);\n\t\t\t}\n\t\t\tif(is_public && limit > 1000) {\n\t\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t\t}\n\t\t\tnode->get_tx_ids_at(*height,\n\t\t\t\tstd::bind(&WebAPI::render_transactions, this, request_id, limit, offset, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\tif(!limit) {\n\t\t\t\tlimit = 100;\n\t\t\t}\n\t\t\tif(is_public && limit > 1000) {\n\t\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t\t}\n\t\t\tnode->get_tx_ids(limit,\n\t\t\t\tstd::bind(&WebAPI::render_transactions, this, request_id, limit, 0, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t}\n\t}\n\telse if(sub_path == \"/address\") {\n\t\tconst auto address = get_param<vnx::optional<addr_t>>(query, \"id\");\n\t\tif(address) {\n\t\t\tconst auto limit = get_param<uint32_t>(query, \"limit\", 100);\n\t\t\tif(is_public && limit > 1000) {\n\t\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t\t}\n\t\t\tnode->get_total_balances({*address}, {}, limit,\n\t\t\t\tstd::bind(&WebAPI::render_address, this, request_id, *address, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"address?id|limit\");\n\t\t}\n\t}\n\telse if(sub_path == \"/balance\") {\n\t\tconst auto address = get_param<vnx::optional<addr_t>>(query, \"id\");\n\t\tif(address) {\n\t\t\tconst auto limit = get_param<uint32_t>(query, \"limit\", 100);\n\t\t\tconst auto currency = get_param<vnx::optional<addr_t>>(query, \"currency\");\n\t\t\tif(is_public && limit > 1000) {\n\t\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t\t}\n\t\t\tstd::set<addr_t> whitelist;\n\t\t\tif(currency) {\n\t\t\t\twhitelist.insert(*currency);\n\t\t\t}\n\t\t\tnode->get_contract_balances(*address, whitelist, limit,\n\t\t\t\t[this, currency, request_id](const std::map<addr_t, balance_t>& balances) {\n\t\t\t\t\trender_balances(request_id, currency, balances);\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"balance?id|currency|limit\");\n\t\t}\n\t}\n\telse if(sub_path == \"/supply\") {\n\t\tconst auto currency = get_param<addr_t>(query, \"id\");\n\t\tget_context({currency}, request_id,\n\t\t\t[this, request_id, currency](std::shared_ptr<const RenderContext> context) {\n\t\t\t\tnode->get_total_supply(currency,\n\t\t\t\t\t[this, currency, context, request_id](const mmx::uint128& supply) {\n\t\t\t\t\t\trespond(request_id, render(to_amount_object(supply, context->get_currency(currency)->decimals)));\n\t\t\t\t\t},\n\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t});\n\t}\n\telse if(sub_path == \"/contract\") {\n\t\tconst auto iter = query.find(\"id\");\n\t\tif(iter != query.end()) {\n\t\t\tconst auto address = vnx::from_string_value<addr_t>(iter->second);\n\t\t\tnode->get_contract(address,\n\t\t\t\t[this, request_id](std::shared_ptr<const Contract> contract) {\n\t\t\t\t\trespond(request_id, render_value(contract));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"contract?id\");\n\t\t}\n\t}\n\telse if(sub_path == \"/plotnft\") {\n\t\tconst auto id = get_param<addr_t>(query, \"id\");\n\t\tif(!id.is_zero()) {\n\t\t\tnode->get_plot_nft_info(id,\n\t\t\t\t[this, request_id](const vnx::optional<plot_nft_info_t>& info) {\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\trespond(request_id, render_value(info));\n\t\t\t\t\t} else {\n\t\t\t\t\t\trespond_status(request_id, 204);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"plotnft?id\");\n\t\t}\n\t}\n\telse if(sub_path == \"/swap/list\") {\n\t\tconst auto token = get_param<vnx::optional<addr_t>>(query, \"token\");\n\t\tconst auto currency = get_param<vnx::optional<addr_t>>(query, \"currency\");\n\t\tconst auto since = get_param<uint32_t>(query, \"since\");\n\t\tconst uint32_t limit = get_param<int64_t>(query, \"limit\", 50);\n\t\tif(is_public && limit > 100) {\n\t\t\tthrow std::logic_error(\"limit > 100\");\n\t\t}\n\t\tnode->get_swaps(since, token, currency, limit,\n\t\t\t[this, request_id](const std::vector<swap_info_t>& list) {\n\t\t\t\tstd::unordered_set<addr_t> token_set;\n\t\t\t\tfor(const auto& entry : list) {\n\t\t\t\t\ttoken_set.insert(entry.tokens[0]);\n\t\t\t\t\ttoken_set.insert(entry.tokens[1]);\n\t\t\t\t}\n\t\t\t\tget_context(token_set, request_id,\n\t\t\t\t\t[this, request_id, list](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\trespond(request_id, render_value(list, context));\n\t\t\t\t\t});\n\t\t\t},\n\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t}\n\telse if(sub_path == \"/swap/info\") {\n\t\tconst auto iter = query.find(\"id\");\n\t\tif(iter != query.end()) {\n\t\t\tconst auto address = vnx::from_string_value<addr_t>(iter->second);\n\t\t\tnode->get_swap_info(address,\n\t\t\t\t[this, request_id](const swap_info_t& info) {\n\t\t\t\t\tget_context({info.tokens[0], info.tokens[1]}, request_id,\n\t\t\t\t\t\t[this, request_id, info](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\t\tauto out = render_object(info, context);\n\t\t\t\t\t\t\tstd::vector<int> decimals(2);\n\t\t\t\t\t\t\tstd::vector<std::string> symbols(2);\n\t\t\t\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\t\t\t\tif(auto token = context->find_currency(info.tokens[i])) {\n\t\t\t\t\t\t\t\t\tdecimals[i] = token->decimals;\n\t\t\t\t\t\t\t\t\tsymbols[i] = token->symbol;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tout[\"symbols\"] = symbols;\n\t\t\t\t\t\t\tout[\"decimals\"] = decimals;\n\t\t\t\t\t\t\trespond(request_id, out);\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"swap/info?id\");\n\t\t}\n\t}\n\telse if(sub_path == \"/swap/user_info\") {\n\t\tconst auto iter_id = query.find(\"id\");\n\t\tconst auto iter_user = query.find(\"user\");\n\t\tif(iter_id != query.end() && iter_user != query.end()) {\n\t\t\tconst auto address = vnx::from_string_value<addr_t>(iter_id->second);\n\t\t\tconst auto user = vnx::from_string_value<addr_t>(iter_user->second);\n\t\t\tnode->get_swap_info(address,\n\t\t\t\t[this, request_id, address, user](const swap_info_t& info) {\n\t\t\t\t\tget_context({info.tokens[0], info.tokens[1]}, request_id,\n\t\t\t\t\t\t[this, request_id, address, info, user](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\t\tnode->get_swap_user_info(address, user,\n\t\t\t\t\t\t\t\t[this, request_id, info, context](const swap_user_info_t& user_info) {\n\t\t\t\t\t\t\t\t\tvnx::Object out;\n\t\t\t\t\t\t\t\t\tconst std::vector<vnx::Object> empty = {to_amount_object(0, 0), to_amount_object(0, 0)};\n\t\t\t\t\t\t\t\t\tstd::vector<std::string> symbols(2);\n\t\t\t\t\t\t\t\t\tstd::vector<vnx::Object> balance(empty);\n\t\t\t\t\t\t\t\t\tstd::vector<vnx::Object> fees_earned(empty);\n\t\t\t\t\t\t\t\t\tstd::vector<vnx::Object> equivalent_liquidity(empty);\n\t\t\t\t\t\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\t\t\t\t\t\tif(auto token = context->find_currency(info.tokens[i])) {\n\t\t\t\t\t\t\t\t\t\t\tsymbols[i] = token->symbol;\n\t\t\t\t\t\t\t\t\t\t\tbalance[i] = to_amount_object(user_info.balance[i], token->decimals);\n\t\t\t\t\t\t\t\t\t\t\tfees_earned[i] = to_amount_object(user_info.fees_earned[i], token->decimals);\n\t\t\t\t\t\t\t\t\t\t\tequivalent_liquidity[i] = to_amount_object(user_info.equivalent_liquidity[i], token->decimals);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tout[\"pool_idx\"] = user_info.pool_idx;\n\t\t\t\t\t\t\t\t\tout[\"tokens\"] = render_value(info.tokens);\n\t\t\t\t\t\t\t\t\tout[\"symbols\"] = symbols;\n\t\t\t\t\t\t\t\t\tout[\"balance\"] = balance;\n\t\t\t\t\t\t\t\t\tout[\"fees_earned\"] = fees_earned;\n\t\t\t\t\t\t\t\t\tout[\"equivalent_liquidity\"] = equivalent_liquidity;\n\t\t\t\t\t\t\t\t\tout[\"unlock_height\"] = user_info.unlock_height;\n\t\t\t\t\t\t\t\t\tout[\"swap\"] = render_value(info, context);\n\t\t\t\t\t\t\t\t\trespond(request_id, out);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"swap/user_info?id|user\");\n\t\t}\n\t}\n\telse if(sub_path == \"/swap/history\") {\n\t\tif(const auto address = get_param<vnx::optional<addr_t>>(query, \"id\")) {\n\t\t\tconst auto limit = get_param<uint32_t>(query, \"limit\", 100);\n\t\t\tif(is_public && limit > 1000) {\n\t\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t\t}\n\t\t\tnode->get_swap_history(*address, limit,\n\t\t\t\t[this, request_id](const std::vector<swap_entry_t>& history) {\n\t\t\t\t\trespond(request_id, render_value(history, get_context()));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"swap/history?id|limit\");\n\t\t}\n\t}\n\telse if(sub_path == \"/swap/trade_estimate\") {\n\t\tconst auto iter_id = query.find(\"id\");\n\t\tconst auto iter_index = query.find(\"index\");\n\t\tconst auto iter_amount = query.find(\"amount\");\n\t\tconst auto iter_iters = query.find(\"iters\");\n\t\tif(iter_id != query.end() && iter_index != query.end() && iter_amount != query.end()) {\n\t\t\tconst auto address = vnx::from_string_value<addr_t>(iter_id->second);\n\t\t\tconst auto index = vnx::from_string_value<uint32_t>(iter_index->second);\n\t\t\tconst auto value = vnx::from_string_value<fixed128>(iter_amount->second);\n\t\t\tconst auto num_iter = iter_iters != query.end() ? vnx::from_string_value<int32_t>(iter_iters->second) : 20;\n\t\t\tnode->get_swap_info(address,\n\t\t\t\t[this, request_id, index, value, num_iter](const swap_info_t& info) {\n\t\t\t\t\tget_context({info.tokens[0], info.tokens[1]}, request_id,\n\t\t\t\t\t\t[this, request_id, index, info, value, num_iter](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\t\tconst auto token_i = context->find_currency(info.tokens[index]);\n\t\t\t\t\t\t\tconst auto token_k = context->find_currency(info.tokens[(index + 1) % 2]);\n\t\t\t\t\t\t\tif(token_i && token_k) {\n\t\t\t\t\t\t\t\tconst auto decimals_k = token_k->decimals;\n\t\t\t\t\t\t\t\tconst auto amount = to_amount(value, token_i->decimals);\n\t\t\t\t\t\t\t\tnode->get_swap_trade_estimate(info.address, index, amount, num_iter,\n\t\t\t\t\t\t\t\t\t[this, request_id, value, decimals_k](const std::array<uint128, 2>& ret) {\n\t\t\t\t\t\t\t\t\t\tvnx::Object out;\n\t\t\t\t\t\t\t\t\t\tout[\"trade\"] = to_amount_object_str(ret[0], decimals_k);\n\t\t\t\t\t\t\t\t\t\tout[\"fee\"] = to_amount_object_str(ret[1], decimals_k);\n\t\t\t\t\t\t\t\t\t\tconst auto fee_value = to_value(ret[1], decimals_k);\n\t\t\t\t\t\t\t\t\t\tconst auto trade_value = to_value(ret[0], decimals_k);\n\t\t\t\t\t\t\t\t\t\tout[\"fee_percent\"] = (100 * fee_value) / (trade_value + fee_value);\n\t\t\t\t\t\t\t\t\t\tout[\"avg_price\"] = trade_value / value.to_value();\n\t\t\t\t\t\t\t\t\t\trespond(request_id, render_value(out));\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthrow std::logic_error(\"unknown token\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"swap/trade_estimate?id|index|amount|iters\");\n\t\t}\n\t}\n\telse if(sub_path == \"/offer/trade_estimate\") {\n\t\tconst auto iter_id = query.find(\"id\");\n\t\tconst auto iter_amount = query.find(\"amount\");\n\t\tif(iter_id != query.end() && iter_amount != query.end()) {\n\t\t\tconst auto address = vnx::from_string_value<addr_t>(iter_id->second);\n\t\t\tconst auto value = vnx::from_string_value<fixed128>(iter_amount->second);\n\t\t\tnode->get_offer(address,\n\t\t\t\t[this, request_id, value](const offer_data_t& info) {\n\t\t\t\t\tget_context({info.bid_currency, info.ask_currency}, request_id,\n\t\t\t\t\t\t[this, request_id, info, value](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\t\tvnx::Object out;\n\t\t\t\t\t\t\tconst auto bid_currency = context->find_currency(info.bid_currency);\n\t\t\t\t\t\t\tconst auto ask_currency = context->find_currency(info.ask_currency);\n\t\t\t\t\t\t\tif(bid_currency && ask_currency) {\n\t\t\t\t\t\t\t\tconst auto amount = to_amount(value, ask_currency->decimals);\n\t\t\t\t\t\t\t\tconst auto bid_amount = info.get_bid_amount(amount);\n\t\t\t\t\t\t\t\tout[\"input\"] = to_amount_object_str(amount, ask_currency->decimals);\n\t\t\t\t\t\t\t\tout[\"trade\"] = to_amount_object_str(bid_amount, bid_currency->decimals);\n\t\t\t\t\t\t\t\tconst auto ask_amount = info.get_ask_amount(bid_amount + 1);\n\t\t\t\t\t\t\t\tif(!amount || uint128(bid_amount + 1).to_double() / ask_amount.to_double() > bid_amount.to_double() / amount.to_double()) {\n\t\t\t\t\t\t\t\t\tout[\"next_input\"] = to_amount_object_str(ask_amount, ask_currency->decimals);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tout[\"next_input\"] = to_amount_object_str(amount + 1, ask_currency->decimals);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tout[\"inv_price\"] = info.inv_price.to_string();\n\t\t\t\t\t\t\trespond(request_id, render_value(out));\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"offer/trade_estimate?id|amount\");\n\t\t}\n\t}\n\telse if(sub_path == \"/farmers\") {\n\t\tconst auto limit = get_param<uint32_t>(query, \"limit\", 100);\n\t\tif(is_public && limit > 1000) {\n\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t}\n\t\tnode->get_farmer_ranking(limit,\n\t\t\t[this, request_id](const std::vector<std::pair<pubkey_t, uint32_t>>& result) {\n\t\t\t\tstd::vector<vnx::Object> out;\n\t\t\t\tfor(const auto& entry : result) {\n\t\t\t\t\tvnx::Object tmp;\n\t\t\t\t\ttmp[\"farmer_key\"] = entry.first.to_string();\n\t\t\t\t\ttmp[\"block_count\"] = entry.second;\n\t\t\t\t\tout.push_back(tmp);\n\t\t\t\t}\n\t\t\t\trespond(request_id, render_value(out));\n\t\t\t},\n\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t}\n\telse if(sub_path == \"/farmer\") {\n\t\tconst auto farmer_key = get_param<pubkey_t>(query, \"id\");\n\t\tif(!farmer_key.is_zero()) {\n\t\t\tconst auto since = get_param<uint32_t>(query, \"since\");\n\t\t\tnode->get_farmed_block_summary({farmer_key}, since,\n\t\t\t\t[this, request_id, farmer_key](const farmed_block_summary_t& summary) {\n\t\t\t\t\tvnx::Object out;\n\t\t\t\t\tout[\"farmer_key\"] = farmer_key.to_string();\n\t\t\t\t\tout[\"block_count\"] = summary.num_blocks;\n\t\t\t\t\tout[\"total_reward\"] = summary.total_rewards;\n\t\t\t\t\tout[\"total_reward_value\"] = to_value(summary.total_rewards, params->decimals);\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::vector<vnx::Object> rewards;\n\t\t\t\t\t\tfor(const auto& entry : summary.reward_map) {\n\t\t\t\t\t\t\tvnx::Object tmp;\n\t\t\t\t\t\t\ttmp[\"address\"] = entry.first.to_string();\n\t\t\t\t\t\t\ttmp[\"amount\"] = entry.second;\n\t\t\t\t\t\t\ttmp[\"value\"] = to_value(entry.second, params->decimals);\n\t\t\t\t\t\t\trewards.push_back(tmp);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tout[\"rewards\"] = rewards;\n\t\t\t\t\t}\n\t\t\t\t\trespond(request_id, out);\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"farmer?id|since\");\n\t\t}\n\t}\n\telse if(sub_path == \"/farmer/blocks\") {\n\t\tconst auto farmer_key = get_param<pubkey_t>(query, \"id\");\n\t\tif(!farmer_key.is_zero()) {\n\t\t\tconst auto since = get_param<uint32_t>(query, \"since\");\n\t\t\tconst auto limit = get_param<uint32_t>(query, \"limit\", 50);\n\t\t\tif(is_public) {\n\t\t\t\tif(limit > 100) {\n\t\t\t\t\tthrow std::logic_error(\"limit > 100\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tnode->get_farmed_blocks({farmer_key}, false, since, limit,\n\t\t\t\t[this, request_id, farmer_key](const std::vector<std::shared_ptr<const BlockHeader>>& blocks) {\n\t\t\t\t\trespond(request_id, render_value(blocks, get_context()));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"farmer/blocks?id|since\");\n\t\t}\n\t}\n\telse if(sub_path == \"/address/history\") {\n\t\tif(const auto address = get_param<vnx::optional<addr_t>>(query, \"id\")) {\n\t\t\tquery_filter_t filter;\n\t\t\tfilter.limit = get_param<int32_t>(query, \"limit\", 100);\n\t\t\tfilter.since = get_param<uint32_t>(query, \"since\", 0);\n\t\t\tfilter.until = get_param<uint32_t>(query, \"until\", -1);\n\t\t\tfilter.type = get_param<vnx::optional<tx_type_e>>(query, \"type\");\n\t\t\tfilter.memo = get_param<vnx::optional<std::string>>(query, \"memo\");\n\t\t\tif(auto currency = get_param<vnx::optional<addr_t>>(query, \"currency\")) {\n\t\t\t\tfilter.currency.insert(*currency);\n\t\t\t}\n\t\t\tif(is_public) {\n\t\t\t\tif(filter.limit > 1000 || filter.limit < 0) {\n\t\t\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t\t\t}\n\t\t\t\tfilter.max_search = 10000;\n\t\t\t} else {\n\t\t\t\tfilter.max_search = 1000000;\n\t\t\t}\n\t\t\tnode->get_history({*address}, filter,\n\t\t\t\tstd::bind(&WebAPI::render_history, this, request_id, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"address/history?id|limit|since|until|type|memo|currency\");\n\t\t}\n\t}\n\telse if(sub_path == \"/contract/exec_history\") {\n\t\tif(const auto address = get_param<vnx::optional<addr_t>>(query, \"id\")) {\n\t\t\tconst auto limit = get_param<uint32_t>(query, \"limit\", 100);\n\t\t\tif(is_public && limit > 1000) {\n\t\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t\t}\n\t\t\tnode->get_exec_history(*address, limit, true,\n\t\t\t\t[this, request_id](const std::vector<exec_entry_t>& history) {\n\t\t\t\t\tstd::unordered_set<addr_t> token_set;\n\t\t\t\t\tfor(const auto& entry : history) {\n\t\t\t\t\t\tif(entry.deposit) {\n\t\t\t\t\t\t\ttoken_set.insert(entry.deposit->first);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tget_context(token_set, request_id,\n\t\t\t\t\t\t[this, request_id, history](std::shared_ptr<const RenderContext> context) {\n\t\t\t\t\t\t\trespond(request_id, render_value(history, context));\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"contract/exec_history?id|limit\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/keys\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto iter_index = query.find(\"index\");\n\t\tif(iter_index != query.end()) {\n\t\t\tconst uint32_t index = vnx::from_string<int64_t>(iter_index->second);\n\t\t\twallet->get_farmer_keys(index,\n\t\t\t\t[this, request_id](const std::pair<skey_t, pubkey_t>& keys) {\n\t\t\t\t\tvnx::Object out;\n\t\t\t\t\tout[\"farmer_public_key\"] = keys.second.to_string();\n\t\t\t\t\trespond(request_id, out);\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"wallet/keys?index\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/seed\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tconst auto iter_index = query.find(\"index\");\n\t\tif(iter_index != query.end()) {\n\t\t\tconst uint32_t index = vnx::from_string<int64_t>(iter_index->second);\n\t\t\twallet->get_mnemonic_seed(index,\n\t\t\t\t[this, request_id](const std::vector<std::string>& words) {\n\t\t\t\t\tvnx::Object out;\n\t\t\t\t\tout[\"words\"] = words;\n\t\t\t\t\tout[\"string\"] = mnemonic::words_to_string(words);\n\t\t\t\t\trespond(request_id, out);\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"wallet/seed?index\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/accounts\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\twallet->get_all_accounts(\n\t\t\t[this, request_id](const std::vector<account_info_t>& list) {\n\t\t\t\trespond(request_id, render_value(list));\n\t\t\t},\n\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t}\n\telse if(sub_path == \"/wallet/account\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto iter_index = query.find(\"index\");\n\t\tif(iter_index != query.end()) {\n\t\t\tconst uint32_t index = vnx::from_string<int64_t>(iter_index->second);\n\t\t\twallet->get_account(index,\n\t\t\t\t[this, request_id](const account_info_t& info) {\n\t\t\t\t\trespond(request_id, render(info));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"wallet/account?index\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/balance\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto iter_index = query.find(\"index\");\n\t\tconst auto iter_currency = query.find(\"currency\");\n\t\tconst auto iter_with_zero = query.find(\"with_zero\");\n\t\tif(iter_index != query.end()) {\n\t\t\tconst uint32_t index = vnx::from_string<int64_t>(iter_index->second);\n\t\t\tconst bool with_zero = iter_with_zero != query.end() ? vnx::from_string<bool>(iter_with_zero->second) : false;\n\t\t\tvnx::optional<addr_t> currency;\n\t\t\tif(iter_currency != query.end()) {\n\t\t\t\tcurrency = vnx::from_string<addr_t>(iter_currency->second);\n\t\t\t}\n\t\t\twallet->get_balances(index, with_zero,\n\t\t\t\tstd::bind(&WebAPI::render_balances, this, request_id, currency, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"wallet/balance?index|confirm|currency\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/contracts\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto index = get_param<int32_t>(query, \"index\", -1);\n\t\tif(index >= 0) {\n\t\t\tconst auto type_name = get_param<vnx::optional<std::string>>(query, \"type\");\n\t\t\tvnx::optional<hash_t> type_hash;\n\t\t\tif(auto tmp = get_param<vnx::optional<addr_t>>(query, \"type_hash\")) {\n\t\t\t\ttype_hash = *tmp;\n\t\t\t}\n\t\t\tconst auto callback = [this, request_id](const std::map<addr_t, std::shared_ptr<const Contract>>& map) {\n\t\t\t\tauto context = get_context();\n\t\t\t\tstd::vector<vnx::Object> res;\n\t\t\t\tfor(const auto& entry : map) {\n\t\t\t\t\tif(auto contract = entry.second) {\n\t\t\t\t\t\tauto tmp = render_object(contract, context);\n\t\t\t\t\t\ttmp[\"address\"] = entry.first.to_string();\n\t\t\t\t\t\tres.push_back(tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\trespond(request_id, vnx::Variant(res));\n\t\t\t};\n\t\t\tif(get_param<bool>(query, \"owned\")) {\n\t\t\t\twallet->get_contracts_owned(index, type_name, type_hash,\n\t\t\t\t\tcallback, std::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t} else {\n\t\t\t\twallet->get_contracts(index, type_name, type_hash,\n\t\t\t\t\tcallback, std::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t}\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"wallet/contracts?index\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/address\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto index = get_param<int32_t>(query, \"index\", -1);\n\t\tif(index >= 0) {\n\t\t\tconst auto limit = get_param<uint32_t>(query, \"limit\", 1);\n\t\t\tif(limit <= 1) {\n\t\t\t\tconst auto offset = get_param<uint32_t>(query, \"offset\");\n\t\t\t\twallet->get_address(index, offset,\n\t\t\t\t\t[this, request_id](const addr_t& address) {\n\t\t\t\t\t\trespond(request_id, vnx::Variant(address.to_string()));\n\t\t\t\t\t},\n\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t} else {\n\t\t\t\twallet->get_all_addresses(index,\n\t\t\t\t\t[this, request_id, limit](const std::vector<addr_t>& list) {\n\t\t\t\t\t\tstd::vector<std::string> res;\n\t\t\t\t\t\tfor(size_t i = 0; i < list.size() && i < limit; ++i) {\n\t\t\t\t\t\t\tres.push_back(list[i].to_string());\n\t\t\t\t\t\t}\n\t\t\t\t\t\trespond(request_id, vnx::Variant(res));\n\t\t\t\t\t},\n\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t}\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"wallet/address?index|limit|offset\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/tokens\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\twallet->get_token_list(\n\t\t\t[this, request_id](const std::set<addr_t>& tokens) {\n\t\t\t\tget_context(std::unordered_set<addr_t>(tokens.begin(), tokens.end()), request_id,\n\t\t\t\t\t[this, request_id, tokens](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\tstd::vector<vnx::Object> res;\n\t\t\t\t\t\tfor(const auto& addr : tokens) {\n\t\t\t\t\t\t\tvnx::Object tmp;\n\t\t\t\t\t\t\ttmp[\"currency\"] = addr.to_string();\n\t\t\t\t\t\t\tif(auto token = context->find_currency(addr)) {\n\t\t\t\t\t\t\t\ttmp[\"name\"] = token->name;\n\t\t\t\t\t\t\t\ttmp[\"symbol\"] = token->symbol;\n\t\t\t\t\t\t\t\ttmp[\"decimals\"] = token->decimals;\n\t\t\t\t\t\t\t\ttmp[\"is_nft\"] = token->is_nft;\n\t\t\t\t\t\t\t\ttmp[\"is_native\"] = addr == addr_t();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tres.push_back(tmp);\n\t\t\t\t\t\t}\n\t\t\t\t\t\trespond(request_id, vnx::Variant(res));\n\t\t\t\t\t});\n\t\t\t},\n\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t}\n\telse if(sub_path == \"/wallet/history\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto index = get_param<int32_t>(query, \"index\", -1);\n\t\tif(index >= 0) {\n\t\t\tquery_filter_t filter;\n\t\t\tfilter.max_search = 1000000;\n\t\t\tfilter.with_pending = true;\n\t\t\tfilter.limit = get_param<int32_t>(query, \"limit\", 100);\n\t\t\tfilter.since = get_param<uint32_t>(query, \"since\", 0);\n\t\t\tfilter.until = get_param<uint32_t>(query, \"until\", -1);\n\t\t\tfilter.type = get_param<vnx::optional<tx_type_e>>(query, \"type\");\n\t\t\tfilter.memo = get_param<vnx::optional<std::string>>(query, \"memo\");\n\t\t\tif(auto currency = get_param<vnx::optional<addr_t>>(query, \"currency\")) {\n\t\t\t\tfilter.currency.insert(*currency);\n\t\t\t}\n\t\t\twallet->get_history(index, filter,\n\t\t\t\tstd::bind(&WebAPI::render_history, this, request_id, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"wallet/history?index|limit|since|until|type|memo|currency\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/tx_history\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto index = get_param<int32_t>(query, \"index\", -1);\n\t\tif(index >= 0) {\n\t\t\tconst auto limit = get_param<int32_t>(query, \"limit\", 100);\n\t\t\twallet->get_tx_log(index, limit,\n\t\t\t\tstd::bind(&WebAPI::render_tx_history, this, request_id, std::placeholders::_1),\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"wallet/tx_history?index|limit\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/offers\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto iter_index = query.find(\"index\");\n\t\tif(iter_index != query.end()) {\n\t\t\tconst auto iter_state = query.find(\"state\");\n\t\t\tconst uint32_t index = vnx::from_string_value<int64_t>(iter_index->second);\n\t\t\tconst bool state = iter_state != query.end() ? vnx::from_string_value<bool>(iter_state->second) : false;\n\t\t\twallet->get_offers(index, state,\n\t\t\t\t[this, request_id](const std::vector<offer_data_t>& offers) {\n\t\t\t\t\tstd::unordered_set<addr_t> addr_set;\n\t\t\t\t\tfor(const auto& entry : offers) {\n\t\t\t\t\t\taddr_set.insert(entry.bid_currency);\n\t\t\t\t\t\taddr_set.insert(entry.ask_currency);\n\t\t\t\t\t}\n\t\t\t\t\tget_context(addr_set, request_id,\n\t\t\t\t\t\t[this, request_id, offers](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\t\tstd::vector<vnx::Variant> res;\n\t\t\t\t\t\t\tfor(const auto& entry : offers) {\n\t\t\t\t\t\t\t\tres.push_back(render_value(entry, context));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trespond(request_id, render_value(res));\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"wallet/offers?index\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/send\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto currency = args[\"currency\"].to<addr_t>();\n\t\t\tget_context({currency}, request_id,\n\t\t\t\t[this, request_id, args, currency](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tuint128 amount = 0;\n\t\t\t\t\t\tif(args[\"raw_mode\"].to<bool>()) {\n\t\t\t\t\t\t\targs[\"amount\"].to(amount);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif(auto token = context->find_currency(currency)) {\n\t\t\t\t\t\t\t\tamount = to_amount(args[\"amount\"].to<fixed128>(), token->decimals);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthrow std::logic_error(\"invalid currency\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\t\t\t\tconst auto dst_addr = args[\"dst_addr\"].to<addr_t>();\n\t\t\t\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\t\t\t\tif(args.field.count(\"src_addr\")) {\n\t\t\t\t\t\t\tconst auto src_addr = args[\"src_addr\"].to<addr_t>();\n\t\t\t\t\t\t\twallet->send_from(index, amount, dst_addr, src_addr, currency, options,\n\t\t\t\t\t\t\t\t[this, request_id, context](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\t\t\t\t\trespond(request_id, render(tx, context));\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\twallet->send(index, amount, dst_addr, currency, options,\n\t\t\t\t\t\t\t\t[this, request_id, context](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\t\t\t\t\trespond(request_id, render(tx, context));\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch(std::exception& ex) {\n\t\t\t\t\t\trespond_ex(request_id, ex);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/send {index, amount, currency, dst_addr, [src_addr], [raw_mode]}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/send_many\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto currency = args[\"currency\"].to<addr_t>();\n\t\t\tget_context({currency}, request_id,\n\t\t\t\t[this, request_id, args, currency](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tstd::vector<std::pair<addr_t, uint128>> amounts;\n\t\t\t\t\t\tif(args[\"raw_mode\"].to<bool>()) {\n\t\t\t\t\t\t\targs[\"amounts\"].to(amounts);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif(auto token = context->find_currency(currency)) {\n\t\t\t\t\t\t\t\tfor(const auto& entry : args[\"amounts\"].to<std::vector<std::pair<addr_t, fixed128>>>()) {\n\t\t\t\t\t\t\t\t\tamounts.emplace_back(entry.first, to_amount(entry.second, token->decimals));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthrow std::logic_error(\"invalid currency\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\t\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\t\t\t\twallet->send_many(index, amounts, currency, options,\n\t\t\t\t\t\t\t[this, request_id, context](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\t\t\t\trespond(request_id, render(tx, context));\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t\t} catch(std::exception& ex) {\n\t\t\t\t\t\trespond_ex(request_id, ex);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/send_many {index, amounts, currency, options, [raw_mode]}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/send_off\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\tconst auto tx = parse_tx(args[\"tx\"].to_object());\n\t\t\twallet->send_off(index, tx,\n\t\t\t\t[this, request_id]() {\n\t\t\t\t\trespond_status(request_id, 200);\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/send_off {index, tx}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/deploy\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\tconst auto payload = args[\"payload\"].to<std::shared_ptr<Contract>>();\n\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\twallet->deploy(index, payload, options,\n\t\t\t\t[this, request_id](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\trespond(request_id, vnx::Variant(addr_t(tx->id).to_string()));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/deploy {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/execute\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\tconst auto address = args[\"address\"].to<addr_t>();\n\t\t\tconst auto method = args[\"method\"].to<std::string>();\n\t\t\tconst auto params = args[\"args\"].to<std::vector<vnx::Variant>>();\n\t\t\tconst auto user = args[\"user\"].to<vnx::optional<uint32_t>>();\n\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\twallet->execute(index, address, method, params, user, options,\n\t\t\t\t[this, request_id](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\trespond(request_id, render(tx, get_context()));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/execute {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/make_offer\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto bid_currency = args[\"bid_currency\"].to<addr_t>();\n\t\t\tconst auto ask_currency = args[\"ask_currency\"].to<addr_t>();\n\t\t\tget_context({bid_currency, ask_currency}, request_id,\n\t\t\t\t[this, request_id, args, bid_currency, ask_currency](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst auto bid = context->get_currency(bid_currency);\n\t\t\t\t\t\tconst auto ask = context->get_currency(ask_currency);\n\n\t\t\t\t\t\tconst auto price = args[\"price\"].to<fixed128>();\n\t\t\t\t\t\tconst auto bid_value = args[\"bid\"].to<fixed128>();\n\n\t\t\t\t\t\tconst auto bid_amount = to_amount(bid_value, bid->decimals);\n\t\t\t\t\t\tconst auto ask_amount = to_amount(bid_value.to_value() / price.to_value(), ask->decimals);\n\n\t\t\t\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\t\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\t\t\t\twallet->make_offer(index, 0, bid_amount, bid_currency, ask_amount, ask_currency, options,\n\t\t\t\t\t\t\t[this, request_id, context](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\t\t\t\trespond(request_id, render(tx, context));\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t\t} catch(std::exception& ex) {\n\t\t\t\t\t\trespond_ex(request_id, ex);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/make_offer {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/cancel_offer\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\tconst auto address = args[\"address\"].to<addr_t>();\n\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\twallet->cancel_offer(index, address, options,\n\t\t\t\t[this, request_id](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\trespond(request_id, render(tx, get_context()));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/cancel_offer {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/offer_withdraw\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\tconst auto address = args[\"address\"].to<addr_t>();\n\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\twallet->offer_withdraw(index, address, options,\n\t\t\t\t[this, request_id](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\trespond(request_id, render(tx, get_context()));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/offer_withdraw {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/offer_trade\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto address = args[\"address\"].to<addr_t>();\n\t\t\tnode->get_offer(address,\n\t\t\t\t[this, request_id, address, args](const offer_data_t& offer) {\n\t\t\t\t\tget_context({offer.ask_currency}, request_id,\n\t\t\t\t\t\t[this, request_id, address, args, offer](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\t\tconst auto token = context->find_currency(offer.ask_currency);\n\t\t\t\t\t\t\tif(!token) {\n\t\t\t\t\t\t\t\tthrow std::logic_error(\"invalid currency\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\t\t\t\t\tconst auto value = args[\"amount\"].to<fixed128>();\n\t\t\t\t\t\t\tconst auto price = args[\"price\"].to<uint128>();\n\t\t\t\t\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\t\t\t\t\tconst auto amount = to_amount(value, token->decimals);\n\n\t\t\t\t\t\t\twallet->offer_trade(index, address, amount, 0, price, options,\n\t\t\t\t\t\t\t\t[this, request_id, context](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\t\t\t\t\trespond(request_id, render(tx, context));\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/offer_trade {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/accept_offer\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto address = args[\"address\"].to<addr_t>();\n\t\t\tnode->get_offer(address,\n\t\t\t\t[this, request_id, address, args](const offer_data_t& offer) {\n\t\t\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\t\t\tconst auto price = args[\"price\"].to<uint128>();\n\t\t\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\t\t\twallet->accept_offer(index, address, 0, price, options,\n\t\t\t\t\t\t[this, request_id](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\t\t\trespond(request_id, render(tx, get_context()));\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/accept_offer {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/swap/liquid\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto index = get_param<int32_t>(query, \"index\", -1);\n\t\tif(index >= 0) {\n\t\t\twallet->get_swap_liquidity(index,\n\t\t\t\t[this, request_id](const std::map<addr_t, std::array<std::pair<addr_t, uint128>, 2>>& balance) {\n\t\t\t\t\tstd::unordered_set<addr_t> token_set;\n\t\t\t\t\tfor(const auto& entry : balance) {\n\t\t\t\t\t\tfor(const auto& entry2 : entry.second) {\n\t\t\t\t\t\t\ttoken_set.insert(entry2.first);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tget_context(token_set, request_id,\n\t\t\t\t\t\t[this, request_id, balance](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\t\tstd::vector<vnx::Object> out;\n\t\t\t\t\t\t\tfor(const auto& entry : balance) {\n\t\t\t\t\t\t\t\tuint32_t i = 0;\n\t\t\t\t\t\t\t\tfor(const auto& entry2 : entry.second) {\n\t\t\t\t\t\t\t\t\tif(entry2.second) {\n\t\t\t\t\t\t\t\t\t\tvnx::Object tmp;\n\t\t\t\t\t\t\t\t\t\ttmp[\"address\"] = entry.first.to_string();\n\t\t\t\t\t\t\t\t\t\ttmp[\"currency\"] = entry2.first.to_string();\n\t\t\t\t\t\t\t\t\t\tif(auto token = context->find_currency(entry2.first)) {\n\t\t\t\t\t\t\t\t\t\t\ttmp[\"balance\"] = to_amount_object(entry2.second, token->decimals);\n\t\t\t\t\t\t\t\t\t\t\ttmp[\"symbol\"] = token->symbol;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\ttmp[\"index\"] = i;\n\t\t\t\t\t\t\t\t\t\tout.push_back(tmp);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trespond(request_id, render_value(out));\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"wallet/swap/liquid?index\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/swap/trade\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto address = args[\"address\"].to<addr_t>();\n\t\t\tnode->get_swap_info(address,\n\t\t\t\t[this, request_id, address, args](const swap_info_t& info) {\n\t\t\t\t\tget_context({info.tokens[0], info.tokens[1]}, request_id,\n\t\t\t\t\t\t[this, request_id, address, args, info](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\t\tconst auto wallet_i = args[\"wallet\"].to<uint32_t>();\n\t\t\t\t\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\t\t\t\t\tconst auto value = args[\"amount\"].to<fixed128>();\n\t\t\t\t\t\t\tconst auto min_value = args[\"min_trade\"].to<vnx::optional<double>>();\n\t\t\t\t\t\t\tconst auto num_iter = args[\"num_iter\"].to<int32_t>();\n\t\t\t\t\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\n\t\t\t\t\t\t\tconst auto token_i = context->find_currency(info.tokens[index % 2]);\n\t\t\t\t\t\t\tconst auto token_k = context->find_currency(info.tokens[(index + 1) % 2]);\n\t\t\t\t\t\t\tif(!token_i || !token_k) {\n\t\t\t\t\t\t\t\tthrow std::logic_error(\"invalid token or currency\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst auto amount = to_amount(value, token_i->decimals);\n\n\t\t\t\t\t\t\tvnx::optional<uint128> min_trade;\n\t\t\t\t\t\t\tif(min_value) {\n\t\t\t\t\t\t\t\tmin_trade = to_amount(*min_value, token_k->decimals);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twallet->swap_trade(wallet_i, address, amount, info.tokens[index % 2], min_trade, num_iter > 0 ? num_iter : 20, options,\n\t\t\t\t\t\t\t\t[this, request_id, context](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\t\t\t\t\trespond(request_id, render(tx, context));\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/swap/trade {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/swap/add_liquid\" || sub_path == \"/wallet/swap/rem_liquid\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto address = args[\"address\"].to<addr_t>();\n\t\t\tconst auto mode = (sub_path == \"/wallet/swap/add_liquid\");\n\t\t\tnode->get_swap_info(address,\n\t\t\t\t[this, request_id, mode, address, args](const swap_info_t& info) {\n\t\t\t\t\tget_context({info.tokens[0], info.tokens[1]}, request_id,\n\t\t\t\t\t\t[this, request_id, mode, address, args, info](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\t\t\t\t\tconst auto value = args[\"amount\"].to<std::array<fixed128, 2>>();\n\t\t\t\t\t\t\tconst auto pool_idx = args[\"pool_idx\"].to<uint32_t>();\n\t\t\t\t\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\n\t\t\t\t\t\t\tstd::array<uint128, 2> amount = {};\n\t\t\t\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\t\t\t\tif(const auto token = context->find_currency(info.tokens[i])) {\n\t\t\t\t\t\t\t\t\tamount[i] = to_amount(value[i], token->decimals);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst auto callback =\n\t\t\t\t\t\t\t\t[this, request_id, context](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\t\t\t\t\trespond(request_id, render(tx, context));\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tif(mode) {\n\t\t\t\t\t\t\t\twallet->swap_add_liquid(index, address, amount, pool_idx, options, callback,\n\t\t\t\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\twallet->swap_rem_liquid(index, address, amount, options, callback,\n\t\t\t\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/swap/[add/rem]_liquid {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/swap/payout\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\tconst auto address = args[\"address\"].to<addr_t>();\n\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\twallet->execute(index, address, \"payout\", {}, uint32_t(0), options,\n\t\t\t\t[this, request_id](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\trespond(request_id, render(tx, get_context()));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/swap/payout {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/swap/switch_pool\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\tconst auto pool_idx = args[\"pool_idx\"].to<uint32_t>();\n\t\t\tconst auto address = args[\"address\"].to<addr_t>();\n\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\twallet->execute(index, address, \"switch_pool\", {vnx::Variant(pool_idx)}, uint32_t(0), options,\n\t\t\t\t[this, request_id](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\trespond(request_id, render(tx, get_context()));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/swap/switch_pool {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/wallet/swap/rem_all_liquid\") {\n\t\trequire<mmx::permission_e>(vnx_session, mmx::permission_e::SPENDING);\n\t\tif(have_args) {\n\t\t\tconst auto index = args[\"index\"].to<uint32_t>();\n\t\t\tconst auto address = args[\"address\"].to<addr_t>();\n\t\t\tconst auto options = args[\"options\"].to<spend_options_t>();\n\t\t\twallet->execute(index, address, \"rem_all_liquid\", {vnx::Variant(false)}, uint32_t(0), options,\n\t\t\t\t[this, request_id](std::shared_ptr<const Transaction> tx) {\n\t\t\t\t\trespond(request_id, render(tx, get_context()));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST wallet/swap/rem_all_liquid {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/farm/info\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tfarmer->get_farm_info(\n\t\t\t[this, request_id](std::shared_ptr<const FarmInfo> info) {\n\t\t\t\tvnx::Object out;\n\t\t\t\tif(info) {\n\t\t\t\t\tout = render(*info);\n\t\t\t\t}\n\t\t\t\trespond(request_id, out);\n\t\t\t},\n\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t}\n\telse if(sub_path == \"/farm/blocks\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto iter_limit = query.find(\"limit\");\n\t\tconst auto iter_since = query.find(\"since\");\n\t\tconst int32_t limit = iter_limit != query.end() ? vnx::from_string<int64_t>(iter_limit->second) : -1;\n\t\tconst uint32_t since = iter_since != query.end() ? vnx::from_string<int64_t>(iter_since->second) : 0;\n\t\tfarmer->get_farmer_keys(\n\t\t\t[this, request_id, limit, since](const std::vector<pubkey_t>& farmer_keys) {\n\t\t\t\tnode->get_farmed_blocks(farmer_keys, false, since, limit,\n\t\t\t\t\t[this, request_id](const std::vector<std::shared_ptr<const BlockHeader>> blocks) {\n\t\t\t\t\t\trespond(request_id, render_value(blocks, get_context()));\n\t\t\t\t\t},\n\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t},\n\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t}\n\telse if(sub_path == \"/farm/blocks/summary\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto iter_since = query.find(\"since\");\n\t\tconst uint32_t since = iter_since != query.end() ? vnx::from_string<int64_t>(iter_since->second) : 0;\n\t\tfarmer->get_farmer_keys(\n\t\t\t[this, request_id, since](const std::vector<pubkey_t>& farmer_keys) {\n\t\t\t\tnode->get_farmed_block_summary(farmer_keys, since,\n\t\t\t\t\t[this, request_id](const farmed_block_summary_t& summary) {\n\t\t\t\t\t\tvnx::Object out;\n\t\t\t\t\t\tout[\"num_blocks\"] = summary.num_blocks;\n\t\t\t\t\t\tout[\"last_height\"] = summary.last_height;\n\t\t\t\t\t\tout[\"total_rewards\"] = summary.total_rewards;\n\t\t\t\t\t\tout[\"total_rewards_value\"] = to_value(summary.total_rewards, params->decimals);\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tstd::vector<vnx::Object> rewards;\n\t\t\t\t\t\t\tfor(const auto& entry : summary.reward_map) {\n\t\t\t\t\t\t\t\tvnx::Object tmp;\n\t\t\t\t\t\t\t\ttmp[\"address\"] = entry.first.to_string();\n\t\t\t\t\t\t\t\ttmp[\"amount\"] = entry.second;\n\t\t\t\t\t\t\t\ttmp[\"value\"] = to_value(entry.second, params->decimals);\n\t\t\t\t\t\t\t\trewards.push_back(tmp);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tout[\"rewards\"] = rewards;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trespond(request_id, out);\n\t\t\t\t\t},\n\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t},\n\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t}\n\telse if(sub_path == \"/farm/proofs\") {\n\t\trequire<vnx::permission_e>(vnx_session, vnx::permission_e::CONST_REQUEST);\n\t\tconst auto iter_limit = query.find(\"limit\");\n\t\tconst size_t limit = iter_limit != query.end() ? vnx::from_string<int64_t>(iter_limit->second) : -1;\n\t\tstd::vector<vnx::Object> res;\n\t\tfor(auto iter = proof_history.rbegin(); iter != proof_history.rend(); ++iter) {\n\t\t\tif(res.size() >= limit) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tconst auto& value = iter->first;\n\t\t\tauto tmp = render(*value);\n\t\t\tif(value->proof) {\n\t\t\t\ttmp[\"proof\"] = render(*value->proof);\n\t\t\t}\n\t\t\ttmp[\"id\"] = iter->second;\n\t\t\ttmp[\"harvester\"] = value->harvester;\n\t\t\ttmp[\"lookup_time_ms\"] = value->lookup_time_ms;\n\t\t\tres.push_back(tmp);\n\t\t}\n\t\trespond(request_id, render_value(res));\n\t}\n\telse if(sub_path == \"/offers\") {\n\t\tvnx::optional<addr_t> bid;\n\t\tvnx::optional<addr_t> ask;\n\t\tconst auto iter_bid = query.find(\"bid\");\n\t\tconst auto iter_ask = query.find(\"ask\");\n\t\tconst auto iter_min_bid = query.find(\"min_bid\");\n\t\tconst auto iter_limit = query.find(\"limit\");\n\t\tconst auto iter_state = query.find(\"state\");\n\t\tif(iter_bid != query.end()) {\n\t\t\tbid = vnx::from_string_value<addr_t>(iter_bid->second);\n\t\t}\n\t\tif(iter_ask != query.end()) {\n\t\t\task = vnx::from_string_value<addr_t>(iter_ask->second);\n\t\t}\n\t\tconst uint128 min_bid = iter_min_bid != query.end() ? vnx::from_string<uint128>(iter_min_bid->second) : uint128();\n\t\tconst uint32_t limit = iter_limit != query.end() ? vnx::from_string<int64_t>(iter_limit->second) : 100;\n\t\tconst bool state = iter_state != query.end() ? vnx::from_string<bool>(iter_state->second) : true;\n\n\t\tif(is_public && limit > 1000) {\n\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t}\n\t\tnode->get_recent_offers_for(bid, ask, min_bid, limit, state,\n\t\t\t[this, request_id, bid, ask](const std::vector<offer_data_t>& offers) {\n\t\t\t\tstd::unordered_set<addr_t> addr_set;\n\t\t\t\tstd::vector<std::pair<offer_data_t, double>> result;\n\t\t\t\tfor(const auto& entry : offers) {\n\t\t\t\t\tresult.emplace_back(entry, entry.price);\n\t\t\t\t\taddr_set.insert(entry.bid_currency);\n\t\t\t\t\taddr_set.insert(entry.ask_currency);\n\t\t\t\t}\n\t\t\t\tif(bid && ask) {\n\t\t\t\t\tstd::sort(result.begin(), result.end(),\n\t\t\t\t\t\t[](const std::pair<offer_data_t, double>& lhs, const std::pair<offer_data_t, double>& rhs) -> bool {\n\t\t\t\t\t\t\treturn lhs.second < rhs.second;\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tget_context(addr_set, request_id,\n\t\t\t\t\t[this, request_id, result](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\tstd::vector<vnx::Variant> res;\n\t\t\t\t\t\tfor(const auto& entry : result) {\n\t\t\t\t\t\t\tres.push_back(render_value(entry.first, context));\n\t\t\t\t\t\t}\n\t\t\t\t\t\trespond(request_id, render_value(res));\n\t\t\t\t\t});\n\t\t\t},\n\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t}\n\telse if(sub_path == \"/offer\") {\n\t\tconst auto iter_address = query.find(\"id\");\n\t\tif(iter_address != query.end()) {\n\t\t\tconst auto address = vnx::from_string_value<addr_t>(iter_address->second);\n\t\t\tnode->get_offer(address,\n\t\t\t\t[this, request_id](const offer_data_t& offer) {\n\t\t\t\t\tget_context({offer.bid_currency, offer.ask_currency}, request_id,\n\t\t\t\t\t\t[this, request_id, offer](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\t\trespond(request_id, render_value(offer, context));\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"offer?id\");\n\t\t}\n\t}\n\telse if(sub_path == \"/trade_history\") {\n\t\tvnx::optional<addr_t> bid;\n\t\tvnx::optional<addr_t> ask;\n\t\tconst auto iter_bid = query.find(\"bid\");\n\t\tconst auto iter_ask = query.find(\"ask\");\n\t\tconst auto iter_limit = query.find(\"limit\");\n\t\tconst auto iter_since = query.find(\"since\");\n\t\tif(iter_bid != query.end()) {\n\t\t\tbid = vnx::from_string_value<addr_t>(iter_bid->second);\n\t\t}\n\t\tif(iter_ask != query.end()) {\n\t\t\task = vnx::from_string_value<addr_t>(iter_ask->second);\n\t\t}\n\t\tconst uint32_t limit = iter_limit != query.end() ? vnx::from_string<int64_t>(iter_limit->second) : 100;\n\t\tconst uint32_t since = iter_since != query.end() ? vnx::from_string<int64_t>(iter_since->second) : 0;\n\t\tif(is_public && limit > 1000) {\n\t\t\tthrow std::logic_error(\"limit > 1000\");\n\t\t}\n\t\tnode->get_trade_history_for(bid, ask, limit, since,\n\t\t\t[this, request_id, bid, ask](const std::vector<trade_entry_t>& result) {\n\t\t\t\tstd::unordered_set<addr_t> addr_set;\n\t\t\t\tfor(const auto& entry : result) {\n\t\t\t\t\taddr_set.insert(entry.bid_currency);\n\t\t\t\t\taddr_set.insert(entry.ask_currency);\n\t\t\t\t}\n\t\t\t\tget_context(addr_set, request_id,\n\t\t\t\t\t[this, request_id, result](std::shared_ptr<RenderContext> context) {\n\t\t\t\t\t\tstd::vector<vnx::Variant> res;\n\t\t\t\t\t\tfor(const auto& entry : result) {\n\t\t\t\t\t\t\tres.push_back(render_value(entry, context));\n\t\t\t\t\t\t}\n\t\t\t\t\t\trespond(request_id, render_value(res));\n\t\t\t\t\t});\n\t\t\t},\n\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t}\n\telse if(sub_path == \"/contract/storage\") {\n\t\tconst auto iter_address = query.find(\"id\");\n\t\tif(iter_address != query.end()) {\n\t\t\tconst auto contract = vnx::from_string_value<addr_t>(iter_address->second);\n\t\t\tnode->read_storage(contract, -1,\n\t\t\t\t[this, request_id, contract](const std::map<std::string, vm::varptr_t>& ret) {\n\t\t\t\t\tstruct job_t {\n\t\t\t\t\t\tsize_t k = 0;\n\t\t\t\t\t\tvnx::Object out;\n\t\t\t\t\t};\n\t\t\t\t\tconst auto count = ret.size();\n\t\t\t\t\tauto job = std::make_shared<job_t>();\n\n\t\t\t\t\tfor(const auto& entry : ret) {\n\t\t\t\t\t\tconst auto key = entry.first;\n\t\t\t\t\t\tresolve_vm_varptr(contract, entry.second, request_id, 0,\n\t\t\t\t\t\t\t[this, request_id, job, count, key](const vnx::Variant& value) {\n\t\t\t\t\t\t\t\tjob->out[key] = value;\n\t\t\t\t\t\t\t\tif(++(job->k) == count) {\n\t\t\t\t\t\t\t\t\trespond(request_id, job->out);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif(count == 0) {\n\t\t\t\t\t\trespond(request_id, job->out);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"contract/storage?id\");\n\t\t}\n\t}\n\telse if(sub_path == \"/contract/storage/field\") {\n\t\tconst auto iter_address = query.find(\"id\");\n\t\tconst auto iter_name = query.find(\"name\");\n\t\tif(iter_address != query.end() && iter_name != query.end()) {\n\t\t\tconst auto contract = vnx::from_string_value<addr_t>(iter_address->second);\n\t\t\tconst auto name = vnx::from_string_value<std::string>(iter_name->second);\n\t\t\tnode->read_storage_field(contract, name, -1,\n\t\t\t\t[this, request_id, contract](const std::pair<vm::varptr_t, uint64_t>& ret) {\n\t\t\t\t\tconst auto addr = ret.second;\n\t\t\t\t\tresolve_vm_varptr(contract, ret.first, request_id, 0,\n\t\t\t\t\t\t[this, request_id, addr](const vnx::Variant& value) {\n\t\t\t\t\t\t\tvnx::Object out;\n\t\t\t\t\t\t\tout[\"address\"] = addr;\n\t\t\t\t\t\t\tout[\"value\"] = value;\n\t\t\t\t\t\t\trespond(request_id, out);\n\t\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"contract/storage/field?id|name\");\n\t\t}\n\t}\n\telse if(sub_path == \"/contract/storage/entry\") {\n\t\tconst auto iter_address = query.find(\"id\");\n\t\tconst auto iter_name = query.find(\"name\");\n\t\tconst auto iter_addr = query.find(\"addr\");\n\t\tconst auto iter_key = query.find(\"key\");\n\t\tif(iter_address != query.end() && iter_name != query.end() && (iter_addr != query.end() || iter_key != query.end())) {\n\t\t\tconst auto contract = vnx::from_string_value<addr_t>(iter_address->second);\n\t\t\tconst auto name = vnx::from_string_value<std::string>(iter_name->second);\n\t\t\tif(iter_addr != query.end()) {\n\t\t\t\tconst auto key = vnx::from_string_value<std::string>(iter_addr->second);\n\t\t\t\tnode->read_storage_entry_addr(contract, name, key, -1,\n\t\t\t\t\t[this, request_id, contract](const std::tuple<vm::varptr_t, uint64_t, uint64_t>& ret) {\n\t\t\t\t\t\tconst auto addr = std::get<1>(ret);\n\t\t\t\t\t\tconst auto key = std::get<2>(ret);\n\t\t\t\t\t\tresolve_vm_varptr(contract, std::get<0>(ret), request_id, 0,\n\t\t\t\t\t\t\t[this, request_id, addr, key](const vnx::Variant& value) {\n\t\t\t\t\t\t\t\tvnx::Object out;\n\t\t\t\t\t\t\t\tout[\"address\"] = addr;\n\t\t\t\t\t\t\t\tout[\"key\"] = key;\n\t\t\t\t\t\t\t\tout[\"value\"] = value;\n\t\t\t\t\t\t\t\trespond(request_id, out);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t} else if(iter_key != query.end()) {\n\t\t\t\tconst auto key = vnx::from_string_value<std::string>(iter_key->second);\n\t\t\t\tnode->read_storage_entry_string(contract, name, key, -1,\n\t\t\t\t\t[this, request_id, contract](const std::tuple<vm::varptr_t, uint64_t, uint64_t>& ret) {\n\t\t\t\t\t\tconst auto addr = std::get<1>(ret);\n\t\t\t\t\t\tconst auto key = std::get<2>(ret);\n\t\t\t\t\t\tresolve_vm_varptr(contract, std::get<0>(ret), request_id, 0,\n\t\t\t\t\t\t\t[this, request_id, addr, key](const vnx::Variant& value) {\n\t\t\t\t\t\t\t\tvnx::Object out;\n\t\t\t\t\t\t\t\tout[\"address\"] = addr;\n\t\t\t\t\t\t\t\tout[\"key\"] = key;\n\t\t\t\t\t\t\t\tout[\"value\"] = value;\n\t\t\t\t\t\t\t\trespond(request_id, out);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t}\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"contract/storage/entry?id|name|addr|key\");\n\t\t}\n\t}\n\telse if(sub_path == \"/contract/call\") {\n\t\tconst auto address = get_param<addr_t>(query, \"id\");\n\t\tconst auto method = get_param<std::string>(query, \"method\");\n\t\tconst auto user = get_param<vnx::optional<addr_t>>(query, \"user\");\n\t\tconst auto params = args[\"args\"].to<std::vector<vnx::Variant>>();\n\t\tconst auto deposit = args[\"deposit\"].to<vnx::optional<std::pair<addr_t, uint128>>>();\n\t\tif(address != addr_t() && method.size()) {\n\t\t\tnode->call_contract(address, method, params, user, deposit,\n\t\t\t\t\t[this, request_id](const vnx::Variant& result) {\n\t\t\t\t\t\trespond(request_id, render_value(result));\n\t\t\t\t\t},\n\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"GET/POST contract/call?id|method {args: [...]}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/transaction/validate\") {\n\t\tif(have_args) {\n\t\t\tconst auto tx = parse_tx(args);\n\t\t\tnode->validate(tx,\n\t\t\t\t[this, request_id](const exec_result_t& result) {\n\t\t\t\t\trespond(request_id, render(result));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST transaction/validate {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/transaction/broadcast\") {\n\t\tif(have_args) {\n\t\t\tconst auto tx = parse_tx(args);\n\t\t\tnode->validate(tx,\n\t\t\t\t[this, request_id, tx](const exec_result_t& result) {\n\t\t\t\t\tnode->add_transaction(tx, false,\n\t\t\t\t\t\tstd::bind(&WebAPI::respond_status, this, request_id, 200, \"\"),\n\t\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST transaction/broadcast {...}\");\n\t\t}\n\t}\n\telse if(sub_path == \"/passphrase/validate\") {\n\t\tif(is_public) {\n\t\t\tthrow vnx::permission_denied();\n\t\t}\n\t\tif(have_args) {\n\t\t\thash_t seed = args[\"seed\"].to<hash_t>();\n\t\t\tif(args.field.count(\"words\")) {\n\t\t\t\tseed = mnemonic::words_to_seed(mnemonic::string_to_words(args[\"words\"].to_string_value()));\n\t\t\t}\n\t\t\tconst std::string finger_print = args[\"finger_print\"].to_string_value();\n\t\t\tconst std::string passphrase = args[\"passphrase\"].to_string_value();\n\t\t\tif(get_finger_print(seed, passphrase) == finger_print) {\n\t\t\t\trespond_status(request_id, 200, \"true\");\n\t\t\t} else {\n\t\t\t\trespond_status(request_id, 400, \"false\");\n\t\t\t}\n\t\t} else {\n\t\t\trespond_status(request_id, 400, \"POST passphrase/validate {...}\");\n\t\t}\n\t}\n\telse {\n\t\tstd::vector<std::string> options = {\n\t\t\t\"config/get\", \"config/set\", \"farmers\", \"farmer\", \"farmer/blocks\", \"chain/info\",\n\t\t\t\"node/info\", \"node/log\", \"header\", \"headers\", \"block\", \"blocks\", \"transaction\", \"transactions\", \"address\", \"contract\", \"plotnft\"\n\t\t\t\"address/history\", \"wallet/balance\", \"wallet/contracts\", \"wallet/address\"\n\t\t\t\"wallet/history\", \"wallet/send\", \"wallet/send_many\", \"wallet/send_off\",\n\t\t\t\"wallet/make_offer\", \"wallet/cancel_offer\", \"wallet/accept_offer\", \"wallet/offer_withdraw\", \"wallet/offer_trade\",\n\t\t\t\"wallet/swap/liquid\", \"wallet/swap/trade\", \"wallet/swap/add_liquid\", \"wallet/swap/rem_liquid\", \"wallet/swap/payout\",\n\t\t\t\"wallet/swap/switch_pool\", \"wallet/swap/rem_all_liquid\", \"wallet/accounts\", \"wallet/account\",\n\t\t\t\"swap/list\", \"swap/info\", \"swap/user_info\", \"swap/trade_estimate\",\n\t\t\t\"farm/info\", \"farm/blocks\", \"farm/blocks/summary\", \"farm/proofs\",\n\t\t\t\"offers\", \"offer\", \"trade_history\",\n\t\t\t\"contract/storage\", \"contract/storage/field\", \"contract/storage/entry\",\n\t\t\t\"transaction/validate\", \"transaction/broadcast\", \"passphrase/validate\"\n\t\t};\n\t\trespond_status(request_id, 404, vnx::to_string(options));\n\t}\n}\n\nvoid WebAPI::http_request_chunk_async(\tstd::shared_ptr<const vnx::addons::HttpRequest> request, const std::string& sub_path,\n\t\t\t\t\t\t\t\t\t\tconst int64_t& offset, const int64_t& max_bytes, const vnx::request_id_t& request_id) const\n{\n\tthrow std::logic_error(\"not implemented\");\n}\n\nvoid WebAPI::get_context(\tconst std::unordered_set<addr_t>& addr_set, const vnx::request_id_t& request_id,\n\t\t\t\t\t\t\tconst std::function<void(std::shared_ptr<RenderContext>)>& callback) const\n{\n\tconst std::vector<addr_t> list(addr_set.begin(), addr_set.end());\n\tnode->get_contracts(list,\n\t\t[this, list, request_id, callback](const std::vector<std::shared_ptr<const Contract>> values) {\n\t\t\tauto context = get_context();\n\t\t\tfor(size_t i = 0; i < list.size() && i < values.size(); ++i) {\n\t\t\t\tcontext->add_contract(list[i], values[i]);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tcallback(context);\n\t\t\t} catch(const std::exception& ex) {\n\t\t\t\trespond_ex(request_id, ex);\n\t\t\t}\n\t\t},\n\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n}\n\nvoid WebAPI::resolve_vm_varptr(\tconst addr_t& contract,\n\t\t\t\t\t\t\t\tconst vm::varptr_t& var,\n\t\t\t\t\t\t\t\tconst vnx::request_id_t& request_id,\n\t\t\t\t\t\t\t\tconst uint32_t call_depth,\n\t\t\t\t\t\t\t\tconst std::function<void(const vnx::Variant&)>& callback) const\n{\n\tif(!var) {\n\t\tcallback(vnx::Variant());\n\t\treturn;\n\t}\n\tif(call_depth > max_recursion) {\n\t\tvnx::Object err;\n\t\terr[\"__type\"] = \"mmx.Exception\";\n\t\terr[\"message\"] = \"Maximum recursion limit reached: \" + std::to_string(max_recursion);\n\t\tcallback(vnx::Variant(err));\n\t\treturn;\n\t}\n\tswitch(var->type) {\n\t\tcase vm::TYPE_REF: {\n\t\t\tnode->read_storage_var(contract, vm::to_ref(var), -1,\n\t\t\t\t\tstd::bind(&WebAPI::resolve_vm_varptr, this, contract, std::placeholders::_1, request_id, call_depth + 1, callback),\n\t\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\tbreak;\n\t\t}\n\t\tcase vm::TYPE_ARRAY:\n\t\t\tnode->read_storage_array(contract, vm::to_ref(var), -1,\n\t\t\t\t[this, contract, request_id, callback, call_depth](const std::vector<vm::varptr_t>& ret) {\n\t\t\t\t\tstruct job_t {\n\t\t\t\t\t\tsize_t k = 0;\n\t\t\t\t\t\tstd::vector<vnx::Variant> out;\n\t\t\t\t\t};\n\t\t\t\t\tconst auto count = ret.size();\n\t\t\t\t\tauto job = std::make_shared<job_t>();\n\t\t\t\t\tjob->out.resize(count);\n\n\t\t\t\t\tfor(size_t i = 0; i < count; ++i) {\n\t\t\t\t\t\tresolve_vm_varptr(contract, ret[i], request_id, call_depth + 1,\n\t\t\t\t\t\t\t[job, callback, count, i](const vnx::Variant& value) {\n\t\t\t\t\t\t\t\tjob->out[i] = value;\n\t\t\t\t\t\t\t\tif(++(job->k) == count) {\n\t\t\t\t\t\t\t\t\tcallback(vnx::Variant(job->out));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif(count == 0) {\n\t\t\t\t\t\tcallback(vnx::Variant(job->out));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\tbreak;\n\t\tcase vm::TYPE_MAP:\n\t\t\tnode->read_storage_map(contract, vm::to_ref(var), -1,\n\t\t\t\t[this, contract, request_id, callback, call_depth](const std::map<vm::varptr_t, vm::varptr_t>& ret) {\n\t\t\t\t\tstruct job_t {\n\t\t\t\t\t\tsize_t k = 0;\n\t\t\t\t\t\tvnx::Object out;\n\t\t\t\t\t};\n\t\t\t\t\tconst auto count = ret.size();\n\t\t\t\t\tauto job = std::make_shared<job_t>();\n\n\t\t\t\t\tfor(const auto& entry : ret) {\n\t\t\t\t\t\tstd::string key;\n\t\t\t\t\t\tvnx::optional<addr_t> key_addr;\n\t\t\t\t\t\tif(auto var = entry.first) {\n\t\t\t\t\t\t\tswitch(var->type) {\n\t\t\t\t\t\t\t\tcase vm::TYPE_UINT:\t\tkey = vm::to_uint(var).str(10); break;\n\t\t\t\t\t\t\t\tcase vm::TYPE_STRING:\tkey = vm::to_string_value(var); break;\n\t\t\t\t\t\t\t\tcase vm::TYPE_BINARY:\tkey = vm::to_string_value_hex(var);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif(vm::get_size(var) == 32) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey_addr = vm::to_addr(var);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\tdefault:\t\t\t\tkey = vm::to_string(var);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresolve_vm_varptr(contract, entry.second, request_id, call_depth + 1,\n\t\t\t\t\t\t\t[job, callback, count, key, key_addr](const vnx::Variant& value) {\n\t\t\t\t\t\t\t\tjob->out[key] = value;\n\t\t\t\t\t\t\t\tif(key_addr) {\n\t\t\t\t\t\t\t\t\tjob->out[key_addr->to_string()] = value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(++(job->k) == count) {\n\t\t\t\t\t\t\t\t\tcallback(vnx::Variant(job->out));\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tif(count == 0) {\n\t\t\t\t\t\tcallback(vnx::Variant(job->out));\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tstd::bind(&WebAPI::respond_ex, this, request_id, std::placeholders::_1));\n\t\t\tbreak;\n\t\tcase vm::TYPE_UINT: {\n\t\t\tconst auto value = vm::to_uint(var);\n\t\t\tif(value >> 64) {\n\t\t\t\tcallback(vnx::Variant(value.str(10)));\n\t\t\t} else {\n\t\t\t\tcallback(vnx::Variant(uint64_t(value)));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase vm::TYPE_STRING:\n\t\t\tcallback(vnx::Variant(vm::to_string_value(var)));\n\t\t\tbreak;\n\t\tcase vm::TYPE_BINARY: {\n\t\t\tconst auto hex = vm::to_string_value_hex(var);\n\t\t\tvnx::Object out;\n\t\t\tout[\"hex\"] = hex;\n\t\t\tif(hex.size() == 64) {\n\t\t\t\tout[\"hash\"] = vm::to_hash(var).to_string();\n\t\t\t\tout[\"address\"] = vm::to_addr(var).to_string();\n\t\t\t}\n\t\t\tcallback(vnx::Variant(out));\n\t\t\tbreak;\n\t\t}\n\t\tcase vm::TYPE_TRUE:\n\t\t\tcallback(vnx::Variant(true));\n\t\t\tbreak;\n\t\tcase vm::TYPE_FALSE:\n\t\t\tcallback(vnx::Variant(false));\n\t\t\tbreak;\n\t\tcase vm::TYPE_NIL:\n\t\t\tcallback(vnx::Variant());\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tcallback(vnx::Variant(vm::to_string(var)));\n\t}\n}\n\nvoid WebAPI::respond(const vnx::request_id_t& request_id, std::shared_ptr<const vnx::addons::HttpResponse> response) const\n{\n\tauto tmp = vnx::clone(response);\n\tif(cache_max_age > 0) {\n\t\ttmp->headers.emplace_back(\"Cache-Control\", \"max-age=\" + std::to_string(cache_max_age) + \", no-store\");\n\t} else {\n\t\ttmp->headers.emplace_back(\"Cache-Control\", \"no-cache, no-store\");\n\t}\n\thttp_request_async_return(request_id, tmp);\n}\n\nvoid WebAPI::respond(const vnx::request_id_t& request_id, const vnx::Variant& value) const\n{\n\trespond(request_id, vnx::addons::HttpResponse::from_variant_json(value));\n}\n\nvoid WebAPI::respond(const vnx::request_id_t& request_id, const vnx::Object& value) const\n{\n\trespond(request_id, vnx::addons::HttpResponse::from_object_json(value));\n}\n\nvoid WebAPI::respond_ex(const vnx::request_id_t& request_id, const std::exception& ex) const\n{\n\trespond(request_id, vnx::addons::HttpResponse::from_text_ex(ex.what(), 400));\n}\n\nvoid WebAPI::respond_status(const vnx::request_id_t& request_id, const int32_t& status, const std::string& text) const\n{\n\tif(text.empty()) {\n\t\trespond(request_id, vnx::addons::HttpResponse::from_status(status));\n\t} else {\n\t\trespond(request_id, vnx::addons::HttpResponse::from_text_ex(text, status));\n\t}\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/account_info_t.cpp",
    "content": "/*\n * account_info_t.cpp\n *\n *  Created on: Jun 28, 2024\n *      Author: mad\n */\n\n#include <mmx/account_info_t.hxx>\n\n\nnamespace mmx {\n\naccount_info_t account_info_t::make(const uint32_t& account, const vnx::optional<addr_t>& address, const account_t& config)\n{\n\taccount_info_t out;\n\tstatic_cast<account_t&>(out) = config;\n\tout.account = account;\n\tout.address = address;\n\treturn out;\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/addr_t.cpp",
    "content": "/*\n * addr_t.cpp\n *\n *  Created on: Apr 30, 2022\n *      Author: mad\n */\n\n#include <mmx/addr_t.hpp>\n#include <mmx/vm/var_t.h>\n\n#include <bech32.h>\n\n\nnamespace mmx {\n\nstd::string addr_t::to_string() const\n{\n\t// Note: this function is consensus critical\n\tauto bits = to_uint256();\n\tstd::vector<uint8_t> dp(52);\n\tdp[51] = (bits & 1) << 4;\n\tbits >>= 1;\n\tfor(int i = 0; i < 51; ++i) {\n\t\tdp[50 - i] = bits & 0x1F;\n\t\tbits >>= 5;\n\t}\n\treturn bech32::encode(\"mmx\", dp);\n}\n\nvoid addr_t::from_string(const std::string& addr)\n{\n\t// Note: this function is consensus critical\n\tif(addr == \"MMX\") {\n\t\t*this = addr_t();\n\t\treturn;\n\t}\n\tconst auto res = bech32::decode(addr);\n\tif(res.encoding != bech32::Bech32m) {\n\t\tthrow std::logic_error(\"invalid address: \" + addr);\n\t}\n\tif(res.dp.size() != 52) {\n\t\tthrow std::logic_error(\"invalid address (size != 52): \" + addr);\n\t}\n\tuint256_t bits = 0;\n\tfor(int i = 0; i < 50; ++i) {\n\t\tbits |= res.dp[i] & 0x1F;\n\t\tbits <<= 5;\n\t}\n\tbits |= res.dp[50] & 0x1F;\n\tbits <<= 1;\n\tbits |= (res.dp[51] >> 4) & 1;\n\tfrom_uint(bits);\n}\n\n} // mmx\n\n\nnamespace vnx {\n\nvoid read(vnx::TypeInput& in, mmx::addr_t& value, const vnx::TypeCode* type_code, const uint16_t* code) {\n\tswitch(code[0]) {\n\t\tcase CODE_STRING:\n\t\tcase CODE_ALT_STRING: {\n\t\t\tstd::string tmp;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\ttry {\n\t\t\t\tvalue.from_string(tmp);\n\t\t\t} catch(...) {\n\t\t\t\tvalue = mmx::addr_t();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase CODE_DYNAMIC:\n\t\tcase CODE_ALT_DYNAMIC: {\n\t\t\tvnx::Variant tmp;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\tvalue = tmp.to<mmx::addr_t>();\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tvnx::read(in, value.bytes, type_code, code);\n\t}\n}\n\n} // vnx\n"
  },
  {
    "path": "src/contract/Binary.cpp",
    "content": "/*\n * Binary.cpp\n *\n *  Created on: Sep 7, 2022\n *      Author: mad\n */\n\n#include <mmx/contract/PubKey.hxx>\n#include <mmx/contract/Binary.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\nnamespace contract {\n\nbool Binary::is_valid() const\n{\n\tfor(const auto& entry : methods) {\n\t\tconst auto& method = entry.second;\n\t\tif(method.is_payable && method.is_const) {\n\t\t\treturn false;\n\t\t}\n\t\tif(method.is_init && (method.is_const || method.is_public || method.is_payable)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn Super::is_valid();\n}\n\nhash_t Binary::calc_hash(const vnx::bool_t& full_hash) const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", \tversion);\n\twrite_field(out, \"name\", \t\tname);\n\twrite_field(out, \"fields\", \t\tfields);\n\twrite_field(out, \"methods\", \tmethods);\n\twrite_field(out, \"constant\", \tconstant);\n\twrite_field(out, \"binary\", \t\tbinary);\n\twrite_field(out, \"line_info\", \tline_info);\n\twrite_field(out, \"source\", \t\tsource);\n\twrite_field(out, \"compiler\", \tcompiler);\n\twrite_field(out, \"build_flags\", build_flags);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nuint64_t Binary::num_bytes() const\n{\n\tuint64_t sum = Super::num_bytes() + fields.size() * 4 + line_info.size() * 8;\n\n\tfor(const auto& entry : fields) {\n\t\tsum += entry.first.size();\n\t}\n\tfor(const auto& entry : methods) {\n\t\tsum += entry.first.size() + entry.second.num_bytes();\n\t}\n\tsum += name.size() + constant.size() + binary.size() + source.size() + compiler.size();\n\treturn sum;\n}\n\nvnx::optional<uint32_t> Binary::find_field(const std::string& name) const\n{\n\tauto iter = fields.find(name);\n\tif(iter != fields.end()) {\n\t\treturn iter->second;\n\t}\n\treturn nullptr;\n}\n\nvnx::optional<method_t> Binary::find_method(const std::string& name) const\n{\n\tauto iter = methods.find(name);\n\tif(iter != methods.end()) {\n\t\treturn iter->second;\n\t}\n\treturn nullptr;\n}\n\nvnx::optional<uint32_t> Binary::find_line(const uint32_t& address) const\n{\n\tauto iter = line_info.upper_bound(address);\n\tif(iter != line_info.begin()) {\n\t\treturn (--iter)->second;\n\t}\n\treturn nullptr;\n}\n\n\n} // contract\n} // mmx\n"
  },
  {
    "path": "src/contract/Data.cpp",
    "content": "/*\n * Data.cpp\n *\n *  Created on: Jan 19, 2022\n *      Author: mad\n */\n\n#include <mmx/contract/Data.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\nnamespace contract {\n\nvnx::bool_t Data::is_valid() const\n{\n\treturn Super::is_valid() && is_json(value);\n}\n\nhash_t Data::calc_hash(const vnx::bool_t& full_hash) const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", version);\n\twrite_field(out, \"value\", \tvalue);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nuint64_t Data::num_bytes() const\n{\n\treturn Super::num_bytes() + get_num_bytes(value);\n}\n\n\n} // contract\n} // mmx\n"
  },
  {
    "path": "src/contract/Executable.cpp",
    "content": "/*\n * Executable.cpp\n *\n *  Created on: May 10, 2022\n *      Author: mad\n */\n\n#include <mmx/contract/PubKey.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\nnamespace contract {\n\nbool Executable::is_valid() const\n{\n\tfor(const auto& arg : init_args) {\n\t\tif(!is_json(arg)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tfor(const auto& entry : depends) {\n\t\tif(entry.first.size() > 64) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn Super::is_valid() && binary != addr_t();\n}\n\naddr_t Executable::get_external(const std::string& name) const\n{\n\tauto iter = depends.find(name);\n\tif(iter == depends.end()) {\n\t\tthrow std::runtime_error(\"no such external contract: \" + name);\n\t}\n\treturn iter->second;\n}\n\nhash_t Executable::calc_hash(const vnx::bool_t& full_hash) const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", \tversion);\n\twrite_field(out, \"name\", \t\tname);\n\twrite_field(out, \"symbol\", \t\tsymbol);\n\twrite_field(out, \"decimals\", \tdecimals);\n\twrite_field(out, \"meta_data\", \tmeta_data);\n\twrite_field(out, \"binary\", \t\tbinary);\n\twrite_field(out, \"init_method\", init_method);\n\twrite_field(out, \"init_args\", \tinit_args);\n\twrite_field(out, \"depends\", \tdepends);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nuint64_t Executable::calc_cost(std::shared_ptr<const ChainParams> params) const\n{\n\treturn Super::calc_cost(params) + depends.size() * params->min_txfee_depend;\n}\n\nuint64_t Executable::num_bytes() const\n{\n\tuint64_t sum = Super::num_bytes() + 32 + init_method.size() + depends.size() * 32;\n\n\tfor(const auto& arg : init_args) {\n\t\tsum += get_num_bytes(arg);\n\t}\n\tfor(const auto& entry : depends) {\n\t\tsum += entry.first.size();\n\t}\n\treturn sum;\n}\n\nvnx::Variant Executable::read_field(const std::string& name) const\n{\n\treturn Super::read_field(name);\n}\n\nvnx::Variant Executable::get_arg(const uint32_t& index) const\n{\n\tif(index < init_args.size()) {\n\t\treturn init_args[index];\n\t}\n\treturn vnx::Variant();\n}\n\n\n} // contract\n} // mmx\n"
  },
  {
    "path": "src/contract/MultiSig.cpp",
    "content": "/*\n * MultiSig.cpp\n *\n *  Created on: Jan 15, 2022\n *      Author: mad\n */\n\n#include <mmx/contract/MultiSig.hxx>\n#include <mmx/solution/MultiSig.hxx>\n#include <mmx/solution/PubKey.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/exception.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\nnamespace contract {\n\nvnx::bool_t MultiSig::is_valid() const\n{\n\treturn Super::is_valid() && num_required > 0 && owners.size() >= num_required;\n}\n\nhash_t MultiSig::calc_hash(const vnx::bool_t& full_hash) const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", version);\n\twrite_field(out, \"num_required\", num_required);\n\twrite_field(out, \"owners\", owners);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nuint64_t MultiSig::num_bytes() const\n{\n\treturn Super::num_bytes() + owners.size() * 32;\n}\n\nvoid MultiSig::validate(std::shared_ptr<const Solution> solution, const hash_t& txid) const\n{\n\tif(auto sol = std::dynamic_pointer_cast<const solution::PubKey>(solution))\n\t{\n\t\tif(num_required != 1) {\n\t\t\tthrow mmx::invalid_solution(\"num_required != 1\");\n\t\t}\n\t\tconst auto sol_address = sol->pubkey.get_addr();\n\n\t\tif(owners.count(sol_address))\n\t\t{\n\t\t\tif(!sol->signature.verify(sol->pubkey, txid)) {\n\t\t\t\tthrow mmx::invalid_solution(\"invalid signature\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthrow mmx::invalid_solution(\"no such owner: \" + sol_address.to_string());\n\t}\n\tif(auto sol = std::dynamic_pointer_cast<const solution::MultiSig>(solution))\n\t{\n\t\tsize_t count = 0;\n\t\tfor(const auto& entry : sol->solutions)\n\t\t{\n\t\t\tconst auto& owner = entry.first;\n\t\t\tif(owners.count(owner))\n\t\t\t{\n\t\t\t\tif(auto sol = std::dynamic_pointer_cast<const solution::PubKey>(entry.second))\n\t\t\t\t{\n\t\t\t\t\tif(sol->pubkey.get_addr() != owner) {\n\t\t\t\t\t\tthrow mmx::invalid_solution(\"wrong public key for \" + owner.to_string());\n\t\t\t\t\t}\n\t\t\t\t\tif(!sol->signature.verify(sol->pubkey, txid)) {\n\t\t\t\t\t\tthrow mmx::invalid_solution(\"invalid signature for \" + owner.to_string());\n\t\t\t\t\t}\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(count < num_required) {\n\t\t\tthrow mmx::invalid_solution(\"insufficient signatures: \" + std::to_string(count) + \" < \" + std::to_string(num_required));\n\t\t}\n\t\treturn;\n\t}\n\tif(solution) {\n\t\tthrow mmx::invalid_solution(\"invalid type\");\n\t} else {\n\t\tthrow mmx::invalid_solution(\"missing\");\n\t}\n}\n\nvnx::Variant MultiSig::read_field(const std::string& name) const\n{\n\tif(name == \"owners\") {\n\t\tstd::vector<std::string> tmp;\n\t\tfor(const auto& entry : owners) {\n\t\t\ttmp.push_back(entry.to_string());\n\t\t}\n\t\treturn vnx::Variant(tmp);\n\t}\n\treturn Super::read_field(name);\n}\n\n\n} // contract\n} // mmx\n"
  },
  {
    "path": "src/contract/PubKey.cpp",
    "content": "/*\n * PubKey.cpp\n *\n *  Created on: Dec 10, 2021\n *      Author: mad\n */\n\n#include <mmx/contract/PubKey.hxx>\n#include <mmx/solution/PubKey.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/exception.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\nnamespace contract {\n\nvnx::bool_t PubKey::is_valid() const\n{\n\treturn Super::is_valid() && address != addr_t();\n}\n\nhash_t PubKey::calc_hash(const vnx::bool_t& full_hash) const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", version);\n\twrite_field(out, \"address\", address);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nuint64_t PubKey::num_bytes() const\n{\n\treturn Super::num_bytes() + 32;\n}\n\nvnx::optional<addr_t> PubKey::get_owner() const\n{\n\treturn address;\n}\n\nvoid PubKey::validate(std::shared_ptr<const Solution> solution, const hash_t& txid) const\n{\n\tif(auto sol = std::dynamic_pointer_cast<const solution::PubKey>(solution))\n\t{\n\t\tconst auto sol_address = sol->pubkey.get_addr();\n\t\tif(sol_address != address) {\n\t\t\tthrow mmx::invalid_solution(\"wrong public key: \" + sol_address.to_string() + \" != \" + address.to_string());\n\t\t}\n\t\tif(!sol->signature.verify(sol->pubkey, txid)) {\n\t\t\tthrow mmx::invalid_solution(\"invalid signature for \" + address.to_string());\n\t\t}\n\t\treturn;\n\t}\n\tif(solution) {\n\t\tthrow mmx::invalid_solution(\"invalid type\");\n\t} else {\n\t\tthrow mmx::invalid_solution(\"missing\");\n\t}\n}\n\nvnx::Variant PubKey::read_field(const std::string& name) const\n{\n\tif(name == \"address\") {\n\t\treturn vnx::Variant(address.to_string());\n\t}\n\treturn Super::read_field(name);\n}\n\n\n} // contract\n} // mmx\n"
  },
  {
    "path": "src/contract/TokenBase.cpp",
    "content": "/*\n * TokenBase.cpp\n *\n *  Created on: Apr 25, 2022\n *      Author: mad\n */\n\n#include <mmx/contract/TokenBase.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\nnamespace contract {\n\nvnx::bool_t TokenBase::is_valid() const\n{\n\treturn Super::is_valid() && name.size() <= 64 && symbol.size() <= 6\n\t\t\t&& symbol != \"MMX\" && symbol.find_first_of(\" \\n\\t\\r\\b\\f\") == std::string::npos\n\t\t\t&& decimals >= 0 && decimals <= 18\n\t\t\t&& is_json(meta_data);\n}\n\nhash_t TokenBase::calc_hash(const vnx::bool_t& full_hash) const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", \tversion);\n\twrite_field(out, \"name\", \t\tname);\n\twrite_field(out, \"symbol\", \t\tsymbol);\n\twrite_field(out, \"decimals\", \tdecimals);\n\twrite_field(out, \"meta_data\", \tmeta_data);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nuint64_t TokenBase::num_bytes() const\n{\n\treturn Super::num_bytes() + name.size() + symbol.size() + get_num_bytes(meta_data);\n}\n\n\n} // contract\n} // mmx\n"
  },
  {
    "path": "src/contract/WebData.cpp",
    "content": "/*\n * WebData.cpp\n *\n *  Created on: Jan 19, 2022\n *      Author: mad\n */\n\n#include <mmx/contract/WebData.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\nnamespace contract {\n\nvnx::bool_t WebData::is_valid() const\n{\n\treturn Super::is_valid() && mime_type.size() <= 256;\n}\n\nhash_t WebData::calc_hash(const vnx::bool_t& full_hash) const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", \tversion);\n\twrite_field(out, \"mime_type\", \tmime_type);\n\twrite_field(out, \"payload\", \tpayload);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nuint64_t WebData::num_bytes() const\n{\n\treturn Super::num_bytes() + mime_type.size() + payload.size();\n}\n\nvnx::Variant WebData::read_field(const std::string& name) const\n{\n\tif(name == \"payload\") {\n\t\treturn vnx::Variant(vnx::to_hex_string(payload.data(), payload.size(), false, false));\n\t}\n\treturn Super::read_field(name);\n}\n\n\n} // contract\n} // mmx\n"
  },
  {
    "path": "src/contract/crypto_horse_race.js",
    "content": "\nconst FRACT_BITS = 64;\nconst PRICE_ITERS = 20;\nconst TRANSFER_EXPIRE = 360;\t// blocks\n\nvar currency;\nvar PRECISION = 1;\t\t\t\t// price increment\nvar TOKEN_SCALE = 1;\nvar activation_height;\n\nvar wallets = {};\t\t\t\t// user token balances\nvar balance = [];\t\t\t\t// currency per horse\n\n\nfunction init(num_horses, currency_, precision, decimals, activation_height_)\n{\n\tfor(var i = 0; i < num_horses; ++i) {\n\t\tpush(balance, 0);\n\t}\n\tcurrency = bech32(currency_);\n\tactivation_height = uint(activation_height_);\n\t\n\tfor(var i = 0; i < precision; ++i) {\n\t\tPRECISION *= 10;\n\t}\n\tfor(var i = 0; i < decimals; ++i) {\n\t\tTOKEN_SCALE *= 10;\n\t}\n}\n\nfunction calc_price(x) const public\n{\n\tx /= PRECISION;\n\tvar y = x;\n\tfor(var i = 0; i < PRICE_ITERS && y > 0; ++i) {\n\t\ty = ((y << FRACT_BITS) + (x << FRACT_BITS) / y) >> (FRACT_BITS + 1);\n\t}\n\treturn y * PRECISION;\n}\n\nfunction get_price(index) const public\n{\n\treturn calc_price(balance[index]);\n}\n\nfunction get_buy_price(index, amount) const public\n{\n\treturn calc_price(balance[index] + uint(amount));\n}\n\nfunction get_sell_price(index, amount) const public\n{\n\treturn calc_price(balance[index] - ((uint(amount) * get_price(index)) / TOKEN_SCALE));\n}\n\nfunction get_wallet(user)\n{\n\tassert(user, \"invalid user\");\n\t\n\tvar wallet = wallets[user];\n\tif(!wallet) {\n\t\twallet = {};\n\t\twallets[user] = wallet;\n\t}\n\treturn wallet;\n}\n\nfunction get_wallet_balance(wallet, index)\n{\n\tvar balance = wallet[index];\n\tif(!balance) {\n\t\tbalance = 0;\n\t}\n\treturn balance;\n}\n\nfunction buy_horse(index) public payable\n{\n\tassert(index < size(balance), \"no such horse\");\n\tassert(this.height >= activation_height, \"not active yet\");\n\tassert(this.deposit.currency == currency, \"wrong currency\");\n\t\n\tconst price = get_buy_price(index, this.deposit.amount);\n\tconst token_amount = (this.deposit.amount * TOKEN_SCALE) / price;\n\t\n\tconst wallet = get_wallet(this.user);\n\twallet[index] = get_wallet_balance(wallet, index) + token_amount;\n\t\n\tbalance[index] += this.deposit.amount;\n}\n\nfunction sell_horse(index, amount) public\n{\n\tamount = uint(amount);\n\t\n\tassert(amount > 0);\n\tassert(index < size(balance), \"no such horse\");\n\t\n\tconst wallet = get_wallet(this.user);\n\tconst wallet_balance = get_wallet_balance(wallet, index);\n\t\n\tassert(amount <= wallet_balance, \"insufficient balance\");\n\t\n\tconst price = get_sell_price(index, amount);\n\tconst ret_amount = (amount * price) / TOKEN_SCALE;\n\t\n\twallet[index] = wallet_balance - amount;\n\tbalance[index] -= ret_amount;\n\t\n\tsend(this.user, ret_amount, currency);\n}\n\nfunction transfer(target, amount, index) public\n{\n\ttarget = bech32(target);\n\tamount = uint(amount);\n\t\n\tassert(amount > 0);\n\tassert(index < size(balance), \"no such horse\");\n\t\n\tconst wallet = get_wallet(this.user);\n\tconst wallet_balance = get_wallet_balance(wallet, index);\n\t\n\tassert(amount <= wallet_balance, \"insufficient balance\");\n\t\n\tconst target_wallet = get_wallet(target);\n\t\n\tassert(target_wallet, \"no such wallet\");\n\t\n\twallet[index] -= amount;\n\ttarget_wallet[index] = get_wallet_balance(target_wallet, index) + amount;\n}\n\n\n\n\n\n"
  },
  {
    "path": "src/contract/escrow.js",
    "content": "\nvar source;\nvar target;\nvar agent;\n\nfunction init(source_, agent_, target_)\n{\n\tsource = bech32(source_);\n\ttarget = bech32(target_);\n\tagent = bech32(agent_);\n}\n\nfunction deposit() public {}\n\nfunction unlock(currency) public\n{\n\tassert(this.user == agent, \"invalid user\");\n\t\n\tif(!currency) {\n\t\tcurrency = bech32();\n\t} else {\n\t\tcurrency = bech32(currency);\n\t}\n\tsend(target, balance(currency), currency, \"mmx_escrow_unlock\");\n}\n\nfunction cancel(currency) public\n{\n\tassert(this.user == agent, \"invalid user\");\n\t\n\tif(!currency) {\n\t\tcurrency = bech32();\n\t} else {\n\t\tcurrency = bech32(currency);\n\t}\n\tsend(source, balance(currency), currency, \"mmx_escrow_revoke\");\n}\n"
  },
  {
    "path": "src/contract/fixed_price_liquid_token.js",
    "content": "\nconst FRACT_BITS = 64;\nconst RATIO_DIVIDER = 1000;\n\nvar owner;\nvar price;\nvar ratio;\t\t\t// withdraw ratio (0 to 1000)\nvar currency;\nvar owner_balance = 0;\n\nfunction init(owner_, price_, currency_, ratio_)\n{\n\towner = bech32(owner_);\n\tprice = uint(price_);\n\tratio = uint(ratio_);\n\tcurrency = bech32(currency_);\n\t\n\tassert(price > 0);\n\tassert(ratio < RATIO_DIVIDER);\n}\n\nfunction check_owner()\n{\n\tassert(this.user == owner, \"user not owner\", 1);\n}\n\nfunction buy() public payable\n{\n\tassert(this.deposit.currency == currency, \"wrong currency\", 2);\n\t\n\towner_balance += (this.deposit.amount * ratio) / RATIO_DIVIDER;\n\t\n\tmint(this.user, (this.deposit.amount * price) >> FRACT_BITS);\n}\n\nfunction sell() public payable\n{\n\tassert(this.deposit.currency == this.address, \"wrong token\", 2);\n\t\n\tvar ask_amount = (this.deposit.amount << FRACT_BITS) / price;\n\t\n\task_amount = (ask_amount * (RATIO_DIVIDER - ratio)) / RATIO_DIVIDER;\n\t\n\tsend(this.user, ask_amount, currency);\n\tsend(bech32(), this.deposit.amount, this.address);\n}\n\nfunction withdraw(amount) public\n{\n\tcheck_owner();\n\t\n\tif(!amount) {\n\t\tamount = owner_balance;\n\t} else {\n\t\tamount = uint(amount);\n\t}\n\tassert(amount <= owner_balance);\n\t\n\towner_balance -= amount;\n\t\n\tsend(owner, amount, currency);\n}\n\nfunction recover(amount, currency) public\n{\n\tcheck_owner();\n\t\n\tsend(owner, uint(amount), bech32(currency), \"mmx_token_recover\");\n}\n\nfunction transfer(owner_) public\n{\n\tcheck_owner();\n\t\n\towner = bech32(owner_);\n}\n"
  },
  {
    "path": "src/contract/fixed_price_token.js",
    "content": "\nconst FRACT_BITS = 64;\n\nvar owner;\nvar price;\nvar currency;\n\nfunction init(owner_, price_, currency_)\n{\n\towner = bech32(owner_);\n\tprice = uint(price_);\n\tcurrency = bech32(currency_);\n}\n\nfunction check_owner()\n{\n\tassert(this.user == owner, \"user not owner\", 1);\n}\n\nfunction buy() public payable\n{\n\tassert(this.deposit.currency == currency, \"wrong currency\", 2);\n\t\n\tmint(this.user, (this.deposit.amount * price) >> FRACT_BITS);\n}\n\nfunction withdraw(amount) public\n{\n\tcheck_owner();\n\t\n\tif(!amount) {\n\t\tamount = balance(currency);\n\t} else {\n\t\tamount = uint(amount);\n\t}\n\tsend(owner, amount, currency);\n}\n\nfunction recover(amount, currency) public\n{\n\tcheck_owner();\n\t\n\tsend(owner, uint(amount), bech32(currency), \"mmx_token_recover\");\n}\n\nfunction transfer(owner_) public\n{\n\tcheck_owner();\n\t\n\towner = bech32(owner_);\n}\n"
  },
  {
    "path": "src/contract/method_t.cpp",
    "content": "/*\n * method_t.cpp\n *\n *  Created on: May 15, 2022\n *      Author: mad\n */\n\n#include <mmx/contract/method_t.hxx>\n\n\nnamespace mmx {\nnamespace contract {\n\nuint64_t method_t::num_bytes() const\n{\n\tuint64_t payload = 3 + 4 + 4 * 3 + name.size() + info.size() + args.size() * 4;\n\tfor(const auto& entry : args) {\n\t\tpayload += entry.size();\n\t}\n\treturn payload;\n}\n\n\n} // contract\n} // mmx\n"
  },
  {
    "path": "src/contract/nft.js",
    "content": "\nvar serial;\nvar creator;\nvar mint_height;\n\ninterface template;\n\nfunction init(creator_)\n{\n\tassert(read(\"decimals\") == 0, \"decimals not zero\");\n\t\n\tcreator = bech32(creator_);\n}\n\nfunction init_n(creator_key, serial_, signature) static\n{\n\tassert(read(\"decimals\") == 0, \"decimals not zero\");\n\t\n\tcreator_key = binary_hex(creator_key);\n\t\n\tserial = uint(serial_);\n\tcreator = sha256(creator_key);\n\t\n\ttemplate.add(serial, creator_key, binary_hex(signature));\n}\n\nfunction mint_to(address, memo) public\n{\n\tassert(this.user == creator, \"invalid user\", 1);\n\t\n\tassert(!is_minted(), \"already minted\", 2);\n\t\n\tmint_height = this.height;\n\t\n\tif(memo == null) {\n\t\tmemo = \"mmx_nft_mint\";\n\t} else if(memo == false) {\n\t\tmemo = null;\n\t}\n\tmint(bech32(address), 1, memo);\n}\n\nfunction get_creator() const public\n{\n\treturn creator;\n}\n\nfunction is_minted() const public\n{\n\treturn mint_height != null;\n}\n\nfunction get_mint_height() const public\n{\n\treturn mint_height;\n}\n\n"
  },
  {
    "path": "src/contract/nft_offer.js",
    "content": "\nconst FRACT_BITS = 64;\nconst UPDATE_INTERVAL = 1080;\n\nvar owner;\nvar partner;\t\t\t// optional\nvar nft_contract;\nvar ask_currency;\nvar price;\nvar last_update;\t\t// height\n\nfunction init(owner_, nft_contract_, ask_currency_, price_, partner_)\n{\n\towner = bech32(owner_);\n\tnft_contract = bech32(nft_contract_);\n\task_currency = bech32(ask_currency_);\n\tprice = uint(price_);\n\t\n\tassert(price > 0);\n\tassert(nft_contract != ask_currency);\n\t\n\tif(partner_) {\n\t\tpartner = bech32(partner_);\n\t}\n\tlast_update = this.height;\n}\n\nfunction check_owner()\n{\n\tassert(this.user == owner, \"user not owner\", 1);\n}\n\nfunction check_partner()\n{\n\tif(partner) {\n\t\tassert(this.user == partner, \"user not partner\", 2);\n\t}\n}\n\nfunction deposit() public\n{\n\tcheck_owner();\n}\n\nfunction cancel() public\n{\n\tcheck_owner();\n\t\n\tsend(owner, balance(nft_contract), nft_contract, \"mmx_offer_cancel\");\n}\n\nfunction recover(amount, currency) public\n{\n\tcheck_owner();\n\t\n\tsend(owner, uint(amount), bech32(currency), \"mmx_offer_recover\");\n}\n\nfunction set_price(new_price) public\n{\n\tcheck_owner();\n\t\n\tassert(this.height - last_update >= UPDATE_INTERVAL, \"update too soon\", 7);\n\t\n\tnew_price = uint(new_price);\n\t\n\tassert(new_price > 0);\n\t\n\tif(new_price != price) {\n\t\tprice = new_price;\n\t\tlast_update = this.height;\n\t}\n}\n\nfunction accept(dst_addr, price_) public payable\n{\n\tcheck_partner();\n\t\n\tassert(uint(price_) == price, \"price changed\", 6);\n\tassert(balance(nft_contract) >= 1, \"empty offer\", 5);\n\t\n\tassert(this.deposit.currency == ask_currency, \"currency mismatch\", 3);\n\tassert(this.deposit.amount == price, \"invalid bid amount\", 4);\n\t\n\tsend(owner, price, ask_currency, \"mmx_offer_proceeds\");\n\tsend(bech32(dst_addr), 1, nft_contract, \"mmx_offer_accept\");\n}\n\n\n\n"
  },
  {
    "path": "src/contract/offer.js",
    "content": "\nconst FRACT_BITS = 64;\nconst UPDATE_INTERVAL = 1080;\n\nvar owner;\nvar partner;\t\t\t// optional\nvar bid_currency;\nvar ask_currency;\nvar inv_price;\t\t\t// [bid / ask]\nvar last_update;\t\t// height\n\nfunction init(owner_, bid_currency_, ask_currency_, inv_price_, partner_)\n{\n\towner = bech32(owner_);\n\tbid_currency = bech32(bid_currency_);\n\task_currency = bech32(ask_currency_);\n\tinv_price = uint(inv_price_);\n\t\n\tassert(inv_price > 0);\n\tassert(bid_currency != ask_currency);\n\t\n\tif(partner_) {\n\t\tpartner = bech32(partner_);\n\t}\n\tlast_update = this.height;\n}\n\nfunction check_owner()\n{\n\tassert(this.user == owner, \"user not owner\", 1);\n}\n\nfunction check_partner()\n{\n\tif(partner) {\n\t\tassert(this.user == partner, \"user not partner\", 2);\n\t}\n}\n\nfunction deposit() public\n{\n\tcheck_owner();\n}\n\nfunction cancel() public\n{\n\tcheck_owner();\n\t\n\tsend(owner, balance(bid_currency), bid_currency, \"mmx_offer_cancel\");\n}\n\nfunction withdraw() public\n{\n\tcheck_owner();\n\t\n\tsend(owner, balance(ask_currency), ask_currency, \"mmx_offer_withdraw\");\n}\n\nfunction recover(amount, currency) public\n{\n\tcheck_owner();\n\t\n\tsend(owner, uint(amount), bech32(currency), \"mmx_offer_recover\");\n}\n\nfunction set_price(new_price) public\n{\n\tcheck_owner();\n\t\n\tassert(this.height - last_update >= UPDATE_INTERVAL, \"update too soon\", 7);\n\t\n\tnew_price = uint(new_price);\n\t\n\tassert(new_price > 0);\n\t\n\tif(new_price != inv_price) {\n\t\tinv_price = new_price;\n\t\tlast_update = this.height;\n\t}\n}\n\nfunction trade(dst_addr, price) public payable\n{\n\tcheck_partner();\n\t\n\tassert(uint(price) == inv_price, \"price changed\", 6);\n\t\n\tassert(this.deposit.currency == ask_currency, \"currency mismatch\", 3);\n\t\n\tconst bid_amount = (this.deposit.amount * inv_price) >> FRACT_BITS;\n\tassert(bid_amount > 0, \"empty trade\", 4);\n\t\n\tsend(bech32(dst_addr), bid_amount, bid_currency, \"mmx_offer_trade\");\n}\n\nfunction accept(dst_addr, price) public payable\n{\n\tcheck_partner();\n\t\n\tassert(uint(price) == inv_price, \"price changed\", 6);\n\t\n\tassert(this.deposit.currency == ask_currency, \"currency mismatch\", 3);\n\t\n\t// take whatever is left in case another trade happened before\n\tconst bid_amount = min((this.deposit.amount * inv_price) >> FRACT_BITS, balance(bid_currency));\n\tassert(bid_amount > 0, \"empty offer\", 5);\n\t\n\tconst ask_amount = ((bid_amount << FRACT_BITS) + inv_price - 1) / inv_price;\t// round up\n\tconst ret_amount = this.deposit.amount - ask_amount;\t// will fail on underflow\n\t\n\tdst_addr = bech32(dst_addr);\n\tsend(dst_addr, bid_amount, bid_currency, \"mmx_offer_accept\");\n\tsend(dst_addr, ret_amount, ask_currency, \"mmx_offer_accept_return\");\n}\n\n\n\n"
  },
  {
    "path": "src/contract/plot_nft.js",
    "content": "\nconst UNLOCK_DELAY = 256;\n\nvar owner;\nvar target;\nvar unlock_height = 0;\nvar server_url;\n\nfunction init(owner_)\n{\n\towner = bech32(owner_);\n}\n\nfunction check_owner() const\n{\n\tassert(this.user == owner, \"user not owner\", 1);\n}\n\nfunction is_locked() const public\n{\n\tvar res = (unlock_height == null);\n\tif(!res) {\n\t\tres = (this.height < unlock_height);\n\t}\n\treturn res;\n}\n\nfunction mmx_reward_target(farmer) const public\n{\n\tvar addr = owner;\n\tif(is_locked()) {\n\t\taddr = target;\n\t} else if(farmer) {\n\t\taddr = bech32(farmer);\n\t}\n\treturn string_bech32(addr);\n}\n\nfunction lock(target_, server_url_) public\n{\n\tcheck_owner();\n\t\n\tassert(!is_locked(), \"contract still locked\", 2);\n\t\n\ttarget = bech32(target_);\n\tserver_url = server_url_;\n\tunlock_height = null;\n}\n\nfunction unlock() public\n{\n\tcheck_owner();\n\t\n\tif(unlock_height == null) {\n\t\tunlock_height = this.height + UNLOCK_DELAY;\n\t}\n}\n\nfunction claim_all(currency) public\n{\n\tif(is_locked()) {\n\t\tassert(this.user == target, \"user not target\", 3);\n\t} else {\n\t\tcheck_owner();\n\t}\n\tif(currency) {\n\t\tcurrency = bech32(currency);\n\t} else {\n\t\tcurrency = bech32();\n\t}\n\tsend(this.user, balance(currency), currency, \"mmx_plot_nft_claim\");\n}\n\nfunction transfer(owner_) public\n{\n\tcheck_owner();\n\t\n\towner = bech32(owner_);\n}\n\nfunction set_server_url(server_url_) public\n{\n\tcheck_owner();\n\t\n\tserver_url = server_url_;\n}\n\n"
  },
  {
    "path": "src/contract/poker.js",
    "content": "import {equals, sort, reverse, compare} from \"std\";\n\n// Poker Hand Ranking:\n// 0 - High Card\n// 1 - One Pair\n// 2 - Two Pair\n// 3 - Three of a Kind\n// 4 - Ace Low Straight\n// 5 - Straight\n// 6 - Flush\n// 7 - Full House\n// 8 - Four of a Kind\n// 9 - Ace Low Straight Flush\n// 10 - Straight Flush\n\n// Poker Suits:\n// H - Hearts\n// D - Diamonds\n// C - Clubs\n// S - Spades\n\nvar currency;\nvar blind_bet;\nvar bet_limit;\nvar max_players;\nvar timeout_interval;\n\nvar num_reveals = 0;\nvar num_actions = 0;\nvar deadline = null;\nvar round = 0;\nvar state = 0;          // 0 - waiting for players, 1 - revealing, 2 - betting, 3 - showdown, 4 - finished\nvar sequence = 1;\nvar bet_amount = 0;\nvar is_raise = false;\n\nvar player_map = {};\nvar player_list = [];\n\nvar board = null;\nvar final_pot = null;\nvar global_seed = null;\nvar winning_hand = null;\nvar winning_players = null;\n\nfunction init(currency_, blind_bet_, bet_limit_, max_players_, timeout_)\n{\n    currency = bech32(currency_);\n    blind_bet = uint(blind_bet_);\n    bet_limit = uint(bet_limit_) * blind_bet;\n    max_players = uint(max_players_);\n    timeout_interval = uint(timeout_);\n    assert(max_players >= 2);\n    assert(timeout_interval >= 6);\n}\n\nfunction join(name, commit, private_commit) public payable\n{\n    assert(state == 0, \"game already started\");\n    assert(!is_timeout(), \"too late\");\n\n    const num_players = size(player_list);\n\n    assert(num_players < max_players, \"table full\");\n    assert(this.user, \"missing user\");\n    assert(this.deposit.currency == currency, \"invalid currency\");\n    assert(this.deposit.amount == blind_bet, \"invalid deposit amount\");\n\n    commit = binary_hex(commit);\n    private_commit = binary_hex(private_commit);\n\n    assert(size(commit) == 32, \"invalid commit\");\n    assert(size(private_commit) == 32, \"invalid private commit\");\n    assert(is_string(name) && size(name) > 1 && size(name) <= 24, \"invalid name\");\n    assert(!player_map[this.user], \"already joined\");\n\n    const player = {\n        name: name,\n        address: this.user,\n        step: 0,\n        bet: blind_bet,\n        seed: [],\n        commit: commit,\n        private_commit: private_commit,\n    };\n    \n    if(num_players == 1) {\n        extend_deadline(3);\n    }\n    player_map[this.user] = num_players;\n    push(player_list, player);\n\n    check_start();\n}\n\nfunction check_start()\n{\n    if(state == 0) {\n        const num_players = size(player_list);\n        if(num_players > 1) {\n            if(num_players >= max_players || is_timeout()) {\n                state = 1;  // revealing\n                extend_deadline();\n            }\n        }\n    }\n}\n\nfunction reveal(seed, next_commit) public\n{\n    check_start();\n    check_action();\n\n    assert(state == 1, \"wrong state\");\n    assert(!is_timeout(), \"too late\");\n    assert(size(seed) == 32, \"invalid seed length\");\n\n    const player = get_player(this.user, true);\n    assert(size(player.seed) == round, \"already revealed\");\n    assert(sha256(seed) == player.commit, \"invalid seed\");\n\n    if(round < 4) {\n        next_commit = binary_hex(next_commit);\n        assert(size(next_commit) == 32, \"invalid commit\");\n        player.commit = next_commit;\n    } else {\n        player.commit = null;\n    }\n    push(player.seed, seed);\n    num_reveals++;\n\n    check_reveal();\n}\n\nfunction bet() public\n{\n    check_reveal();\n\n    assert(state == 2, \"wrong state\");\n    assert(!is_timeout(), \"too late\");\n    assert(this.deposit.currency == currency, \"invalid currency\");\n\n    const player = get_player(this.user, true);\n    assert(sequence > player.step, \"duplicate action\");\n    \n    player.bet += this.deposit.amount;\n    assert(player.bet <= bet_limit, \"bet limit exceeded\");\n\n    if(player.bet > bet_amount) {\n        is_raise = true;\n        bet_amount = player.bet;\n    }\n    player.step = sequence;\n    num_actions++;\n    \n    check_action();\n}\n\nfunction check(auto_fold) public\n{\n    check_reveal();\n\n    assert(state == 2, \"wrong state\");\n    assert(!is_timeout(), \"too late\");\n\n    const player = get_player(this.user, true);\n    assert(sequence > player.step, \"duplicate action\");\n\n    if(is_raise && auto_fold) {\n        player.fold = true;\n    }\n    player.step = sequence;\n    num_actions++;\n\n    check_action();\n}\n\nfunction fold() public\n{\n    check_reveal();\n\n    assert(state == 2, \"wrong state\");\n    assert(!is_timeout(), \"too late\");\n\n    const player = get_player(this.user, true);\n    assert(sequence > player.step, \"duplicate action\");\n\n    player.fold = true;\n    player.step = sequence;\n    num_actions++;\n\n    check_action();\n}\n\nfunction show(hand, private_seed) public\n{\n    check_action();\n\n    assert(state == 3, \"wrong state\");\n    assert(!is_timeout(), \"too late\");\n    assert(size(hand) == 5, \"invalid hand\");\n    assert(size(private_seed) == 32, \"invalid seed length\");\n\n    const player = get_player(this.user, true);\n    assert(!player.private_seed, \"already shown\");\n    assert(sha256(private_seed) == player.private_commit, \"invalid private seed\");\n\n    player.private_seed = private_seed;\n\n    const source = sha256(concat(global_seed, private_seed));\n    const pocket = [\n        get_card(memcpy(source, 8, 0)),\n        get_card(memcpy(source, 8, 8))\n    ];\n    const all_cards = concat(board, pocket);\n\n    const cards = [];\n    for(const i of hand) {\n        assert(i < 7, \"invalid card index\");\n        push(cards, all_cards[i]);\n    }\n    const rank = get_rank(cards);\n\n    if(winning_hand) {\n        const res = check_win(rank, winning_hand);\n        if(res == \"GT\") {\n            winning_hand = rank;\n            winning_players = [player];\n        } else if(res == \"EQ\") {\n            push(winning_players, player);\n        }\n    } else {\n        winning_hand = rank;\n        winning_players = [player];\n    }\n    num_reveals++;\n}\n\nfunction claim() public\n{\n    check_start();      // handle total timeout\n    check_finish();\n\n    assert(state == 4, \"wrong state\");\n\n    var user = null;\n    var amount = 0;\n    \n    if(winning_players) {\n        for(const player of winning_players) {\n            if(this.user == player.address) {\n                user = player;\n            }\n        }\n        amount = final_pot / size(winning_players);\n    } else {\n        const active = get_active();\n        const num_active = size(active);\n        if(num_active > 0) {\n            // nobody showed their hand, split the pot among remaining players\n            for(const player of active) {\n                if(this.user == player.address) {\n                    user = player;\n                }\n            }\n            amount = final_pot / num_active;\n        } else {\n            // everybody folded or timed out, return bets to each player\n            user = get_player(this.user);\n            amount = user.bet;\n        }\n    }\n\n    assert(user, \"cannot claim\");\n    assert(!user.claim, \"already claimed\");\n\n    send(this.user, amount, currency, \"poker_win\");\n    user.claim = true;\n}\n\nfunction is_timeout() const public\n{\n    if(deadline) {\n        return this.height >= deadline;\n    }\n    return false;\n}\n\nfunction extend_deadline(factor = 1)\n{\n    deadline = this.height + factor * timeout_interval;\n}\n\nfunction get_player(address, active_only = false) const public\n{\n    const index = player_map[address];\n    assert(index != null, \"not a player\");\n\n    const player = player_list[index];\n    if(active_only) {\n        assert(is_active(player), \"player folded or timed out\");\n    }\n    return player;\n}\n\nfunction is_active(player) const public\n{\n    if(player.fold) {\n        return false;\n    }\n    var curr_round = round;\n    if(state == 1 && is_timeout()) {\n        curr_round++;\n    }\n    return size(player.seed) >= curr_round;\n}\n\nfunction get_active() const public\n{\n    const active = [];\n    for(const player of player_list) {\n        if(is_active(player)) {\n            push(active, player);\n        }\n    }\n    return active;\n}\n\nfunction get_num_active() const public\n{\n    var count = 0;\n    for(const player of player_list) {\n        if(is_active(player)) {\n            count++;\n        }\n    }\n    return count;\n}\n\nfunction check_reveal()\n{\n    if(state == 1) {\n        if(num_reveals == get_num_active() || is_timeout()) {\n            round++;\n            state = 2;  // betting\n            num_reveals = 0;\n            extend_deadline();\n        }\n    }\n}\n\nfunction check_action()\n{\n    if(state == 2) {\n        if(num_actions == get_num_active() || is_timeout()) {\n            var done = true;\n            if(bet_amount) {\n                for(const player of get_active()) {\n                    if(player.bet < bet_amount) {\n                        if(is_raise) {\n                            done = false;\n                        } else {\n                            player.fold = true;\n                        }\n                    }\n                }\n            }\n            if(done) {\n                bet_amount = 0;\n                if(round < 4) {\n                    state = 1;  // revealing\n                } else {\n                    state = 3;  // showdown\n                    compute();\n                }\n            }\n            is_raise = false;\n            sequence++;\n            num_actions = 0;\n            extend_deadline();\n        }\n    }\n}\n\nfunction check_finish()\n{\n    if(state == 0 || final_pot) {\n        return;\n    }\n    const num_active = get_num_active();\n    if(state == 3 || num_active == 0) {\n        if(num_reveals == num_active || is_timeout()) {\n            final_pot = balance(currency);\n            state = 4;  // finished\n        }\n    }\n}\n\n// Function to leave the table if nobody else joined\n\nfunction leave() public\n{\n    assert(state == 0, \"game already started\");\n    assert(is_timeout(), \"too early\");\n    assert(size(player_list) == 1, \"cannot leave table\");\n\n    const player = get_player(this.user);\n\n    send(this.user, player.bet, currency);\n\n    player_map = {};\n    player_list = [];\n}\n\n// Function to get the rank of a poker hand (5 cards)\n// @param hand - array of array representing the poker hand\n// @return - array with the rank and sorted values of the hand\n//\n// Example:\n//   hand = [[\"2\", \"H\"], [\"3\", \"D\"], [\"4\", \"C\"], [\"5\", \"S\"], [\"6\", \"H\"]]\n//   return => [5, [4, 3, 2, 1, 0]]\n\nfunction get_rank(hand) const public\n{\n    assert(size(hand) == 5, \"hand must be 5 cards\");\n\n    const RANK_MAP = {\n        \"2\": 0, \"3\": 1, \"4\": 2, \"5\": 3, \"6\": 4, \"7\": 5, \"8\": 6, \"9\": 7, \"10\": 8,\n        \"T\": 8, \"J\": 9, \"Q\": 10, \"K\": 11, \"A\": 12\n    };\n    \n    var values = [];\n    var suit_map = {\"H\": 0, \"D\": 0, \"C\": 0, \"S\": 0};\n    \n    for(const card of hand) {\n        const rank = RANK_MAP[card[0]];\n        assert(rank != null, \"invalid card number\");\n        assert(suit_map[card[1]] != null, \"invalid card suit\");\n        push(values, rank);\n        suit_map[card[1]]++;\n    }\n    values = reverse(sort(values));\n    \n    var unique_values = [];     // sorted as well (DSC)\n    {\n        var prev = null;\n        for(const v of values) {\n            if(v != prev) {\n                push(unique_values, v);\n                prev = v;\n            }\n        }\n    }\n    \n    var straight = false;\n    if(size(unique_values) == 5) {\n        straight = (unique_values[0] - unique_values[4] == 4);\n    }\n    const low_straight = equals(unique_values, [12, 3, 2, 1, 0]);\n\n    var flush = false;\n    for(const suit of [\"H\", \"D\", \"C\", \"S\"]) {\n        if(suit_map[suit] == 5) {\n            flush = true;\n        }\n    }\n\n    var count = [];\n    for(var i = 0; i <= 12; i++) {\n        push(count, 0);\n    }\n    for(const v of values) {\n        count[v]++;\n    }\n    \n    var pairs = 0;\n    var threes = 0;\n    var fours = 0;\n    for(const v of unique_values) {\n        if(count[v] == 2) pairs++;\n        if(count[v] == 3) threes++;\n        if(count[v] == 4) fours++;\n    }\n    \n    if(flush && straight) return [10, values];\t    // Straight Flush\n    if(flush && low_straight) return [9, values];\t// Ace Low Straight Flush\n    if(fours) return [8, values];\t\t\t\t    // Four of a kind\n    if(threes && pairs) return [7, values];\t\t    // Full House\n    if(flush) return [6, values];\t\t\t\t    // Flush\n    if(straight) return [5, values];\t\t\t    // Straight\n    if(low_straight) return [4, values];\t        // Ace Low Straight\n    if(threes) return [3, values];\t\t\t\t    // Three of a kind\n    if(pairs == 2) return [2, values];\t\t\t    // Two Pair\n    if(pairs == 1) return [1, values];\t\t\t    // One Pair\n    return [0, values];\t\t\t\t\t\t\t    // High Card\n}\n\n// Function to compare two poker hands\n// @param hand - first poker hand (array of array)\n// @param other - second poker hand (array of array)\n// @return - \"GT\" if hand wins, \"LT\" if other wins, \"EQ\" if tie\n\nfunction check_win(hand, other) const public\n{\n    const L = get_rank(hand);\n    const R = get_rank(other);\n\n    const res = compare(L[0], R[0]);\n    if(res == \"EQ\") {\n        return compare(L[1], R[1]);\n    }\n    return res;\n}\n\n// Returns a random card based on a seed integer\n// @return - array with rank and suit of the card\n\nfunction get_card(seed) const public\n{\n    seed = uint(seed);\n    const RANK_MAP = [\"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"T\", \"J\", \"Q\", \"K\", \"A\"];\n    const SUIT_MAP = [\"H\", \"D\", \"C\", \"S\"];\n    return [RANK_MAP[seed % 13], SUIT_MAP[(seed / 13) % 4]];\n}\n\nfunction compute() public\n{\n    if(board) {\n        return board;\n    }\n    assert(state == 3, \"wrong state\");\n\n    const seed_list = [\"\", \"\", \"\", \"\"];\n    for(const player of player_list) {\n        for(var i = 0; i < size(player.seed) && i < 4; i++) {\n            seed_list[i] = concat(seed_list[i], player.seed[i]);\n        }\n    }\n\n    const source = [];\n    for(var i = 0; i < 4; i++) {\n        var hash = sha256(seed_list[i]);\n        if(i > 0) {\n            hash = sha256(concat(source[i - 1], hash));\n        }\n        push(source, hash);\n    }\n    global_seed = source[0];\n\n    board = [\n        get_card(memcpy(source[1], 8, 0)),\n        get_card(memcpy(source[1], 8, 8)),\n        get_card(memcpy(source[1], 8, 16)),\n        get_card(memcpy(source[2], 8, 0)),\n        get_card(memcpy(source[3], 8, 0))\n    ];\n}\n"
  },
  {
    "path": "src/contract/relay.js",
    "content": "\nvar owner;\nvar transfer_target;\n\nfunction init(owner_)\n{\n\towner = bech32(owner_);\n}\n\nfunction claim_all(currency) public\n{\n\tassert(this.user == owner, \"user not owner\", 1);\n\t\n\tif(!currency) {\n\t\tcurrency = bech32();\n\t} else {\n\t\tcurrency = bech32(currency);\n\t}\n\tsend(owner, balance(currency), currency);\n}\n\nfunction transfer(new_owner) public\n{\n\tassert(this.user == owner, \"user not owner\", 1);\n\t\n\ttransfer_target = bech32(new_owner);\n}\n\nfunction complete() public\n{\n\tassert(transfer_target, \"no pending transfer\");\n\t\n\tassert(this.user == transfer_target, \"user not target\");\n\t\n\towner = transfer_target;\n\ttransfer_target = null;\n}\n"
  },
  {
    "path": "src/contract/smart_wallet.js",
    "content": "\nvar owner;\nvar plans = {};\n\nfunction init(owner_)\n{\n\towner = bech32(owner_);\n}\n\nfunction check_owner()\n{\n\tassert(this.user == owner, \"user not owner\", 1);\n}\n\nfunction transfer(address, amount, currency, memo) public\n{\n\tcheck_owner();\n\t\n\tsend(bech32(address), uint(amount), bech32(currency), memo);\n}\n\nfunction add_plan(name, amount, currency, target, memo, interval, start) public\n{\n\tcheck_owner();\n\t\n\tconst prev = plans[name];\n\tif(prev) {\n\t\tassert(!prev.active, \"plan already exists\", 2);\n\t}\n\tif(memo != null) {\n\t\tmemo = to_string(memo);\n\t}\n\tif(start == null) {\n\t\tstart = this.height;\n\t}\n\tplans[name] = {\n\t\tamount: amount,\n\t\tcurrency: bech32(currency),\n\t\ttarget: bech32(target),\n\t\tmemo: memo,\n\t\tinterval: interval,\n\t\tnext_pay: start,\n\t\tactive: true\n\t};\n}\n\nfunction cancel_plan(name) public\n{\n\tcheck_owner();\n\t\n\tconst plan = plans[name];\n\tassert(plan, \"no such plan\", 3);\n\t\n\tplan.active = false;\n}\n\nfunction plan_payment(name) public\n{\n\tconst plan = plans[name];\n\tassert(plan, \"no such plan\", 3);\n\t\n\tassert(plan.active, \"plan has been canceled\", 4);\n\t\n\tassert(this.height >= plan.next_pay, \"payment too soon\", 5);\n\t\n\tplan.next_pay += plan.interval;\n\t\n\tsend(plan.target, plan.amount, plan.currency, plan.memo);\n}\n\n\n"
  },
  {
    "path": "src/contract/swap.js",
    "content": "\nconst FRACT_BITS = 64;\nconst LOCK_DURATION = 8640;\t// 24 hours\n\nconst fee_rates = [\n\t9223372036854776,\t\t// 0.0005\n\t46116860184273879,\t\t// 0.0025\n\t184467440737095516,\t\t// 0.01\n\t922337203685477581,\t\t// 0.05\n];\n\nvar tokens;\nvar state = [];\nvar volume = [0, 0];\nvar users = {};\n\n// common variables:\n// `i`: index of deposited token, 0 = token, 1 = currency\n// `k`: index of token to be traded for, the opposite of `i` ((i == 0 && k == 1) || (i == 1 && k == 0))\n\nfunction init(token, currency)\n{\n\ttokens = [bech32(token), bech32(currency)];\n\t\n\tassert(tokens[0] != tokens[1]);\n\t\n\tfor(const fee_rate of fee_rates) {\n\t\tvar out = {};\n\t\tout.balance = [0, 0];\n\t\tout.user_total = [0, 0];\n\t\tout.fee_rate = fee_rate;\n\t\tout.fees_paid = [0, 0];\n\t\tout.fees_claimed = [0, 0];\n\t\tpush(state, out);\n\t}\n}\n\nfunction _get_earned_fees(user) const\n{\n\tconst entry = state[user.pool_idx];\n\t\n\tconst user_share = [0, 0];\n\tfor(var i = 0; i < 2; ++i) {\n\t\tif(user.balance[i] > 0) {\n\t\t\tconst total_fees = entry.fees_paid[i] - user.last_fees_paid[i];\n\t\t\tif(total_fees > 0) {\n\t\t\t\tuser_share[i] = min(\n\t\t\t\t\t\t(2 * total_fees * user.balance[i]) /\n\t\t\t\t\t\t(entry.user_total[i] + user.last_user_total[i]),\n\t\t\t\t\t\tentry.fees_paid[i] - entry.fees_claimed[i]);\n\t\t\t}\n\t\t}\n\t}\n\treturn user_share;\n}\n\nfunction get_earned_fees(address) const public\n{\n\tconst user = users[bech32(address)];\n\tassert(user);\n\treturn _get_earned_fees(user);\n}\n\nfunction _payout(user)\n{\n\tconst entry = state[user.pool_idx];\n\tconst user_share = _get_earned_fees(user);\n\t\n\tfor(var i = 0; i < 2; ++i) {\n\t\tconst amount = user_share[i];\n\t\tif(amount > 0) {\n\t\t\tentry.fees_claimed[i] += amount;\n\t\t\tsend(this.user, amount, tokens[i], \"mmx_swap_payout\");\n\t\t}\n\t\tuser.last_fees_paid[i] = entry.fees_paid[i];\n\t\tuser.last_user_total[i] = entry.user_total[i];\n\t}\n\treturn user_share;\n}\n\nfunction payout() public\n{\n\tconst user = users[this.user];\n\tassert(user);\n\treturn _payout(user);\n}\n\nfunction _add_liquid(i, pool_idx, amount)\n{\n\tassert(i < 2);\n\tassert(pool_idx < size(state));\n\t\n\tconst entry = state[pool_idx];\n\t\n\tvar user = users[this.user];\n\tif(user == null) {\n\t\tuser = {};\n\t\tuser.pool_idx = pool_idx;\n\t\tuser.balance = [0, 0];\n\t\tuser.last_fees_paid = [0, 0];\n\t\tuser.last_user_total = [0, 0];\n\t\tusers[this.user] = user;\n\t} else {\n\t\tif(user.balance[0] > 0 || user.balance[1] > 0) {\n\t\t\tassert(pool_idx == user.pool_idx, \"pool_idx mismatch\");\n\t\t\t// need to payout now, to avoid fee stealing\n\t\t\t_payout(user);\n\t\t}\n\t\tuser.pool_idx = pool_idx;\n\t}\n\tentry.balance[i] += amount;\n\tentry.user_total[i] += amount;\n\t\n\tfor(var k = 0; k < 2; ++k) {\n\t\tuser.last_fees_paid[k] = entry.fees_paid[k];\n\t\tuser.last_user_total[k] = entry.user_total[k];\n\t}\n\tuser.balance[i] += amount;\n\tuser.unlock_height = this.height + LOCK_DURATION;\n}\n\nfunction add_liquid(i, pool_idx) public payable\n{\n\tassert(i < 2);\n\tassert(this.deposit.currency == tokens[i]);\n\t\n\t_add_liquid(i, pool_idx, this.deposit.amount);\n}\n\nfunction _rem_liquid(user, i, amount, do_send = true)\n{\n\tassert(i < 2);\n\t\n\tconst k = (i + 1) % 2;\n\tconst entry = state[user.pool_idx];\n\tconst balance = entry.balance;\n\tconst user_total = entry.user_total;\n\t\n\tvar ret_amount = (balance[i] * amount) / user_total[i];\n\tvar trade_amount = 0;\n\t\n\tif(balance[i] < user_total[i]) {\n\t\tif(balance[k] > user_total[k]) {\n\t\t\t// token k was bought\n\t\t\ttrade_amount = ((balance[k] - user_total[k]) * amount) / user_total[i];\n\t\t}\n\t} else if(balance[k] < user_total[k]) {\n\t\t// no trade happened\n\t\tret_amount = amount;\n\t}\n\t\n\tif(ret_amount > 0) {\n\t\tif(do_send) {\n\t\t\tsend(this.user, ret_amount, tokens[i], \"mmx_swap_rem_liquid\");\n\t\t}\n\t\tbalance[i] -= ret_amount;\n\t}\n\tif(trade_amount > 0) {\n\t\tif(do_send) {\n\t\t\tsend(this.user, trade_amount, tokens[k], \"mmx_swap_rem_liquid_trade\");\n\t\t}\n\t\tbalance[k] -= trade_amount;\n\t}\n\tuser.balance[i] -= amount;\n\tuser_total[i] -= amount;\n\t\n\tconst out = [0, 0];\n\tout[i] = ret_amount;\n\tout[k] = trade_amount;\n\treturn out;\n}\n\nfunction rem_liquid(i, amount, dry_run = false) public\n{\n\tassert(i < 2);\n\t\n\tamount = uint(amount);\n\tassert(amount);\n\t\n\tconst user = users[this.user];\n\tassert(user);\n\t\n\tif(!dry_run) {\n\t\tassert(this.height >= user.unlock_height, \"liquidity still locked\", 3);\n\t}\n\tassert(amount <= user.balance[i], \"amount > user balance\", 4);\n\t\n\treturn _rem_liquid(user, i, amount, !dry_run);\n}\n\nfunction rem_all_liquid(dry_run = false) public\n{\n\tconst user = users[this.user];\n\tassert(user);\n\t\n\t_payout(user);\n\t\n\tconst out = [0, 0];\n\tfor(var i = 0; i < 2; ++i) {\n\t\tconst amount = user.balance[i];\n\t\tif(amount > 0) {\n\t\t\tconst ret = rem_liquid(i, amount, dry_run);\n\t\t\tfor(var k = 0; k < 2; ++k) {\n\t\t\t\tout[k] += ret[k];\n\t\t\t}\n\t\t}\n\t}\n\treturn out;\n}\n\nfunction switch_pool(pool_idx) public\n{\n\tassert(pool_idx < size(state));\n\t\n\tconst user = users[this.user];\n\tassert(user);\n\tassert(this.height >= user.unlock_height, \"liquidity still locked\", 3);\n\t\n\t_payout(user);\n\t\n\tconst new_amount = [0, 0];\n\t\n\tfor(var i = 0; i < 2; ++i) {\n\t\tconst amount = user.balance[i];\n\t\tif(amount > 0) {\n\t\t\tconst ret = _rem_liquid(user, i, amount, false);\n\t\t\tnew_amount[0] += ret[0];\n\t\t\tnew_amount[1] += ret[1];\n\t\t}\n\t}\n\tfor(var i = 0; i < 2; ++i) {\n\t\tif(new_amount[i] > 0) {\n\t\t\t_add_liquid(i, pool_idx, new_amount[i]);\n\t\t}\n\t}\n\treturn new_amount;\n}\n\nfunction get_total_balance() public const\n{\n\tconst total = [0, 0];\n\tfor(const entry of state) {\n\t\ttotal[0] += entry.balance[0];\n\t\ttotal[1] += entry.balance[1];\n\t}\n\treturn total;\n}\n\nfunction trade(i, address, min_trade, num_iter) public payable\n{\n\tassert(i < 2);\n\tassert(num_iter > 0);\n\tassert(this.deposit.currency == tokens[i]);\n\t\n\tconst k = (i + 1) % 2;\n\tconst amount = this.deposit.amount;\n\tconst chunk_size = (amount + num_iter - 1) / num_iter;\n\n\tconst out = [0, 0];\n\tvar amount_left = amount;\n\tvar total_actual_amount = 0;\n\t\n\tfor(var iter = 0; iter < num_iter && amount_left > 0; ++iter)\n\t{\n\t\tconst amount_i = min(chunk_size, amount_left);\n\n\t\tvar entry;\n\t\tvar fee_amount_i = 0;\n\t\tvar trade_amount_i = 0;\n\t\tvar actual_amount_i = 0;\n\t\t\n\t\tfor(const entry_j of state)\n\t\t{\n\t\t\tconst balance = entry_j.balance;\n\t\t\tif(balance[k] > 0) {\n\t\t\t\tconst trade_amount = balance[k] - (balance[i] * balance[k]) / (balance[i] + amount_i);\n\t\t\t\t\n\t\t\t\tconst fee_amount = min(((trade_amount * entry_j.fee_rate) >> FRACT_BITS) + 1, trade_amount);\n\t\t\t\t\n\t\t\t\tconst actual_amount = trade_amount - fee_amount;\n\t\t\t\tif(actual_amount > actual_amount_i) {\n\t\t\t\t\tentry = entry_j;\n\t\t\t\t\tfee_amount_i = fee_amount;\n\t\t\t\t\ttrade_amount_i = trade_amount;\n\t\t\t\t\tactual_amount_i = actual_amount;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(entry) {\n\t\t\ttotal_actual_amount += actual_amount_i;\n\t\t\t\n\t\t\tout[0] += trade_amount_i;\n\t\t\tout[1] += fee_amount_i;\n\t\t\t\n\t\t\tvolume[k] += trade_amount_i;\n\t\t\t\n\t\t\tentry.balance[i] += amount_i;\n\t\t\tentry.balance[k] -= trade_amount_i;\n\t\t\tentry.fees_paid[k] += fee_amount_i;\n\t\t\t\n\t\t\tamount_left -= amount_i;\n\t\t}\n\t}\n\t\n\tassert(amount_left == 0);\n\t\n\tif(min_trade) {\n\t\tassert(total_actual_amount >= uint(min_trade), \"minimum trade amount not reached\", 7);\n\t}\n\tassert(total_actual_amount > 0, \"empty trade\", 7);\n\t\n\tsend(bech32(address), total_actual_amount, tokens[k], \"mmx_swap_trade\");\n\t\n\treturn out;\n}\n\n"
  },
  {
    "path": "src/contract/template.js",
    "content": "\nvar creator;\nvar nfts = {};\n\nfunction init(creator_)\n{\n\tcreator = bech32(creator_);\n}\n\nfunction add(serial, creator_key, signature) public\n{\n\tassert(this.user);\n\tassert(is_uint(serial));\n\tassert(serial > 0);\n\t\n\tassert(nfts[serial] == null, \"already minted\", 2);\n\t\n\tassert(sha256(creator_key) == creator, \"invalid creator\", 3);\n\t\n\tconst msg = concat(string_bech32(this.address), \"/\", string(serial));\n\t\n\tassert(ecdsa_verify(sha256(msg), creator_key, signature), \"invalid signature\", 4);\n\t\n\tnfts[serial] = this.user;\n}\n"
  },
  {
    "path": "src/contract/time_lock.js",
    "content": "\nvar owner;\nvar unlock_height;\n\nfunction init(owner_, unlock_height_)\n{\n\towner = bech32(owner_);\n\tunlock_height = uint(unlock_height_);\n}\n\nfunction check_owner() const\n{\n\tassert(this.user == owner, \"user not owner\", 1);\n}\n\nfunction is_locked() const public\n{\n\treturn this.height < unlock_height;\n}\n\nfunction deposit() public {}\n\nfunction withdraw(address, amount, currency) public\n{\n\tcheck_owner();\n\t\n\tassert(!is_locked(), \"still locked\", 2);\n\t\n\tsend(bech32(address), amount, bech32(currency));\n}\n\nfunction set_unlock_height(height) public\n{\n\tcheck_owner();\n\t\n\tassert(height >= unlock_height, \"invalid height\", 3);\n\t\n\tunlock_height = height;\n}"
  },
  {
    "path": "src/contract/token.js",
    "content": "\nvar owner;\n\nfunction init(owner_)\n{\n\towner = bech32(owner_);\n}\n\nfunction check_owner()\n{\n\tassert(this.user == owner, \"user not owner\", 1);\n}\n\nfunction mint_to(address, amount, memo) public\n{\n\tcheck_owner();\n\t\n\tif(memo == null) {\n\t\tmemo = \"mmx_token_mint\";\n\t} else if(memo == false) {\n\t\tmemo = null;\n\t}\n\tmint(bech32(address), uint(amount), memo);\n}\n\nfunction transfer(owner_) public\n{\n\tcheck_owner();\n\t\n\towner = bech32(owner_);\n}\n\nfunction recover(amount, currency) public\n{\n\tcheck_owner();\n\t\n\tsend(owner, uint(amount), bech32(currency), \"mmx_token_recover\");\n}\n"
  },
  {
    "path": "src/contract/transfer.js",
    "content": "\nvar source;\nvar target;\n\nfunction init(source_, target_)\n{\n\tsource = bech32(source_);\n\ttarget = bech32(target_);\n}\n\nfunction receive(currency) public\n{\n\tassert(this.user == target, \"user not target\", 1);\n\t\n\tcurrency = bech32(currency);\n\t\n\tsend(target, balance(currency), currency);\n}\n\nfunction cancel(currency) public\n{\n\tassert(this.user == source, \"user not source\", 2);\n\t\n\tcurrency = bech32(currency);\n\t\n\tsend(source, balance(currency), currency);\n}\n"
  },
  {
    "path": "src/contract/virtual_plot.js",
    "content": "\nconst WITHDRAW_FACTOR = 90;\n\nvar owner;\n\nfunction init(owner_)\n{\n\towner = bech32(owner_);\n}\n\nfunction deposit() public {}\n\nfunction withdraw(amount, currency) public\n{\n\tif(this.user != owner) {\n\t\tfail(\"user != owner\", 1);\n\t}\n\tamount = uint(amount);\n\tcurrency = bech32(currency);\n\t\n\tvar ret_amount = amount;\n\t\n\tif(currency == bech32()) {\n\t\tret_amount = (amount * WITHDRAW_FACTOR) / 100;\n\t}\n\tsend(owner, ret_amount, currency, \"mmx_virtual_plot_withdraw\");\n\tsend(bech32(), amount - ret_amount, currency, \"mmx_virtual_plot_burn\");\n}\n"
  },
  {
    "path": "src/exec_error_t.cpp",
    "content": "/*\n * exec_error_t.cpp\n *\n *  Created on: Mar 22, 2023\n *      Author: mad\n */\n\n#include <mmx/exec_error_t.hxx>\n#include <mmx/write_bytes.h>\n\n\nnamespace mmx {\n\nvnx::bool_t exec_error_t::is_valid() const\n{\n\treturn message.size() <= MAX_MESSAGE_LENGTH;\n}\n\nhash_t exec_error_t::calc_hash() const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"code\", \tcode);\n\twrite_field(out, \"address\", address);\n\twrite_field(out, \"operation\", operation);\n\twrite_field(out, \"line\", \tline);\n\twrite_field(out, \"message\", message);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/exec_result_t.cpp",
    "content": "/*\n * exec_result_t.cpp\n *\n *  Created on: Aug 23, 2022\n *      Author: mad\n */\n\n#include <mmx/exec_result_t.hxx>\n#include <mmx/error_code_e.hxx>\n#include <mmx/write_bytes.h>\n\n\nnamespace mmx {\n\nvnx::bool_t exec_result_t::is_valid() const\n{\n\tfor(const auto& in : inputs) {\n\t\tif(in.memo && in.memo->size() > txio_t::MAX_MEMO_SIZE) {\n\t\t\treturn false;\n\t\t}\n\t}\n\tfor(const auto& out : outputs) {\n\t\tif(out.memo && out.memo->size() > txio_t::MAX_MEMO_SIZE) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn !error || error->is_valid();\n}\n\nhash_t exec_result_t::calc_hash() const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"did_fail\", \tdid_fail);\n\twrite_field(out, \"total_cost\", \ttotal_cost);\n\twrite_field(out, \"total_fee\", \ttotal_fee);\n\twrite_field(out, \"inputs\",\t\tinputs);\n\twrite_field(out, \"outputs\", \toutputs);\n\twrite_field(out, \"error\", \t\terror ? error->calc_hash() : hash_t());\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nuint64_t exec_result_t::calc_cost(std::shared_ptr<const ChainParams> params) const\n{\n\tuint64_t cost = 0;\n\tfor(const auto& in : inputs) {\n\t\tcost += in.calc_cost(params);\n\t}\n\tfor(const auto& out : outputs) {\n\t\tcost += out.calc_cost(params);\n\t}\n\treturn cost;\n}\n\nstd::string exec_result_t::get_error_msg() const\n{\n\tif(did_fail) {\n\t\tif(error) {\n\t\t\tstd::string code;\n\t\t\tif(error->code) {\n\t\t\t\tconst auto name = error_code_e(error_code_e::enum_t(error->code)).to_string_value();\n\t\t\t\tif(name != std::to_string(error->code)) {\n\t\t\t\t\tcode = \" (\" + name + \")\";\n\t\t\t\t} else {\n\t\t\t\t\tcode = \" (code \" + name + \")\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(error->operation != 0xFFFFFFFF) {\n\t\t\t\tstd::string location;\n\t\t\t\tif(error->address != 0xFFFFFFFF) {\n\t\t\t\t\tlocation = \"exception at 0x\" + vnx::to_hex_string(error->address);\n\t\t\t\t\tif(error->line) {\n\t\t\t\t\t\tlocation += \", line \" + std::to_string(*error->line);\n\t\t\t\t\t}\n\t\t\t\t\tlocation += \": \";\n\t\t\t\t}\n\t\t\t\treturn location + error->message + code + \" (op \" + std::to_string(error->operation) + \")\";\n\t\t\t} else {\n\t\t\t\treturn error->message + code;\n\t\t\t}\n\t\t}\n\t\treturn \"tx failed\";\n\t}\n\treturn std::string();\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/fixed128.cpp",
    "content": "/*\n * fixed128.cpp\n *\n *  Created on: Dec 15, 2022\n *      Author: mad\n */\n\n#include <mmx/fixed128.hpp>\n#include <mmx/utils.h>\n\n#include <vnx/Variant.hpp>\n\n#include <cmath>\n\n\nnamespace mmx {\n\nstatic uint64_t calc_divider(const int decimals)\n{\n\tuint64_t res = 1;\n\tfor(int i = 0; i < decimals; ++i) {\n\t\tres *= 10;\n\t}\n\treturn res;\n}\n\nconst uint64_t fixed128::divider = calc_divider(fixed128::decimals);\n\n\nfixed128::fixed128(const double& v)\n{\n\tfixed = mmx::to_amount(v, decimals);\n}\n\nfixed128::fixed128(const uint128_t& value, const int decimals)\n{\n\tauto tmp = uint256_t(value) * divider;\n\tfor(int i = 0; i < decimals; ++i) {\n\t\ttmp /= 10;\n\t}\n\tif(tmp.upper()) {\n\t\tthrow std::logic_error(\"fixed128 overflow\");\n\t}\n\tfixed = tmp;\n}\n\nfixed128::fixed128(const std::string& str)\n{\n\tif(str.empty() || str.find_first_not_of(\"0123456789.,eE-\") != std::string::npos) {\n\t\tthrow std::logic_error(\"string is not a number: '\" + str + \"'\");\n\t}\n\tconst auto dec_pos = str.find_first_of(\".,\");\n\tconst auto exp_pos = str.find_first_of(\"eE\");\n\tif(dec_pos != std::string::npos || exp_pos != std::string::npos)\n\t{\n\t\tconst auto integer = str.substr(0, std::min(dec_pos, exp_pos));\n\t\tif(integer.empty() || integer.find_first_not_of(\"0123456789\") != std::string::npos) {\n\t\t\tthrow std::logic_error(\"invalid integer part: '\" + integer + \"'\");\n\t\t}\n\t\tfixed = uint128_t(integer, 10);\n\t\tfixed *= divider;\n\n\t\tstd::string fract;\n\t\tif(dec_pos != std::string::npos) {\n\t\t\tif(exp_pos != std::string::npos && exp_pos > dec_pos) {\n\t\t\t\tfract = str.substr(dec_pos + 1, exp_pos - dec_pos - 1);\n\t\t\t} else {\n\t\t\t\tfract = str.substr(dec_pos + 1);\n\t\t\t}\n\t\t\tfract.resize(std::min<size_t>(fract.size(), decimals));\n\n\t\t\tif(auto lower = uint128_t(fract, 10)) {\n\t\t\t\tfor(int i = fract.size(); i < decimals; ++i) {\n\t\t\t\t\tlower *= 10;\n\t\t\t\t}\n\t\t\t\tfixed += lower;\n\t\t\t}\n\t\t}\n\t\tif(exp_pos != std::string::npos) {\n\t\t\tconst auto exp_10 = vnx::from_string<int>(str.substr(exp_pos + 1));\n\t\t\tif(std::abs(exp_10) > decimals - int(fract.size())) {\n\t\t\t\tthrow std::logic_error(\"out of range exponent: \" + str.substr(exp_pos));\n\t\t\t}\n\t\t\tif(exp_10 >= 0) {\n\t\t\t\tfor(int i = 0; i < exp_10; ++i) {\n\t\t\t\t\tfixed *= 10;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor(int i = exp_10; i < 0; ++i) {\n\t\t\t\t\tfixed /= 10;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfixed = uint128_t(str, 10) * divider;\n\t}\n}\n\nstd::string fixed128::to_string() const\n{\n\tauto str = uint().str(10);\n\tif(auto lower = fractional()) {\n\t\tstr += '.';\n\t\tauto fract = std::to_string(lower);\n\t\tfor(int i = fract.size(); i < decimals; ++i) {\n\t\t\tstr += '0';\n\t\t}\n\t\twhile(fract.size() && fract.back() == '0') {\n\t\t\tfract.pop_back();\n\t\t}\n\t\tstr += fract;\n\t}\n\treturn str;\n}\n\ndouble fixed128::to_value() const\n{\n\treturn uint().to_double() + double(fractional()) * pow(10, -decimals);\n}\n\nuint128 fixed128::to_amount(const int decimals) const\n{\n\tuint128 amount = fixed;\n\tif(decimals < fixed128::decimals) {\n\t\tfor(int i = decimals; i < fixed128::decimals; ++i) {\n\t\t\tamount /= 10;\n\t\t}\n\t} else {\n\t\tfor(int i = fixed128::decimals; i < decimals; ++i) {\n\t\t\tamount *= 10;\n\t\t}\n\t}\n\treturn amount;\n}\n\n\n} // mmx\n\n\nnamespace vnx {\n\nvoid read(vnx::TypeInput& in, mmx::fixed128& value, const vnx::TypeCode* type_code, const uint16_t* code)\n{\n\tswitch(code[0]) {\n\t\tcase CODE_STRING:\n\t\tcase CODE_ALT_STRING: {\n\t\t\tstd::string str;\n\t\t\tvnx::read(in, str, type_code, code);\n\t\t\ttry {\n\t\t\t\tvalue = mmx::fixed128(str);\n\t\t\t} catch(...) {\n\t\t\t\tvalue = mmx::fixed128();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase CODE_UINT8:\n\t\tcase CODE_UINT16:\n\t\tcase CODE_UINT32:\n\t\tcase CODE_UINT64:\n\t\tcase CODE_ALT_UINT8:\n\t\tcase CODE_ALT_UINT16:\n\t\tcase CODE_ALT_UINT32:\n\t\tcase CODE_ALT_UINT64: {\n\t\t\tuint64_t tmp = 0;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\tvalue = mmx::fixed128(tmp);\n\t\t\tbreak;\n\t\t}\n\t\tcase CODE_FLOAT:\n\t\tcase CODE_DOUBLE:\n\t\tcase CODE_ALT_FLOAT:\n\t\tcase CODE_ALT_DOUBLE: {\n\t\t\tdouble tmp = 0;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\tvalue = mmx::fixed128(tmp);\n\t\t\tbreak;\n\t\t}\n\t\tcase CODE_DYNAMIC:\n\t\tcase CODE_ALT_DYNAMIC: {\n\t\t\tvnx::Variant tmp;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\tvalue = tmp.to<mmx::fixed128>();\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tvnx::read(in, value.fixed, type_code, code);\n\t}\n}\n\n} // vnx\n"
  },
  {
    "path": "src/hash_512_t.cpp",
    "content": "/*\n * hash_512_t.cpp\n *\n *  Created on: Nov 13, 2023\n *      Author: mad\n */\n\n#include <mmx/hash_512_t.hpp>\n#include <vnx/Util.h>\n\n#include <sha512.h>\n\n\nnamespace mmx {\n\nhash_512_t::hash_512_t(const void* data, const size_t num_bytes)\n{\n\tSHA512 hash;\n\thash.Write((const uint8_t*)data, num_bytes);\n\thash.Finalize(this->data());\n}\n\nhash_512_t hash_512_t::random()\n{\n\tstd::vector<uint8_t> seed(4096);\n\tvnx::secure_random_bytes(seed.data(), seed.size());\n\treturn hash_512_t(seed);\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/hash_t.cpp",
    "content": "/*\n * hash_t.cpp\n *\n *  Created on: Jan 6, 2022\n *      Author: mad\n */\n\n#include <mmx/hash_t.hpp>\n#include <vnx/SHA256.h>\n#include <vnx/Util.h>\n\n#include <uint256_t.h>\n#include <sha256_ni.h>\n#include <sha256_arm.h>\n\n#include <atomic>\n#include <thread>\n#include <chrono>\n\n\nnamespace mmx {\n\nstatic const bytes_t<32> empty_hash(\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\");\n\nhash_t::hash_t(const void* data, const size_t num_bytes)\n{\n\tstatic const bool have_sha_ni = sha256_ni_available();\n\tstatic const bool have_sha_arm = sha256_arm_available();\n\n\tif(num_bytes == 0) {\n\t\tbytes = empty_hash.bytes;\n\t} else if(have_sha_ni) {\n\t\tsha256_ni(bytes.data(), (const uint8_t*)data, num_bytes);\n\t} else if(have_sha_arm) {\n\t\tsha256_arm(bytes.data(), (const uint8_t*)data, num_bytes);\n\t} else {\n\t\tvnx::SHA256 ctx;\n\t\tctx.update((const uint8_t*)data, num_bytes);\n\t\tctx.finalize(bytes.data());\n\t}\n}\n\nhash_t hash_t::random()\n{\n\thash_t out;\n\tvnx::secure_random_bytes(out.data(), out.size());\n\treturn out;\n}\n\nhash_t hash_t::secure_random()\n{\n\tuint256_t entropy = 0;\n\tstatic constexpr int BITS_PER_ITER = 4;\n\tfor(int i = 0; i < 256 / BITS_PER_ITER; ++i)\n\t{\n\t\tentropy <<= BITS_PER_ITER;\n\t\tstd::atomic_bool trigger {false};\n\n\t\tstd::thread timer([&trigger]() {\n\t\t\tstd::this_thread::sleep_for(std::chrono::microseconds(10));\n\t\t\ttrigger = true;\n\t\t});\n\t\twhile(!trigger) {\n\t\t\tentropy++;\n\t\t}\n\t\ttimer.join();\n\t}\n\tconst bytes_t<32> entropy_bytes(&entropy, sizeof(entropy));\n\n\tbytes_t<128> rand_bytes;\n\tvnx::secure_random_bytes(rand_bytes.data(), rand_bytes.size());\n\n\treturn hash_t(entropy_bytes + rand_bytes);\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/hmac_sha512.cpp",
    "content": "// Copyright (c) 2014-2018 The Bitcoin Core developers\n// Distributed under the MIT software license, see the accompanying\n// file COPYING or http://www.opensource.org/licenses/mit-license.php.\n\n#include <hmac_sha512.h>\n\n#include <string.h>\n\nHMAC_SHA512::HMAC_SHA512(const unsigned char* key, size_t keylen)\n{\n    unsigned char rkey[128];\n    if (keylen <= 128) {\n        memcpy(rkey, key, keylen);\n        memset(rkey + keylen, 0, 128 - keylen);\n    } else {\n        SHA512().Write(key, keylen).Finalize(rkey);\n        memset(rkey + 64, 0, 64);\n    }\n\n    for (int n = 0; n < 128; n++)\n        rkey[n] ^= 0x5c;\n    outer.Write(rkey, 128);\n\n    for (int n = 0; n < 128; n++)\n        rkey[n] ^= 0x5c ^ 0x36;\n    inner.Write(rkey, 128);\n}\n\nvoid HMAC_SHA512::Finalize(unsigned char hash[OUTPUT_SIZE])\n{\n    unsigned char temp[64];\n    inner.Finalize(temp);\n    outer.Write(temp, 64).Finalize(hash);\n}\n"
  },
  {
    "path": "src/http_request.cpp",
    "content": "/*\n * http_request.cpp\n *\n *  Created on: May 6, 2024\n *      Author: mad\n */\n\n#include <mmx/http_request.h>\n\n#include <vnx/vnx.h>\n\n#include <cstdlib>\n#include <stdexcept>\n\n\nnamespace mmx {\n\nvoid http_request_file(const std::string& url, const std::string& file_path, const std::string& options)\n{\n\tstd::string curl_path;\n\tvnx::read_config(\"curl.path\", curl_path);\n\n\tconst std::string cmd = curl_path + \"curl -s -m 100 \" + options + \" \\\"\" + url + \"\\\" -o \\\"\" + file_path + \"\\\"\";\n\n\tif(std::system(cmd.c_str())) {\n\t\tthrow std::runtime_error(\"curl request failed\");\n\t}\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/mmx.cpp",
    "content": "/*\n * mmx.cpp\n *\n *  Created on: Dec 21, 2021\n *      Author: mad\n */\n\n#include <mmx/NodeClient.hxx>\n#include <mmx/RouterClient.hxx>\n#include <mmx/WalletClient.hxx>\n#include <mmx/FarmerClient.hxx>\n#include <mmx/HarvesterClient.hxx>\n#include <mmx/Contract.hxx>\n#include <mmx/contract/TokenBase.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/secp256k1.hpp>\n#include <mmx/hash_t.hpp>\n#include <mmx/fixed128.hpp>\n#include <mmx/mnemonic.h>\n#include <mmx/utils.h>\n#include <mmx/vm/instr_t.h>\n#include <mmx/vm_interface.h>\n#include <mmx/ECDSA_Wallet.h>\n\n#include <vnx/vnx.h>\n#include <vnx/Proxy.h>\n#include <vnx/ProxyClient.hxx>\n#include <vnx/addons/HttpClient.h>\n#include <vnx/addons/HttpClientClient.hxx>\n\n#include <cmath>\n#include <filesystem>\n\n\nstd::unordered_map<mmx::addr_t, std::shared_ptr<const mmx::Contract>> contract_cache;\n\nstd::shared_ptr<const mmx::Contract> get_contract(mmx::NodeClient& node, const mmx::addr_t& address)\n{\n\tauto iter = contract_cache.find(address);\n\tif(iter == contract_cache.end()) {\n\t\titer = contract_cache.emplace(address, node.get_contract(address)).first;\n\t}\n\treturn iter->second;\n}\n\nstd::shared_ptr<const mmx::contract::TokenBase> get_token(mmx::NodeClient& node, const mmx::addr_t& address, bool fail = true)\n{\n\tauto token = std::dynamic_pointer_cast<const mmx::contract::TokenBase>(get_contract(node, address));\n\tif(!token && fail) {\n\t\tthrow std::logic_error(\"no such token: \" + address.to_string());\n\t}\n\treturn token;\n}\n\nvoid show_history(std::vector<mmx::tx_entry_t> history, mmx::NodeClient& node, std::shared_ptr<const mmx::ChainParams> params)\n{\n\tstd::reverse(history.begin(), history.end());\n\n\tfor(const auto& entry : history) {\n\t\tif(entry.is_pending) {\n\t\t\tstd::cout << \"[pending] \";\n\t\t} else {\n\t\t\tstd::cout << \"[\" << entry.height << \"] \";\n\t\t}\n\t\tstd::string arrow = \"->\";\n\t\tswitch(entry.type) {\n\t\t\tcase mmx::tx_type_e::SPEND:   std::cout << \"SPEND   - \"; arrow = \"<-\"; break;\n\t\t\tcase mmx::tx_type_e::TXFEE:   std::cout << \"TXFEE   - \"; arrow = \"<-\"; break;\n\t\t\tcase mmx::tx_type_e::RECEIVE: std::cout << \"RECEIVE + \"; break;\n\t\t\tcase mmx::tx_type_e::REWARD:  std::cout << \"REWARD  + \"; break;\n\t\t\tcase mmx::tx_type_e::VDF_REWARD:  std::cout << \"VDF_REWARD + \"; break;\n\t\t\tcase mmx::tx_type_e::PROJECT_REWARD:  std::cout << \"PROJECT_REWARD + \"; break;\n\t\t\tdefault: std::cout << \"????    \"; break;\n\t\t}\n\t\tconst auto currency = entry.contract;\n\t\tconst auto contract = get_contract(node, currency);\n\t\tif(auto exe = std::dynamic_pointer_cast<const mmx::contract::Executable>(contract)) {\n\t\t\tif(exe->binary == params->nft_binary) {\n\t\t\t\tstd::cout << currency << \" \" << arrow << \" \" << entry.address << \" (\" << entry.txid << \")\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tconst auto token = std::dynamic_pointer_cast<const mmx::contract::TokenBase>(contract);\n\t\tconst auto decimals = token ? token->decimals : currency == mmx::addr_t() ? params->decimals : 0;\n\t\tconst auto symbol = token ? token->symbol : currency == mmx::addr_t() ? std::string(\"MMX\") : std::string(\"???\");\n\t\tstd::cout << mmx::to_value(entry.amount, decimals) << \" \" << symbol\n\t\t\t\t<< \" (\" << entry.amount << \") \" << arrow << \" \" << entry.address << \" TX(\" << entry.txid << \")\";\n\t\tif(entry.memo) {\n\t\t\tstd::cout << \" M(\" << *entry.memo << \")\";\n\t\t}\n\t\tstd::cout << std::endl;\n\t}\n}\n\nvoid show_history_csv(std::vector<mmx::tx_entry_t> history, mmx::NodeClient& node, std::shared_ptr<const mmx::ChainParams> params)\n{\n\tstd::reverse(history.begin(), history.end());\n\n\tstd::cout << \"Height,Type,Amount,Symbol,AmountRaw,InOut,Address,TX,UnixTS,DateTime,Memo\" << std::endl;\n\n\tfor(const auto& entry : history) {\n\t\tconst auto currency = entry.contract;\n\t\tconst auto contract = get_contract(node, currency);\n\t\tif(auto exe = std::dynamic_pointer_cast<const mmx::contract::Executable>(contract)) {\n\t\t\tif(exe->binary == params->nft_binary) {\n\t\t\t\tcontinue;\t// ignore NFTs\n\t\t\t}\n\t\t}\n\t\tconst auto token = std::dynamic_pointer_cast<const mmx::contract::TokenBase>(contract);\n\n\t\tint decimals = 0;\n\t\tstd::string symbol;\n\t\tif(token) {\n\t\t\tsymbol = token->symbol;\n\t\t\tdecimals = token->decimals;\n\t\t} else {\n\t\t\tif(currency == mmx::addr_t()) {\n\t\t\t\tsymbol = \"MMX\";\n\t\t\t\tdecimals = params->decimals;\n\t\t\t} else {\n\t\t\t\tcontinue;\t// ignore non-tokens\n\t\t\t}\n\t\t}\n\n\t\tstd::string in_out = \"IN\";\n\t\tswitch(entry.type) {\n\t\t\tcase mmx::tx_type_e::SPEND:\n\t\t\tcase mmx::tx_type_e::TXFEE:   in_out = \"OUT\"; break;\n\t\t\tdefault: break;\n\t\t}\n\n\t\tif(entry.is_pending) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tstd::cout << entry.height;\n\t\t}\n\t\tstd::cout << \",\" << entry.type.to_string_value() << \",\\\"\" << mmx::to_value(entry.amount, decimals) << \"\\\"\"\n\t\t\t\t<< \",\" << symbol << \",\" << entry.amount << \",\" << in_out << \",\" << entry.address << \",\" << entry.txid\n\t\t\t\t<< \",\" << entry.time_stamp / 1000 << \",\" << vnx::get_date_string_ex(\"%Y-%m-%dT%H:%M\", false, entry.time_stamp / 1000);\n\n\t\tstd::cout << \",\\\"\" << (entry.memo ? vnx::string_subs(*entry.memo, \"\\\"\", \"\\\"\\\"\") : \"\") << \"\\\"\";\n\t\tstd::cout << std::endl;\n\t}\n}\n\nvoid print_tx(std::shared_ptr<const mmx::Transaction> tx, mmx::NodeClient& node, std::shared_ptr<const mmx::ChainParams> params)\n{\n\tstd::cout << \"TX ID: \" << tx->id << std::endl;\n\tstd::cout << \"Note: \" << vnx::to_string_value(tx->note) << std::endl;\n\tstd::cout << \"Network: \" << tx->network << std::endl;\n\tstd::cout << \"Expires: at height \" << tx->expires << std::endl;\n\tstd::cout << \"Fee Ratio: \" << tx->fee_ratio / 1024. << std::endl;\n\tstd::cout << \"Max Fee Amount: \" << mmx::to_value(tx->max_fee_amount, params) << \" MMX\" << std::endl;\n\tstd::cout << \"Sender: \" << vnx::to_string_value(tx->sender) << std::endl;\n\t{\n\t\tint i = 0;\n\t\tfor(const auto& in : tx->inputs) {\n\t\t\tconst auto token = get_token(node, in.contract);\n\t\t\tconst auto decimals = token ? token->decimals : in.contract == mmx::addr_t() ? params->decimals : 0;\n\t\t\tconst auto symbol = token ? token->symbol : in.contract == mmx::addr_t() ? std::string(\"MMX\") : std::string(\"???\");\n\t\t\tstd::cout << \"Input[\" << i++ << \"]: \" << mmx::to_value(in.amount, decimals) << \" \" << symbol << \" [\" << in.contract << \"] from \" << in.address << std::endl;\n\t\t\tif(in.memo) {\n\t\t\t\tstd::cout << \"  Memo: \" << vnx::to_string(in.memo) << std::endl;\n\t\t\t}\n\t\t}\n\t}\n\t{\n\t\tint i = 0;\n\t\tfor(const auto& out : tx->outputs) {\n\t\t\tconst auto token = get_token(node, out.contract);\n\t\t\tconst auto decimals = token ? token->decimals : out.contract == mmx::addr_t() ? params->decimals : 0;\n\t\t\tconst auto symbol = token ? token->symbol : out.contract == mmx::addr_t() ? std::string(\"MMX\") : std::string(\"???\");\n\t\t\tstd::cout << \"Output[\" << i++ << \"]: \" << mmx::to_value(out.amount, decimals) << \" \" << symbol << \" [\" << out.contract << \"] to \" << out.address << std::endl;\n\t\t\tif(out.memo) {\n\t\t\t\tstd::cout << \"  Memo: \" << vnx::to_string(out.memo) << std::endl;\n\t\t\t}\n\t\t}\n\t}\n\t{\n\t\tint i = 0;\n\t\tfor(const auto& op : tx->execute) {\n\t\t\tstd::cout << \"Operation[\" << i++ << \"]: \";\n\t\t\tconst auto exec = std::dynamic_pointer_cast<const mmx::operation::Execute>(op);\n\t\t\tconst auto deposit = std::dynamic_pointer_cast<const mmx::operation::Deposit>(op);\n\t\t\tif(deposit) {\n\t\t\t\tstd::cout << \"Deposit via \" << deposit->method << \"()\" << std::endl;\n\t\t\t} else if(exec) {\n\t\t\t\tstd::cout << \"Execute \" << exec->method << \"()\" << std::endl;\n\t\t\t} else {\n\t\t\t\tstd::cout << \"null\" << std::endl;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif(deposit) {\n\t\t\t\tconst auto token = get_token(node, deposit->currency);\n\t\t\t\tconst auto decimals = token ? token->decimals : deposit->currency == mmx::addr_t() ? params->decimals : 0;\n\t\t\t\tconst auto symbol = token ? token->symbol : deposit->currency == mmx::addr_t() ? std::string(\"MMX\") : std::string(\"???\");\n\t\t\t\tstd::cout << \"  Amount: \" << mmx::to_value(deposit->amount, decimals) << \" \" << symbol << \" [\" << deposit->currency << \"]\" << std::endl;\n\t\t\t}\n\t\t\tstd::cout << \"  Contract: \" << (op->address != mmx::addr_t() ? op->address.to_string() : std::string(\"<deployed>\")) << std::endl;\n\t\t\tstd::cout << \"  User: \" << vnx::to_string(exec->user) << std::endl;\n\t\t\tint k = 0;\n\t\t\tfor(const auto& arg : exec->args) {\n\t\t\t\tstd::cout << \"  Argument[\" << k++ << \"]: \" << vnx::to_string(arg) << std::endl;\n\t\t\t}\n\t\t}\n\t}\n\tif(auto contract = tx->deploy) {\n\t\tstd::cout << \"Deploy: (see below)\" << std::endl;\n\t\tvnx::PrettyPrinter print(std::cout);\n\t\tvnx::accept(print, contract);\n\t\tstd::cout << std::endl;\n\t}\n}\n\nbool accept_prompt()\n{\n\tstd::cout << \"Accept (y): \";\n\tstd::string input;\n\tstd::getline(std::cin, input);\n\tif(input == \"y\") {\n\t\treturn true;\n\t}\n\tstd::cout << \"Aborted\" << std::endl;\n\treturn false;\n}\n\n\nint main(int argc, char** argv)\n{\n\tmmx::secp256k1_init();\n\n\tstd::string mmx_home;\n\tif(auto path = ::getenv(\"MMX_HOME\")) {\n\t\tmmx_home = path;\n\t} else if(auto path = ::getenv(\"HOME\")) {\n\t\tmmx_home = path;\n\t\tmmx_home += \"/.mmx/\";\n\t}\n\n\tstd::map<std::string, std::string> options;\n\toptions[\"n\"] = \"node\";\n\toptions[\"f\"] = \"file\";\n\toptions[\"j\"] = \"index\";\n\toptions[\"k\"] = \"offset\";\n\toptions[\"a\"] = \"amount\";\n\toptions[\"b\"] = \"ask-amount\";\n\toptions[\"m\"] = \"memo\";\n\toptions[\"s\"] = \"source\";\n\toptions[\"t\"] = \"target\";\n\toptions[\"x\"] = \"contract\";\n\toptions[\"z\"] = \"ask-currency\";\n\toptions[\"y\"] = \"yes\";\n\toptions[\"r\"] = \"fee-ratio\";\n\toptions[\"l\"] = \"gas-limit\";\n\toptions[\"N\"] = \"limit\";\n\toptions[\"v\"] = \"verbose\";\n\toptions[\"o\"] = \"output\";\n\toptions[\"node\"] = \"address\";\n\toptions[\"file\"] = \"path\";\n\toptions[\"index\"] = \"0..?\";\n\toptions[\"offset\"] = \"0..?\";\n\toptions[\"amount\"] = \"123.456\";\n\toptions[\"source\"] = \"address\";\n\toptions[\"target\"] = \"address\";\n\toptions[\"contract\"] = \"address\";\n\toptions[\"ask-currency\"] = \"address\";\n\toptions[\"fee-ratio\"] = \"1\";\n\toptions[\"gas-limit\"] = \"MMX\";\n\toptions[\"min-amount\"] = \"0..1\";\n\toptions[\"user\"] = \"mmx-admin\";\n\toptions[\"passwd\"] = \"PASSWD\";\n\toptions[\"mnemonic\"] = \"words\";\n\toptions[\"output\"] = \"file name\";\n\toptions[\"nonce\"] = \"value > 0\";\n\n\tvnx::write_config(\"log_level\", 2);\n\n\tvnx::init(\"mmx\", argc, argv, options);\n\n\tstd::string module;\n\tstd::string command;\n\tstd::string file_name;\n\tstd::string source_addr;\n\tstd::string target_addr;\n\tstd::string contract_addr;\n\tstd::string ask_currency_addr;\n\tstd::string user = \"mmx-admin\";\n\tstd::string passwd;\n\tvnx::optional<std::string> memo;\n\tvnx::optional<std::string> output;\n\tvnx::optional<uint64_t> nonce;\n\tint64_t index = 0;\n\tint64_t offset = 0;\n\tint32_t limit = -1;\n\tmmx::fixed128 amount;\n\tmmx::fixed128 ask_amount;\n\tdouble fee_ratio = 1;\n\tdouble gas_limit = 5;\n\tdouble min_amount = 0.95;\n\tint verbose = 0;\n\tbool pre_accept = false;\n\tvnx::read_config(\"$1\", module);\n\tvnx::read_config(\"$2\", command);\n\tvnx::read_config(\"yes\", pre_accept);\n\tvnx::read_config(\"file\", file_name);\n\tvnx::read_config(\"index\", index);\n\tvnx::read_config(\"offset\", offset);\n\tconst auto have_amount = vnx::read_config(\"amount\", amount);\n\tconst auto have_ask_amount = vnx::read_config(\"ask-amount\", ask_amount);\n\tvnx::read_config(\"source\", source_addr);\n\tvnx::read_config(\"target\", target_addr);\n\tvnx::read_config(\"contract\", contract_addr);\n\tvnx::read_config(\"ask-currency\", ask_currency_addr);\n\tvnx::read_config(\"fee-ratio\", fee_ratio);\n\tvnx::read_config(\"gas-limit\", gas_limit);\n\tvnx::read_config(\"min-amount\", min_amount);\n\tvnx::read_config(\"user\", user);\n\tvnx::read_config(\"passwd\", passwd);\n\tvnx::read_config(\"memo\", memo);\n\tvnx::read_config(\"limit\", limit);\n\tvnx::read_config(\"verbose\", verbose);\n\tvnx::read_config(\"output\", output);\n\tvnx::read_config(\"nonce\", nonce);\n\n\tvnx::write_config(\"Proxy.no_retry\", true);\t\t// exit on connect fail\n\n\tbool did_fail = false;\n\tauto params = mmx::get_params();\n\t{\n\t\tauto token = mmx::contract::TokenBase::create();\n\t\ttoken->decimals = params->decimals;\n\t\ttoken->symbol = \"MMX\";\n\t\tcontract_cache[mmx::addr_t()] = token;\n\t}\n\tif(passwd.empty()) {\n\t\tstd::ifstream stream(mmx_home + \"PASSWD\");\n\t\tstream >> passwd;\n\t}\n\n\tmmx::spend_options_t spend_options;\n\tspend_options.fee_ratio = fee_ratio * 1024;\n\tspend_options.gas_limit = mmx::to_amount(gas_limit, params);\n\tspend_options.memo = memo;\n\tspend_options.nonce = nonce;\n\tif(output) {\n\t\tspend_options.auto_send = false;\n\t\tspend_options.expire_at = -1;\n\t}\n\n\tmmx::NodeClient node(\"Node\");\n\t{\n\t\tvnx::Handle<vnx::addons::HttpClient> module = new vnx::addons::HttpClient(\"HttpClient\");\n\t\tmodule->connection_timeout_ms = 5000;\n\t\tmodule.start_detached();\n\t}\n\tvnx::addons::HttpClientClient http(\"HttpClient\");\n\n\tmmx::addr_t source;\n\tmmx::addr_t target;\n\tmmx::addr_t contract;\n\tmmx::addr_t ask_currency;\n\ttry {\n\t\tif(!source_addr.empty()) {\n\t\t\tsource.from_string(source_addr);\n\t\t}\n\t} catch(std::exception& ex) {\n\t\tvnx::log_error() << \"Invalid address: \" << ex.what();\n\t\tgoto failed;\n\t}\n\ttry {\n\t\tif(!target_addr.empty()) {\n\t\t\ttarget.from_string(target_addr);\n\t\t}\n\t} catch(std::exception& ex) {\n\t\tvnx::log_error() << \"Invalid address: \" << ex.what();\n\t\tgoto failed;\n\t}\n\ttry {\n\t\tif(!contract_addr.empty()) {\n\t\t\tcontract.from_string(contract_addr);\n\t\t}\n\t} catch(std::exception& ex) {\n\t\tvnx::log_error() << \"Invalid address: \" << ex.what();\n\t\tgoto failed;\n\t}\n\ttry {\n\t\tif(!ask_currency_addr.empty()) {\n\t\t\task_currency.from_string(ask_currency_addr);\n\t\t}\n\t} catch(std::exception& ex) {\n\t\tvnx::log_error() << \"Invalid address: \" << ex.what();\n\t\tgoto failed;\n\t}\n\n\ttry {\n\t\tif(module == \"wallet\")\n\t\t{\n\t\t\tstd::string node_url = \":11335\";\n\t\t\tvnx::read_config(\"node\", node_url);\n\n\t\t\tmmx::WalletClient wallet(\"Wallet\");\n\n\t\t\tstd::shared_ptr<const mmx::Transaction> tx;\n\n\t\t\tif(command != \"create\") {\n\t\t\t\tvnx::Handle<vnx::Proxy> proxy = new vnx::Proxy(\"Proxy\", vnx::Endpoint::from_url(node_url));\n\t\t\t\tproxy->forward_list = {\"Wallet\", \"Node\"};\n\t\t\t\tproxy.start_detached();\n\t\t\t\t{\n\t\t\t\t\tvnx::ProxyClient client(proxy.get_name());\n\t\t\t\t\tclient.login(user, passwd);\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tparams = node.get_params();\n\t\t\t\t} catch(...) {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t\tif(index == 0) {\n\t\t\t\t\tconst auto accounts = wallet.get_all_accounts();\n\t\t\t\t\tif(!accounts.empty()) {\n\t\t\t\t\t\tindex = accounts[0].account;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(command == \"show\")\n\t\t\t{\n\t\t\t\tstd::string subject;\n\t\t\t\tvnx::read_config(\"$3\", subject);\n\n\t\t\t\tconst auto config = wallet.get_account(index);\n\t\t\t\tif(config.with_passphrase) {\n\t\t\t\t\tstd::cout << \"Locked: \" << (wallet.is_locked(index) ? \"Yes\" : \"No\") << std::endl;\n\t\t\t\t}\n\t\t\t\tif(subject.empty() || subject == \"balance\")\n\t\t\t\t{\n\t\t\t\t\tbool is_empty = true;\n\t\t\t\t\tstd::vector<mmx::addr_t> nfts;\n\t\t\t\t\tfor(const auto& entry : wallet.get_balances(index))\n\t\t\t\t\t{\n\t\t\t\t\t\tconst auto& balance = entry.second;\n\t\t\t\t\t\tconst auto contract = get_contract(node, entry.first);\n\t\t\t\t\t\tif(auto exec = std::dynamic_pointer_cast<const mmx::contract::Executable>(contract)) {\n\t\t\t\t\t\t\tif(exec->binary == params->nft_binary) {\n\t\t\t\t\t\t\t\tnfts.push_back(entry.first);\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(auto token = std::dynamic_pointer_cast<const mmx::contract::TokenBase>(contract)) {\n\t\t\t\t\t\t\tstd::cout << \"Balance: \" << mmx::to_value(balance.total, token->decimals)\n\t\t\t\t\t\t\t\t\t<< \" \" << token->symbol << (balance.is_validated ? \"\" : \"?\")\n\t\t\t\t\t\t\t\t\t<< \" (Spendable: \" << mmx::to_value(balance.spendable, token->decimals)\n\t\t\t\t\t\t\t\t\t<< \" \" << token->symbol << (balance.is_validated ? \"\" : \"?\") << \")\";\n\t\t\t\t\t\t\tif(entry.first != mmx::addr_t()) {\n\t\t\t\t\t\t\t\tstd::cout << \" [\" << entry.first << \"]\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstd::cout << std::endl;\n\t\t\t\t\t\t\tis_empty = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(is_empty) {\n\t\t\t\t\t\tstd::cout << \"Balance: 0 MMX\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\tfor(const auto& addr : nfts) {\n\t\t\t\t\t\tstd::cout << \"NFT: \" << addr << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(subject.empty() || subject == \"contracts\" || subject == \"offers\")\n\t\t\t\t{\n\t\t\t\t\tfor(const auto& entry : wallet.get_contracts(index))\n\t\t\t\t\t{\n\t\t\t\t\t\tconst auto& address = entry.first;\n\t\t\t\t\t\tconst auto& contract = entry.second;\n\t\t\t\t\t\tvnx::optional<mmx::offer_data_t> offer;\n\t\t\t\t\t\tif(auto exec = std::dynamic_pointer_cast<const mmx::contract::Executable>(contract)) {\n\t\t\t\t\t\t\tif(exec->binary == params->offer_binary) {\n\t\t\t\t\t\t\t\toffer = node.get_offer(address);\n\t\t\t\t\t\t\t\tif(subject.empty() && offer && !offer->is_open()) {\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if(subject == \"offers\") {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if(subject == \"offers\") {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstd::cout << \"Contract: \" << address << \" (\" << contract->get_type_name();\n\n\t\t\t\t\t\tif(auto token = std::dynamic_pointer_cast<const mmx::contract::TokenBase>(contract)) {\n\t\t\t\t\t\t\tif(!token->symbol.empty()) {\n\t\t\t\t\t\t\t\tstd::cout << \", \" << token->symbol;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(!token->name.empty()) {\n\t\t\t\t\t\t\t\tstd::cout << \", \" << token->name;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(auto exec = std::dynamic_pointer_cast<const mmx::contract::Executable>(contract)) {\n\t\t\t\t\t\t\tif(offer) {\n\t\t\t\t\t\t\t\tif(offer->is_open()) {\n\t\t\t\t\t\t\t\t\tstd::cout << \", open offer\";\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tstd::cout << \", closed offer\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstd::cout << \")\" << std::endl;\n\n\t\t\t\t\t\tfor(const auto& entry : wallet.get_total_balances({address}))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst auto& balance = entry.second;\n\t\t\t\t\t\t\tif(auto token = get_token(node, entry.first, false)) {\n\t\t\t\t\t\t\t\tstd::cout << \"  Balance: \" << to_value(balance.total, token->decimals) << \" \" << token->symbol\n\t\t\t\t\t\t\t\t\t\t<< (balance.is_validated ? \"\" : \"?\") << \" (\" << balance.total << \")\";\n\t\t\t\t\t\t\t\tif(entry.first != mmx::addr_t()) {\n\t\t\t\t\t\t\t\t\tstd::cout << \" [\" << entry.first << \"]\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstd::cout << std::endl;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(offer && (offer->is_open() || subject == \"offers\")) {\n\t\t\t\t\t\t\tif(auto bid_token = get_token(node, offer->bid_currency, false)) {\n\t\t\t\t\t\t\t\tif(auto ask_token = get_token(node, offer->ask_currency, false)) {\n\t\t\t\t\t\t\t\t\tstd::cout << \"  Price: \" << offer->price\n\t\t\t\t\t\t\t\t\t\t<< \" \" << ask_token->symbol << \" / \" << bid_token->symbol << std::endl;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor(int i = 0; i < 1; ++i) {\n\t\t\t\t\tstd::cout << \"Address[\" << i << \"]: \" << wallet.get_address(index, i) << std::endl;\n\t\t\t\t}\n\t\t\t\tif(subject.empty()) {\n\t\t\t\t\tstd::cout << \"Help: mmx wallet show [balance | contracts | offers]\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"accounts\")\n\t\t\t{\n\t\t\t\tfor(const auto& entry : wallet.get_all_accounts()) {\n\t\t\t\t\tstd::cout << \"[\" << entry.account << \"] \" << vnx::to_string_value(entry.address) << \": \"\n\t\t\t\t\t\t\t<< \"name = '\" << entry.name << \"', index = \" << entry.index\n\t\t\t\t\t\t\t<< \", passphrase = \" << (entry.with_passphrase ? \"yes\" : \"no\")\n\t\t\t\t\t\t\t<< \", finger_print = \" << entry.finger_print\n\t\t\t\t\t\t\t<< \", num_addresses = \" << entry.num_addresses << \", key_file = \" << entry.key_file << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"keys\")\n\t\t\t{\n\t\t\t\tconst auto keys = wallet.get_farmer_keys(index);\n\t\t\t\tstd::cout << \"Farmer Public Key: \" << keys.second << std::endl;\n\t\t\t}\n\t\t\telse if(command == \"get\")\n\t\t\t{\n\t\t\t\tstd::string subject;\n\t\t\t\tvnx::read_config(\"$3\", subject);\n\n\t\t\t\tif(subject == \"address\")\n\t\t\t\t{\n\t\t\t\t\tint64_t offset = 0;\n\t\t\t\t\tvnx::read_config(\"$4\", offset);\n\n\t\t\t\t\tstd::cout << wallet.get_address(index, offset) << std::endl;\n\t\t\t\t}\n\t\t\t\telse if(subject == \"amount\")\n\t\t\t\t{\n\t\t\t\t\tstd::cout << wallet.get_balance(index, contract).total << std::endl;\n\t\t\t\t}\n\t\t\t\telse if(subject == \"balance\")\n\t\t\t\t{\n\t\t\t\t\tconst auto token = get_token(node, contract);\n\t\t\t\t\tstd::cout << mmx::to_value(wallet.get_balance(index, contract).total, token ? token->decimals : params->decimals) << std::endl;\n\t\t\t\t}\n\t\t\t\telse if(subject == \"contracts\")\n\t\t\t\t{\n\t\t\t\t\tfor(const auto& entry : wallet.get_contracts(index)) {\n\t\t\t\t\t\tstd::cout << entry.first << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(subject == \"seed\")\n\t\t\t\t{\n\t\t\t\t\tstd::cout << mmx::mnemonic::words_to_string(wallet.get_mnemonic_seed(index)) << std::endl;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstd::cerr << \"Help: mmx wallet get [address | balance | amount | contracts | seed]\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"send\")\n\t\t\t{\n\t\t\t\tconst auto token = get_token(node, contract);\n\n\t\t\t\tconst auto mojo = mmx::to_amount(amount, token->decimals);\n\t\t\t\tif(!mojo) {\n\t\t\t\t\tvnx::log_error() << \"Invalid amount: \" << amount << \" (-a | --amount)\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tif(target == mmx::addr_t()) {\n\t\t\t\t\tvnx::log_error() << \"Missing destination address argument: -t | --target\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t}\n\t\t\t\ttx = wallet.send(index, mojo, target, contract, spend_options);\n\t\t\t\tstd::cout << \"Sent \" << mmx::to_value(mojo, token->decimals) << \" \" << token->symbol << \" (\" << mojo << \") to \" << target << std::endl;\n\t\t\t}\n\t\t\telse if(command == \"send_from\")\n\t\t\t{\n\t\t\t\tconst auto token = get_token(node, contract);\n\n\t\t\t\tconst auto mojo = mmx::to_amount(amount, token->decimals);\n\t\t\t\tif(!mojo) {\n\t\t\t\t\tvnx::log_error() << \"Invalid amount: \" << amount << \" (-a | --amount)\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tif(source == mmx::addr_t()) {\n\t\t\t\t\tvnx::log_error() << \"Missing source address argument: -s | --source\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tif(target == mmx::addr_t()) {\n\t\t\t\t\tvnx::log_error() << \"Missing destination address argument: -t | --target\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t}\n\t\t\t\ttx = wallet.send_from(index, mojo, target, source, contract, spend_options);\n\t\t\t\tstd::cout << \"Sent \" << mmx::to_value(mojo, token->decimals) << \" \" << token->symbol << \" (\" << mojo << \") to \" << target << std::endl;\n\t\t\t}\n\t\t\telse if(command == \"transfer\")\n\t\t\t{\n\t\t\t\tif(target == mmx::addr_t()) {\n\t\t\t\t\tvnx::log_error() << \"Missing destination address argument: -t | --target\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t}\n\t\t\t\ttx = wallet.send(index, 1, target, contract, spend_options);\n\t\t\t\tstd::cout << \"Sent \" << contract << \" to \" << target << std::endl;\n\t\t\t}\n\t\t\telse if(command == \"mint\")\n\t\t\t{\n\t\t\t\tconst auto token = get_token(node, contract);\n\n\t\t\t\tconst auto mojo = mmx::to_amount(amount, token->decimals);\n\t\t\t\tif(!mojo) {\n\t\t\t\t\tvnx::log_error() << \"Invalid amount: \" << amount << \" (-a | --amount)\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tif(target == mmx::addr_t()) {\n\t\t\t\t\tvnx::log_error() << \"Missing destination address argument: -t | --target\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tif(!spend_options.user) {\n\t\t\t\t\tspend_options.user = to_addr(node.read_storage_field(contract, \"owner\").first);\n\t\t\t\t}\n\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t}\n\t\t\t\ttx = wallet.execute(index, contract, \"mint_to\",\n\t\t\t\t\t\t{vnx::Variant(target.to_string()), mojo.to_var_arg(), vnx::Variant(memo)}, nullptr, spend_options);\n\t\t\t\tstd::cout << \"Minted \" << mmx::to_value(mojo, token->decimals) << \" (\" << mojo << \") \" << token->symbol << \" to \" << target << std::endl;\n\t\t\t}\n\t\t\telse if(command == \"deploy\")\n\t\t\t{\n\t\t\t\tstd::string file_path;\n\t\t\t\tstd::vector<vnx::Variant> init_args;\n\t\t\t\tvnx::read_config(\"$3\", file_path);\n\t\t\t\tvnx::read_config(\"$4\", init_args);\n\n\t\t\t\tstd::shared_ptr<mmx::Contract> payload;\n\t\t\t\tif(contract_addr.empty()) {\n\t\t\t\t\tpayload = vnx::read_from_file<mmx::Contract>(file_path);\n\t\t\t\t\tif(!payload) {\n\t\t\t\t\t\tvnx::log_error() << \"Failed to read contract from file: \" << file_path;\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tauto exec = mmx::contract::Executable::create();\n\t\t\t\t\texec->binary = mmx::addr_t(contract_addr);\n\t\t\t\t\texec->init_method = file_path;\n\t\t\t\t\texec->init_args = init_args;\n\t\t\t\t\tpayload = exec;\n\t\t\t\t}\n\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t}\n\t\t\t\ttx = wallet.deploy(index, payload, spend_options);\n\t\t\t\tstd::cout << \"Deployed \" << payload->get_type_name() << \" as [\" << mmx::addr_t(tx->id) << \"]\" << std::endl;\n\t\t\t}\n\t\t\telse if(command == \"exec\" || command == \"deposit\")\n\t\t\t{\n\t\t\t\tstd::string method;\n\t\t\t\tstd::vector<vnx::Variant> args;\n\t\t\t\tvnx::read_config(\"$3\", method);\n\t\t\t\t{\n\t\t\t\t\tvnx::Variant tmp;\n\t\t\t\t\tfor(int i = 4; vnx::read_config(\"$\" + std::to_string(i), tmp); ++i) {\n\t\t\t\t\t\targs.push_back(tmp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(auto exec = std::dynamic_pointer_cast<const mmx::contract::Executable>(node.get_contract(contract))) {\n\t\t\t\t\tif(auto bin = std::dynamic_pointer_cast<const mmx::contract::Binary>(node.get_contract(exec->binary))) {\n\t\t\t\t\t\tif(auto meth = bin->find_method(method)) {\n\t\t\t\t\t\t\targs.resize(meth->args.size());\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(!spend_options.user && offset >= 0) {\n\t\t\t\t\tspend_options.user = wallet.get_address(index, offset);\n\t\t\t\t}\n\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t}\n\t\t\t\tif(command == \"exec\") {\n\t\t\t\t\ttx = wallet.execute(index, contract, method, args, nullptr, spend_options);\n\t\t\t\t\tstd::cout << \"Executed \" << method << \"() with \";\n\t\t\t\t} else {\n\t\t\t\t\tif(method.empty()) {\n\t\t\t\t\t\tmethod = \"deposit\";\n\t\t\t\t\t}\n\t\t\t\t\tconst auto token = get_token(node, contract);\n\t\t\t\t\tconst auto mojo = mmx::to_amount(amount, token->decimals);\n\t\t\t\t\ttx = wallet.deposit(index, target, method, args, mojo, contract, spend_options);\n\t\t\t\t\tstd::cout << \"Deposited \" << mmx::to_value(mojo, token->decimals) << \" \" << token->symbol << \" via \" << method << \"() with \";\n\t\t\t\t}\n\t\t\t\tvnx::PrettyPrinter printer(std::cout);\n\t\t\t\tvnx::accept(printer, args);\n\t\t\t\tstd::cout << std::endl;\n\t\t\t}\n\t\t\telse if(command == \"offer\")\n\t\t\t{\n\t\t\t\tstd::string subject;\n\t\t\t\tif(!vnx::read_config(\"$3\", subject))\n\t\t\t\t{\n\t\t\t\t\tconst auto bid = contract;\n\t\t\t\t\tconst auto ask = ask_currency;\n\t\t\t\t\tif(bid == ask) {\n\t\t\t\t\t\tvnx::log_error() << \"Ask == Bid!\";\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t\tconst auto bid_token = get_token(node, bid);\n\t\t\t\t\tconst auto ask_token = get_token(node, ask);\n\t\t\t\t\tconst auto bid_symbol = bid_token->symbol;\n\n\t\t\t\t\tconst uint64_t bid_value = mmx::to_amount(amount, bid_token->decimals);\n\t\t\t\t\tconst uint64_t ask_value = mmx::to_amount(ask_amount, ask_token->decimals);\n\t\t\t\t\tif(bid_value == 0 || ask_value == 0) {\n\t\t\t\t\t\tvnx::log_error() << \"Invalid amount! (-a | -b)\";\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << \"Offering \" << amount << \" \" << bid_token->symbol\n\t\t\t\t\t\t\t<< \" for \" << ask_amount << \" \" << ask_token->symbol << std::endl;\n\n\t\t\t\t\ttx = wallet.make_offer(index, offset, bid_value, bid, ask_value, ask, spend_options);\n\t\t\t\t\tif(tx) {\n\t\t\t\t\t\tstd::cout << \"Contract: \" << mmx::addr_t(tx->id) << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(subject == \"cancel\") {\n\t\t\t\t\tmmx::addr_t address;\n\t\t\t\t\tvnx::read_config(\"$4\", address);\n\n\t\t\t\t\tauto offer = std::dynamic_pointer_cast<const mmx::contract::Executable>(node.get_contract(address));\n\t\t\t\t\tif(!offer || offer->binary != params->offer_binary) {\n\t\t\t\t\t\tvnx::log_error() << \"No such offer: \" << address; goto failed;\n\t\t\t\t\t}\n\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t}\n\t\t\t\t\ttx = wallet.cancel_offer(index, address, spend_options);\n\t\t\t\t}\n\t\t\t\telse if(subject == \"withdraw\")\n\t\t\t\t{\n\t\t\t\t\tmmx::addr_t address;\n\t\t\t\t\tvnx::read_config(\"$4\", address);\n\n\t\t\t\t\tauto offer = std::dynamic_pointer_cast<const mmx::contract::Executable>(node.get_contract(address));\n\t\t\t\t\tif(!offer || offer->binary != params->offer_binary) {\n\t\t\t\t\t\tvnx::log_error() << \"No such offer: \" << address; goto failed;\n\t\t\t\t\t}\n\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t}\n\t\t\t\t\ttx = wallet.offer_withdraw(index, address, spend_options);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstd::cerr << \"mmx wallet offer [cancel | withdraw]\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"trade\")\n\t\t\t{\n\t\t\t\tmmx::addr_t address;\n\t\t\t\tvnx::read_config(\"$3\", address);\n\n\t\t\t\tconst auto height = node.get_height();\n\t\t\t\tconst auto data = node.get_offer(address);\n\t\t\t\tconst auto bid_token = get_token(node, data.bid_currency);\n\t\t\t\tconst auto ask_token = get_token(node, data.ask_currency);\n\t\t\t\tconst uint64_t ask_amount = mmx::to_amount(amount, ask_token->decimals);\n\t\t\t\tconst uint64_t bid_amount = data.get_bid_amount(ask_amount);\n\n\t\t\t\tstd::cout << \"You send:    \"\n\t\t\t\t\t\t<< mmx::to_value(ask_amount, ask_token->decimals) << \" \" << ask_token->symbol << \" [\" << data.ask_currency << \"]\" << std::endl;\n\t\t\t\tstd::cout << \"You receive: \"\n\t\t\t\t\t\t<< mmx::to_value(bid_amount, bid_token->decimals) << \" \" << bid_token->symbol << \" [\" << data.bid_currency << \"]\" << std::endl;\n\n\t\t\t\tif(data.last_update > height || height - data.last_update < 100) {\n\t\t\t\t\tpre_accept = false;\n\t\t\t\t\tstd::cout << \"WARNING: Offer price has changed recently!\" << std::endl;\n\t\t\t\t}\n\t\t\t\tif(pre_accept || accept_prompt()) {\n\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t}\n\t\t\t\t\ttx = wallet.offer_trade(index, address, ask_amount, offset, data.inv_price, spend_options);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"accept\")\n\t\t\t{\n\t\t\t\tmmx::addr_t address;\n\t\t\t\tvnx::read_config(\"$3\", address);\n\n\t\t\t\tconst auto height = node.get_height();\n\t\t\t\tconst auto data = node.get_offer(address);\n\t\t\t\tconst auto bid_token = get_token(node, data.bid_currency);\n\t\t\t\tconst auto ask_token = get_token(node, data.ask_currency);\n\n\t\t\t\tstd::cout << \"You send:    \"\n\t\t\t\t\t\t<< mmx::to_value(data.ask_amount, ask_token->decimals) << \" \" << ask_token->symbol << \" [\" << data.ask_currency << \"]\" << std::endl;\n\t\t\t\tstd::cout << \"You receive: \"\n\t\t\t\t\t\t<< mmx::to_value(data.bid_balance, bid_token->decimals) << \" \" << bid_token->symbol << \" [\" << data.bid_currency << \"]\" << std::endl;\n\n\t\t\t\tif(data.last_update > height || height - data.last_update < 100) {\n\t\t\t\t\tpre_accept = false;\n\t\t\t\t\tstd::cout << \"WARNING: Offer price has changed recently!\" << std::endl;\n\t\t\t\t}\n\t\t\t\tif(pre_accept || accept_prompt()) {\n\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t}\n\t\t\t\t\ttx = wallet.accept_offer(index, address, offset, data.inv_price, spend_options);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"buy\" || command == \"sell\")\n\t\t\t{\n\t\t\t\tif(min_amount < 0 || min_amount > 1) {\n\t\t\t\t\tstd::cerr << \"Invalid min amount: \" << min_amount << \" (needs to be between 0 and 1, ie. between 0% and 100%)\" << std::endl;\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tconst auto i = (command == \"sell\" ? 0 : 1);\n\t\t\t\tconst auto k = (i + 1) % 2;\n\t\t\t\tconst auto info = node.get_swap_info(contract);\n\t\t\t\tconst auto token_i = get_token(node, info.tokens[i]);\n\t\t\t\tconst auto token_k = get_token(node, info.tokens[k]);\n\t\t\t\tconst auto deposit_amount = mmx::to_amount(amount, token_i->decimals);\n\t\t\t\tconst auto trade_estimate = node.get_swap_trade_estimate(contract, i, deposit_amount);\n\t\t\t\tconst auto expected_amount = trade_estimate[0];\n\n\t\t\t\tconst mmx::uint128 min_trade_amount = mmx::to_amount(expected_amount.to_double() * min_amount, 0);\n\n\t\t\t\tstd::cout << \"You send: \" << mmx::to_value(deposit_amount, token_i->decimals) << \" \" << token_i->symbol << std::endl;\n\t\t\t\tstd::cout << \"You receive at least:  \" << mmx::to_value(min_trade_amount, token_k->decimals) << \" \" << token_k->symbol << std::endl;\n\t\t\t\tstd::cout << \"You expect to receive: \" << mmx::to_value(expected_amount, token_k->decimals) << \" \" << token_k->symbol << \" (estimated)\" << std::endl;\n\t\t\t\tstd::cout << \"Fee:   \" << mmx::to_value(trade_estimate[1], token_k->decimals) << \" \" << token_k->symbol << std::endl;\n\t\t\t\tstd::cout << \"Price: \"\n\t\t\t\t\t\t<< (command == \"sell\" ? expected_amount.to_double() / deposit_amount.to_double() : deposit_amount.to_double() / expected_amount.to_double()) << \" \"\n\t\t\t\t\t\t<< (command == \"sell\" ? token_k : token_i)->symbol << \" / \" << (command == \"sell\" ? token_i : token_k)->symbol << std::endl;\n\n\t\t\t\tif(pre_accept || accept_prompt()) {\n\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t}\n\t\t\t\t\ttx = wallet.swap_trade(index, contract, deposit_amount, info.tokens[i], min_trade_amount, 20, spend_options);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"swap\")\n\t\t\t{\n\t\t\t\tstd::string action;\n\t\t\t\tvnx::read_config(\"$3\", action);\n\n\t\t\t\tif(action == \"add\")\n\t\t\t\t{\n\t\t\t\t\tconst auto usage = \"mmx wallet swap add -a <amount> -b <amount> -x <contract>\";\n\t\t\t\t\tstd::array<mmx::uint128, 2> add_amount = {};\n\t\t\t\t\tconst auto info = node.get_swap_info(contract);\n\t\t\t\t\tconst auto token_0 = get_token(node, info.tokens[0]);\n\t\t\t\t\tconst auto token_1 = get_token(node, info.tokens[1]);\n\n\t\t\t\t\tif(offset < 0 || size_t(offset) >= info.fee_rates.size()) {\n\t\t\t\t\t\tstd::cerr << \"invalid pool offset: \" << offset << std::endl;\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t\tif(have_amount) {\n\t\t\t\t\t\tadd_amount[0] = mmx::to_amount(amount, token_0->decimals);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(!have_ask_amount) {\n\t\t\t\t\t\t\tstd::cerr << usage << std::endl;\n\t\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(info.balance[1]) {\n\t\t\t\t\t\t\tadd_amount[0] = (uint256_t(mmx::to_amount(ask_amount, token_1->decimals)) * info.balance[0]) / info.balance[1];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(have_ask_amount) {\n\t\t\t\t\t\tadd_amount[1] = mmx::to_amount(ask_amount, token_1->decimals);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(!have_amount) {\n\t\t\t\t\t\t\tstd::cerr << usage << std::endl;\n\t\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(info.balance[0]) {\n\t\t\t\t\t\t\tadd_amount[1] = (uint256_t(mmx::to_amount(amount, token_0->decimals)) * info.balance[1]) / info.balance[0];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(add_amount[0]) {\n\t\t\t\t\t\tstd::cout << \"You deposit: \" << mmx::to_value(add_amount[0], token_0->decimals) << \" \" << token_0->symbol;\n\t\t\t\t\t\tif(!add_amount[1]) {\n\t\t\t\t\t\t\tstd::cout << \" (sell order)\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstd::cout << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\tif(add_amount[1]) {\n\t\t\t\t\t\tstd::cout << \"You deposit: \" << mmx::to_value(add_amount[1], token_1->decimals) << \" \" << token_1->symbol;\n\t\t\t\t\t\tif(!add_amount[0]) {\n\t\t\t\t\t\t\tstd::cout << \" (buy order)\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstd::cout << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << \"Pool Fee: \" << info.fee_rates[offset] * 100 << \" %\" << std::endl;\n\n\t\t\t\t\tif(!add_amount[0] && !add_amount[1]) {\n\t\t\t\t\t\tstd::cerr << usage << std::endl;\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t\tif(pre_accept || accept_prompt()) {\n\t\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttx = wallet.swap_add_liquid(index, contract, add_amount, offset, spend_options);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(action == \"remove\")\n\t\t\t\t{\n\t\t\t\t\tstd::array<mmx::uint128, 2> rem_amount = {};\n\t\t\t\t\tconst auto info = node.get_swap_info(contract);\n\t\t\t\t\tconst auto user_info = node.get_swap_user_info(contract, wallet.get_address(index, offset));\n\t\t\t\t\tconst auto token_0 = get_token(node, info.tokens[0]);\n\t\t\t\t\tconst auto token_1 = get_token(node, info.tokens[1]);\n\t\t\t\t\tif(have_amount) {\n\t\t\t\t\t\trem_amount[0] = mmx::to_amount(amount, token_0->decimals);\n\t\t\t\t\t}\n\t\t\t\t\tif(have_ask_amount) {\n\t\t\t\t\t\trem_amount[1] = mmx::to_amount(ask_amount, token_1->decimals);\n\t\t\t\t\t}\n\t\t\t\t\tif(!have_amount && !have_ask_amount) {\n\t\t\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\t\t\trem_amount[i] = user_info.balance[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\t\trem_amount[i] = std::min<uint128_t>(rem_amount[i], user_info.balance[i]);\n\t\t\t\t\t}\n\t\t\t\t\tif(!rem_amount[0] && !rem_amount[1]) {\n\t\t\t\t\t\tstd::cerr << \"Nothing to remove.\" << std::endl;\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\t\tconst auto token = i ? token_1 : token_0;\n\t\t\t\t\t\tif(rem_amount[i]) {\n\t\t\t\t\t\t\tstd::cout << \"You remove:  \" << mmx::to_value(rem_amount[i], token->decimals) << \" \" << token->symbol << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\t\tconst auto token = i ? token_1 : token_0;\n\t\t\t\t\t\tif(user_info.equivalent_liquidity[i]) {\n\t\t\t\t\t\t\tstd::cout << \"You receive: \" << mmx::to_value(user_info.equivalent_liquidity[i], token->decimals) << \" \" << token->symbol << \" (approximate)\" << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(pre_accept || accept_prompt()) {\n\t\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttx = wallet.swap_rem_liquid(index, contract, rem_amount, spend_options);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(action == \"payout\")\n\t\t\t\t{\n\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t}\n\t\t\t\t\tspend_options.user = wallet.get_address(index, offset);\n\n\t\t\t\t\ttx = wallet.execute(index, contract, \"payout\", {}, nullptr, spend_options);\n\t\t\t\t}\n\t\t\t\telse if(action == \"info\")\n\t\t\t\t{\n\t\t\t\t\tconst auto info = node.get_swap_info(contract);\n\t\t\t\t\tconst auto user_info = node.get_swap_user_info(contract, wallet.get_address(index, offset));\n\t\t\t\t\tconst auto token_0 = get_token(node, info.tokens[0]);\n\t\t\t\t\tconst auto token_1 = get_token(node, info.tokens[1]);\n\t\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\t\tconst auto token = i ? token_1 : token_0;\n\t\t\t\t\t\tstd::cout << \"Balance: \" << mmx::to_value(user_info.balance[i], token->decimals) << \" \" << token->symbol << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\t\tconst auto token = i ? token_1 : token_0;\n\t\t\t\t\t\tif(user_info.balance[i]) {\n\t\t\t\t\t\t\tstd::cout << \"Earned fees: \" << mmx::to_value(user_info.fees_earned[i], token->decimals) << \" \" << token->symbol << \" (approximate)\" << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << \"Unlock height: \" << user_info.unlock_height << std::endl;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstd::cerr << \"mmx wallet swap [info | add | remove | payout] [-a <amount>] [-b <amount>] -x <contract>\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"log\" || command == \"log_csv\")\n\t\t\t{\n\t\t\t\tmmx::query_filter_t filter;\n\t\t\t\tfilter.limit = limit;\n\t\t\t\tfilter.with_pending = true;\n\t\t\t\tvnx::read_config(\"$3\", filter.since);\n\n\t\t\t\tconst auto data = wallet.get_history(index, filter);\n\t\t\t\tif(command == \"log_csv\") {\n\t\t\t\t\tshow_history_csv(data, node, params);\n\t\t\t\t} else {\n\t\t\t\t\tshow_history(data, node, params);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"lock\")\n\t\t\t{\n\t\t\t\twallet.lock(index);\n\t\t\t}\n\t\t\telse if(command == \"unlock\")\n\t\t\t{\n\t\t\t\twallet.unlock(index, vnx::input_password(\"Passphrase: \"));\n\t\t\t}\n\t\t\telse if(command == \"create\")\n\t\t\t{\n\t\t\t\tif(file_name.empty()) {\n\t\t\t\t\tfile_name = \"wallet.dat\";\n\t\t\t\t}\n\t\t\t\tfile_name = mmx_home + file_name;\n\n\t\t\t\tif(vnx::File(file_name).exists()) {\n\t\t\t\t\tvnx::log_error() << \"Wallet file '\" << file_name << \"' already exists!\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tbool with_seed = false;\n\t\t\t\tbool with_mnemonic = false;\n\t\t\t\tbool with_passphrase = false;\n\t\t\t\tvnx::read_config(\"with-seed\", with_seed);\n\t\t\t\tvnx::read_config(\"with-mnemonic\", with_mnemonic);\n\t\t\t\tvnx::read_config(\"with-passphrase\", with_passphrase);\n\n\t\t\t\tmmx::KeyFile key;\n\t\t\t\tif(with_seed) {\n\t\t\t\t\tstd::string seed_str;\n\t\t\t\t\tstd::cout << \"Seed: \";\n\t\t\t\t\tstd::getline(std::cin, seed_str);\n\t\t\t\t\tif(seed_str.size() != 64) {\n\t\t\t\t\t\tthrow std::logic_error(\"invalid seed\");\n\t\t\t\t\t}\n\t\t\t\t\tkey.seed_value.from_string(seed_str);\n\t\t\t\t} else if(with_mnemonic) {\n\t\t\t\t\tstd::string seed_words;\n\t\t\t\t\tstd::cout << \"Mnemonic: \";\n\t\t\t\t\tstd::getline(std::cin, seed_words);\n\t\t\t\t\tkey.seed_value = mmx::mnemonic::words_to_seed(mmx::mnemonic::string_to_words(seed_words));\n\t\t\t\t} else {\n\t\t\t\t\tkey.seed_value = mmx::hash_t::secure_random();\n\t\t\t\t}\n\n\t\t\t\tvnx::optional<std::string> passphrase;\n\t\t\t\tif(with_passphrase) {\n\t\t\t\t\tpassphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\tconst auto check = vnx::input_password(\"Passphrase (again): \");\n\t\t\t\t\tif(check != *passphrase) {\n\t\t\t\t\t\tvnx::log_error() << \"Passphrase mismatch!\";\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tkey.finger_print = get_finger_print(key.seed_value, passphrase);\n\n\t\t\t\tvnx::write_to_file(file_name, key);\n\t\t\t\tstd::filesystem::permissions(file_name, std::filesystem::perms::owner_read | std::filesystem::perms::owner_write);\n\n\t\t\t\tstd::cout << \"Created wallet '\" << file_name << \"'\" << std::endl;\n\t\t\t\tstd::cout << \"  Mnemonic: \" << mmx::mnemonic::words_to_string(mmx::mnemonic::seed_to_words(key.seed_value)) << std::endl;\n\n\t\t\t\tmmx::account_t config;\n\t\t\t\tconfig.num_addresses = 1;\n\t\t\t\tconfig.finger_print = *key.finger_print;\n\t\t\t\tconfig.with_passphrase = with_passphrase;\n\n\t\t\t\tmmx::ECDSA_Wallet wallet(key.seed_value, config, params);\n\t\t\t\twallet.unlock(passphrase ? *passphrase : std::string());\n\t\t\t\tstd::cout << \"  Address: \" << wallet.get_address(0) << std::endl;\n\t\t\t}\n\t\t\telse if(command == \"new\")\n\t\t\t{\n\t\t\t\tbool with_mnemonic = false;\n\t\t\t\tbool with_passphrase = false;\n\t\t\t\tvnx::read_config(\"with-mnemonic\", with_mnemonic);\n\t\t\t\tvnx::read_config(\"with-passphrase\", with_passphrase);\n\n\t\t\t\tvnx::optional<std::string> passphrase;\n\t\t\t\tif(with_passphrase) {\n\t\t\t\t\tpassphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\tconst auto check = vnx::input_password(\"Passphrase (again): \");\n\t\t\t\t\tif(check != *passphrase) {\n\t\t\t\t\t\tvnx::log_error() << \"Passphrase mismatch!\";\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmmx::account_t config;\n\t\t\t\tconfig.num_addresses = 0;\t// use default\n\t\t\t\tvnx::read_config(\"$3\", config.name);\n\t\t\t\tvnx::read_config(\"limit\", config.num_addresses);\n\n\t\t\t\tvnx::optional<std::string> words;\n\t\t\t\tif(with_mnemonic) {\n\t\t\t\t\tstd::string tmp;\n\t\t\t\t\tstd::cout << \"Mnemonic: \";\n\t\t\t\t\tstd::getline(std::cin, tmp);\n\t\t\t\t\twords = tmp;\n\t\t\t\t}\n\t\t\t\twallet.create_wallet(config, words, passphrase);\n\t\t\t}\n\t\t\telse if(command == \"import\")\n\t\t\t{\n\t\t\t\tvnx::read_config(\"$3\", file_name);\n\t\t\t\tif(file_name.empty()) {\n\t\t\t\t\tstd::cerr << \"Usage: mmx wallet import path/to/wallet*.dat\" << std::endl;\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tauto key_file = vnx::read_from_file<mmx::KeyFile>(file_name);\n\t\t\t\tif(!key_file) {\n\t\t\t\t\tvnx::log_error() << \"Failed to read wallet file '\" << file_name << \"'\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tvnx::optional<std::string> passphrase;\n\t\t\t\tif(key_file->finger_print) {\n\t\t\t\t\tpassphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t}\n\t\t\t\tmmx::account_t config;\n\t\t\t\tconfig.num_addresses = 0;\t// use default\n\t\t\t\twallet.import_wallet(config, key_file, passphrase);\n\t\t\t}\n\t\t\telse if(command == \"remove\")\n\t\t\t{\n\t\t\t\tif(index < 100) {\n\t\t\t\t\tvnx::log_error() << \"Wallet removal not supported for indices below 100!\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\twallet.remove_account(index, offset);\n\t\t\t}\n\t\t\telse if(command == \"plotnft\")\n\t\t\t{\n\t\t\t\tvnx::read_config(\"$3\", command);\n\t\t\t\ttry {\n\t\t\t\t\tif(command != \"create\") {\n\t\t\t\t\t\tindex = wallet.find_wallet_by_addr(contract);\n\t\t\t\t\t}\n\t\t\t\t} catch(...) {\n\t\t\t\t\t// ignore\n\t\t\t\t}\n\t\t\t\tif(command == \"join\") {\n\t\t\t\t\tstd::string url;\n\t\t\t\t\tvnx::read_config(\"$4\", url);\n\t\t\t\t\tif(url.size() && !contract.is_zero()) {\n\t\t\t\t\t\tconst auto info = http.get_json(url + \"/pool/info\", {}).to_object();\n\t\t\t\t\t\tstd::cout << \"[\" << url << \"]\" << std::endl;\n\t\t\t\t\t\tstd::cout << \"Name: \" << info[\"name\"].to_string_value() << std::endl;\n\t\t\t\t\t\tstd::cout << \"Description: \" << info[\"description\"].to_string_value() << std::endl;\n\t\t\t\t\t\tstd::cout << \"Pool Fee: \" << info[\"fee\"].to<double>() * 100 << \" %\" << std::endl;\n\t\t\t\t\t\tstd::cout << \"Minimum difficulty: \" << info[\"min_difficulty\"] << std::endl;\n\t\t\t\t\t\tconst auto target = info[\"pool_target\"].to<mmx::addr_t>();\n\t\t\t\t\t\tif(target.is_zero()) {\n\t\t\t\t\t\t\tthrow std::logic_error(\"pool returned invalid target address\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(pre_accept || accept_prompt()) {\n\t\t\t\t\t\t\ttx = wallet.plotnft_exec(contract, \"lock\", {vnx::Variant(target.to_string()), vnx::Variant(url)}, spend_options);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstd::cerr << \"Usage: mmx wallet plotnft join <pool_url> -x <plot_nft_address>\" << std::endl;\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(command == \"lock\") {\n\t\t\t\t\tstd::string target;\n\t\t\t\t\tvnx::read_config(\"$4\", target);\n\t\t\t\t\tif(target.size() && !contract.is_zero()) {\n\t\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttx = wallet.plotnft_exec(contract, \"lock\", {vnx::Variant(target), vnx::Variant()}, spend_options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstd::cerr << \"Usage: mmx wallet plotnft lock <target_address> -x <plot_nft_address>\" << std::endl;\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(command == \"unlock\") {\n\t\t\t\t\tif(contract.is_zero()) {\n\t\t\t\t\t\tstd::cerr << \"Usage: mmx wallet plotnft unlock -x <plot_nft_address>\" << std::endl;\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t}\n\t\t\t\t\ttx = wallet.plotnft_exec(contract, \"unlock\", {}, spend_options);\n\t\t\t\t}\n\t\t\t\telse if(command == \"create\") {\n\t\t\t\t\tstd::string name;\n\t\t\t\t\tvnx::read_config(\"$4\", name);\n\t\t\t\t\tif(name.size()) {\n\t\t\t\t\t\tif(wallet.is_locked(index)) {\n\t\t\t\t\t\t\tspend_options.passphrase = vnx::input_password(\"Passphrase: \");\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttx = wallet.plotnft_create(index, name, offset, spend_options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstd::cerr << \"Usage: mmx wallet plotnft create <name>\" << std::endl;\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(command == \"show\") {\n\t\t\t\t\tstd::map<mmx::addr_t, std::shared_ptr<const mmx::Contract>> list;\n\t\t\t\t\tif(contract.is_zero()) {\n\t\t\t\t\t\tlist = wallet.get_contracts_owned(index, nullptr, params->plot_nft_binary);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(auto exec = std::dynamic_pointer_cast<const mmx::contract::Executable>(node.get_contract(contract))) {\n\t\t\t\t\t\t\tif(exec->binary == params->plot_nft_binary) {\n\t\t\t\t\t\t\t\tlist[contract] = exec;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor(const auto& entry : list) {\n\t\t\t\t\t\tstd::cout << \"[\" << entry.first.to_string() << \"]\" << std::endl;\n\t\t\t\t\t\tif(auto info = node.get_plot_nft_info(entry.first)) {\n\t\t\t\t\t\t\tstd::cout << \"  Name: \" << info->name << std::endl;\n\t\t\t\t\t\t\tstd::cout << \"  Locked: \" << vnx::to_string(info->is_locked) << std::endl;\n\t\t\t\t\t\t\tif(info->is_locked && info->unlock_height) {\n\t\t\t\t\t\t\t\tstd::cout << \"  Unlock Height: \" << *info->unlock_height << std::endl;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tstd::cout << \"  Server URL: \" << (info->server_url ? *info->server_url : std::string(\"N/A (solo farming)\")) << std::endl;\n\t\t\t\t\t\t\tif(verbose) {\n\t\t\t\t\t\t\t\tstd::cout << \"  Pool Target: \" << (info->target ? info->target->to_string() : std::string(\"N/A\")) << std::endl;\n\t\t\t\t\t\t\t\tstd::cout << \"  Owner: \" << info->owner.to_string() << std::endl;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(list.empty()) {\n\t\t\t\t\t\tstd::cout << \"No Plot NFTs found!\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstd::cerr << \"Usage: mmx wallet plotnft [show | join | lock | unlock | create]\" << std::endl;\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstd::cerr << \"Help: mmx wallet [show | get | log | send | send_from | offer | trade | accept | buy | sell | swap | mint | deploy | exec | transfer | create | new | import | remove | accounts | keys | lock | unlock | plotnft | log_csv]\" << std::endl;\n\t\t\t}\n\n\t\t\tif(tx) {\n\t\t\t\tstd::cout << \"Transaction ID: \" << tx->id << std::endl;\n\t\t\t}\n\t\t\tif(output) {\n\t\t\t\tauto out = vnx::clone(tx);\n\t\t\t\tout->reset(params);\n\t\t\t\tvnx::write_to_file(*output, out);\n\t\t\t}\n\t\t}\n\t\telse if(module == \"node\")\n\t\t{\n\t\t\tstd::string node_url = \":11330\";\n\t\t\tvnx::read_config(\"node\", node_url);\n\n\t\t\tvnx::Handle<vnx::Proxy> proxy = new vnx::Proxy(\"Proxy\", vnx::Endpoint::from_url(node_url));\n\t\t\tproxy->forward_list = {\"Router\", \"Node\"};\n\t\t\tproxy.start_detached();\n\t\t\t{\n\t\t\t\tvnx::ProxyClient client(proxy.get_name());\n\t\t\t\tclient.login(user, passwd);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tparams = node.get_params();\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\tmmx::RouterClient router(\"Router\");\n\n\t\t\tif(command == \"balance\")\n\t\t\t{\n\t\t\t\tmmx::addr_t address;\n\t\t\t\tif(!vnx::read_config(\"$3\", address)) {\n\t\t\t\t\tvnx::log_error() << \"Missing address argument! (node balances <address>)\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tfor(const auto& entry : node.get_total_balances({address}))\n\t\t\t\t{\n\t\t\t\t\tauto contract = get_contract(node, entry.first);\n\t\t\t\t\tauto exe = std::dynamic_pointer_cast<const mmx::contract::Executable>(contract);\n\t\t\t\t\tif(!exe || exe->binary != params->nft_binary) {\n\t\t\t\t\t\tconst auto token = std::dynamic_pointer_cast<const mmx::contract::TokenBase>(contract);\n\t\t\t\t\t\tconst auto decimals = token ? token->decimals : params->decimals;\n\t\t\t\t\t\tstd::cout << \"Balance: \" << mmx::to_value(entry.second, decimals) << \" \" << (token ? token->symbol : \"MMX\") << \" (\" << entry.second << \")\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"info\")\n\t\t\t{\n\t\t\t\tconst auto info = node.get_network_info();\n\t\t\t\tstd::cout << \"Synced:     \" << (node.get_synced_height() ? \"Yes\" : \"No\") << std::endl;\n\t\t\t\tstd::cout << \"Height:     \" << info->height << std::endl;\n\t\t\t\tstd::cout << \"Netspace:   \" << info->total_space / pow(1000, 2) << \" PB\" << std::endl;\n\t\t\t\tstd::cout << \"VDF Speed:  \" << info->vdf_speed << \" MH/s\" << std::endl;\n\t\t\t\tstd::cout << \"Reward:     \" << mmx::to_value(info->block_reward, params) << \" MMX\" << std::endl;\n\t\t\t\tstd::cout << \"Supply:     \" << mmx::to_value(info->total_supply, params) << \" MMX\" << std::endl;\n\t\t\t\tstd::cout << \"Block Size: \" << info->block_size * 100 << \" %\" << std::endl;\n\t\t\t\tstd::cout << \"N(Address): \" << info->address_count << std::endl;\n\t\t\t\tfor(uint32_t i = 0; i < 10 && i < info->height; ++i) {\n\t\t\t\t\tconst auto hash = node.get_block_hash(info->height - i);\n\t\t\t\t\tstd::cout << \"Block[\" << (info->height - i) << \"] \" << (hash ? *hash : mmx::hash_t()) << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"history\" || command == \"history_csv\")\n\t\t\t{\n\t\t\t\tmmx::addr_t address;\n\t\t\t\tif(!vnx::read_config(\"$3\", address)) {\n\t\t\t\t\tvnx::log_error() << \"Missing address argument! (node \" << command << \" <address> [since])\";\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tmmx::query_filter_t filter;\n\t\t\t\tfilter.limit = limit;\n\t\t\t\tvnx::read_config(\"$4\", filter.since);\n\n\t\t\t\tconst auto data = node.get_history({address}, filter);\n\t\t\t\tif(command == \"history_csv\") {\n\t\t\t\t\tshow_history_csv(data, node, params);\n\t\t\t\t} else {\n\t\t\t\t\tshow_history(data, node, params);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"peers\")\n\t\t\t{\n\t\t\t\tauto info = router.get_peer_info();\n\t\t\t\tsize_t max_length = 0;\n\t\t\t\tuint32_t max_height = 0;\n\t\t\t\tfor(const auto& peer : info->peers) {\n\t\t\t\t\tmax_length = std::max(max_length, peer.address.size());\n\t\t\t\t\tmax_height = std::max(max_height, peer.height);\n\t\t\t\t}\n\t\t\t\tfor(const auto& peer : info->peers) {\n\t\t\t\t\tstd::cout << \"[\" << peer.address << \"]\";\n\t\t\t\t\tfor(size_t i = peer.address.size(); i < max_length + 1; ++i) {\n\t\t\t\t\t\tstd::cout << \" \";\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << \" height = \";\n\t\t\t\t\tconst auto height = std::to_string(peer.height);\n\t\t\t\t\tfor(size_t i = height.size(); i < std::to_string(max_height).size(); ++i) {\n\t\t\t\t\t\tstd::cout << \" \";\n\t\t\t\t\t}\n\t\t\t\t\tif(peer.is_synced) {\n\t\t\t\t\t\tstd::cout << \" \";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstd::cout << \"!\";\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << height;\n\t\t\t\t\tstd::cout << \", \" << vnx::to_string_value(peer.type) << \" (\" << peer.version / 100 << \".\" << peer.version % 100 << \")\";\n\t\t\t\t\tstd::cout << \", \" << peer.bytes_recv / 1024 / 1024 << \" MB recv\";\n\t\t\t\t\tstd::cout << \", \" << peer.bytes_send / 1024 / 1024 << \" MB sent (\" << float(peer.compression_ratio) << \")\";\n\t\t\t\t\tstd::cout << \", since \" << (peer.connect_time_ms / 60000) << \" min\";\n\t\t\t\t\tstd::cout << \", \" << peer.ping_ms << \" ms ping\";\n\t\t\t\t\tstd::cout << \", \" << int64_t(1e3 * peer.pending_cost) / 1e3 << \" pending\";\n\t\t\t\t\tstd::cout << \", \" << (peer.recv_timeout_ms / 100) / 10. << \" sec timeout\";\n\t\t\t\t\tif(peer.is_outbound) {\n\t\t\t\t\t\tstd::cout << \", outbound\";\n\t\t\t\t\t}\n\t\t\t\t\tif(peer.is_blocked) {\n\t\t\t\t\t\tstd::cout << \", blocked\";\n\t\t\t\t\t}\n\t\t\t\t\tif(peer.is_paused) {\n\t\t\t\t\t\tstd::cout << \", paused\";\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"sync\")\n\t\t\t{\n\t\t\t\tnode.start_sync(true);\n\t\t\t\tstd::cout << \"Started sync ...\" << std::endl;\n\t\t\t\twhile(true) {\n\t\t\t\t\tif(auto height = node.get_synced_height()) {\n\t\t\t\t\t\tstd::cout << \"Finished sync at height: \" << *height << std::endl;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << node.get_height() << std::endl;\n\t\t\t\t\tstd::this_thread::sleep_for(std::chrono::milliseconds(2000));\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"revert\")\n\t\t\t{\n\t\t\t\tuint32_t height = 0;\n\t\t\t\tif(!vnx::read_config(\"$3\", height)) {\n\t\t\t\t\tstd::cout << \"mmx node revert <height>\" << std::endl;\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tstd::cout << \"Reverting to height \" << height << \" ...\" << std::endl;\n\t\t\t\tnode.revert_sync(height);\n\t\t\t}\n\t\t\telse if(command == \"discover\")\n\t\t\t{\n\t\t\t\trouter.discover();\n\t\t\t\tstd::this_thread::sleep_for(std::chrono::milliseconds(2000));\n\n\t\t\t\tconst auto peers = router.get_known_peers();\n\t\t\t\tstd::cout << \"Got \" << peers.size() << \" known peers\" << std::endl;\n\t\t\t}\n\t\t\telse if(command == \"send\")\n\t\t\t{\n\t\t\t\tstd::string file_name;\n\t\t\t\tvnx::read_config(\"$3\", file_name);\n\n\t\t\t\tif(auto tx = vnx::read_from_file<mmx::Transaction>(file_name)) {\n\t\t\t\t\tnode.add_transaction(tx, true);\n\t\t\t\t\tstd::cout << \"Transaction ID: \" << tx->id.to_string() << std::endl;\n\t\t\t\t} else {\n\t\t\t\t\tstd::cout << \"Failed to read transaction '\" << file_name << \"'\" << std::endl;\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"tx\")\n\t\t\t{\n\t\t\t\tmmx::hash_t txid;\n\t\t\t\tvnx::read_config(\"$3\", txid);\n\n\t\t\t\tconst auto tx = node.get_transaction(txid, true);\n\t\t\t\tif(!tx) {\n\t\t\t\t\tvnx::log_error() << \"No such transaction: \" << txid;\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tconst auto height = node.get_height();\n\t\t\t\tconst auto tx_height = node.get_tx_height(txid);\n\t\t\t\tif(tx_height) {\n\t\t\t\t\tstd::cout << \"Confirmations: \" << height - (*tx_height) + 1 << std::endl;\n\t\t\t\t} else {\n\t\t\t\t\tstd::cout << \"Confirmations: none yet\" << std::endl;\n\t\t\t\t}\n\t\t\t\tsize_t i = 0;\n\t\t\t\tfor(const auto& in : tx->get_inputs()) {\n\t\t\t\t\tstd::cout << \"Input[\" << i++ << \"]: \";\n\t\t\t\t\tif(auto token = get_token(node, in.contract, false)) {\n\t\t\t\t\t\tstd::cout << mmx::to_value(in.amount, token->decimals) << \" \" << token->symbol << \" (\" << in.amount << \") <- \" << in.address << std::endl;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstd::cout << in.amount << \" [\" << in.contract << \"]\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ti = 0;\n\t\t\t\tfor(const auto& out : tx->get_outputs()) {\n\t\t\t\t\tstd::cout << \"Output[\" << i++ << \"]: \";\n\t\t\t\t\tif(auto token = get_token(node, out.contract, false)) {\n\t\t\t\t\t\tstd::cout << mmx::to_value(out.amount, token->decimals) << \" \" << token->symbol << \" (\" << out.amount << \") -> \" << out.address << std::endl;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstd::cout << out.amount << \" [\" << out.contract << \"]\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"get\")\n\t\t\t{\n\t\t\t\tstd::string subject;\n\t\t\t\tvnx::read_config(\"$3\", subject);\n\n\t\t\t\tif(subject == \"balance\")\n\t\t\t\t{\n\t\t\t\t\tmmx::addr_t address;\n\t\t\t\t\tvnx::read_config(\"$4\", address);\n\n\t\t\t\t\tconst auto token = get_token(node, contract);\n\t\t\t\t\tstd::cout << mmx::to_value(node.get_balance(address, contract), token->decimals) << std::endl;\n\t\t\t\t}\n\t\t\t\telse if(subject == \"amount\")\n\t\t\t\t{\n\t\t\t\t\tmmx::addr_t address;\n\t\t\t\t\tvnx::read_config(\"$4\", address);\n\n\t\t\t\t\tstd::cout << node.get_balance(address, contract) << std::endl;\n\t\t\t\t}\n\t\t\t\telse if(subject == \"height\")\n\t\t\t\t{\n\t\t\t\t\tstd::cout << node.get_height() << std::endl;\n\t\t\t\t}\n\t\t\t\telse if(subject == \"block\")\n\t\t\t\t{\n\t\t\t\t\tstd::string arg;\n\t\t\t\t\tvnx::read_config(\"$4\", arg);\n\n\t\t\t\t\tstd::shared_ptr<const mmx::Block> block;\n\t\t\t\t\tif(arg.size() == 64) {\n\t\t\t\t\t\tmmx::hash_t hash;\n\t\t\t\t\t\thash.from_string(arg);\n\t\t\t\t\t\tblock = node.get_block(hash);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst auto height = arg.size() ? vnx::from_string<uint32_t>(arg) : node.get_height();\n\t\t\t\t\t\tblock = node.get_block_at(height);\n\t\t\t\t\t}\n\t\t\t\t\tvnx::PrettyPrinter printer(std::cout);\n\t\t\t\t\tvnx::accept(printer, block);\n\t\t\t\t\tstd::cout << std::endl;\n\t\t\t\t}\n\t\t\t\telse if(subject == \"header\")\n\t\t\t\t{\n\t\t\t\t\tstd::string arg;\n\t\t\t\t\tvnx::read_config(\"$4\", arg);\n\n\t\t\t\t\tstd::shared_ptr<const mmx::BlockHeader> block;\n\t\t\t\t\tif(arg.size() == 64) {\n\t\t\t\t\t\tmmx::hash_t hash;\n\t\t\t\t\t\thash.from_string(arg);\n\t\t\t\t\t\tblock = node.get_header(hash);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst auto height = arg.size() ? vnx::from_string<uint32_t>(arg) : node.get_height();\n\t\t\t\t\t\tblock = node.get_header_at(height);\n\t\t\t\t\t}\n\t\t\t\t\tvnx::PrettyPrinter printer(std::cout);\n\t\t\t\t\tvnx::accept(printer, block);\n\t\t\t\t\tstd::cout << std::endl;\n\t\t\t\t}\n\t\t\t\telse if(subject == \"tx\")\n\t\t\t\t{\n\t\t\t\t\tmmx::hash_t txid;\n\t\t\t\t\tstd::string format = \"json\";\n\t\t\t\t\tvnx::read_config(\"$4\", txid);\n\t\t\t\t\tvnx::read_config(\"$5\", format);\n\n\t\t\t\t\tconst auto tx = node.get_transaction(txid, true);\n\t\t\t\t\tif(format == \"json\") {\n\t\t\t\t\t\tstd::cout << vnx::to_pretty_string(tx);\n\t\t\t\t\t} else if(format == \"compact\") {\n\t\t\t\t\t\tstd::cout << vnx::to_string(tx) << std::endl;\n\t\t\t\t\t} else if(format == \"hash\") {\n\t\t\t\t\t\tconst auto tmp = tx->hash_serialize(false);\n\t\t\t\t\t\tstd::cout << vnx::to_hex_string(tmp.data(), tmp.size()) << std::endl;\n\t\t\t\t\t} else if(format == \"full_hash\") {\n\t\t\t\t\t\tconst auto tmp = tx->hash_serialize(true);\n\t\t\t\t\t\tstd::cout << vnx::to_hex_string(tmp.data(), tmp.size()) << std::endl;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvnx::log_error() << \"invalid format: \" << format << std::endl;\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(subject == \"contract\")\n\t\t\t\t{\n\t\t\t\t\tmmx::addr_t address;\n\t\t\t\t\tvnx::read_config(\"$4\", address);\n\n\t\t\t\t\tconst auto contract = node.get_contract(address);\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::stringstream ss;\n\t\t\t\t\t\tvnx::PrettyPrinter printer(ss);\n\t\t\t\t\t\tvnx::accept(printer, contract);\n\t\t\t\t\t\tstd::cout << ss.str() << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(subject == \"peers\")\n\t\t\t\t{\n\t\t\t\t\tint64_t max_count = 10;\n\t\t\t\t\tvnx::read_config(\"$4\", max_count);\n\n\t\t\t\t\tfor(const auto& peer : router.get_connected_peers()) {\n\t\t\t\t\t\tstd::cout << peer << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(subject == \"netspace\")\n\t\t\t\t{\n\t\t\t\t\tconst auto height = node.get_height();\n\t\t\t\t\tconst auto peak = node.get_header_at(height);\n\t\t\t\t\tstd::cout << mmx::calc_total_netspace(params, peak ? peak->space_diff : 0) << std::endl;\n\t\t\t\t}\n\t\t\t\telse if(subject == \"supply\")\n\t\t\t\t{\n\t\t\t\t\tstd::cout << node.get_total_supply(contract) << std::endl;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstd::cerr << \"Help: mmx node get [height | tx | contract | balance | amount | block | header | peers | netspace | supply]\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"read\")\n\t\t\t{\n\t\t\t\tstd::string address;\n\t\t\t\tvnx::read_config(\"$3\", address);\n\n\t\t\t\tif(address.empty()) {\n\t\t\t\t\tstd::cout << \"{\" << std::endl;\n\t\t\t\t\tfor(const auto& entry : node.read_storage(contract)) {\n\t\t\t\t\t\tstd::cout << \"  \\\"\" << entry.first << \"\\\": \" << to_string(entry.second) << \",\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << \"}\" << std::endl;\n\t\t\t\t} else {\n\t\t\t\t\tvnx::Variant tmp;\n\t\t\t\t\tvnx::from_string(address, tmp);\n\n\t\t\t\t\tuint64_t addr = 0;\n\t\t\t\t\tmmx::vm::varptr_t var;\n\t\t\t\t\tif(tmp.is_string()) {\n\t\t\t\t\t\tconst auto res = node.read_storage_field(contract, address);\n\t\t\t\t\t\tvar = res.first;\n\t\t\t\t\t\taddr = res.second;\n\t\t\t\t\t} else {\n\t\t\t\t\t\taddr = tmp.to<uint64_t>();\n\t\t\t\t\t\tvar = node.read_storage_var(contract, addr);\n\t\t\t\t\t}\n\t\t\t\t\tif(var) {\n\t\t\t\t\t\tswitch(var->type) {\n\t\t\t\t\t\t\tcase mmx::vm::TYPE_ARRAY: {\n\t\t\t\t\t\t\t\tstd::cout << '[';\n\t\t\t\t\t\t\t\tint i = 0;\n\t\t\t\t\t\t\t\tfor(const auto& entry : node.read_storage_array(contract, addr)) {\n\t\t\t\t\t\t\t\t\tif(i++) {\n\t\t\t\t\t\t\t\t\t\tstd::cout << \", \";\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tstd::cout << to_string(entry);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstd::cout << ']' << std::endl;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcase mmx::vm::TYPE_MAP:\n\t\t\t\t\t\t\t\tstd::cout << '{' << std::endl;\n\t\t\t\t\t\t\t\tfor(const auto& entry : node.read_storage_map(contract, addr)) {\n\t\t\t\t\t\t\t\t\tstd::cout << \"  \" << to_string(entry.first) << \": \" << to_string(entry.second) << ',' << std::endl;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstd::cout << '}' << std::endl;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tstd::cout << to_string(var) << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstd::cout << to_string(var) << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"dump\")\n\t\t\t{\n\t\t\t\tfor(const auto& entry : node.dump_storage(contract)) {\n\t\t\t\t\tstd::cout << \"[0x\" << std::hex << entry.first << std::dec << \"] \" << to_string(entry.second) << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"call\")\n\t\t\t{\n\t\t\t\tstd::string method;\n\t\t\t\tstd::vector<vnx::Variant> args;\n\t\t\t\tvnx::read_config(\"$3\", method);\n\t\t\t\tvnx::read_config(\"$4\", args);\n\n\t\t\t\tconst auto res = node.call_contract(contract, method, args);\n\t\t\t\tvnx::PrettyPrinter printer(std::cout);\n\t\t\t\tvnx::accept(printer, res);\n\t\t\t\tstd::cout << std::endl;\n\t\t\t}\n\t\t\telse if(command == \"dump_code\")\n\t\t\t{\n\t\t\t\tstd::string method;\n\t\t\t\tvnx::read_config(\"$3\", method);\n\n\t\t\t\tauto value = node.get_contract(contract);\n\t\t\t\tauto bin = std::dynamic_pointer_cast<const mmx::contract::Binary>(value);\n\t\t\t\tif(!bin) {\n\t\t\t\t\tif(auto exec = std::dynamic_pointer_cast<const mmx::contract::Executable>(value)) {\n\t\t\t\t\t\tbin = std::dynamic_pointer_cast<const mmx::contract::Binary>(node.get_contract(exec->binary));\n\t\t\t\t\t\tif(!bin) {\n\t\t\t\t\t\t\tvnx::log_error() << \"No such binary: \" << exec->binary;\n\t\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvnx::log_error() << \"No such executable: \" << contract;\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(bin) {\n\t\t\t\t\tmmx::vm::dump_code(std::cout, bin, method.empty() ? vnx::optional<std::string>() : method);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"fetch\")\n\t\t\t{\n\t\t\t\tstd::string subject;\n\t\t\t\tvnx::read_config(\"$3\", subject);\n\n\t\t\t\tif(subject == \"block\" || subject == \"header\")\n\t\t\t\t{\n\t\t\t\t\tint64_t height = 0;\n\t\t\t\t\tstd::string from_peer;\n\t\t\t\t\tvnx::read_config(\"$4\", from_peer);\n\t\t\t\t\tvnx::read_config(\"$5\", height);\n\n\t\t\t\t\tif(from_peer.empty()) {\n\t\t\t\t\t\tvnx::log_error() << \"Missing peer argument: node fetch [block | header] <peer> <height>\";\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t\tif(height < 0) {\n\t\t\t\t\t\tvnx::log_error() << \"Invalid height: \" << height;\n\t\t\t\t\t\tgoto failed;\n\t\t\t\t\t}\n\t\t\t\t\tconst auto block = router.fetch_block_at(height, from_peer);\n\t\t\t\t\t{\n\t\t\t\t\t\tstd::stringstream ss;\n\t\t\t\t\t\tvnx::PrettyPrinter printer(ss);\n\t\t\t\t\t\tif(subject == \"header\") {\n\t\t\t\t\t\t\tvnx::accept(printer, block ? block->get_header() : nullptr);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvnx::accept(printer, block);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstd::cout << ss.str() << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstd::cerr << \"Help: mmx node fetch [block | header]\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"offers\")\n\t\t\t{\n\t\t\t\tstd::string filter;\n\t\t\t\tvnx::read_config(\"$3\", filter);\n\n\t\t\t\tfor(const auto& data : node.get_offers())\n\t\t\t\t{\n\t\t\t\t\tif(data.is_open()) {\n\t\t\t\t\t\tif(!filter.empty() && filter != \"open\") {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstd::cout << \"OPEN\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(!filter.empty() && filter != \"closed\") {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstd::cout << \"CLOSED\";\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << \" [\" << data.address << \"] [\" << data.height << \"] \" << std::endl;\n\n\t\t\t\t\tstd::cout << \"  They offer:   \";\n\t\t\t\t\tconst auto bid_token = get_token(node, data.bid_currency);\n\t\t\t\t\tif(bid_token) {\n\t\t\t\t\t\tstd::cout << mmx::to_value(data.bid_balance, bid_token->decimals) << \" \" << bid_token->symbol << \" [\" << data.bid_currency << \"]\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstd::cout << data.bid_balance << \" [\" << data.bid_currency << \"]\";\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << std::endl;\n\n\t\t\t\t\tstd::cout << \"  They ask for: \";\n\t\t\t\t\tconst auto ask_token = get_token(node, data.ask_currency);\n\t\t\t\t\tconst uint64_t ask_amount = (uint256_t(data.bid_balance) * data.inv_price) >> 64;\n\t\t\t\t\tif(ask_token) {\n\t\t\t\t\t\tstd::cout << mmx::to_value(ask_amount, ask_token->decimals) << \" \" << ask_token->symbol << \" [\" << data.ask_currency << \"]\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstd::cout << ask_amount << \" [\" << data.ask_currency << \"]\";\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << std::endl;\n\n\t\t\t\t\tif(bid_token && ask_token) {\n\t\t\t\t\t\tstd::cout << \"  Price: \" << data.price << \" \" << ask_token->symbol << \" / \" << bid_token->symbol << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"swaps\")\n\t\t\t{\n\t\t\t\tvnx::optional<mmx::addr_t> token;\n\t\t\t\tvnx::optional<mmx::addr_t> currency;\n\t\t\t\tvnx::read_config(\"$3\", token);\n\t\t\t\tvnx::read_config(\"$4\", currency);\n\n\t\t\t\tfor(const auto& data : node.get_swaps(offset, token, currency, limit))\n\t\t\t\t{\n\t\t\t\t\tstd::cout << \"[\" << data.address << \"] \";\n\t\t\t\t\tstd::array<int, 2> decimals;\n\t\t\t\t\tstd::array<std::string, 2> symbols;\n\t\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\t\tif(auto token = get_token(node, data.tokens[i], false)) {\n\t\t\t\t\t\t\tdecimals[i] = token->decimals;\n\t\t\t\t\t\t\tsymbols[i] = token->symbol;\n\t\t\t\t\t\t\tstd::cout << mmx::to_value(data.balance[i], token->decimals) << \" \" << token->symbol << (i == 0 ? \" / \" : \"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst auto price = mmx::to_value(data.balance[1], decimals[1]) / mmx::to_value(data.balance[0], decimals[0]);\n\t\t\t\t\tstd::cout << \" (\" << price << \" \" << symbols[1] << \" / \" << symbols[0] << \")\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"swap\")\n\t\t\t{\n\t\t\t\tmmx::addr_t address;\n\t\t\t\tif(!vnx::read_config(\"$3\", address)) {\n\t\t\t\t\tstd::cerr << \"node swap <address>\" << std::endl;\n\t\t\t\t\tgoto failed;\n\t\t\t\t}\n\t\t\t\tconst auto data = node.get_swap_info(address);\n\n\t\t\t\tstd::array<int, 2> decimals;\n\t\t\t\tstd::array<std::string, 2> symbols;\n\t\t\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\t\t\tif(auto token = get_token(node, data.tokens[i])) {\n\t\t\t\t\t\tdecimals[i] = token->decimals;\n\t\t\t\t\t\tsymbols[i] = token->symbol;\n\t\t\t\t\t\tstd::cout << (i ? \"Currency\" : \"Token\") << \": \" << data.tokens[i] << std::endl;\n\t\t\t\t\t\tstd::cout << \"  Pool Balance:   \" << mmx::to_value(data.balance[i], token->decimals) << \" \" << token->symbol << std::endl;\n\t\t\t\t\t\tstd::cout << \"  User Balance:   \" << mmx::to_value(data.user_total[i], token->decimals) << \" \" << token->symbol << std::endl;\n\t\t\t\t\t\tstd::cout << \"  Wallet Balance: \" << mmx::to_value(data.wallet[i], token->decimals) << \" \" << token->symbol << std::endl;\n\t\t\t\t\t\tstd::cout << \"  Total Fees:     \" << mmx::to_value(data.fees_paid[i], token->decimals) << \" \" << token->symbol << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst auto price = mmx::to_value(data.balance[1], decimals[1]) / mmx::to_value(data.balance[0], decimals[0]);\n\t\t\t\tstd::cout << \"Price: \" << price << \" \" << symbols[1] << \" / \" << symbols[0] << std::endl;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstd::cerr << \"Help: mmx node [info | peers | tx | get | fetch | balance | history | offers | swaps | swap | sync | revert | call | send | read | dump | dump_code | history_csv]\" << std::endl;\n\t\t\t}\n\t\t}\n\t\telse if(module == \"farm\" || module == \"harvester\")\n\t\t{\n\t\t\tstd::string node_url = \":11333\";\n\t\t\tvnx::read_config(\"node\", node_url);\n\n\t\t\tvnx::Handle<vnx::Proxy> proxy = new vnx::Proxy(\"Proxy\", vnx::Endpoint::from_url(node_url));\n\t\t\tproxy->forward_list = {\"Farmer\", \"Harvester\", \"Node\"};\n\t\t\tproxy.start_detached();\n\t\t\t{\n\t\t\t\tvnx::ProxyClient client(proxy.get_name());\n\t\t\t\tclient.login(user, passwd);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tparams = node.get_params();\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\tmmx::FarmerClient farmer(\"Farmer\");\n\t\t\tmmx::HarvesterClient harvester(\"Harvester\");\n\n\t\t\tstd::shared_ptr<const mmx::FarmInfo> info;\n\t\t\tif(module == \"farm\") {\n\t\t\t\tinfo = farmer.get_farm_info();\n\t\t\t} else if(module == \"harvester\") {\n\t\t\t\tinfo = harvester.get_farm_info();\n\t\t\t}\n\t\t\tif(!info) {\n\t\t\t\tgoto failed;\n\t\t\t}\n\n\t\t\tif(command == \"info\")\n\t\t\t{\n\t\t\t\tif(module == \"farm\") {\n\t\t\t\t\tconst auto info = node.get_farmed_block_summary(farmer.get_farmer_keys(), params->reward_activation);\n\t\t\t\t\tstd::cout << \"Farmed Blocks: \" << info.num_blocks << std::endl;\n\t\t\t\t\tstd::cout << \"Total Rewards: \" << mmx::to_value(info.total_rewards, params->decimals) << \" MMX\" << std::endl;\n\t\t\t\t}\n\t\t\t\tif(info->harvester) {\n\t\t\t\t\tstd::cout << \"[\" << *info->harvester << \"]\" << std::endl;\n\t\t\t\t}\n\t\t\t\tstd::cout << \"Physical Size:  \" << info->total_bytes / pow(1000, 4) << \" TB\" << std::endl;\n\t\t\t\tstd::cout << \"Effective Size: \" << info->total_bytes_effective / pow(1000, 4) << \" TBe\" << std::endl;\n\t\t\t\tstd::cout << \"Plots:\" << std::endl;\n\t\t\t\tuint64_t total_plots = 0;\n\t\t\t\tfor(const auto& entry : info->plot_count) {\n\t\t\t\t\ttotal_plots += entry.second;\n\t\t\t\t\tstd::cout << \"  K\" << int(entry.first) << \":   \" << entry.second << std::endl;\n\t\t\t\t}\n\t\t\t\tstd::cout << \"  Total: \" << total_plots << std::endl;\n\t\t\t\tif(!info->harvester_bytes.empty()) {\n\t\t\t\t\tstd::cout << \"Harvesters:\" << std::endl;\n\t\t\t\t}\n\t\t\t\tfor(const auto& entry : info->harvester_bytes) {\n\t\t\t\t\tstd::cout << \"  [\" << entry.first << \"] \" << entry.second.first / pow(1000, 4) << \" TB, \" << entry.second.second / pow(1000, 4) << \" TBe\" << std::endl;\n\t\t\t\t}\n\t\t\t\tif(info->reward_addr) {\n\t\t\t\t\tstd::cout << \"Reward Address: \" << info->reward_addr->to_string() << std::endl;\n\t\t\t\t}\n\t\t\t\tfor(const auto& entry : info->pool_info) {\n\t\t\t\t\tconst auto& data = entry.second;\n\t\t\t\t\tstd::cout << std::endl << \"Plot \" << (data.is_plot_nft ? \"NFT\" : \"Contract\") << \" [\" << entry.first.to_string() << \"]\" << std::endl;\n\t\t\t\t\tif(data.name) {\n\t\t\t\t\t\tstd::cout << \"  Name: \" << (*data.name) << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << \"  Server URL: \" << (data.server_url ? *data.server_url : std::string(\"N/A (solo farming)\")) << std::endl;\n\t\t\t\t\tstd::string target = \"N/A\";\n\t\t\t\t\tif(data.pool_target) {\n\t\t\t\t\t\ttarget = data.pool_target->to_string();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(data.is_plot_nft && info->reward_addr) {\n\t\t\t\t\t\t\ttarget = info->reward_addr->to_string();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tstd::cout << \"  Target Address: \" << target << std::endl;\n\t\t\t\t\tstd::cout << \"  Plot Count: \" << data.plot_count << std::endl;\n\t\t\t\t\tconst auto iter = info->pool_stats.find(entry.first);\n\t\t\t\t\tif(iter != info->pool_stats.end()) {\n\t\t\t\t\t\tconst auto& stats = iter->second;\n\t\t\t\t\t\tstd::cout << \"  Points: \" << stats.valid_points << \" OK / \" << stats.failed_points << \" FAIL\" << std::endl;\n\t\t\t\t\t\tstd::cout << \"  Difficulty: \" << stats.partial_diff << std::endl;\n\t\t\t\t\t\tif(stats.total_partials) {\n\t\t\t\t\t\t\tstd::cout << \"  Avg. Response: \" << double(stats.total_response_time) / stats.total_partials / 1e3 << \" sec\" << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(stats.last_partial) {\n\t\t\t\t\t\t\tstd::cout << \"  Last Partial: \" << vnx::get_date_string_ex(\"%Y-%m-%d %H:%M:%S\", false, stats.last_partial) << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor(const auto& entry : stats.error_count) {\n\t\t\t\t\t\t\tstd::cout << \"  Error[\" << entry.first.to_string_value() << \"]: \" << entry.second << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"reload\")\n\t\t\t{\n\t\t\t\tharvester.reload();\n\t\t\t}\n\t\t\telse if(command == \"get\")\n\t\t\t{\n\t\t\t\tstd::string subject;\n\t\t\t\tvnx::read_config(\"$3\", subject);\n\n\t\t\t\tif(subject == \"space\")\n\t\t\t\t{\n\t\t\t\t\tstd::cout << info->total_bytes << std::endl;\n\t\t\t\t}\n\t\t\t\telse if(subject == \"dirs\")\n\t\t\t\t{\n\t\t\t\t\tfor(const auto& entry : info->plot_dirs) {\n\t\t\t\t\t\tstd::cout << entry << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstd::cerr << \"Help: mmx farm get [space | dirs]\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"add\")\n\t\t\t{\n\t\t\t\tstd::string path;\n\t\t\t\tif(vnx::read_config(\"$3\", path)) {\n\t\t\t\t\tharvester.add_plot_dir(path);\n\t\t\t\t} else {\n\t\t\t\t\tstd::cout << \"mmx farm add <path>\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(command == \"remove\")\n\t\t\t{\n\t\t\t\tstd::string path;\n\t\t\t\tif(vnx::read_config(\"$3\", path)) {\n\t\t\t\t\tharvester.rem_plot_dir(path);\n\t\t\t\t} else {\n\t\t\t\t\tstd::cout << \"mmx farm remove <path>\" << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstd::cerr << \"Help: mmx \" << module << \" [info | get | add | remove | reload]\" << std::endl;\n\t\t\t}\n\t\t}\n\t\telse if(module == \"pool\")\n\t\t{\n\t\t\tstd::string node_url = \":11333\";\n\t\t\tvnx::read_config(\"node\", node_url);\n\n\t\t\tvnx::Handle<vnx::Proxy> proxy = new vnx::Proxy(\"Proxy\", vnx::Endpoint::from_url(node_url));\n\t\t\tproxy->forward_list = {\"Farmer\", \"Node\"};\n\t\t\tproxy.start_detached();\n\t\t\t{\n\t\t\t\tvnx::ProxyClient client(proxy.get_name());\n\t\t\t\tclient.login(user, passwd);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tparams = node.get_params();\n\t\t\t} catch(...) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t\tmmx::FarmerClient farmer(\"Farmer\");\n\n\t\t\tconst auto info = farmer.get_farm_info();\n\t\t\tif(!info || !info->reward_addr) {\n\t\t\t\tstd::cerr << \"No reward address to query!\" << std::endl;\n\t\t\t\tgoto failed;\n\t\t\t}\n\n\t\t\tif(command == \"info\")\n\t\t\t{\n\t\t\t\tstd::set<std::string> urls;\n\t\t\t\tfor(const auto& entry : info->pool_info) {\n\t\t\t\t\tconst auto& pool = entry.second;\n\t\t\t\t\tif(auto url = pool.server_url) {\n\t\t\t\t\t\turls.insert(*url);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor(const auto& url : urls) {\n\t\t\t\t\tstd::cout << \"Pool [\" << url << \"]\" << std::endl;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvnx::addons::http_request_options_t opt;\n\t\t\t\t\t\topt.query[\"id\"] = info->reward_addr->to_string();\n\t\t\t\t\t\tconst auto data = http.get_json(url + \"/account/info\", opt).to_object();\n\t\t\t\t\t\tstd::cout << \"  Balance: \" << data[\"balance\"].to<double>() << \" MMX\" << std::endl;\n\t\t\t\t\t\tstd::cout << \"  Total Paid: \" << data[\"total_paid\"].to<double>() << \" MMX\" << std::endl;\n\t\t\t\t\t\tstd::cout << \"  Difficulty: \" << data[\"difficulty\"].to<uint64_t>() << std::endl;\n\t\t\t\t\t\tstd::cout << \"  Pool Share: \" << data[\"pool_share\"].to<float>() * 100 << \" %\" << std::endl;\n\t\t\t\t\t\tstd::cout << \"  Partial Rate: \" << data[\"partial_rate\"].to<float>() << \" per hour\" << std::endl;\n\t\t\t\t\t\tstd::cout << \"  Blocks Found: \" << data[\"blocks_found\"].to<int>() << std::endl;\n\t\t\t\t\t\tstd::cout << \"  Estimated Space: \" << data[\"estimated_space\"].to<float>() << \" TBe\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\tcatch(const std::exception& ex) {\n\t\t\t\t\t\tstd::cout << \"Failed with: \" << ex.what() << std::endl;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstd::cerr << \"Help: mmx \" << module << \" [info]\" << std::endl;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tstd::cerr << \"Help: mmx [node | wallet | farm | pool | harvester]\" << std::endl;\n\t\t}\n\t}\n\tcatch(const std::exception& ex) {\n\t\tvnx::log_error() << \"Failed with: \" << ex.what();\n\t\tgoto failed;\n\t}\n\n\tgoto exit;\nfailed:\n\tdid_fail = true;\nexit:\n\tvnx::close();\n\n\tmmx::secp256k1_free();\n\n\treturn did_fail ? -1 : 0;\n}\n\n\n"
  },
  {
    "path": "src/mmx_farmer.cpp",
    "content": "/*\n * mmx_farmer.cpp\n *\n *  Created on: Jan 7, 2022\n *      Author: mad\n */\n\n#include <mmx/Farmer.h>\n#include <mmx/Wallet.h>\n#include <mmx/Harvester.h>\n#include <mmx/ProofServer.h>\n\n#include <vnx/vnx.h>\n#include <vnx/Proxy.h>\n#include <vnx/Server.h>\n#include <vnx/Terminal.h>\n#include <vnx/TcpEndpoint.hxx>\n\n#ifdef WITH_CUDA\n#include <mmx/pos/cuda_recompute.h>\n#endif\n\n\nint main(int argc, char** argv)\n{\n\tmmx::secp256k1_init();\n\n\tstd::string mmx_home;\n\tstd::string mmx_network;\n\tif(auto path = ::getenv(\"MMX_HOME\")) {\n\t\tmmx_home = path;\n\t\tstd::cerr << \"MMX_HOME = \" << mmx_home << std::endl;\n\t}\n\tif(auto path = ::getenv(\"MMX_NETWORK\")) {\n\t\tmmx_network = path;\n\t\tstd::cerr << \"MMX_NETWORK = \" << mmx_network << std::endl;\n\t}\n\tvnx::Directory(mmx_network).create();\n\n\tvnx::write_config(\"mmx_farmer.log_file_path\", mmx_network + \"logs/\");\n\n\tstd::map<std::string, std::string> options;\n\toptions[\"n\"] = \"node\";\n\toptions[\"node\"] = \"address\";\n\n\tvnx::init(\"mmx_farmer\", argc, argv, options);\n\t{\n\t\tstd::string version;\n\t\tstd::string commit;\n\t\tvnx::read_config(\"build.version\", version);\n\t\tvnx::read_config(\"build.commit\", commit);\n\t\tvnx::log_info() << \"Build version: \" << version;\n\t\tvnx::log_info() << \"Build commit: \" << commit;\n\t}\n\n\tstd::string node_url = \":11330\";\n\tstd::string endpoint = \"0.0.0.0\";\t\t// requires allow_remote\n\tbool with_wallet = true;\n\tbool with_harvester = true;\n\tbool allow_remote = false;\n\n\tvnx::read_config(\"node\", node_url);\n\tvnx::read_config(\"endpoint\", endpoint);\n\tvnx::read_config(\"wallet\", with_wallet);\n\tvnx::read_config(\"harvester\", with_harvester);\n\tvnx::read_config(\"allow_remote\", allow_remote);\n\n#ifdef WITH_CUDA\n\tvnx::log_info() << \"CUDA available: yes\";\n\tmmx::pos::cuda_recompute_init();\n#else\n\tvnx::log_info() << \"CUDA available: no\";\n#endif\n\n\tif(!allow_remote) {\n\t\tendpoint = \"localhost\";\n\t}\n\tvnx::log_info() << \"Remote service access is: \" << (allow_remote ? \"enabled on \" + endpoint : \"disabled\");\n\n\tauto node = vnx::Endpoint::from_url(node_url);\n\tif(auto tcp = std::dynamic_pointer_cast<const vnx::TcpEndpoint>(node)) {\n\t\tif(!tcp->port || tcp->port == vnx::TcpEndpoint::default_port) {\n\t\t\tauto tmp = vnx::clone(tcp);\n\t\t\ttmp->port = 11330;\n\t\t\tnode = tmp;\n\t\t}\n\t}\n\tvnx::Handle<vnx::Proxy> proxy = new vnx::Proxy(\"Proxy\", node);\n\tproxy->default_access = \"NODE\";\t\t// allow Node to call Farmer without login\n\tproxy->forward_list = {\"Node\", \"Router\"};\n\n\t{\n\t\tvnx::Handle<vnx::Server> module = new vnx::Server(\"Server\", vnx::Endpoint::from_url(endpoint + \":11333\"));\n\t\tmodule->use_authentication = true;\n\t\tmodule->default_access = \"REMOTE\";\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\tvnx::Handle<vnx::Terminal> module = new vnx::Terminal(\"Terminal\");\n\t\tmodule.start_detached();\n\t}\n\tif(with_wallet) {\n\t\tvnx::Handle<mmx::Wallet> module = new mmx::Wallet(\"Wallet\");\n\t\tmodule->config_path = mmx_home + module->config_path;\n\t\tmodule->storage_path = mmx_home + module->storage_path;\n\t\tmodule->database_path = mmx_network + module->database_path;\n\t\tmodule.start_detached();\n\t\t{\n\t\t\tvnx::Handle<vnx::Server> module = new vnx::Server(\"Server5\", vnx::Endpoint::from_url(\"localhost:11335\"));\n\t\t\tmodule->use_authentication = true;\n\t\t\tmodule->default_access = \"USER\";\n\t\t\tmodule.start_detached();\n\t\t}\n\t} else {\n\t\tproxy->forward_list.push_back(\"Wallet\");\n\t}\n\t{\n\t\tvnx::Handle<mmx::Farmer> module = new mmx::Farmer(\"Farmer\");\n\t\tproxy->export_list.push_back(module->output_proofs);\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\tvnx::Handle<mmx::ProofServer> module = new mmx::ProofServer(\"ProofServer\");\n\t\tmodule.start_detached();\n\t}\n\tif(with_harvester) {\n\t\tvnx::Handle<mmx::Harvester> module = new mmx::Harvester(\"Harvester\");\n\t\tmodule->config_path = mmx_home + module->config_path;\n\t\tmodule->storage_path = mmx_network + module->storage_path;\n\t\tproxy->import_list.push_back(module->input_challenges);\n\t\tmodule.start_detached();\n\t} else {\n\t\tproxy->import_list.push_back(\"harvester.challenges\");\n\t}\n\n\tproxy.start();\n\n\tvnx::wait();\n\n#ifdef WITH_CUDA\n\tmmx::pos::cuda_recompute_shutdown();\n#endif\n\n\tmmx::secp256k1_free();\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "src/mmx_harvester.cpp",
    "content": "/*\n * mmx_harvester.cpp\n *\n *  Created on: Jan 7, 2022\n *      Author: mad\n */\n\n#include <mmx/Harvester.h>\n#include <mmx/pos/verify.h>\n\n#include <vnx/vnx.h>\n#include <vnx/Proxy.h>\n#include <vnx/Server.h>\n#include <vnx/Terminal.h>\n#include <vnx/TcpEndpoint.hxx>\n\n#ifdef WITH_CUDA\n#include <mmx/pos/cuda_recompute.h>\n#endif\n\n\nint main(int argc, char** argv)\n{\n\tstd::string mmx_home;\n\tstd::string mmx_network;\n\tif(auto path = ::getenv(\"MMX_HOME\")) {\n\t\tmmx_home = path;\n\t\tstd::cerr << \"MMX_HOME = \" << mmx_home << std::endl;\n\t}\n\tif(auto path = ::getenv(\"MMX_NETWORK\")) {\n\t\tmmx_network = path;\n\t\tstd::cerr << \"MMX_NETWORK = \" << mmx_network << std::endl;\n\t}\n\tvnx::Directory(mmx_network).create();\n\n\tvnx::write_config(\"mmx_harvester.log_file_path\", mmx_network + \"logs/\");\n\n\tstd::map<std::string, std::string> options;\n\toptions[\"n\"] = \"node\";\n\toptions[\"node\"] = \"address\";\n\n\tvnx::init(\"mmx_harvester\", argc, argv, options);\n\t{\n\t\tstd::string version;\n\t\tstd::string commit;\n\t\tvnx::read_config(\"build.version\", version);\n\t\tvnx::read_config(\"build.commit\", commit);\n\t\tvnx::log_info() << \"Build version: \" << version;\n\t\tvnx::log_info() << \"Build commit: \" << commit;\n\t}\n\n\tstd::string node_url = \":11333\";\n\tstd::string endpoint = \"0.0.0.0\";\t\t// requires allow_remote\n\tbool allow_remote = false;\n\tbool remote_compute = false;\n\n\tvnx::read_config(\"node\", node_url);\n\tvnx::read_config(\"endpoint\", endpoint);\n\tvnx::read_config(\"allow_remote\", allow_remote);\n\tvnx::read_config(\"remote_compute\", remote_compute);\n\n#ifdef WITH_CUDA\n\tvnx::log_info() << \"CUDA available: yes\";\n\tmmx::pos::cuda_recompute_init();\n#else\n\tvnx::log_info() << \"CUDA available: no\";\n#endif\n\n\tif(!allow_remote) {\n\t\tendpoint = \"localhost\";\n\t}\n\tvnx::log_info() << \"Remote service access is: \" << (allow_remote ? \"enabled on \" + endpoint : \"disabled\");\n\n\tvnx::write_config(\"mmx_pos.remote_compute\", remote_compute);\n\tvnx::log_info() << \"Remote compute is: \" << (remote_compute ? \"enabled\" : \"disabled\");\n\n\tauto node = vnx::Endpoint::from_url(node_url);\n\tif(auto tcp = std::dynamic_pointer_cast<const vnx::TcpEndpoint>(node)) {\n\t\tif(!tcp->port || tcp->port == vnx::TcpEndpoint::default_port) {\n\t\t\tauto tmp = vnx::clone(tcp);\n\t\t\ttmp->port = 11333;\n\t\t\tnode = tmp;\n\t\t}\n\t}\n\tvnx::Handle<vnx::Proxy> proxy = new vnx::Proxy(\"Proxy\", node);\n\tproxy->forward_list = {\"Node\", \"Farmer\", \"ProofServer\"};\n\n\t{\n\t\tvnx::Handle<vnx::Server> module = new vnx::Server(\"Server\", vnx::Endpoint::from_url(endpoint + \":11333\"));\n\t\tmodule->use_authentication = true;\n\t\tmodule->default_access = \"REMOTE\";\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\tvnx::Handle<vnx::Terminal> module = new vnx::Terminal(\"Terminal\");\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\tvnx::Handle<mmx::Harvester> module = new mmx::Harvester(\"Harvester\");\n\t\tmodule->config_path = mmx_home + module->config_path;\n\t\tmodule->storage_path = mmx_network + module->storage_path;\n\t\tproxy->import_list.push_back(module->input_challenges);\n\t\tproxy->export_list.push_back(module->output_info);\n\t\tproxy->export_list.push_back(module->output_proofs);\n\t\tproxy->export_list.push_back(module->output_lookups);\n\t\tproxy->export_list.push_back(module->output_partials);\n\t\tmodule.start_detached();\n\t}\n\n\tproxy.start();\n\n\tvnx::wait();\n\n#ifdef WITH_CUDA\n\tmmx::pos::cuda_recompute_shutdown();\n#endif\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "src/mmx_node.cpp",
    "content": "/*\n * mmx_node.cpp\n *\n *  Created on: Dec 10, 2021\n *      Author: mad\n */\n\n#include <mmx/Node.h>\n#include <mmx/Wallet.h>\n#include <mmx/TimeLord.h>\n#include <mmx/Farmer.h>\n#include <mmx/Harvester.h>\n#include <mmx/ProofServer.h>\n#include <mmx/Router.h>\n#include <mmx/WebAPI.h>\n#include <mmx/Qt_GUI.h>\n#include <mmx/WalletClient.hxx>\n#include <mmx/secp256k1.hpp>\n#include <mmx/utils.h>\n\n#include <sha256_ni.h>\n#include <sha256_arm.h>\n#include <sha256_avx2.h>\n\n#include <vnx/vnx.h>\n#include <vnx/Server.h>\n#include <vnx/Terminal.h>\n#include <vnx/TcpEndpoint.hxx>\n#include <vnx/addons/FileServer.h>\n#include <vnx/addons/HttpServer.h>\n#include <vnx/addons/HttpBalancer.h>\n\n#ifdef WITH_CUDA\n#include <mmx/pos/cuda_recompute.h>\n#endif\n\n\nint main(int argc, char** argv)\n{\n\tmmx::secp256k1_init();\n\n\tstd::string mmx_home;\n\tstd::string mmx_network;\n\tif(auto path = ::getenv(\"MMX_HOME\")) {\n\t\tmmx_home = path;\n\t\tstd::cerr << \"MMX_HOME = \" << mmx_home << std::endl;\n\t}\n\tif(auto path = ::getenv(\"MMX_NETWORK\")) {\n\t\tmmx_network = path;\n\t\tstd::cerr << \"MMX_NETWORK = \" << mmx_network << std::endl;\n\t}\n\tvnx::Directory(mmx_network).create();\n\n\tvnx::write_config(\"mmx_node.log_file_path\", mmx_network + \"logs/\");\n\n\tstd::map<std::string, std::string> options;\n\toptions[\"t\"] = \"timelord\";\n\n\tvnx::init(\"mmx_node\", argc, argv, options);\n\t{\n\t\tstd::string version;\n\t\tstd::string commit;\n\t\tvnx::read_config(\"build.version\", version);\n\t\tvnx::read_config(\"build.commit\", commit);\n\t\tvnx::log_info() << \"Build version: \" << version;\n\t\tvnx::log_info() << \"Build commit: \" << commit;\n\t}\n\n\tif(!vnx::is_config_protected(\"passwd\")) {\n\t\tthrow std::logic_error(\"missing config protection\");\n\t}\n\tconst auto params = mmx::get_params();\n\tconst auto api_token = mmx::hash_t::random().to_string();\n\n\tbool with_gui = false;\n\tbool with_farmer = true;\n\tbool with_wallet = true;\n\tbool with_timelord = true;\n\tbool with_harvester = true;\n\tbool allow_remote = false;\n\tuint32_t wapi_threads = 1;\n\tstd::string endpoint = \"0.0.0.0\";\t\t// requires allow_remote\n\n\tvnx::read_config(\"gui\", with_gui);\n\tvnx::read_config(\"wallet\", with_wallet);\n\tvnx::read_config(\"farmer\", with_farmer);\n\tvnx::read_config(\"timelord\", with_timelord);\n\tvnx::read_config(\"harvester\", with_harvester);\n\tvnx::read_config(\"allow_remote\", allow_remote);\n\tvnx::read_config(\"wapi_threads\", wapi_threads);\n\tvnx::read_config(\"endpoint\", endpoint);\n\n\tif(!allow_remote) {\n\t\tendpoint = \"localhost\";\n\t}\n\twapi_threads = std::max(std::min(wapi_threads, 256u), 1u);\n\n\tvnx::log_info() << \"AVX2 support:   \" << (avx2_available() ? \"yes\" : \"no\");\n\tvnx::log_info() << \"SHA-NI support: \" << (sha256_ni_available() ? \"yes\" : \"no\");\n#ifdef __aarch64__\n\tvnx::log_info() << \"ARM-SHA2 support: \" << (sha256_arm_available() ? \"yes\" : \"no\");\n#endif // __aarch64__\n\n#ifdef WITH_CUDA\n\tvnx::log_info() << \"CUDA available: yes\";\n\tmmx::pos::cuda_recompute_init();\n#else\n\tvnx::log_info() << \"CUDA available: no\";\n#endif\n\n\tvnx::log_info() << \"Remote service access is: \" << (allow_remote ? \"enabled on \" + endpoint : \"disabled\");\n\n\tif(!with_wallet) {\n\t\twith_farmer = false;\n\t}\n\tif(!with_farmer) {\n\t\twith_harvester = false;\n\t}\n\tvnx::write_config(\"farmer\", with_farmer);\n\tvnx::write_config(\"harvester\", with_harvester);\n\n\tmmx::sync_type_codes(mmx_network + \"type_codes\");\n\n\t{\n\t\tvnx::Handle<vnx::Terminal> module = new vnx::Terminal(\"Terminal\");\n\t\tmodule.start_detached();\n\t}\n\tstd::vector<vnx::Hash64> wapi_instances;\n\n\tfor(uint32_t i = 0; i < wapi_threads; ++i)\n\t{\n\t\tvnx::Handle<mmx::WebAPI> module = new mmx::WebAPI(\"WebAPI\" + std::string(wapi_threads > 1 ? \"_\" + std::to_string(i) : \"\"));\n\t\tvnx::read_config(\"WebAPI.config_path\", module->config_path);\n\t\tvnx::read_config(\"WebAPI.cache_max_age\", module->cache_max_age);\n\t\tmodule->config_path = mmx_home + module->config_path;\n\t\twapi_instances.push_back(module->vnx_get_id());\n\t\tmodule.start_detached();\n\t}\n\tif(wapi_instances.size() > 1) {\n\t\tvnx::Handle<vnx::addons::HttpBalancer> module = new vnx::addons::HttpBalancer(\"WebAPI\");\n\t\tmodule->backend = wapi_instances;\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\t// for remote farmer / timelord\n\t\tvnx::Handle<vnx::Server> module = new vnx::Server(\"Server0\", vnx::Endpoint::from_url(endpoint + \":11330\"));\n\t\tmodule->use_authentication = true;\n\t\tmodule->default_access = \"REMOTE\";\n\t\tmodule.start_detached();\n\t}\n\tif(with_wallet) {\n\t\t{\n\t\t\tvnx::Handle<mmx::Wallet> module = new mmx::Wallet(\"Wallet\");\n\t\t\tmodule->config_path = mmx_home + module->config_path;\n\t\t\tmodule->storage_path = mmx_home + module->storage_path;\n\t\t\tmodule->database_path = mmx_network + module->database_path;\n\t\t\tmodule.start_detached();\n\t\t}\n\t\t{\n\t\t\tvnx::Handle<vnx::Server> module = new vnx::Server(\"Server5\", vnx::Endpoint::from_url(\"localhost:11335\"));\n\t\t\tmodule->use_authentication = true;\n\t\t\tmodule->default_access = \"USER\";\n\t\t\tmodule.start_detached();\n\t\t}\n\t}\n\t{\n\t\tvnx::Handle<vnx::addons::FileServer> module = new vnx::addons::FileServer(\"FileServer_1\");\n\t\tmodule->www_root = \"www/web-gui/public/\";\n\t\tmodule->directory_files.push_back(\"index.html\");\n\t\tmodule.start_detached();\n\t}\n\tint http_port = 0;\n\tstd::string api_token_header;\n\t{\n\t\tvnx::Handle<vnx::addons::HttpServer> module = new vnx::addons::HttpServer(\"HttpServer\");\n\t\tmodule->default_access = \"NETWORK\";\n\t\tmodule->components[\"/server/\"] = \"HttpServer\";\n\t\tmodule->components[\"/wapi/\"] = \"WebAPI\";\n\t\tmodule->components[\"/api/node/\"] = \"Node\";\n\t\tmodule->components[\"/api/wallet/\"] = \"Wallet\";\n\t\tmodule->components[\"/api/farmer/\"] = \"Farmer\";\n\t\tmodule->components[\"/api/router/\"] = \"Router\";\n\t\tmodule->components[\"/api/harvester/\"] = \"Harvester\";\n\t\tmodule->components[\"/gui/\"] = \"FileServer_1\";\n\t\tif(with_gui) {\n\t\t\thttp_port = module->port;\n\t\t\tapi_token_header = module->token_header_name;\n\t\t\tmodule->token_map[api_token] = \"ADMIN\";\n\t\t}\n\t\tmodule.start_detached();\n\t}\n\tif(with_timelord) {\n\t\t{\n\t\t\tvnx::Handle<mmx::TimeLord> module = new mmx::TimeLord(\"TimeLord\");\n\t\t\tmodule->storage_path = mmx_network + module->storage_path;\n\t\t\tmodule.start_detached();\n\t\t}\n\t}\n\tif(with_farmer) {\n\t\t{\n\t\t\tvnx::Handle<mmx::Farmer> module = new mmx::Farmer(\"Farmer\");\n\t\t\tmodule.start_detached();\n\t\t}\n\t\t{\n\t\t\tvnx::Handle<mmx::ProofServer> module = new mmx::ProofServer(\"ProofServer\");\n\t\t\tmodule.start_detached();\n\t\t}\n\t\t{\n\t\t\t// for remote harvesters\n\t\t\tvnx::Handle<vnx::Server> module = new vnx::Server(\"Server3\", vnx::Endpoint::from_url(endpoint + \":11333\"));\n\t\t\tmodule->use_authentication = true;\n\t\t\tmodule->default_access = \"REMOTE\";\n\t\t\tmodule.start_detached();\n\t\t}\n\t}\n\tif(with_harvester) {\n\t\tvnx::Handle<mmx::Harvester> module = new mmx::Harvester(\"Harvester\");\n\t\tmodule->config_path = mmx_home + module->config_path;\n\t\tmodule->storage_path = mmx_network + module->storage_path;\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\tvnx::Handle<mmx::Node> module = new mmx::Node(\"Node\");\n\t\tmodule->storage_path = mmx_network + module->storage_path;\n\t\tmodule->database_path = mmx_network + module->database_path;\n\t\tmodule.start_detached();\n\t}\n\n\tif(with_gui) {\n\t\tconst auto host = \"localhost:\" + std::to_string(http_port);\n#ifdef WITH_QT\n\t\tqt_gui_exec(argv, host, api_token, api_token_header);\n#else\n\t\tvnx::log_warn() << \"No GUI available\";\n\t\tvnx::wait();\n#endif\n\t} else {\n\t\tvnx::wait();\n\t}\n\n\tvnx::close();\n\n#ifdef WITH_CUDA\n\tmmx::pos::cuda_recompute_shutdown();\n#endif\n\n\tmmx::secp256k1_free();\n\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "src/mmx_timelord.cpp",
    "content": "/*\n * mmx_timelord.cpp\n *\n *  Created on: Dec 6, 2021\n *      Author: mad\n */\n\n#include <mmx/TimeLord.h>\n#include <sha256_ni.h>\n#include <sha256_arm.h>\n\n#include <vnx/vnx.h>\n#include <vnx/Proxy.h>\n#include <vnx/Server.h>\n#include <vnx/Terminal.h>\n#include <vnx/TcpEndpoint.hxx>\n\n\nint main(int argc, char** argv)\n{\n\tmmx::secp256k1_init();\n\n\tstd::string mmx_home;\n\tstd::string mmx_network;\n\tif(auto path = ::getenv(\"MMX_HOME\")) {\n\t\tmmx_home = path;\n\t\tstd::cerr << \"MMX_HOME = \" << mmx_home << std::endl;\n\t}\n\tif(auto path = ::getenv(\"MMX_NETWORK\")) {\n\t\tmmx_network = path;\n\t\tstd::cerr << \"MMX_NETWORK = \" << mmx_network << std::endl;\n\t}\n\tvnx::Directory(mmx_network).create();\n\n\tstd::map<std::string, std::string> options;\n\toptions[\"n\"] = \"node\";\n\toptions[\"node\"] = \"address\";\n\n\tvnx::init(\"mmx_timelord\", argc, argv, options);\n\t{\n\t\tstd::string version;\n\t\tstd::string commit;\n\t\tvnx::read_config(\"build.version\", version);\n\t\tvnx::read_config(\"build.commit\", commit);\n\t\tvnx::log_info() << \"Build version: \" << version;\n\t\tvnx::log_info() << \"Build commit: \" << commit;\n\t}\n\n\tstd::string node_url = \":11330\";\n\n\tvnx::read_config(\"node\", node_url);\n\n\tvnx::log_info() << \"SHA-NI support: \" << (sha256_ni_available() ? \"yes\" : \"no\");\n#ifdef __aarch64__\n\tvnx::log_info() << \"ARM-SHA2 support: \" << (sha256_arm_available() ? \"yes\" : \"no\");\n#endif // __aarch64__\n\n\tauto node = vnx::Endpoint::from_url(node_url);\n\tif(auto tcp = std::dynamic_pointer_cast<const vnx::TcpEndpoint>(node)) {\n\t\tif(!tcp->port || tcp->port == vnx::TcpEndpoint::default_port) {\n\t\t\tauto tmp = vnx::clone(tcp);\n\t\t\ttmp->port = 11330;\n\t\t\tnode = tmp;\n\t\t}\n\t}\n\tvnx::Handle<vnx::Proxy> proxy = new vnx::Proxy(\"Proxy\", node);\n\tproxy->forward_list = {\"Node\", \"Wallet\"};\n\n\t{\n\t\tvnx::Handle<vnx::Server> module = new vnx::Server(\"Server\", vnx::Endpoint::from_url(\"localhost:11332\"));\n\t\tmodule->use_authentication = true;\n\t\tmodule->default_access = \"REMOTE\";\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\tvnx::Handle<vnx::Terminal> module = new vnx::Terminal(\"Terminal\");\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\tvnx::Handle<mmx::TimeLord> module = new mmx::TimeLord(\"TimeLord\");\n\t\tmodule->storage_path = mmx_network + module->storage_path;\n\t\tproxy->import_list.push_back(module->input_request);\n\t\tproxy->export_list.push_back(module->output_proofs);\n\t\tmodule.start_detached();\n\t}\n\n\tproxy.start();\n\n\tvnx::wait();\n\n\tmmx::secp256k1_free();\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "src/mmx_wallet.cpp",
    "content": "/*\n * mmx_wallet.cpp\n *\n *  Created on: Jan 7, 2022\n *      Author: mad\n */\n\n#include <mmx/Wallet.h>\n#include <mmx/WebAPI.h>\n#include <mmx/Qt_GUI.h>\n\n#include <vnx/addons/FileServer.h>\n#include <vnx/addons/HttpServer.h>\n\n#include <vnx/vnx.h>\n#include <vnx/Proxy.h>\n#include <vnx/Server.h>\n#include <vnx/Terminal.h>\n#include <vnx/TcpEndpoint.hxx>\n\n\nint main(int argc, char** argv)\n{\n\tmmx::secp256k1_init();\n\n\tstd::string mmx_home;\n\tstd::string mmx_network;\n\tif(auto path = ::getenv(\"MMX_HOME\")) {\n\t\tmmx_home = path;\n\t\tstd::cerr << \"MMX_HOME = \" << mmx_home << std::endl;\n\t}\n\tif(auto path = ::getenv(\"MMX_NETWORK\")) {\n\t\tmmx_network = path;\n\t\tstd::cerr << \"MMX_NETWORK = \" << mmx_network << std::endl;\n\t}\n\tvnx::Directory(mmx_network).create();\n\n\tstd::map<std::string, std::string> options;\n\toptions[\"n\"] = \"node\";\n\toptions[\"node\"] = \"address\";\n\n\tvnx::init(\"mmx_wallet\", argc, argv, options);\n\t{\n\t\tstd::string version;\n\t\tstd::string commit;\n\t\tvnx::read_config(\"build.version\", version);\n\t\tvnx::read_config(\"build.commit\", commit);\n\t\tvnx::log_info() << \"Build version: \" << version;\n\t\tvnx::log_info() << \"Build commit: \" << commit;\n\t}\n\n\tbool with_gui = false;\n\tstd::string node_url = \":11330\";\n\n\tvnx::read_config(\"gui\", with_gui);\n\tvnx::read_config(\"node\", node_url);\n\n\tvnx::write_config(\"farmer\", false);\n\tvnx::write_config(\"local_node\", false);\n\n\tconst auto api_token = mmx::hash_t::random().to_string();\n\n\tmmx::sync_type_codes(mmx_network + \"wallet/type_codes\");\n\n\tauto node = vnx::Endpoint::from_url(node_url);\n\tif(auto tcp = std::dynamic_pointer_cast<const vnx::TcpEndpoint>(node)) {\n\t\tif(!tcp->port || tcp->port == vnx::TcpEndpoint::default_port) {\n\t\t\tauto tmp = vnx::clone(tcp);\n\t\t\ttmp->port = 11330;\n\t\t\tnode = tmp;\n\t\t}\n\t}\n\tvnx::Handle<vnx::Proxy> proxy = new vnx::Proxy(\"Proxy\", node);\n\tproxy->forward_list = {\"Node\", \"Router\"};\n\n\t{\n\t\tvnx::Handle<vnx::Server> module = new vnx::Server(\"Server\", vnx::Endpoint::from_url(\"localhost:11335\"));\n\t\tmodule->use_authentication = true;\n\t\tmodule->default_access = \"USER\";\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\tvnx::Handle<vnx::Terminal> module = new vnx::Terminal(\"Terminal\");\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\tvnx::Handle<mmx::WebAPI> module = new mmx::WebAPI(\"WebAPI\");\n\t\tmodule->config_path = mmx_home + module->config_path;\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\tvnx::Handle<mmx::Wallet> module = new mmx::Wallet(\"Wallet\");\n\t\tmodule->config_path = mmx_home + module->config_path;\n\t\tmodule->storage_path = mmx_home + module->storage_path;\n\t\tmodule->database_path = mmx_network + module->database_path;\n\t\tmodule.start_detached();\n\t}\n\t{\n\t\tvnx::Handle<vnx::addons::FileServer> module = new vnx::addons::FileServer(\"FileServer_1\");\n\t\tmodule->www_root = \"www/web-gui/public/\";\n\t\tmodule->directory_files.push_back(\"index.html\");\n\t\tmodule.start_detached();\n\t}\n\tint http_port = 0;\n\tstd::string api_token_header;\n\t{\n\t\tvnx::Handle<vnx::addons::HttpServer> module = new vnx::addons::HttpServer(\"HttpServer\");\n\t\tmodule->default_access = \"NETWORK\";\n\t\tmodule->components[\"/server/\"] = \"HttpServer\";\n\t\tmodule->components[\"/wapi/\"] = \"WebAPI\";\n\t\tmodule->components[\"/api/node/\"] = \"Node\";\n\t\tmodule->components[\"/api/wallet/\"] = \"Wallet\";\n\t\tmodule->components[\"/api/router/\"] = \"Router\";\n\t\tmodule->components[\"/gui/\"] = \"FileServer_1\";\n\t\tif(with_gui) {\n\t\t\thttp_port = module->port;\n\t\t\tapi_token_header = module->token_header_name;\n\t\t\tmodule->token_map[api_token] = \"ADMIN\";\n\t\t}\n\t\tmodule.start_detached();\n\t}\n\n\tproxy.start();\n\n\tif(with_gui) {\n\t\tconst auto host = \"localhost:\" + std::to_string(http_port);\n#ifdef WITH_QT\n\t\tqt_gui_exec(argv, host, api_token, api_token_header);\n#else\n\t\tvnx::log_warn() << \"No GUI available\";\n\t\tvnx::wait();\n#endif\n\t} else {\n\t\tvnx::wait();\n\t}\n\n\tvnx::close();\n\n\tmmx::secp256k1_free();\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "src/mnemonic.cpp",
    "content": "/*\n * mnemonic.cpp\n *\n *  Created on: Sep 12, 2022\n *      Author: mad\n */\n\n#include <mmx/mnemonic.h>\n\n#include <vnx/Util.h>\n#include <algorithm>\n\n\nnamespace mmx {\nnamespace mnemonic {\n\nstd::vector<std::string> seed_to_words(const hash_t& seed, const std::vector<std::string>& wordlist)\n{\n\tif(wordlist.size() != 2048) {\n\t\tthrow std::logic_error(\"wordlist.size() != 2048\");\n\t}\n\tauto bits = seed.to_uint256();\n\tconst auto checksum = hash_t(bytes_t<32>().from_uint(bits, true))[0];\n\n\tstd::vector<std::string> words;\n\tfor(int i = 0; i < 24; ++i) {\n\t\tuint16_t index = 0;\n\t\tif(i == 0) {\n\t\t\tindex = (bits & 0x7) << 8;\n\t\t\tindex |= (checksum & 0xFF);\n\t\t\tbits >>= 3;\n\t\t} else {\n\t\t\tindex = (bits & 0x7FF);\n\t\t\tbits >>= 11;\n\t\t}\n\t\twords.push_back(wordlist[index]);\n\t}\n\tstd::reverse(words.begin(), words.end());\n\treturn words;\n}\n\nhash_t words_to_seed(const std::vector<std::string>& words, const std::vector<std::string>& wordlist)\n{\n\tif(words.size() != 24) {\n\t\tthrow std::logic_error(\"words.size() != 24\");\n\t}\n\tif(wordlist.size() != 2048) {\n\t\tthrow std::logic_error(\"wordlist.size() != 2048\");\n\t}\n\tstd::unordered_map<std::string, uint16_t> word_map;\n\tfor(size_t i = 0; i < wordlist.size(); ++i) {\n\t\tword_map[wordlist[i]] = i;\n\t}\n\tuint256_t seed = 0;\n\tuint8_t checksum = 0;\n\n\tfor(int i = 0; i < 24; ++i) {\n\t\tconst auto iter = word_map.find(words[i]);\n\t\tif(iter == word_map.end()) {\n\t\t\tthrow std::runtime_error(\"invalid mnemonic word: '\" + words[i] + \"'\");\n\t\t}\n\t\tif(i < 23) {\n\t\t\tseed <<= 11;\n\t\t\tseed |= iter->second;\n\t\t} else {\n\t\t\tseed <<= 3;\n\t\t\tseed |= (iter->second >> 8);\n\t\t\tchecksum = (iter->second & 0xFF);\n\t\t}\n\t}\n\tconst auto expect_le = hash_t(bytes_t<32>().from_uint(seed, false))[0];\n\tconst auto expect_be = hash_t(bytes_t<32>().from_uint(seed, true))[0];\n\tif(checksum != expect_le && checksum != expect_be) {\n\t\tthrow std::runtime_error(\"mnemonic checksum failed\");\n\t}\n\thash_t out;\n\tout.from_uint(seed);\n\treturn out;\n}\n\nstd::string words_to_string(const std::vector<std::string>& words)\n{\n\tstd::string out;\n\tfor(size_t i = 0; i < words.size(); ++i) {\n\t\tif(i) {\n\t\t\tout += \" \";\n\t\t}\n\t\tout += words[i];\n\t}\n\treturn out;\n}\n\nstd::vector<std::string> string_to_words(const std::string& phrase)\n{\n\treturn vnx::string_split(phrase, ' ', true);\n}\n\n\n} // mnemonic\n} // mmx\n"
  },
  {
    "path": "src/offer_data_t.cpp",
    "content": "/*\n * offer_data_t.cpp\n *\n *  Created on: Oct 12, 2022\n *      Author: mad\n */\n\n#include <mmx/offer_data_t.hxx>\n#include <mmx/trade_log_t.hxx>\n\n#include <uint256_t.h>\n#include <cmath>\n\n\nstatic double get_price(const mmx::uint128& inv_price)\n{\n\treturn pow(2, 64) / inv_price.to_double();\n}\n\nstatic mmx::uint128 get_bid_amount(const mmx::uint128& ask_amount, const mmx::uint128& inv_price)\n{\n\tconst auto bid_amount = (uint256_t(ask_amount) * inv_price) >> 64;\n\tif(bid_amount.upper()) {\n\t\tthrow std::logic_error(\"get_bid_amount(): bid amount overflow\");\n\t}\n\treturn bid_amount;\n}\n\nstatic mmx::uint128 get_ask_amount(const mmx::uint128& bid_amount, const mmx::uint128& inv_price)\n{\n\tconst auto ask_amount = ((uint256_t(bid_amount) << 64) + inv_price - 1) / inv_price;\n\tif(ask_amount.upper()) {\n\t\tthrow std::logic_error(\"get_ask_amount(): ask amount overflow\");\n\t}\n\treturn ask_amount;\n}\n\n\nnamespace mmx {\n\nvnx::bool_t offer_data_t::is_scam() const\n{\n\treturn bid_currency == ask_currency && inv_price < (uint128_t(1) << 64);\n}\n\nvnx::bool_t offer_data_t::is_open() const\n{\n\treturn bid_balance > 0;\n}\n\nvnx::float64_t offer_data_t::get_price() const\n{\n\treturn ::get_price(inv_price);\n}\n\nuint128 offer_data_t::get_bid_amount(const uint128& ask_amount) const\n{\n\treturn ::get_bid_amount(ask_amount, inv_price);\n}\n\nuint128 offer_data_t::get_ask_amount(const uint128& bid_amount) const\n{\n\treturn ::get_ask_amount(bid_amount, inv_price);\n}\n\n\nuint128 trade_log_t::get_bid_amount() const\n{\n\treturn ::get_bid_amount(ask_amount, inv_price);\n}\n\nvnx::float64_t trade_log_t::get_price() const\n{\n\treturn ::get_price(inv_price);\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/operation/Deposit.cpp",
    "content": "/*\n * Deposit.cpp\n *\n *  Created on: Apr 26, 2022\n *      Author: mad\n */\n\n#include <mmx/operation/Deposit.hxx>\n#include <mmx/write_bytes.h>\n\n\nnamespace mmx {\nnamespace operation {\n\nvnx::bool_t Deposit::is_valid() const\n{\n\treturn Super::is_valid() && amount > 0;\n}\n\nhash_t Deposit::calc_hash(const vnx::bool_t& full_hash) const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", \tversion);\n\twrite_field(out, \"address\", \taddress);\n\twrite_field(out, \"method\", \t\tmethod);\n\twrite_field(out, \"args\", \t\targs);\n\twrite_field(out, \"user\", \t\tuser);\n\twrite_field(out, \"currency\", \tcurrency);\n\twrite_field(out, \"amount\", \t\tamount);\n\n\tif(full_hash) {\n\t\twrite_field(out, \"solution\", solution);\n\t}\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\n\n} // operation\n} // mmx\n"
  },
  {
    "path": "src/operation/Execute.cpp",
    "content": "/*\n * Execute.cpp\n *\n *  Created on: May 9, 2022\n *      Author: mad\n */\n\n#include <mmx/operation/Execute.hxx>\n#include <mmx/write_bytes.h>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\nnamespace operation {\n\nvnx::bool_t Execute::is_valid() const\n{\n\tfor(const auto& arg : args) {\n\t\tif(!is_json(arg)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn Super::is_valid() && !method.empty();\n}\n\nhash_t Execute::calc_hash(const vnx::bool_t& full_hash) const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", version);\n\twrite_field(out, \"address\", address);\n\twrite_field(out, \"method\", \tmethod);\n\twrite_field(out, \"args\", \targs);\n\twrite_field(out, \"user\", \tuser);\n\n\tif(full_hash) {\n\t\twrite_field(out, \"solution\", solution);\n\t}\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nuint64_t Execute::calc_cost(std::shared_ptr<const ChainParams> params) const\n{\n\tuint64_t payload = method.size();\n\tfor(const auto& arg : args) {\n\t\tpayload += get_num_bytes(arg);\n\t}\n\treturn Super::calc_cost(params) + payload * params->min_txfee_byte;\n}\n\nvnx::Variant Execute::get_arg(const uint32_t& index) const\n{\n\tif(index < args.size()) {\n\t\treturn args[index];\n\t}\n\treturn vnx::Variant();\n}\n\n\n} // operation\n} // mmx\n"
  },
  {
    "path": "src/pos/Prover.cpp",
    "content": "/*\n * Prover.cpp\n *\n *  Created on: Feb 6, 2024\n *      Author: mad\n */\n\n#include <mmx/pos/Prover.h>\n#include <mmx/pos/encoding.h>\n#include <mmx/pos/verify.h>\n#include <mmx/pos/util.h>\n\n\nnamespace mmx {\nnamespace pos {\n\nProver::Prover(const std::string& file_path)\n\t:\tfile_path(file_path)\n{\n\tif(!vnx::File(file_path).exists()) {\n\t\tthrow std::logic_error(\"no such file\");\n\t}\n\theader = vnx::read_from_file<const PlotHeader>(file_path);\n\tif(!header) {\n\t\tthrow std::logic_error(\"invalid plot header\");\n\t}\n}\n\nstd::vector<proof_data_t> Prover::get_qualities(const hash_t& challenge, const int plot_filter) const\n{\n\tstd::ifstream file(file_path, std::ios_base::binary);\n\tif(!file.good()) {\n\t\tthrow std::runtime_error(\"failed to open file\");\n\t}\n\tconst uint32_t kmask = ((uint64_t(1) << header->ksize) - 1);\n\n\tconst uint32_t Y_begin = bytes_t<4>(challenge.data(), 4).to_uint<uint32_t>() & kmask;\n\n\tconst uint64_t Y_end = uint64_t(Y_begin) + (1 << plot_filter);\n\n\tif(debug) {\n\t\tstd::cout << \"get_qualities(\" << challenge.to_string() << \", \" << plot_filter << \")\" << std::endl;\n\t\tstd::cout << \"Y_begin = \" << Y_begin << \", Y_end = \" << Y_end << std::endl;\n\t}\n\tstd::vector<uint64_t> final_entries;\n\t{\n\t\tconst int32_t num_parks_y = cdiv<uint64_t>(header->num_entries_y, header->park_size_y);\n\n\t\tconst uint32_t Y_try_first = std::max<int64_t>(int64_t(Y_begin) + initial_y_shift, 0);\n\t\tint32_t park_index = ((uint64_t(Y_try_first >> 1) * header->num_entries_y) >> (header->ksize - 1)) / header->park_size_y;\n\n\t\tpark_index = std::min<int32_t>(park_index, num_parks_y - 1);\n\n\t\tstd::vector<uint64_t> bit_stream(cdiv(header->park_bytes_y - 4, 8));\n\n\t\tbool have_begin = false;\n\t\tfor(size_t i = 0; park_index >= 0 && park_index < num_parks_y; i++)\n\t\t{\n\t\t\tif(i > 100) {\n\t\t\t\tthrow std::runtime_error(\"failed to find Y park\");\n\t\t\t}\n\t\t\tfile.seekg(header->table_offset_y + uint64_t(park_index) * header->park_bytes_y);\n\n\t\t\tuint32_t Y_i = 0;\n\t\t\t{\n\t\t\t\tuint64_t tmp = 0;\n\t\t\t\tfile.read((char*)&tmp, 4);\n\t\t\t\tY_i = read_bits(&tmp, 0, header->ksize);\n\t\t\t}\n\t\t\tif(!file.good()) {\n\t\t\t\tthrow std::runtime_error(\"failed to read Y park header \" + std::to_string(park_index));\n\t\t\t}\n\t\t\tif(debug) {\n\t\t\t\tstd::cout << \"park_index = \" << park_index << \", Y = \" << Y_i << std::endl;\n\t\t\t}\n\t\t\tif(Y_i >= Y_end) {\n\t\t\t\tif(have_begin || park_index == 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(debug) {\n\t\t\t\t\tstd::cout << \"<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\" << std::endl;\n\t\t\t\t}\n\t\t\t\tpark_index = std::max<int32_t>(park_index - cdiv(Y_i - Y_begin, header->park_size_y) - 1, 0);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\thave_begin = true;\n\n\t\t\tfile.read((char*)bit_stream.data(), header->park_bytes_y - 4);\n\n\t\t\tif(!file.good()) {\n\t\t\t\tthrow std::runtime_error(\"failed to read Y park \" + std::to_string(park_index));\n\t\t\t}\n\t\t\tconst auto deltas = decode(bit_stream, header->park_size_y - 1);\n\n\t\t\tstd::vector<uint32_t> Y_list;\n\t\t\tY_list.reserve(header->park_size_y);\n\t\t\tY_list.push_back(Y_i);\n\t\t\tfor(const auto delta : deltas) {\n\t\t\t\tY_i += delta;\n\t\t\t\tY_list.push_back(Y_i);\n\t\t\t}\n\t\t\tbool is_end = false;\n\t\t\tfor(size_t i = 0; i < Y_list.size(); ++i)\n\t\t\t{\n\t\t\t\tconst auto& Y = Y_list[i];\n\t\t\t\tif(Y >= Y_end) {\n\t\t\t\t\tis_end = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(Y >= Y_begin) {\n\t\t\t\t\tconst uint64_t index = uint64_t(park_index) * header->park_size_y + i;\n\t\t\t\t\tif(index < header->num_entries_y) {\n\t\t\t\t\t\tfinal_entries.push_back(index);\n\t\t\t\t\t\tif(debug) {\n\t\t\t\t\t\t\tstd::cout << \"Y = \" << Y << \", index = \" << index << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(is_end) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tpark_index++;\n\t\t}\n\t}\n\tstd::vector<proof_data_t> result;\n\n\tstd::vector<uint64_t> meta_park;\n\tif(header->has_meta) {\n\t\tmeta_park.resize(cdiv(header->park_bytes_meta, 8));\n\t} else {\n\t\tfile.close();\n\t}\n\n\tfor(const auto final_index : final_entries)\n\t{\n\t\tproof_data_t out;\n\t\tif(header->has_meta) {\n\t\t\tconst uint64_t park_index =  final_index / header->park_size_meta;\n\t\t\tconst uint32_t park_offset = final_index % header->park_size_meta;\n\t\t\tfile.seekg(header->table_offset_meta + park_index * header->park_bytes_meta);\n\t\t\tfile.read((char*)meta_park.data(), header->park_bytes_meta);\n\t\t\tif(!file.good()) {\n\t\t\t\tthrow std::runtime_error(\"failed to read meta park \" + std::to_string(park_index));\n\t\t\t}\n\t\t\tuint32_t meta[N_META_OUT] = {};\n\t\t\tfor(int i = 0; i < N_META_OUT; ++i) {\n\t\t\t\tmeta[i] = read_bits(meta_park.data(), (park_offset * N_META_OUT + i) * header->ksize, header->ksize);\n\t\t\t}\n\t\t\tout.valid = true;\n\t\t\tout.index = final_index;\n\t\t\tout.meta = bytes_t<META_BYTES_OUT>(meta, META_BYTES_OUT);\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tout = get_full_proof(final_index);\n\t\t\t} catch(const std::exception& ex) {\n\t\t\t\tout.error_msg = ex.what();\n\t\t\t}\n\t\t}\n\t\tresult.push_back(out);\n\t}\n\treturn result;\n}\n\nproof_data_t Prover::get_full_proof(const uint64_t final_index) const\n{\n\tstd::ifstream file(file_path, std::ios_base::binary);\n\tif(!file.good()) {\n\t\tthrow std::runtime_error(\"failed to open file\");\n\t}\n\tstd::vector<uint32_t> X_values;\n\tstd::vector<uint64_t> pointers;\n\tpointers.push_back(final_index);\n\n\tstd::vector<uint64_t> pd_park(cdiv(header->park_bytes_pd, 8));\n\n\tint table = N_TABLE;\n\tfor(const auto pd_offset : header->table_offset_pd)\n\t{\n\t\tstd::vector<uint64_t> new_pointers;\n\t\tfor(const auto index : pointers)\n\t\t{\n\t\t\tconst uint64_t park_index =  index / header->park_size_pd;\n\t\t\tconst uint32_t park_offset = index % header->park_size_pd;\n\t\t\tfile.seekg(pd_offset + park_index * header->park_bytes_pd);\n\t\t\tfile.read((char*)pd_park.data(), header->park_bytes_pd);\n\t\t\tif(!file.good()) {\n\t\t\t\tthrow std::runtime_error(\"failed to read PD park \" + std::to_string(park_index) + \" at table \" + std::to_string(table)); \n\t\t\t}\n\t\t\tconst uint64_t position = read_bits(pd_park.data(), park_offset * header->ksize, header->ksize);\n\t\t\tnew_pointers.push_back(position);\n\n\t\t\tconst auto offsets = decode(pd_park, park_offset + 1, header->park_size_pd * header->ksize);\n\t\t\tnew_pointers.push_back(position + offsets.back());\n\t\t}\n\t\tif(debug) {\n\t\t\tstd::cout << \"T\" << (table - 1) << \" pointers: \";\n\t\t\tfor(auto ptr : new_pointers) {\n\t\t\t\tstd::cout << ptr << \" \";\n\t\t\t}\n\t\t\tstd::cout << std::endl;\n\t\t}\n\t\tpointers = new_pointers;\n\t\ttable--;\n\t}\n\tproof_data_t out;\n\tout.index = final_index;\n\n\tstd::vector<uint64_t> x_park(cdiv(header->park_bytes_x, 8));\n\n\tfor(const auto index : pointers)\n\t{\n\t\tconst uint64_t park_index =  index / header->park_size_x;\n\t\tconst uint32_t park_offset = index % header->park_size_x;\n\t\tfile.seekg(header->table_offset_x + park_index * header->park_bytes_x);\n\t\tfile.read((char*)x_park.data(), header->park_bytes_x);\n\t\tif(!file.good()) {\n\t\t\tthrow std::runtime_error(\"failed to read X park \" + std::to_string(park_index));\n\t\t}\n\t\tconst uint64_t line_point = read_bits(x_park.data(), park_offset * header->entry_bits_x, header->entry_bits_x);\n\n\t\tif(table == 2) {\n\t\t\tconst auto pair = (header->xbits < header->ksize) ? LinePointToSquare2(line_point) : LinePointToSquare(line_point);\n\t\t\tX_values.push_back(pair.first);\n\t\t\tX_values.push_back(pair.second);\n\t\t} else {\n\t\t\tthrow std::logic_error(\"X table \" + std::to_string(table) + \" not supported\");\n\t\t}\n\t}\n\n\tif(debug) {\n\t\tstd::cout << \"X_values = \";\n\t\tfor(auto X : X_values) {\n\t\t\tstd::cout << X << \" \";\n\t\t}\n\t\tstd::cout << std::endl;\n\t}\n\tstd::vector<uint32_t> X_out;\n\tconst auto res = compute(X_values, &X_out, header->plot_id, header->ksize, header->ksize - header->xbits);\n\tif(res.empty()) {\n\t\tthrow std::logic_error(\"found no valid proof\");\n\t}\n\tif(res.size() > 1) {\n\t\tthrow std::logic_error(\"got more than one proof\");\n\t}\n\tout.valid = true;\n\tout.proof = X_out;\n\tout.meta = res[0].second;\n\treturn out;\n}\n\n\n} // pos\n} // mmx\n"
  },
  {
    "path": "src/pos/cuda_recompute.cu",
    "content": "/*\n * mem_hash.cu\n *\n *  Created on: Feb 2, 2025\n *      Author: mad\n */\n\n#include <mmx/pos/cuda_recompute.h>\n#include <mmx/pos/verify.h>\n#include <vnx/ThreadPool.h>\n#include <vnx/vnx.h>\n\n#include <cuda_sha512.h>\n#include <cuda_runtime.h>\n\n#include <mutex>\n#include <tuple>\n#include <queue>\n#include <atomic>\n#include <thread>\n#include <stdexcept>\n#include <algorithm>\n#include <unordered_map>\n#include <condition_variable>\n\n\n__device__ inline\nuint32_t cuda_rotl_32(const uint32_t w, const uint32_t c) {\n\treturn __funnelshift_l(w, w, c);\n}\n\n#define MMXPOS_HASHROUND(a, b, c, d) \\\n\ta = a + b;              \\\n\td = cuda_rotl_32(d ^ a, 16); \\\n\tc = c + d;              \\\n\tb = cuda_rotl_32(b ^ c, 12); \\\n\ta = a + b;              \\\n\td = cuda_rotl_32(d ^ a, 8);  \\\n\tc = c + d;              \\\n\tb = cuda_rotl_32(b ^ c, 7);\n\n\n__device__\nstatic const uint32_t MEM_HASH_INIT[16] = {\n\t0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n\t0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174\n};\n\n__global__\nvoid cuda_gen_mem_array(uint4* mem_out, uint4* key_out, uint32_t* X_out, const uint32_t* X_in, const uint32_t* ID_in,\n\t\t\t\t\t\tconst int xbits, const uint32_t y_0)\n{\n\tconst uint32_t x = threadIdx.x;\n\tconst uint32_t y = blockIdx.x;\n\tconst uint32_t z = blockIdx.y;\n\tconst uint32_t out = ((z * gridDim.x + y) * blockDim.x) + x;\n\tconst uint32_t num_entries = gridDim.y * gridDim.x * blockDim.x;\n\n\tconst uint32_t X_i = (X_in[z * blockDim.x + x] << xbits) | (y_0 + y);\n\tX_out[out] = X_i;\n\n\t__align__(8) uint32_t msg[32] = {};\n\n\tmsg[0] = X_i;\n\n\tfor(int i = 0; i < 8; ++i) {\n\t\tmsg[1 + i] = ID_in[z * 8 + i];\n\t}\n\t__align__(8) uint32_t key[16] = {};\n\n\tcuda_sha512((uint64_t*)msg, 4 + 32, (uint64_t*)key);\n\n\tfor(int i = 0; i < 4; ++i) {\n\t\tkey_out[out * 4 + i] = make_uint4(key[i * 4 + 0], key[i * 4 + 1], key[i * 4 + 2], key[i * 4 + 3]);\n\t}\n\n\tuint32_t state[32];\n\tfor(int i = 0; i < 16; ++i) {\n\t\tstate[i] = key[i];\n\t}\n\tfor(int i = 0; i < 16; ++i) {\n\t\tstate[16 + i] = MEM_HASH_INIT[i];\n\t}\n\n\tuint32_t b = 0;\n\tuint32_t c = 0;\n\n\tfor(uint32_t i = 0; i < 32; ++i)\n\t{\n\t\tfor(int j = 0; j < 4; ++j) {\n#pragma unroll\n\t\t\tfor(int k = 0; k < 16; ++k) {\n\t\t\t\tMMXPOS_HASHROUND(state[k], b, c, state[16 + k]);\n\t\t\t}\n\t\t}\n\n#pragma unroll\n\t\tfor(int k = 0; k < 8; ++k) {\n\t\t\tmem_out[(uint64_t(i) * num_entries + out) * 8 + k] =\n\t\t\t\t\tmake_uint4(state[k * 4 + 0], state[k * 4 + 1], state[k * 4 + 2], state[k * 4 + 3]);\n\t\t}\n\t}\n}\n\n__global__\nvoid cuda_calc_mem_hash(uint32_t* mem, uint32_t* hash, const int num_iter)\n{\n\tconst uint32_t x = threadIdx.x;\n\tconst uint32_t k = threadIdx.y;\n\tconst uint32_t y = (blockIdx.z * gridDim.y + blockIdx.y) * blockDim.y + threadIdx.y;\n\tconst uint32_t num_entries = (gridDim.z * blockDim.z) * (gridDim.y * blockDim.y);\n\n\tstatic constexpr int N = 32;\n\n\t__shared__ uint32_t lmem[4][N*N];\n\n\tfor(int i = 0; i < N; ++i) {\n\t\tlmem[k][i * N + x] = mem[(uint64_t(i) * num_entries + y) * N + x];\n\t}\n\t__syncwarp();\n\n\tuint32_t state = lmem[k][(N - 1) * N + x];\n\n\t__syncwarp();\n\n\tfor(int iter = 0; iter < num_iter; ++iter)\n\t{\n\t\tuint32_t sum = cuda_rotl_32(state, x % 32);\n\n\t\tfor(int offset = 16; offset > 0; offset /= 2) {\n\t\t\tsum += __shfl_down_sync(0xFFFFFFFF, sum, offset);\n\t\t}\n\t\tuint32_t dir = 0;\n\t\tif(x == 0) {\n\t\t\tdir = sum + (sum << 11) + (sum << 22);\n\t\t}\n\t\tsum = __shfl_sync(0xFFFFFFFF, sum, 0);\n\t\tdir = __shfl_sync(0xFFFFFFFF, dir, 0);\n\n\t\tconst uint32_t bits = (dir >> 22) % 32u;\n\t\tconst uint32_t offset = (dir >> 27);\n\n\t\tstate += cuda_rotl_32(lmem[k][offset * N + (iter + x) % N], bits) ^ sum;\n\n\t\t__syncwarp();\n\n\t\tatomicXor(&lmem[k][offset * N + x], state);\n\n\t\t__syncwarp();\n\t}\n\n\thash[y * N + x] = state;\n}\n\n__global__\nvoid cuda_final_mem_hash(uint4* hash_out, uint32_t* Y_out, const uint4* mem_hash, const uint4* key_in, const uint32_t KMASK)\n{\n\tconst uint32_t x = blockIdx.x * blockDim.x + threadIdx.x;\n\n\t__align__(8) uint32_t msg[64] = {};\n\n\tfor(int i = 0; i < 4; ++i) {\n\t\tconst auto tmp = key_in[x * 4 + i];\n\t\tmsg[i * 4 + 0] = tmp.x;\n\t\tmsg[i * 4 + 1] = tmp.y;\n\t\tmsg[i * 4 + 2] = tmp.z;\n\t\tmsg[i * 4 + 3] = tmp.w;\n\t}\n\tfor(int i = 0; i < 8; ++i) {\n\t\tconst auto tmp = mem_hash[x * 8 + i];\n\t\tmsg[16 + i * 4 + 0] = tmp.x;\n\t\tmsg[16 + i * 4 + 1] = tmp.y;\n\t\tmsg[16 + i * 4 + 2] = tmp.z;\n\t\tmsg[16 + i * 4 + 3] = tmp.w;\n\t}\n\t__align__(8) uint32_t hash[16] = {};\n\n\tcuda_sha512((uint64_t*)msg, 64 + 128, (uint64_t*)hash);\n\n\tuint32_t Y_i = 0;\n\tfor(int i = 0; i < mmx::pos::N_META; ++i) {\n\t\tY_i = Y_i ^ hash[i];\n\t\thash[i] = hash[i] & KMASK;\n\t}\n\tfor(int i = mmx::pos::N_META; i < 16; ++i) {\n\t\thash[i] = 0;\n\t}\n\tY_i &= KMASK;\n\n\tfor(int i = 0; i < 4; ++i) {\n\t\thash_out[x * 4 + i] = make_uint4(hash[i * 4 + 0], hash[i * 4 + 1], hash[i * 4 + 2], hash[i * 4 + 3]);\n\t}\n\tY_out[x] = Y_i;\n}\n\n\nnamespace mmx {\nnamespace pos {\n\nstruct device_t {\n\n\tint index = -1;\n\tbool failed = false;\n\tuint64_t buffer_size = 0;\n\n\tuint32_t* X_buf = nullptr;\t\t\t//    4 bytes\n\tuint32_t* ID_buf = nullptr;\t\t\t//   32 bytes\n\n\tuint32_t* X_dev = nullptr;\t\t\t//    4 bytes\n\tuint32_t* X_out = nullptr;\t\t\t//    4 bytes\n\tuint32_t* ID_dev = nullptr;\t\t\t//   32 bytes\n\tuint32_t* key_dev = nullptr;\t\t//   64 bytes\n\tuint32_t* mem_dev = nullptr;\t\t// 4096 bytes\n\tuint32_t* hash_dev = nullptr;\t\t//  128 bytes\n\tuint32_t* M_dev = nullptr;\t\t\t//   64 bytes\n\tuint32_t* Y_dev = nullptr;\t\t\t//    4 bytes\n\n\tuint32_t* Y_buf = nullptr;\t\t\t//    4 bytes\n\tuint32_t* M_buf = nullptr;\t\t\t//   64 bytes\n\n\tstd::thread thread;\n\n};\n\nstruct request_t {\n\n\tuint64_t id = 0;\n\tint ksize = 0;\n\tint xbits = 0;\n\thash_t plot_id;\n\tstd::vector<uint32_t> x_values;\n\n\tstd::vector<uint32_t> X_tmp;\n\tstd::vector<uint32_t> Y_tmp;\n\tstd::vector<std::array<uint32_t, N_META>> M_tmp;\n\n};\n\nclass hardware_error_t : public std::runtime_error {\npublic:\n\thardware_error_t(const std::string& msg) : runtime_error(msg) {}\n};\n\nstatic std::mutex g_mutex;\nstatic std::condition_variable g_result_signal;\nstatic std::condition_variable g_request_signal;\n\nstatic std::atomic<bool> do_run {true};\nstatic std::atomic<bool> have_init {false};\nstatic std::atomic<int> have_cuda {0};\nstatic std::vector<cuda_device_t> g_device_list;\nstatic std::vector<std::shared_ptr<device_t>> g_devices;\n\nstatic std::atomic<uint64_t> next_request_id {1};\nstatic std::deque<std::tuple<int, int>> g_order_queue;\nstatic std::unordered_map<uint64_t, std::shared_ptr<const cuda_result_t>> g_result_map;\nstatic std::map<std::tuple<int, int>, std::queue<std::shared_ptr<request_t>>> g_wait_map;\n\nstatic std::shared_ptr<vnx::ThreadPool> g_cpu_threads;\n\n\ninline void cuda_check(const cudaError_t& code) {\n\tif(code != cudaSuccess) {\n\t\tthrow hardware_error_t(std::string(cudaGetErrorString(code)));\n\t}\n}\n\nbool have_cuda_recompute() {\n\treturn do_run && have_cuda > 0;\n}\n\nstd::vector<cuda_device_t> get_cuda_devices()\n{\n\tint num_devices = 0;\n\tcudaGetDeviceCount(&num_devices);\n\n\tstd::vector<cuda_device_t> list;\n\tfor(int i = 0; i < num_devices; ++i) {\n\t\tcudaDeviceProp info;\n\t\tcudaGetDeviceProperties(&info, i);\n\t\tif(info.major >= 5) {\n\t\t\tcuda_device_t dev;\n\t\t\tdev.index = i;\n\t\t\tdev.name = info.name;\n\t\t\tdev.max_resident = info.multiProcessorCount * info.maxThreadsPerMultiProcessor;\n\t\t\tlist.push_back(dev);\n\t\t}\n\t}\n\treturn list;\n}\n\nstd::vector<cuda_device_t> get_cuda_devices_used()\n{\n\tif(!have_init) {\n\t\tcuda_recompute_init();\n\t}\n\tstd::lock_guard<std::mutex> lock(g_mutex);\n\treturn g_device_list;\n}\n\nstatic void cuda_recompute_loop(std::shared_ptr<device_t> dev);\n\nvoid cuda_recompute_init(bool enable, std::vector<int> device_list)\n{\n\tstd::lock_guard<std::mutex> lock(g_mutex);\n\tif(have_init) {\n\t\treturn;\n\t}\n\thave_init = true;\n\n\tif(device_list.empty()) {\n\t\tvnx::read_config(\"cuda.devices\", device_list);\n\t}\n\tvnx::read_config(\"cuda.enable\", enable);\n\n\tif(!enable) {\n\t\tvnx::log_info() << \"CUDA compute is disabled\";\n\t\treturn;\n\t}\n\tauto list = get_cuda_devices();\n\n\tif(device_list.empty()) {\n\t\tg_device_list = list;\n\t} else {\n\t\tfor(size_t i : device_list) {\n\t\t\tif(i < list.size()) {\n\t\t\t\tg_device_list.push_back(list[i]);\n\t\t\t}\n\t\t}\n\t}\n\tconst auto num_threads = std::max(std::thread::hardware_concurrency(), 4u);\n\tg_cpu_threads = std::make_shared<vnx::ThreadPool>(num_threads, num_threads);\n\n\tvnx::log_info() << \"Using \" << num_threads << \" CPU threads for CUDA recompute\";\n\n\tfor(auto& info : g_device_list)\n\t{\n\t\tinfo.buffer_size = 256;\n\t\twhile(info.buffer_size < info.max_resident) {\n\t\t\tinfo.buffer_size <<= 1;\n\t\t}\n\t\tinfo.buffer_size /= 2;\n\n\t\tconst int num_threads = (info.max_resident * 3 + info.buffer_size - 1) / info.buffer_size;\n\n\t\tfor(int i = 0; i < num_threads; ++i) {\n\t\t\tauto dev = std::make_shared<device_t>();\n\t\t\tdev->index = info.index;\n\t\t\tdev->buffer_size = info.buffer_size;\n\t\t\tdev->thread = std::thread(&cuda_recompute_loop, dev);\n\t\t\tg_devices.push_back(dev);\n\t\t}\n\t\tvnx::log_info() << \"Using CUDA device [\" << info.index << \"] '\" << info.name\n\t\t\t\t<< \"' with threads \" << info.max_resident << \", buffer \" << info.buffer_size << \"x\" << num_threads;\n\t}\n\thave_cuda = g_devices.size();\n\n\tif(!have_cuda) {\n\t\tif(list.empty()) {\n\t\t\tvnx::log_info() << \"No CUDA devices found!\";\n\t\t} else {\n\t\t\tvnx::log_info() << \"No CUDA devices enabled!\";\n\t\t}\n\t}\n}\n\nvoid cuda_recompute_shutdown()\n{\n\t{\n\t\tstd::lock_guard<std::mutex> lock(g_mutex);\n\t\tdo_run = false;\n\t}\n\tg_request_signal.notify_all();\n\n\tfor(auto dev : g_devices) {\n\t\tdev->thread.join();\n\t}\n\tg_devices.clear();\n\tg_device_list.clear();\n}\n\nuint64_t cuda_recompute(const int ksize, const int xbits, const hash_t& plot_id, const std::vector<uint32_t>& x_values)\n{\n\tif(ksize < 8 || ksize > 32) {\n\t\tthrow std::logic_error(\"invalid ksize\");\n\t}\n\tif(xbits < 0 || xbits > 20 || xbits + 8 >= ksize) {\n\t\tthrow std::logic_error(\"invalid xbits\");\n\t}\n\tif(x_values.size() != 256) {\n\t\tthrow std::logic_error(\"invalid x_values\");\n\t}\n\tif(!have_init) {\n\t\tcuda_recompute_init();\n\t}\n\tconst std::tuple<int, int> type(ksize, xbits);\n\n\tauto req = std::make_shared<request_t>();\n\treq->id = next_request_id++;\n\treq->ksize = ksize;\n\treq->xbits = xbits;\n\treq->plot_id = plot_id;\n\treq->x_values = x_values;\n\t{\n\t\tstd::lock_guard<std::mutex> lock(g_mutex);\n\t\tif(!do_run || have_cuda <= 0) {\n\t\t\tthrow std::logic_error(\"no CUDA devices available\");\n\t\t}\n\t\tif(std::find(g_order_queue.begin(), g_order_queue.end(), type) == g_order_queue.end()) {\n\t\t\tg_order_queue.push_back(type);\n\t\t}\n\t\tg_wait_map[type].push(req);\n\t}\n\tg_request_signal.notify_all();\n\treturn req->id;\n}\n\nstd::shared_ptr<const cuda_result_t> cuda_recompute_poll(const std::set<uint64_t>& jobs)\n{\n\twhile(true) {\n\t\tstd::unique_lock<std::mutex> lock(g_mutex);\n\t\tif(!g_result_map.empty()) {\n\t\t\tfor(const auto id : jobs) {\n\t\t\t\tconst auto iter = g_result_map.find(id);\n\t\t\t\tif(iter != g_result_map.end()) {\n\t\t\t\t\tconst auto res = iter->second;\n\t\t\t\t\tg_result_map.erase(iter);\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(!do_run) {\n\t\t\tthrow std::logic_error(\"shutdown\");\n\t\t}\n\t\tg_result_signal.wait(lock);\n\t}\n}\n\nstatic void cuda_finish_cpu(std::shared_ptr<request_t> req)\n{\n\tauto res = std::make_shared<cuda_result_t>();\n\tres->id = req->id;\n\ttry {\n\t\tstd::vector<uint32_t> X_out;\n\t\tconst auto entries = compute_full(req->X_tmp, req->Y_tmp, req->M_tmp, &X_out, req->plot_id, req->ksize);\n\t\tres->X = std::move(X_out);\n\t\tres->entries = entries;\n\t}\n\tcatch(const std::exception& ex) {\n\t\tres->failed = true;\n\t\tres->error = ex.what();\n\t}\n\t{\n\t\tstd::lock_guard<std::mutex> lock(g_mutex);\n\t\tg_result_map[res->id] = res;\n\t}\n\tg_result_signal.notify_all();\n}\n\nstatic void cuda_recompute_loop(std::shared_ptr<device_t> dev)\n{\n\tcudaStream_t stream;\n\ttry {\n\t\tcuda_check(cudaSetDevice(dev->index));\n\t\tcuda_check(cudaDeviceSynchronize());\n\t\tcuda_check(cudaSetDeviceFlags(cudaDeviceScheduleBlockingSync));\n\t\tcuda_check(cudaStreamCreate(&stream));\n\n\t\tcuda_check(cudaMallocHost(&dev->X_buf,  dev->buffer_size * 4));\n\t\tcuda_check(cudaMallocHost(&dev->Y_buf,  dev->buffer_size * 4));\n\t\tcuda_check(cudaMallocHost(&dev->ID_buf, dev->buffer_size / 256 * 32));\n\t\tcuda_check(cudaMallocHost(&dev->M_buf,  dev->buffer_size * 64));\n\n\t\tcuda_check(cudaMalloc(&dev->X_dev, \t\tdev->buffer_size * 4));\n\t\tcuda_check(cudaMalloc(&dev->X_out, \t\tdev->buffer_size * 4));\n\t\tcuda_check(cudaMalloc(&dev->ID_dev, \tdev->buffer_size / 256 * 32));\n\t\tcuda_check(cudaMalloc(&dev->key_dev, \tdev->buffer_size * 64));\n\t\tcuda_check(cudaMalloc(&dev->mem_dev, \tdev->buffer_size * 4096));\n\t\tcuda_check(cudaMalloc(&dev->hash_dev, \tdev->buffer_size * 128));\n\t\tcuda_check(cudaMalloc(&dev->M_dev, \t\tdev->buffer_size * 64));\n\t\tcuda_check(cudaMalloc(&dev->Y_dev, \t\tdev->buffer_size * 4));\n\t}\n\tcatch(const std::exception& ex) {\n\t\tdev->failed = true;\n\t\tvnx::log_error() << \"CUDA: failed to allocate memory for device \" << dev->index << \": \" << ex.what();\n\t\tgoto failed;\n\t}\n\n\twhile(do_run) {\n\t\tstd::unique_lock<std::mutex> lock(g_mutex);\n\t\twhile(do_run && g_order_queue.empty()) {\n\t\t\tg_request_signal.wait(lock);\n\t\t}\n\t\tif(!do_run) {\n\t\t\tbreak;\n\t\t}\n\t\tconst auto type = g_order_queue.front();\n\t\tg_order_queue.pop_front();\n\n\t\tconst auto ksize = std::get<0>(type);\n\t\tconst auto xbits = std::get<1>(type);\n\t\tconst auto req_size = uint64_t(256) << xbits;\n\n\t\tuint64_t alloc_sum = 0;\n\t\tstd::vector<std::shared_ptr<request_t>> req_list;\n\t\treq_list.reserve(dev->buffer_size / req_size);\n\t\t{\n\t\t\tauto& req_queue = g_wait_map[type];\n\t\t\twhile(!req_queue.empty()) {\n\t\t\t\tif(!alloc_sum || alloc_sum + req_size <= dev->buffer_size) {\n\t\t\t\t\treq_list.push_back(req_queue.front());\n\t\t\t\t\talloc_sum += req_size;\n\t\t\t\t\treq_queue.pop();\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!req_queue.empty()) {\n\t\t\t\tg_order_queue.push_back(type);\n\t\t\t}\n\t\t}\n\t\tlock.unlock();\n\n\t\tuint32_t num_iter = 1;\n\t\twhile(req_size / num_iter > dev->buffer_size) {\n\t\t\tnum_iter <<= 1;\n\t\t}\n\t\tconst uint64_t N = (1u << xbits) / num_iter;\n\t\tconst uint64_t M = req_list.size();\n\t\tconst uint64_t grid_size = uint64_t(256) * N * M;\n\t\tconst uint32_t KMASK = (uint64_t(1) << ksize) - 1;\n\n\t\tstd::unordered_set<uint32_t> x_set;\n\n\t\tfor(uint64_t i = 0; i < M; ++i) {\n\t\t\tconst auto& req = req_list[i];\n\t\t\treq->X_tmp.resize(req_size);\n\t\t\treq->Y_tmp.resize(req_size);\n\t\t\treq->M_tmp.resize(req_size);\n\t\t\tfor(auto& x : req->x_values) {\n\t\t\t\twhile(!x_set.insert(x).second) {\n\t\t\t\t\tx++;\t// avoid duplicate inputs\n\t\t\t\t}\n\t\t\t}\n\t\t\t::memcpy(dev->X_buf + i * 256, req->x_values.data(), 256 * 4);\n\t\t\t::memcpy(dev->ID_buf + i * 8, req->plot_id.data(), 32);\n\t\t\tx_set.clear();\n\t\t}\n\n\t\tcudaMemcpyAsync(dev->X_dev, dev->X_buf,   M * 256 * 4, cudaMemcpyHostToDevice, stream);\n\t\tcudaMemcpyAsync(dev->ID_dev, dev->ID_buf, M * 32,      cudaMemcpyHostToDevice, stream);\n\n\t\tfor(uint32_t iter = 0; iter < num_iter; ++iter)\n\t\t{\n\t\t\tconst uint64_t y_0 = iter * N;\n\t\t\t{\n\t\t\t\tdim3 block(256, 1);\n\t\t\t\tdim3 grid(N, M);\n\t\t\t\tcuda_gen_mem_array<<<grid, block, 0, stream>>>(\n\t\t\t\t\t\t(uint4*)dev->mem_dev,\n\t\t\t\t\t\t(uint4*)dev->key_dev,\n\t\t\t\t\t\tdev->X_out,\n\t\t\t\t\t\tdev->X_dev,\n\t\t\t\t\t\tdev->ID_dev,\n\t\t\t\t\t\txbits, y_0);\n\t\t\t}\n\t\t\t{\n\t\t\t\tdim3 block(32, 4);\n\t\t\t\tdim3 grid(1, grid_size / block.y / 64, 64);\n\t\t\t\tcuda_calc_mem_hash<<<grid, block, 0, stream>>>(\n\t\t\t\t\t\tdev->mem_dev,\n\t\t\t\t\t\tdev->hash_dev,\n\t\t\t\t\t\tMEM_HASH_ITER);\n\t\t\t}\n\t\t\t{\n\t\t\t\tdim3 block(256, 1);\n\t\t\t\tdim3 grid(N * M, 1);\n\t\t\t\tcuda_final_mem_hash<<<grid, block, 0, stream>>>(\n\t\t\t\t\t\t(uint4*)dev->M_dev,\n\t\t\t\t\t\t        dev->Y_dev,\n\t\t\t\t\t\t(uint4*)dev->hash_dev,\n\t\t\t\t\t\t(uint4*)dev->key_dev,\n\t\t\t\t\t\tKMASK);\n\t\t\t}\n\t\t\tcudaMemcpyAsync(dev->X_buf, dev->X_out, grid_size * 4,  cudaMemcpyDeviceToHost, stream);\n\t\t\tcudaMemcpyAsync(dev->Y_buf, dev->Y_dev, grid_size * 4,  cudaMemcpyDeviceToHost, stream);\n\t\t\tcudaMemcpyAsync(dev->M_buf, dev->M_dev, grid_size * 64, cudaMemcpyDeviceToHost, stream);\n\n\t\t\tconst auto err = cudaStreamSynchronize(stream);\n\t\t\tif(err != cudaSuccess) {\n\t\t\t\tstd::lock_guard<std::mutex> lock(g_mutex);\n\t\t\t\tfor(const auto& req : req_list) {\n\t\t\t\t\tauto res = std::make_shared<cuda_result_t>();\n\t\t\t\t\tres->id = req->id;\n\t\t\t\t\tres->failed = true;\n\t\t\t\t\tres->error = \"CUDA error\";\n\t\t\t\t\tg_result_map[res->id] = res;\n\t\t\t\t}\n\t\t\t\tg_result_signal.notify_all();\n\t\t\t\tdev->failed = true;\n\t\t\t\tvnx::log_error() << \"CUDA: error \" << err << \": \" << cudaGetErrorString(err);\n\t\t\t\tgoto failed;\n\t\t\t}\n\n\t\t\tfor(uint64_t i = 0; i < M; ++i) {\n\t\t\t\tconst auto& req = req_list[i];\n\t\t\t\tconst uint64_t count = 256 * N;\n\t\t\t\t::memcpy(req->X_tmp.data() + iter * count, dev->X_buf + i * count, count * 4);\n\t\t\t\t::memcpy(req->Y_tmp.data() + iter * count, dev->Y_buf + i * count, count * 4);\n\t\t\t\tfor(uint64_t k = 0; k < count; ++k) {\n\t\t\t\t\t::memcpy(req->M_tmp.data() + iter * count + k, dev->M_buf + (i * count + k) * 16, N_META * 4);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor(const auto& req : req_list) {\n\t\t\tg_cpu_threads->add_task(std::bind(&cuda_finish_cpu, req));\n\t\t}\n\t}\n\nfailed:\n\thave_cuda--;\n}\n\n\n\n\n\n} // pos\n} // mmx\n"
  },
  {
    "path": "src/pos/encoding.cpp",
    "content": "/*\n * encoding.cpp\n *\n *  Created on: Nov 20, 2023\n *      Author: mad\n */\n\n#include <mmx/pos/encoding.h>\n\n\nnamespace mmx {\nnamespace pos {\n\nstd::pair<uint32_t, uint32_t> encode_symbol(const uint8_t sym)\n{\n\tswitch(sym) {\n\t\tcase 0: return std::make_pair(0, 2);\n\t\tcase 1: return std::make_pair(1, 2);\n\t\tcase 2: return std::make_pair(2, 2);\n\t}\n\tconst uint32_t index = sym / 3;\n\tconst uint32_t mod = sym % 3;\n\n\tif(index > 15) {\n\t\tthrow std::logic_error(\"symbol out of range\");\n\t}\n\tuint32_t out = uint32_t(-1) >> (32 - 2 * index);\n\tout |= mod << (2 * index);\n\treturn std::make_pair(out, 2 * index + 2);\n}\n\nstd::pair<uint32_t, uint32_t> decode_symbol(const uint32_t bits)\n{\n\tswitch(bits & 3) {\n\t\tcase 0: return std::make_pair(0, 2);\n\t\tcase 1: return std::make_pair(1, 2);\n\t\tcase 2: return std::make_pair(2, 2);\n\t}\n\tuint32_t shift = bits;\n\n\tfor(uint32_t index = 0; index < 16; ++index)\n\t{\n\t\tconst auto mod = shift & 3;\n\t\tif(mod == 3) {\n\t\t\tshift >>= 2;\n\t\t} else {\n\t\t\treturn std::make_pair(3 * index + mod, 2 * index + 2);\n\t\t}\n\t}\n\treturn std::make_pair(48, 32);\n}\n\nstd::vector<uint64_t> encode(const std::vector<uint8_t>& symbols, uint64_t& total_bits)\n{\n\tstd::vector<uint64_t> out;\n\n\ttotal_bits = 0;\n\tuint32_t offset = 0;\n\tuint64_t buffer = 0;\n\n\tfor(const auto sym : symbols)\n\t{\n\t\tconst auto bits = encode_symbol(sym);\n\t\tbuffer |= uint64_t(bits.first) << offset;\n\n\t\tconst auto end = offset + bits.second;\n\t\tif(end >= 64) {\n\t\t\tout.push_back(buffer);\n\t\t\tbuffer = 0;\n\t\t}\n\t\tif(end > 64) {\n\t\t\tbuffer = bits.first >> (64 - offset);\n\t\t}\n\t\toffset = end % 64;\n\n\t\ttotal_bits += bits.second;\n\t}\n\tif(offset) {\n\t\tout.push_back(buffer);\n\t}\n\treturn out;\n}\n\nstd::vector<uint8_t> decode(const std::vector<uint64_t>& bit_stream, const uint64_t num_symbols, const uint64_t bit_offset)\n{\n\tstd::vector<uint8_t> out;\n\tout.reserve(num_symbols);\n\n\tuint32_t bits = 0;\n\tuint64_t offset = bit_offset;\n\tuint64_t buffer = 0;\n\n\twhile(out.size() < num_symbols)\n\t{\n\t\tif(bits < 32) {\n\t\t\tconst auto index = offset / 64;\n\t\t\tif(index < bit_stream.size()) {\n\t\t\t\tconst uint32_t count = std::min<uint32_t>(64 - (offset % 64), 64 - bits);\n\t\t\t\tbuffer |= (bit_stream[index] >> (offset % 64)) << bits;\n\t\t\t\toffset += count;\n\t\t\t\tbits += count;\n\t\t\t} else if(bits == 0) {\n\t\t\t\tthrow std::logic_error(\"bit stream underflow\");\n\t\t\t}\n\t\t}\n\t\tconst auto sym = decode_symbol(buffer);\n\t\tout.push_back(sym.first);\n\n\t\tif(sym.second > bits) {\n\t\t\tthrow std::logic_error(\"symbol decode error\");\n\t\t}\n\t\tbuffer >>= sym.second;\n\t\tbits -= sym.second;\n\t}\n\treturn out;\n}\n\n\n\n\n\n} // pos\n} // mmx\n"
  },
  {
    "path": "src/pos/mem_hash.cpp",
    "content": "/*\n * mem_hash.cpp\n *\n *  Created on: Oct 30, 2023\n *      Author: mad\n */\n\n#include <mmx/pos/mem_hash.h>\n\n#include <map>\n#include <cstring>\n#include <iostream>\n#include <stdexcept>\n\n\nnamespace mmx {\nnamespace pos {\n\nstatic const uint32_t MEM_HASH_INIT[16] = {\n\t0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n\t0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174\n};\n\nvoid gen_mem_array(uint32_t* mem, const uint8_t* key, const uint32_t mem_size)\n{\n\tif(mem_size % 32) {\n\t\tthrow std::logic_error(\"mem_size % 32 != 0\");\n\t}\n\tuint32_t state[32] = {};\n\n\tfor(int i = 0; i < 16; ++i) {\n\t\t::memcpy(&state[i], key + i * 4, 4);\n\t}\n\tfor(int i = 0; i < 16; ++i) {\n\t\tstate[16 + i] = MEM_HASH_INIT[i];\n\t}\n\n\tuint32_t b = 0;\n\tuint32_t c = 0;\n\n\tfor(uint32_t i = 0; i < mem_size; i += 32)\n\t{\n\t\tfor(int j = 0; j < 4; ++j) {\n\t\t\tfor(int k = 0; k < 16; ++k) {\n\t\t\t\tMMXPOS_HASHROUND(state[k], b, c, state[16 + k]);\n\t\t\t}\n\t\t}\n\t\tfor(int k = 0; k < 32; ++k) {\n\t\t\tmem[i + k] = state[k];\n\t\t}\n\t}\n}\n\nvoid calc_mem_hash(uint32_t* mem, uint8_t* hash, const int num_iter)\n{\n\tstatic constexpr int N = 32;\n\n\tuint32_t state[N];\n\tfor(int i = 0; i < N; ++i) {\n\t\tstate[i] = mem[(N - 1) * N + i];\n\t}\n\n\tfor(int iter = 0; iter < num_iter; ++iter)\n\t{\n\t\tuint32_t sum = 0;\n\t\tfor(int i = 0; i < N; ++i) {\n\t\t\tsum += rotl_32(state[i], i % 32);\n\t\t}\n\t\tconst uint32_t dir = sum + (sum << 11) + (sum << 22);\n\n\t\tconst uint32_t bits = (dir >> 22) % 32u;\n\t\tconst uint32_t offset = (dir >> 27);\n\n\t\tfor(int i = 0; i < N; ++i) {\n\t\t\tstate[i] += rotl_32(mem[offset * N + (iter + i) % N], bits) ^ sum;\n\t\t}\n\t\tfor(int i = 0; i < N; ++i) {\n\t\t\tmem[offset * N + i] ^= state[i];\n\t\t}\n\t}\n\n\t::memcpy(hash, state, N * 4);\n}\n\n\n} // pos\n} // mmx\n"
  },
  {
    "path": "src/pos/verify.cpp",
    "content": "/*\n * verify.cpp\n *\n *  Created on: Nov 5, 2023\n *      Author: mad\n */\n\n#include <mmx/pos/verify.h>\n#include <mmx/pos/mem_hash.h>\n#include <mmx/hash_512_t.hpp>\n#include <mmx/utils.h>\n\n#ifdef WITH_CUDA\n#include <mmx/pos/cuda_recompute.h>\n#endif\n\n#include <mmx/ProofServerClient.hxx>\n\n#include <set>\n#include <atomic>\n#include <algorithm>\n#include <vnx/vnx.h>\n#include <vnx/ThreadPool.h>\n\n\nnamespace mmx {\nnamespace pos {\n\nstatic constexpr uint32_t MEM_SIZE = 32 * 32;\n\nstatic std::mutex g_mutex;\nstatic std::shared_ptr<vnx::ThreadPool> g_threads;\n\nstatic bool have_init = false;\nstatic bool remote_compute = false;\n\n\nvoid set_remote_compute(bool enable)\n{\n\tremote_compute = enable;\n}\n\nvoid compute_f1(std::vector<uint32_t>* X_out,\n\t\t\t\tstd::vector<uint32_t>& Y_out,\n\t\t\t\tstd::vector<std::array<uint32_t, N_META>>& M_out,\n\t\t\t\tstd::mutex& mutex,\n\t\t\t\tconst uint32_t X,\n\t\t\t\tconst hash_t& id, const int ksize, const int xbits)\n{\n\tconst uint32_t kmask = ((uint64_t(1) << ksize) - 1);\n\n\tstd::vector<uint32_t> mem_buf(MEM_SIZE);\n\n\tfor(uint32_t x_i = 0; x_i < (uint64_t(1) << xbits); ++x_i)\n\t{\n\t\tconst uint32_t X_i = (X << xbits) | x_i;\n\n\t\tuint32_t msg[9] = {};\n\t\tmsg[0] = X_i;\n\t\t::memcpy(msg + 1, id.data(), id.size());\n\n\t\tconst hash_512_t key(&msg, sizeof(msg));\n\t\tgen_mem_array(mem_buf.data(), key.data(), MEM_SIZE);\n\n\t\tuint8_t mem_hash[64 + 128] = {};\n\t\t::memcpy(mem_hash, key.data(), key.size());\n\n\t\tcalc_mem_hash(mem_buf.data(), mem_hash + 64, MEM_HASH_ITER);\n\n\t\tconst hash_512_t mem_hash_hash(mem_hash, sizeof(mem_hash));\n\n\t\tuint32_t hash[16] = {};\n\t\t::memcpy(hash, mem_hash_hash.data(), mem_hash_hash.size());\n\n\t\tuint32_t Y_i = 0;\n\t\tstd::array<uint32_t, N_META> meta = {};\n\t\tfor(int i = 0; i < N_META; ++i) {\n\t\t\tY_i = Y_i ^ hash[i];\n\t\t\tmeta[i] = hash[i] & kmask;\n\t\t}\n\t\tY_i &= kmask;\n\n\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\tif(X_out) {\n\t\t\tX_out->push_back(X_i);\n\t\t}\n\t\tY_out.push_back(Y_i);\n\t\tM_out.push_back(meta);\n\t}\n}\n\nstd::vector<std::pair<uint32_t, bytes_t<META_BYTES_OUT>>>\ncompute(const std::vector<uint32_t>& X_values, std::vector<uint32_t>* X_out, const hash_t& id, const int ksize, const int xbits)\n{\n\tif(ksize < 8 || ksize > 32) {\n\t\tthrow std::logic_error(\"invalid ksize\");\n\t}\n\tif(xbits < 0 || xbits > ksize) {\n\t\tthrow std::logic_error(\"invalid xbits\");\n\t}\n\n\tif(!have_init)\n\t{\n\t\tstd::lock_guard<std::mutex> lock(g_mutex);\n\t\tif(!have_init) {\n\t\t\thave_init = true;\n\t\t\tvnx::read_config(\"mmx_pos.remote_compute\", remote_compute);\n\t\t}\n\t}\n\tif(remote_compute)\n\t{\n\t\tstatic thread_local std::unique_ptr<ProofServerClient> server;\n\t\tif(!server) {\n\t\t\tserver = std::make_unique<ProofServerClient>(\"ProofServer\");\n\t\t}\n\t\tif(X_out) {\n\t\t\tX_out->clear();\n\t\t}\n\t\tstd::vector<std::pair<uint32_t, bytes_t<META_BYTES_OUT>>> out;\n\t\ttry {\n\t\t\tconst auto res = server->compute(X_values, id, ksize, xbits);\n\t\t\tfor(const auto& entry : res) {\n\t\t\t\tif(X_out) {\n\t\t\t\t\tX_out->insert(X_out->end(), entry.x_values.begin(), entry.x_values.end());\n\t\t\t\t}\n\t\t\t\tout.emplace_back(entry.y, entry.meta);\n\t\t\t}\n\t\t} catch(const std::exception& ex) {\n\t\t\tthrow std::runtime_error(\"remote compute failed with: \" + std::string(ex.what()));\n\t\t}\n\t\treturn out;\n\t}\n\n#ifdef WITH_CUDA\n\tif(have_cuda_recompute() && X_values.size() == 256)\n\t{\n\t\tconst auto job = cuda_recompute(ksize, xbits, id, X_values);\n\t\tconst auto res = cuda_recompute_poll({job});\n\t\tif(res) {\n\t\t\tif(res->failed) {\n\t\t\t\tthrow std::runtime_error(\"CUDA failed with: \" + res->error);\n\t\t\t}\n\t\t\tif(X_out) {\n\t\t\t\t*X_out = res->X;\n\t\t\t}\n\t\t\treturn res->entries;\n\t\t}\n\t}\n#endif\n\n\tconst bool use_threads = (xbits >= 5);\n\tif(use_threads) {\n\t\tstd::lock_guard<std::mutex> lock(g_mutex);\n\t\tif(!g_threads) {\n\t\t\tconst auto cpu_threads = std::thread::hardware_concurrency();\n\t\t\tconst auto num_threads = cpu_threads > 0 ? cpu_threads : 16;\n\t\t\tg_threads = std::make_shared<vnx::ThreadPool>(num_threads, 1024);\n\t\t\tvnx::log_info() << \"Using \" << num_threads << \" CPU threads for proof recompute\";\n\t\t}\n\t}\n\tconst auto X_set = std::set<uint32_t>(X_values.begin(), X_values.end());\n\n\tconst uint64_t num_entries_1 = X_set.size() << xbits;\n\n\tstd::mutex mutex;\n\tstd::vector<int64_t> jobs;\n\tstd::vector<uint32_t> X_tmp;\n\tstd::vector<uint32_t> Y_tmp;\n\tstd::vector<uint32_t> mem_buf(MEM_SIZE);\n\tstd::vector<std::array<uint32_t, N_META>> M_tmp;\n\n//\tconst auto t1_begin = get_time_ms();\n\n\tif(X_out) {\n\t\tX_tmp.reserve(num_entries_1);\n\t}\n\tY_tmp.reserve(num_entries_1);\n\tM_tmp.reserve(num_entries_1);\n\n\tfor(const auto X : X_set)\n\t{\n\t\tif(use_threads) {\n\t\t\tconst auto job = g_threads->add_task(\n\t\t\t\t[X_out, &X_tmp, &Y_tmp, &M_tmp, &mutex, X, id, ksize, xbits]() {\n\t\t\t\t\tcompute_f1(X_out ? &X_tmp : nullptr, Y_tmp, M_tmp, mutex, X, id, ksize, xbits);\n\t\t\t\t});\n\t\t\tjobs.push_back(job);\n\t\t} else {\n\t\t\tcompute_f1(X_out ? &X_tmp : nullptr, Y_tmp, M_tmp, mutex, X, id, ksize, xbits);\n\t\t}\n\t}\n\n\tif(use_threads) {\n\t\tg_threads->sync(jobs);\n\t\tjobs.clear();\n\t}\n//\tstd::cout << \"Table 1 took \" << (get_time_ms() - t1_begin) << \" ms\" << std::endl;\n\n\treturn compute_full(X_tmp, Y_tmp, M_tmp, X_out, id, ksize);\n}\n\nhash_t calc_quality(const hash_t& challenge, const bytes_t<META_BYTES_OUT>& meta)\n{\n\t// proof output needs to be hashed after challenge, otherwise compression to 256-bit is possible\n\treturn hash_t(std::string(\"proof_quality\") + challenge + meta);\n}\n\nbool check_post_filter(const hash_t& challenge, const bytes_t<META_BYTES_OUT>& meta, const int post_filter)\n{\n\t// proof output needs to be hashed after challenge, otherwise compression to 256-bit is possible\n\tconst hash_t hash(std::string(\"post_filter\") + challenge + meta);\n\treturn (hash.to_uint256() >> (256 - post_filter)) == 0;\n}\n\nhash_t verify(\tconst std::vector<uint32_t>& X_values, const hash_t& challenge, const hash_t& id,\n\t\t\t\tconst int plot_filter, const int post_filter, const int ksize, const bool hard_fork)\n{\n\tif(X_values.size() != (1 << (N_TABLE - 1))) {\n\t\tthrow std::logic_error(\"invalid proof size\");\n\t}\n\tstd::vector<uint32_t> X_out;\n\tconst auto entries = compute(X_values, &X_out, id, ksize, 0);\n\tif(entries.empty()) {\n\t\tthrow std::logic_error(\"invalid proof\");\n\t}\n\tif(entries.size() > 1) {\n\t\tthrow std::logic_error(\"more than one proof found\");\n\t}\n\tconst auto& result = entries[0];\n\tconst auto& Y = result.first;\n\n\tconst uint32_t kmask = ((uint64_t(1) << ksize) - 1);\n\n\tconst uint32_t Y_0 = bytes_t<4>(challenge.data(), 4).to_uint<uint32_t>() & kmask;\n\n\tconst uint64_t Y_end = uint64_t(Y_0) + (1 << plot_filter);\n\n\tif((Y < Y_0) || (Y >= Y_end)) {\n\t\tthrow std::logic_error(\"invalid Y value\");\n\t}\n\tif(X_out != X_values) {\n\t\tthrow std::logic_error(\"invalid proof order\");\n\t}\n\n\tif(hard_fork) {\n\t\tif(!check_post_filter(challenge, result.second, post_filter)) {\n\t\t\tthrow std::logic_error(\"post filter failed\");\n\t\t}\n\t\treturn calc_proof_hash(challenge, X_out);\n\t} else {\n\t\treturn calc_quality(challenge, result.second);\n\t}\n}\n\n\n\n\n} // pos\n} // mmx\n"
  },
  {
    "path": "src/pos/verify_full.cpp",
    "content": "/*\n * verify_full.cpp\n *\n *  Created on: Feb 5, 2025\n *      Author: mad\n */\n\n#include <mmx/pos/verify.h>\n#include <mmx/hash_512_t.hpp>\n#include <mmx/utils.h>\n\n\nnamespace mmx {\nnamespace pos {\n\nstd::vector<std::pair<uint32_t, bytes_t<META_BYTES_OUT>>>\ncompute_full(\tconst std::vector<uint32_t>& X_in,\n\t\t\t\tconst std::vector<uint32_t>& Y_in,\n\t\t\t\tstd::vector<std::array<uint32_t, N_META>>& M_in,\n\t\t\t\tstd::vector<uint32_t>* X_out,\n\t\t\t\tconst hash_t& id, const int ksize)\n{\n\tif(M_in.size() != Y_in.size()) {\n\t\tthrow std::logic_error(\"input length mismatch\");\n\t}\n\tconst uint32_t kmask = ((uint64_t(1) << ksize) - 1);\n\n\tstd::vector<std::array<uint32_t, N_META>> M_tmp = std::move(M_in);\n\tstd::vector<std::pair<uint32_t, uint32_t>> entries;\n\tstd::vector<std::vector<std::pair<uint32_t, uint32_t>>> LR_tmp(N_TABLE + 1);\n\n\tentries.reserve(Y_in.size());\n\tfor(size_t i = 0; i < Y_in.size(); ++i) {\n\t\tentries.emplace_back(Y_in[i], i);\n\t}\n\n\t// sort function for proof ordering (enforce unique proofs)\n\tconst auto sort_func =\n\t\t[&M_tmp](const std::pair<uint32_t, uint32_t>& L, const std::pair<uint32_t, uint32_t>& R) -> bool {\n\t\t\tif(L.first == R.first) {\n\t\t\t\treturn M_tmp[L.second] < M_tmp[R.second];\n\t\t\t}\n\t\t\treturn L < R;\n\t\t};\n\n\tfor(int t = 2; t <= N_TABLE; ++t)\n\t{\n//\t\tconst auto time_begin = get_time_ms();\n\n\t\tstd::vector<std::array<uint32_t, N_META>> M_next;\n\t\tstd::vector<std::pair<uint32_t, uint32_t>> matches;\n\n\t\tstd::sort(entries.begin(), entries.end(), sort_func);\n\n//\t\tstd::cout << \"Table \" << t << \" sort took \" << (get_time_ms() - time_begin) << \" ms\" << std::endl;\n\n\t\tfor(size_t x = 0; x < entries.size(); ++x)\n\t\t{\n\t\t\tconst auto YL = entries[x].first;\n\n\t\t\tfor(size_t y = x + 1; y < entries.size(); ++y)\n\t\t\t{\n\t\t\t\tconst auto YR = entries[y].first;\n\n\t\t\t\tif(YR == YL + 1) {\n\t\t\t\t\tconst auto PL = entries[x].second;\n\t\t\t\t\tconst auto PR = entries[y].second;\n\t\t\t\t\tconst auto& L_meta = M_tmp[PL];\n\t\t\t\t\tconst auto& R_meta = M_tmp[PR];\n\n\t\t\t\t\tuint32_t hash[16] = {};\n\t\t\t\t\t{\n\t\t\t\t\t\tuint32_t msg[N_META * 2] = {};\n\t\t\t\t\t\tfor(int i = 0; i < N_META; ++i) {\n\t\t\t\t\t\t\tmsg[i] = L_meta[i];\n\t\t\t\t\t\t\tmsg[N_META + i] = R_meta[i];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst hash_512_t tmp(&msg, sizeof(msg));\n\n\t\t\t\t\t\t::memcpy(hash, tmp.data(), tmp.size());\n\t\t\t\t\t}\n\t\t\t\t\tuint32_t Y_i = 0;\n\t\t\t\t\tstd::array<uint32_t, N_META> meta = {};\n\t\t\t\t\tfor(int i = 0; i < N_META; ++i) {\n\t\t\t\t\t\tY_i = Y_i ^ hash[i];\n\t\t\t\t\t\tmeta[i] = hash[i] & kmask;\n\t\t\t\t\t}\n\t\t\t\t\tY_i &= kmask;\n\n\t\t\t\t\tmatches.emplace_back(Y_i, M_next.size());\n\n\t\t\t\t\tif(X_out) {\n\t\t\t\t\t\tLR_tmp[t].emplace_back(PL, PR);\n\t\t\t\t\t}\n\t\t\t\t\tM_next.push_back(meta);\n\t\t\t\t}\n\t\t\t\telse if(YR > YL) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(matches.empty()) {\n\t\t\tthrow std::logic_error(\"zero matches at table \" + std::to_string(t));\n\t\t}\n\t\tM_tmp = std::move(M_next);\n\t\tentries = std::move(matches);\n\n//\t\tstd::cout << \"Table \" << t << \" took \" << (get_time_ms() - time_begin) << \" ms, \" << entries.size() << \" entries\" << std::endl;\n\t}\n\n\tif(X_out) {\n\t\tX_out->clear();\n\t}\n\tstd::sort(entries.begin(), entries.end(), sort_func);\n\n\tstd::set<std::array<uint32_t, N_META>> M_set;\n\tstd::vector<std::pair<uint32_t, bytes_t<META_BYTES_OUT>>> out;\n\tfor(const auto& entry : entries)\n\t{\n\t\tconst auto& meta = M_tmp[entry.second];\n\t\tif(!M_set.insert(meta).second) {\n\t\t\tcontinue;\n\t\t}\n\t\tout.emplace_back(entry.first, bytes_t<META_BYTES_OUT>(meta.data(), META_BYTES_OUT));\n\n\t\tif(X_out && X_in.size() == Y_in.size())\n\t\t{\n\t\t\tstd::vector<uint32_t> I_tmp;\n\t\t\tI_tmp.push_back(std::get<1>(entry));\n\n\t\t\tfor(int t = N_TABLE; t >= 2; --t)\n\t\t\t{\n\t\t\t\tstd::vector<uint32_t> I_next;\n\t\t\t\tfor(const auto i : I_tmp) {\n\t\t\t\t\tI_next.push_back(LR_tmp[t][i].first);\n\t\t\t\t\tI_next.push_back(LR_tmp[t][i].second);\n\t\t\t\t}\n\t\t\t\tI_tmp = std::move(I_next);\n\t\t\t}\n\t\t\tfor(const auto i : I_tmp) {\n\t\t\t\tX_out->push_back(X_in[i]);\n\t\t\t}\n\t\t}\n\t}\n\treturn out;\n}\n\n\n\n} // pos\n} // mmx\n"
  },
  {
    "path": "src/pubkey_t.cpp",
    "content": "/*\n * pubkey_t.cpp\n *\n *  Created on: Mar 30, 2023\n *      Author: mad\n */\n\n#include <mmx/pubkey_t.hpp>\n#include <mmx/skey_t.hpp>\n\n\nnamespace mmx {\n\npubkey_t::pubkey_t(const skey_t& key)\n{\n\tsecp256k1_pubkey pubkey;\n\tif(!secp256k1_ec_pubkey_create(g_secp256k1, &pubkey, key.data())) {\n\t\tthrow std::logic_error(\"secp256k1_ec_pubkey_create() failed\");\n\t}\n\t*this = pubkey_t(pubkey);\n}\n\npubkey_t::pubkey_t(const secp256k1_pubkey& key)\n{\n\tsize_t len = size();\n\tsecp256k1_ec_pubkey_serialize(g_secp256k1, data(), &len, &key, SECP256K1_EC_COMPRESSED);\n\tif(len != 33) {\n\t\tthrow std::logic_error(\"secp256k1_ec_pubkey_serialize(): length != 33\");\n\t}\n}\n\nsecp256k1_pubkey pubkey_t::to_secp256k1() const\n{\n\tsecp256k1_pubkey res;\n\tif(!secp256k1_ec_pubkey_parse(g_secp256k1, &res, data(), size())) {\n\t\tthrow std::logic_error(\"secp256k1_ec_pubkey_parse() failed\");\n\t}\n\treturn res;\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/secp256k1.cpp",
    "content": "/*\n * secp256k1.cpp\n *\n *  Created on: Nov 28, 2021\n *      Author: mad\n */\n\n#include <mmx/secp256k1.hpp>\n\n\nnamespace mmx {\n\nconst secp256k1_context* g_secp256k1 = nullptr;\n\nstatic secp256k1_context* g_secp256k1_priv = nullptr;\n\n\nvoid secp256k1_init()\n{\n\tg_secp256k1_priv = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);\n\tg_secp256k1 = g_secp256k1_priv;\n}\n\nvoid secp256k1_free()\n{\n\tg_secp256k1 = nullptr;\n\tsecp256k1_context_destroy(g_secp256k1_priv);\n\tg_secp256k1_priv = nullptr;\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/sha256_64_x8.cpp",
    "content": "/*\n * sha256_64_x8.cpp\n *\n *  Created on: Oct 17, 2022\n *      Author: mad\n */\n\n#include <sha256_avx2.h>\n#include <sha256_ni.h>\n#include <sha256_arm.h>\n#include <mmx/hash_t.hpp>\n\n\nvoid sha256_64_x8(uint8_t* out, uint8_t* in, const uint64_t length)\n{\n\tstatic bool have_avx2 = avx2_available();\n\tstatic bool have_sha_ni = sha256_ni_available();\n\tstatic bool have_sha_arm = sha256_arm_available();\n\n\tif(length > 64 - 9) {\n\t\tthrow std::logic_error(\"sha256_64_x8(): length too large\");\n\t}\n\n\tif(have_sha_ni) {\n\t\tfor(int i = 0; i < 8; ++i) {\n\t\t\tsha256_ni(out + i * 32, in + i * 64, length);\n\t\t}\n\t} else if(have_sha_arm) {\n\t\tfor(int i = 0; i < 8; ++i) {\n\t\t\tsha256_arm(out + i * 32, in + i * 64, length);\n\t\t}\n\t} else if(have_avx2) {\n\t\tsha256_avx2_64_x8(out, in, length);\n\t} else {\n\t\tfor(int i = 0; i < 8; ++i) {\n\t\t\tconst mmx::hash_t hash(in + i * 64, length);\n\t\t\t::memcpy(out + i * 32, hash.data(), 32);\n\t\t}\n\t}\n}\n\n"
  },
  {
    "path": "src/sha256_arm.cpp",
    "content": "/*\n * sha256_arm.cpp\n *\n *  Created on: Feb 21, 2024\n *      Author: mad, voidxno\n */\n\n#include <sha256_arm.h>\n\n#include <cstring>\n#include <stdexcept>\n\n#if defined(__aarch64__)\n\n#include <sys/auxv.h>\n#include <arm_neon.h>\n\nstatic const uint32_t K64[] = {\n\t0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,\n\t0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n\t0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,\n\t0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n\t0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,\n\t0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n\t0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,\n\t0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n\t0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,\n\t0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n\t0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,\n\t0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n\t0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,\n\t0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n\t0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,\n\t0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,\n};\n\ninline uint32_t bswap_32(const uint32_t val) {\n\treturn ((val & 0xFF) << 24) | ((val & 0xFF00) << 8) | ((val & 0xFF0000) >> 8) | ((val & 0xFF000000) >> 24);\n}\n\ninline uint64_t bswap_64(const uint64_t val) {\n\treturn (uint64_t(bswap_32(val)) << 32) | bswap_32(val >> 32);\n}\n\nstatic void compress_digest(uint32_t* state, const uint8_t* input, size_t blocks)\n{\n\tconst uint8_t* input_mm = input;\n\n\t// Load initial values\n\tuint32x4_t STATE0 = vld1q_u32(&state[0]);\n\tuint32x4_t STATE1 = vld1q_u32(&state[4]);\n\n\twhile(blocks > 0)\n\t{\n\t\t// Save current state\n\t\tconst uint32x4_t ABCD_SAVE = STATE0;\n\t\tconst uint32x4_t EFGH_SAVE = STATE1;\n\n\t\tuint32x4_t MSGV;\n\t\tuint32x4_t STATEV;\n\n\t\tuint32x4_t MSGTMP0 = vld1q_u32((const uint32_t*)(&input_mm[0]));\n\t\tuint32x4_t MSGTMP1 = vld1q_u32((const uint32_t*)(&input_mm[16]));\n\t\tuint32x4_t MSGTMP2 = vld1q_u32((const uint32_t*)(&input_mm[32]));\n\t\tuint32x4_t MSGTMP3 = vld1q_u32((const uint32_t*)(&input_mm[48]));\n\n\t\tMSGTMP0 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSGTMP0)));\n\t\tMSGTMP1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSGTMP1)));\n\t\tMSGTMP2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSGTMP2)));\n\t\tMSGTMP3 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSGTMP3)));\n\n\t\t// Rounds 0-3\n\t\tMSGV = vaddq_u32(MSGTMP0, vld1q_u32(&K64[0]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP0 = vsha256su0q_u32(MSGTMP0, MSGTMP1);\n\n\t\t// Rounds 4-7\n\t\tMSGV = vaddq_u32(MSGTMP1, vld1q_u32(&K64[4]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP0 = vsha256su1q_u32(MSGTMP0, MSGTMP2, MSGTMP3);\n\t\tMSGTMP1 = vsha256su0q_u32(MSGTMP1, MSGTMP2);\n\n\t\t// Rounds 8-11\n\t\tMSGV = vaddq_u32(MSGTMP2, vld1q_u32(&K64[8]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP1 = vsha256su1q_u32(MSGTMP1, MSGTMP3, MSGTMP0);\n\t\tMSGTMP2 = vsha256su0q_u32(MSGTMP2, MSGTMP3);\n\n\t\t// Rounds 12-15\n\t\tMSGV = vaddq_u32(MSGTMP3, vld1q_u32(&K64[12]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP2 = vsha256su1q_u32(MSGTMP2, MSGTMP0, MSGTMP1);\n\t\tMSGTMP3 = vsha256su0q_u32(MSGTMP3, MSGTMP0);\n\n\t\t// Rounds 16-19\n\t\tMSGV = vaddq_u32(MSGTMP0, vld1q_u32(&K64[16]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP3 = vsha256su1q_u32(MSGTMP3, MSGTMP1, MSGTMP2);\n\t\tMSGTMP0 = vsha256su0q_u32(MSGTMP0, MSGTMP1);\n\n\t\t// Rounds 20-23\n\t\tMSGV = vaddq_u32(MSGTMP1, vld1q_u32(&K64[20]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP0 = vsha256su1q_u32(MSGTMP0, MSGTMP2, MSGTMP3);\n\t\tMSGTMP1 = vsha256su0q_u32(MSGTMP1, MSGTMP2);\n\n\t\t// Rounds 24-27\n\t\tMSGV = vaddq_u32(MSGTMP2, vld1q_u32(&K64[24]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP1 = vsha256su1q_u32(MSGTMP1, MSGTMP3, MSGTMP0);\n\t\tMSGTMP2 = vsha256su0q_u32(MSGTMP2, MSGTMP3);\n\n\t\t// Rounds 28-31\n\t\tMSGV = vaddq_u32(MSGTMP3, vld1q_u32(&K64[28]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP2 = vsha256su1q_u32(MSGTMP2, MSGTMP0, MSGTMP1);\n\t\tMSGTMP3 = vsha256su0q_u32(MSGTMP3, MSGTMP0);\n\n\t\t// Rounds 32-35\n\t\tMSGV = vaddq_u32(MSGTMP0, vld1q_u32(&K64[32]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP3 = vsha256su1q_u32(MSGTMP3, MSGTMP1, MSGTMP2);\n\t\tMSGTMP0 = vsha256su0q_u32(MSGTMP0, MSGTMP1);\n\n\t\t// Rounds 36-39\n\t\tMSGV = vaddq_u32(MSGTMP1, vld1q_u32(&K64[36]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP0 = vsha256su1q_u32(MSGTMP0, MSGTMP2, MSGTMP3);\n\t\tMSGTMP1 = vsha256su0q_u32(MSGTMP1, MSGTMP2);\n\n\t\t// Rounds 40-43\n\t\tMSGV = vaddq_u32(MSGTMP2, vld1q_u32(&K64[40]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP1 = vsha256su1q_u32(MSGTMP1, MSGTMP3, MSGTMP0);\n\t\tMSGTMP2 = vsha256su0q_u32(MSGTMP2, MSGTMP3);\n\n\t\t// Rounds 44-47\n\t\tMSGV = vaddq_u32(MSGTMP3, vld1q_u32(&K64[44]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP2 = vsha256su1q_u32(MSGTMP2, MSGTMP0, MSGTMP1);\n\t\tMSGTMP3 = vsha256su0q_u32(MSGTMP3, MSGTMP0);\n\n\t\t// Rounds 48-51\n\t\tMSGV = vaddq_u32(MSGTMP0, vld1q_u32(&K64[48]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\t\tMSGTMP3 = vsha256su1q_u32(MSGTMP3, MSGTMP1, MSGTMP2);\n\n\t\t// Rounds 52-55\n\t\tMSGV = vaddq_u32(MSGTMP1, vld1q_u32(&K64[52]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\n\t\t// Rounds 56-59\n\t\tMSGV = vaddq_u32(MSGTMP2, vld1q_u32(&K64[56]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\n\t\t// Rounds 60-63\n\t\tMSGV = vaddq_u32(MSGTMP3, vld1q_u32(&K64[60]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0, STATE1, MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1, STATEV, MSGV);\n\n\t\t// Add values back to state\n\t\tSTATE0 = vaddq_u32(STATE0, ABCD_SAVE);\n\t\tSTATE1 = vaddq_u32(STATE1, EFGH_SAVE);\n\n\t\tinput_mm = &input_mm[64];\n\t\tblocks--;\n\t}\n\n // Save state\n vst1q_u32(&state[0], STATE0);\n vst1q_u32(&state[4], STATE1);\n}\n\nvoid sha256_arm(uint8_t* out, const uint8_t* in, const uint64_t length)\n{\n\tuint32_t state[] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19};\n\n\tconst auto num_blocks = length / 64;\n\tif(num_blocks) {\n\t\tcompress_digest(state, in, num_blocks);\n\t}\n\tconst auto remain = length % 64;\n\tconst auto final_blocks = (remain + 9 + 63) / 64;\n\tconst uint64_t num_bits = bswap_64(length * 8);\n\tconst uint8_t end_bit = 0x80;\n\n\tuint8_t last[128] = {};\n\t::memcpy(last, in + num_blocks * 64, remain);\n\t::memset(last + remain, 0, sizeof(last) - remain);\n\t::memcpy(last + remain, &end_bit, 1);\n\t::memcpy(last + final_blocks * 64 - 8, &num_bits, 8);\n\n\tcompress_digest(state, last, final_blocks);\n\n\tfor(int k = 0; k < 8; ++k) {\n\t\tstate[k] = bswap_32(state[k]);\n\t}\n\t::memcpy(out, state, 32);\n}\n\nbool sha256_arm_available()\n{\n\t// ARM Cryptography Extensions (SHA256 feature)\n\t// ID_AA64ISAR0_EL1 feature register, bits 15-12 (SHA2)\n\n\t// user space detect through getauxval()\n\treturn (getauxval(AT_HWCAP) & HWCAP_SHA2) ? true : false;\n}\n\n#else // __aarch64__\n\nvoid sha256_arm(uint8_t* out, const uint8_t* in, const uint64_t length) {\n\tthrow std::logic_error(\"sha256_arm() not available\");\n}\n\nbool sha256_arm_available() {\n\treturn false;\n}\n\n#endif // __aarch64__\n\n"
  },
  {
    "path": "src/sha256_arm_rec.cpp",
    "content": "/*\n * sha256_arm_rec.cpp\n *\n *  Created on: Feb 21, 2024\n *      Author: mad, voidxno\n */\n\n// prerequisite: length is 32 bytes (recursive sha256)\n// prerequisite: length is 64 bytes, 2x 32bytes (_x2)\n// optimization: https://github.com/voidxno/fast-recursive-sha256\n\n#include <sha256_arm.h>\n\n#include <cstring>\n#include <stdexcept>\n\n#if defined(__aarch64__)\n\n#include <arm_neon.h>\n\nvoid recursive_sha256_arm(uint8_t* hash, const uint64_t num_iters)\n{\n\tif(num_iters <= 0) {\n\t\treturn;\n\t}\n\n\tstatic const uint32_t K64[64] = {\n\t\t0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,\n\t\t0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n\t\t0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,\n\t\t0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n\t\t0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,\n\t\t0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n\t\t0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,\n\t\t0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n\t\t0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,\n\t\t0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n\t\t0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,\n\t\t0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n\t\t0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,\n\t\t0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n\t\t0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,\n\t\t0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2\n\t};\n\n\t// init values\n\tstatic const uint32_t abcdinit[4] = {0x6A09E667,0xBB67AE85,0x3C6EF372,0xA54FF53A};\n\tstatic const uint32_t efghinit[4] = {0x510E527F,0x9B05688C,0x1F83D9AB,0x5BE0CD19};\n\tconst uint32x4_t ABCD_INIT = vld1q_u32(&abcdinit[0]);\n\tconst uint32x4_t EFGH_INIT = vld1q_u32(&efghinit[0]);\n\n\t// pre-calc/cache padding\n\tstatic const uint32_t hpad0cache[4] = {0x80000000,0x00000000,0x00000000,0x00000000};\n\tstatic const uint32_t hpad1cache[4] = {0x00000000,0x00000000,0x00000000,0x00000100};\n\tconst uint32x4_t HPAD0_CACHE = vld1q_u32(&hpad0cache[0]);\n\tconst uint32x4_t HPAD1_CACHE = vld1q_u32(&hpad1cache[0]);\n\n\tuint32x4_t STATE0;\n\tuint32x4_t STATE1;\n\tuint32x4_t STATEV;\n\tuint32x4_t MSGV;\n\tuint32x4_t MSGTMP0;\n\tuint32x4_t MSGTMP1;\n\tuint32x4_t MSGTMP2;\n\tuint32x4_t MSGTMP3;\n\n\t// init/shuffle hash\n\tuint32x4_t HASH0_SAVE = vld1q_u32((const uint32_t*)(&hash[0]));\n\tuint32x4_t HASH1_SAVE = vld1q_u32((const uint32_t*)(&hash[16]));\n\tHASH0_SAVE = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH0_SAVE)));\n\tHASH1_SAVE = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH1_SAVE)));\n\n\tfor(uint64_t i = 0; i < num_iters; ++i) {\n\n\t\t// init state\n\t\tSTATE0 = ABCD_INIT;\n\t\tSTATE1 = EFGH_INIT;\n\n\t\t// rounds 0-3\n\t\tMSGV = vaddq_u32(HASH0_SAVE,vld1q_u32(&K64[0]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0,STATE1,MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1,STATEV,MSGV);\n\t\tMSGTMP0 = vsha256su0q_u32(HASH0_SAVE,HASH1_SAVE);\n\n\t\t// rounds 4-7\n\t\tMSGV = vaddq_u32(HASH1_SAVE,vld1q_u32(&K64[4]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0,STATE1,MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1,STATEV,MSGV);\n\t\tMSGTMP0 = vsha256su1q_u32(MSGTMP0,HPAD0_CACHE,HPAD1_CACHE);\n\t\tMSGTMP1 = vsha256su0q_u32(HASH1_SAVE,HPAD0_CACHE);\n\n\t\t// rounds 8-11\n\t\tMSGV = vaddq_u32(HPAD0_CACHE,vld1q_u32(&K64[8]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0,STATE1,MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1,STATEV,MSGV);\n\t\tMSGTMP1 = vsha256su1q_u32(MSGTMP1,HPAD1_CACHE,MSGTMP0);\n\t\tMSGTMP2 = HPAD0_CACHE;\n\n\t\t// rounds 12-15\n\t\tMSGV = vaddq_u32(HPAD1_CACHE,vld1q_u32(&K64[12]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0,STATE1,MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1,STATEV,MSGV);\n\t\tMSGTMP2 = vsha256su1q_u32(MSGTMP2,MSGTMP0,MSGTMP1);\n\t\tMSGTMP3 = vsha256su0q_u32(HPAD1_CACHE,MSGTMP0);\n\n#define SHA256ROUND( \\\nmsgv, msgtmp0, msgtmp1, msgtmp2, msgtmp3, statev, state0, state1, kvalue) \\\n\tmsgv = vaddq_u32(msgtmp0,vld1q_u32(kvalue)); \\\n\tstatev = state0; \\\n\tstate0 = vsha256hq_u32(state0,state1,msgv); \\\n\tstate1 = vsha256h2q_u32(state1,statev,msgv); \\\n\tmsgtmp3 = vsha256su1q_u32(msgtmp3,msgtmp1,msgtmp2); \\\n\tmsgtmp0 = vsha256su0q_u32(msgtmp0,msgtmp1);\n\n\t\t// rounds 16-19, 20-23, 24-27, 28-31\n\t\tSHA256ROUND(MSGV,MSGTMP0,MSGTMP1,MSGTMP2,MSGTMP3,STATEV,STATE0,STATE1,&K64[16]);\n\t\tSHA256ROUND(MSGV,MSGTMP1,MSGTMP2,MSGTMP3,MSGTMP0,STATEV,STATE0,STATE1,&K64[20]);\n\t\tSHA256ROUND(MSGV,MSGTMP2,MSGTMP3,MSGTMP0,MSGTMP1,STATEV,STATE0,STATE1,&K64[24]);\n\t\tSHA256ROUND(MSGV,MSGTMP3,MSGTMP0,MSGTMP1,MSGTMP2,STATEV,STATE0,STATE1,&K64[28]);\n\n\t\t// rounds 32-35, 36-39, 40-43, 44-47\n\t\tSHA256ROUND(MSGV,MSGTMP0,MSGTMP1,MSGTMP2,MSGTMP3,STATEV,STATE0,STATE1,&K64[32]);\n\t\tSHA256ROUND(MSGV,MSGTMP1,MSGTMP2,MSGTMP3,MSGTMP0,STATEV,STATE0,STATE1,&K64[36]);\n\t\tSHA256ROUND(MSGV,MSGTMP2,MSGTMP3,MSGTMP0,MSGTMP1,STATEV,STATE0,STATE1,&K64[40]);\n\t\tSHA256ROUND(MSGV,MSGTMP3,MSGTMP0,MSGTMP1,MSGTMP2,STATEV,STATE0,STATE1,&K64[44]);\n\n\t\t// rounds 48-51\n\t\tMSGV = vaddq_u32(MSGTMP0,vld1q_u32(&K64[48]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0,STATE1,MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1,STATEV,MSGV);\n\t\tMSGTMP3 = vsha256su1q_u32(MSGTMP3,MSGTMP1,MSGTMP2);\n\n\t\t// rounds 52-55\n\t\tMSGV = vaddq_u32(MSGTMP1,vld1q_u32(&K64[52]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0,STATE1,MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1,STATEV,MSGV);\n\n\t\t// rounds 56-59\n\t\tMSGV = vaddq_u32(MSGTMP2,vld1q_u32(&K64[56]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0,STATE1,MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1,STATEV,MSGV);\n\n\t\t// rounds 60-63\n\t\tMSGV = vaddq_u32(MSGTMP3,vld1q_u32(&K64[60]));\n\t\tSTATEV = STATE0;\n\t\tSTATE0 = vsha256hq_u32(STATE0,STATE1,MSGV);\n\t\tSTATE1 = vsha256h2q_u32(STATE1,STATEV,MSGV);\n\n\t\t// add to state\n\t\tHASH0_SAVE = vaddq_u32(STATE0,ABCD_INIT);\n\t\tHASH1_SAVE = vaddq_u32(STATE1,EFGH_INIT);\n\t}\n\n\t// shuffle/return hash\n\tHASH0_SAVE = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH0_SAVE)));\n\tHASH1_SAVE = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH1_SAVE)));\n\tvst1q_u32((uint32_t*)(&hash[0]),HASH0_SAVE);\n\tvst1q_u32((uint32_t*)(&hash[16]),HASH1_SAVE);\n}\n\nvoid recursive_sha256_arm_x2(uint8_t* hash, const uint64_t num_iters)\n{\n\tif(num_iters <= 0) {\n\t\treturn;\n\t}\n\n\tstatic const uint32_t K64[64] = {\n\t\t0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,\n\t\t0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n\t\t0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,\n\t\t0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n\t\t0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,\n\t\t0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n\t\t0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,\n\t\t0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n\t\t0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,\n\t\t0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n\t\t0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,\n\t\t0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n\t\t0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,\n\t\t0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n\t\t0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,\n\t\t0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2\n\t};\n\n\t// init values\n\tstatic const uint32_t abcdinit[4] = {0x6A09E667,0xBB67AE85,0x3C6EF372,0xA54FF53A};\n\tstatic const uint32_t efghinit[4] = {0x510E527F,0x9B05688C,0x1F83D9AB,0x5BE0CD19};\n\tconst uint32x4_t ABCD_INIT = vld1q_u32(&abcdinit[0]);\n\tconst uint32x4_t EFGH_INIT = vld1q_u32(&efghinit[0]);\n\n\t// pre-calc/cache padding\n\tstatic const uint32_t hpad0cache[4] = {0x80000000,0x00000000,0x00000000,0x00000000};\n\tstatic const uint32_t hpad1cache[4] = {0x00000000,0x00000000,0x00000000,0x00000100};\n\tconst uint32x4_t HPAD0_CACHE = vld1q_u32(&hpad0cache[0]);\n\tconst uint32x4_t HPAD1_CACHE = vld1q_u32(&hpad1cache[0]);\n\n\tuint32x4_t STATE0_P1;\n\tuint32x4_t STATE1_P1;\n\tuint32x4_t STATEV_P1;\n\tuint32x4_t MSGV_P1;\n\tuint32x4_t MSGTMP0_P1;\n\tuint32x4_t MSGTMP1_P1;\n\tuint32x4_t MSGTMP2_P1;\n\tuint32x4_t MSGTMP3_P1;\n\tuint32x4_t STATE0_P2;\n\tuint32x4_t STATE1_P2;\n\tuint32x4_t STATEV_P2;\n\tuint32x4_t MSGV_P2;\n\tuint32x4_t MSGTMP0_P2;\n\tuint32x4_t MSGTMP1_P2;\n\tuint32x4_t MSGTMP2_P2;\n\tuint32x4_t MSGTMP3_P2;\n\n\t// init/shuffle hash\n\tuint32x4_t HASH0_SAVE_P1 = vld1q_u32((const uint32_t*)(&hash[0]));\n\tuint32x4_t HASH1_SAVE_P1 = vld1q_u32((const uint32_t*)(&hash[16]));\n\tuint32x4_t HASH0_SAVE_P2 = vld1q_u32((const uint32_t*)(&hash[32]));\n\tuint32x4_t HASH1_SAVE_P2 = vld1q_u32((const uint32_t*)(&hash[48]));\n\tHASH0_SAVE_P1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH0_SAVE_P1)));\n\tHASH1_SAVE_P1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH1_SAVE_P1)));\n\tHASH0_SAVE_P2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH0_SAVE_P2)));\n\tHASH1_SAVE_P2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH1_SAVE_P2)));\n\n\tfor(uint64_t i = 0; i < num_iters; ++i) {\n\n\t\t// init state\n\t\tSTATE0_P1 = ABCD_INIT;\n\t\tSTATE0_P2 = ABCD_INIT;\n\t\tSTATE1_P1 = EFGH_INIT;\n\t\tSTATE1_P2 = EFGH_INIT;\n\n\t\t// rounds 0-3\n\t\tMSGV_P1 = vaddq_u32(HASH0_SAVE_P1,vld1q_u32(&K64[0]));\n\t\tMSGV_P2 = vaddq_u32(HASH0_SAVE_P2,vld1q_u32(&K64[0]));\n\t\tSTATEV_P1 = STATE0_P1;\n\t\tSTATEV_P2 = STATE0_P2;\n\t\tSTATE0_P1 = vsha256hq_u32(STATE0_P1,STATE1_P1,MSGV_P1);\n\t\tSTATE0_P2 = vsha256hq_u32(STATE0_P2,STATE1_P2,MSGV_P2);\n\t\tSTATE1_P1 = vsha256h2q_u32(STATE1_P1,STATEV_P1,MSGV_P1);\n\t\tSTATE1_P2 = vsha256h2q_u32(STATE1_P2,STATEV_P2,MSGV_P2);\n\t\tMSGTMP0_P1 = vsha256su0q_u32(HASH0_SAVE_P1,HASH1_SAVE_P1);\n\t\tMSGTMP0_P2 = vsha256su0q_u32(HASH0_SAVE_P2,HASH1_SAVE_P2);\n\n\t\t// rounds 4-7\n\t\tMSGV_P1 = vaddq_u32(HASH1_SAVE_P1,vld1q_u32(&K64[4]));\n\t\tMSGV_P2 = vaddq_u32(HASH1_SAVE_P2,vld1q_u32(&K64[4]));\n\t\tSTATEV_P1 = STATE0_P1;\n\t\tSTATEV_P2 = STATE0_P2;\n\t\tSTATE0_P1 = vsha256hq_u32(STATE0_P1,STATE1_P1,MSGV_P1);\n\t\tSTATE0_P2 = vsha256hq_u32(STATE0_P2,STATE1_P2,MSGV_P2);\n\t\tSTATE1_P1 = vsha256h2q_u32(STATE1_P1,STATEV_P1,MSGV_P1);\n\t\tSTATE1_P2 = vsha256h2q_u32(STATE1_P2,STATEV_P2,MSGV_P2);\n\t\tMSGTMP0_P1 = vsha256su1q_u32(MSGTMP0_P1,HPAD0_CACHE,HPAD1_CACHE);\n\t\tMSGTMP0_P2 = vsha256su1q_u32(MSGTMP0_P2,HPAD0_CACHE,HPAD1_CACHE);\n\t\tMSGTMP1_P1 = vsha256su0q_u32(HASH1_SAVE_P1,HPAD0_CACHE);\n\t\tMSGTMP1_P2 = vsha256su0q_u32(HASH1_SAVE_P2,HPAD0_CACHE);\n\n\t\t// rounds 8-11\n\t\tMSGV_P1 = vaddq_u32(HPAD0_CACHE,vld1q_u32(&K64[8]));\n\t\tMSGV_P2 = vaddq_u32(HPAD0_CACHE,vld1q_u32(&K64[8]));\n\t\tSTATEV_P1 = STATE0_P1;\n\t\tSTATEV_P2 = STATE0_P2;\n\t\tSTATE0_P1 = vsha256hq_u32(STATE0_P1,STATE1_P1,MSGV_P1);\n\t\tSTATE0_P2 = vsha256hq_u32(STATE0_P2,STATE1_P2,MSGV_P2);\n\t\tSTATE1_P1 = vsha256h2q_u32(STATE1_P1,STATEV_P1,MSGV_P1);\n\t\tSTATE1_P2 = vsha256h2q_u32(STATE1_P2,STATEV_P2,MSGV_P2);\n\t\tMSGTMP1_P1 = vsha256su1q_u32(MSGTMP1_P1,HPAD1_CACHE,MSGTMP0_P1);\n\t\tMSGTMP1_P2 = vsha256su1q_u32(MSGTMP1_P2,HPAD1_CACHE,MSGTMP0_P2);\n\t\tMSGTMP2_P1 = HPAD0_CACHE;\n\t\tMSGTMP2_P2 = HPAD0_CACHE;\n\n\t\t// rounds 12-15\n\t\tMSGV_P1 = vaddq_u32(HPAD1_CACHE,vld1q_u32(&K64[12]));\n\t\tMSGV_P2 = vaddq_u32(HPAD1_CACHE,vld1q_u32(&K64[12]));\n\t\tSTATEV_P1 = STATE0_P1;\n\t\tSTATEV_P2 = STATE0_P2;\n\t\tSTATE0_P1 = vsha256hq_u32(STATE0_P1,STATE1_P1,MSGV_P1);\n\t\tSTATE0_P2 = vsha256hq_u32(STATE0_P2,STATE1_P2,MSGV_P2);\n\t\tSTATE1_P1 = vsha256h2q_u32(STATE1_P1,STATEV_P1,MSGV_P1);\n\t\tSTATE1_P2 = vsha256h2q_u32(STATE1_P2,STATEV_P2,MSGV_P2);\n\t\tMSGTMP2_P1 = vsha256su1q_u32(MSGTMP2_P1,MSGTMP0_P1,MSGTMP1_P1);\n\t\tMSGTMP2_P2 = vsha256su1q_u32(MSGTMP2_P2,MSGTMP0_P2,MSGTMP1_P2);\n\t\tMSGTMP3_P1 = vsha256su0q_u32(HPAD1_CACHE,MSGTMP0_P1);\n\t\tMSGTMP3_P2 = vsha256su0q_u32(HPAD1_CACHE,MSGTMP0_P2);\n\n#define SHA256ROUND_X2( \\\nmsgv_p1, msgtmp0_p1, msgtmp1_p1, msgtmp2_p1, msgtmp3_p1, statev_p1, state0_p1, state1_p1, \\\nmsgv_p2, msgtmp0_p2, msgtmp1_p2, msgtmp2_p2, msgtmp3_p2, statev_p2, state0_p2, state1_p2, kvalue) \\\n\tmsgv_p1 = vaddq_u32(msgtmp0_p1,vld1q_u32(kvalue)); \\\n\tmsgv_p2 = vaddq_u32(msgtmp0_p2,vld1q_u32(kvalue)); \\\n\tstatev_p1 = state0_p1; \\\n\tstatev_p2 = state0_p2; \\\n\tstate0_p1 = vsha256hq_u32(state0_p1,state1_p1,msgv_p1); \\\n\tstate0_p2 = vsha256hq_u32(state0_p2,state1_p2,msgv_p2); \\\n\tstate1_p1 = vsha256h2q_u32(state1_p1,statev_p1,msgv_p1); \\\n\tstate1_p2 = vsha256h2q_u32(state1_p2,statev_p2,msgv_p2); \\\n\tmsgtmp3_p1 = vsha256su1q_u32(msgtmp3_p1,msgtmp1_p1,msgtmp2_p1); \\\n\tmsgtmp3_p2 = vsha256su1q_u32(msgtmp3_p2,msgtmp1_p2,msgtmp2_p2); \\\n\tmsgtmp0_p1 = vsha256su0q_u32(msgtmp0_p1,msgtmp1_p1); \\\n\tmsgtmp0_p2 = vsha256su0q_u32(msgtmp0_p2,msgtmp1_p2);\n\n\t\t// rounds 16-19, 20-23, 24-27, 28-31\n\t\tSHA256ROUND_X2(MSGV_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,STATEV_P1,STATE0_P1,STATE1_P1,MSGV_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,STATEV_P2,STATE0_P2,STATE1_P2,&K64[16]);\n\t\tSHA256ROUND_X2(MSGV_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,STATEV_P1,STATE0_P1,STATE1_P1,MSGV_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,STATEV_P2,STATE0_P2,STATE1_P2,&K64[20]);\n\t\tSHA256ROUND_X2(MSGV_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,STATEV_P1,STATE0_P1,STATE1_P1,MSGV_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,STATEV_P2,STATE0_P2,STATE1_P2,&K64[24]);\n\t\tSHA256ROUND_X2(MSGV_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,STATEV_P1,STATE0_P1,STATE1_P1,MSGV_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,STATEV_P2,STATE0_P2,STATE1_P2,&K64[28]);\n\n\t\t// rounds 32-35, 36-39, 40-43, 44-47\n\t\tSHA256ROUND_X2(MSGV_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,STATEV_P1,STATE0_P1,STATE1_P1,MSGV_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,STATEV_P2,STATE0_P2,STATE1_P2,&K64[32]);\n\t\tSHA256ROUND_X2(MSGV_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,STATEV_P1,STATE0_P1,STATE1_P1,MSGV_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,STATEV_P2,STATE0_P2,STATE1_P2,&K64[36]);\n\t\tSHA256ROUND_X2(MSGV_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,STATEV_P1,STATE0_P1,STATE1_P1,MSGV_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,STATEV_P2,STATE0_P2,STATE1_P2,&K64[40]);\n\t\tSHA256ROUND_X2(MSGV_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,STATEV_P1,STATE0_P1,STATE1_P1,MSGV_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,STATEV_P2,STATE0_P2,STATE1_P2,&K64[44]);\n\n\t\t// rounds 48-51\n\t\tMSGV_P1 = vaddq_u32(MSGTMP0_P1,vld1q_u32(&K64[48]));\n\t\tMSGV_P2 = vaddq_u32(MSGTMP0_P2,vld1q_u32(&K64[48]));\n\t\tSTATEV_P1 = STATE0_P1;\n\t\tSTATEV_P2 = STATE0_P2;\n\t\tSTATE0_P1 = vsha256hq_u32(STATE0_P1,STATE1_P1,MSGV_P1);\n\t\tSTATE0_P2 = vsha256hq_u32(STATE0_P2,STATE1_P2,MSGV_P2);\n\t\tSTATE1_P1 = vsha256h2q_u32(STATE1_P1,STATEV_P1,MSGV_P1);\n\t\tSTATE1_P2 = vsha256h2q_u32(STATE1_P2,STATEV_P2,MSGV_P2);\n\t\tMSGTMP3_P1 = vsha256su1q_u32(MSGTMP3_P1,MSGTMP1_P1,MSGTMP2_P1);\n\t\tMSGTMP3_P2 = vsha256su1q_u32(MSGTMP3_P2,MSGTMP1_P2,MSGTMP2_P2);\n\n\t\t// rounds 52-55\n\t\tMSGV_P1 = vaddq_u32(MSGTMP1_P1,vld1q_u32(&K64[52]));\n\t\tMSGV_P2 = vaddq_u32(MSGTMP1_P2,vld1q_u32(&K64[52]));\n\t\tSTATEV_P1 = STATE0_P1;\n\t\tSTATEV_P2 = STATE0_P2;\n\t\tSTATE0_P1 = vsha256hq_u32(STATE0_P1,STATE1_P1,MSGV_P1);\n\t\tSTATE0_P2 = vsha256hq_u32(STATE0_P2,STATE1_P2,MSGV_P2);\n\t\tSTATE1_P1 = vsha256h2q_u32(STATE1_P1,STATEV_P1,MSGV_P1);\n\t\tSTATE1_P2 = vsha256h2q_u32(STATE1_P2,STATEV_P2,MSGV_P2);\n\n\t\t// rounds 56-59\n\t\tMSGV_P1 = vaddq_u32(MSGTMP2_P1,vld1q_u32(&K64[56]));\n\t\tMSGV_P2 = vaddq_u32(MSGTMP2_P2,vld1q_u32(&K64[56]));\n\t\tSTATEV_P1 = STATE0_P1;\n\t\tSTATEV_P2 = STATE0_P2;\n\t\tSTATE0_P1 = vsha256hq_u32(STATE0_P1,STATE1_P1,MSGV_P1);\n\t\tSTATE0_P2 = vsha256hq_u32(STATE0_P2,STATE1_P2,MSGV_P2);\n\t\tSTATE1_P1 = vsha256h2q_u32(STATE1_P1,STATEV_P1,MSGV_P1);\n\t\tSTATE1_P2 = vsha256h2q_u32(STATE1_P2,STATEV_P2,MSGV_P2);\n\n\t\t// rounds 60-63\n\t\tMSGV_P1 = vaddq_u32(MSGTMP3_P1,vld1q_u32(&K64[60]));\n\t\tMSGV_P2 = vaddq_u32(MSGTMP3_P2,vld1q_u32(&K64[60]));\n\t\tSTATEV_P1 = STATE0_P1;\n\t\tSTATEV_P2 = STATE0_P2;\n\t\tSTATE0_P1 = vsha256hq_u32(STATE0_P1,STATE1_P1,MSGV_P1);\n\t\tSTATE0_P2 = vsha256hq_u32(STATE0_P2,STATE1_P2,MSGV_P2);\n\t\tSTATE1_P1 = vsha256h2q_u32(STATE1_P1,STATEV_P1,MSGV_P1);\n\t\tSTATE1_P2 = vsha256h2q_u32(STATE1_P2,STATEV_P2,MSGV_P2);\n\n\t\t// add to state\n\t\tHASH0_SAVE_P1 = vaddq_u32(STATE0_P1,ABCD_INIT);\n\t\tHASH0_SAVE_P2 = vaddq_u32(STATE0_P2,ABCD_INIT);\n\t\tHASH1_SAVE_P1 = vaddq_u32(STATE1_P1,EFGH_INIT);\n\t\tHASH1_SAVE_P2 = vaddq_u32(STATE1_P2,EFGH_INIT);\n\t}\n\n\t// shuffle/return hash\n\tHASH0_SAVE_P1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH0_SAVE_P1)));\n\tHASH1_SAVE_P1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH1_SAVE_P1)));\n\tHASH0_SAVE_P2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH0_SAVE_P2)));\n\tHASH1_SAVE_P2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(HASH1_SAVE_P2)));\n\tvst1q_u32((uint32_t*)(&hash[0]),HASH0_SAVE_P1);\n\tvst1q_u32((uint32_t*)(&hash[16]),HASH1_SAVE_P1);\n\tvst1q_u32((uint32_t*)(&hash[32]),HASH0_SAVE_P2);\n\tvst1q_u32((uint32_t*)(&hash[48]),HASH1_SAVE_P2);\n}\n\n#else // __aarch64__\n\nvoid recursive_sha256_arm(uint8_t* hash, const uint64_t num_iters) {\n\tthrow std::logic_error(\"recursive_sha256_arm() not available\");\n}\n\nvoid recursive_sha256_arm_x2(uint8_t* hash, const uint64_t num_iters) {\n\tthrow std::logic_error(\"recursive_sha256_arm_x2() not available\");\n}\n\n#endif // __aarch64__\n\n"
  },
  {
    "path": "src/sha256_avx2.cpp",
    "content": "/*\n * sha256_avx2.cpp\n *\n *  Created on: Jul 19, 2022\n *      Author: mad\n */\n\n#include <sha256_avx2.h>\n#include <sha256_ni.h>\n#include <sha256_arm.h>\n#include <mmx/hash_t.hpp>\n\n#include <cstring>\n#include <stdexcept>\n\n#if defined(__AVX2__) || defined(_WIN32)\n\n#include <immintrin.h>\n\n#ifdef _WIN32\n#include <intrin.h>\n#define cpuid(info, x)    __cpuidex(info, x, 0)\n#else\n#include <cpuid.h>\ninline void cpuid(int info[4], int InfoType) {\n\t__cpuid_count(InfoType, 0, info[0], info[1], info[2], info[3]);\n}\n#endif\n\nstatic uint64_t xgetbv() {\n#if defined(_MSC_VER)\n  return _xgetbv(0);\n#else\n  uint32_t eax = 0, edx = 0;\n  __asm__ __volatile__(\"xgetbv\\n\" : \"=a\"(eax), \"=d\"(edx) : \"c\"(0));\n  return ((uint64_t)edx << 32) | eax;\n#endif\n}\n\n#define u32 uint32_t\n#define u256 __m256i\n\nstatic const u32 RC[] = {\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n    0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n    0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n    0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n    0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n    0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n};\n\n#define XOR _mm256_xor_si256\n#define OR _mm256_or_si256\n#define AND _mm256_and_si256\n#define ADD32 _mm256_add_epi32\n#define NOT(x) _mm256_xor_si256(x, _mm256_set_epi32(-1, -1, -1, -1, -1, -1, -1, -1))\n\n#define LOAD(src) _mm256_loadu_si256((__m256i *)(src))\n#define STORE(dest,src) _mm256_storeu_si256((__m256i *)(dest),src)\n\n#define SHIFTR32(x, y) _mm256_srli_epi32(x, y)\n#define SHIFTL32(x, y) _mm256_slli_epi32(x, y)\n\n#define ROTR32(x, y) OR(SHIFTR32(x, y), SHIFTL32(x, 32 - y))\n#define ROTL32(x, y) OR(SHIFTL32(x, y), SHIFTR32(x, 32 - y))\n\n#define XOR3(a, b, c) XOR(XOR(a, b), c)\n\n#define ADD3_32(a, b, c) ADD32(ADD32(a, b), c)\n#define ADD4_32(a, b, c, d) ADD32(ADD32(ADD32(a, b), c), d)\n#define ADD5_32(a, b, c, d, e) ADD32(ADD32(ADD32(ADD32(a, b), c), d), e)\n\n#define MAJ_AVX(a, b, c) XOR3(AND(a, b), AND(a, c), AND(b, c))\n#define CH_AVX(a, b, c) XOR(AND(a, b), AND(NOT(a), c))\n\n#define SIGMA1_AVX(x) XOR3(ROTR32(x, 6), ROTR32(x, 11), ROTR32(x, 25))\n#define SIGMA0_AVX(x) XOR3(ROTR32(x, 2), ROTR32(x, 13), ROTR32(x, 22))\n\n#define WSIGMA1_AVX(x) XOR3(ROTR32(x, 17), ROTR32(x, 19), SHIFTR32(x, 10))\n#define WSIGMA0_AVX(x) XOR3(ROTR32(x, 7), ROTR32(x, 18), SHIFTR32(x, 3))\n\n#define SHA256ROUND_AVX(a, b, c, d, e, f, g, h, rc, w) \\\n    T0 = ADD5_32(h, SIGMA1_AVX(e), CH_AVX(e, f, g), _mm256_set1_epi32(RC[rc]), w); \\\n    d = ADD32(d, T0); \\\n    T1 = ADD32(SIGMA0_AVX(a), MAJ_AVX(a, b, c)); \\\n    h = ADD32(T0, T1);\n\n\ninline uint32_t bswap_32(const uint32_t val) {\n\treturn ((val & 0xFF) << 24) | ((val & 0xFF00) << 8) | ((val & 0xFF0000) >> 8) | ((val & 0xFF000000) >> 24);\n}\n\ninline uint64_t bswap_64(const uint64_t val) {\n\treturn (uint64_t(bswap_32(val)) << 32) | bswap_32(val >> 32);\n}\n\n// Transpose 8 vectors containing 32-bit values\ninline void transpose(u256 s[8])\n{\n    u256 tmp0[8];\n    u256 tmp1[8];\n    tmp0[0] = _mm256_unpacklo_epi32(s[0], s[1]);\n    tmp0[1] = _mm256_unpackhi_epi32(s[0], s[1]);\n    tmp0[2] = _mm256_unpacklo_epi32(s[2], s[3]);\n    tmp0[3] = _mm256_unpackhi_epi32(s[2], s[3]);\n    tmp0[4] = _mm256_unpacklo_epi32(s[4], s[5]);\n    tmp0[5] = _mm256_unpackhi_epi32(s[4], s[5]);\n    tmp0[6] = _mm256_unpacklo_epi32(s[6], s[7]);\n    tmp0[7] = _mm256_unpackhi_epi32(s[6], s[7]);\n    tmp1[0] = _mm256_unpacklo_epi64(tmp0[0], tmp0[2]);\n    tmp1[1] = _mm256_unpackhi_epi64(tmp0[0], tmp0[2]);\n    tmp1[2] = _mm256_unpacklo_epi64(tmp0[1], tmp0[3]);\n    tmp1[3] = _mm256_unpackhi_epi64(tmp0[1], tmp0[3]);\n    tmp1[4] = _mm256_unpacklo_epi64(tmp0[4], tmp0[6]);\n    tmp1[5] = _mm256_unpackhi_epi64(tmp0[4], tmp0[6]);\n    tmp1[6] = _mm256_unpacklo_epi64(tmp0[5], tmp0[7]);\n    tmp1[7] = _mm256_unpackhi_epi64(tmp0[5], tmp0[7]);\n    s[0] = _mm256_permute2x128_si256(tmp1[0], tmp1[4], 0x20);\n    s[1] = _mm256_permute2x128_si256(tmp1[1], tmp1[5], 0x20);\n    s[2] = _mm256_permute2x128_si256(tmp1[2], tmp1[6], 0x20);\n    s[3] = _mm256_permute2x128_si256(tmp1[3], tmp1[7], 0x20);\n    s[4] = _mm256_permute2x128_si256(tmp1[0], tmp1[4], 0x31);\n    s[5] = _mm256_permute2x128_si256(tmp1[1], tmp1[5], 0x31);\n    s[6] = _mm256_permute2x128_si256(tmp1[2], tmp1[6], 0x31);\n    s[7] = _mm256_permute2x128_si256(tmp1[3], tmp1[7], 0x31);\n}\n\nvoid sha256_avx2_64_x8(uint8_t* out, uint8_t* in, const uint64_t length)\n{\n\tif(length >= 56) {\n\t\tthrow std::logic_error(\"length >= 56\");\n\t}\n\tconst uint8_t end_bit = 0x80;\n\tconst uint64_t num_bits = bswap_64(length * 8);\n\tconst __m128i MASK = _mm_set_epi64x(0x0c0d0e0f08090a0b, 0x0405060700010203);\n\n\tfor(int i = 0; i < 8; ++i) {\n\t\t::memset(in + i * 64 + length, 0, 64 - length);\n\t\t::memcpy(in + i * 64 + length, &end_bit, 1);\n\t\t::memcpy(in + i * 64 + 56, &num_bits, 8);\n\n\t\t__m128i* input_mm = reinterpret_cast<__m128i*>(in + i * 64);\n\t\tfor(int k = 0; k < 4; ++k) {\n\t\t\tinput_mm[k] = _mm_shuffle_epi8(input_mm[k], MASK);\n\t\t}\n\t}\n\n\tu256 s[8], w[64], T0, T1;\n\n\t// Load words and transform data correctly\n\tfor(int i = 0; i < 8; i++) {\n\t\tw[i] = LOAD(in + 64*i);\n\t\tw[i + 8] = LOAD(in + 32 + 64*i);\n\t}\n\n\ttranspose(w);\n\ttranspose(w + 8);\n\n\t// Initial State\n\ts[0] = _mm256_set_epi32(0x6a09e667,0x6a09e667,0x6a09e667,0x6a09e667,0x6a09e667,0x6a09e667,0x6a09e667,0x6a09e667);\n\ts[1] = _mm256_set_epi32(0xbb67ae85,0xbb67ae85,0xbb67ae85,0xbb67ae85,0xbb67ae85,0xbb67ae85,0xbb67ae85,0xbb67ae85);\n\ts[2] = _mm256_set_epi32(0x3c6ef372,0x3c6ef372,0x3c6ef372,0x3c6ef372,0x3c6ef372,0x3c6ef372,0x3c6ef372,0x3c6ef372);\n\ts[3] = _mm256_set_epi32(0xa54ff53a,0xa54ff53a,0xa54ff53a,0xa54ff53a,0xa54ff53a,0xa54ff53a,0xa54ff53a,0xa54ff53a);\n\ts[4] = _mm256_set_epi32(0x510e527f,0x510e527f,0x510e527f,0x510e527f,0x510e527f,0x510e527f,0x510e527f,0x510e527f);\n\ts[5] = _mm256_set_epi32(0x9b05688c,0x9b05688c,0x9b05688c,0x9b05688c,0x9b05688c,0x9b05688c,0x9b05688c,0x9b05688c);\n\ts[6] = _mm256_set_epi32(0x1f83d9ab,0x1f83d9ab,0x1f83d9ab,0x1f83d9ab,0x1f83d9ab,0x1f83d9ab,0x1f83d9ab,0x1f83d9ab);\n\ts[7] = _mm256_set_epi32(0x5be0cd19,0x5be0cd19,0x5be0cd19,0x5be0cd19,0x5be0cd19,0x5be0cd19,0x5be0cd19,0x5be0cd19);\n\n\tSHA256ROUND_AVX(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 0, w[0]);\n\tSHA256ROUND_AVX(s[7], s[0], s[1], s[2], s[3], s[4], s[5], s[6], 1, w[1]);\n\tSHA256ROUND_AVX(s[6], s[7], s[0], s[1], s[2], s[3], s[4], s[5], 2, w[2]);\n\tSHA256ROUND_AVX(s[5], s[6], s[7], s[0], s[1], s[2], s[3], s[4], 3, w[3]);\n\tSHA256ROUND_AVX(s[4], s[5], s[6], s[7], s[0], s[1], s[2], s[3], 4, w[4]);\n\tSHA256ROUND_AVX(s[3], s[4], s[5], s[6], s[7], s[0], s[1], s[2], 5, w[5]);\n\tSHA256ROUND_AVX(s[2], s[3], s[4], s[5], s[6], s[7], s[0], s[1], 6, w[6]);\n\tSHA256ROUND_AVX(s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[0], 7, w[7]);\n\tSHA256ROUND_AVX(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 8, w[8]);\n\tSHA256ROUND_AVX(s[7], s[0], s[1], s[2], s[3], s[4], s[5], s[6], 9, w[9]);\n\tSHA256ROUND_AVX(s[6], s[7], s[0], s[1], s[2], s[3], s[4], s[5], 10, w[10]);\n\tSHA256ROUND_AVX(s[5], s[6], s[7], s[0], s[1], s[2], s[3], s[4], 11, w[11]);\n\tSHA256ROUND_AVX(s[4], s[5], s[6], s[7], s[0], s[1], s[2], s[3], 12, w[12]);\n\tSHA256ROUND_AVX(s[3], s[4], s[5], s[6], s[7], s[0], s[1], s[2], 13, w[13]);\n\tSHA256ROUND_AVX(s[2], s[3], s[4], s[5], s[6], s[7], s[0], s[1], 14, w[14]);\n\tSHA256ROUND_AVX(s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[0], 15, w[15]);\n\tw[16] = ADD4_32(WSIGMA1_AVX(w[14]), w[0], w[9], WSIGMA0_AVX(w[1]));\n\tSHA256ROUND_AVX(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 16, w[16]);\n\tw[17] = ADD4_32(WSIGMA1_AVX(w[15]), w[1], w[10], WSIGMA0_AVX(w[2]));\n\tSHA256ROUND_AVX(s[7], s[0], s[1], s[2], s[3], s[4], s[5], s[6], 17, w[17]);\n\tw[18] = ADD4_32(WSIGMA1_AVX(w[16]), w[2], w[11], WSIGMA0_AVX(w[3]));\n\tSHA256ROUND_AVX(s[6], s[7], s[0], s[1], s[2], s[3], s[4], s[5], 18, w[18]);\n\tw[19] = ADD4_32(WSIGMA1_AVX(w[17]), w[3], w[12], WSIGMA0_AVX(w[4]));\n\tSHA256ROUND_AVX(s[5], s[6], s[7], s[0], s[1], s[2], s[3], s[4], 19, w[19]);\n\tw[20] = ADD4_32(WSIGMA1_AVX(w[18]), w[4], w[13], WSIGMA0_AVX(w[5]));\n\tSHA256ROUND_AVX(s[4], s[5], s[6], s[7], s[0], s[1], s[2], s[3], 20, w[20]);\n\tw[21] = ADD4_32(WSIGMA1_AVX(w[19]), w[5], w[14], WSIGMA0_AVX(w[6]));\n\tSHA256ROUND_AVX(s[3], s[4], s[5], s[6], s[7], s[0], s[1], s[2], 21, w[21]);\n\tw[22] = ADD4_32(WSIGMA1_AVX(w[20]), w[6], w[15], WSIGMA0_AVX(w[7]));\n\tSHA256ROUND_AVX(s[2], s[3], s[4], s[5], s[6], s[7], s[0], s[1], 22, w[22]);\n\tw[23] = ADD4_32(WSIGMA1_AVX(w[21]), w[7], w[16], WSIGMA0_AVX(w[8]));\n\tSHA256ROUND_AVX(s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[0], 23, w[23]);\n\tw[24] = ADD4_32(WSIGMA1_AVX(w[22]), w[8], w[17], WSIGMA0_AVX(w[9]));\n\tSHA256ROUND_AVX(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 24, w[24]);\n\tw[25] = ADD4_32(WSIGMA1_AVX(w[23]), w[9], w[18], WSIGMA0_AVX(w[10]));\n\tSHA256ROUND_AVX(s[7], s[0], s[1], s[2], s[3], s[4], s[5], s[6], 25, w[25]);\n\tw[26] = ADD4_32(WSIGMA1_AVX(w[24]), w[10], w[19], WSIGMA0_AVX(w[11]));\n\tSHA256ROUND_AVX(s[6], s[7], s[0], s[1], s[2], s[3], s[4], s[5], 26, w[26]);\n\tw[27] = ADD4_32(WSIGMA1_AVX(w[25]), w[11], w[20], WSIGMA0_AVX(w[12]));\n\tSHA256ROUND_AVX(s[5], s[6], s[7], s[0], s[1], s[2], s[3], s[4], 27, w[27]);\n\tw[28] = ADD4_32(WSIGMA1_AVX(w[26]), w[12], w[21], WSIGMA0_AVX(w[13]));\n\tSHA256ROUND_AVX(s[4], s[5], s[6], s[7], s[0], s[1], s[2], s[3], 28, w[28]);\n\tw[29] = ADD4_32(WSIGMA1_AVX(w[27]), w[13], w[22], WSIGMA0_AVX(w[14]));\n\tSHA256ROUND_AVX(s[3], s[4], s[5], s[6], s[7], s[0], s[1], s[2], 29, w[29]);\n\tw[30] = ADD4_32(WSIGMA1_AVX(w[28]), w[14], w[23], WSIGMA0_AVX(w[15]));\n\tSHA256ROUND_AVX(s[2], s[3], s[4], s[5], s[6], s[7], s[0], s[1], 30, w[30]);\n\tw[31] = ADD4_32(WSIGMA1_AVX(w[29]), w[15], w[24], WSIGMA0_AVX(w[16]));\n\tSHA256ROUND_AVX(s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[0], 31, w[31]);\n\tw[32] = ADD4_32(WSIGMA1_AVX(w[30]), w[16], w[25], WSIGMA0_AVX(w[17]));\n\tSHA256ROUND_AVX(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 32, w[32]);\n\tw[33] = ADD4_32(WSIGMA1_AVX(w[31]), w[17], w[26], WSIGMA0_AVX(w[18]));\n\tSHA256ROUND_AVX(s[7], s[0], s[1], s[2], s[3], s[4], s[5], s[6], 33, w[33]);\n\tw[34] = ADD4_32(WSIGMA1_AVX(w[32]), w[18], w[27], WSIGMA0_AVX(w[19]));\n\tSHA256ROUND_AVX(s[6], s[7], s[0], s[1], s[2], s[3], s[4], s[5], 34, w[34]);\n\tw[35] = ADD4_32(WSIGMA1_AVX(w[33]), w[19], w[28], WSIGMA0_AVX(w[20]));\n\tSHA256ROUND_AVX(s[5], s[6], s[7], s[0], s[1], s[2], s[3], s[4], 35, w[35]);\n\tw[36] = ADD4_32(WSIGMA1_AVX(w[34]), w[20], w[29], WSIGMA0_AVX(w[21]));\n\tSHA256ROUND_AVX(s[4], s[5], s[6], s[7], s[0], s[1], s[2], s[3], 36, w[36]);\n\tw[37] = ADD4_32(WSIGMA1_AVX(w[35]), w[21], w[30], WSIGMA0_AVX(w[22]));\n\tSHA256ROUND_AVX(s[3], s[4], s[5], s[6], s[7], s[0], s[1], s[2], 37, w[37]);\n\tw[38] = ADD4_32(WSIGMA1_AVX(w[36]), w[22], w[31], WSIGMA0_AVX(w[23]));\n\tSHA256ROUND_AVX(s[2], s[3], s[4], s[5], s[6], s[7], s[0], s[1], 38, w[38]);\n\tw[39] = ADD4_32(WSIGMA1_AVX(w[37]), w[23], w[32], WSIGMA0_AVX(w[24]));\n\tSHA256ROUND_AVX(s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[0], 39, w[39]);\n\tw[40] = ADD4_32(WSIGMA1_AVX(w[38]), w[24], w[33], WSIGMA0_AVX(w[25]));\n\tSHA256ROUND_AVX(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 40, w[40]);\n\tw[41] = ADD4_32(WSIGMA1_AVX(w[39]), w[25], w[34], WSIGMA0_AVX(w[26]));\n\tSHA256ROUND_AVX(s[7], s[0], s[1], s[2], s[3], s[4], s[5], s[6], 41, w[41]);\n\tw[42] = ADD4_32(WSIGMA1_AVX(w[40]), w[26], w[35], WSIGMA0_AVX(w[27]));\n\tSHA256ROUND_AVX(s[6], s[7], s[0], s[1], s[2], s[3], s[4], s[5], 42, w[42]);\n\tw[43] = ADD4_32(WSIGMA1_AVX(w[41]), w[27], w[36], WSIGMA0_AVX(w[28]));\n\tSHA256ROUND_AVX(s[5], s[6], s[7], s[0], s[1], s[2], s[3], s[4], 43, w[43]);\n\tw[44] = ADD4_32(WSIGMA1_AVX(w[42]), w[28], w[37], WSIGMA0_AVX(w[29]));\n\tSHA256ROUND_AVX(s[4], s[5], s[6], s[7], s[0], s[1], s[2], s[3], 44, w[44]);\n\tw[45] = ADD4_32(WSIGMA1_AVX(w[43]), w[29], w[38], WSIGMA0_AVX(w[30]));\n\tSHA256ROUND_AVX(s[3], s[4], s[5], s[6], s[7], s[0], s[1], s[2], 45, w[45]);\n\tw[46] = ADD4_32(WSIGMA1_AVX(w[44]), w[30], w[39], WSIGMA0_AVX(w[31]));\n\tSHA256ROUND_AVX(s[2], s[3], s[4], s[5], s[6], s[7], s[0], s[1], 46, w[46]);\n\tw[47] = ADD4_32(WSIGMA1_AVX(w[45]), w[31], w[40], WSIGMA0_AVX(w[32]));\n\tSHA256ROUND_AVX(s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[0], 47, w[47]);\n\tw[48] = ADD4_32(WSIGMA1_AVX(w[46]), w[32], w[41], WSIGMA0_AVX(w[33]));\n\tSHA256ROUND_AVX(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 48, w[48]);\n\tw[49] = ADD4_32(WSIGMA1_AVX(w[47]), w[33], w[42], WSIGMA0_AVX(w[34]));\n\tSHA256ROUND_AVX(s[7], s[0], s[1], s[2], s[3], s[4], s[5], s[6], 49, w[49]);\n\tw[50] = ADD4_32(WSIGMA1_AVX(w[48]), w[34], w[43], WSIGMA0_AVX(w[35]));\n\tSHA256ROUND_AVX(s[6], s[7], s[0], s[1], s[2], s[3], s[4], s[5], 50, w[50]);\n\tw[51] = ADD4_32(WSIGMA1_AVX(w[49]), w[35], w[44], WSIGMA0_AVX(w[36]));\n\tSHA256ROUND_AVX(s[5], s[6], s[7], s[0], s[1], s[2], s[3], s[4], 51, w[51]);\n\tw[52] = ADD4_32(WSIGMA1_AVX(w[50]), w[36], w[45], WSIGMA0_AVX(w[37]));\n\tSHA256ROUND_AVX(s[4], s[5], s[6], s[7], s[0], s[1], s[2], s[3], 52, w[52]);\n\tw[53] = ADD4_32(WSIGMA1_AVX(w[51]), w[37], w[46], WSIGMA0_AVX(w[38]));\n\tSHA256ROUND_AVX(s[3], s[4], s[5], s[6], s[7], s[0], s[1], s[2], 53, w[53]);\n\tw[54] = ADD4_32(WSIGMA1_AVX(w[52]), w[38], w[47], WSIGMA0_AVX(w[39]));\n\tSHA256ROUND_AVX(s[2], s[3], s[4], s[5], s[6], s[7], s[0], s[1], 54, w[54]);\n\tw[55] = ADD4_32(WSIGMA1_AVX(w[53]), w[39], w[48], WSIGMA0_AVX(w[40]));\n\tSHA256ROUND_AVX(s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[0], 55, w[55]);\n\tw[56] = ADD4_32(WSIGMA1_AVX(w[54]), w[40], w[49], WSIGMA0_AVX(w[41]));\n\tSHA256ROUND_AVX(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], 56, w[56]);\n\tw[57] = ADD4_32(WSIGMA1_AVX(w[55]), w[41], w[50], WSIGMA0_AVX(w[42]));\n\tSHA256ROUND_AVX(s[7], s[0], s[1], s[2], s[3], s[4], s[5], s[6], 57, w[57]);\n\tw[58] = ADD4_32(WSIGMA1_AVX(w[56]), w[42], w[51], WSIGMA0_AVX(w[43]));\n\tSHA256ROUND_AVX(s[6], s[7], s[0], s[1], s[2], s[3], s[4], s[5], 58, w[58]);\n\tw[59] = ADD4_32(WSIGMA1_AVX(w[57]), w[43], w[52], WSIGMA0_AVX(w[44]));\n\tSHA256ROUND_AVX(s[5], s[6], s[7], s[0], s[1], s[2], s[3], s[4], 59, w[59]);\n\tw[60] = ADD4_32(WSIGMA1_AVX(w[58]), w[44], w[53], WSIGMA0_AVX(w[45]));\n\tSHA256ROUND_AVX(s[4], s[5], s[6], s[7], s[0], s[1], s[2], s[3], 60, w[60]);\n\tw[61] = ADD4_32(WSIGMA1_AVX(w[59]), w[45], w[54], WSIGMA0_AVX(w[46]));\n\tSHA256ROUND_AVX(s[3], s[4], s[5], s[6], s[7], s[0], s[1], s[2], 61, w[61]);\n\tw[62] = ADD4_32(WSIGMA1_AVX(w[60]), w[46], w[55], WSIGMA0_AVX(w[47]));\n\tSHA256ROUND_AVX(s[2], s[3], s[4], s[5], s[6], s[7], s[0], s[1], 62, w[62]);\n\tw[63] = ADD4_32(WSIGMA1_AVX(w[61]), w[47], w[56], WSIGMA0_AVX(w[48]));\n\tSHA256ROUND_AVX(s[1], s[2], s[3], s[4], s[5], s[6], s[7], s[0], 63, w[63]);\n\n\n\t// Feed Forward\n\ts[0] = ADD32(s[0], _mm256_set_epi32(0x6a09e667,0x6a09e667,0x6a09e667,0x6a09e667,0x6a09e667,0x6a09e667,0x6a09e667,0x6a09e667));\n\ts[1] = ADD32(s[1], _mm256_set_epi32(0xbb67ae85,0xbb67ae85,0xbb67ae85,0xbb67ae85,0xbb67ae85,0xbb67ae85,0xbb67ae85,0xbb67ae85));\n\ts[2] = ADD32(s[2], _mm256_set_epi32(0x3c6ef372,0x3c6ef372,0x3c6ef372,0x3c6ef372,0x3c6ef372,0x3c6ef372,0x3c6ef372,0x3c6ef372));\n\ts[3] = ADD32(s[3], _mm256_set_epi32(0xa54ff53a,0xa54ff53a,0xa54ff53a,0xa54ff53a,0xa54ff53a,0xa54ff53a,0xa54ff53a,0xa54ff53a));\n\ts[4] = ADD32(s[4], _mm256_set_epi32(0x510e527f,0x510e527f,0x510e527f,0x510e527f,0x510e527f,0x510e527f,0x510e527f,0x510e527f));\n\ts[5] = ADD32(s[5], _mm256_set_epi32(0x9b05688c,0x9b05688c,0x9b05688c,0x9b05688c,0x9b05688c,0x9b05688c,0x9b05688c,0x9b05688c));\n\ts[6] = ADD32(s[6], _mm256_set_epi32(0x1f83d9ab,0x1f83d9ab,0x1f83d9ab,0x1f83d9ab,0x1f83d9ab,0x1f83d9ab,0x1f83d9ab,0x1f83d9ab));\n\ts[7] = ADD32(s[7], _mm256_set_epi32(0x5be0cd19,0x5be0cd19,0x5be0cd19,0x5be0cd19,0x5be0cd19,0x5be0cd19,0x5be0cd19,0x5be0cd19));\n\n\t// Transpose data again to get correct output\n\ttranspose(s);\n\n\t// Store Hash value\n\tfor(int i = 0; i < 8; i++) {\n\t\tSTORE(out + 32*i, s[i]);\n\t}\n\tfor(int i = 0; i < 8; ++i) {\n\t\tfor(int k = 0; k < 8; ++k) {\n\t\t\tauto& val = ((uint32_t*)out)[i * 8 + k];\n\t\t\tval = bswap_32(val);\n\t\t}\n\t}\n}\n\nbool avx2_available()\n{\n\tbool HW_AVX2 = false;\n\n\tint info[4];\n\tcpuid(info, 0);\n\tconst int nIds = info[0];\n\n\tcpuid(info, 1);\n\n\tif(info[2] & (1UL << 27)) { // OSXSAVE\n\t\tconst uint64_t mask = xgetbv();\n\t\tif((mask & 6) == 6) { // SSE and AVX states\n\t\t\tif(nIds >= 7) {\n\t\t\t\tcpuid(info, 7);\n\t\t\t\tHW_AVX2 = (info[1] & ((int)1 << 5)) != 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn HW_AVX2;\n}\n\n\n\n#else\n\nvoid sha256_avx2_64_x8(uint8_t* out, uint8_t* in, const uint64_t length) {\n\tthrow std::logic_error(\"sha256_avx2() not available\");\n}\n\nbool avx2_available() {\n\treturn false;\n}\n\n#endif // __AVX2__\n"
  },
  {
    "path": "src/sha256_ni.cpp",
    "content": "/*\n * sha256_ni.cpp\n *\n *  Created on: Jul 19, 2022\n *      Author: mad\n */\n\n#include <sha256_ni.h>\n\n#include <cstring>\n#include <stdexcept>\n\n#if defined(__SHA__) || defined(_WIN32)\n\n#include <immintrin.h>\n\n#ifdef _WIN32\n#include <intrin.h>\n#define cpuid(info, x)    __cpuidex(info, x, 0)\n#else\n#include <cpuid.h>\ninline void cpuid(int info[4], int InfoType) {\n\t__cpuid_count(InfoType, 0, info[0], info[1], info[2], info[3]);\n}\n#endif\n\nalignas(64)\nstatic const uint32_t K[] = {\n\t0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,\n\t0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n\t0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,\n\t0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n\t0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,\n\t0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n\t0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,\n\t0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n\t0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,\n\t0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n\t0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,\n\t0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n\t0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,\n\t0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n\t0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,\n\t0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,\n};\n\ninline uint32_t bswap_32(const uint32_t val) {\n\treturn ((val & 0xFF) << 24) | ((val & 0xFF00) << 8) | ((val & 0xFF0000) >> 8) | ((val & 0xFF000000) >> 24);\n}\n\ninline uint64_t bswap_64(const uint64_t val) {\n\treturn (uint64_t(bswap_32(val)) << 32) | bswap_32(val >> 32);\n}\n\nstatic void compress_digest(uint32_t* state, const uint8_t* input, size_t blocks)\n{\n\tconst __m128i* K_mm = reinterpret_cast<const __m128i*>(K);\n\n\tconst __m128i* input_mm = reinterpret_cast<const __m128i*>(input);\n\tconst __m128i MASK = _mm_set_epi64x(0x0c0d0e0f08090a0b, 0x0405060700010203);\n\n\t// Load initial values\n\t__m128i STATE0 = _mm_loadu_si128(reinterpret_cast<__m128i*>(&state[0]));\n\t__m128i STATE1 = _mm_loadu_si128(reinterpret_cast<__m128i*>(&state[4]));\n\n\tSTATE0 = _mm_shuffle_epi32(STATE0, 0xB1); // CDAB\n\tSTATE1 = _mm_shuffle_epi32(STATE1, 0x1B); // EFGH\n\n\t__m128i TMP = _mm_alignr_epi8(STATE0, STATE1, 8); // ABEF\n\tSTATE1 = _mm_blend_epi16(STATE1, STATE0, 0xF0); // CDGH\n\tSTATE0 = TMP;\n\n\twhile(blocks > 0)\n\t{\n\t\t// Save current state\n\t\tconst __m128i ABEF_SAVE = STATE0;\n\t\tconst __m128i CDGH_SAVE = STATE1;\n\n\t\t__m128i MSG;\n\n\t\t__m128i TMSG0 = _mm_shuffle_epi8(_mm_loadu_si128(input_mm), MASK);\n\t\t__m128i TMSG1 = _mm_shuffle_epi8(_mm_loadu_si128(input_mm + 1), MASK);\n\t\t__m128i TMSG2 = _mm_shuffle_epi8(_mm_loadu_si128(input_mm + 2), MASK);\n\t\t__m128i TMSG3 = _mm_shuffle_epi8(_mm_loadu_si128(input_mm + 3), MASK);\n\n\t\t// Rounds 0-3\n\t\tMSG = _mm_add_epi32(TMSG0, _mm_load_si128(K_mm));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\t// Rounds 4-7\n\t\tMSG = _mm_add_epi32(TMSG1, _mm_load_si128(K_mm + 1));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG0 = _mm_sha256msg1_epu32(TMSG0, TMSG1);\n\n\t\t// Rounds 8-11\n\t\tMSG = _mm_add_epi32(TMSG2, _mm_load_si128(K_mm + 2));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG1 = _mm_sha256msg1_epu32(TMSG1, TMSG2);\n\n\t\t// Rounds 12-15\n\t\tMSG = _mm_add_epi32(TMSG3, _mm_load_si128(K_mm + 3));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG0 = _mm_add_epi32(TMSG0, _mm_alignr_epi8(TMSG3, TMSG2, 4));\n\t\tTMSG0 = _mm_sha256msg2_epu32(TMSG0, TMSG3);\n\t\tTMSG2 = _mm_sha256msg1_epu32(TMSG2, TMSG3);\n\n\t\t// Rounds 16-19\n\t\tMSG = _mm_add_epi32(TMSG0, _mm_load_si128(K_mm + 4));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG1 = _mm_add_epi32(TMSG1, _mm_alignr_epi8(TMSG0, TMSG3, 4));\n\t\tTMSG1 = _mm_sha256msg2_epu32(TMSG1, TMSG0);\n\t\tTMSG3 = _mm_sha256msg1_epu32(TMSG3, TMSG0);\n\n\t\t// Rounds 20-23\n\t\tMSG = _mm_add_epi32(TMSG1, _mm_load_si128(K_mm + 5));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG2 = _mm_add_epi32(TMSG2, _mm_alignr_epi8(TMSG1, TMSG0, 4));\n\t\tTMSG2 = _mm_sha256msg2_epu32(TMSG2, TMSG1);\n\t\tTMSG0 = _mm_sha256msg1_epu32(TMSG0, TMSG1);\n\n\t\t// Rounds 24-27\n\t\tMSG = _mm_add_epi32(TMSG2, _mm_load_si128(K_mm + 6));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG3 = _mm_add_epi32(TMSG3, _mm_alignr_epi8(TMSG2, TMSG1, 4));\n\t\tTMSG3 = _mm_sha256msg2_epu32(TMSG3, TMSG2);\n\t\tTMSG1 = _mm_sha256msg1_epu32(TMSG1, TMSG2);\n\n\t\t// Rounds 28-31\n\t\tMSG = _mm_add_epi32(TMSG3, _mm_load_si128(K_mm + 7));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG0 = _mm_add_epi32(TMSG0, _mm_alignr_epi8(TMSG3, TMSG2, 4));\n\t\tTMSG0 = _mm_sha256msg2_epu32(TMSG0, TMSG3);\n\t\tTMSG2 = _mm_sha256msg1_epu32(TMSG2, TMSG3);\n\n\t\t// Rounds 32-35\n\t\tMSG = _mm_add_epi32(TMSG0, _mm_load_si128(K_mm + 8));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG1 = _mm_add_epi32(TMSG1, _mm_alignr_epi8(TMSG0, TMSG3, 4));\n\t\tTMSG1 = _mm_sha256msg2_epu32(TMSG1, TMSG0);\n\t\tTMSG3 = _mm_sha256msg1_epu32(TMSG3, TMSG0);\n\n\t\t// Rounds 36-39\n\t\tMSG = _mm_add_epi32(TMSG1, _mm_load_si128(K_mm + 9));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG2 = _mm_add_epi32(TMSG2, _mm_alignr_epi8(TMSG1, TMSG0, 4));\n\t\tTMSG2 = _mm_sha256msg2_epu32(TMSG2, TMSG1);\n\t\tTMSG0 = _mm_sha256msg1_epu32(TMSG0, TMSG1);\n\n\t\t// Rounds 40-43\n\t\tMSG = _mm_add_epi32(TMSG2, _mm_load_si128(K_mm + 10));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG3 = _mm_add_epi32(TMSG3, _mm_alignr_epi8(TMSG2, TMSG1, 4));\n\t\tTMSG3 = _mm_sha256msg2_epu32(TMSG3, TMSG2);\n\t\tTMSG1 = _mm_sha256msg1_epu32(TMSG1, TMSG2);\n\n\t\t// Rounds 44-47\n\t\tMSG = _mm_add_epi32(TMSG3, _mm_load_si128(K_mm + 11));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG0 = _mm_add_epi32(TMSG0, _mm_alignr_epi8(TMSG3, TMSG2, 4));\n\t\tTMSG0 = _mm_sha256msg2_epu32(TMSG0, TMSG3);\n\t\tTMSG2 = _mm_sha256msg1_epu32(TMSG2, TMSG3);\n\n\t\t// Rounds 48-51\n\t\tMSG = _mm_add_epi32(TMSG0, _mm_load_si128(K_mm + 12));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG1 = _mm_add_epi32(TMSG1, _mm_alignr_epi8(TMSG0, TMSG3, 4));\n\t\tTMSG1 = _mm_sha256msg2_epu32(TMSG1, TMSG0);\n\t\tTMSG3 = _mm_sha256msg1_epu32(TMSG3, TMSG0);\n\n\t\t// Rounds 52-55\n\t\tMSG = _mm_add_epi32(TMSG1, _mm_load_si128(K_mm + 13));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG2 = _mm_add_epi32(TMSG2, _mm_alignr_epi8(TMSG1, TMSG0, 4));\n\t\tTMSG2 = _mm_sha256msg2_epu32(TMSG2, TMSG1);\n\n\t\t// Rounds 56-59\n\t\tMSG = _mm_add_epi32(TMSG2, _mm_load_si128(K_mm + 14));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\tTMSG3 = _mm_add_epi32(TMSG3, _mm_alignr_epi8(TMSG2, TMSG1, 4));\n\t\tTMSG3 = _mm_sha256msg2_epu32(TMSG3, TMSG2);\n\n\t\t// Rounds 60-63\n\t\tMSG = _mm_add_epi32(TMSG3, _mm_load_si128(K_mm + 15));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, _mm_shuffle_epi32(MSG, 0x0E));\n\n\t\t// Add values back to state\n\t\tSTATE0 = _mm_add_epi32(STATE0, ABEF_SAVE);\n\t\tSTATE1 = _mm_add_epi32(STATE1, CDGH_SAVE);\n\n\t\tinput_mm += 4;\n\t\tblocks--;\n\t}\n\n\tSTATE0 = _mm_shuffle_epi32(STATE0, 0x1B); // FEBA\n\tSTATE1 = _mm_shuffle_epi32(STATE1, 0xB1); // DCHG\n\n\t// Save state\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&state[0]), _mm_blend_epi16(STATE0, STATE1, 0xF0)); // DCBA\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&state[4]), _mm_alignr_epi8(STATE1, STATE0, 8)); // ABEF\n}\n\nvoid sha256_ni(uint8_t* out, const uint8_t* in, const uint64_t length)\n{\n\tuint32_t state[] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19};\n\n\tconst auto num_blocks = length / 64;\n\tif(num_blocks) {\n\t\tcompress_digest(state, in, num_blocks);\n\t}\n\tconst auto remain = length % 64;\n\tconst auto final_blocks = (remain + 9 + 63) / 64;\n\tconst uint64_t num_bits = bswap_64(length * 8);\n\tconst uint8_t end_bit = 0x80;\n\n\tuint8_t last[128] = {};\n\t::memcpy(last, in + num_blocks * 64, remain);\n\t::memset(last + remain, 0, sizeof(last) - remain);\n\t::memcpy(last + remain, &end_bit, 1);\n\t::memcpy(last + final_blocks * 64 - 8, &num_bits, 8);\n\n\tcompress_digest(state, last, final_blocks);\n\n\tfor(int k = 0; k < 8; ++k) {\n\t\tstate[k] = bswap_32(state[k]);\n\t}\n\t::memcpy(out, state, 32);\n}\n\nbool sha256_ni_available()\n{\n//\tint a, b, c, d;\n//\n//\t// Look for CPUID.7.0.EBX[29]\n//\t// EAX = 7, ECX = 0\n//\ta = 7;\n//\tc = 0;\n//\n//\tasm volatile (\"cpuid\"\n//\t\t:\"=a\"(a), \"=b\"(b), \"=c\"(c), \"=d\"(d)\n//\t\t:\"a\"(a), \"c\"(c)\n//\t);\n\n\tint info[4];\n\tcpuid(info, 0);\n\tconst int nIds = info[0];\n\n\tif(nIds < 7) {\n\t\treturn false;\n\t}\n\tcpuid(info, 7);\n\n\t// Intel® SHA Extensions feature bit is EBX[29]\n\treturn ((info[1] >> 29) & 1);\n}\n\n#else // __SHA__\n\nvoid sha256_ni(uint8_t* out, const uint8_t* in, const uint64_t length) {\n\tthrow std::logic_error(\"sha256_ni() not available\");\n}\n\nbool sha256_ni_available() {\n\treturn false;\n}\n\n#endif // __SHA__\n\n"
  },
  {
    "path": "src/sha256_ni_rec.cpp",
    "content": "/*\n * sha256_ni_rec.cpp\n *\n *  Created on: May 29, 2023\n *      Author: mad, voidxno\n */\n\n// prerequisite: length is 32 bytes (recursive sha256)\n// prerequisite: length is 64 bytes, 2x 32bytes (_x2)\n// optimization: https://github.com/voidxno/fast-recursive-sha256\n\n#include <sha256_ni.h>\n\n#include <cstring>\n#include <stdexcept>\n\n#if defined(__SHA__) || defined(_WIN32)\n\n#include <immintrin.h>\n\n#ifdef _WIN32\n#include <intrin.h>\n#endif\n\nvoid recursive_sha256_ni(uint8_t* hash, const uint64_t num_iters)\n{\n\tif(num_iters <= 0) {\n\t\treturn;\n\t}\n\n\talignas(64)\n\tstatic const uint32_t K64[64] = {\n\t\t0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,\n\t\t0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n\t\t0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,\n\t\t0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n\t\t0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,\n\t\t0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n\t\t0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,\n\t\t0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n\t\t0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,\n\t\t0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n\t\t0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,\n\t\t0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n\t\t0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,\n\t\t0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n\t\t0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,\n\t\t0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2\n\t};\n\n\t// shuffle mask\n\tconst __m128i SHUF_MASK = _mm_set_epi64x(0x0c0d0e0f08090a0b,0x0405060700010203);\n\n\t// init values\n\tconst __m128i ABEF_INIT = _mm_set_epi64x(0x6a09e667bb67ae85,0x510e527f9b05688c);\n\tconst __m128i CDGH_INIT = _mm_set_epi64x(0x3c6ef372a54ff53a,0x1f83d9ab5be0cd19);\n\n\t// pre-calc/cache padding\n\tconst __m128i HPAD0_CACHE = _mm_set_epi64x(0x0000000000000000,0x0000000080000000);\n\tconst __m128i HPAD1_CACHE = _mm_set_epi64x(0x0000010000000000,0x0000000000000000);\n\n\t__m128i STATE0;\n\t__m128i STATE1;\n\t__m128i MSG;\n\t__m128i MSGTMP0;\n\t__m128i MSGTMP1;\n\t__m128i MSGTMP2;\n\t__m128i MSGTMP3;\n\n\t// init/shuffle hash\n\t__m128i HASH0_SAVE = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[0]));\n\t__m128i HASH1_SAVE = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[16]));\n\tHASH0_SAVE = _mm_shuffle_epi8(HASH0_SAVE,SHUF_MASK);\n\tHASH1_SAVE = _mm_shuffle_epi8(HASH1_SAVE,SHUF_MASK);\n\n\tfor(uint64_t i = 0; i < num_iters; ++i) {\n\n\t\t// init state\n\t\tSTATE0 = ABEF_INIT;\n\t\tSTATE1 = CDGH_INIT;\n\n\t\t// rounds 0-3\n\t\tMSG = HASH0_SAVE;\n\t\tMSGTMP0 = MSG;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[0])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\n\t\t// rounds 4-7\n\t\tMSG = HASH1_SAVE;\n\t\tMSGTMP1 = MSG;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[4])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\t\tMSGTMP0 = _mm_sha256msg1_epu32(MSGTMP0,MSGTMP1);\n\n\t\t// rounds 8-11\n\t\tMSG = HPAD0_CACHE;\n\t\tMSGTMP2 = MSG;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[8])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\t\tMSGTMP1 = _mm_sha256msg1_epu32(MSGTMP1,MSGTMP2);\n\n\t\t// rounds 12-15\n\t\tMSG = HPAD1_CACHE;\n\t\tMSGTMP3 = MSG;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[12])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSGTMP0 = _mm_add_epi32(MSGTMP0,_mm_alignr_epi8(MSGTMP3,MSGTMP2,4));\n\t\tMSGTMP0 = _mm_sha256msg2_epu32(MSGTMP0,MSGTMP3);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\t\tMSGTMP2 = _mm_sha256msg1_epu32(MSGTMP2,MSGTMP3);\n\n#define SHA256ROUND( \\\nmsg, msgtmp0, msgtmp1, msgtmp2, msgtmp3, state0, state1, kvalue) \\\n\tmsg = msgtmp0; \\\n\tmsg = _mm_add_epi32(msg,_mm_load_si128(reinterpret_cast<const __m128i*>(kvalue))); \\\n\tstate1 = _mm_sha256rnds2_epu32(state1,state0,msg); \\\n\tmsgtmp1 = _mm_add_epi32(msgtmp1,_mm_alignr_epi8(msgtmp0,msgtmp3,4)); \\\n\tmsgtmp1 = _mm_sha256msg2_epu32(msgtmp1,msgtmp0); \\\n\tmsg = _mm_shuffle_epi32(msg,0x0E); \\\n\tstate0 = _mm_sha256rnds2_epu32(state0,state1,msg); \\\n\tmsgtmp3 = _mm_sha256msg1_epu32(msgtmp3,msgtmp0);\n\n\t\t//-- rounds 16-19, 20-23, 24-27, 28-31\n\t\tSHA256ROUND(MSG,MSGTMP0,MSGTMP1,MSGTMP2,MSGTMP3,STATE0,STATE1,&K64[16]);\n\t\tSHA256ROUND(MSG,MSGTMP1,MSGTMP2,MSGTMP3,MSGTMP0,STATE0,STATE1,&K64[20]);\n\t\tSHA256ROUND(MSG,MSGTMP2,MSGTMP3,MSGTMP0,MSGTMP1,STATE0,STATE1,&K64[24]);\n\t\tSHA256ROUND(MSG,MSGTMP3,MSGTMP0,MSGTMP1,MSGTMP2,STATE0,STATE1,&K64[28]);\n\n\t\t//-- rounds 32-35, 36-39, 40-43, 44-47\n\t\tSHA256ROUND(MSG,MSGTMP0,MSGTMP1,MSGTMP2,MSGTMP3,STATE0,STATE1,&K64[32]);\n\t\tSHA256ROUND(MSG,MSGTMP1,MSGTMP2,MSGTMP3,MSGTMP0,STATE0,STATE1,&K64[36]);\n\t\tSHA256ROUND(MSG,MSGTMP2,MSGTMP3,MSGTMP0,MSGTMP1,STATE0,STATE1,&K64[40]);\n\t\tSHA256ROUND(MSG,MSGTMP3,MSGTMP0,MSGTMP1,MSGTMP2,STATE0,STATE1,&K64[44]);\n\n\t\t//-- rounds 48-51\n\t\tSHA256ROUND(MSG,MSGTMP0,MSGTMP1,MSGTMP2,MSGTMP3,STATE0,STATE1,&K64[48]);\n\n\t\t// rounds 52-55\n\t\tMSG = MSGTMP1;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[52])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSGTMP2 = _mm_add_epi32(MSGTMP2,_mm_alignr_epi8(MSGTMP1,MSGTMP0,4));\n\t\tMSGTMP2 = _mm_sha256msg2_epu32(MSGTMP2,MSGTMP1);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\n\t\t// rounds 56-59\n\t\tMSG = MSGTMP2;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[56])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSGTMP3 = _mm_add_epi32(MSGTMP3,_mm_alignr_epi8(MSGTMP2,MSGTMP1,4));\n\t\tMSGTMP3 = _mm_sha256msg2_epu32(MSGTMP3,MSGTMP2);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\n\t\t// rounds 60-63\n\t\tMSG = MSGTMP3;\n\t\tMSG = _mm_add_epi32(MSG,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[60])));\n\t\tSTATE1 = _mm_sha256rnds2_epu32(STATE1,STATE0,MSG);\n\t\tMSG = _mm_shuffle_epi32(MSG,0x0E);\n\t\tSTATE0 = _mm_sha256rnds2_epu32(STATE0,STATE1,MSG);\n\n\t\t// add to state\n\t\tSTATE0 = _mm_add_epi32(STATE0,ABEF_INIT);\n\t\tSTATE1 = _mm_add_epi32(STATE1,CDGH_INIT);\n\n\t\t// reorder hash\n\t\tSTATE0 = _mm_shuffle_epi32(STATE0,0x1B); // FEBA\n\t\tSTATE1 = _mm_shuffle_epi32(STATE1,0xB1); // DCHG\n\t\tHASH0_SAVE = _mm_blend_epi16(STATE0,STATE1,0xF0); // DCBA\n\t\tHASH1_SAVE = _mm_alignr_epi8(STATE1,STATE0,8); // HGFE\n\t}\n\n\t// shuffle/return hash\n\tHASH0_SAVE = _mm_shuffle_epi8(HASH0_SAVE,SHUF_MASK);\n\tHASH1_SAVE = _mm_shuffle_epi8(HASH1_SAVE,SHUF_MASK);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[0]),HASH0_SAVE);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[16]),HASH1_SAVE);\n}\n\nvoid recursive_sha256_ni_x2(uint8_t* hash, const uint64_t num_iters)\n{\n\tif(num_iters <= 0) {\n\t\treturn;\n\t}\n\n\talignas(64)\n\tstatic const uint32_t K64[64] = {\n\t\t0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,\n\t\t0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n\t\t0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,\n\t\t0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n\t\t0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,\n\t\t0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n\t\t0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,\n\t\t0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n\t\t0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,\n\t\t0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n\t\t0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,\n\t\t0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n\t\t0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,\n\t\t0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n\t\t0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,\n\t\t0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2\n\t};\n\n\t// shuffle mask\n\tconst __m128i SHUF_MASK = _mm_set_epi64x(0x0c0d0e0f08090a0b,0x0405060700010203);\n\n\t// init values\n\tconst __m128i ABEF_INIT = _mm_set_epi64x(0x6a09e667bb67ae85,0x510e527f9b05688c);\n\tconst __m128i CDGH_INIT = _mm_set_epi64x(0x3c6ef372a54ff53a,0x1f83d9ab5be0cd19);\n\n\t// pre-calc/cache padding\n\tconst __m128i HPAD0_CACHE = _mm_set_epi64x(0x0000000000000000,0x0000000080000000);\n\tconst __m128i HPAD1_CACHE = _mm_set_epi64x(0x0000010000000000,0x0000000000000000);\n\n\t__m128i STATE0_P1;\n\t__m128i STATE1_P1;\n\t__m128i MSG_P1;\n\t__m128i MSGTMP0_P1;\n\t__m128i MSGTMP1_P1;\n\t__m128i MSGTMP2_P1;\n\t__m128i MSGTMP3_P1;\n\t__m128i STATE0_P2;\n\t__m128i STATE1_P2;\n\t__m128i MSG_P2;\n\t__m128i MSGTMP0_P2;\n\t__m128i MSGTMP1_P2;\n\t__m128i MSGTMP2_P2;\n\t__m128i MSGTMP3_P2;\n\n\t// init/shuffle hash\n\t__m128i HASH0_SAVE_P1 = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[0]));\n\t__m128i HASH1_SAVE_P1 = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[16]));\n\t__m128i HASH0_SAVE_P2 = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[32]));\n\t__m128i HASH1_SAVE_P2 = _mm_loadu_si128(reinterpret_cast<__m128i*>(&hash[48]));\n\tHASH0_SAVE_P1 = _mm_shuffle_epi8(HASH0_SAVE_P1,SHUF_MASK);\n\tHASH1_SAVE_P1 = _mm_shuffle_epi8(HASH1_SAVE_P1,SHUF_MASK);\n\tHASH0_SAVE_P2 = _mm_shuffle_epi8(HASH0_SAVE_P2,SHUF_MASK);\n\tHASH1_SAVE_P2 = _mm_shuffle_epi8(HASH1_SAVE_P2,SHUF_MASK);\n\n\tfor(uint64_t i = 0; i < num_iters; ++i) {\n\n\t\t// init state\n\t\tSTATE0_P1 = ABEF_INIT;\n\t\tSTATE1_P1 = CDGH_INIT;\n\t\tSTATE0_P2 = ABEF_INIT;\n\t\tSTATE1_P2 = CDGH_INIT;\n\n\t\t// rounds 0-3\n\t\tMSG_P1 = HASH0_SAVE_P1;\n\t\tMSG_P2 = HASH0_SAVE_P2;\n\t\tMSGTMP0_P1 = MSG_P1;\n\t\tMSGTMP0_P2 = MSG_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[0])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[0])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\n\t\t// rounds 4-7\n\t\tMSG_P1 = HASH1_SAVE_P1;\n\t\tMSG_P2 = HASH1_SAVE_P2;\n\t\tMSGTMP1_P1 = MSG_P1;\n\t\tMSGTMP1_P2 = MSG_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[4])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[4])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\t\tMSGTMP0_P1 = _mm_sha256msg1_epu32(MSGTMP0_P1,MSGTMP1_P1);\n\t\tMSGTMP0_P2 = _mm_sha256msg1_epu32(MSGTMP0_P2,MSGTMP1_P2);\n\n\t\t// rounds 8-11\n\t\tMSG_P1 = HPAD0_CACHE;\n\t\tMSG_P2 = HPAD0_CACHE;\n\t\tMSGTMP2_P1 = MSG_P1;\n\t\tMSGTMP2_P2 = MSG_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[8])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[8])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\t\tMSGTMP1_P1 = _mm_sha256msg1_epu32(MSGTMP1_P1,MSGTMP2_P1);\n\t\tMSGTMP1_P2 = _mm_sha256msg1_epu32(MSGTMP1_P2,MSGTMP2_P2);\n\n\t\t// rounds 12-15\n\t\tMSG_P1 = HPAD1_CACHE;\n\t\tMSG_P2 = HPAD1_CACHE;\n\t\tMSGTMP3_P1 = MSG_P1;\n\t\tMSGTMP3_P2 = MSG_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[12])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[12])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSGTMP0_P1 = _mm_add_epi32(MSGTMP0_P1,_mm_alignr_epi8(MSGTMP3_P1,MSGTMP2_P1,4));\n\t\tMSGTMP0_P2 = _mm_add_epi32(MSGTMP0_P2,_mm_alignr_epi8(MSGTMP3_P2,MSGTMP2_P2,4));\n\t\tMSGTMP0_P1 = _mm_sha256msg2_epu32(MSGTMP0_P1,MSGTMP3_P1);\n\t\tMSGTMP0_P2 = _mm_sha256msg2_epu32(MSGTMP0_P2,MSGTMP3_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\t\tMSGTMP2_P1 = _mm_sha256msg1_epu32(MSGTMP2_P1,MSGTMP3_P1);\n\t\tMSGTMP2_P2 = _mm_sha256msg1_epu32(MSGTMP2_P2,MSGTMP3_P2);\n\n#define SHA256ROUND_X2( \\\nmsg_p1, msgtmp0_p1, msgtmp1_p1, msgtmp2_p1, msgtmp3_p1, state0_p1, state1_p1, \\\nmsg_p2, msgtmp0_p2, msgtmp1_p2, msgtmp2_p2, msgtmp3_p2, state0_p2, state1_p2, kvalue) \\\n\tmsg_p1 = msgtmp0_p1; \\\n\tmsg_p2 = msgtmp0_p2; \\\n\tmsg_p1 = _mm_add_epi32(msg_p1,_mm_load_si128(reinterpret_cast<const __m128i*>(kvalue))); \\\n\tmsg_p2 = _mm_add_epi32(msg_p2,_mm_load_si128(reinterpret_cast<const __m128i*>(kvalue))); \\\n\tstate1_p1 = _mm_sha256rnds2_epu32(state1_p1,state0_p1,msg_p1); \\\n\tstate1_p2 = _mm_sha256rnds2_epu32(state1_p2,state0_p2,msg_p2); \\\n\tmsgtmp1_p1 = _mm_add_epi32(msgtmp1_p1,_mm_alignr_epi8(msgtmp0_p1,msgtmp3_p1,4)); \\\n\tmsgtmp1_p2 = _mm_add_epi32(msgtmp1_p2,_mm_alignr_epi8(msgtmp0_p2,msgtmp3_p2,4)); \\\n\tmsgtmp1_p1 = _mm_sha256msg2_epu32(msgtmp1_p1,msgtmp0_p1); \\\n\tmsgtmp1_p2 = _mm_sha256msg2_epu32(msgtmp1_p2,msgtmp0_p2); \\\n\tmsg_p1 = _mm_shuffle_epi32(msg_p1,0x0E); \\\n\tmsg_p2 = _mm_shuffle_epi32(msg_p2,0x0E); \\\n\tstate0_p1 = _mm_sha256rnds2_epu32(state0_p1,state1_p1,msg_p1); \\\n\tstate0_p2 = _mm_sha256rnds2_epu32(state0_p2,state1_p2,msg_p2); \\\n\tmsgtmp3_p1 = _mm_sha256msg1_epu32(msgtmp3_p1,msgtmp0_p1); \\\n\tmsgtmp3_p2 = _mm_sha256msg1_epu32(msgtmp3_p2,msgtmp0_p2);\n\n\t\t//-- rounds 16-19, 20-23, 24-27, 28-31\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,STATE0_P2,STATE1_P2,&K64[16]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,STATE0_P2,STATE1_P2,&K64[20]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,STATE0_P2,STATE1_P2,&K64[24]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,STATE0_P2,STATE1_P2,&K64[28]);\n\n\t\t//-- rounds 32-35, 36-39, 40-43, 44-47\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,STATE0_P2,STATE1_P2,&K64[32]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,STATE0_P2,STATE1_P2,&K64[36]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP2_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP2_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,STATE0_P2,STATE1_P2,&K64[40]);\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP3_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP3_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,STATE0_P2,STATE1_P2,&K64[44]);\n\n\t\t//-- rounds 48-51\n\t\tSHA256ROUND_X2(MSG_P1,MSGTMP0_P1,MSGTMP1_P1,MSGTMP2_P1,MSGTMP3_P1,STATE0_P1,STATE1_P1,MSG_P2,MSGTMP0_P2,MSGTMP1_P2,MSGTMP2_P2,MSGTMP3_P2,STATE0_P2,STATE1_P2,&K64[48]);\n\n\t\t// rounds 52-55\n\t\tMSG_P1 = MSGTMP1_P1;\n\t\tMSG_P2 = MSGTMP1_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[52])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[52])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSGTMP2_P1 = _mm_add_epi32(MSGTMP2_P1,_mm_alignr_epi8(MSGTMP1_P1,MSGTMP0_P1,4));\n\t\tMSGTMP2_P2 = _mm_add_epi32(MSGTMP2_P2,_mm_alignr_epi8(MSGTMP1_P2,MSGTMP0_P2,4));\n\t\tMSGTMP2_P1 = _mm_sha256msg2_epu32(MSGTMP2_P1,MSGTMP1_P1);\n\t\tMSGTMP2_P2 = _mm_sha256msg2_epu32(MSGTMP2_P2,MSGTMP1_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\n\t\t// rounds 56-59\n\t\tMSG_P1 = MSGTMP2_P1;\n\t\tMSG_P2 = MSGTMP2_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[56])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[56])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSGTMP3_P1 = _mm_add_epi32(MSGTMP3_P1,_mm_alignr_epi8(MSGTMP2_P1,MSGTMP1_P1,4));\n\t\tMSGTMP3_P2 = _mm_add_epi32(MSGTMP3_P2,_mm_alignr_epi8(MSGTMP2_P2,MSGTMP1_P2,4));\n\t\tMSGTMP3_P1 = _mm_sha256msg2_epu32(MSGTMP3_P1,MSGTMP2_P1);\n\t\tMSGTMP3_P2 = _mm_sha256msg2_epu32(MSGTMP3_P2,MSGTMP2_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\n\t\t// rounds 60-63\n\t\tMSG_P1 = MSGTMP3_P1;\n\t\tMSG_P2 = MSGTMP3_P2;\n\t\tMSG_P1 = _mm_add_epi32(MSG_P1,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[60])));\n\t\tMSG_P2 = _mm_add_epi32(MSG_P2,_mm_load_si128(reinterpret_cast<const __m128i*>(&K64[60])));\n\t\tSTATE1_P1 = _mm_sha256rnds2_epu32(STATE1_P1,STATE0_P1,MSG_P1);\n\t\tSTATE1_P2 = _mm_sha256rnds2_epu32(STATE1_P2,STATE0_P2,MSG_P2);\n\t\tMSG_P1 = _mm_shuffle_epi32(MSG_P1,0x0E);\n\t\tMSG_P2 = _mm_shuffle_epi32(MSG_P2,0x0E);\n\t\tSTATE0_P1 = _mm_sha256rnds2_epu32(STATE0_P1,STATE1_P1,MSG_P1);\n\t\tSTATE0_P2 = _mm_sha256rnds2_epu32(STATE0_P2,STATE1_P2,MSG_P2);\n\n\t\t// add to state\n\t\tSTATE0_P1 = _mm_add_epi32(STATE0_P1,ABEF_INIT);\n\t\tSTATE0_P2 = _mm_add_epi32(STATE0_P2,ABEF_INIT);\n\t\tSTATE1_P1 = _mm_add_epi32(STATE1_P1,CDGH_INIT);\n\t\tSTATE1_P2 = _mm_add_epi32(STATE1_P2,CDGH_INIT);\n\n\t\t// reorder hash\n\t\tSTATE0_P1 = _mm_shuffle_epi32(STATE0_P1,0x1B); // FEBA\n\t\tSTATE1_P1 = _mm_shuffle_epi32(STATE1_P1,0xB1); // DCHG\n\t\tSTATE0_P2 = _mm_shuffle_epi32(STATE0_P2,0x1B); // FEBA\n\t\tSTATE1_P2 = _mm_shuffle_epi32(STATE1_P2,0xB1); // DCHG\n\t\tHASH0_SAVE_P1 = _mm_blend_epi16(STATE0_P1,STATE1_P1,0xF0); // DCBA\n\t\tHASH1_SAVE_P1 = _mm_alignr_epi8(STATE1_P1,STATE0_P1,8); // HGFE\n\t\tHASH0_SAVE_P2 = _mm_blend_epi16(STATE0_P2,STATE1_P2,0xF0); // DCBA\n\t\tHASH1_SAVE_P2 = _mm_alignr_epi8(STATE1_P2,STATE0_P2,8); // HGFE\n\t}\n\n\t// shuffle/return hash\n\tHASH0_SAVE_P1 = _mm_shuffle_epi8(HASH0_SAVE_P1,SHUF_MASK);\n\tHASH1_SAVE_P1 = _mm_shuffle_epi8(HASH1_SAVE_P1,SHUF_MASK);\n\tHASH0_SAVE_P2 = _mm_shuffle_epi8(HASH0_SAVE_P2,SHUF_MASK);\n\tHASH1_SAVE_P2 = _mm_shuffle_epi8(HASH1_SAVE_P2,SHUF_MASK);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[0]),HASH0_SAVE_P1);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[16]),HASH1_SAVE_P1);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[32]),HASH0_SAVE_P2);\n\t_mm_storeu_si128(reinterpret_cast<__m128i*>(&hash[48]),HASH1_SAVE_P2);\n}\n\n#else // __SHA__\n\nvoid recursive_sha256_ni(uint8_t* hash, const uint64_t num_iters) {\n\tthrow std::logic_error(\"recursive_sha256_ni() not available\");\n}\n\nvoid recursive_sha256_ni_x2(uint8_t* hash, const uint64_t num_iters) {\n\tthrow std::logic_error(\"recursive_sha256_ni_x2() not available\");\n}\n\n#endif // __SHA__\n\n"
  },
  {
    "path": "src/sha512.cpp",
    "content": "// Copyright (c) 2014-2019 The Bitcoin Core developers\n// Distributed under the MIT software license, see the accompanying\n// file COPYING or http://www.opensource.org/licenses/mit-license.php.\n\n#include <sha512.h>\n\n#include <stdint.h>\n#include <string.h>\n\n\ninline uint32_t bswap_32(const uint32_t val) {\n\treturn ((val & 0xFF) << 24) | ((val & 0xFF00) << 8) | ((val & 0xFF0000) >> 8) | ((val & 0xFF000000) >> 24);\n}\n\ninline uint64_t bswap_64(const uint64_t val) {\n\treturn (uint64_t(bswap_32(val)) << 32) | bswap_32(val >> 32);\n}\n\nuint64_t inline ReadBE64(const unsigned char* ptr)\n{\n    uint64_t x;\n    memcpy((char*)&x, ptr, 8);\n    return bswap_64(x);\n}\n\nvoid inline WriteBE64(unsigned char* ptr, uint64_t x)\n{\n    uint64_t v = bswap_64(x);\n    memcpy(ptr, (char*)&v, 8);\n}\n\n\n/// Internal SHA-512 implementation.\nnamespace sha512\n{\nuint64_t inline Ch(uint64_t x, uint64_t y, uint64_t z) { return z ^ (x & (y ^ z)); }\nuint64_t inline Maj(uint64_t x, uint64_t y, uint64_t z) { return (x & y) | (z & (x | y)); }\nuint64_t inline Sigma0(uint64_t x) { return (x >> 28 | x << 36) ^ (x >> 34 | x << 30) ^ (x >> 39 | x << 25); }\nuint64_t inline Sigma1(uint64_t x) { return (x >> 14 | x << 50) ^ (x >> 18 | x << 46) ^ (x >> 41 | x << 23); }\nuint64_t inline sigma0(uint64_t x) { return (x >> 1 | x << 63) ^ (x >> 8 | x << 56) ^ (x >> 7); }\nuint64_t inline sigma1(uint64_t x) { return (x >> 19 | x << 45) ^ (x >> 61 | x << 3) ^ (x >> 6); }\n\n/** One round of SHA-512. */\nvoid inline Round(uint64_t a, uint64_t b, uint64_t c, uint64_t& d, uint64_t e, uint64_t f, uint64_t g, uint64_t& h, uint64_t k, uint64_t w)\n{\n    uint64_t t1 = h + Sigma1(e) + Ch(e, f, g) + k + w;\n    uint64_t t2 = Sigma0(a) + Maj(a, b, c);\n    d += t1;\n    h = t1 + t2;\n}\n\n/** Initialize SHA-256 state. */\nvoid inline Initialize(uint64_t* s)\n{\n    s[0] = 0x6a09e667f3bcc908ull;\n    s[1] = 0xbb67ae8584caa73bull;\n    s[2] = 0x3c6ef372fe94f82bull;\n    s[3] = 0xa54ff53a5f1d36f1ull;\n    s[4] = 0x510e527fade682d1ull;\n    s[5] = 0x9b05688c2b3e6c1full;\n    s[6] = 0x1f83d9abfb41bd6bull;\n    s[7] = 0x5be0cd19137e2179ull;\n}\n\n/** Perform one SHA-512 transformation, processing a 128-byte chunk. */\nstatic void Transform(uint64_t* s, const unsigned char* chunk)\n{\n    uint64_t a = s[0], b = s[1], c = s[2], d = s[3], e = s[4], f = s[5], g = s[6], h = s[7];\n    uint64_t w0, w1, w2, w3, w4, w5, w6, w7, w8, w9, w10, w11, w12, w13, w14, w15;\n\n    Round(a, b, c, d, e, f, g, h, 0x428a2f98d728ae22ull, w0 = ReadBE64(chunk + 0));\n    Round(h, a, b, c, d, e, f, g, 0x7137449123ef65cdull, w1 = ReadBE64(chunk + 8));\n    Round(g, h, a, b, c, d, e, f, 0xb5c0fbcfec4d3b2full, w2 = ReadBE64(chunk + 16));\n    Round(f, g, h, a, b, c, d, e, 0xe9b5dba58189dbbcull, w3 = ReadBE64(chunk + 24));\n    Round(e, f, g, h, a, b, c, d, 0x3956c25bf348b538ull, w4 = ReadBE64(chunk + 32));\n    Round(d, e, f, g, h, a, b, c, 0x59f111f1b605d019ull, w5 = ReadBE64(chunk + 40));\n    Round(c, d, e, f, g, h, a, b, 0x923f82a4af194f9bull, w6 = ReadBE64(chunk + 48));\n    Round(b, c, d, e, f, g, h, a, 0xab1c5ed5da6d8118ull, w7 = ReadBE64(chunk + 56));\n    Round(a, b, c, d, e, f, g, h, 0xd807aa98a3030242ull, w8 = ReadBE64(chunk + 64));\n    Round(h, a, b, c, d, e, f, g, 0x12835b0145706fbeull, w9 = ReadBE64(chunk + 72));\n    Round(g, h, a, b, c, d, e, f, 0x243185be4ee4b28cull, w10 = ReadBE64(chunk + 80));\n    Round(f, g, h, a, b, c, d, e, 0x550c7dc3d5ffb4e2ull, w11 = ReadBE64(chunk + 88));\n    Round(e, f, g, h, a, b, c, d, 0x72be5d74f27b896full, w12 = ReadBE64(chunk + 96));\n    Round(d, e, f, g, h, a, b, c, 0x80deb1fe3b1696b1ull, w13 = ReadBE64(chunk + 104));\n    Round(c, d, e, f, g, h, a, b, 0x9bdc06a725c71235ull, w14 = ReadBE64(chunk + 112));\n    Round(b, c, d, e, f, g, h, a, 0xc19bf174cf692694ull, w15 = ReadBE64(chunk + 120));\n\n    Round(a, b, c, d, e, f, g, h, 0xe49b69c19ef14ad2ull, w0 += sigma1(w14) + w9 + sigma0(w1));\n    Round(h, a, b, c, d, e, f, g, 0xefbe4786384f25e3ull, w1 += sigma1(w15) + w10 + sigma0(w2));\n    Round(g, h, a, b, c, d, e, f, 0x0fc19dc68b8cd5b5ull, w2 += sigma1(w0) + w11 + sigma0(w3));\n    Round(f, g, h, a, b, c, d, e, 0x240ca1cc77ac9c65ull, w3 += sigma1(w1) + w12 + sigma0(w4));\n    Round(e, f, g, h, a, b, c, d, 0x2de92c6f592b0275ull, w4 += sigma1(w2) + w13 + sigma0(w5));\n    Round(d, e, f, g, h, a, b, c, 0x4a7484aa6ea6e483ull, w5 += sigma1(w3) + w14 + sigma0(w6));\n    Round(c, d, e, f, g, h, a, b, 0x5cb0a9dcbd41fbd4ull, w6 += sigma1(w4) + w15 + sigma0(w7));\n    Round(b, c, d, e, f, g, h, a, 0x76f988da831153b5ull, w7 += sigma1(w5) + w0 + sigma0(w8));\n    Round(a, b, c, d, e, f, g, h, 0x983e5152ee66dfabull, w8 += sigma1(w6) + w1 + sigma0(w9));\n    Round(h, a, b, c, d, e, f, g, 0xa831c66d2db43210ull, w9 += sigma1(w7) + w2 + sigma0(w10));\n    Round(g, h, a, b, c, d, e, f, 0xb00327c898fb213full, w10 += sigma1(w8) + w3 + sigma0(w11));\n    Round(f, g, h, a, b, c, d, e, 0xbf597fc7beef0ee4ull, w11 += sigma1(w9) + w4 + sigma0(w12));\n    Round(e, f, g, h, a, b, c, d, 0xc6e00bf33da88fc2ull, w12 += sigma1(w10) + w5 + sigma0(w13));\n    Round(d, e, f, g, h, a, b, c, 0xd5a79147930aa725ull, w13 += sigma1(w11) + w6 + sigma0(w14));\n    Round(c, d, e, f, g, h, a, b, 0x06ca6351e003826full, w14 += sigma1(w12) + w7 + sigma0(w15));\n    Round(b, c, d, e, f, g, h, a, 0x142929670a0e6e70ull, w15 += sigma1(w13) + w8 + sigma0(w0));\n\n    Round(a, b, c, d, e, f, g, h, 0x27b70a8546d22ffcull, w0 += sigma1(w14) + w9 + sigma0(w1));\n    Round(h, a, b, c, d, e, f, g, 0x2e1b21385c26c926ull, w1 += sigma1(w15) + w10 + sigma0(w2));\n    Round(g, h, a, b, c, d, e, f, 0x4d2c6dfc5ac42aedull, w2 += sigma1(w0) + w11 + sigma0(w3));\n    Round(f, g, h, a, b, c, d, e, 0x53380d139d95b3dfull, w3 += sigma1(w1) + w12 + sigma0(w4));\n    Round(e, f, g, h, a, b, c, d, 0x650a73548baf63deull, w4 += sigma1(w2) + w13 + sigma0(w5));\n    Round(d, e, f, g, h, a, b, c, 0x766a0abb3c77b2a8ull, w5 += sigma1(w3) + w14 + sigma0(w6));\n    Round(c, d, e, f, g, h, a, b, 0x81c2c92e47edaee6ull, w6 += sigma1(w4) + w15 + sigma0(w7));\n    Round(b, c, d, e, f, g, h, a, 0x92722c851482353bull, w7 += sigma1(w5) + w0 + sigma0(w8));\n    Round(a, b, c, d, e, f, g, h, 0xa2bfe8a14cf10364ull, w8 += sigma1(w6) + w1 + sigma0(w9));\n    Round(h, a, b, c, d, e, f, g, 0xa81a664bbc423001ull, w9 += sigma1(w7) + w2 + sigma0(w10));\n    Round(g, h, a, b, c, d, e, f, 0xc24b8b70d0f89791ull, w10 += sigma1(w8) + w3 + sigma0(w11));\n    Round(f, g, h, a, b, c, d, e, 0xc76c51a30654be30ull, w11 += sigma1(w9) + w4 + sigma0(w12));\n    Round(e, f, g, h, a, b, c, d, 0xd192e819d6ef5218ull, w12 += sigma1(w10) + w5 + sigma0(w13));\n    Round(d, e, f, g, h, a, b, c, 0xd69906245565a910ull, w13 += sigma1(w11) + w6 + sigma0(w14));\n    Round(c, d, e, f, g, h, a, b, 0xf40e35855771202aull, w14 += sigma1(w12) + w7 + sigma0(w15));\n    Round(b, c, d, e, f, g, h, a, 0x106aa07032bbd1b8ull, w15 += sigma1(w13) + w8 + sigma0(w0));\n\n    Round(a, b, c, d, e, f, g, h, 0x19a4c116b8d2d0c8ull, w0 += sigma1(w14) + w9 + sigma0(w1));\n    Round(h, a, b, c, d, e, f, g, 0x1e376c085141ab53ull, w1 += sigma1(w15) + w10 + sigma0(w2));\n    Round(g, h, a, b, c, d, e, f, 0x2748774cdf8eeb99ull, w2 += sigma1(w0) + w11 + sigma0(w3));\n    Round(f, g, h, a, b, c, d, e, 0x34b0bcb5e19b48a8ull, w3 += sigma1(w1) + w12 + sigma0(w4));\n    Round(e, f, g, h, a, b, c, d, 0x391c0cb3c5c95a63ull, w4 += sigma1(w2) + w13 + sigma0(w5));\n    Round(d, e, f, g, h, a, b, c, 0x4ed8aa4ae3418acbull, w5 += sigma1(w3) + w14 + sigma0(w6));\n    Round(c, d, e, f, g, h, a, b, 0x5b9cca4f7763e373ull, w6 += sigma1(w4) + w15 + sigma0(w7));\n    Round(b, c, d, e, f, g, h, a, 0x682e6ff3d6b2b8a3ull, w7 += sigma1(w5) + w0 + sigma0(w8));\n    Round(a, b, c, d, e, f, g, h, 0x748f82ee5defb2fcull, w8 += sigma1(w6) + w1 + sigma0(w9));\n    Round(h, a, b, c, d, e, f, g, 0x78a5636f43172f60ull, w9 += sigma1(w7) + w2 + sigma0(w10));\n    Round(g, h, a, b, c, d, e, f, 0x84c87814a1f0ab72ull, w10 += sigma1(w8) + w3 + sigma0(w11));\n    Round(f, g, h, a, b, c, d, e, 0x8cc702081a6439ecull, w11 += sigma1(w9) + w4 + sigma0(w12));\n    Round(e, f, g, h, a, b, c, d, 0x90befffa23631e28ull, w12 += sigma1(w10) + w5 + sigma0(w13));\n    Round(d, e, f, g, h, a, b, c, 0xa4506cebde82bde9ull, w13 += sigma1(w11) + w6 + sigma0(w14));\n    Round(c, d, e, f, g, h, a, b, 0xbef9a3f7b2c67915ull, w14 += sigma1(w12) + w7 + sigma0(w15));\n    Round(b, c, d, e, f, g, h, a, 0xc67178f2e372532bull, w15 += sigma1(w13) + w8 + sigma0(w0));\n\n    Round(a, b, c, d, e, f, g, h, 0xca273eceea26619cull, w0 += sigma1(w14) + w9 + sigma0(w1));\n    Round(h, a, b, c, d, e, f, g, 0xd186b8c721c0c207ull, w1 += sigma1(w15) + w10 + sigma0(w2));\n    Round(g, h, a, b, c, d, e, f, 0xeada7dd6cde0eb1eull, w2 += sigma1(w0) + w11 + sigma0(w3));\n    Round(f, g, h, a, b, c, d, e, 0xf57d4f7fee6ed178ull, w3 += sigma1(w1) + w12 + sigma0(w4));\n    Round(e, f, g, h, a, b, c, d, 0x06f067aa72176fbaull, w4 += sigma1(w2) + w13 + sigma0(w5));\n    Round(d, e, f, g, h, a, b, c, 0x0a637dc5a2c898a6ull, w5 += sigma1(w3) + w14 + sigma0(w6));\n    Round(c, d, e, f, g, h, a, b, 0x113f9804bef90daeull, w6 += sigma1(w4) + w15 + sigma0(w7));\n    Round(b, c, d, e, f, g, h, a, 0x1b710b35131c471bull, w7 += sigma1(w5) + w0 + sigma0(w8));\n    Round(a, b, c, d, e, f, g, h, 0x28db77f523047d84ull, w8 += sigma1(w6) + w1 + sigma0(w9));\n    Round(h, a, b, c, d, e, f, g, 0x32caab7b40c72493ull, w9 += sigma1(w7) + w2 + sigma0(w10));\n    Round(g, h, a, b, c, d, e, f, 0x3c9ebe0a15c9bebcull, w10 += sigma1(w8) + w3 + sigma0(w11));\n    Round(f, g, h, a, b, c, d, e, 0x431d67c49c100d4cull, w11 += sigma1(w9) + w4 + sigma0(w12));\n    Round(e, f, g, h, a, b, c, d, 0x4cc5d4becb3e42b6ull, w12 += sigma1(w10) + w5 + sigma0(w13));\n    Round(d, e, f, g, h, a, b, c, 0x597f299cfc657e2aull, w13 += sigma1(w11) + w6 + sigma0(w14));\n    Round(c, d, e, f, g, h, a, b, 0x5fcb6fab3ad6faecull, w14 + sigma1(w12) + w7 + sigma0(w15));\n    Round(b, c, d, e, f, g, h, a, 0x6c44198c4a475817ull, w15 + sigma1(w13) + w8 + sigma0(w0));\n\n    s[0] += a;\n    s[1] += b;\n    s[2] += c;\n    s[3] += d;\n    s[4] += e;\n    s[5] += f;\n    s[6] += g;\n    s[7] += h;\n}\n\n} // namespace sha512\n\n\n////// SHA-512\n\nSHA512::SHA512() : bytes(0)\n{\n    sha512::Initialize(s);\n}\n\nSHA512& SHA512::Write(const unsigned char* data, size_t len)\n{\n    const unsigned char* end = data + len;\n    size_t bufsize = bytes % 128;\n    if (bufsize && bufsize + len >= 128) {\n        // Fill the buffer, and process it.\n        memcpy(buf + bufsize, data, 128 - bufsize);\n        bytes += 128 - bufsize;\n        data += 128 - bufsize;\n        sha512::Transform(s, buf);\n        bufsize = 0;\n    }\n    while (end - data >= 128) {\n        // Process full chunks directly from the source.\n        sha512::Transform(s, data);\n        data += 128;\n        bytes += 128;\n    }\n    if (end > data) {\n        // Fill the buffer with what remains.\n        memcpy(buf + bufsize, data, end - data);\n        bytes += end - data;\n    }\n    return *this;\n}\n\nvoid SHA512::Finalize(unsigned char hash[OUTPUT_SIZE])\n{\n    static const unsigned char pad[128] = {0x80};\n    unsigned char sizedesc[16] = {0x00};\n    WriteBE64(sizedesc + 8, bytes << 3);\n    Write(pad, 1 + ((239 - (bytes % 128)) % 128));\n    Write(sizedesc, 16);\n    WriteBE64(hash, s[0]);\n    WriteBE64(hash + 8, s[1]);\n    WriteBE64(hash + 16, s[2]);\n    WriteBE64(hash + 24, s[3]);\n    WriteBE64(hash + 32, s[4]);\n    WriteBE64(hash + 40, s[5]);\n    WriteBE64(hash + 48, s[6]);\n    WriteBE64(hash + 56, s[7]);\n}\n\nSHA512& SHA512::Reset()\n{\n    bytes = 0;\n    sha512::Initialize(s);\n    return *this;\n}\n"
  },
  {
    "path": "src/signature_t.cpp",
    "content": "/*\n * signature_t.cpp\n *\n *  Created on: Apr 6, 2022\n *      Author: mad\n */\n\n#include <mmx/signature_t.hpp>\n\n#include <tuple>\n\n\nnamespace mmx {\n\nstd::mutex g_mutex;\n\n// prevent attacker from generating cache collisions on every node\nconst auto hash_salt = vnx::Hash64::rand();\n\nstd::array<std::tuple<hash_t, pubkey_t, signature_t>, 16384> g_sig_cache;\n\n\nsignature_t::signature_t(const secp256k1_ecdsa_signature& sig)\n{\n\tsecp256k1_ecdsa_signature_serialize_compact(g_secp256k1, data(), &sig);\n}\n\nsecp256k1_ecdsa_signature signature_t::to_secp256k1() const\n{\n\tsecp256k1_ecdsa_signature res;\n\tif(!secp256k1_ecdsa_signature_parse_compact(g_secp256k1, &res, data())) {\n\t\tthrow std::logic_error(\"secp256k1_ecdsa_signature_parse_compact() failed\");\n\t}\n\treturn res;\n}\n\nsignature_t signature_t::sign(const skey_t& skey, const hash_t& hash)\n{\n\tsecp256k1_ecdsa_signature sig;\n\tif(!secp256k1_ecdsa_sign(g_secp256k1, &sig, hash.data(), skey.data(), NULL, NULL)) {\n\t\tthrow std::logic_error(\"secp256k1_ecdsa_sign() failed\");\n\t}\n\treturn signature_t(sig);\n}\n\nsignature_t signature_t::normalized() const\n{\n\tsecp256k1_ecdsa_signature out;\n\tconst auto sig = to_secp256k1();\n\tsecp256k1_ecdsa_signature_normalize(g_secp256k1, &out, &sig);\n\treturn signature_t(out);\n}\n\nbool signature_t::verify(const pubkey_t& pubkey, const hash_t& hash) const\n{\n\tconst size_t sig_hash = vnx::Hash64(crc64(), hash_salt);\n\n\tconst auto entry = std::make_tuple(hash, pubkey, *this);\n\n\tauto& cache = g_sig_cache[sig_hash % g_sig_cache.size()];\n\t{\n\t\tstd::lock_guard lock(g_mutex);\n\t\tif(entry == cache) {\n\t\t\treturn true;\n\t\t}\n\t}\n\tconst auto sig = to_secp256k1();\n\tconst auto key = pubkey.to_secp256k1();\n\tconst bool res = secp256k1_ecdsa_verify(g_secp256k1, &sig, hash.data(), &key);\n\tif(res) {\n\t\tstd::lock_guard lock(g_mutex);\n\t\tcache = entry;\n\t}\n\treturn res;\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/solution/MultiSig.cpp",
    "content": "/*\n * MultiSig.cpp\n *\n *  Created on: Jan 15, 2022\n *      Author: mad\n */\n\n#include <mmx/solution/MultiSig.hxx>\n#include <mmx/write_bytes.h>\n\n\nnamespace mmx {\nnamespace solution {\n\nvnx::bool_t MultiSig::is_valid() const\n{\n\tfor(const auto& entry : solutions) {\n\t\tif(!entry.second || !entry.second->is_valid()) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn Super::is_valid();\n}\n\nhash_t MultiSig::calc_hash() const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", \tversion);\n\twrite_field(out, \"solutions\");\n\twrite_bytes(out, uint32_t(solutions.size()));\n\tfor(const auto& entry : solutions) {\n\t\twrite_bytes_cstr(out, \"pair<>\");\n\t\twrite_bytes(out, entry.first);\n\t\twrite_bytes(out, entry.second ? entry.second->calc_hash() : hash_t());\n\t}\n\twrite_field(out, \"num_required\", num_required);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nuint64_t MultiSig::calc_cost(std::shared_ptr<const ChainParams> params) const\n{\n\tuint64_t cost = params->min_txfee_sign;\n\tfor(const auto& entry : solutions) {\n\t\tif(auto sol = entry.second) {\n\t\t\tcost += sol->calc_cost(params);\n\t\t}\n\t}\n\treturn cost;\n}\n\n\n} // solution\n} // mmx\n"
  },
  {
    "path": "src/solution/PubKey.cpp",
    "content": "/*\n * PubKey.cpp\n *\n *  Created on: Jan 15, 2022\n *      Author: mad\n */\n\n#include <mmx/solution/PubKey.hxx>\n#include <mmx/write_bytes.h>\n\n\nnamespace mmx {\nnamespace solution {\n\nhash_t PubKey::calc_hash() const\n{\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\n\twrite_bytes(out, get_type_hash());\n\twrite_field(out, \"version\", \tversion);\n\twrite_field(out, \"pubkey\",\t\tpubkey);\n\twrite_field(out, \"signature\", \tsignature);\n\tout.flush();\n\n\treturn hash_t(buffer);\n}\n\nuint64_t PubKey::calc_cost(std::shared_ptr<const ChainParams> params) const\n{\n\treturn params->min_txfee_sign;\n}\n\n\n} // solution\n} // mmx\n"
  },
  {
    "path": "src/table.cpp",
    "content": "/*\n * table.cpp\n *\n *  Created on: Sep 11, 2022\n *      Author: mad\n */\n\n#include <mmx/table.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nvoid sync_type_codes(const std::string& file_path)\n{\n\tuint_table<uint64_t, vnx::TypeCode> table(file_path, false);\n\n\ttable.scan([](const uint64_t& code_hash, const vnx::TypeCode& type_code) -> bool {\n\t\tauto copy = std::make_shared<vnx::TypeCode>(type_code);\n\t\tcopy->build();\n\t\tvnx::register_type_code(copy);\n\t\treturn true;\n\t});\n\n\tsize_t num_insert = 0;\n\tfor(auto type_code : vnx::get_all_type_codes())\n\t{\n\t\tbool found = true;\n\t\ttry {\n\t\t\tvnx::TypeCode tmp;\n\t\t\tfound = table.find(type_code->code_hash, tmp);\n\t\t} catch(...) {\n\t\t\t// not found\n\t\t}\n\t\tif(!found) {\n\t\t\ttable.insert(type_code->code_hash, *type_code);\n\t\t\tnum_insert++;\n\t\t}\n\t}\n\tif(num_insert) {\n\t\ttable.commit();\n\t}\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/uint128.cpp",
    "content": "/*\n * uint128.cpp\n *\n *  Created on: May 1, 2022\n *      Author: mad\n */\n\n#include <mmx/uint128.hpp>\n#include <mmx/bytes_t.hpp>\n\n#include <vnx/Variant.hpp>\n\n\nnamespace mmx {\n\nuint128::uint128(const std::string& str) {\n\tuint256_t tmp;\n\tif(str.substr(0, 2) == \"0x\") {\n\t\ttmp = uint256_t(str.substr(2), 16);\n\t} else {\n\t\ttmp = uint256_t(str, 10);\n\t}\n\tif(tmp >> 128) {\n\t\tthrow std::logic_error(\"uint128(std::string) overflow\");\n\t}\n\t*this = tmp.lower();\n}\n\n} // mmx\n\nnamespace vnx {\n\nvoid read(vnx::TypeInput& in, mmx::uint128& value, const vnx::TypeCode* type_code, const uint16_t* code)\n{\n\tswitch(code[0]) {\n\t\tcase CODE_STRING:\n\t\tcase CODE_ALT_STRING: {\n\t\t\tstd::string str;\n\t\t\tvnx::read(in, str, type_code, code);\n\t\t\ttry {\n\t\t\t\tvalue = mmx::uint128(str);\n\t\t\t} catch(...) {\n\t\t\t\tvalue = uint128_0;\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase CODE_UINT8:\n\t\tcase CODE_UINT16:\n\t\tcase CODE_UINT32:\n\t\tcase CODE_UINT64:\n\t\tcase CODE_ALT_UINT8:\n\t\tcase CODE_ALT_UINT16:\n\t\tcase CODE_ALT_UINT32:\n\t\tcase CODE_ALT_UINT64: {\n\t\t\tuint64_t tmp = 0;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\tvalue = uint128_t(tmp);\n\t\t\tbreak;\n\t\t}\n\t\tcase CODE_DYNAMIC:\n\t\tcase CODE_ALT_DYNAMIC: {\n\t\t\tvnx::Variant tmp;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\tvalue = tmp.to<mmx::uint128>();\n\t\t\tbreak;\n\t\t}\n\t\tdefault: {\n\t\t\tmmx::bytes_t<16> tmp;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\tvalue = tmp.to_uint<mmx::uint128>();\n\t\t}\n\t}\n}\n\nvoid write(vnx::TypeOutput& out, const mmx::uint128& value, const vnx::TypeCode* type_code, const uint16_t* code)\n{\n\tmmx::bytes_t<16> tmp;\n\ttmp.from_uint(value);\n\tvnx::write(out, tmp, type_code, code);\n}\n\n\n} // vnx\n"
  },
  {
    "path": "src/upnp_mapper.cpp",
    "content": "/*\n * upnp.cpp\n *\n *  Created on: Oct 22, 2022\n *      Author: mad\n */\n\n#include <upnp_mapper.h>\n#include <vnx/vnx.h>\n#include <chrono>\n\n#ifdef WITH_MINIUPNPC\n\n#include <miniupnpc/miniupnpc.h>\n#include <miniupnpc/upnpcommands.h>\n#include <miniupnpc/upnperrors.h>\n// The minimum supported miniUPnPc API version is set to 10. This keeps compatibility\n// with Ubuntu 16.04 LTS and Debian 8 libminiupnpc-dev packages.\nstatic_assert(MINIUPNPC_API_VERSION >= 10, \"miniUPnPc API version >= 10 assumed\");\n\n\nclass UPNP_MapperMini : public UPNP_Mapper {\npublic:\n\tconst int listen_port;\n\tconst std::string app_name;\n\n\tUPNP_MapperMini(const int port, const std::string& app_name)\n\t\t:\tlisten_port(port), app_name(app_name)\n\t{\n\t\tthread = std::thread(&UPNP_MapperMini::run_loop, this);\n\t}\n\n\t~UPNP_MapperMini()\n\t{\n\t\tstop();\n\t}\n\n\tvoid run_loop()\n\t{\n\t\tstd::unique_lock<std::mutex> lock(mutex);\n\n\t\tbool first_delete = false;\n\t\tbool only_permanent = false;\n\t\tconst auto port = std::to_string(listen_port);\n\n\t\twhile(do_run) {\n\t\t\tconst char* multicastif = nullptr;\n\t\t\tconst char* minissdpdpath = nullptr;\n\t\t\tstruct UPNPDev* devlist = nullptr;\n\t\t\tchar lanaddr[64] = {};\n#if MINIUPNPC_API_VERSION >= 18\n\t\t\tchar wanaddr[64] = {};\n#endif\n\n\t\t\tint error = 0;\n#if MINIUPNPC_API_VERSION < 14\n\t\t\tdevlist = upnpDiscover(2000, multicastif, minissdpdpath, 0, 0, &error);\n#else\n\t\t\tdevlist = upnpDiscover(2000, multicastif, minissdpdpath, 0, 0, 2, &error);\n#endif\n\n\t\t\tstruct UPNPUrls urls;\n\t\t\tstruct IGDdatas data;\n\n\t\t\tconst int ret = UPNP_GetValidIGD(devlist, &urls, &data, lanaddr, sizeof(lanaddr)\n#if MINIUPNPC_API_VERSION >= 18\n\t\t\t\t\t, wanaddr, sizeof(wanaddr)\n#endif\n\t\t\t);\n\t\t\tfreeUPNPDevlist(devlist);\n\t\t\tdevlist = nullptr;\n\n\t\t\tif(ret > 0) {\n\t\t\t\tbool is_mapped = false;\n\n\t\t\t\twhile(do_run) {\n\n\t\t\t\t\tif(!first_delete && only_permanent) {\n\t\t\t\t\t\tfirst_delete = true;\n\t\t\t\t\t\tUPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, port.c_str(), \"TCP\", 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst int ret = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype,\n\t\t\t\t\t\t\tport.c_str(), port.c_str(), lanaddr, app_name.c_str(), \"TCP\", 0, only_permanent ? \"0\" : \"3600\");\n\n\t\t\t\t\tif(ret == 725) {\n\t\t\t\t\t\t// OnlyPermanentLeasesSupported\n\t\t\t\t\t\tconst auto prev = only_permanent;\n\t\t\t\t\t\tonly_permanent = true;\n\t\t\t\t\t\tif(!prev) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if(ret != UPNPCOMMAND_SUCCESS) {\n\t\t\t\t\t\tis_mapped = false;\n\t\t\t\t\t\tvnx::log_info() << \"UPNP_AddPortMapping(\" << port << \", \" << port<< \", \" << lanaddr\n\t\t\t\t\t\t\t\t<< \") failed with code \" << ret << \" (\" << strupnperror(ret) << \")\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tis_mapped = true;\n\t\t\t\t\t\tvnx::log_info() << \"UPnP port mapping successful on \" << listen_port << \" (\" << app_name << \")\";\n\t\t\t\t\t}\n\t\t\t\t\tsignal.wait_for(lock, PORT_MAPPING_REANNOUNCE_PERIOD);\n\n\t\t\t\t\tif(!is_mapped) {\n\t\t\t\t\t\tbreak;\t// re-try everything\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(is_mapped) {\n\t\t\t\t\tconst int ret = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, port.c_str(), \"TCP\", 0);\n\n\t\t\t\t\tif(ret != UPNPCOMMAND_SUCCESS) {\n\t\t\t\t\t\tvnx::log_info() << \"UPNP_DeletePortMapping() failed with code \" << ret << \" (\" << strupnperror(ret) << \")\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvnx::log_info() << \"UPNP_DeletePortMapping() successful\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvnx::log_info() << \"UPNP_GetValidIGD() found no UPnP IGDs\";\n\n\t\t\t\tsignal.wait_for(lock, PORT_MAPPING_REANNOUNCE_PERIOD);\n\t\t\t}\n\t\t\tif(ret != 0) {\n\t\t\t\tFreeUPNPUrls(&urls);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid stop() override\n\t{\n\t\t{\n\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\tdo_run = false;\n\t\t\tsignal.notify_all();\n\t\t}\n\t\tif(thread.joinable()) {\n\t\t\tthread.join();\n\t\t}\n\t}\n\nprivate:\n\tbool do_run = true;\n\n\tstd::mutex mutex;\n\tstd::thread thread;\n\tstd::condition_variable signal;\n\n\tstatic constexpr auto PORT_MAPPING_REANNOUNCE_PERIOD = std::chrono::seconds(1800);\n\n};\n\n\nstd::shared_ptr<UPNP_Mapper> upnp_start_mapping(const int port, const std::string& app_name)\n{\n\treturn std::make_shared<UPNP_MapperMini>(port, app_name);\n}\n\n#else\n\nstd::shared_ptr<UPNP_Mapper> upnp_start_mapping(const int port, const std::string& app_name)\n{\n\treturn nullptr;\n}\n\n#endif // WITH_MINIUPNPC\n\n"
  },
  {
    "path": "src/utils.cpp",
    "content": "/*\n * utils.cpp\n *\n *  Created on: Oct 24, 2024\n *      Author: mad\n */\n\n#include <mmx/utils.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\n\nstatic bool validate_json(vnx::TypeInput& in, const uint16_t* code, const size_t max_recursion, size_t call_depth)\n{\n\tif(++call_depth > max_recursion) {\n\t\treturn false;\n\t}\n\tswitch(code[0]) {\n\t\tcase vnx::CODE_NULL:\n\t\tcase vnx::CODE_BOOL:\n\t\tcase vnx::CODE_UINT8:\n\t\tcase vnx::CODE_UINT16:\n\t\tcase vnx::CODE_UINT32:\n\t\tcase vnx::CODE_UINT64:\n\t\tcase vnx::CODE_INT8:\n\t\tcase vnx::CODE_INT16:\n\t\tcase vnx::CODE_INT32:\n\t\tcase vnx::CODE_INT64:\n\t\tcase vnx::CODE_STRING:\n\t\tcase vnx::CODE_ALT_BOOL:\n\t\tcase vnx::CODE_ALT_UINT8:\n\t\tcase vnx::CODE_ALT_UINT16:\n\t\tcase vnx::CODE_ALT_UINT32:\n\t\tcase vnx::CODE_ALT_UINT64:\n\t\tcase vnx::CODE_ALT_INT8:\n\t\tcase vnx::CODE_ALT_INT16:\n\t\tcase vnx::CODE_ALT_INT32:\n\t\tcase vnx::CODE_ALT_INT64:\n\t\tcase vnx::CODE_ALT_STRING:\n\t\t\tvnx::skip(in, nullptr, code);\n\t\t\treturn true;\n\t\tcase vnx::CODE_LIST:\n\t\tcase vnx::CODE_ALT_LIST: {\n\t\t\tswitch(code[1]) {\n\t\t\t\tcase vnx::CODE_DYNAMIC:\n\t\t\t\tcase vnx::CODE_ALT_DYNAMIC:\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t\tuint32_t size;\n\t\t\tread(in, size);\n\t\t\tif(code[0] == vnx::CODE_ALT_LIST) {\n\t\t\t\tsize = vnx::flip_bytes(size);\n\t\t\t}\n\t\t\tfor(uint32_t i = 0; i < size; ++i) {\n\t\t\t\tif(!validate_json(in, code + 1, max_recursion, call_depth)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tcase vnx::CODE_OBJECT:\n\t\tcase vnx::CODE_ALT_OBJECT: {\n\t\t\tuint32_t size;\n\t\t\tread(in, size);\n\t\t\tif(code[0] == vnx::CODE_ALT_OBJECT) {\n\t\t\t\tsize = vnx::flip_bytes(size);\n\t\t\t}\n\t\t\tfor(uint32_t i = 0; i < size; ++i) {\n\t\t\t\tconst uint16_t key_code = (code[0] == vnx::CODE_OBJECT ? vnx::CODE_STRING : vnx::CODE_ALT_STRING);\n\t\t\t\tconst uint16_t value_code = (code[0] == vnx::CODE_OBJECT ? vnx::CODE_DYNAMIC : vnx::CODE_ALT_DYNAMIC);\n\t\t\t\tvnx::skip(in, nullptr, &key_code);\n\t\t\t\tif(!validate_json(in, &value_code, max_recursion, call_depth)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tcase vnx::CODE_DYNAMIC:\n\t\tcase vnx::CODE_ALT_DYNAMIC: {\n\t\t\tuint16_t byte_code[VNX_MAX_BYTE_CODE_SIZE];\n\t\t\tvnx::read_byte_code(in, byte_code);\n\t\t\treturn validate_json(in, byte_code, max_recursion, call_depth);\n\t\t}\n\t}\n\treturn false;\n}\n\nbool is_json(const vnx::Variant& var)\n{\n\tif(var.empty()) {\n\t\treturn true;\n\t}\n\tvnx::VectorInputStream stream(&var.data);\n\tvnx::TypeInput in(&stream);\n\tconst uint16_t code = vnx::CODE_DYNAMIC;\n\treturn validate_json(in, &code, 100, 0);\n}\n\nuint64_t get_num_bytes(const vnx::Variant& var)\n{\n\tif(var.is_null() || var.is_bool()) {\n\t\treturn 1;\n\t} else if(var.is_long() || var.is_ulong()) {\n\t\treturn 8;\n\t} else if(var.is_string()) {\n\t\treturn 4 + var.to<std::string>().size();\n\t} else if(var.is_array()) {\n\t\tuint64_t total = 4;\n\t\tfor(const auto& entry : var.to<std::vector<vnx::Variant>>()) {\n\t\t\ttotal += get_num_bytes(entry);\n\t\t}\n\t\treturn total;\n\t} else if(var.is_object()) {\n\t\tuint64_t total = 4;\n\t\tconst auto obj = var.to_object();\n\t\tfor(const auto& entry : obj.get_fields()) {\n\t\t\ttotal += entry.first.size() + get_num_bytes(entry.second);\n\t\t}\n\t\treturn total;\n\t}\n\treturn var.size();\n}\n\n\n} // mmx\n"
  },
  {
    "path": "src/vm/Compiler.cpp",
    "content": "/*\n * Compiler.cpp\n *\n *  Created on: Dec 10, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/Compiler.h>\n#include <mmx/vm/Engine.h>\n#include <mmx/vm/instr_t.h>\n#include <mmx/vm/varptr_t.hpp>\n#include <mmx/vm_interface.h>\n#include <mmx/helpers.h>\n\n#include <lexy/dsl.hpp>\n#include <lexy/callback.hpp>\n#include <lexy/action/parse_as_tree.hpp>\n#include <lexy/action/trace.hpp>\n#include <lexy/input/string_input.hpp>\n#include <lexy_ext/parse_tree_algorithm.hpp>\n#include <lexy_ext/report_error.hpp>\n#include <lexy_ext/shell.hpp>\n\n#include <uint256_t.h>\n\n#include <memory>\n#include <iostream>\n\n#include \"std/embedded.h\"\n\n\nnamespace mmx {\nnamespace vm {\n\nnamespace lang {\n\nnamespace dsl = lexy::dsl;\n\nstruct source;\nstruct statement;\nstruct expression;\n\nstatic constexpr auto ws = dsl::whitespace(dsl::ascii::space);\nstatic constexpr auto kw_id = dsl::identifier(dsl::ascii::alpha_underscore, dsl::ascii::alpha_digit_underscore);\n\nstatic constexpr auto kw_if = LEXY_KEYWORD(\"if\", kw_id);\nstatic constexpr auto kw_do = LEXY_KEYWORD(\"do\", kw_id);\nstatic constexpr auto kw_in = LEXY_KEYWORD(\"in\", kw_id);\nstatic constexpr auto kw_of = LEXY_KEYWORD(\"of\", kw_id);\nstatic constexpr auto kw_this = LEXY_KEYWORD(\"this\", kw_id);\nstatic constexpr auto kw_for = LEXY_KEYWORD(\"for\", kw_id);\nstatic constexpr auto kw_else = LEXY_KEYWORD(\"else\", kw_id);\nstatic constexpr auto kw_while = LEXY_KEYWORD(\"while\", kw_id);\nstatic constexpr auto kw_var = LEXY_KEYWORD(\"var\", kw_id);\nstatic constexpr auto kw_let = LEXY_KEYWORD(\"let\", kw_id);\nstatic constexpr auto kw_null = LEXY_KEYWORD(\"null\", kw_id);\nstatic constexpr auto kw_true = LEXY_KEYWORD(\"true\", kw_id);\nstatic constexpr auto kw_false = LEXY_KEYWORD(\"false\", kw_id);\nstatic constexpr auto kw_const = LEXY_KEYWORD(\"const\", kw_id);\nstatic constexpr auto kw_public = LEXY_KEYWORD(\"public\", kw_id);\nstatic constexpr auto kw_payable = LEXY_KEYWORD(\"payable\", kw_id);\nstatic constexpr auto kw_static = LEXY_KEYWORD(\"static\", kw_id);\nstatic constexpr auto kw_export = LEXY_KEYWORD(\"export\", kw_id);\nstatic constexpr auto kw_return = LEXY_KEYWORD(\"return\", kw_id);\nstatic constexpr auto kw_function = LEXY_KEYWORD(\"function\", kw_id);\nstatic constexpr auto kw_namespace = LEXY_KEYWORD(\"package\", kw_id);\nstatic constexpr auto kw_continue = LEXY_KEYWORD(\"continue\", kw_id);\nstatic constexpr auto kw_break = LEXY_KEYWORD(\"break\", kw_id);\nstatic constexpr auto kw_interface = LEXY_KEYWORD(\"interface\", kw_id);\nstatic constexpr auto kw_import = LEXY_KEYWORD(\"import\", kw_id);\nstatic constexpr auto kw_from = LEXY_KEYWORD(\"from\", kw_id);\n\nstruct comment {\n\tstatic constexpr auto name = \"mmx.lang.comment\";\n\tstatic constexpr auto rule = LEXY_LIT(\"//\") >> dsl::loop(\n\t\t\t(dsl::ascii::newline >> dsl::break_) |\n\t\t\t(dsl::eof >> dsl::break_) |\n\t\t\t dsl::ascii::character);\n};\n\nstruct reserved {\n\tstatic constexpr auto name = \"mmx.lang.reserved\";\n\tstatic constexpr auto rule = dsl::literal_set(\n\t\t\tkw_if, kw_do, kw_for, kw_else, kw_while, kw_var, kw_let,\n\t\t\tkw_null, kw_true, kw_false, kw_const, kw_public, kw_return,\n\t\t\tkw_function, kw_namespace, kw_this, kw_export, kw_static, kw_continue,\n\t\t\tkw_break, kw_interface, kw_import);\n};\n\nstruct expected_identifier {\n\tstatic constexpr auto name = \"expected identifier\";\n};\n\nstruct identifier : lexy::token_production {\n\tstatic constexpr auto name = \"mmx.lang.identifier\";\n\tstatic constexpr auto rule = kw_id;\n};\n\nstruct restricted_identifier : lexy::transparent_production {\n\tstruct invalid_reserved {\n\t\tstatic constexpr auto name = \"invalid identifier: reserved keyword\";\n\t};\n\tstatic constexpr auto name = \"mmx.lang.restricted_identifier\";\n\tstatic constexpr auto rule = dsl::peek(dsl::p<reserved>) >> dsl::error<invalid_reserved> | dsl::p<identifier>;\n};\n\nstruct primitive : lexy::token_production {\n\tstatic constexpr auto name = \"mmx.lang.primitive\";\n\tstatic constexpr auto rule = dsl::literal_set(kw_null, kw_true, kw_false);\n};\n\nstruct integer : lexy::transparent_production {\n\tstruct invalid_integer {\n\t\tstatic constexpr auto name = \"invalid integer\";\n\t};\n\tstruct hex : lexy::token_production {\n\t\tstatic constexpr auto name = \"mmx.lang.integer.hex\";\n\t\tstatic constexpr auto rule =\n\t\t\t\tdsl::digits<dsl::hex> >> dsl::if_(dsl::peek(dsl::ascii::alpha_underscore) >> dsl::error<invalid_integer>);\n\t};\n\tstruct binary : lexy::token_production {\n\t\tstatic constexpr auto name = \"mmx.lang.integer.binary\";\n\t\tstatic constexpr auto rule =\n\t\t\t\tdsl::digits<dsl::binary> >> dsl::if_(dsl::peek(dsl::ascii::alpha_digit_underscore) >> dsl::error<invalid_integer>);\n\t};\n\tstruct decimal : lexy::token_production {\n\t\tstatic constexpr auto name = \"mmx.lang.integer.decimal\";\n\t\tstatic constexpr auto rule =\n\t\t\t\tdsl::digits<dsl::decimal> >> dsl::if_(dsl::peek(dsl::ascii::alpha_underscore) >> dsl::error<invalid_integer>);\n\t};\n\tstatic constexpr auto name = \"mmx.lang.integer\";\n\tstatic constexpr auto rule =\n\t\t\t(LEXY_LIT(\"0b\") >> dsl::p<binary>) | (LEXY_LIT(\"0x\") >> dsl::p<hex>) | dsl::p<decimal>;\n};\n\nstruct string : lexy::token_production {\n\tstatic constexpr auto name = \"mmx.lang.string\";\n\tstatic constexpr auto rule = dsl::quoted(-dsl::ascii::control, dsl::backslash_escape);\n};\n\nstruct address : lexy::token_production {\n\tstatic constexpr auto name = \"mmx.lang.address\";\n\tstatic constexpr auto rule =\n\t\t\tdsl::peek(LEXY_LIT(\"mmx1\")) >> dsl::identifier(dsl::ascii::alpha_digit);\n};\n\nstruct constant {\n\tstatic constexpr auto name = \"mmx.lang.constant\";\n\tstatic constexpr auto rule =\n\t\t\tdsl::p<primitive> | dsl::p<address> | dsl::p<string> | dsl::p<integer>;\n};\n\nstruct import_list {\n\tstatic constexpr auto name = \"mmx.lang.import_list\";\n\tstatic constexpr auto rule = dsl::curly_bracketed.list(dsl::recurse<restricted_identifier>, dsl::sep(dsl::comma));\n};\n\nstruct import {\n\tstatic constexpr auto name = \"mmx.lang.import\";\n\tstatic constexpr auto rule =\n\t\t\tkw_import >> dsl::p<import_list> + kw_from + dsl::p<string>;\n};\n\nstruct scope {\n\tstatic constexpr auto name = \"mmx.lang.scope\";\n\tstatic constexpr auto rule = dsl::curly_bracketed(dsl::recurse<source>);\n};\n\nstruct namespace_ex {\n\tstatic constexpr auto name = \"mmx.lang.namespace\";\n\tstatic constexpr auto rule = kw_namespace >> dsl::p<restricted_identifier> + dsl::p<scope>;\n};\n\nstruct expected_constant {\n\tstatic constexpr auto name = \"expected a constant\";\n};\n\nstruct function {\n\tstruct arguments {\n\t\tstruct item {\n\t\t\tstatic constexpr auto name = \"mmx.lang.function.arguments.item\";\n\t\t\tstatic constexpr auto rule = dsl::p<restricted_identifier> +\n\t\t\t\t\tdsl::opt(dsl::equal_sign >> (dsl::p<constant> | dsl::error<expected_constant>));\n\t\t};\n\t\tstatic constexpr auto name = \"mmx.lang.function.arguments\";\n\t\tstatic constexpr auto rule = dsl::parenthesized.opt_list(dsl::p<item>, dsl::sep(dsl::comma));\n\t};\n\tstruct qualifier {\n\t\tstatic constexpr auto name = \"mmx.lang.function.qualifier\";\n\t\tstatic constexpr auto rule = dsl::literal_set(kw_const, kw_public, kw_payable, kw_static);\n\t};\n\tstatic constexpr auto name = \"mmx.lang.function\";\n\tstatic constexpr auto rule = kw_function >>\n\t\t\tdsl::p<restricted_identifier> + dsl::p<arguments> + dsl::while_(dsl::p<qualifier>) + dsl::p<scope>;\n};\n\nstruct operator_ex : lexy::token_production {\n\tstatic constexpr auto name = \"mmx.lang.operator\";\n\tstatic constexpr auto rule = dsl::literal_set(\n\t\t\tdsl::lit_c<'.'>, dsl::lit_c<'+'>, dsl::lit_c<'-'>, dsl::lit_c<'*'>, dsl::lit_c<'/'>, dsl::lit_c<'!'>, dsl::lit_c<'='>,\n\t\t\tdsl::lit_c<'>'>, dsl::lit_c<'<'>, dsl::lit_c<'&'>, dsl::lit_c<'|'>, dsl::lit_c<'^'>, dsl::lit_c<'~'>, dsl::lit_c<'%'>,\n\t\t\tLEXY_LIT(\">=\"), LEXY_LIT(\"<=\"), LEXY_LIT(\"==\"), LEXY_LIT(\"!=\"), LEXY_LIT(\"^^\"), LEXY_LIT(\"&&\"), LEXY_LIT(\"||\"),\n\t\t\tLEXY_LIT(\"++\"), LEXY_LIT(\"--\"), LEXY_LIT(\">>\"), LEXY_LIT(\"<<\"), LEXY_LIT(\"+=\"), LEXY_LIT(\"-=\"),\n\t\t\tLEXY_LIT(\"*=\"), LEXY_LIT(\"/=\"), LEXY_LIT(\"^=\"), LEXY_LIT(\"&=\"), LEXY_LIT(\"|=\"),\n\t\t\tLEXY_LIT(\"^^=\"), LEXY_LIT(\"&&=\"), LEXY_LIT(\"||=\"), LEXY_LIT(\">>=\"), LEXY_LIT(\"<<=\"), kw_return);\n};\n\nstruct qualifier : lexy::token_production {\n\tstatic constexpr auto name = \"mmx.lang.qualifier\";\n\tstatic constexpr auto rule = dsl::literal_set(kw_let, kw_var, kw_const);\n};\n\nstruct variable {\n\tstatic constexpr auto name = \"mmx.lang.variable\";\n\tstatic constexpr auto rule = dsl::p<qualifier> >>\n\t\t\tdsl::p<restricted_identifier> + dsl::opt(dsl::equal_sign >> dsl::recurse<expression>);\n};\n\nstruct interface {\n\tstatic constexpr auto name = \"mmx.lang.interface\";\n\tstatic constexpr auto rule = kw_interface >> dsl::p<restricted_identifier>;\n};\n\nstruct array {\n\tstatic constexpr auto name = \"mmx.lang.array\";\n\tstatic constexpr auto rule = dsl::square_bracketed.opt_list(dsl::recurse<expression>, dsl::trailing_sep(dsl::comma));\n};\n\nstruct object {\n\tstruct expected_key {\n\t\tstatic constexpr auto name = \"expected key\";\n\t};\n\tstruct entry {\n\t\tstatic constexpr auto name = \"mmx.lang.object.entry\";\n\t\tstatic constexpr auto rule =\n\t\t\t\t(dsl::p<string> | dsl::p<identifier> | dsl::error<expected_key>) + dsl::lit_c<':'> + dsl::recurse<expression>;\n\t};\n\tstatic constexpr auto name = \"mmx.lang.object\";\n\tstatic constexpr auto rule = dsl::curly_bracketed.opt_list(dsl::p<entry>, dsl::trailing_sep(dsl::comma));\n};\n\nstruct sub_expr {\n\tstatic constexpr auto name = \"mmx.lang.sub_expr\";\n\tstatic constexpr auto rule = dsl::parenthesized.opt_list(dsl::recurse<expression>, dsl::sep(dsl::comma));\n};\n\nstruct expression {\n\tstatic constexpr auto name = \"mmx.lang.expression\";\n\tstatic constexpr auto rule = dsl::loop(\n\t\t\tdsl::peek_not(dsl::comma | dsl::semicolon | dsl::lit_c<')'> | dsl::lit_c<']'> | dsl::lit_c<'}'> | dsl::eof) >> (\n\t\t\t\t\tdsl::p<sub_expr> | dsl::p<array> | dsl::p<object> | dsl::p<operator_ex> | dsl::p<constant> |\n\t\t\t\t\tdsl::else_ >> dsl::p<identifier>\n\t\t\t) | dsl::break_);\n};\n\nstruct statement {\n\tstatic constexpr auto name = \"mmx.lang.statement\";\n\tstatic constexpr auto rule =\n\t\t\t(dsl::p<variable> | dsl::p<interface> | dsl::p<import> | kw_break | kw_continue | dsl::else_ >> dsl::p<expression>) + dsl::semicolon;\n};\n\nstruct else_ex;\n\nstruct if_ex {\n\tstatic constexpr auto name = \"mmx.lang.if\";\n\tstatic constexpr auto rule = kw_if >>\n\t\t\tdsl::parenthesized(dsl::p<expression>) + (dsl::p<scope> | dsl::else_ >> dsl::p<statement>)\n\t\t\t+ dsl::if_(dsl::peek(kw_else) >> dsl::recurse<else_ex>);\n};\n\nstruct else_ex {\n\tstatic constexpr auto name = \"mmx.lang.else\";\n\tstatic constexpr auto rule = kw_else +\n\t\t\t((dsl::peek(kw_if) >> dsl::recurse<if_ex>) | dsl::p<scope> | dsl::else_ >> dsl::p<statement>)\n\t\t\t+ dsl::if_(dsl::peek(kw_else) >> dsl::recurse<else_ex>);\n};\n\nstruct for_loop {\n\tstatic constexpr auto name = \"mmx.lang.for\";\n\tstatic constexpr auto rule = kw_for >>\n\t\t\tdsl::parenthesized.opt_list(\n\t\t\t\t\t(dsl::p<variable> >> dsl::opt(kw_of >> dsl::p<expression>)) |\n\t\t\t\t\tdsl::else_ >> dsl::p<expression>, dsl::trailing_sep(dsl::comma | dsl::semicolon))\n\t\t\t+ (dsl::p<scope> | dsl::else_ >> dsl::p<statement>);\n};\n\nstruct while_loop {\n\tstatic constexpr auto name = \"mmx.lang.while\";\n\tstatic constexpr auto rule = kw_while >>\n\t\t\tdsl::parenthesized(dsl::p<expression>) + (dsl::p<scope> | dsl::else_ >> dsl::p<statement>);\n};\n\nstruct source {\n\tstatic constexpr auto name = \"mmx.lang.source\";\n\tstatic constexpr auto whitespace = dsl::inline_<comment> | dsl::ascii::space;\n\tstatic constexpr auto rule = dsl::loop(\n\t\t\tdsl::peek_not(dsl::lit_c<'}'> | dsl::eof) >> (\n\t\t\t\t\tdsl::p<namespace_ex> | dsl::p<scope> | dsl::p<function> |\n\t\t\t\t\tdsl::p<if_ex> | dsl::p<for_loop> | dsl::p<while_loop> |\n\t\t\t\t\tdsl::else_ >> dsl::p<statement>\n\t\t\t) | dsl::break_);\n};\n\n} // lang\n\n\ntemplate<typename Node>\nvoid dump_parse_tree(const Node& node, std::ostream& out, int depth = 0, int offset = 0)\n{\n\tout << (depth < 10 ? \" \" : \"\") << depth << \":\" << (offset < 10 ? \" \" : \"\") << offset << \" \";\n\n\tfor(int i = 0; i < depth; ++i) {\n\t\tout << \"  \";\n\t}\n\tconst std::string name(node.kind().name());\n\tout << name;\n\n\tif(node.kind().is_token()) {\n\t\tconst auto token = node.lexeme();\n\t\tout << \": \" << vnx::to_string(std::string(token.begin(), token.end()));\n\t}\n\tout << std::endl;\n\n\tint i = 0;\n\tfor(const auto& child : node.children()) {\n\t\tconst std::string name(child.kind().name());\n\t\tif(name != \"whitespace\") {\n\t\t\tdump_parse_tree(child, out, depth + 1, i++);\n\t\t}\n\t}\n}\n\n\nclass Compiler {\npublic:\n\tstatic const std::string version;\n\n\tconst compile_flags_t flags;\n\n\tCompiler(const compile_flags_t& flags = compile_flags_t());\n\n\tstd::shared_ptr<const contract::Binary> compile(const std::string& source);\n\nprotected:\n\ttypedef lexy::parse_tree<lexy::input_reader<lexy::string_input<lexy::utf8_encoding>>> parse_tree_t;\n\ttypedef typename parse_tree_t::node node_t;\n\n\tstruct variable_t {\n\t\tbool is_const = false;\n\t\tbool is_static = false;\n\t\tuint32_t address = 0;\n\t\tstd::string name;\n\t\tvarptr_t value;\n\t};\n\n\tstruct function_t {\n\t\tbool is_init = false;\n\t\tbool is_const = false;\n\t\tbool is_public = false;\n\t\tbool is_payable = false;\n\t\tuint32_t address = 0;\n\t\tstd::string name;\n\t\tstd::vector<variable_t> args;\n\t\tvnx::optional<node_t> root;\n\t};\n\n\tstruct frame_t {\n\t\tuint32_t section = MEM_STACK;\n\t\tuint32_t addr_offset = 0;\n\t\tstd::vector<variable_t> var_list;\n\t\tstd::map<std::string, uint32_t> var_map;\n\n\t\tuint32_t new_addr() {\n\t\t\treturn section + addr_offset++;\n\t\t}\n\t\tvoid add_variable(const variable_t& var) {\n\t\t\tif(var.name.size()) {\n\t\t\t\tif(!var_map.emplace(var.name, var_list.size()).second) {\n\t\t\t\t\tthrow std::logic_error(\"duplicate variable name: \" + var.name);\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar_list.push_back(var);\n\t\t}\n\t};\n\n\tstruct vref_t {\n\t\tbool is_const = false;\n\t\tbool is_interface = false;\n\t\tuint32_t address = -1;\n\t\tvnx::optional<uint32_t> key;\n\t\tvnx::optional<function_t> func;\n\t\tvnx::optional<std::string> name;\n\t\tvnx::optional<std::string> method;\n\n\t\tvref_t() = default;\n\t\tvref_t(uint32_t address) : address(address) {}\n\t\tvref_t(uint32_t address, std::string name) : address(address), name(name) {}\n\t\tvref_t(uint32_t address, uint32_t key) : address(address), key(key) {}\n\t\tvref_t(const std::string& name) : name(name) {}\n\t\tvref_t(const function_t& func) : func(func), name(func.name) {}\n\n\t\tvoid check_value() const {\n\t\t\tif(func) {\n\t\t\t\tthrow std::logic_error(\"expected value not function\");\n\t\t\t}\n\t\t\tif(is_interface) {\n\t\t\t\tthrow std::logic_error(\"expected value not interface\");\n\t\t\t}\n\t\t\tif(address == uint32_t(-1) && name) {\n\t\t\t\tthrow std::logic_error(\"no such variable: \" + (*name));\n\t\t\t}\n\t\t}\n\t\tbool is_mutable() const {\n\t\t\treturn !is_const || key;\n\t\t}\n\t};\n\n\tvoid parse(parse_tree_t& tree);\n\n\tvref_t recurse(const node_t& node);\n\n\tvref_t recurse_expr(const node_t*& p_node, size_t& expr_len, const vref_t* lhs = nullptr, const int lhs_rank = -1);\n\n\tvref_t copy(const vref_t& dst, const vref_t& src, const bool validate = true);\n\n\tuint32_t get(const vref_t& src, const uint32_t* dst = nullptr);\n\n\tvoid push_scope();\n\n\tvoid pop_scope();\n\n\tconst variable_t* find_variable(const std::string& name) const;\n\n\tconst function_t* find_function(const std::string& name) const;\n\n\tvariable_t get_variable(const std::string& name);\n\n\tuint32_t get_const_address(const varptr_t& value);\n\n\tuint32_t get_const_address(const uint256_t& value);\n\n\tuint32_t get_const_address(const addr_t& value);\n\n\tuint32_t get_const_address(const std::string& value);\n\n\tint get_node_rank(const node_t& node) const;\n\n\tstd::string get_namespace(const bool concat = false) const;\n\n\tstd::ostream& debug(bool ident = false) const;\n\n\tvoid print_debug_info(const node_t& node) const;\n\n\tvoid handle_new_code();\n\n\tuint32_t get_line_number(const node_t& node) const;\n\n\tstatic std::vector<node_t> get_children(const node_t& node);\n\n\tstatic std::string to_source(const node_t& node);\n\n\tstatic std::string get_literal(const node_t& node);\n\n\tstatic varptr_t parse_constant(const node_t& node);\n\nprivate:\n\tint depth = 0;\n\tint curr_pass = 0;\n\n\tuint8_t math_flags = 0;\n\n\tsize_t code_offset = 0;\n\tvnx::optional<node_t> curr_node;\n\tvnx::optional<function_t> curr_function;\n\n\tframe_t global;\n\tstd::vector<instr_t> code;\n\tstd::vector<frame_t> frame;\n\tstd::vector<variable_t> const_vars;\n\tstd::vector<std::string> name_space;\n\n\tstd::map<varptr_t, uint32_t> const_table;\n\tstd::set<std::string> interface_set;\n\tstd::map<std::string, function_t> function_map;\n\tstd::map<uint32_t, uint32_t> line_info;\n\tstd::map<uint32_t, std::string> linker_map;\n\tstd::map<std::string, int> rank_map;\n\tstd::map<std::string, int> simple_code_map;\n\tstd::map<std::string, uint32_t> this_obj_map;\n\n\tstd::string source;\n\tstd::shared_ptr<contract::Binary> binary;\n\n\tmutable std::stringstream debug_out;\n\n};\n\nconst std::string Compiler::version = \"1.1.0\";\n\nCompiler::Compiler(const compile_flags_t& flags)\n\t:\tflags(flags)\n{\n\tif(flags.catch_overflow) {\n\t\tmath_flags |= OPFLAG_CATCH_OVERFLOW;\n\t}\n\n\tint rank = 0;\n\trank_map[\"position\"] = -1;\n\trank_map[lang::constant::name] = rank++;\n\trank_map[lang::identifier::name] = rank++;\n\trank_map[\".\"] = rank++;\n\trank_map[lang::array::name] = rank++;\n\trank_map[lang::sub_expr::name] = rank++;\n\trank_map[lang::object::name] = rank++;\n\trank_map[\"++\"] = rank;\n\trank_map[\"--\"] = rank++;\n\trank_map[\"!\"] = rank;\n\trank_map[\"~\"] = rank++;\n\trank_map[\"*\"] = rank;\n\trank_map[\"/\"] = rank;\n\trank_map[\"%\"] = rank++;\n\trank_map[\"+\"] = rank;\n\trank_map[\"-\"] = rank++;\n\trank_map[\">>\"] = rank;\n\trank_map[\"<<\"] = rank++;\n\trank_map[\"<\"] = rank;\n\trank_map[\">\"] = rank;\n\trank_map[\"<=\"] = rank;\n\trank_map[\">=\"] = rank++;\n\trank_map[\"!=\"] = rank;\n\trank_map[\"==\"] = rank++;\n\trank_map[\"&\"] = rank;\n\trank_map[\"&&\"] = rank++;\n\trank_map[\"^\"] = rank;\n\trank_map[\"^^\"] = rank++;\n\trank_map[\"|\"] = rank;\n\trank_map[\"||\"] = rank++;\n\trank_map[\"=\"] = rank;\n\trank_map[\"+=\"] = rank;\n\trank_map[\"-=\"] = rank;\n\trank_map[\"*=\"] = rank;\n\trank_map[\"/=\"] = rank;\n\trank_map[\"^=\"] = rank;\n\trank_map[\"&=\"] = rank;\n\trank_map[\"|=\"] = rank;\n\trank_map[\"^^=\"] = rank;\n\trank_map[\"&&=\"] = rank;\n\trank_map[\"||=\"] = rank;\n\trank_map[\">>=\"] = rank;\n\trank_map[\"<<=\"] = rank++;\n\trank_map[\"break\"] = rank;\n\trank_map[\"continue\"] = rank;\n\trank_map[\"return\"] = rank++;\n\trank_map[lang::expression::name] = rank++;\n\n\tsimple_code_map[\"+\"] = OP_ADD;\n\tsimple_code_map[\"-\"] = OP_SUB;\n\tsimple_code_map[\"*\"] = OP_MUL;\n\tsimple_code_map[\"/\"] = OP_DIV;\n\tsimple_code_map[\"%\"] = OP_MOD;\n\tsimple_code_map[\"&\"] = OP_AND;\n\tsimple_code_map[\"&&\"] = OP_AND;\n\tsimple_code_map[\"|\"] = OP_OR;\n\tsimple_code_map[\"||\"] = OP_OR;\n\tsimple_code_map[\"^\"] = OP_XOR;\n\tsimple_code_map[\"^^\"] = OP_XOR;\n\tsimple_code_map[\">\"] = OP_CMP_GT;\n\tsimple_code_map[\"<\"] = OP_CMP_LT;\n\tsimple_code_map[\">=\"] = OP_CMP_GTE;\n\tsimple_code_map[\"<=\"] = OP_CMP_LTE;\n\tsimple_code_map[\"!=\"] = OP_CMP_NEQ;\n\tsimple_code_map[\"==\"] = OP_CMP_EQ;\n\n\tthis_obj_map[\"height\"] = MEM_EXTERN + EXTERN_HEIGHT;\n\tthis_obj_map[\"txid\"] = MEM_EXTERN + EXTERN_TXID;\n\tthis_obj_map[\"user\"] = MEM_EXTERN + EXTERN_USER;\n\tthis_obj_map[\"balance\"] = MEM_EXTERN + EXTERN_BALANCE;\n\tthis_obj_map[\"address\"] = MEM_EXTERN + EXTERN_ADDRESS;\n\tthis_obj_map[\"deposit\"] = MEM_EXTERN + EXTERN_DEPOSIT;\n\n\tfunction_map[\"__nop\"].name = \"__nop\";\n\tfunction_map[\"__copy\"].name = \"__copy\";\n\tfunction_map[\"size\"].name = \"size\";\n\tfunction_map[\"push\"].name = \"push\";\n\tfunction_map[\"pop\"].name = \"pop\";\n\tfunction_map[\"set\"].name = \"set\";\n\tfunction_map[\"get\"].name = \"get\";\n\tfunction_map[\"min\"].name = \"min\";\n\tfunction_map[\"max\"].name = \"max\";\n\tfunction_map[\"clone\"].name = \"clone\";\n\tfunction_map[\"deref\"].name = \"deref\";\n\tfunction_map[\"erase\"].name = \"erase\";\n\tfunction_map[\"delete\"].name = \"delete\";\n\tfunction_map[\"typeof\"].name = \"typeof\";\n\tfunction_map[\"concat\"].name = \"concat\";\n\tfunction_map[\"memcpy\"].name = \"memcpy\";\n\tfunction_map[\"send\"].name = \"send\";\n\tfunction_map[\"mint\"].name = \"mint\";\n\tfunction_map[\"fail\"].name = \"fail\";\n\tfunction_map[\"log\"].name = \"log\";\n\tfunction_map[\"event\"].name = \"event\";\n\tfunction_map[\"read\"].name = \"read\";\n\tfunction_map[\"bech32\"].name = \"bech32\";\n\tfunction_map[\"binary\"].name = \"binary\";\n\tfunction_map[\"binary_le\"].name = \"binary_le\";\n\tfunction_map[\"binary_hex\"].name = \"binary_hex\";\n\tfunction_map[\"bool\"].name = \"bool\";\n\tfunction_map[\"uint\"].name = \"uint\";\n\tfunction_map[\"uint_le\"].name = \"uint_le\";\n\tfunction_map[\"uint_hex\"].name = \"uint_hex\";\n\tfunction_map[\"sha256\"].name = \"sha256\";\n\tfunction_map[\"ecdsa_verify\"].name = \"ecdsa_verify\";\n\tfunction_map[\"string\"].name = \"string\";\n\tfunction_map[\"string_hex\"].name = \"string_hex\";\n\tfunction_map[\"string_bech32\"].name = \"string_bech32\";\n\tfunction_map[\"rcall\"].name = \"rcall\";\n\tfunction_map[\"balance\"].name = \"balance\";\n\tfunction_map[\"is_uint\"].name = \"is_uint\";\n\tfunction_map[\"is_string\"].name = \"is_string\";\n\tfunction_map[\"is_binary\"].name = \"is_binary\";\n\tfunction_map[\"is_array\"].name = \"is_array\";\n\tfunction_map[\"is_map\"].name = \"is_map\";\n\tfunction_map[\"assert\"].name = \"assert\";\n\n\tglobal.section = MEM_STATIC;\n\n\t// address zero = null value\n\tif(get_const_address(std::make_unique<var_t>())) {\n\t\tthrow std::logic_error(\"zero address not null\");\n\t}\n}\n\nstd::shared_ptr<const contract::Binary> Compiler::compile(const std::string& source_)\n{\n\tif(curr_pass) {\n\t\tthrow std::logic_error(\"invalid state\");\n\t}\n\tsource = source_;\n\t{\n\t\t// resolve imports\n\t\tparse_tree_t tree;\n\t\tparse(tree);\n\n\t\tfor(const auto& node : get_children(tree.root())) {\n\t\t\tconst std::string name(node.kind().name());\n\t\t\tif(name == lang::statement::name) {\n\t\t\t\tconst auto list = get_children(node);\n\t\t\t\tif(!list.empty()) {\n\t\t\t\t\tconst auto node = list[0];\n\t\t\t\t\tconst std::string name(node.kind().name());\n\t\t\t\t\tif(name == lang::import::name) try {\n\t\t\t\t\t\tconst auto list = get_children(node);\n\t\t\t\t\t\tif(list.size() != 4) {\n\t\t\t\t\t\t\tthrow std::logic_error(\"invalid import\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstd::set<std::string> units;\n\t\t\t\t\t\tconst auto import_list = list[1];\n\t\t\t\t\t\tfor(const auto& node : get_children(import_list)) {\n\t\t\t\t\t\t\tconst std::string name(node.kind().name());\n\t\t\t\t\t\t\tif(name == lang::identifier::name) {\n\t\t\t\t\t\t\t\tunits.insert(get_literal(node));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst auto module = get_literal(list[3]);\n\t\t\t\t\t\tif(module == \"std\") {\n\t\t\t\t\t\t\tfor(const auto& unit : units) {\n\t\t\t\t\t\t\t\tconst auto key = unit + \".js\";\n\t\t\t\t\t\t\t\tif(!std_file_map.count(key)) {\n\t\t\t\t\t\t\t\t\tthrow std::logic_error(\"unknown unit '\" + unit + \"'\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tsource += \"\\n// Imported from std/\" + key + \"\\n\";\n\t\t\t\t\t\t\t\tsource += std_file_map[key];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthrow std::logic_error(\"unknown module '\" + module + \"'\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch(const std::exception& ex) {\n\t\t\t\t\t\tdump_parse_tree(tree.root(), debug());\n\t\t\t\t\t\tthrow std::logic_error(\"error at line \" + std::to_string(get_line_number(node)) + \": \" + ex.what());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tbinary = std::make_shared<contract::Binary>();\n\tbinary->source = source;\n\tbinary->compiler = std::string(\"mmx\") + \"-\" + version;\n\tbinary->build_flags = flags;\n\n\tparse_tree_t tree;\n\tparse(tree);\n\n\tdebug() << std::endl;\n\tdump_parse_tree(tree.root(), debug());\n\tdebug() << std::endl;\n\n\ttry {\n\t\t// static init stack frame\n\t\tframe.emplace_back();\n\n\t\tdebug() << \"First pass ...\" << std::endl;\n\n\t\trecurse(tree.root());\n\n\t\tcurr_pass++;\n\t\tframe.clear();\n\n\t\tdebug() << std::endl << \"Second pass ...\" << std::endl;\n\n\t\tfor(const auto& entry : function_map) {\n\t\t\tconst auto& func = entry.second;\n\t\t\tif(const auto& node = func.root) {\n\t\t\t\trecurse(*node);\n\t\t\t}\n\t\t}\n\t\tfor(const auto& entry : linker_map) {\n\t\t\tif(auto func = find_function(entry.second)) {\n\t\t\t\tcode[entry.first].a = func->address;\n\t\t\t} else {\n\t\t\t\tthrow std::runtime_error(\"undefined reference to function '\" + entry.second + \"'\");\n\t\t\t}\n\t\t}\n\t}\n\tcatch(const std::exception& ex) {\n\t\tif(curr_node) {\n\t\t\tthrow std::logic_error(std::string(\"error at line \") + std::to_string(get_line_number(*curr_node)) + \": \" + ex.what());\n\t\t} else {\n\t\t\tthrow std::logic_error(std::string(\"error: \") +  + ex.what());\n\t\t}\n\t}\n\n\tfor(const auto& var : const_vars) {\n\t\tif(!var.value) {\n\t\t\tthrow std::logic_error(\"missing constant value\");\n\t\t}\n\t\tconst auto data = serialize(*var.value, false, false);\n\t\tbinary->constant.insert(binary->constant.end(), data.first.get(), data.first.get() + data.second);\n\t}\n\tfor(const auto& var : global.var_list) {\n\t\tif(var.is_static) {\n\t\t\tbinary->fields[var.name] = var.address;\n\t\t}\n\t}\n\tfor(const auto& entry : function_map) {\n\t\tconst auto& func = entry.second;\n\t\tif(func.root) {\n\t\t\tcontract::method_t method;\n\t\t\tmethod.name = func.name;\n\t\t\tmethod.entry_point = func.address;\n\t\t\tmethod.is_init = func.is_init;\n\t\t\tmethod.is_const = func.is_const;\n\t\t\tmethod.is_public = func.is_public;\n\t\t\tmethod.is_payable = func.is_payable;\n\t\t\tfor(const auto& arg : func.args) {\n\t\t\t\tmethod.args.push_back(arg.name);\n\t\t\t}\n\t\t\tbinary->methods[method.name] = method;\n\t\t}\n\t}\n\tbinary->binary = vm::serialize(code);\n\t{\n\t\tuint32_t prev = 0;\n\t\tfor(const auto& entry : line_info) {\n\t\t\tif(entry.second != prev) {\n\t\t\t\tbinary->line_info.insert(entry);\n\t\t\t\tprev = entry.second;\n\t\t\t}\n\t\t}\n\t}\n\tdebug() << std::endl;\n\tdump_code(debug(), binary);\n\treturn binary;\n}\n\nvoid Compiler::parse(parse_tree_t& tree)\n{\n\tconst auto result = lexy::parse_as_tree<lang::source>(\n\t\t\ttree, lexy::string_input<lexy::utf8_encoding>(source), lexy_ext::report_error);\n\n\tif(!result.is_success()) {\n\t\tthrow std::runtime_error(\"parse() failed\");\n\t}\n}\n\nstd::vector<Compiler::node_t> Compiler::get_children(const node_t& node)\n{\n\tstd::vector<Compiler::node_t> list;\n\tfor(const auto& child : node.children()) {\n\t\tconst std::string name(child.kind().name());\n\t\tif(name != \"whitespace\") {\n\t\t\tlist.push_back(child);\n\t\t}\n\t}\n\treturn list;\n}\n\nuint32_t Compiler::get_line_number(const node_t& node) const\n{\n\tconst auto loc = lexy::get_input_location(\n\t\t\tlexy::string_input<lexy::utf8_encoding>(source), node.position());\n\treturn loc.line_nr();\n}\n\nstd::string Compiler::to_source(const node_t& node)\n{\n    std::string source;\n    if(node.kind().is_token()) {\n        const auto token = node.lexeme();\n        source.append(token.begin(), token.end());\n    } else {\n        for(const auto& child : node.children()) {\n            source += to_source(child);\n        }\n    }\n    std::string out;\n    for(auto c : source) {\n        switch(c) {\n\t\t\tcase '\\r': break;\n\t\t\tcase '\\n': out += \"\\\\n\"; break;\n            case '\\t': out += \"\\\\t\"; break;\n            default: out += c; break;\n        }\n    }\n    return out;\n}\n\nstd::string Compiler::get_literal(const node_t& node)\n{\n\tif(node.kind().is_token()) {\n\t\tconst auto token = node.lexeme();\n\t\treturn std::string(token.begin(), token.end());\n\t} else {\n\t\tconst auto list = get_children(node);\n\t\tconst std::string name(node.kind().name());\n\t\tif(name == lang::string::name && list.size() == 3) {\n\t\t\treturn get_literal(list[1]);\n\t\t} else {\n\t\t\tif(list.size() != 1) {\n\t\t\t\tthrow std::logic_error(\"not a literal: \" + std::string(node.kind().name()));\n\t\t\t}\n\t\t\treturn get_literal(list[0]);\n\t\t}\n\t}\n}\n\nvarptr_t Compiler::parse_constant(const node_t& node)\n{\n\tconst auto list = get_children(node);\n\tconst std::string name(node.kind().name());\n\n\tif(name == lang::expression::name) {\n\t\tif(list.size() == 1) {\n\t\t\treturn parse_constant(list[0]);\n\t\t}\n\t}\n\telse if(name == lang::constant::name) {\n\t\tif(list.size() > 2) {\n\t\t\tthrow std::logic_error(\"invalid constant\");\n\t\t}\n\t\treturn parse_constant(list.back());\n\t}\n\telse if(name == lang::primitive::name) {\n\t\tif(list.size() != 1) {\n\t\t\tthrow std::logic_error(\"invalid primitive\");\n\t\t}\n\t\tconst auto value = get_literal(list[0]);\n\t\tif(value == \"null\") {\n\t\t\treturn std::make_unique<var_t>();\n\t\t} else if(value == \"true\") {\n\t\t\treturn std::make_unique<var_t>(TYPE_TRUE);\n\t\t} else if(value == \"false\") {\n\t\t\treturn std::make_unique<var_t>(TYPE_FALSE);\n\t\t}\n\t}\n\telse if(name == lang::integer::hex::name) {\n\t\treturn std::make_unique<uint_t>(uint256_t(get_literal(list[0]), 16));\n\t}\n\telse if(name == lang::integer::binary::name) {\n\t\treturn std::make_unique<uint_t>(uint256_t(get_literal(list[0]), 2));\n\t}\n\telse if(name == lang::integer::decimal::name) {\n\t\treturn std::make_unique<uint_t>(uint256_t(get_literal(list[0]), 10));\n\t}\n\telse if(name == lang::string::name) {\n\t\tif(list.size() == 3) {\n\t\t\treturn binary_t::alloc(get_literal(list[1]));\n\t\t} else if(list.size() == 2) {\n\t\t\treturn binary_t::alloc(\"\");\n\t\t} else {\n\t\t\tthrow std::logic_error(\"invalid string\");\n\t\t}\n\t}\n\telse if(name == lang::address::name) {\n\t\tif(list.size() != 1) {\n\t\t\tthrow std::logic_error(\"invalid address\");\n\t\t}\n\t\treturn to_binary(addr_t(get_literal(list[0])));\n\t}\n\treturn nullptr;\n}\n\nint Compiler::get_node_rank(const node_t& node) const\n{\n\tconst std::string name(node.kind().name());\n\n\tstd::string key;\n\tif(name == lang::operator_ex::name) {\n\t\tkey = get_literal(node);\n\t} else {\n\t\tkey = name;\n\t}\n\tauto iter = rank_map.find(key);\n\tif(iter == rank_map.end()) {\n\t\tthrow std::logic_error(\"missing rank for \" + name);\n\t}\n\treturn iter->second;\n}\n\nstd::string Compiler::get_namespace(const bool concat) const\n{\n\tstd::string res;\n\tfor(const auto& name : name_space) {\n\t\tif(!res.empty()) {\n\t\t\tres += \".\";\n\t\t}\n\t\tres += name;\n\t}\n\tif(concat && !res.empty()) {\n\t\tres += \".\";\n\t}\n\treturn res;\n}\n\nstd::ostream& Compiler::debug(bool ident) const\n{\n\tauto& out = flags.verbose ? std::cerr : debug_out;\n\tfor(int i = 0; ident && i < depth; ++i) {\n\t\tout << \"  \";\n\t}\n\treturn out;\n}\n\nvoid Compiler::print_debug_info(const node_t& node) const\n{\n\tdebug(true) << node.kind().name();\n\n\tif(node.kind().is_token()) {\n\t\tconst auto token = node.lexeme();\n\t\tdebug() << \": \" << vnx::to_string(std::string(token.begin(), token.end()));\n\t}\n\tdebug() << std::endl;\n}\n\nvoid Compiler::handle_new_code()\n{\n\tvnx::optional<uint32_t> line;\n\tif(curr_node) {\n\t\tline = get_line_number(*curr_node);\n\t}\n\tfor(auto i = code_offset; i < code.size(); ++i) {\n\t\tif(line) {\n\t\t\tline_info[i] = *line;\n\t\t}\n\t\tdebug(true) << to_string(code[i]) << std::endl;\n\t}\n\tcode_offset = code.size();\n}\n\nCompiler::vref_t Compiler::recurse(const node_t& node)\n{\n\thandle_new_code();\n\tprint_debug_info(node);\n\n\tvref_t out;\n\tcurr_node = node;\n\tdepth++;\n\n\tconst std::string name(node.kind().name());\n\tconst std::string p_name(node.parent().kind().name());\n\tconst auto list = get_children(node);\n\n\tif(name == lang::import::name) {\n\t\t// ignore here\n\t}\n\telse if(name == lang::namespace_ex::name)\n\t{\n\t\tif(list.size() < 2) {\n\t\t\tthrow std::logic_error(\"invalid namespace declaration\");\n\t\t}\n\t\tconst auto name = get_literal(list[1]);\n\t\tdebug(true) << \"name = \\\"\" << name << \"\\\"\" << std::endl;\n\n//\t\tname_space.push_back(name);\n\t\tfor(const auto& node : list) {\n\t\t\trecurse(node);\n\t\t}\n//\t\tname_space.pop_back();\n\t}\n\telse if(name == lang::scope::name)\n\t{\n\t\tif(list.size() != 3) {\n\t\t\tthrow std::logic_error(\"invalid scope\");\n\t\t}\n\t\tpush_scope();\n\t\trecurse(list[1]);\n\t\tpop_scope();\n\t}\n\telse if(name == lang::source::name)\n\t{\n\t\tfor(const auto& node : list) {\n\t\t\trecurse(node);\n\t\t}\n\t\tif(curr_pass == 0 && frame.size() == 1) {\n\t\t\t// return from static init\n\t\t\tcode.emplace_back(OP_RET);\n\t\t}\n\t}\n\telse if(name == lang::function::name)\n\t{\n\t\tif(list.size() < 3) {\n\t\t\tthrow std::logic_error(\"invalid function declaration\");\n\t\t}\n\t\tif(curr_pass == 0) {\n\t\t\tfunction_t func;\n\t\t\tfunc.root = node;\n\t\t\tfunc.name = get_namespace(true) + get_literal(list[1]);\n\n\t\t\tif(func.name == \"init\") {\n\t\t\t\tfunc.is_init = true;\n\t\t\t}\n\t\t\tif(func.name == \"deposit\") {\n\t\t\t\tfunc.is_payable = true;\n\t\t\t}\n\t\t\tdebug(true) << \"name = \\\"\" << func.name << \"\\\"\" << std::endl;\n\n\t\t\tif(function_map.count(func.name)) {\n\t\t\t\tthrow std::logic_error(\"duplicate function name\");\n\t\t\t}\n\t\t\tfor(const auto& arg : get_children(list[2]))\n\t\t\t{\n\t\t\t\tconst std::string name(arg.kind().name());\n\t\t\t\tif(name == lang::function::arguments::item::name) {\n\t\t\t\t\tconst auto list = get_children(arg);\n\t\t\t\t\tif(list.size() < 1) {\n\t\t\t\t\t\tthrow std::logic_error(\"invalid function argument\");\n\t\t\t\t\t}\n\t\t\t\t\tconst std::string name(list[0].kind().name());\n\t\t\t\t\tif(name != lang::identifier::name) {\n\t\t\t\t\t\tthrow std::logic_error(\"expected argument identifier\");\n\t\t\t\t\t}\n\t\t\t\t\tvariable_t var;\n\t\t\t\t\tvar.name = get_literal(list[0]);\n\t\t\t\t\tvar.address = MEM_STACK + 1 + func.args.size();\n\n\t\t\t\t\tdebug(true) << \"[\" << func.args.size() << \"] \" << var.name;\n\t\t\t\t\tif(list.size() == 3) {\n\t\t\t\t\t\tvar.value = parse_constant(list[2]);\n\t\t\t\t\t\tdebug() << \" = \" << to_string(var.value);\n\t\t\t\t\t} else if(list.size() != 1) {\n\t\t\t\t\t\tthrow std::logic_error(\"invalid function argument\");\n\t\t\t\t\t}\n\t\t\t\t\tdebug() << std::endl;\n\n\t\t\t\t\tfunc.args.push_back(var);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(size_t i = 3; i < list.size(); ++i)\n\t\t\t{\n\t\t\t\tconst auto node = list[i];\n\t\t\t\tconst std::string name(node.kind().name());\n\t\t\t\tif(name == lang::function::qualifier::name) {\n\t\t\t\t\tconst auto list = get_children(node);\n\t\t\t\t\tif(list.size() != 1) {\n\t\t\t\t\t\tthrow std::logic_error(\"invalid function qualifier\");\n\t\t\t\t\t}\n\t\t\t\t\tconst auto value = get_literal(list[0]);\n\t\t\t\t\tif(value == \"const\") {\n\t\t\t\t\t\tfunc.is_const = true;\n\t\t\t\t\t\tdebug(true) << \"is_const = true\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\telse if(value == \"public\") {\n\t\t\t\t\t\tfunc.is_public = true;\n\t\t\t\t\t\tdebug(true) << \"is_public = true\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\telse if(value == \"payable\") {\n\t\t\t\t\t\tfunc.is_payable = true;\n\t\t\t\t\t\tdebug(true) << \"is_payable = true\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\telse if(value == \"static\") {\n\t\t\t\t\t\tfunc.is_init = true;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow std::logic_error(\"invalid function qualifier\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(func.is_init) {\n\t\t\t\tdebug(true) << \"is_init = true\" << std::endl;\n\t\t\t\tif(func.is_const) {\n\t\t\t\t\tthrow std::logic_error(\"constructor cannot be const\");\n\t\t\t\t}\n\t\t\t\tif(func.is_public) {\n\t\t\t\t\tthrow std::logic_error(\"constructor cannot be public\");\n\t\t\t\t}\n\t\t\t\tif(func.is_payable) {\n\t\t\t\t\tthrow std::logic_error(\"constructor cannot be payable\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction_map[func.name] = func;\n\t\t} else {\n\t\t\t// second pass\n\t\t\tconst auto func_name = get_namespace(true) + get_literal(list[1]);\n\t\t\tdebug(true) << \"name = \\\"\" << func_name << \"\\\"\" << std::endl;\n\n\t\t\tif(curr_function) {\n\t\t\t\tthrow std::logic_error(\"cannot define function inside a function\");\n\t\t\t}\n\t\t\tauto& func = function_map[func_name];\n\t\t\tfunc.address = code.size();\n\t\t\tdebug(true) << \"address = 0x\" << std::hex << func.address << std::dec << std::endl;\n\n\t\t\tframe_t scope;\n\t\t\tscope.addr_offset = 1 + func.args.size();\n\t\t\tfor(const auto& arg : func.args) {\n\t\t\t\tscope.add_variable(arg);\n\t\t\t}\n\t\t\tcurr_function = func;\n\n\t\t\tif(func.is_init) {\n\t\t\t\tcode.emplace_back(OP_CALL, 0, 0, scope.new_addr() - MEM_STACK);\n\t\t\t}\n\t\t\tframe.push_back(scope);\n\t\t\tcode.emplace_back(OP_COPY, 0, MEM_STACK, 0);\n\t\t\trecurse(list.back());\n\t\t\tframe.pop_back();\n\n\t\t\tif(code.empty() || code.back().code != OP_RET) {\n\t\t\t\tcode.emplace_back(OP_RET);\n\t\t\t}\n\t\t\tcurr_function = nullptr;\n\t\t}\n\t}\n\telse if(name == lang::variable::name)\n\t{\n\t\tif(list.size() < 2) {\n\t\t\tthrow std::logic_error(\"invalid variable declaration\");\n\t\t}\n\t\tconst auto qualifier = get_literal(list[0]);\n\n\t\tvariable_t var;\n\t\tvar.is_const = (qualifier == \"const\");\n\t\tvar.name = get_literal(list[1]);\n\n\t\tbool is_constant = false;\n\t\tbool is_expression = false;\n\n\t\tif(list.size() == 4) {\n\t\t\tconst auto value = parse_constant(list[3]);\n\t\t\tif(var.is_const && value) {\n\t\t\t\tis_constant = true;\n\t\t\t\tvar.value = value;\n\t\t\t} else {\n\t\t\t\tis_expression = true;\n\t\t\t}\n\t\t} else if(list.size() != 2) {\n\t\t\tthrow std::logic_error(\"invalid variable declaration\");\n\t\t}\n\t\tvar.is_static = !is_constant && frame.size() == 1;\n\n\t\tauto& scope = frame.size() == 1 ? global : frame.back();\n\t\tif(is_constant) {\n\t\t\tvar.address = get_const_address(var.value);\n\t\t} else {\n\t\t\tvar.address = scope.new_addr();\n\t\t}\n\n\t\tdebug(true) << qualifier << \" \" << var.name;\n\t\tif(is_constant) {\n\t\t\tdebug() << \" = \" << to_string(var.value);\n\t\t}\n\t\tif(is_expression) {\n\t\t\tdebug() << \" = <expression>\";\n\t\t}\n\t\tdebug() << \" (0x\" << std::hex << var.address << std::dec << \")\" << std::endl;\n\n\t\tif(is_expression) {\n\t\t\tcopy(var.address, recurse(list.back()));\n\t\t} else if(!is_constant) {\n\t\t\tcopy(var.address, 0);\n\t\t}\n\t\tscope.add_variable(var);\n\n\t\tout.address = var.address;\n\t}\n\telse if(name == lang::interface::name)\n\t{\n\t\tif(list.size() != 2) {\n\t\t\tthrow std::logic_error(\"invalid interface declaration\");\n\t\t}\n\t\tconst auto qualifier = get_literal(list[0]);\n\t\tconst auto name = get_literal(list[1]);\n\t\tdebug(true) << qualifier << \" \" << name << std::endl;\n\t\tif(!interface_set.emplace(name).second) {\n\t\t\tthrow std::logic_error(\"duplicate interface declaration\");\n\t\t}\n\t}\n\telse if(name == lang::if_ex::name)\n\t{\n\t\tif(list.size() < 5) {\n\t\t\tthrow std::logic_error(\"invalid if()\");\n\t\t}\n\t\tconst auto cond = get(recurse(list[2]));\n\t\tconst auto jump = code.size();\n\t\tcode.emplace_back(OP_JUMPN, 0, -1, cond);\n\t\trecurse(list[4]);\n\n\t\tif(list.size() == 6) {\n\t\t\tconst auto skip = code.size();\n\t\t\tcode.emplace_back(OP_JUMP, 0, -1);\n\t\t\tcode[jump].a = code.size();\n\t\t\trecurse(list[5]);\n\t\t\tcode[skip].a = code.size();\n\t\t} else {\n\t\t\tcode[jump].a = code.size();\n\t\t}\n\t}\n\telse if(name == lang::else_ex::name)\n\t{\n\t\tif(list.size() < 2) {\n\t\t\tthrow std::logic_error(\"invalid else\");\n\t\t}\n\t\trecurse(list[1]);\n\t}\n\telse if(name == lang::while_loop::name)\n\t{\n\t\tif(list.size() < 5) {\n\t\t\tthrow std::logic_error(\"invalid while()\");\n\t\t}\n\t\tconst auto begin = code.size();\n\t\tconst auto cond = get(recurse(list[2]));\n\t\tconst auto jump = code.size();\n\t\tcode.emplace_back(OP_JUMPN, 0, -1, cond);\n\t\trecurse(list.back());\n\t\tcode.emplace_back(OP_JUMP, 0, begin);\n\t\tcode[jump].a = code.size();\n\t}\n\telse if(name == lang::for_loop::name)\n\t{\n\t\tif(list.size() < 5) {\n\t\t\tthrow std::logic_error(\"invalid for()\");\n\t\t}\n\t\tbool is_range = false;\n\t\tstd::vector<std::list<node_t>> nodes;\n\t\tnodes.emplace_back();\n\t\tfor(size_t i = 2; i + 1 < list.size(); ++i) {\n\t\t\tconst auto& node = list[i];\n\t\t\tconst std::string name(node.kind().name());\n\t\t\tif(name == \"literal\") {\n\t\t\t\tconst auto lit = get_literal(node);\n\t\t\t\tif(lit == \";\") {\n\t\t\t\t\tnodes.emplace_back();\n\t\t\t\t} else if(lit == \"of\") {\n\t\t\t\t\tif(nodes.back().size() != 1) {\n\t\t\t\t\t\tthrow std::logic_error(\"invalid range for()\");\n\t\t\t\t\t}\n\t\t\t\t\tis_range = true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnodes.back().push_back(node);\n\t\t\t}\n\t\t}\n\t\tpush_scope();\n\n\t\tif(is_range) {\n\t\t\tif(nodes.size() != 1) {\n\t\t\t\tthrow std::logic_error(\"invalid range for()\");\n\t\t\t}\n\t\t\tconst auto& range_ex = nodes.front();\n\t\t\tif(range_ex.size() != 2) {\n\t\t\t\tthrow std::logic_error(\"invalid range for()\");\n\t\t\t}\n\t\t\tauto iter = range_ex.begin();\n\t\t\tconst auto var_addr = get(recurse(*iter)); iter++;\n\t\t\tconst auto range_addr = get(recurse(*iter));\n\n\t\t\tauto& stack = frame.back();\n\t\t\tconst auto counter = stack.new_addr();\n\t\t\tcopy(counter, get_const_address(uint256_t(0)));\n\t\t\tconst auto size = stack.new_addr();\n\t\t\tcode.emplace_back(OP_SIZE, OPFLAG_REF_B, size, range_addr);\n\t\t\tconst auto begin = code.size();\n\t\t\tconst auto cond = stack.new_addr();\n\t\t\tcode.emplace_back(OP_CMP_LT, 0, cond, counter, size);\n\t\t\tconst auto jump = code.size();\n\t\t\tcode.emplace_back(OP_JUMPN, 0, -1, cond);\n\t\t\tcode.emplace_back(OP_GET, OPFLAG_REF_B, var_addr, range_addr, counter);\n\t\t\trecurse(list.back());\n\t\t\tcode.emplace_back(OP_ADD, OPFLAG_CATCH_OVERFLOW, counter, counter, get_const_address(1));\n\t\t\tcode.emplace_back(OP_JUMP, 0, begin);\n\t\t\tcode[jump].a = code.size();\n\t\t}\n\t\telse if(nodes.size() == 3) {\n\t\t\tif(nodes[1].size() != 1) {\n\t\t\t\tthrow std::logic_error(\"invalid for() condition\");\n\t\t\t}\n\t\t\tfor(const auto& node : nodes[0]) {\n\t\t\t\trecurse(node);\n\t\t\t}\n\t\t\tconst auto begin = code.size();\n\t\t\tconst auto cond = get(recurse(nodes[1].front()));\n\t\t\tconst auto jump = code.size();\n\t\t\tcode.emplace_back(OP_JUMPN, 0, -1, cond);\n\t\t\trecurse(list.back());\n\n\t\t\tfor(const auto& node : nodes[2]) {\n\t\t\t\trecurse(node);\n\t\t\t}\n\t\t\tcode.emplace_back(OP_JUMP, 0, begin);\n\t\t\tcode[jump].a = code.size();\n\t\t}\n\t\telse {\n\t\t\tthrow std::logic_error(\"invalid for()\");\n\t\t}\n\t\tpop_scope();\n\t}\n\telse if(name == lang::statement::name)\n\t{\n\t\tif(list.size() != 2) {\n\t\t\tthrow std::logic_error(\"invalid statement\");\n\t\t}\n\t\trecurse(list[0]);\n\t}\n\telse if(name == lang::expression::name)\n\t{\n\t\tauto p_node = list.data();\n\t\tauto expr_len = list.size();\n\t\tout = recurse_expr(p_node, expr_len);\n\n\t\tif(expr_len != 0) {\n\t\t\tthrow std::logic_error(\"invalid expression\");\n\t\t}\n\t\tout.check_value();\n\t}\n\telse if(name == \"position\")\n\t{\n\t\t// ignore dummy position nodes by lexy\n\t}\n\telse {\n\t\tthrow std::logic_error(\"invalid statement: \" + name);\n\t}\n\n\thandle_new_code();\n\tdepth--;\n\n\treturn out;\n}\n\nCompiler::vref_t Compiler::recurse_expr(const node_t*& p_node, size_t& expr_len, const vref_t* lhs, const int lhs_rank)\n{\n\tif(expr_len == 0) {\n\t\treturn lhs ? *lhs : vref_t();\n\t}\n\tconst auto node = p_node[0];\n\tconst auto rank = get_node_rank(node);\n\n\tif(lhs_rank >= 0 && rank >= lhs_rank) {\n\t\tif(!lhs) {\n\t\t\tthrow std::logic_error(\"invalid expression\");\n\t\t}\n\t\treturn *lhs;\n\t}\n\tp_node++;\n\texpr_len--;\n\n\tvref_t out;\n\tauto& stack = frame.back();\n\tconst std::string name(node.kind().name());\n\tconst auto list = get_children(node);\n\n\tdebug(true) << name << \" (rank = \" << rank << \", expr_len = \" << expr_len << \", list = \" << list.size() << \")\" << std::endl;\n\tdepth++;\n\n\tif(name == lang::identifier::name)\n\t{\n\t\tif(lhs) {\n\t\t\tthrow std::logic_error(\"invalid expression\");\n\t\t}\n\t\tconst auto name = get_literal(node);\n\n\t\tif(auto var = find_variable(name)) {\n\t\t\tout.address = var->address;\n\t\t\tout.is_const = var->is_const;\n\t\t}\n\t\telse if(auto func = find_function(name)) {\n\t\t\tout.func = *func;\n\t\t\tout.address = func->address;\n\t\t}\n\t\telse if(interface_set.count(name)) {\n\t\t\tout.is_interface = true;\n\t\t}\n\t\tout.name = name;\n\t}\n\telse if(name == lang::array::name)\n\t{\n\t\tif(lhs) {\n\t\t\tif(list.size() != 3) {\n\t\t\t\tthrow std::logic_error(\"invalid bracket operator\");\n\t\t\t}\n\t\t\tconst auto key = recurse(list[1]);\n\n\t\t\tif(key.key) {\n\t\t\t\tout.key = copy(stack.new_addr(), key).address;\n\t\t\t} else {\n\t\t\t\tout.key = key.address;\n\t\t\t}\n\t\t\tif(lhs->key) {\n\t\t\t\tout.address = copy(stack.new_addr(), *lhs).address;\n\t\t\t} else {\n\t\t\t\tout.address = lhs->address;\n\t\t\t}\n\t\t\tlhs->check_value();\n\t\t} else {\n\t\t\tout.address = stack.new_addr();\n\t\t\tcode.emplace_back(OP_CLONE, 0, out.address, get_const_address(std::make_unique<array_t>()));\n\n\t\t\tfor(const auto& node : list) {\n\t\t\t\tconst std::string name(node.kind().name());\n\t\t\t\tif(name == lang::expression::name) {\n\t\t\t\t\tconst auto value = recurse(node);\n\t\t\t\t\tcode.emplace_back(OP_PUSH_BACK, OPFLAG_REF_A, out.address, get(value));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if(name == lang::operator_ex::name)\n\t{\n\t\tconst auto op = get_literal(node);\n\n\t\tbool is_assign = false;\n\t\tauto iter = simple_code_map.find(op);\n\t\tif(iter == simple_code_map.end() && !op.empty() && op.back() == '=') {\n\t\t\tis_assign = true;\n\t\t\titer = simple_code_map.find(op.substr(0, op.size() - 1));\n\t\t}\n\t\tif(iter != simple_code_map.end()) {\n\t\t\tif(!lhs) {\n\t\t\t\tthrow std::logic_error(\"missing left operand\");\n\t\t\t}\n\t\t\tif(expr_len < 1) {\n\t\t\t\tthrow std::logic_error(\"missing right operand\");\n\t\t\t}\n\t\t\tint op_flags = 0;\n\t\t\tauto op_code = opcode_e(iter->second);\n\t\t\tswitch(op_code) {\n\t\t\t\tcase OP_ADD:\n\t\t\t\tcase OP_SUB:\n\t\t\t\tcase OP_MUL:\n\t\t\t\tcase OP_DIV:\n\t\t\t\tcase OP_MOD:\n\t\t\t\t\top_flags |= math_flags;\n\t\t\t\t\tbreak;\n\t\t\t\tcase OP_XOR:\n\t\t\t\tcase OP_AND:\n\t\t\t\tcase OP_OR:\n\t\t\t\t\tif(op == \"^\" || op == \"&\" || op == \"|\" || op == \"^=\" || op == \"&=\" || op == \"|=\") {\n\t\t\t\t\t\top_flags |= OPFLAG_BITWISE;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tauto rhs = get(recurse_expr(p_node, expr_len, nullptr, rank));\n\n\t\t\tswitch(op_code) {\n\t\t\t\tcase OP_DIV:\n\t\t\t\tcase OP_MOD:\n\t\t\t\t\tif(rhs < const_vars.size() && flags.opt_level > 0) {\n\t\t\t\t\t\t// optimize division by power of two\n\t\t\t\t\t\tif(const auto& value = const_vars[rhs].value) {\n\t\t\t\t\t\t\tif(value->type == TYPE_UINT) {\n\t\t\t\t\t\t\t\tconst auto& uint = ((const uint_t*)value.get())->value;\n\t\t\t\t\t\t\t\tif(uint != 0 && (uint & (uint - 1)) == 0) {\n\t\t\t\t\t\t\t\t\tint count = 0;\n\t\t\t\t\t\t\t\t\tauto tmp = uint;\n\t\t\t\t\t\t\t\t\tfor(; count <= 256 && !(tmp & 1); ++count, tmp >>= 1);\n\t\t\t\t\t\t\t\t\tif(count < 256) {\n\t\t\t\t\t\t\t\t\t\tdebug(false) << \"Optimizing DIV / MOD by power of two: \" << uint << \" => \" << count << std::endl;\n\t\t\t\t\t\t\t\t\t\tswitch(op_code) {\n\t\t\t\t\t\t\t\t\t\t\tcase OP_DIV:\n\t\t\t\t\t\t\t\t\t\t\t\top_code = OP_SHR;\n\t\t\t\t\t\t\t\t\t\t\t\top_flags = 0;\n\t\t\t\t\t\t\t\t\t\t\t\trhs = count;\n\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\tcase OP_MOD:\n\t\t\t\t\t\t\t\t\t\t\t\top_code = OP_AND;\n\t\t\t\t\t\t\t\t\t\t\t\top_flags = OPFLAG_BITWISE;\n\t\t\t\t\t\t\t\t\t\t\t\trhs = get_const_address((uint256_1 << count) - 1);\n\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(is_assign) {\n\t\t\t\tif(lhs->key) {\n\t\t\t\t\tconst auto tmp_addr = stack.new_addr();\n\t\t\t\t\tcode.emplace_back(op_code, op_flags, tmp_addr, get(*lhs), rhs);\n\t\t\t\t\tcopy(*lhs, tmp_addr);\n\t\t\t\t} else {\n\t\t\t\t\tlhs->check_value();\n\t\t\t\t\tcode.emplace_back(op_code, op_flags, lhs->address, lhs->address, rhs);\n\t\t\t\t}\n\t\t\t\tout = *lhs;\n\t\t\t} else {\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(op_code, op_flags, out.address, get(*lhs), rhs);\n\t\t\t}\n\t\t}\n\t\telse if(op == \"=\") {\n\t\t\tif(!lhs) {\n\t\t\t\tthrow std::logic_error(\"missing left operand\");\n\t\t\t}\n\t\t\tif(!lhs->is_mutable()) {\n\t\t\t\tif(lhs->name) {\n\t\t\t\t\tthrow std::logic_error(\"cannot assign to const variable: \" + *lhs->name);\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"assignment to const variable\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(expr_len < 1) {\n\t\t\t\tthrow std::logic_error(\"missing right operand\");\n\t\t\t}\n\t\t\tconst auto rhs = recurse_expr(p_node, expr_len, nullptr, rank);\n\t\t\tout = copy(*lhs, rhs);\n\t\t}\n\t\telse if(op == \".\") {\n\t\t\tif(!lhs) {\n\t\t\t\tthrow std::logic_error(\"missing left operand\");\n\t\t\t}\n\t\t\tif(expr_len < 1) {\n\t\t\t\tthrow std::logic_error(\"missing right operand\");\n\t\t\t}\n\t\t\tconst auto rhs = recurse_expr(p_node, expr_len, nullptr, rank);\n\n\t\t\tif(!rhs.name) {\n\t\t\t\tthrow std::logic_error(\"expected identifier\");\n\t\t\t}\n\t\t\tconst auto key = *rhs.name;\n\n\t\t\tif(lhs->is_interface && !lhs->method) {\n\t\t\t\tout = *lhs;\n\t\t\t\tout.method = key;\n\t\t\t}\n\t\t\telse if(lhs->name && *lhs->name == \"this\" && !lhs->key) {\n\t\t\t\tauto iter = this_obj_map.find(key);\n\t\t\t\tif(iter == this_obj_map.end()) {\n\t\t\t\t\tthrow std::logic_error(\"no such variable: this.\" + key);\n\t\t\t\t}\n\t\t\t\tout.address = iter->second;\n\t\t\t\tout.is_const = true;\n\t\t\t}\n\t\t\telse if(lhs->address == MEM_EXTERN + EXTERN_DEPOSIT && !lhs->key) {\n\t\t\t\tout = *lhs;\n\t\t\t\tif(key == \"currency\") {\n\t\t\t\t\tout.key = get_const_address(uint256_t(0));\n\t\t\t\t} else if(key == \"amount\") {\n\t\t\t\t\tout.key = get_const_address(uint256_t(1));\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"no such variable: this.deposit.\" + key);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tout.address = get(*lhs);\n\t\t\t\tout.key = get_const_address(key);\n\t\t\t\tout.is_const = lhs->is_const;\n\t\t\t}\n\t\t}\n\t\telse if(op == \"!\" || op == \"~\") {\n\t\t\tif(lhs) {\n\t\t\t\tthrow std::logic_error(\"unexpected left operand\");\n\t\t\t}\n\t\t\tif(expr_len < 1) {\n\t\t\t\tthrow std::logic_error(\"missing right operand\");\n\t\t\t}\n\t\t\tconst auto rhs = recurse_expr(p_node, expr_len, nullptr, rank);\n\t\t\tout.address = stack.new_addr();\n\t\t\tcode.emplace_back(OP_NOT, op == \"~\" ? OPFLAG_BITWISE : 0, out.address, get(rhs));\n\t\t}\n\t\telse if(op == \"++\" || op == \"--\") {\n\t\t\tif(lhs) {\n\t\t\t\tif(lhs->is_const) {\n\t\t\t\t\tthrow std::logic_error(\"operand is const\");\n\t\t\t\t}\n\t\t\t\tout.address = copy(stack.new_addr(), *lhs).address;\n\t\t\t\tconst auto tmp_addr = lhs->key ? stack.new_addr() : lhs->address;\n\t\t\t\tcode.emplace_back(op == \"++\" ? OP_ADD : OP_SUB, math_flags, tmp_addr, out.address, get_const_address(1));\n\t\t\t\tcopy(*lhs, tmp_addr);\n\t\t\t} else {\n\t\t\t\tif(expr_len < 1) {\n\t\t\t\t\tthrow std::logic_error(\"missing right operand\");\n\t\t\t\t}\n\t\t\t\tout = recurse_expr(p_node, expr_len, nullptr, rank);\n\t\t\t\tif(out.is_const) {\n\t\t\t\t\tthrow std::logic_error(\"operand is const\");\n\t\t\t\t}\n\t\t\t\tconst auto tmp_addr = out.key ? copy(stack.new_addr(), out).address : out.address;\n\t\t\t\tcode.emplace_back(op == \"++\" ? OP_ADD : OP_SUB, math_flags, tmp_addr, tmp_addr, get_const_address(1));\n\t\t\t\tcopy(out, tmp_addr);\n\t\t\t}\n\t\t}\n\t\telse if(op == \">>\" || op == \"<<\") {\n\t\t\tif(!lhs) {\n\t\t\t\tthrow std::logic_error(\"missing left operand\");\n\t\t\t}\n\t\t\tout.address = stack.new_addr();\n\t\t\tconst auto rhs = recurse_expr(p_node, expr_len, nullptr, rank);\n\t\t\tcode.emplace_back(op == \">>\" ? OP_SHR : OP_SHL, OPFLAG_REF_C, out.address, get(*lhs), get(rhs));\n\t\t}\n\t\telse if(op == \"return\") {\n\t\t\tif(lhs) {\n\t\t\t\tthrow std::logic_error(\"unexpected left operand\");\n\t\t\t}\n\t\t\tif(expr_len > 0) {\n\t\t\t\tcopy(MEM_STACK, recurse_expr(p_node, expr_len, nullptr, rank));\n\t\t\t}\n\t\t\tcode.emplace_back(OP_RET);\n\t\t}\n\t\telse {\n\t\t\tthrow std::logic_error(\"invalid operator: \" + op);\n\t\t}\n\t}\n\telse if(name == lang::sub_expr::name)\n\t{\n\t\tstd::vector<node_t> args;\n\t\tfor(const auto& node : list) {\n\t\t\tconst std::string name(node.kind().name());\n\t\t\tif(name == lang::expression::name) {\n\t\t\t\targs.push_back(node);\n\t\t\t}\n\t\t}\n\t\tif(lhs && lhs->func) {\n\t\t\tconst auto& name = lhs->func->name;\n\n\t\t\tif(name == \"__nop\") {\n\t\t\t\tif(args.size()) {\n\t\t\t\t\tthrow std::logic_error(\"expected 0 arguments for __nop()\");\n\t\t\t\t}\n\t\t\t\tcode.emplace_back(OP_NOP);\n\t\t\t}\n\t\t\telse if(name == \"size\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for size()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_SIZE, OPFLAG_REF_B, out.address, get(recurse(args[0])));\n\t\t\t}\n\t\t\telse if(name == \"push\") {\n\t\t\t\tif(args.size() < 2) {\n\t\t\t\t\tthrow std::logic_error(\"expected 2 or more arguments for push(array, value)\");\n\t\t\t\t}\n\t\t\t\tconst auto array = get(recurse(args[0]));\n\t\t\t\tfor(size_t i = 1; i < args.size(); ++i) {\n\t\t\t\t\tcode.emplace_back(OP_PUSH_BACK, OPFLAG_REF_A, array, get(recurse(args[i])));\n\t\t\t\t}\n\t\t\t\tout.address = 0;\n\t\t\t}\n\t\t\telse if(name == \"pop\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for pop()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_POP_BACK, OPFLAG_REF_B, out.address, get(recurse(args[0])));\n\t\t\t}\n\t\t\telse if(name == \"set\") {\n\t\t\t\tif(args.size() != 3) {\n\t\t\t\t\tthrow std::logic_error(\"expected 3 arguments for set(..., key, value)\");\n\t\t\t\t}\n\t\t\t\tout.address = get(recurse(args[2]));\n\t\t\t\tcode.emplace_back(OP_SET, OPFLAG_REF_A, get(recurse(args[0])), get(recurse(args[1])), out.address);\n\t\t\t}\n\t\t\telse if(name == \"get\") {\n\t\t\t\tif(args.size() != 2) {\n\t\t\t\t\tthrow std::logic_error(\"expected 2 arguments for get()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_GET, OPFLAG_REF_B, out.address, get(recurse(args[0])), get(recurse(args[1])));\n\t\t\t}\n\t\t\telse if(name == \"min\" || name == \"max\") {\n\t\t\t\tif(args.size() < 2) {\n\t\t\t\t\tthrow std::logic_error(\"expected 2 or more arguments for \" + name + \"()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tauto lhs = get(recurse(args[0]));\n\t\t\t\tfor(size_t i = 1; i < args.size(); ++i) {\n\t\t\t\t\tcode.emplace_back(name == \"min\" ? OP_MIN : OP_MAX, 0, out.address, lhs, get(recurse(args[i])));\n\t\t\t\t\tlhs = out.address;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(name == \"__copy\") {\n\t\t\t\tif(args.size() != 2) {\n\t\t\t\t\tthrow std::logic_error(\"expected 2 arguments for __copy(dst, src)\");\n\t\t\t\t}\n\t\t\t\tcopy(recurse(args[0]), recurse(args[1]), false);\n\t\t\t\tout.address = 0;\n\t\t\t}\n\t\t\telse if(name == \"clone\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for clone()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_CLONE, OPFLAG_REF_B, out.address, get(recurse(args[0])));\n\t\t\t}\n\t\t\telse if(name == \"deref\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for deref()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_COPY, OPFLAG_REF_B, out.address, get(recurse(args[0])));\n\t\t\t}\n\t\t\telse if(name == \"delete\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for delete()\");\n\t\t\t\t}\n\t\t\t\tcode.emplace_back(OP_CLR, 0, get(recurse(args[0])));\n\t\t\t\tout.address = 0;\n\t\t\t}\n\t\t\telse if(name == \"erase\") {\n\t\t\t\tif(args.size() != 2) {\n\t\t\t\t\tthrow std::logic_error(\"expected 2 arguments for erase(object, key)\");\n\t\t\t\t}\n\t\t\t\tout.address = 0;\n\t\t\t\tcode.emplace_back(OP_ERASE, OPFLAG_REF_A, get(recurse(args[0])), get(recurse(args[1])));\n\t\t\t}\n\t\t\telse if(name == \"typeof\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for typeof()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_TYPE, OPFLAG_REF_B, out.address, get(recurse(args[0])));\n\t\t\t}\n\t\t\telse if(name == \"is_uint\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for is_uint()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_TYPE, OPFLAG_REF_B, out.address, get(recurse(args[0])));\n\t\t\t\tcode.emplace_back(OP_CMP_EQ, 0, out.address, out.address, get_const_address(int(TYPE_UINT)));\n\t\t\t}\n\t\t\telse if(name == \"is_string\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for is_string()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_TYPE, OPFLAG_REF_B, out.address, get(recurse(args[0])));\n\t\t\t\tcode.emplace_back(OP_CMP_EQ, 0, out.address, out.address, get_const_address(int(TYPE_STRING)));\n\t\t\t}\n\t\t\telse if(name == \"is_binary\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for is_binary()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_TYPE, OPFLAG_REF_B, out.address, get(recurse(args[0])));\n\t\t\t\tcode.emplace_back(OP_CMP_EQ, 0, out.address, out.address, get_const_address(int(TYPE_BINARY)));\n\t\t\t}\n\t\t\telse if(name == \"is_array\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for is_array()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_TYPE, OPFLAG_REF_B, out.address, get(recurse(args[0])));\n\t\t\t\tcode.emplace_back(OP_CMP_EQ, 0, out.address, out.address, get_const_address(int(TYPE_ARRAY)));\n\t\t\t}\n\t\t\telse if(name == \"is_map\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for is_map()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_TYPE, OPFLAG_REF_B, out.address, get(recurse(args[0])));\n\t\t\t\tcode.emplace_back(OP_CMP_EQ, 0, out.address, out.address, get_const_address(int(TYPE_MAP)));\n\t\t\t}\n\t\t\telse if(name == \"concat\") {\n\t\t\t\tif(args.size() < 2) {\n\t\t\t\t\tthrow std::logic_error(\"expected 2 or more arguments for concat()\");\n\t\t\t\t}\n\t\t\t\tauto lhs = get(recurse(args[0]));\n\t\t\t\tfor(size_t i = 1; i < args.size(); ++i) {\n\t\t\t\t\tout.address = stack.new_addr();\n\t\t\t\t\tcode.emplace_back(OP_CONCAT, OPFLAG_REF_B | OPFLAG_REF_C, out.address, lhs, get(recurse(args[i])));\n\t\t\t\t\tlhs = out.address;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(name == \"send\") {\n\t\t\t\tif(args.size() < 2 || args.size() > 4) {\n\t\t\t\t\tthrow std::logic_error(\"expected 2 to 4 arguments for send(address, amount, [currency], [memo])\");\n\t\t\t\t}\n\t\t\t\tcode.emplace_back(OP_SEND, 0, get(recurse(args[0])), get(recurse(args[1])),\n\t\t\t\t\t\targs.size() > 2 ? get(recurse(args[2])) : get_const_address(addr_t()),\n\t\t\t\t\t\targs.size() > 3 ? get(recurse(args[3])) : 0);\n\t\t\t\tout.address = 0;\n\t\t\t}\n\t\t\telse if(name == \"mint\") {\n\t\t\t\tif(args.size() < 2 || args.size() > 3) {\n\t\t\t\t\tthrow std::logic_error(\"expected 2 to 3 arguments for mint(address, amount, [memo])\");\n\t\t\t\t}\n\t\t\t\tcode.emplace_back(OP_MINT, 0, get(recurse(args[0])), get(recurse(args[1])),\n\t\t\t\t\t\targs.size() > 2 ? get(recurse(args[2])) : 0);\n\t\t\t\tout.address = 0;\n\t\t\t}\n\t\t\telse if(name == \"fail\") {\n\t\t\t\tif(args.size() != 1 && args.size() != 2) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 or 2 arguments for fail(message, [code])\");\n\t\t\t\t}\n\t\t\t\tcode.emplace_back(OP_FAIL, args.size() > 1 ? OPFLAG_REF_B : 0,\n\t\t\t\t\t\tget(recurse(args[0])),\n\t\t\t\t\t\targs.size() > 1 ? get(recurse(args[1])) : 0);\n\t\t\t\tout.address = 0;\n\t\t\t}\n\t\t\telse if(name == \"log\") {\n\t\t\t\tif(args.size() != 2) {\n\t\t\t\t\tthrow std::logic_error(\"expected 2 arguments for log(level, message)\");\n\t\t\t\t}\n\t\t\t\tcode.emplace_back(OP_LOG, OPFLAG_REF_A, get(recurse(args[0])), get(recurse(args[1])));\n\t\t\t\tout.address = 0;\n\t\t\t}\n\t\t\telse if(name == \"event\") {\n\t\t\t\tif(args.size() != 2) {\n\t\t\t\t\tthrow std::logic_error(\"expected 2 arguments for event(name, data)\");\n\t\t\t\t}\n\t\t\t\tcode.emplace_back(OP_EVENT, 0, get(recurse(args[0])), get(recurse(args[1])));\n\t\t\t\tout.address = 0;\n\t\t\t}\n\t\t\telse if(name == \"read\") {\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tif(args.size() == 2) {\n\t\t\t\t\tcode.emplace_back(OP_CREAD, 0, out.address, get(recurse(args[1])), get(recurse(args[0])));\n\t\t\t\t} else if(args.size() == 1) {\n\t\t\t\t\tcode.emplace_back(OP_CREAD, 0, out.address, MEM_EXTERN + EXTERN_ADDRESS, get(recurse(args[0])));\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 or 2 arguments for read(field, [address])\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(name == \"bech32\") {\n\t\t\t\tif(args.size() == 0) {\n\t\t\t\t\tout.address = stack.new_addr();\n\t\t\t\t\tcode.emplace_back(OP_COPY, 0, out.address, get_const_address(addr_t()));\n\t\t\t\t} else if(args.size() == 1) {\n\t\t\t\t\tout.address = stack.new_addr();\n\t\t\t\t\tcode.emplace_back(OP_CONV, 0, out.address, get(recurse(args[0])), CONVTYPE_ADDRESS, CONVTYPE_DEFAULT);\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"expected 0 or 1 argument for bech32()\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(name == \"binary\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for binary()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_CONV, 0, out.address, get(recurse(args[0])), CONVTYPE_BINARY, CONVTYPE_DEFAULT);\n\t\t\t}\n\t\t\telse if(name == \"binary_le\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for binary_le()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_CONV, 0, out.address, get(recurse(args[0])), (CONVTYPE_BINARY | (CONVTYPE_LITTLE_ENDIAN << 8)), CONVTYPE_DEFAULT);\n\t\t\t}\n\t\t\telse if(name == \"binary_hex\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for binary_hex()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_CONV, 0, out.address, get(recurse(args[0])), CONVTYPE_BINARY, CONVTYPE_BASE_16);\n\t\t\t}\n\t\t\telse if(name == \"bool\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for bool()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_CONV, 0, out.address, get(recurse(args[0])), CONVTYPE_BOOL, CONVTYPE_DEFAULT);\n\t\t\t}\n\t\t\telse if(name == \"uint\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for uint()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_CONV, 0, out.address, get(recurse(args[0])), CONVTYPE_UINT, CONVTYPE_DEFAULT);\n\t\t\t}\n\t\t\telse if(name == \"uint_le\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for uint_le()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_CONV, 0, out.address, get(recurse(args[0])), CONVTYPE_UINT, CONVTYPE_LITTLE_ENDIAN);\n\t\t\t}\n\t\t\telse if(name == \"uint_hex\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for uint_hex()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_CONV, 0, out.address, get(recurse(args[0])), CONVTYPE_UINT, CONVTYPE_BASE_16);\n\t\t\t}\n\t\t\telse if(name == \"sha256\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for sha256()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_SHA256, 0, out.address, get(recurse(args[0])));\n\t\t\t}\n\t\t\telse if(name == \"ecdsa_verify\") {\n\t\t\t\tif(args.size() != 3) {\n\t\t\t\t\tthrow std::logic_error(\"expected 3 arguments for ecdsa_verify(msg, pubkey, signature)\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_VERIFY, 0, out.address, get(recurse(args[0])), get(recurse(args[1])), get(recurse(args[2])));\n\t\t\t}\n\t\t\telse if(name == \"string\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for string()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_CONV, 0, out.address, get(recurse(args[0])), CONVTYPE_STRING, CONVTYPE_DEFAULT);\n\t\t\t}\n\t\t\telse if(name == \"string_hex\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for string_hex()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_CONV, 0, out.address, get(recurse(args[0])), CONVTYPE_STRING | (CONVTYPE_BASE_16 << 8), CONVTYPE_DEFAULT);\n\t\t\t}\n\t\t\telse if(name == \"string_bech32\") {\n\t\t\t\tif(args.size() != 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1 argument for string_bech32()\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_CONV, 0, out.address, get(recurse(args[0])), CONVTYPE_STRING | (CONVTYPE_ADDRESS << 8), CONVTYPE_DEFAULT);\n\t\t\t}\n\t\t\telse if(name == \"memcpy\") {\n\t\t\t\tif(args.size() < 2 || args.size() > 3) {\n\t\t\t\t\tthrow std::logic_error(\"expected 2 to 3 arguments for memcpy(src, count, [offset])\");\n\t\t\t\t}\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_MEMCPY, OPFLAG_REF_C | OPFLAG_REF_D, out.address,\n\t\t\t\t\t\tget(recurse(args[0])), get(recurse(args[1])),\n\t\t\t\t\t\t(args.size() > 2 ? get(recurse(args[2])) : get_const_address(uint256_0)));\n\t\t\t}\n\t\t\telse if(name == \"rcall\") {\n\t\t\t\tif(args.size() < 2) {\n\t\t\t\t\tthrow std::logic_error(\"expected at least two arguments for rcall(contract, method, ...)\");\n\t\t\t\t}\n\t\t\t\tconst auto contract = get(recurse(args[0]));\n\t\t\t\tconst auto method = get(recurse(args[1]));\n\n\t\t\t\tstd::vector<vref_t> fargs;\n\t\t\t\tfor(size_t i = 2; i < args.size(); ++i) {\n\t\t\t\t\tfargs.push_back(recurse(args[i]));\t// collect arguments first\n\t\t\t\t}\n\t\t\t\tconst auto offset = stack.new_addr();\n\t\t\t\tfor(size_t i = 0; i < fargs.size(); ++i) {\n\t\t\t\t\tcopy(offset + 1 + i, fargs[i]);\n\t\t\t\t}\n\t\t\t\tcode.emplace_back(OP_RCALL, 0, contract, method, offset - MEM_STACK, args.size() - 2);\n\t\t\t\tout.address = offset;\n\t\t\t}\n\t\t\telse if(name == \"balance\") {\n\t\t\t\tif(args.size() > 1) {\n\t\t\t\t\tthrow std::logic_error(\"expected at most one argument for balance([currency])\");\n\t\t\t\t}\n\t\t\t\tconst auto currency = args.size() > 0 ? get(recurse(args[0])) : get_const_address(addr_t());\n\t\t\t\tout.address = stack.new_addr();\n\t\t\t\tcode.emplace_back(OP_BALANCE, 0, out.address, currency);\n\t\t\t}\n\t\t\telse if(name == \"assert\") {\n\t\t\t\tif(args.size() < 1 || args.size() > 3) {\n\t\t\t\t\tthrow std::logic_error(\"expected 1-3 arguments for assert(condition, [message], [code])\");\n\t\t\t\t}\n\t\t\t\tcode.emplace_back(OP_JUMPI, 0, code.size() + 2, get(recurse(args[0])));\n\t\t\t\tif(args.size() == 1) {\n\t\t\t\t\tcode.emplace_back(OP_FAIL, 0, get_const_address(\"assert(\" + to_source(args[0]) + \")\"));\n\t\t\t\t} else {\n\t\t\t\t\tcode.emplace_back(OP_FAIL, args.size() > 2 ? OPFLAG_REF_B : 0,\n\t\t\t\t\t\t\tget(recurse(args[1])),\n\t\t\t\t\t\t\targs.size() > 2 ? get(recurse(args[2])) : 0);\n\t\t\t\t}\n\t\t\t\tout.address = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(curr_function && curr_function->is_const && lhs->func->root && !lhs->func->is_const) {\n\t\t\t\t\tthrow std::logic_error(\"cannot call non-const function inside const function: \" + name);\n\t\t\t\t}\n\t\t\t\tif(args.size() > lhs->func->args.size()) {\n\t\t\t\t\tthrow std::logic_error(\"too many function arguments: \"\n\t\t\t\t\t\t\t+ std::to_string(args.size()) + \" > \" + std::to_string(lhs->func->args.size()));\n\t\t\t\t}\n\t\t\t\tstd::vector<vref_t> fargs;\n\t\t\t\tfor(size_t i = 0; i < args.size(); ++i) {\n\t\t\t\t\tfargs.push_back(recurse(args[i]));\t// collect arguments first\n\t\t\t\t}\n\t\t\t\tconst auto offset = stack.new_addr();\n\t\t\t\tfor(size_t i = 0; i < fargs.size(); ++i) {\n\t\t\t\t\tcopy(offset + 1 + i, fargs[i]);\n\t\t\t\t}\n\t\t\t\tfor(size_t i = args.size(); i < lhs->func->args.size(); ++i) {\n\t\t\t\t\tconst auto& var = lhs->func->args[i];\n\t\t\t\t\tcode.emplace_back(OP_COPY, 0, offset + 1 + i, var.value ? get_const_address(var.value) : 0);\n\t\t\t\t}\n\t\t\t\tlinker_map[code.size()] = name;\n\t\t\t\tcode.emplace_back(OP_CALL, 0, -1, offset - MEM_STACK);\n\t\t\t\tout.address = offset;\n\t\t\t}\n\t\t}\n\t\telse if(lhs && lhs->is_interface) {\n\t\t\tif(!lhs->name) {\n\t\t\t\tthrow std::logic_error(\"missing interface name\");\n\t\t\t}\n\t\t\tif(!lhs->method) {\n\t\t\t\tthrow std::logic_error(\"missing method name\");\n\t\t\t}\n\t\t\tconst auto contract = get_const_address(*lhs->name);\n\t\t\tconst auto method = get_const_address(*lhs->method);\n\n\t\t\tstd::vector<vref_t> fargs;\n\t\t\tfor(size_t i = 0; i < args.size(); ++i) {\n\t\t\t\tfargs.push_back(recurse(args[i]));\t// collect arguments first\n\t\t\t}\n\t\t\tconst auto offset = stack.new_addr();\n\t\t\tfor(size_t i = 0; i < fargs.size(); ++i) {\n\t\t\t\tcopy(offset + 1 + i, fargs[i]);\n\t\t\t}\n\t\t\tcode.emplace_back(OP_RCALL, 0, contract, method, offset - MEM_STACK, args.size());\n\t\t\tout.address = offset;\n\t\t}\n\t\telse if(lhs) {\n\t\t\tif(lhs->name) {\n\t\t\t\tthrow std::logic_error(\"not a function: \" + *lhs->name);\n\t\t\t}\n\t\t\tthrow std::logic_error(\"expected function name\");\n\t\t}\n\t\telse {\n\t\t\tif(list.size() != 3) {\n\t\t\t\tthrow std::logic_error(\"invalid sub-expression\");\n\t\t\t}\n\t\t\tout = recurse(list[1]);\n\t\t}\n\t}\n\telse if(name == lang::constant::name)\n\t{\n\t\tif(lhs) {\n\t\t\tthrow std::logic_error(\"unexpected left operand\");\n\t\t}\n\t\tconst auto value = parse_constant(node);\n\t\tout.address = get_const_address(value);\n\t\tout.is_const = true;\n\t}\n\telse if(name == lang::object::name)\n\t{\n\t\tif(lhs) {\n\t\t\tthrow std::logic_error(\"unexpected left operand\");\n\t\t}\n\t\tout.address = stack.new_addr();\n\t\tcode.emplace_back(OP_CLONE, 0, out.address, get_const_address(std::make_unique<map_t>()));\n\n\t\tfor(const auto& node : list) {\n\t\t\tconst std::string name(node.kind().name());\n\t\t\tif(name == lang::object::entry::name) {\n\t\t\t\tconst auto list = get_children(node);\n\t\t\t\tif(list.size() != 3) {\n\t\t\t\t\tthrow std::logic_error(\"invalid object entry\");\n\t\t\t\t}\n\t\t\t\tvarptr_t key;\n\t\t\t\tconst std::string key_type(list[0].kind().name());\n\n\t\t\t\tif(key_type == lang::identifier::name) {\n\t\t\t\t\tkey = binary_t::alloc(get_literal(list[0]));\n\t\t\t\t} else if(key_type == lang::string::name) {\n\t\t\t\t\tkey = parse_constant(list[0]);\n\t\t\t\t} else {\n\t\t\t\t\tthrow std::logic_error(\"invalid object key\");\n\t\t\t\t}\n\t\t\t\tconst auto key_addr = get_const_address(key);\n\t\t\t\tcopy(vref_t(out.address, key_addr), recurse(list[2]));\n\t\t\t}\n\t\t}\n\t}\n\telse if(name == \"position\") {\n\t\t// ignore\n\t}\n\telse {\n\t\tthrow std::logic_error(\"invalid expression\");\n\t}\n\n\thandle_new_code();\n\tdepth--;\n\n\treturn recurse_expr(p_node, expr_len, &out, lhs_rank);\n}\n\nvoid Compiler::push_scope()\n{\n\tframe_t scope;\n\tif(!frame.empty()) {\n\t\tscope.addr_offset = frame.back().addr_offset;\n\t}\n\tframe.push_back(scope);\n}\n\nvoid Compiler::pop_scope()\n{\n\tframe.pop_back();\n}\n\nCompiler::vref_t Compiler::copy(const vref_t& dst, const vref_t& src, const bool validate)\n{\n\t// this function does not allocate anything new on the stack\n\t// so it's safe to use for preparing function call arguments\n\tsrc.check_value();\n\tdst.check_value();\n\n\tif(validate && !dst.is_mutable()) {\n\t\tthrow std::logic_error(\"copy(): dst is const\");\n\t}\n\tif(src.key && dst.key) {\n\t\tcode.emplace_back(OP_SET, OPFLAG_REF_A, dst.address, *dst.key, get(src));\n\t} else if(!src.key && dst.key) {\n\t\tcode.emplace_back(OP_SET, OPFLAG_REF_A, dst.address, *dst.key, src.address);\n\t} else if(src.key && !dst.key) {\n\t\tget(src, &dst.address);\n\t} else if(dst.address != src.address) {\n\t\tcode.emplace_back(OP_COPY, 0, dst.address, src.address);\n\t}\n\treturn dst;\n}\n\nuint32_t Compiler::get(const vref_t& src, const uint32_t* dst)\n{\n\tsrc.check_value();\n\n\tif(src.key) {\n\t\tconst auto dst_addr = (dst ? *dst : frame.back().new_addr());\n\t\tif(src.address == MEM_EXTERN + EXTERN_BALANCE) {\n\t\t\tcode.emplace_back(OP_BALANCE, 0, dst_addr, *src.key);\n\t\t} else {\n\t\t\tcode.emplace_back(OP_GET, OPFLAG_REF_B, dst_addr, src.address, *src.key);\n\t\t}\n\t\treturn dst_addr;\n\t}\n\tif(dst) {\n\t\treturn copy(*dst, src).address;\n\t}\n\treturn src.address;\n}\n\nconst Compiler::variable_t* Compiler::find_variable(const std::string& name) const\n{\n\tfor(auto iter = frame.rbegin(); iter != frame.rend(); ++iter) {\n\t\tauto iter2 = iter->var_map.find(name);\n\t\tif(iter2 != iter->var_map.end()) {\n\t\t\treturn &iter->var_list[iter2->second];\n\t\t}\n\t}\n\t{\n\t\tauto iter = global.var_map.find(name);\n\t\tif(iter != global.var_map.end()) {\n\t\t\treturn &global.var_list[iter->second];\n\t\t}\n\t}\n\treturn nullptr;\n}\n\nCompiler::variable_t Compiler::get_variable(const std::string& name)\n{\n\tif(auto var = find_variable(name)) {\n\t\treturn *var;\n\t}\n\tthrow std::logic_error(\"no such variable: \" + name);\n}\n\nconst Compiler::function_t* Compiler::find_function(const std::string& name) const\n{\n\tauto iter = function_map.find(name);\n\tif(iter != function_map.end()) {\n\t\treturn &iter->second;\n\t}\n\treturn nullptr;\n}\n\nuint32_t Compiler::get_const_address(const varptr_t& value)\n{\n\tif(!value) {\n\t\tthrow std::logic_error(\"get_const_addr(): !value\");\n\t}\n\t{\n\t\tauto iter = const_table.find(value);\n\t\tif(iter != const_table.end()) {\n\t\t\treturn MEM_CONST + iter->second;\n\t\t}\n\t}\n\tconst auto addr = const_table[value] = const_vars.size();\n\n\tvariable_t var;\n\tvar.value = value;\n\tvar.address = MEM_CONST + addr;\n\tconst_vars.push_back(var);\n\tdebug(true) << \"CONSTANT [0x\" << std::hex << var.address << std::dec << \"] \" << to_string(value) << std::endl;\n\treturn var.address;\n}\n\nuint32_t Compiler::get_const_address(const uint256_t& value)\n{\n\treturn get_const_address(std::make_unique<uint_t>(value));\n}\n\nuint32_t Compiler::get_const_address(const addr_t& value)\n{\n\treturn get_const_address(vm::to_binary(value));\n}\n\nuint32_t Compiler::get_const_address(const std::string& value)\n{\n\treturn get_const_address(vm::to_binary(value));\n}\n\n\nstd::shared_ptr<const contract::Binary> compile(const std::string& source, const compile_flags_t& flags)\n{\n//#ifdef _WIN32\n//\tlexy_ext::shell<lexy_ext::default_prompt<lexy::ascii_encoding>> shell;\n//\n//\tlexy::trace_to<lang::source>(shell.write_message().output_iterator(),\n//\t\t\tlexy::string_input<lexy::ascii_encoding>(source), {lexy::visualize_use_color});\n//#else\n//\tlexy_ext::shell<lexy_ext::default_prompt<lexy::utf8_encoding>> shell;\n//\n//\tlexy::trace_to<lang::source>(shell.write_message().output_iterator(),\n//\t\t\tlexy::string_input<lexy::utf8_encoding>(source), {lexy::visualize_fancy});\n//#endif // _WIN32\n\n\tCompiler compiler(flags);\n\treturn compiler.compile(source);\n}\n\nstd::shared_ptr<const contract::Binary> compile_files(const std::vector<std::string>& file_names, const compile_flags_t& flags)\n{\n\tstd::string buffer;\n\tfor(const auto& src : file_names) {\n\t\tbuffer += read_file(src);\n\t}\n\treturn vm::compile(buffer, flags);\n}\n\n\n} // vm\n} // mmx\n"
  },
  {
    "path": "src/vm/Engine.cpp",
    "content": "/*\n * Engine.cpp\n *\n *  Created on: Apr 22, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/Engine.h>\n#include <mmx/vm/StorageProxy.h>\n#include <mmx/vm_interface.h>\n#include <mmx/signature_t.hpp>\n#include <mmx/error_code_e.hxx>\n\n#include <iostream>\n\n\nnamespace mmx {\nnamespace vm {\n\nstatic const uint64_t MEM_HEAP_NEXT_ALLOC = MEM_HEAP + GLOBAL_NEXT_ALLOC;\n\nEngine::Engine(const addr_t& contract, std::shared_ptr<Storage> backend, bool read_only)\n\t:\tcontract(contract),\n\t\tstorage(std::make_shared<StorageProxy>(this, backend, read_only))\n{\n}\n\nEngine::~Engine()\n{\n\tkey_map.clear();\n}\n\nvoid Engine::addref(const uint64_t dst)\n{\n\tif(auto var = read(dst, true)) {\n\t\tvar->addref();\n\t}\n}\n\nvoid Engine::unref(const uint64_t dst)\n{\n\tif(auto var = read(dst, true)) {\n\t\tif(var->unref()) {\n\t\t\terase(dst);\n\t\t}\n\t}\n}\n\nvar_t* Engine::assign(const uint64_t dst, std::unique_ptr<var_t> value)\n{\n\tif(have_init && dst < MEM_EXTERN) {\n\t\tthrow std::logic_error(\"already initialized\");\n\t}\n\tswitch(value->type) {\n\t\tcase TYPE_ARRAY:\n\t\t\t((array_t*)value.get())->address = dst;\n\t\t\tbreak;\n\t\tcase TYPE_MAP:\n\t\t\t((map_t*)value.get())->address = dst;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\tauto& var = memory[dst];\n\tif(!var && dst >= MEM_STATIC && dst < new_heap_base) {\n\t\tvar = storage->read(contract, dst);\n\t}\n\treturn assign(var, std::move(value));\n}\n\nvar_t* Engine::assign(std::unique_ptr<var_t>& var, std::unique_ptr<var_t> value)\n{\n\tif(var) {\n\t\tif(var->flags & FLAG_CONST) {\n\t\t\tthrow std::logic_error(\"read-only memory\");\n\t\t}\n\t\tvalue->flags = var->flags;\n\t\tvalue->ref_count = var->ref_count;\n\t\tclear(var.get());\n\t}\n\tconst auto size = num_bytes(value.get());\n\tif(size > MAX_VALUE_BYTES) {\n\t\tthrow std::runtime_error(\"value size too large: \" + std::to_string(size) + \" bytes\");\n\t}\n\tgas_used += WRITE_COST + (size * WRITE_32_BYTE_COST) / 32;\n\n\tvar = std::move(value);\n\tvar->flags |= FLAG_DIRTY;\n\tvar->flags &= ~FLAG_DELETED;\n\n\tif(var->type == TYPE_REF) {\n\t\taddref(((const ref_t*)var.get())->address);\n\t}\n\treturn var.get();\n}\n\nuint64_t Engine::lookup(const uint64_t src, const bool read_only)\n{\n\treturn lookup(read_fail(src), read_only);\n}\n\nuint64_t Engine::lookup(const var_t* var, const bool read_only)\n{\n\treturn var ? lookup(*var, read_only) : 0;\n}\n\nuint64_t Engine::lookup(const varptr_t& var, const bool read_only)\n{\n\treturn lookup(var.get(), read_only);\n}\n\nuint64_t Engine::lookup(const var_t& var, const bool read_only)\n{\n\tif(var.type == TYPE_NIL) {\n\t\tthrow std::runtime_error(\"invalid key type\");\n\t}\n\tconst auto size = num_bytes(var);\n\tif(size > MAX_KEY_BYTES) {\n\t\tthrow std::runtime_error(\"invalid key size: \" + std::to_string(size));\n\t}\n\tconst auto iter = key_map.find(&var);\n\tif(iter != key_map.end()) {\n\t\treturn iter->second;\n\t}\n\tif(auto key = storage->lookup(contract, var)) {\n\t\tconst auto& value = read_fail(key);\n\t\tif(!(value.flags & FLAG_CONST) || !(value.flags & FLAG_KEY)) {\n\t\t\tthrow std::logic_error(\"lookup(): key missing flag CONST / KEY\");\n\t\t}\n\t\tkey_map[&value] = key;\n\t\treturn key;\n\t}\n\tif(read_only) {\n\t\treturn 0;\n\t}\n\tconst auto key = alloc();\n\tconst auto value = write(key, var);\n\tvalue->flags |= FLAG_CONST | FLAG_KEY;\n\tvalue->addref();\n\tkey_map[value] = key;\n\treturn key;\n}\n\nvar_t* Engine::write(const uint64_t dst, const var_t* src)\n{\n\tif(src) {\n\t\treturn write(dst, *src);\n\t}\n\treturn write(dst, var_t());\n}\n\nvar_t* Engine::write(const uint64_t dst, const var_t& src)\n{\n\tif(have_init && dst < MEM_EXTERN) {\n\t\tthrow std::logic_error(\"already initialized\");\n\t}\n\tauto& var = memory[dst];\n\tif(!var && dst >= MEM_STATIC && dst < new_heap_base) {\n\t\tvar = storage->read(contract, dst);\n\t}\n\treturn write(var, &dst, src);\n}\n\nvar_t* Engine::write(const uint64_t dst, const varptr_t& var)\n{\n\treturn write(dst, var.get());\n}\n\nvar_t* Engine::write(std::unique_ptr<var_t>& var, const uint64_t* dst, const var_t& src)\n{\n\tif(var.get() == &src) {\n\t\treturn var.get();\n\t}\n\tif(src.flags & FLAG_DELETED) {\n\t\tthrow std::logic_error(\"write(): src has FLAG_DELETED\");\n\t}\n\tif(var) {\n\t\tif(var->flags & FLAG_CONST) {\n\t\t\tif(dst) {\n\t\t\t\tthrow std::logic_error(\"read-only memory at \" + to_hex(*dst));\n\t\t\t} else {\n\t\t\t\tthrow std::logic_error(\"read-only memory\");\n\t\t\t}\n\t\t}\n\t\tif(var->flags & FLAG_DELETED) {\n\t\t\tvar->flags |= FLAG_DIRTY;\n\t\t\tvar->flags &= ~FLAG_DELETED;\n\t\t}\n\t\tswitch(src.type) {\n\t\t\tcase TYPE_NIL:\n\t\t\tcase TYPE_TRUE:\n\t\t\tcase TYPE_FALSE:\n\t\t\t\tswitch(var->type) {\n\t\t\t\t\tcase TYPE_NIL:\n\t\t\t\t\tcase TYPE_TRUE:\n\t\t\t\t\tcase TYPE_FALSE:\n\t\t\t\t\t\tif(var->type != src.type) {\n\t\t\t\t\t\t\tvar->flags |= FLAG_DIRTY;\n\t\t\t\t\t\t\tvar->type = src.type;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn var.get();\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase TYPE_REF:\n\t\t\t\tif(var->type == TYPE_REF) {\n\t\t\t\t\tauto ref = (ref_t*)var.get();\n\t\t\t\t\tconst auto new_address = ((const ref_t&)src).address;\n\t\t\t\t\tif(new_address != ref->address) {\n\t\t\t\t\t\tunref(ref->address);\n\t\t\t\t\t\tvar->flags |= FLAG_DIRTY;\n\t\t\t\t\t\tref->address = new_address;\n\t\t\t\t\t\taddref(ref->address);\n\t\t\t\t\t}\n\t\t\t\t\treturn ref;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase TYPE_UINT:\n\t\t\t\tif(var->type == TYPE_UINT) {\n\t\t\t\t\tauto uint = (uint_t*)var.get();\n\t\t\t\t\tconst auto new_value = ((const uint_t&)src).value;\n\t\t\t\t\tif(new_value != uint->value) {\n\t\t\t\t\t\tvar->flags |= FLAG_DIRTY;\n\t\t\t\t\t\tuint->value = new_value;\n\t\t\t\t\t}\n\t\t\t\t\treturn uint;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tswitch(src.type) {\n\t\tcase TYPE_NIL:\n\t\tcase TYPE_TRUE:\n\t\tcase TYPE_FALSE:\n\t\t\tassign(var, std::make_unique<var_t>(src.type));\n\t\t\tbreak;\n\t\tcase TYPE_REF:\n\t\t\tassign(var, std::make_unique<ref_t>(((const ref_t&)src).address));\n\t\t\tbreak;\n\t\tcase TYPE_UINT:\n\t\t\tassign(var, std::make_unique<uint_t>(((const uint_t&)src).value));\n\t\t\tbreak;\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY:\n\t\t\tassign(var, binary_t::alloc((const binary_t&)src));\n\t\t\tbreak;\n\t\tcase TYPE_ARRAY: {\n\t\t\tif(!dst) {\n\t\t\t\tthrow std::logic_error(\"cannot assign array here\");\n\t\t\t}\n\t\t\tconst auto& asrc = (const array_t&)src;\n\t\t\t{\n\t\t\t\tauto tmp = std::make_unique<array_t>(asrc.size);\n\t\t\t\ttmp->address = *dst;\n\t\t\t\tassign(var, std::move(tmp));\n\t\t\t}\n\t\t\tfor(uint64_t i = 0; i < asrc.size; ++i) {\n\t\t\t\twrite_entry(*dst, i, read_entry_fail(asrc.address, i));\n\t\t\t\tcheck_gas();\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_MAP: {\n\t\t\tif(!dst) {\n\t\t\t\tthrow std::logic_error(\"cannot assign map here\");\n\t\t\t}\n\t\t\tif(src.flags & FLAG_STORED) {\n\t\t\t\tthrow std::logic_error(\"cannot clone map from storage\");\n\t\t\t}\n\t\t\tconst auto& msrc = (const map_t&)src;\n\t\t\t{\n\t\t\t\tauto tmp = std::make_unique<map_t>();\n\t\t\t\ttmp->address = *dst;\n\t\t\t\tassign(var, std::move(tmp));\n\t\t\t}\n\t\t\tconst auto begin = entries.lower_bound(std::make_pair(msrc.address, 0));\n\t\t\tfor(auto iter = begin; iter != entries.end() && iter->first.first == msrc.address; ++iter) {\n\t\t\t\tif(auto value = iter->second.get()) {\n\t\t\t\t\tif((value->flags & FLAG_DELETED) == 0) {\n\t\t\t\t\t\twrite_entry(*dst, iter->first.second, *value);\n\t\t\t\t\t\tcheck_gas();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tthrow invalid_type(src);\n\t}\n\treturn var.get();\n}\n\nvoid Engine::push_back(const uint64_t dst, const var_t& var)\n{\n\tauto& array = read_fail<array_t>(dst, TYPE_ARRAY);\n\tif(array.size >= std::numeric_limits<uint32_t>::max()) {\n\t\tthrow std::runtime_error(\"push_back() overflow at \" + to_hex(dst));\n\t}\n\twrite_entry(dst, array.size++, var);\n\tarray.flags |= FLAG_DIRTY;\n}\n\nvoid Engine::push_back(const uint64_t dst, const varptr_t& var)\n{\n\tif(var) {\n\t\tpush_back(dst, *var);\n\t} else {\n\t\tpush_back(dst, var_t());\n\t}\n}\n\nvoid Engine::push_back(const uint64_t dst, const uint64_t src)\n{\n\tif(dst == src) {\n\t\tthrow std::logic_error(\"push_back(): dst == src\");\n\t}\n\tpush_back(dst, read_fail(src));\n}\n\nvoid Engine::pop_back(const uint64_t dst, const uint64_t& src)\n{\n\tif(dst == src) {\n\t\tthrow std::logic_error(\"pop_back(): dst == src\");\n\t}\n\tauto& array = read_fail<array_t>(src, TYPE_ARRAY);\n\tif(array.size == 0) {\n\t\tthrow std::logic_error(\"pop_back() underflow at \" + to_hex(dst));\n\t}\n\tconst auto index = array.size - 1;\n\twrite(dst, read_entry_fail(src, index));\n\terase_entry(src, index);\n\tarray.size--;\n\tarray.flags |= FLAG_DIRTY;\n}\n\nvar_t* Engine::write_entry(const uint64_t dst, const uint64_t key, const var_t& src)\n{\n\tif(have_init && dst < MEM_EXTERN) {\n\t\tthrow std::logic_error(\"already initialized\");\n\t}\n\tauto& container = read_fail(dst);\n\n\tif(container.flags & FLAG_CONST) {\n\t\tthrow std::logic_error(\"read-only memory at \" + to_hex(dst));\n\t}\n\treturn write(entries[std::make_pair(dst, key)], nullptr, src);\n}\n\nvar_t* Engine::write_entry(const uint64_t dst, const uint64_t key, const varptr_t& var)\n{\n\tif(var) {\n\t\treturn write_entry(dst, key, *var);\n\t}\n\treturn write_entry(dst, key, var_t());\n}\n\nvar_t* Engine::write_key(const uint64_t dst, const uint64_t key, const var_t& var)\n{\n\treturn write_entry(dst, lookup(key, false), var);\n}\n\nvar_t* Engine::write_key(const uint64_t dst, const var_t& key, const var_t& var)\n{\n\treturn write_entry(dst, lookup(key, false), var);\n}\n\nvar_t* Engine::write_key(const uint64_t dst, const varptr_t& key, const varptr_t& var)\n{\n\treturn write_entry(dst, lookup(key, false), var);\n}\n\nvoid Engine::erase_entry(const uint64_t dst, const uint64_t key)\n{\n\tconst auto mapkey = std::make_pair(dst, key);\n\tauto iter = entries.find(mapkey);\n\tif(iter == entries.end() && dst >= MEM_STATIC && (read_fail(dst).flags & FLAG_STORED)) {\n\t\tif(auto var = storage->read(contract, dst, key)) {\n\t\t\titer = entries.emplace(mapkey, std::move(var)).first;\n\t\t}\n\t}\n\tif(iter != entries.end()) {\n\t\terase(iter->second);\n\t}\n}\n\nvoid Engine::erase_key(const uint64_t dst, const uint64_t key)\n{\n\tif(auto addr = lookup(key, true)) {\n\t\terase_entry(dst, addr);\n\t}\n}\n\nvoid Engine::erase_entries(const uint64_t dst)\n{\n\tconst auto begin = entries.lower_bound(std::make_pair(dst, 0));\n\tfor(auto iter = begin; iter != entries.end() && iter->first.first == dst; ++iter) {\n\t\terase(iter->second);\n\t\tcheck_gas();\n\t}\n}\n\nvoid Engine::erase(const uint64_t dst)\n{\n\tconst auto iter = memory.find(dst);\n\tif(iter != memory.end()) {\n\t\terase(iter->second);\n\t}\n\telse if(dst >= MEM_STATIC) {\n\t\tif(auto var = storage->read(contract, dst)) {\n\t\t\terase(memory[dst] = std::move(var));\n\t\t}\n\t}\n}\n\nvoid Engine::erase(std::unique_ptr<var_t>& var)\n{\n\tif(!var) {\n\t\treturn;\n\t}\n\tif(var->flags & FLAG_CONST) {\n\t\tthrow std::logic_error(\"erase() on read-only memory\");\n\t}\n\tif(var->flags & FLAG_DELETED) {\n\t\treturn;\n\t}\n\tif(var->ref_count) {\n\t\tthrow std::logic_error(\"erase() with ref_count \" + std::to_string(var->ref_count));\n\t}\n\tif(++erase_call_depth > MAX_ERASE_RECURSION) {\n\t\tthrow std::runtime_error(\"erase() recursion overflow\");\n\t}\n\t// account cost here because of recursion in clear() -> unref() -> erase() -> clear()\n\tgas_used += WRITE_COST;\n\tcheck_gas();\n\n\tclear(var.get());\n\n\tconst auto prev = std::move(var);\n\tvar = std::make_unique<var_t>();\n\tif(prev->flags & FLAG_STORED) {\n\t\tvar->flags = (prev->flags | FLAG_DIRTY | FLAG_DELETED);\n\t} else {\n\t\tvar->flags = FLAG_DELETED;\n\t}\n\terase_call_depth--;\n}\n\nvoid Engine::clear(var_t* var)\n{\n\tswitch(var->type) {\n\t\tcase TYPE_REF:\n\t\t\tunref(((const ref_t*)var)->address);\n\t\t\tbreak;\n\t\tcase TYPE_ARRAY: {\n\t\t\tif(var->flags & FLAG_STORED) {\n\t\t\t\tthrow std::logic_error(\"cannot erase array in storage\");\n\t\t\t}\n\t\t\terase_entries(((const array_t*)var)->address);\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_MAP: {\n\t\t\tif(var->flags & FLAG_STORED) {\n\t\t\t\tthrow std::logic_error(\"cannot erase map in storage\");\n\t\t\t}\n\t\t\terase_entries(((const map_t*)var)->address);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tbreak;\n\t}\n}\n\nvar_t* Engine::read(const uint64_t src, const bool mem_only)\n{\n\tauto iter = memory.find(src);\n\tif(iter != memory.end()) {\n\t\tauto var = iter->second.get();\n\t\tif(var) {\n\t\t\tif(var->flags & FLAG_DELETED) {\n\t\t\t\treturn nullptr;\n\t\t\t}\n\t\t}\n\t\treturn var;\n\t}\n\tif(mem_only) {\n\t\treturn nullptr;\n\t}\n\tif(src >= MEM_STATIC) {\n\t\tif(auto var = storage->read(contract, src)) {\n\t\t\treturn (memory[src] = std::move(var)).get();\n\t\t}\n\t}\n\treturn nullptr;\n}\n\nvar_t& Engine::read_fail(const uint64_t src)\n{\n\tif(auto var = read(src)) {\n\t\treturn *var;\n\t}\n\tthrow std::runtime_error(\"read fail at \" + to_hex(src));\n}\n\nvar_t* Engine::read_entry(const uint64_t src, const uint64_t key)\n{\n\tconst auto mapkey = std::make_pair(src, key);\n\tconst auto iter = entries.find(mapkey);\n\tif(iter != entries.end()) {\n\t\tauto var = iter->second.get();\n\t\tif(var) {\n\t\t\tif(var->flags & FLAG_DELETED) {\n\t\t\t\treturn nullptr;\n\t\t\t}\n\t\t}\n\t\treturn var;\n\t}\n\tif(src >= MEM_STATIC) {\n\t\tif(auto var = storage->read(contract, src, key)) {\n\t\t\treturn (entries[mapkey] = std::move(var)).get();\n\t\t}\n\t}\n\treturn nullptr;\n}\n\nvar_t& Engine::read_entry_fail(const uint64_t src, const uint64_t key)\n{\n\tif(auto var = read_entry(src, key)) {\n\t\treturn *var;\n\t}\n\tthrow std::logic_error(\"read fail at \" + to_hex(src) + \"[\" + std::to_string(key) + \"]\");\n}\n\nvar_t* Engine::read_key(const uint64_t src, const uint64_t key)\n{\n\tif(auto addr = lookup(key, true)) {\n\t\treturn read_entry(src, addr);\n\t}\n\treturn nullptr;\n}\n\nvar_t* Engine::read_key(const uint64_t src, const var_t& key)\n{\n\tif(auto addr = lookup(key, true)) {\n\t\treturn read_entry(src, addr);\n\t}\n\treturn nullptr;\n}\n\nvar_t* Engine::read_key(const uint64_t src, const varptr_t& key)\n{\n\tif(auto addr = lookup(key, true)) {\n\t\treturn read_entry(src, addr);\n\t}\n\treturn nullptr;\n}\n\nvar_t& Engine::read_key_fail(const uint64_t src, const uint64_t key)\n{\n\tif(auto addr = lookup(key, true)) {\n\t\treturn read_entry_fail(src, addr);\n\t}\n\tthrow std::logic_error(\"no such key at \" + to_hex(src));\n}\n\nuint64_t Engine::alloc()\n{\n\tauto offset = read<uint_t>(MEM_HEAP_NEXT_ALLOC, TYPE_UINT);\n\tif(!offset) {\n\t\tnew_heap_base = MEM_HEAP;\n\t\toffset = (uint_t*)assign(MEM_HEAP_NEXT_ALLOC, std::make_unique<uint_t>(MEM_HEAP + GLOBAL_DYNAMIC_START));\n\t\toffset->pin();\n\t}\n\tif(offset->value >= uint64_t(-1)) {\n\t\tthrow std::runtime_error(\"out of memory\");\n\t}\n\toffset->flags |= FLAG_DIRTY;\n\n\tif(first_alloc) {\n\t\tfirst_alloc = false;\n\t\tnew_heap_base = offset->value;\n\t}\n\treturn offset->value++;\n}\n\nvoid Engine::init()\n{\n\tif(have_init) {\n\t\tthrow std::logic_error(\"init(): already initialized\");\n\t}\n\t// Note: address 0 is not a valid key (used to denote \"key not found\")\n\tfor(auto iter = memory.lower_bound(1); iter != memory.lower_bound(MEM_EXTERN); ++iter) {\n\t\tconst auto* key = iter->second.get();\n\t\tif(num_bytes(key) <= MAX_KEY_BYTES) {\n\t\t\tkey_map.emplace(key, iter->first);\n\t\t}\n\t}\n\thave_init = true;\n}\n\nvoid Engine::begin(const uint64_t instr_ptr)\n{\n\tif(!have_init) {\n\t\tthrow std::logic_error(\"begin(): not initialized\");\n\t}\n\tif(!call_stack.empty()) {\n\t\tthrow std::logic_error(\"begin(): call stack not empty\");\n\t}\n\tfor(auto iter = memory.begin(); iter != memory.lower_bound(MEM_STACK); ++iter) {\n\t\tif(auto var = iter->second.get()) {\n\t\t\tvar->flags |= FLAG_CONST;\n\t\t\tvar->flags &= ~FLAG_DIRTY;\n\t\t}\n\t}\n\tframe_t frame;\n\tframe.instr_ptr = instr_ptr;\n\tcall_stack.push_back(frame);\n}\n\nvoid Engine::run()\n{\n\twhile(!call_stack.empty()) {\n\t\tstep();\n\t}\n}\n\nvoid Engine::step()\n{\n\tconst auto instr_ptr = get_frame().instr_ptr;\n\tif(instr_ptr >= code.size()) {\n\t\tthrow std::logic_error(\"instr_ptr out of bounds: \" + to_hex(instr_ptr) + \" > \" + to_hex(code.size()));\n\t}\n\ttry {\n\t\texec(code[instr_ptr]);\n\t\tcheck_gas();\n\t} catch(...) {\n\t\tif(is_debug) {\n\t\t\tdump_memory();\n\t\t}\n\t\terror_addr = instr_ptr;\n\t\tthrow;\n\t}\n}\n\nvoid Engine::check_gas()\n{\n\tif(gas_used > gas_limit) {\n\t\terror_code = error_code_e::TXFEE_OVERRUN;\n\t\tthrow std::runtime_error(\"out of gas: \" + std::to_string(gas_used) + \" > \" + std::to_string(gas_limit));\n\t}\n}\n\nvoid Engine::copy(const uint64_t dst, const uint64_t src)\n{\n\tif(dst != src) {\n\t\twrite(dst, read_fail(src));\n\t}\n}\n\nvoid Engine::clone(const uint64_t dst, const uint64_t src)\n{\n\tconst auto addr = alloc();\n\twrite(addr, read_fail(src));\n\twrite(dst, ref_t(addr));\n}\n\nvoid Engine::get(const uint64_t dst, const uint64_t addr, const uint64_t key, const uint8_t flags)\n{\n\tconst auto& var = read_fail(addr);\n\tswitch(var.type) {\n\t\tcase TYPE_ARRAY: {\n\t\t\tconst auto& index = read_fail<uint_t>(key, TYPE_UINT);\n\t\t\tif(index.value < ((const array_t&)var).size) {\n\t\t\t\twrite(dst, read_entry_fail(addr, uint64_t(index.value)));\n\t\t\t} else if(flags & OPFLAG_HARD_FAIL) {\n\t\t\t\tthrow std::runtime_error(\"array index out of bounds\");\n\t\t\t} else {\n\t\t\t\twrite(dst, var_t());\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_MAP:\n\t\t\twrite(dst, read_key(addr, key));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tif(flags & OPFLAG_HARD_FAIL) {\n\t\t\t\tthrow invalid_type(var);\n\t\t\t} else {\n\t\t\t\twrite(dst, var_t());\n\t\t\t}\n\t}\n}\n\nvoid Engine::set(const uint64_t addr, const uint64_t key, const uint64_t src, const uint8_t flags)\n{\n\tconst auto& var = read_fail(addr);\n\tswitch(var.type) {\n\t\tcase TYPE_ARRAY: {\n\t\t\tconst auto& index = read_fail<uint_t>(key, TYPE_UINT);\n\t\t\tif(index.value >= ((const array_t&)var).size) {\n\t\t\t\tthrow std::runtime_error(\"array index out of bounds\");\n\t\t\t}\n\t\t\twrite_entry(addr, uint64_t(index.value), read_fail(src));\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_MAP:\n\t\t\twrite_key(addr, key, read_fail(src));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow invalid_type(var);\n\t}\n}\n\nvoid Engine::erase(const uint64_t addr, const uint64_t key, const uint8_t flags)\n{\n\tconst auto& var = read_fail(addr);\n\tswitch(var.type) {\n\t\tcase TYPE_MAP:\n\t\t\terase_key(addr, key);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow invalid_type(var);\n\t}\n}\n\nvoid Engine::concat(const uint64_t dst, const uint64_t lhs, const uint64_t rhs)\n{\n\tconst auto& lvar = read_fail(lhs);\n\tconst auto& rvar = read_fail(rhs);\n\tif(lvar.type != rvar.type) {\n\t\tthrow std::logic_error(\"type mismatch\");\n\t}\n\tswitch(lvar.type) {\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY: {\n\t\t\tconst auto& L = (const binary_t&)lvar;\n\t\t\tconst auto& R = (const binary_t&)rvar;\n\t\t\tconst auto size = uint64_t(L.size) + R.size;\n\t\t\tauto res = binary_t::unsafe_alloc(size, lvar.type);\n\t\t\t::memcpy(res->data(), L.data(), L.size);\n\t\t\t::memcpy(res->data(L.size), R.data(), R.size);\n\t\t\tres->size = size;\n\t\t\tassign(dst, std::move(res));\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_ARRAY: {\n\t\t\tif(dst == lhs || dst == rhs) {\n\t\t\t\tthrow std::logic_error(\"dst == lhs || dst == rhs\");\n\t\t\t}\n\t\t\tconst auto addr = alloc();\n\t\t\tconst auto& L = (const array_t&)lvar;\n\t\t\tconst auto& R = (const array_t&)rvar;\n\t\t\tassign(addr, std::make_unique<array_t>());\n\t\t\tfor(uint64_t i = 0; i < L.size; ++i) {\n\t\t\t\tpush_back(addr, read_entry_fail(L.address, i));\n\t\t\t\tcheck_gas();\n\t\t\t}\n\t\t\tfor(uint64_t i = 0; i < R.size; ++i) {\n\t\t\t\tpush_back(addr, read_entry_fail(R.address, i));\n\t\t\t\tcheck_gas();\n\t\t\t}\n\t\t\twrite(dst, ref_t(addr));\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tthrow invalid_type(lvar);\n\t}\n}\n\nvoid Engine::memcpy(const uint64_t dst, const uint64_t src, const uint64_t count, const uint64_t offset)\n{\n\tconst auto& svar = read_fail(src);\n\tswitch(svar.type) {\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY: {\n\t\t\tconst auto& sbin = (const binary_t&)svar;\n\t\t\tif(sbin.size < offset + count) {\n\t\t\t\tthrow std::logic_error(\"out of bounds read\");\n\t\t\t}\n\t\t\tauto res = binary_t::unsafe_alloc(count, svar.type);\n\t\t\t::memcpy(res->data(), sbin.data(offset), count);\n\t\t\tres->size = count;\n\t\t\tassign(dst, std::move(res));\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tthrow invalid_type(svar);\n\t}\n}\n\nvoid Engine::sha256(const uint64_t dst, const uint64_t src)\n{\n\tconst auto& svar = read_fail(src);\n\tswitch(svar.type) {\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY: {\n\t\t\tconst auto& sbin = (const binary_t&)svar;\n\t\t\tgas_used += ((sbin.size + 63) / 64) * SHA256_BLOCK_COST;\n\t\t\tcheck_gas();\n\t\t\tconst hash_t hash(sbin.data(), sbin.size);\n\t\t\twrite(dst, binary_t::alloc(hash.data(), hash.size()));\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tthrow invalid_type(svar);\n\t}\n}\n\nvoid Engine::verify(const uint64_t dst, const uint64_t msg, const uint64_t pubkey, const uint64_t signature)\n{\n\tgas_used += ECDSA_VERIFY_COST;\n\tcheck_gas();\n\twrite(dst, var_t(\n\t\t\tsignature_t(read_fail<binary_t>(signature, TYPE_BINARY).to_vector()).verify(\n\t\t\t\t\tpubkey_t(read_fail<binary_t>(pubkey, TYPE_BINARY).to_vector()),\n\t\t\t\t\thash_t::from_bytes(read_fail<binary_t>(msg, TYPE_BINARY).to_vector()))));\n}\n\nvoid Engine::conv(const uint64_t dst, const uint64_t src, const uint64_t dflags, const uint64_t sflags)\n{\n\tconst uint8_t dflags_0 = dflags;\n\tconst uint8_t dflags_1 = (dflags >> 8);\n\tconst uint8_t sflags_0 = sflags;\n//\tconst uint8_t sflags_1 = (sflags >> 8);\n\n\tconst auto& svar = read_fail(src);\n\tif(dflags_0 == CONVTYPE_BOOL) {\n\t\twrite(dst, var_t(is_true(svar)));\n\t\treturn;\n\t}\n\tswitch(svar.type) {\n\t\tcase TYPE_NIL:\n\t\t\tswitch(dflags_0) {\n\t\t\t\tcase CONVTYPE_UINT: write(dst, uint_t()); break;\n\t\t\t\tcase CONVTYPE_ADDRESS: write(dst, vm::to_binary(addr_t())); break;\n\t\t\t\tdefault: throw std::logic_error(\"invalid conversion: NIL to \" + to_hex(dflags));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_TRUE:\n\t\t\tswitch(dflags_0) {\n\t\t\t\tcase CONVTYPE_UINT: write(dst, uint_t(1)); break;\n\t\t\t\tdefault: throw std::logic_error(\"invalid conversion: TRUE to \" + to_hex(dflags));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_FALSE:\n\t\t\tswitch(dflags_0) {\n\t\t\t\tcase CONVTYPE_UINT: write(dst, uint_t()); break;\n\t\t\t\tdefault: throw std::logic_error(\"invalid conversion: FALSE to \" + to_hex(dflags));\n\t\t\t}\n\t\t\tbreak;\n\t\tcase TYPE_UINT: {\n\t\t\tconst auto& value = ((const uint_t&)svar).value;\n\t\t\tswitch(dflags_0) {\n\t\t\t\tcase CONVTYPE_UINT:\n\t\t\t\t\twrite(dst, svar);\n\t\t\t\t\tbreak;\n\t\t\t\tcase CONVTYPE_STRING: {\n\t\t\t\t\tint base = 10;\n\t\t\t\t\tswitch(dflags_1) {\n\t\t\t\t\t\tcase CONVTYPE_DEFAULT: break;\n\t\t\t\t\t\tcase CONVTYPE_BASE_2: base = 2; break;\n\t\t\t\t\t\tcase CONVTYPE_BASE_8: base = 8; break;\n\t\t\t\t\t\tcase CONVTYPE_BASE_10: base = 10; break;\n\t\t\t\t\t\tcase CONVTYPE_BASE_16: base = 16; break;\n\t\t\t\t\t\tdefault: throw std::logic_error(\"invalid conversion: UINT to STRING with dst flags \" + to_hex(dflags));\n\t\t\t\t\t}\n\t\t\t\t\tif(value >> 128) {\n\t\t\t\t\t\tswitch(base) {\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\tcase 8:\n\t\t\t\t\t\t\tcase 16: break;\n\t\t\t\t\t\t\tdefault: throw std::logic_error(\"invalid conversion: 256-bit UINT to STRING with base \" + std::to_string(base));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tgas_used += CONV_UINT_256_STRING_COST;\n\t\t\t\t\t} else if(value >> 64) {\n\t\t\t\t\t\tgas_used += CONV_UINT_128_STRING_COST;\n\t\t\t\t\t} else if(value >> 32) {\n\t\t\t\t\t\tgas_used += CONV_UINT_64_STRING_COST;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgas_used += CONV_UINT_32_STRING_COST;\n\t\t\t\t\t}\n\t\t\t\t\tcheck_gas();\n\t\t\t\t\tassign(dst, binary_t::alloc(value.str(base)));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase CONVTYPE_BINARY: {\n\t\t\t\t\tbool big_endian = true;\n\t\t\t\t\tswitch(dflags_1) {\n\t\t\t\t\t\tcase CONVTYPE_DEFAULT:\n\t\t\t\t\t\tcase CONVTYPE_BIG_ENDIAN: break;\n\t\t\t\t\t\tcase CONVTYPE_LITTLE_ENDIAN: big_endian = false; break;\n\t\t\t\t\t\tdefault: throw std::logic_error(\"invalid conversion: UINT to BINARY with dst flags \" + to_hex(dflags));\n\t\t\t\t\t}\n\t\t\t\t\tbytes_t<32> tmp;\n\t\t\t\t\ttmp.from_uint(value, big_endian);\n\t\t\t\t\tassign(dst, binary_t::alloc(tmp.data(), tmp.size()));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow std::logic_error(\"invalid conversion: UINT to \" + to_hex(dflags));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_STRING: {\n\t\t\tconst auto& sstr = (const binary_t&)svar;\n\t\t\tswitch(dflags_0) {\n\t\t\t\tcase CONVTYPE_UINT: {\n\t\t\t\t\tauto value = sstr.to_string();\n\t\t\t\t\tconst auto prefix_2 = value.substr(0, 2);\n\n\t\t\t\t\tint base = 10;\n\t\t\t\t\tswitch(sflags_0) {\n\t\t\t\t\t\tcase CONVTYPE_DEFAULT:\n\t\t\t\t\t\t\tif(prefix_2 == \"0x\") {\n\t\t\t\t\t\t\t\tbase = 16;\n\t\t\t\t\t\t\t} else if(prefix_2 == \"0b\") {\n\t\t\t\t\t\t\t\tbase = 2;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase CONVTYPE_BASE_2: base = 2; break;\n\t\t\t\t\t\tcase CONVTYPE_BASE_8: base = 8; break;\n\t\t\t\t\t\tcase CONVTYPE_BASE_10: base = 10; break;\n\t\t\t\t\t\tcase CONVTYPE_BASE_16: base = 16; break;\n\t\t\t\t\t\tdefault: throw std::logic_error(\"invalid conversion: STRING to UINT with src flags \" + to_hex(sflags));\n\t\t\t\t\t}\n\t\t\t\t\tif(prefix_2 == \"0x\" || prefix_2 == \"0b\") {\n\t\t\t\t\t\tvalue = value.substr(2);\n\t\t\t\t\t}\n\t\t\t\t\tfor(const auto c : value) {\n\t\t\t\t\t\tint digit = -1;\n\t\t\t\t\t\tif('0' <= c && c <= '9') {\n\t\t\t\t\t\t\tdigit = c - '0';\n\t\t\t\t\t\t} else if('a' <= c && c <= 'z') {\n\t\t\t\t\t\t\tdigit = c - 'a' + 10;\n\t\t\t\t\t\t} else if('A' <= c && c <= 'Z') {\n\t\t\t\t\t\t\tdigit = c - 'A' + 10;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(digit < 0 || digit >= base) {\n\t\t\t\t\t\t\tthrow std::logic_error(\"invalid string of base \" + std::to_string(base) + \": \" + value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tgas_used += value.size() * CONV_STRING_UINT_CHAR_COST;\n\t\t\t\t\tcheck_gas();\n\t\t\t\t\twrite(dst, uint_t(uint256_t(value.c_str(), base)));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase CONVTYPE_STRING:\n\t\t\t\t\twrite(dst, svar);\n\t\t\t\t\tbreak;\n\t\t\t\tcase CONVTYPE_BINARY: {\n\t\t\t\t\tint base = 0;\n\t\t\t\t\tswitch(sflags_0) {\n\t\t\t\t\t\tcase CONVTYPE_DEFAULT: break;\n\t\t\t\t\t\tcase CONVTYPE_BASE_16: base = 16; break;\n\t\t\t\t\t\tdefault: throw std::logic_error(\"invalid conversion: STRING to BINARY with src flags \" + to_hex(sflags));\n\t\t\t\t\t}\n\t\t\t\t\tswitch(base) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tassign(dst, binary_t::alloc(sstr, TYPE_BINARY));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 16: {\n\t\t\t\t\t\t\tconst auto value = sstr.to_string();\n\t\t\t\t\t\t\tif(value.size() % 2) {\n\t\t\t\t\t\t\t\tthrow std::runtime_error(\"invalid conversion: STRING to BINARY with source length \" + std::to_string(value.size()) + \" % 2 != 0\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst auto prefix = (value.substr(0, 2) == \"0x\" ? 2 : 0);\n\t\t\t\t\t\t\tfor(size_t i = prefix; i < value.size(); ++i) {\n\t\t\t\t\t\t\t\tconst auto c = value[i];\n\t\t\t\t\t\t\t\tif(!('0' <= c && c <= '9') && !('a' <= c && c <= 'f') && !('A' <= c && c <= 'F')) {\n\t\t\t\t\t\t\t\t\tthrow std::runtime_error(\"invalid hex string: \" + value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst auto tmp = vnx::from_hex_string(value);\n\t\t\t\t\t\t\tassign(dst, binary_t::alloc(tmp.data(), tmp.size(), TYPE_BINARY));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow std::logic_error(\"invalid conversion: STRING to BINARY with base \" + std::to_string(base));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase CONVTYPE_ADDRESS: {\n\t\t\t\t\tconst auto value = sstr.to_string();\n\t\t\t\t\tgas_used += CONV_STRING_BECH32_COST;\n\t\t\t\t\tcheck_gas();\n\t\t\t\t\tconst addr_t tmp(value);\n\t\t\t\t\tassign(dst, binary_t::alloc(tmp.data(), tmp.size()));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow std::logic_error(\"invalid conversion: STRING to \" + to_hex(dflags));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_BINARY: {\n\t\t\tconst auto& sbin = (const binary_t&)svar;\n\t\t\tswitch(dflags_0) {\n\t\t\t\tcase CONVTYPE_UINT: {\n\t\t\t\t\tif(sbin.size != 32) {\n\t\t\t\t\t\tthrow std::runtime_error(\"invalid conversion: BINARY to UINT: size != 32\");\n\t\t\t\t\t}\n\t\t\t\t\tbool big_endian = true;\n\t\t\t\t\tswitch(sflags_0) {\n\t\t\t\t\t\tcase CONVTYPE_DEFAULT:\n\t\t\t\t\t\tcase CONVTYPE_BIG_ENDIAN: break;\n\t\t\t\t\t\tcase CONVTYPE_LITTLE_ENDIAN: big_endian = false; break;\n\t\t\t\t\t\tdefault: throw std::logic_error(\"invalid conversion: BINARY to UINT with src flags \" + to_hex(sflags));\n\t\t\t\t\t}\n\t\t\t\t\tbytes_t<32> tmp;\n\t\t\t\t\t::memcpy(tmp.data(), sbin.data(), sbin.size);\n\t\t\t\t\twrite(dst, uint_t(tmp.to_uint<uint256_t>(big_endian)));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase CONVTYPE_STRING: {\n\t\t\t\t\tint base = 0;\n\t\t\t\t\tswitch(dflags_1) {\n\t\t\t\t\t\tcase CONVTYPE_DEFAULT: break;\n\t\t\t\t\t\tcase CONVTYPE_BASE_16: base = 16; break;\n\t\t\t\t\t\tcase CONVTYPE_ADDRESS: base = 32; break;\n\t\t\t\t\t\tdefault: throw std::logic_error(\"invalid conversion: BINARY to STRING with dst flags \" + to_hex(dflags));\n\t\t\t\t\t}\n\t\t\t\t\tswitch(base) {\n\t\t\t\t\t\tcase 32:\n\t\t\t\t\t\t\tgas_used += CONV_BECH32_STRING_COST;\n\t\t\t\t\t\t\tcheck_gas();\n\t\t\t\t\t\t\tassign(dst, binary_t::alloc(sbin.to_addr().to_string()));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 16:\n\t\t\t\t\t\t\tassign(dst, binary_t::alloc(sbin.to_hex_string()));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tassign(dst, binary_t::alloc(sbin.data(), sbin.size, TYPE_STRING));\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow std::logic_error(\"invalid conversion: BINARY to STRING with base \" + std::to_string(base));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase CONVTYPE_BINARY:\n\t\t\t\t\twrite(dst, svar);\n\t\t\t\t\tbreak;\n\t\t\t\tcase CONVTYPE_ADDRESS:\n\t\t\t\t\tif(sbin.size != 32) {\n\t\t\t\t\t\tthrow std::runtime_error(\"invalid conversion: BINARY to ADDRESS with source length \" + std::to_string(sbin.size) + \" != 32\");\n\t\t\t\t\t}\n\t\t\t\t\twrite(dst, svar);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow std::logic_error(\"invalid conversion: BINARY to \" + to_hex(dflags));\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tthrow std::logic_error(\"invalid conversion: \" + to_hex(uint32_t(svar.type)) + \" to \" + to_hex(dflags));\n\t}\n}\n\nvoid Engine::log(const uint64_t level, const uint64_t msg)\n{\n\tif(log_func) {\n\t\tlog_func(level, read_fail<binary_t>(msg, TYPE_STRING).to_string());\n\t}\n}\n\nvoid Engine::event(const uint64_t name, const uint64_t data)\n{\n\tif(event_func) {\n\t\tevent_func(read_fail<binary_t>(name, TYPE_STRING).to_string(), data);\n\t}\n}\n\nvnx::optional<std::string> Engine::parse_memo(const uint64_t addr)\n{\n\tconst auto& value = read_fail(addr);\n\tswitch(value.type) {\n\t\tcase TYPE_NIL:\n\t\t\treturn nullptr;\n\t\tcase TYPE_STRING: {\n\t\t\tconst auto memo = ((const binary_t&)value).to_string();\n\t\t\tif(memo.size() > txio_t::MAX_MEMO_SIZE) {\n\t\t\t\tthrow std::runtime_error(\"memo too large: \" + memo);\n\t\t\t}\n\t\t\tif(memo.size()) {\n\t\t\t\treturn memo;\n\t\t\t}\n\t\t\treturn nullptr;\n\t\t}\n\t\tdefault:\n\t\t\tthrow std::runtime_error(\"invalid memo type: \" + to_string(value.type));\n\t}\n\treturn nullptr;\n}\n\nvoid Engine::send(const uint64_t address, const uint64_t amount, const uint64_t currency, const uint64_t memo)\n{\n\tconst auto value = read_fail<uint_t>(amount, TYPE_UINT).value;\n\tif(value == 0) {\n\t\treturn;\n\t}\n\tif(value >> 128) {\n\t\tthrow std::runtime_error(\"send(): amount too large: 0x\" + value.str(16));\n\t}\n\tif(currency == 0) {\n\t\tthrow std::runtime_error(\"send(): currency == null\");\n\t}\n\tauto& balance = get_balance(currency);\n\tif(balance < value) {\n\t\tthrow std::runtime_error(\"send(): insufficient funds\");\n\t}\n\tbalance -= value;\n\n\ttxout_t out;\n\tout.contract = read_fail<binary_t>(currency, TYPE_BINARY).to_addr();\n\tout.address = read_fail<binary_t>(address, TYPE_BINARY).to_addr();\n\tout.amount = value;\n\tout.memo = parse_memo(memo);\n\toutputs.push_back(out);\n}\n\nvoid Engine::mint(const uint64_t address, const uint64_t amount, const uint64_t memo)\n{\n\tconst auto value = read_fail<uint_t>(amount, TYPE_UINT).value;\n\tif(value == 0) {\n\t\treturn;\n\t}\n\tif(value >> 80) {\n\t\tthrow std::runtime_error(\"mint(): amount too large: 0x\" + value.str(16));\n\t}\n\ttxout_t out;\n\tout.contract = contract;\n\tout.address = read_fail<binary_t>(address, TYPE_BINARY).to_addr();\n\tout.amount = value;\n\tout.memo = parse_memo(memo);\n\tmint_outputs.push_back(out);\n}\n\nvoid Engine::rcall(const uint64_t name, const uint64_t method, const uint64_t stack_ptr, const uint64_t nargs)\n{\n\tif(stack_ptr >= STACK_SIZE) {\n\t\tthrow std::logic_error(\"stack overflow\");\n\t}\n\tif(call_stack.size() >= MAX_CALL_RECURSION) {\n\t\tthrow std::logic_error(\"recursion overflow\");\n\t}\n\tif(nargs > 4096) {\n\t\tthrow std::logic_error(\"nargs > 4096\");\n\t}\n\tif(!remote_call) {\n\t\tthrow std::logic_error(\"unable to make remote calls\");\n\t}\n\tgas_used += INSTR_CALL_COST;\n\n\tauto frame = get_frame();\n\tframe.stack_ptr += stack_ptr;\n\tcall_stack.push_back(frame);\n\n\tremote_call(read_fail<binary_t>(name, TYPE_STRING).to_string(),\n\t\t\t\tread_fail<binary_t>(method, TYPE_STRING).to_string(), nargs);\n\tret();\n}\n\nvoid Engine::cread(const uint64_t dst, const uint64_t address, const uint64_t field)\n{\n\tif(!read_contract) {\n\t\tthrow std::logic_error(\"unable to read contract fields\");\n\t}\n\tread_contract(\n\t\t\tread_fail<binary_t>(address, TYPE_BINARY).to_addr(),\n\t\t\tread_fail<binary_t>(field, TYPE_STRING).to_string(), dst);\n}\n\nuint128_t& Engine::get_balance(const uint64_t currency_addr)\n{\n\tconst auto currency = read_fail<binary_t>(currency_addr, TYPE_BINARY).to_addr();\n\t{\n\t\tauto iter = balance_map.find(currency);\n\t\tif(iter != balance_map.end()) {\n\t\t\treturn iter->second;\n\t\t}\n\t}\n\tgas_used += WRITE_COST;\n\n\tconst auto value = storage->get_balance(contract, currency);\n\treturn balance_map[currency] = (value ? *value : uint128_0);\n}\n\nvoid Engine::read_balance(const uint64_t dst, const uint64_t currency)\n{\n\twrite(dst, uint_t(get_balance(currency)));\n}\n\nbool Engine::is_true(const uint64_t src)\n{\n\treturn is_true(read_fail(src));\n}\n\nbool Engine::is_true(const var_t& var)\n{\n\tswitch(var.type) {\n\t\tcase TYPE_NIL:\n\t\tcase TYPE_FALSE:\n\t\t\treturn false;\n\t\tcase TYPE_UINT:\n\t\t\treturn ((const uint_t&)var).value;\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY:\n\t\t\treturn ((const binary_t&)var).size;\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\nvoid Engine::jump(const uint64_t instr_ptr)\n{\n\tget_frame().instr_ptr = instr_ptr;\n}\n\nvoid Engine::call(const uint64_t instr_ptr, const uint64_t stack_ptr)\n{\n\tif(stack_ptr >= STACK_SIZE) {\n\t\tthrow std::logic_error(\"stack overflow\");\n\t}\n\tif(call_stack.size() >= MAX_CALL_RECURSION) {\n\t\tthrow std::logic_error(\"recursion overflow\");\n\t}\n\tgas_used += INSTR_CALL_COST;\n\n\tauto frame = get_frame();\n\tframe.instr_ptr = instr_ptr;\n\tframe.stack_ptr += stack_ptr;\n\tcall_stack.push_back(frame);\n}\n\nbool Engine::ret()\n{\n\tclear_stack(get_frame().stack_ptr + 1);\n\tcall_stack.pop_back();\n\treturn call_stack.empty();\n}\n\nEngine::frame_t& Engine::get_frame()\n{\n\tif(call_stack.empty()) {\n\t\tthrow std::logic_error(\"empty call stack\");\n\t}\n\treturn call_stack.back();\n}\n\nuint64_t Engine::get_stack_ptr()\n{\n\treturn MEM_STACK + get_frame().stack_ptr;\n}\n\nuint64_t Engine::deref(const uint64_t src)\n{\n\tconst auto& var = read_fail(src);\n\tif(var.type != TYPE_REF) {\n\t\treturn src;\n\t}\n\treturn ((const ref_t&)var).address;\n}\n\nuint64_t Engine::deref_addr(uint32_t src, const bool flag)\n{\n\tif(src >= MEM_STACK && src < MEM_STATIC) {\n\t\tconst auto& frame = get_frame();\n\t\tif(uint64_t(src) + frame.stack_ptr >= MEM_STATIC) {\n\t\t\tthrow std::runtime_error(\"stack overflow\");\n\t\t}\n\t\tsrc += frame.stack_ptr;\n\t}\n\treturn flag ? deref(src) : src;\n}\n\nuint64_t Engine::deref_value(uint32_t src, const bool flag)\n{\n\tif(flag) {\n\t\treturn read_fail<uint_t>(deref_addr(src, false), TYPE_UINT).value;\n\t}\n\treturn src;\n}\n\nvoid Engine::exec(const instr_t& instr)\n{\n\tgas_used += INSTR_COST;\n\n\tswitch(instr.code) {\n\tcase OP_NOP:\n\t\tbreak;\n\tcase OP_CLR:\n\t\tif(instr.flags & OPFLAG_REF_A) {\n\t\t\tthrow std::logic_error(\"OPFLAG_REF_A not supported\");\n\t\t}\n\t\terase(instr.a);\n\t\tbreak;\n\tcase OP_COPY:\n\t\tcopy(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B));\n\t\tbreak;\n\tcase OP_CLONE:\n\t\tclone(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B));\n\t\tbreak;\n\tcase OP_JUMP: {\n\t\tjump(\tderef_value(instr.a, instr.flags & OPFLAG_REF_A));\n\t\treturn;\n\t}\n\tcase OP_JUMPI:\n\t\tif(is_true(deref_addr(instr.b, instr.flags & OPFLAG_REF_B))) {\n\t\t\tjump(deref_value(instr.a, instr.flags & OPFLAG_REF_A));\n\t\t\treturn;\n\t\t}\n\t\tbreak;\n\tcase OP_JUMPN:\n\t\tif(!is_true(deref_addr(instr.b, instr.flags & OPFLAG_REF_B))) {\n\t\t\tjump(deref_value(instr.a, instr.flags & OPFLAG_REF_A));\n\t\t\treturn;\n\t\t}\n\t\tbreak;\n\tcase OP_CALL:\n\t\tif(instr.flags & OPFLAG_REF_B) {\n\t\t\tthrow std::logic_error(\"OPFLAG_REF_B not supported\");\n\t\t}\n\t\tcall(\tderef_value(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_value(instr.b, instr.flags & OPFLAG_REF_B));\n\t\treturn;\n\tcase OP_RET:\n\t\tif(ret()) {\n\t\t\treturn;\n\t\t}\n\t\tbreak;\n\tcase OP_ADD: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto lhs = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto rhs = deref_addr(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& L = read_fail<uint_t>(lhs, TYPE_UINT).value;\n\t\tconst auto& R = read_fail<uint_t>(rhs, TYPE_UINT).value;\n\t\tconst uint256_t D = L + R;\n\t\tif((instr.flags & OPFLAG_CATCH_OVERFLOW) && D < L) {\n\t\t\tthrow std::runtime_error(\"integer overflow\");\n\t\t}\n\t\twrite(dst, uint_t(D));\n\t\tbreak;\n\t}\n\tcase OP_SUB: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto lhs = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto rhs = deref_addr(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& L = read_fail<uint_t>(lhs, TYPE_UINT).value;\n\t\tconst auto& R = read_fail<uint_t>(rhs, TYPE_UINT).value;\n\t\tconst uint256_t D = L - R;\n\t\tif((instr.flags & OPFLAG_CATCH_OVERFLOW) && D > L) {\n\t\t\tthrow std::runtime_error(\"integer overflow\");\n\t\t}\n\t\twrite(dst, uint_t(D));\n\t\tbreak;\n\t}\n\tcase OP_MUL: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto lhs = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto rhs = deref_addr(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& L = read_fail<uint_t>(lhs, TYPE_UINT).value;\n\t\tconst auto& R = read_fail<uint_t>(rhs, TYPE_UINT).value;\n\t\tif((L >> 64) || (R >> 64)) {\n\t\t\tgas_used += INSTR_MUL_256_COST;\n\t\t} else {\n\t\t\tgas_used += INSTR_MUL_128_COST;\n\t\t}\n\t\tconst uint256_t D = L * R;\n\t\tif((instr.flags & OPFLAG_CATCH_OVERFLOW) && (D < L && D < R)) {\n\t\t\tthrow std::runtime_error(\"integer overflow\");\n\t\t}\n\t\twrite(dst, uint_t(D));\n\t\tbreak;\n\t}\n\tcase OP_DIV: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto lhs = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto rhs = deref_addr(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& L = read_fail<uint_t>(lhs, TYPE_UINT).value;\n\t\tconst auto& R = read_fail<uint_t>(rhs, TYPE_UINT).value;\n\t\tif(R == uint256_0) {\n\t\t\tthrow std::runtime_error(\"division by zero\");\n\t\t}\n\t\tif(L.upper()) {\n\t\t\tgas_used += INSTR_DIV_256_COST;\n\t\t} else if(L.lower().upper()) {\n\t\t\tgas_used += INSTR_DIV_128_COST;\n\t\t} else {\n\t\t\tgas_used += INSTR_DIV_64_COST;\n\t\t}\n\t\twrite(dst, uint_t(L / R));\n\t\tbreak;\n\t}\n\tcase OP_MOD: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto lhs = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto rhs = deref_addr(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& L = read_fail<uint_t>(lhs, TYPE_UINT).value;\n\t\tconst auto& R = read_fail<uint_t>(rhs, TYPE_UINT).value;\n\t\tif(R == uint256_0) {\n\t\t\tthrow std::runtime_error(\"division by zero\");\n\t\t}\n\t\tif(L.upper()) {\n\t\t\tgas_used += INSTR_DIV_256_COST;\n\t\t} else if(L.lower().upper()) {\n\t\t\tgas_used += INSTR_DIV_128_COST;\n\t\t} else {\n\t\t\tgas_used += INSTR_DIV_64_COST;\n\t\t}\n\t\twrite(dst, uint_t(L % R));\n\t\tbreak;\n\t}\n\tcase OP_NOT: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto src = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto& var = read_fail(src);\n\t\tif(instr.flags & OPFLAG_BITWISE) {\n\t\t\tswitch(var.type) {\n\t\t\t\tcase TYPE_UINT:\n\t\t\t\t\twrite(dst, uint_t(~((const uint_t&)var).value));\n\t\t\t\t\tbreak;\n\t\t\t\tcase TYPE_BINARY: {\n\t\t\t\t\tauto out = binary_t::alloc((const binary_t&)var);\n\t\t\t\t\tfor(uint32_t i = 0; i < out->size; ++i) {\n\t\t\t\t\t\t(*out)[i] = ~(*out)[i];\n\t\t\t\t\t}\n\t\t\t\t\tassign(dst, std::move(out));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow invalid_type(var);\n\t\t\t}\n\t\t} else {\n\t\t\twrite(dst, var_t(!is_true(var)));\n\t\t}\n\t\tbreak;\n\t}\n\tcase OP_XOR: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto lhs = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto rhs = deref_addr(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& L = read_fail(lhs);\n\t\tconst auto& R = read_fail(rhs);\n\t\tif(instr.flags & OPFLAG_BITWISE) {\n\t\t\tif(L.type != R.type) {\n\t\t\t\tthrow std::runtime_error(\"type mismatch (bitwise XOR)\");\n\t\t\t}\n\t\t\tswitch(L.type) {\n\t\t\t\tcase TYPE_UINT:\n\t\t\t\t\twrite(dst, uint_t(((const uint_t&)L).value ^ ((const uint_t&)R).value));\n\t\t\t\t\tbreak;\n\t\t\t\tcase TYPE_BINARY: {\n\t\t\t\t\tconst auto& lbin = (const binary_t&)L;\n\t\t\t\t\tconst auto& rbin = (const binary_t&)R;\n\t\t\t\t\tif(lbin.size != rbin.size) {\n\t\t\t\t\t\tthrow std::runtime_error(\"binary length mismatch (bitwise XOR)\");\n\t\t\t\t\t}\n\t\t\t\t\tauto out = binary_t::alloc(lbin.size, TYPE_BINARY);\n\t\t\t\t\tfor(uint32_t i = 0; i < out->size; ++i) {\n\t\t\t\t\t\t(*out)[i] = lbin[i] ^ rbin[i];\n\t\t\t\t\t}\n\t\t\t\t\tassign(dst, std::move(out));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow invalid_type(L);\n\t\t\t}\n\t\t} else {\n\t\t\twrite(dst, var_t(is_true(L) ^ is_true(R)));\n\t\t}\n\t\tbreak;\n\t}\n\tcase OP_AND: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto lhs = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto rhs = deref_addr(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& L = read_fail(lhs);\n\t\tconst auto& R = read_fail(rhs);\n\t\tif(instr.flags & OPFLAG_BITWISE) {\n\t\t\tif(L.type != R.type) {\n\t\t\t\tthrow std::runtime_error(\"type mismatch (bitwise AND)\");\n\t\t\t}\n\t\t\tswitch(L.type) {\n\t\t\t\tcase TYPE_UINT:\n\t\t\t\t\twrite(dst, uint_t(((const uint_t&)L).value & ((const uint_t&)R).value));\n\t\t\t\t\tbreak;\n\t\t\t\tcase TYPE_BINARY: {\n\t\t\t\t\tconst auto& lbin = (const binary_t&)L;\n\t\t\t\t\tconst auto& rbin = (const binary_t&)R;\n\t\t\t\t\tif(lbin.size != rbin.size) {\n\t\t\t\t\t\tthrow std::runtime_error(\"binary length mismatch (bitwise AND)\");\n\t\t\t\t\t}\n\t\t\t\t\tauto out = binary_t::alloc(lbin.size, TYPE_BINARY);\n\t\t\t\t\tfor(uint32_t i = 0; i < out->size; ++i) {\n\t\t\t\t\t\t(*out)[i] = lbin[i] & rbin[i];\n\t\t\t\t\t}\n\t\t\t\t\tassign(dst, std::move(out));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow invalid_type(L);\n\t\t\t}\n\t\t} else {\n\t\t\twrite(dst, var_t(is_true(L) && is_true(R)));\n\t\t}\n\t\tbreak;\n\t}\n\tcase OP_OR: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto lhs = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto rhs = deref_addr(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& L = read_fail(lhs);\n\t\tconst auto& R = read_fail(rhs);\n\t\tif(instr.flags & OPFLAG_BITWISE) {\n\t\t\tif(L.type != R.type) {\n\t\t\t\tthrow std::runtime_error(\"type mismatch (bitwise OR)\");\n\t\t\t}\n\t\t\tswitch(L.type) {\n\t\t\t\tcase TYPE_UINT:\n\t\t\t\t\twrite(dst, uint_t(((const uint_t&)L).value | ((const uint_t&)R).value));\n\t\t\t\t\tbreak;\n\t\t\t\tcase TYPE_BINARY: {\n\t\t\t\t\tconst auto& lbin = (const binary_t&)L;\n\t\t\t\t\tconst auto& rbin = (const binary_t&)R;\n\t\t\t\t\tif(lbin.size != rbin.size) {\n\t\t\t\t\t\tthrow std::runtime_error(\"binary length mismatch (bitwise OR)\");\n\t\t\t\t\t}\n\t\t\t\t\tauto out = binary_t::alloc(lbin.size, TYPE_BINARY);\n\t\t\t\t\tfor(uint32_t i = 0; i < out->size; ++i) {\n\t\t\t\t\t\t(*out)[i] = lbin[i] | rbin[i];\n\t\t\t\t\t}\n\t\t\t\t\tassign(dst, std::move(out));\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tthrow invalid_type(L);\n\t\t\t}\n\t\t} else {\n\t\t\twrite(dst, var_t(is_true(L) || is_true(R)));\n\t\t}\n\t\tbreak;\n\t}\n\tcase OP_MIN: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto lhs = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto rhs = deref_addr(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& L = read_fail<uint_t>(lhs, TYPE_UINT).value;\n\t\tconst auto& R = read_fail<uint_t>(rhs, TYPE_UINT).value;\n\t\twrite(dst, uint_t(L < R ? L : R));\n\t\tbreak;\n\t}\n\tcase OP_MAX: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto lhs = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto rhs = deref_addr(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& L = read_fail<uint_t>(lhs, TYPE_UINT).value;\n\t\tconst auto& R = read_fail<uint_t>(rhs, TYPE_UINT).value;\n\t\twrite(dst, uint_t(L > R ? L : R));\n\t\tbreak;\n\t}\n\tcase OP_SHL: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto src = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto count = deref_value(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& value = read_fail<uint_t>(src, TYPE_UINT).value;\n\t\twrite(dst, uint_t(value << count));\n\t\tbreak;\n\t}\n\tcase OP_SHR: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto src = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto count = deref_value(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& value = read_fail<uint_t>(src, TYPE_UINT).value;\n\t\twrite(dst, uint_t(value >> count));\n\t\tbreak;\n\t}\n\tcase OP_CMP_EQ:\n\tcase OP_CMP_NEQ:\n\tcase OP_CMP_LT:\n\tcase OP_CMP_GT:\n\tcase OP_CMP_LTE:\n\tcase OP_CMP_GTE: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto lhs = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto rhs = deref_addr(instr.c, instr.flags & OPFLAG_REF_C);\n\t\tconst auto& L = read_fail(lhs);\n\t\tconst auto& R = read_fail(rhs);\n\t\tswitch(instr.code) {\n\t\t\tcase OP_CMP_EQ:\n\t\t\tcase OP_CMP_NEQ: break;\n\t\t\tdefault:\n\t\t\t\tif(L.type != R.type) {\n\t\t\t\t\tthrow std::logic_error(\"compare type mismatch: \" + std::to_string(int(L.type)) + \" != \" + std::to_string(int(R.type)));\n\t\t\t\t}\n\t\t}\n\t\tconst auto cmp = compare(L, R);\n\t\tbool res = false;\n\t\tswitch(instr.code) {\n\t\t\tcase OP_CMP_EQ: res = (cmp == 0); break;\n\t\t\tcase OP_CMP_NEQ: res = (cmp != 0); break;\n\t\t\tcase OP_CMP_LT: res = (cmp < 0); break;\n\t\t\tcase OP_CMP_GT: res = (cmp > 0); break;\n\t\t\tcase OP_CMP_LTE: res = (cmp <= 0); break;\n\t\t\tcase OP_CMP_GTE: res = (cmp >= 0); break;\n\t\t\tdefault: break;\n\t\t}\n\t\twrite(dst, var_t(res));\n\t\tbreak;\n\t}\n\tcase OP_TYPE: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto addr = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto& var = read_fail(addr);\n\t\twrite(dst, uint_t(uint32_t(var.type)));\n\t\tbreak;\n\t}\n\tcase OP_SIZE: {\n\t\tconst auto dst = deref_addr(instr.a, instr.flags & OPFLAG_REF_A);\n\t\tconst auto addr = deref_addr(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tconst auto& var = read_fail(addr);\n\t\tswitch(var.type) {\n\t\t\tcase TYPE_STRING:\n\t\t\tcase TYPE_BINARY:\n\t\t\t\twrite(dst, uint_t(((const binary_t&)var).size));\n\t\t\t\tbreak;\n\t\t\tcase TYPE_ARRAY:\n\t\t\t\twrite(dst, uint_t(((const array_t&)var).size));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow invalid_type(var);\n\t\t}\n\t\tbreak;\n\t}\n\tcase OP_GET:\n\t\tget(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B),\n\t\t\t\tderef_addr(instr.c, instr.flags & OPFLAG_REF_C), instr.flags);\n\t\tbreak;\n\tcase OP_SET:\n\t\tset(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B),\n\t\t\t\tderef_addr(instr.c, instr.flags & OPFLAG_REF_C), instr.flags);\n\t\tbreak;\n\tcase OP_ERASE:\n\t\terase(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B), instr.flags);\n\t\tbreak;\n\tcase OP_PUSH_BACK:\n\t\tpush_back(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B));\n\t\tbreak;\n\tcase OP_POP_BACK:\n\t\tpop_back(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B));\n\t\tbreak;\n\tcase OP_CONV:\n\t\tconv(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B),\n\t\t\t\tderef_value(instr.c, instr.flags & OPFLAG_REF_C),\n\t\t\t\tderef_value(instr.d, instr.flags & OPFLAG_REF_D));\n\t\tbreak;\n\tcase OP_CONCAT:\n\t\tconcat(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B),\n\t\t\t\tderef_addr(instr.c, instr.flags & OPFLAG_REF_C));\n\t\tbreak;\n\tcase OP_MEMCPY:\n\t\tmemcpy(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B),\n\t\t\t\tderef_value(instr.c, instr.flags & OPFLAG_REF_C),\n\t\t\t\tderef_value(instr.d, instr.flags & OPFLAG_REF_D));\n\t\tbreak;\n\tcase OP_SHA256:\n\t\tsha256(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B));\n\t\tbreak;\n\tcase OP_VERIFY:\n\t\tverify(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B),\n\t\t\t\tderef_addr(instr.c, instr.flags & OPFLAG_REF_C),\n\t\t\t\tderef_addr(instr.d, instr.flags & OPFLAG_REF_D));\n\t\tbreak;\n\tcase OP_LOG:\n\t\tlog(\tderef_value(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B));\n\t\tbreak;\n\tcase OP_SEND:\n\t\tsend(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B),\n\t\t\t\tderef_addr(instr.c, instr.flags & OPFLAG_REF_C),\n\t\t\t\tderef_addr(instr.d, instr.flags & OPFLAG_REF_D));\n\t\tbreak;\n\tcase OP_MINT:\n\t\tmint(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B),\n\t\t\t\tderef_addr(instr.c, instr.flags & OPFLAG_REF_C));\n\t\tbreak;\n\tcase OP_EVENT:\n\t\tevent(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B));\n\t\tbreak;\n\tcase OP_FAIL:\n\t\terror_code = deref_value(instr.b, instr.flags & OPFLAG_REF_B);\n\t\tthrow std::runtime_error(\n\t\t\t\tto_string_value(read(deref_addr(instr.a, instr.flags & OPFLAG_REF_A))));\n\tcase OP_RCALL:\n\t\trcall(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B),\n\t\t\t\tderef_value(instr.c, instr.flags & OPFLAG_REF_C),\n\t\t\t\tderef_value(instr.d, instr.flags & OPFLAG_REF_D));\n\t\tbreak;\n\tcase OP_CREAD:\n\t\tcread(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B),\n\t\t\t\tderef_addr(instr.c, instr.flags & OPFLAG_REF_C));\n\t\tbreak;\n\tcase OP_BALANCE:\n\t\tread_balance(\tderef_addr(instr.a, instr.flags & OPFLAG_REF_A),\n\t\t\t\t\t\tderef_addr(instr.b, instr.flags & OPFLAG_REF_B));\n\t\tbreak;\n\tdefault:\n\t\tthrow std::logic_error(\"invalid op_code: \" + to_hex(uint32_t(instr.code)));\n\t}\n\tget_frame().instr_ptr++;\n}\n\nvoid Engine::clear_stack(const uint64_t offset)\n{\n\tfor(auto iter = memory.lower_bound(MEM_STACK + offset); iter != memory.lower_bound(MEM_STATIC);) {\n\t\tclear(iter->second.get());\n\t\titer = memory.erase(iter);\n\t\tcheck_gas();\n\t}\n}\n\nvoid Engine::commit()\n{\n\tclear_stack();\t// clear references from stack\n\n\tfor(auto iter = memory.lower_bound(MEM_STATIC); iter != memory.end(); ++iter)\n\t{\n\t\tif(auto var = iter->second.get()) {\n\t\t\tif(var->flags & FLAG_DIRTY) {\n\t\t\t\tstorage->write(contract, iter->first, *var);\n\t\t\t\tvar->flags &= ~FLAG_DIRTY;\n\t\t\t}\n\t\t}\n\t}\n\tfor(auto iter = entries.lower_bound(std::make_pair(MEM_STATIC, 0)); iter != entries.end(); ++iter)\n\t{\n\t\tif(auto var = iter->second.get()) {\n\t\t\tif(var->flags & FLAG_DIRTY) {\n\t\t\t\tstorage->write(contract, iter->first.first, iter->first.second, *var);\n\t\t\t\tvar->flags &= ~FLAG_DIRTY;\n\t\t\t}\n\t\t}\n\t}\n\tcheck_gas();\n}\n\nstd::map<uint64_t, const var_t*> Engine::find_entries(const uint64_t dst) const\n{\n\tstd::map<uint64_t, const var_t*> out;\n\tconst auto begin = entries.lower_bound(std::make_pair(dst, 0));\n\tfor(auto iter = begin; iter != entries.end() && iter->first.first == dst; ++iter) {\n\t\tif(auto var = iter->second.get()) {\n\t\t\tif((var->flags & FLAG_DELETED) == 0) {\n\t\t\t\tout[iter->first.second] = var;\n\t\t\t}\n\t\t}\n\t}\n\treturn out;\n}\n\nvoid Engine::dump_memory(const uint64_t begin, const uint64_t end)\n{\n\tstd::cout << \"-------------------------------------------\" << std::endl;\n\tfor(auto iter = memory.lower_bound(begin); iter != memory.lower_bound(end); ++iter) {\n\t\tstd::cout << \"[\" << to_hex(iter->first) << \"] \" << to_string(iter->second.get());\n\t\tif(auto var = iter->second.get()) {\n\t\t\tstd::cout << \"\\t\\t(vf: \" << to_bin(var->flags) << \") (rc: \" << var->ref_count << \")\";\n\t\t}\n\t\tstd::cout << std::endl;\n\t}\n\tfor(auto iter = entries.lower_bound(std::make_pair(begin, 0)); iter != entries.lower_bound(std::make_pair(end, 0)); ++iter) {\n\t\tstd::cout << \"[\" << to_hex(iter->first.first) << \"]\"\n\t\t\t\t<< \"[\" << to_hex(iter->first.second) << \"] \" << to_string(iter->second.get());\n\t\tif(auto var = iter->second.get()) {\n\t\t\tstd::cout << \"\\t\\t(vf: \" << to_bin(var->flags) << \")\";\n\t\t}\n\t\tstd::cout << std::endl;\n\t}\n}\n\n\n} // vm\n} // mmx\n"
  },
  {
    "path": "src/vm/StorageCache.cpp",
    "content": "/*\n * StorageCache.cpp\n *\n *  Created on: May 6, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/StorageCache.h>\n\n\nnamespace mmx {\nnamespace vm {\n\nStorageCache::StorageCache(std::shared_ptr<Storage> backend)\n\t:\tbackend(backend)\n{\n}\n\nStorageCache::~StorageCache()\n{\n}\n\nstd::unique_ptr<var_t> StorageCache::read(const addr_t& contract, const uint64_t src) const\n{\n\tif(auto var = Super::read(contract, src)) {\n\t\treturn var;\n\t}\n\treturn backend->read(contract, src);\n}\n\nstd::unique_ptr<var_t> StorageCache::read(const addr_t& contract, const uint64_t src, const uint64_t key) const\n{\n\tif(auto var = Super::read(contract, src, key)) {\n\t\treturn var;\n\t}\n\treturn backend->read(contract, src, key);\n}\n\nuint64_t StorageCache::lookup(const addr_t& contract, const var_t& value) const\n{\n\tif(auto key = Super::lookup(contract, value)) {\n\t\treturn key;\n\t}\n\treturn backend->lookup(contract, value);\n}\n\nvoid StorageCache::commit() const\n{\n\tfor(const auto& entry : memory) {\n\t\tif(auto var = entry.second.get()) {\n\t\t\tbackend->write(entry.first.first, entry.first.second, *var);\n\t\t}\n\t}\n\tfor(const auto& entry : entries) {\n\t\tif(auto var = entry.second.get()) {\n\t\t\tbackend->write(std::get<0>(entry.first), std::get<1>(entry.first), std::get<2>(entry.first), *var);\n\t\t}\n\t}\n\tfor(const auto& entry : balance_map) {\n\t\tfor(const auto& entry2 : entry.second) {\n\t\t\tbackend->set_balance(entry.first, entry2.first, entry2.second);\n\t\t}\n\t}\n}\n\nstd::unique_ptr<uint128> StorageCache::get_balance(const addr_t& contract, const addr_t& currency)\n{\n\tif(auto value = Super::get_balance(contract, currency)) {\n\t\treturn value;\n\t}\n\tauto amount = backend->get_balance(contract, currency);\n\tif(amount) {\n\t\tSuper::set_balance(contract, currency, *amount);\n\t}\n\treturn amount;\n}\n\n\n} // vm\n} // mmx\n"
  },
  {
    "path": "src/vm/StorageDB.cpp",
    "content": "/*\n * StorageRocksDB.cpp\n *\n *  Created on: May 5, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/StorageDB.h>\n\n#include <vnx/Output.hpp>\n#include <vnx/Util.hpp>\n\n\nnamespace mmx {\nnamespace vm {\n\nconstexpr int HASH_KEY_SIZE = 20;\n\nstd::shared_ptr<db_val_t> get_key(const addr_t& contract, uint64_t dst)\n{\n\tauto out = std::make_shared<db_val_t>(HASH_KEY_SIZE + 8);\n\t::memcpy(out->data, contract.data(), HASH_KEY_SIZE);\n\tdst = vnx::to_big_endian(dst);\n\t::memcpy(out->data + HASH_KEY_SIZE, &dst, 8);\n\treturn out;\n}\n\nstd::tuple<addr_t, uint64_t> read_key(std::shared_ptr<const db_val_t> key)\n{\n\tif(key->size < HASH_KEY_SIZE + 8) {\n\t\tthrow std::runtime_error(\"key size underflow\");\n\t}\n\tstd::tuple<addr_t, uint64_t> out;\n\t::memcpy(std::get<0>(out).data(), key->data, HASH_KEY_SIZE);\n\t::memcpy(&std::get<1>(out), key->data + HASH_KEY_SIZE, 8);\n\tstd::get<1>(out) = vnx::from_big_endian(std::get<1>(out));\n\treturn out;\n}\n\nstd::shared_ptr<db_val_t> write_entry_key(const addr_t& contract, uint64_t dst, uint64_t key)\n{\n\tauto out = std::make_shared<db_val_t>(HASH_KEY_SIZE + 16);\n\t::memcpy(out->data, contract.data(), HASH_KEY_SIZE);\n\tdst = vnx::to_big_endian(dst);\n\t::memcpy(out->data + HASH_KEY_SIZE, &dst, 8);\n\tkey = vnx::to_big_endian(key);\n\t::memcpy(out->data + HASH_KEY_SIZE + 8, &key, 8);\n\treturn out;\n}\n\nstd::tuple<addr_t, uint64_t, uint64_t> read_entry_key(std::shared_ptr<const db_val_t> key)\n{\n\tif(key->size < HASH_KEY_SIZE + 16) {\n\t\tthrow std::runtime_error(\"entry key size underflow\");\n\t}\n\tstd::tuple<addr_t, uint64_t, uint64_t> out;\n\t::memcpy(std::get<0>(out).data(), key->data, HASH_KEY_SIZE);\n\t::memcpy(&std::get<1>(out), key->data + HASH_KEY_SIZE, 8);\n\t::memcpy(&std::get<2>(out), key->data + HASH_KEY_SIZE + 8, 8);\n\tstd::get<1>(out) = vnx::from_big_endian(std::get<1>(out));\n\tstd::get<2>(out) = vnx::from_big_endian(std::get<2>(out));\n\treturn out;\n}\n\nstd::shared_ptr<db_val_t> write_index_key(const addr_t& contract, const var_t& value)\n{\n\tauto data = serialize(value, false, false);\n\tauto out = std::make_shared<db_val_t>(contract.size() + data.second);\n\t::memcpy(out->data, contract.data(), contract.size());\n\t::memcpy(out->data + contract.size(), data.first.get(), data.second);\n\treturn out;\n}\n\nStorageDB::StorageDB(const std::string& database_path, std::shared_ptr<DataBase> db)\n{\n\ttable = std::make_shared<Table>(database_path + \"storage\");\n\ttable_entries = std::make_shared<Table>(database_path + \"storage_entries\");\n\ttable_index = std::make_shared<Table>(database_path + \"storage_index\");\n\tdb->add(table);\n\tdb->add(table_entries);\n\tdb->add(table_index);\n}\n\nStorageDB::~StorageDB()\n{\n}\n\nstd::unique_ptr<var_t> StorageDB::read(const addr_t& contract, const uint64_t src) const\n{\n\treturn read_ex(contract, src, -1);\n}\n\nstd::unique_ptr<var_t> StorageDB::read(const addr_t& contract, const uint64_t src, const uint64_t key) const\n{\n\treturn read_ex(contract, src, key, -1);\n}\n\nstd::unique_ptr<var_t> StorageDB::read_ex(const addr_t& contract, const uint64_t src, const uint32_t height) const\n{\n\tconst auto key = get_key(contract, src);\n\tif(auto value = table->find(key, height)) {\n\t\tstd::unique_ptr<var_t> var;\n\t\tdeserialize(var, value->data, value->size, false);\n\t\treturn var;\n\t}\n\treturn nullptr;\n}\n\nstd::unique_ptr<var_t> StorageDB::read_ex(const addr_t& contract, const uint64_t src, const uint64_t key, const uint32_t height) const\n{\n\tconst auto entry_key = write_entry_key(contract, src, key);\n\tif(auto value = table_entries->find(entry_key, height)) {\n\t\tstd::unique_ptr<var_t> var;\n\t\tdeserialize(var, value->data, value->size, false);\n\t\treturn var;\n\t}\n\treturn nullptr;\n}\n\nvoid StorageDB::write(const addr_t& contract, const uint64_t dst, const var_t& value)\n{\n\tconst auto key = get_key(contract, dst);\n\tauto data = serialize(value, false);\n\n\tif(value.flags & FLAG_KEY) {\n\t\tconst auto key = write_index_key(contract, value);\n\t\ttable_index->insert(key, std::make_shared<db_val_t>(&dst, sizeof(dst)));\n\t}\n\ttable->insert(key, std::make_shared<db_val_t>(data.first.release(), data.second, false));\n}\n\nvoid StorageDB::write(const addr_t& contract, const uint64_t dst, const uint64_t key, const var_t& value)\n{\n\tconst auto entry_key = write_entry_key(contract, dst, key);\n\tauto data = serialize(value, false);\n\ttable_entries->insert(entry_key, std::make_shared<db_val_t>(data.first.release(), data.second, false));\n}\n\nuint64_t StorageDB::lookup(const addr_t& contract, const var_t& value) const\n{\n\tconst auto key = write_index_key(contract, value);\n\n\tuint64_t out = 0;\n\tif(auto value = table_index->find(key)) {\n\t\tif(value->size < sizeof(out)) {\n\t\t\tthrow std::runtime_error(\"value underflow\");\n\t\t}\n\t\t::memcpy(&out, value->data, sizeof(out));\n\t}\n\treturn out;\n}\n\nstd::vector<std::pair<uint64_t, varptr_t>> StorageDB::find_range(\n\t\tconst addr_t& contract, const uint64_t begin, const uint64_t end, const uint32_t height) const\n{\n\tstd::vector<std::pair<uint64_t, varptr_t>> out;\n\tstd::vector<std::pair<std::shared_ptr<db_val_t>, uint64_t>> keys;\n\n\tTable::Iterator iter(table);\n\titer.seek(get_key(contract, begin));\n\twhile(iter.is_valid()) {\n\t\tconst auto key = read_key(iter.key());\n\t\tconst auto address = std::get<1>(key);\n\t\tif(::memcmp(std::get<0>(key).data(), contract.data(), HASH_KEY_SIZE) || address >= end) {\n\t\t\tbreak;\n\t\t}\n\t\tkeys.emplace_back(iter.key(), address);\n\t\titer.next();\n\t}\n\tfor(const auto& entry : keys) {\n\t\tif(auto value = table->find(entry.first, height)) {\n\t\t\tstd::unique_ptr<var_t> var;\n\t\t\tdeserialize(var, value->data, value->size, false);\n\t\t\tout.emplace_back(entry.second, std::move(var));\n\t\t}\n\t}\n\treturn out;\n}\n\nstd::vector<std::pair<uint64_t, varptr_t>> StorageDB::find_entries(\n\t\tconst addr_t& contract, const uint64_t address, const uint32_t height) const\n{\n\tstd::vector<std::pair<uint64_t, varptr_t>> out;\n\tstd::vector<std::pair<std::shared_ptr<db_val_t>, uint64_t>> keys;\n\n\tTable::Iterator iter(table_entries);\n\titer.seek(write_entry_key(contract, address, 0));\n\twhile(iter.is_valid()) {\n\t\tconst auto key = read_entry_key(iter.key());\n\t\tif(::memcmp(std::get<0>(key).data(), contract.data(), HASH_KEY_SIZE) || std::get<1>(key) != address) {\n\t\t\tbreak;\n\t\t}\n\t\tkeys.emplace_back(iter.key(), std::get<2>(key));\n\t\titer.next();\n\t}\n\tfor(const auto& entry : keys) {\n\t\tif(auto value = table_entries->find(entry.first, height)) {\n\t\t\tstd::unique_ptr<var_t> var;\n\t\t\tdeserialize(var, value->data, value->size, false);\n\t\t\tout.emplace_back(entry.second, std::move(var));\n\t\t}\n\t}\n\treturn out;\n}\n\nstd::vector<varptr_t> StorageDB::read_array(\n\t\tconst addr_t& contract, const uint64_t address, const uint32_t height) const\n{\n\tstd::vector<varptr_t> out;\n\tfor(const auto& entry : find_entries(contract, address, height)) {\n\t\tout.push_back(entry.second);\n\t}\n\treturn out;\n}\n\nvoid StorageDB::set_balance(const addr_t& contract, const addr_t& currency, const uint128& amount)\n{\n\tif(write_balance) {\n\t\twrite_balance(contract, currency, amount);\n\t}\n}\n\nstd::unique_ptr<uint128> StorageDB::get_balance(const addr_t& contract, const addr_t& currency)\n{\n\tif(read_balance) {\n\t\treturn read_balance(contract, currency);\n\t}\n\treturn nullptr;\n}\n\n\n} // vm\n} // mmx\n"
  },
  {
    "path": "src/vm/StorageProxy.cpp",
    "content": "/*\n * StorageProxy.cpp\n *\n *  Created on: Apr 24, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/StorageProxy.h>\n#include <mmx/vm/Engine.h>\n\n\nnamespace mmx {\nnamespace vm {\n\nStorageProxy::StorageProxy(Engine* engine, std::shared_ptr<Storage> backend, bool read_only)\n\t:\tengine(engine),\n\t\tbackend(backend),\n\t\tread_only(read_only)\n{\n}\n\nstd::unique_ptr<var_t> StorageProxy::read_ex(std::unique_ptr<var_t> var) const\n{\n\tif(var) {\n\t\tif(var->flags & FLAG_DELETED) {\n\t\t\tvar.reset();\n\t\t}\n\t}\n\tif(var) {\n\t\tvar->flags &= ~FLAG_DIRTY;\n\t\tvar->flags |= FLAG_STORED;\n\t\tif(read_only) {\n\t\t\tvar->flags |= FLAG_CONST;\n\t\t}\n\t}\n\treturn std::move(var);\n}\n\nstd::unique_ptr<var_t> StorageProxy::read(const addr_t& contract, const uint64_t src) const\n{\n\tauto var = read_ex(backend->read(contract, src));\n\n\tconst auto size = num_bytes(var.get());\n\tconst auto blocks = size / 32;\n\n\tif(engine->do_profile) {\n\t\tengine->cost_map[\"STOR_READ_COST\"]++;\n\t\tengine->cost_map[\"STOR_READ_32_BYTE_COST\"] += blocks;\n\t}\n\tengine->gas_used += STOR_READ_COST + blocks * STOR_READ_32_BYTE_COST;\n\tengine->check_gas();\n\n\tif(engine->do_trace) {\n\t\ttrace_t t;\n\t\tt.type = \"READ\";\n\t\tt.contract = contract;\n\t\tt.addr = src;\n\t\tt.value = clone(var.get());\n\t\ttrace.push_back(t);\n\t}\n\treturn var;\n}\n\nstd::unique_ptr<var_t> StorageProxy::read(const addr_t& contract, const uint64_t src, const uint64_t key) const\n{\n\tauto var = read_ex(backend->read(contract, src, key));\n\n\tconst auto size = num_bytes(var.get());\n\tconst auto blocks = size / 32;\n\n\tif(engine->do_profile) {\n\t\tengine->cost_map[\"STOR_READ_COST\"]++;\n\t\tengine->cost_map[\"STOR_READ_32_BYTE_COST\"] += blocks;\n\t}\n\tengine->gas_used += STOR_READ_COST + blocks * STOR_READ_32_BYTE_COST;\n\tengine->check_gas();\n\n\tif(engine->do_trace) {\n\t\ttrace_t t;\n\t\tt.type = \"READ_KEY\";\n\t\tt.contract = contract;\n\t\tt.addr = src;\n\t\tt.key = key;\n\t\tt.value = clone(var.get());\n\t\ttrace.push_back(t);\n\t}\n\treturn var;\n}\n\nvoid StorageProxy::write(const addr_t& contract, const uint64_t dst, const var_t& value)\n{\n\tif(read_only) {\n\t\tthrow std::logic_error(\"read-only storage\");\n\t}\n\tif(engine->do_trace) {\n\t\ttrace_t t;\n\t\tt.type = \"WRITE\";\n\t\tt.contract = contract;\n\t\tt.addr = dst;\n\t\tt.value = clone(value);\n\t\ttrace.push_back(t);\n\t}\n\tif(value.type == TYPE_REF) {\n\t\tconst auto address = ((const ref_t&)value).address;\n\t\tif(address < MEM_STATIC) {\n\t\t\tthrow std::logic_error(\"cannot store reference to non-static memory\");\n\t\t}\n\t}\n\tif((value.flags & FLAG_KEY) && !(value.flags & FLAG_CONST)) {\n\t\tthrow std::logic_error(\"keys need to be const\");\n\t}\n\tconst int cost_factor = (value.flags & FLAG_KEY ? 2 : 1);\n\n\tif(engine->do_profile) {\n\t\tengine->cost_map[\"STOR_WRITE_COST\"] += cost_factor;\n\t\tengine->cost_map[\"STOR_WRITE_BYTE_COST\"] += num_bytes(value) * cost_factor;\n\t}\n\tengine->gas_used += (STOR_WRITE_COST + num_bytes(value) * STOR_WRITE_BYTE_COST) * cost_factor;\n\tengine->check_gas();\n\n\tbackend->write(contract, dst, value);\n}\n\nvoid StorageProxy::write(const addr_t& contract, const uint64_t dst, const uint64_t key, const var_t& value)\n{\n\tif(read_only) {\n\t\tthrow std::logic_error(\"read-only storage\");\n\t}\n\tif(engine->do_trace) {\n\t\ttrace_t t;\n\t\tt.type = \"WRITE_KEY\";\n\t\tt.contract = contract;\n\t\tt.addr = dst;\n\t\tt.key = key;\n\t\tt.value = clone(value);\n\t\ttrace.push_back(t);\n\t}\n\tif(value.type == TYPE_REF) {\n\t\tconst auto address = ((const ref_t&)value).address;\n\t\tif(address < MEM_STATIC) {\n\t\t\tthrow std::logic_error(\"cannot store reference to non-static memory\");\n\t\t}\n\t}\n\tif(value.ref_count) {\n\t\tthrow std::logic_error(\"entries cannot have ref_count > 0\");\n\t}\n\tif(engine->do_profile) {\n\t\tengine->cost_map[\"STOR_WRITE_COST\"]++;\n\t\tengine->cost_map[\"STOR_WRITE_BYTE_COST\"] += num_bytes(value);\n\t}\n\tengine->gas_used += STOR_WRITE_COST + num_bytes(value) * STOR_WRITE_BYTE_COST;\n\tengine->check_gas();\n\n\tbackend->write(contract, dst, key, value);\n}\n\nuint64_t StorageProxy::lookup(const addr_t& contract, const var_t& value) const\n{\n\tif(engine->do_trace) {\n\t\ttrace_t t;\n\t\tt.type = \"LOOKUP\";\n\t\tt.contract = contract;\n\t\tt.value = clone(value);\n\t\ttrace.push_back(t);\n\t}\n\tconst auto size = num_bytes(value);\n\tconst auto blocks = size / 32;\n\n\tif(engine->do_profile) {\n\t\tengine->cost_map[\"STOR_READ_COST\"]++;\n\t\tengine->cost_map[\"STOR_READ_32_BYTE_COST\"] += blocks;\n\t}\n\tengine->gas_used += STOR_READ_COST + blocks * STOR_READ_32_BYTE_COST;\n\tengine->check_gas();\n\n\treturn backend->lookup(contract, value);\n}\n\nstd::unique_ptr<uint128> StorageProxy::get_balance(const addr_t& contract, const addr_t& currency)\n{\n\tif(engine->do_trace) {\n\t\ttrace_t t;\n\t\tt.type = \"GET_BALANCE\";\n\t\tt.contract = contract;\n\t\tt.value = to_binary(currency);\n\t\ttrace.push_back(t);\n\t}\n\tif(engine->do_profile) {\n\t\tengine->cost_map[\"STOR_READ_COST\"]++;\n\t}\n\tengine->gas_used += STOR_READ_COST;\n\tengine->check_gas();\n\n\treturn backend->get_balance(contract, currency);\n}\n\n\n} // vm\n} // mmx\n"
  },
  {
    "path": "src/vm/StorageRAM.cpp",
    "content": "/*\n * StorageRAM.cpp\n *\n *  Created on: Apr 30, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/StorageRAM.h>\n\n\nnamespace mmx {\nnamespace vm {\n\nStorageRAM::~StorageRAM()\n{\n\tclear();\n}\n\nstd::unique_ptr<var_t> StorageRAM::read(const addr_t& contract, const uint64_t src) const\n{\n\tstd::lock_guard lock(mutex);\n\n\tauto iter = memory.find(std::make_pair(contract, src));\n\tif(iter != memory.end()) {\n\t\treturn clone(iter->second.get());\n\t}\n\treturn nullptr;\n}\n\nstd::unique_ptr<var_t> StorageRAM::read(const addr_t& contract, const uint64_t src, const uint64_t key) const\n{\n\tstd::lock_guard lock(mutex);\n\n\tauto iter = entries.find(std::make_tuple(contract, src, key));\n\tif(iter != entries.end()) {\n\t\treturn clone(iter->second.get());\n\t}\n\treturn nullptr;\n}\n\nvoid StorageRAM::write(const addr_t& contract, const uint64_t dst, const var_t& value)\n{\n\tconst auto key = std::make_pair(contract, dst);\n\n\tstd::lock_guard lock(mutex);\n\n\tauto& var = memory[key];\n\tif(var) {\n\t\tif(var->flags & FLAG_KEY) {\n\t\t\tthrow std::logic_error(\"cannot overwrite key\");\n\t\t}\n\t}\n\tvar = clone(value);\n\n\tif(value.flags & FLAG_KEY) {\n\t\tkey_map[contract][var.get()] = dst;\n\t}\n}\n\nvoid StorageRAM::write(const addr_t& contract, const uint64_t dst, const uint64_t key, const var_t& value)\n{\n\tconst auto mapkey = std::make_tuple(contract, dst, key);\n\n\tstd::lock_guard lock(mutex);\n\n\tentries[mapkey] = clone(value);\n}\n\nuint64_t StorageRAM::lookup(const addr_t& contract, const var_t& value) const\n{\n\tstd::lock_guard lock(mutex);\n\n\tauto iter = key_map.find(contract);\n\tif(iter != key_map.end()) {\n\t\tconst auto& map = iter->second;\n\t\tauto iter2 = map.find(&value);\n\t\tif(iter2 != map.end()) {\n\t\t\treturn iter2->second;\n\t\t}\n\t}\n\treturn 0;\n}\n\nvoid StorageRAM::clear()\n{\n\tstd::lock_guard lock(mutex);\n\n\tkey_map.clear();\n\tmemory.clear();\n\tentries.clear();\n\tbalance_map.clear();\n}\n\nvoid StorageRAM::set_balance(const addr_t& contract, const addr_t& currency, const uint128& amount)\n{\n\tstd::lock_guard lock(mutex);\n\n\tbalance_map[contract][currency] = amount;\n}\n\nstd::unique_ptr<uint128> StorageRAM::get_balance(const addr_t& contract, const addr_t& currency)\n{\n\tstd::lock_guard lock(mutex);\n\n\tauto iter = balance_map.find(contract);\n\tif(iter != balance_map.end()) {\n\t\tconst auto& map = iter->second;\n\t\tauto iter2 = map.find(currency);\n\t\tif(iter2 != map.end()) {\n\t\t\treturn std::make_unique<uint128>(iter2->second);\n\t\t}\n\t}\n\treturn nullptr;\n}\n\nvoid StorageRAM::dump_memory(std::ostream& out) const\n{\n\tauto dump_entries = [this, &out](const addr_t& address)\n\t{\n\t\tfor(auto iter = entries.lower_bound(std::make_tuple(address, 0, 0)); iter != entries.upper_bound(std::make_tuple(address, -1, -1)); ++iter)\n\t\t{\n\t\t\tout << \"[\" << to_hex(std::get<1>(iter->first)) << \"]\"\n\t\t\t\t\t<< \"[\" << to_hex(std::get<2>(iter->first)) << \"] \" << to_string(iter->second.get());\n\t\t\tif(auto var = iter->second.get()) {\n\t\t\t\tout << \"\\t\\t(vf: \" << to_bin(var->flags) << \")\";\n\t\t\t}\n\t\t\tout << std::endl;\n\t\t}\n\t};\n\n\tconst addr_t* curr_addr = nullptr;\n\n\tfor(auto iter = memory.begin(); iter != memory.end(); ++iter)\n\t{\n\t\tif(!curr_addr || iter->first.first != *curr_addr) {\n\t\t\tif(curr_addr) {\n\t\t\t\tdump_entries(*curr_addr);\n\t\t\t}\n\t\t\tcurr_addr = &iter->first.first;\n\t\t\tout << \"[\" << curr_addr->to_string() << \"]\" << std::endl;\n\t\t}\n\t\tout << \"[\" << to_hex(iter->first.second) << \"] \" << to_string(iter->second.get());\n\t\tif(auto var = iter->second.get()) {\n\t\t\tout << \"\\t\\t(vf: \" << to_bin(var->flags) << \") (rc: \" << var->ref_count << \")\";\n\t\t}\n\t\tout << std::endl;\n\t}\n\tif(curr_addr) {\n\t\tdump_entries(*curr_addr);\n\t}\n}\n\n\n} // vm\n} // mmx\n"
  },
  {
    "path": "src/vm/instr_t.cpp",
    "content": "/*\n * instr_t.cpp\n *\n *  Created on: Apr 23, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/instr_t.h>\n#include <vnx/vnx.h>\n\n#include <cstring>\n#include <sstream>\n#include <stdexcept>\n#include <algorithm>\n#include <unordered_map>\n\n#define OPCODE_INFO(op, num) g_opcode_info[op] = {#op, num}\n\n\nnamespace mmx {\nnamespace vm {\n\nopcode_info_t g_opcode_info[256] = {};\n\nconst struct global_init_t {\n\tglobal_init_t() {\n\t\tOPCODE_INFO(OP_NOP, 0);\n\t\tOPCODE_INFO(OP_CLR, 1);\n\t\tOPCODE_INFO(OP_COPY, 2);\n\t\tOPCODE_INFO(OP_CLONE, 2);\n\t\tOPCODE_INFO(OP_JUMP, 1);\n\t\tOPCODE_INFO(OP_JUMPI, 2);\n\t\tOPCODE_INFO(OP_JUMPN, 2);\n\t\tOPCODE_INFO(OP_CALL, 2);\n\t\tOPCODE_INFO(OP_RET, 0);\n\t\tOPCODE_INFO(OP_ADD, 3);\n\t\tOPCODE_INFO(OP_SUB, 3);\n\t\tOPCODE_INFO(OP_MUL, 3);\n\t\tOPCODE_INFO(OP_DIV, 3);\n\t\tOPCODE_INFO(OP_MOD, 3);\n\t\tOPCODE_INFO(OP_NOT, 2);\n\t\tOPCODE_INFO(OP_XOR, 3);\n\t\tOPCODE_INFO(OP_AND, 3);\n\t\tOPCODE_INFO(OP_OR, 3);\n\t\tOPCODE_INFO(OP_MIN, 3);\n\t\tOPCODE_INFO(OP_MAX, 3);\n\t\tOPCODE_INFO(OP_SHL, 3);\n\t\tOPCODE_INFO(OP_SHR, 3);\n\t\tOPCODE_INFO(OP_CMP_EQ, 3);\n\t\tOPCODE_INFO(OP_CMP_NEQ, 3);\n\t\tOPCODE_INFO(OP_CMP_LT, 3);\n\t\tOPCODE_INFO(OP_CMP_GT, 3);\n\t\tOPCODE_INFO(OP_CMP_LTE, 3);\n\t\tOPCODE_INFO(OP_CMP_GTE, 3);\n\t\tOPCODE_INFO(OP_TYPE, 2);\n\t\tOPCODE_INFO(OP_SIZE, 2);\n\t\tOPCODE_INFO(OP_GET, 3);\n\t\tOPCODE_INFO(OP_SET, 3);\n\t\tOPCODE_INFO(OP_ERASE, 2);\n\t\tOPCODE_INFO(OP_PUSH_BACK, 2);\n\t\tOPCODE_INFO(OP_POP_BACK, 2);\n\t\tOPCODE_INFO(OP_CONV, 4);\n\t\tOPCODE_INFO(OP_CONCAT, 3);\n\t\tOPCODE_INFO(OP_MEMCPY, 4);\n\t\tOPCODE_INFO(OP_SHA256, 2);\n\t\tOPCODE_INFO(OP_VERIFY, 4);\n\t\tOPCODE_INFO(OP_LOG, 2);\n\t\tOPCODE_INFO(OP_SEND, 4);\n\t\tOPCODE_INFO(OP_MINT, 3);\n\t\tOPCODE_INFO(OP_EVENT, 2);\n\t\tOPCODE_INFO(OP_FAIL, 2);\n\t\tOPCODE_INFO(OP_RCALL, 4);\n\t\tOPCODE_INFO(OP_CREAD, 3);\n\t\tOPCODE_INFO(OP_BALANCE, 2);\n\t}\n} global_init;\n\n\nconst opcode_info_t& get_opcode_info(opcode_e code)\n{\n\treturn g_opcode_info[code];\n}\n\nstatic void encode_symbol(\n\t\tvnx::OutputBuffer& out, const uint32_t symbol,\n\t\tconst std::unordered_map<uint32_t, std::pair<uint32_t, uint8_t>>& sym_map)\n{\n\tauto iter = sym_map.find(symbol);\n\tif(iter != sym_map.end()) {\n\t\tout.write(&iter->second.first, iter->second.second);\n\t}\n\telse if(symbol < 0x7FFF) {\n\t\t// raw 15-bit value\n\t\tconst uint32_t tmp = (((uint32_t(1) << 15) | symbol) << 8) | 0xFF;\n\t\tout.write(&tmp, 3);\n\t}\n\telse {\n\t\t// raw 32-bit value\n\t\tconst uint64_t tmp = (uint64_t(symbol) << 24) | 0xFFFFFF;\n\t\tout.write(&tmp, 7);\n\t}\n}\n\ninline uint32_t encode_instr(const instr_t& instr)\n{\n\treturn (uint32_t(instr.flags) << 8) | uint32_t(instr.code);\n}\n\nstd::vector<uint8_t> serialize(const std::vector<instr_t>& code)\n{\n\tstd::unordered_map<uint32_t, uint32_t> sym_count;\n\tfor(const auto& instr : code) {\n\t\tconst auto& info = get_opcode_info(instr.code);\n\t\tif(info.nargs >= 1) {\n\t\t\tsym_count[instr.a]++;\n\t\t}\n\t\tif(info.nargs >= 2) {\n\t\t\tsym_count[instr.b]++;\n\t\t}\n\t\tif(info.nargs >= 3) {\n\t\t\tsym_count[instr.c]++;\n\t\t}\n\t\tif(info.nargs >= 4) {\n\t\t\tsym_count[instr.d]++;\n\t\t}\n\t\tsym_count[encode_instr(instr)]++;\n\t}\n\tstd::vector<std::pair<uint32_t, uint32_t>> sym_list;\n\n\tfor(const auto& entry : sym_count) {\n\t\tif(entry.second > 1) {\n\t\t\tsym_list.push_back(entry);\n\t\t}\n\t}\n\tstd::sort(sym_list.begin(), sym_list.end(),\n\t\t[](const std::pair<uint32_t, uint32_t>& L, const std::pair<uint32_t, uint32_t>& R) -> bool {\n\t\t\treturn L.second == R.second ? L.first < R.first : L.second > R.second;\n\t\t});\n\n\tsym_list.resize(std::min<size_t>(sym_list.size(), 0x7FFF + 0xFF));\n\n\tstd::unordered_map<uint32_t, std::pair<uint32_t, uint8_t>> sym_map;\n\n\tfor(uint32_t i = 0; i < sym_list.size(); ++i)\n\t{\n\t\tconst auto& key = sym_list[i].first;\n\t\tif(i < 0xFF) {\n\t\t\t// 1-byte entry with 8-bit symbol\n\t\t\tsym_map[key] = std::make_pair(i, 1);\n\t\t} else {\n\t\t\t// 3-byte entry with 15-bit symbol\n\t\t\tsym_map[key] = std::make_pair(((i - 0xFF) << 8) | 0xFF, 3);\n\t\t}\n\t}\n\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::TypeOutput out(&stream);\n\n\tvnx::write(out, uint8_t(1));\t\t\t\t\t// version\n\tvnx::write(out, uint32_t(sym_list.size()));\t\t// number of symbols\n\n\tfor(const auto& entry : sym_list) {\n\t\tvnx::write(out, entry.first);\t\t\t\t// symbols\n\t}\n\tvnx::write(out, uint32_t(code.size()));\t\t\t// number of instructions\n\n\tfor(const auto& instr : code)\n\t{\n\t\tencode_symbol(out, encode_instr(instr), sym_map);\n\n\t\tconst auto& info = get_opcode_info(instr.code);\n\t\tif(info.nargs >= 1) {\n\t\t\tencode_symbol(out, instr.a, sym_map);\n\t\t}\n\t\tif(info.nargs >= 2) {\n\t\t\tencode_symbol(out, instr.b, sym_map);\n\t\t}\n\t\tif(info.nargs >= 3) {\n\t\t\tencode_symbol(out, instr.c, sym_map);\n\t\t}\n\t\tif(info.nargs >= 4) {\n\t\t\tencode_symbol(out, instr.d, sym_map);\n\t\t}\n\t}\n\tout.flush();\n\n\treturn buffer;\n}\n\nstatic uint32_t decode_symbol(vnx::InputBuffer& in, const std::vector<uint32_t>& sym_list)\n{\n\tuint8_t first = 0;\n\tin.read(&first, 1);\n\n\tif(first < 0xFF) {\n\t\tif(first < sym_list.size()) {\n\t\t\treturn sym_list[first];\n\t\t} else {\n\t\t\tthrow std::logic_error(\"decode_symbol(): invalid 8-bit symbol: \" + std::to_string(first));\n\t\t}\n\t}\n\tuint16_t second = 0;\n\tin.read(&second, 2);\n\n\tif(second < 0x7FFF) {\n\t\tsecond += 0xFF;\n\t\tif(second < sym_list.size()) {\n\t\t\treturn sym_list[second];\n\t\t} else {\n\t\t\tthrow std::logic_error(\"decode_symbol(): invalid 15-bit symbol: \" + std::to_string(second));\n\t\t}\n\t}\n\tif(second < 0xFFFF) {\n\t\t// raw 15-bit value\n\t\treturn second & 0x7FFF;\n\t}\n\tuint32_t value = 0;\n\tin.read(&value, 4);\n\treturn value;\n}\n\ninline instr_t decode_instr(vnx::InputBuffer& in, const std::vector<uint32_t>& sym_list)\n{\n\tconst auto tmp = decode_symbol(in, sym_list);\n\tinstr_t out;\n\tout.code = opcode_e(tmp & 0xFF);\n\tout.flags = (tmp >> 8) & 0xFF;\n\treturn out;\n}\n\nsize_t deserialize(std::vector<instr_t>& code, const void* data, const size_t length)\n{\n\tvnx::PointerInputStream stream(data, length);\n\tvnx::TypeInput in(&stream);\n\n\tuint8_t version = 0;\n\tvnx::read(in, version);\n\n\tif(version != 1) {\n\t\tthrow std::logic_error(\"deserialize(): invalid version: \" + std::to_string(version));\n\t}\n\tuint32_t sym_count = 0;\n\tvnx::read(in, sym_count);\n\n\tif(sym_count > 0x7FFF + 0xFF) {\n\t\tthrow std::logic_error(\"deserialize(): invalid symbol count: \" + std::to_string(sym_count));\n\t}\n\tstd::vector<uint32_t> sym_list(sym_count);\n\n\tfor(uint32_t i = 0; i < sym_count; ++i) {\n\t\tvnx::read(in, sym_list[i]);\n\t}\n\tuint32_t instr_count = 0;\n\tvnx::read(in, instr_count);\n\n\tfor(uint32_t i = 0; i < instr_count; ++i)\n\t{\n\t\tauto instr = decode_instr(in, sym_list);\n\n\t\tconst auto& info = get_opcode_info(instr.code);\n\t\tif(info.nargs >= 1) {\n\t\t\tinstr.a = decode_symbol(in, sym_list);\n\t\t}\n\t\tif(info.nargs >= 2) {\n\t\t\tinstr.b = decode_symbol(in, sym_list);\n\t\t}\n\t\tif(info.nargs >= 3) {\n\t\t\tinstr.c = decode_symbol(in, sym_list);\n\t\t}\n\t\tif(info.nargs >= 4) {\n\t\t\tinstr.d = decode_symbol(in, sym_list);\n\t\t}\n\t\tcode.push_back(instr);\n\t}\n\treturn in.get_input_pos();\n}\n\nstd::string to_string(const instr_t& instr)\n{\n\tconst auto info = get_opcode_info(instr.code);\n\tstd::stringstream ss;\n\tss << info.name;\n\tif(instr.flags & OPFLAG_BITWISE) {\n\t\tss << \"(B)\";\n\t}\n\tss << std::uppercase << std::hex << \"\\t\";\n\tfor(uint32_t i = 0; i < info.nargs; ++i) {\n\t\tss << \" \";\n\t\tbool ref = false;\n\t\tswitch(i) {\n\t\t\tcase 0: ref = instr.flags & OPFLAG_REF_A; break;\n\t\t\tcase 1: ref = instr.flags & OPFLAG_REF_B; break;\n\t\t\tcase 2: ref = instr.flags & OPFLAG_REF_C; break;\n\t\t\tcase 3: ref = instr.flags & OPFLAG_REF_D; break;\n\t\t}\n\t\tif(ref) {\n\t\t\tss << \"[\";\n\t\t}\n\t\tswitch(i) {\n\t\t\tcase 0: ss << \"0x\" << instr.a; break;\n\t\t\tcase 1: ss << \"0x\" << instr.b; break;\n\t\t\tcase 2: ss << \"0x\" << instr.c; break;\n\t\t\tcase 3: ss << \"0x\" << instr.d; break;\n\t\t}\n\t\tif(ref) {\n\t\t\tss << \"]\";\n\t\t}\n\t}\n\treturn ss.str();\n}\n\n\n} // vm\n} // mmx\n"
  },
  {
    "path": "src/vm/std/compare.js",
    "content": "// Returns \"EQ\" if arguments are equal, \"LT\" if L < R and \"GT\" if L > R\n// Note: Arrays are (recursively) deep compared, otherwise the same as language operators\nfunction compare(L, R) const {\n    if(!is_array(L) || !is_array(R)) {\n        if(L < R) {\n            return \"LT\";\n        }\n        if(L > R) {\n            return \"GT\";\n        }\n        return \"EQ\";\n    }\n    const N = size(L);\n    const M = size(R);\n    if(N != M) {\n        if(N < M) {\n            return \"LT\";\n        }\n        return \"GT\";\n    }\n    for(var i = 0; i < N; ++i) {\n        const res = compare(L[i], R[i]);\n        if(res != \"EQ\") {\n            return res;\n        }\n    }\n    return \"EQ\";\n}\n"
  },
  {
    "path": "src/vm/std/compile.sh",
    "content": "#!/bin/bash\n\n# Output C++ file\noutput_file=\"embedded.h\"\n\n# Start writing the C++ file\ncat <<EOL > \"$output_file\"\n#include <map>\n#include <string>\n\nnamespace mmx {\nnamespace vm {\n\nstd::map<std::string, std::string> std_file_map = {\nEOL\n\n# Iterate over all *.js files in the current directory\nfor js_file in *.js; do\n    if [[ -f \"$js_file\" ]]; then\n        # Read the file content and escape double quotes and newlines\n        content=$(sed ':a;N;$!ba;s/\"/\\\\\"/g;s/\\n/\\\\n/g' \"$js_file\")\n        # Append the file content to the C++ map\n        echo \"    {\\\"$js_file\\\", \\\"$content\\\"},\" >> \"$output_file\"\n    fi\ndone\n\n# Close the map and namespace\ncat <<EOL >> \"$output_file\"\n};\n\n} // namespace vm\n} // namespace mmx\nEOL\n"
  },
  {
    "path": "src/vm/std/embedded.h",
    "content": "#include <map>\n#include <string>\n\nnamespace mmx {\nnamespace vm {\n\nstd::map<std::string, std::string> std_file_map = {\n    {\"compare.js\", \"// Returns \\\"EQ\\\" if arguments are equal, \\\"LT\\\" if L < R and \\\"GT\\\" if L > R\\n// Note: Arrays are (recursively) deep compared, otherwise the same as language operators\\nfunction compare(L, R) const {\\n    if(!is_array(L) || !is_array(R)) {\\n        if(L < R) {\\n            return \\\"LT\\\";\\n        }\\n        if(L > R) {\\n            return \\\"GT\\\";\\n        }\\n        return \\\"EQ\\\";\\n    }\\n    const N = size(L);\\n    const M = size(R);\\n    if(N != M) {\\n        if(N < M) {\\n            return \\\"LT\\\";\\n        }\\n        return \\\"GT\\\";\\n    }\\n    for(var i = 0; i < N; ++i) {\\n        const res = compare(L[i], R[i]);\\n        if(res != \\\"EQ\\\") {\\n            return res;\\n        }\\n    }\\n    return \\\"EQ\\\";\\n}\"},\n    {\"equals.js\", \"// Same as == operator, but does a deep (recursive) comparison for arrays\\n// @returns true if the two values are equal, false otherwise\\n// Note: Objects cannot be compared, as such comparison is based on the reference (address)\\nfunction equals(L, R) const {\\n    if(L == R) {\\n        return true;\\n    }\\n    if(!is_array(L) || !is_array(R)) {\\n        return L == R;\\n    }\\n    const N = size(L);\\n    if(size(R) != N) {\\n        return false;\\n    }\\n    for(var i = 0; i < N; ++i) {\\n        if(!equals(L[i], R[i])) {\\n            return false;\\n        }\\n    }\\n    return true;\\n}\"},\n    {\"reverse.js\", \"// Returns a new array with the elements of the input array in reverse order\\nfunction reverse(arr) const {\\n    const N = size(arr);\\n    const out = [];\\n    for(var i = 0; i < N; i++) {\\n        push(out, arr[N - i - 1]);\\n    }\\n    return out;\\n}\"},\n    {\"sort.js\", \"// Returns a sorted array in ascending order (using bubble sort)\\n// Note: use reverse(sort(...)) to get a descending order\\nfunction sort(arr) const {\\n    const N = size(arr);\\n    if(N <= 1) {\\n        return arr;\\n    }\\n    const N_1 = N - 1;\\n    for(var i = 0; i < N_1; i++) {\\n        const M = N_1 - i;\\n        for(var j = 0; j < M; j++) {\\n            const k = j + 1;\\n            const L = arr[j];\\n            const R = arr[k];\\n            if(L > R) {\\n                arr[j] = R;\\n                arr[k] = L;\\n            }\\n        }\\n    }\\n    return arr;\\n}\"},\n};\n\n} // namespace vm\n} // namespace mmx\n"
  },
  {
    "path": "src/vm/std/equals.js",
    "content": "// Same as == operator, but does a deep (recursive) comparison for arrays\n// @returns true if the two values are equal, false otherwise\n// Note: Objects cannot be compared, as such comparison is based on the reference (address)\nfunction equals(L, R) const {\n    if(L == R) {\n        return true;\n    }\n    if(!is_array(L) || !is_array(R)) {\n        return L == R;\n    }\n    const N = size(L);\n    if(size(R) != N) {\n        return false;\n    }\n    for(var i = 0; i < N; ++i) {\n        if(!equals(L[i], R[i])) {\n            return false;\n        }\n    }\n    return true;\n}\n"
  },
  {
    "path": "src/vm/std/reverse.js",
    "content": "// Returns a new array with the elements of the input array in reverse order\nfunction reverse(arr) const {\n    const N = size(arr);\n    const out = [];\n    for(var i = 0; i < N; i++) {\n        push(out, arr[N - i - 1]);\n    }\n    return out;\n}\n"
  },
  {
    "path": "src/vm/std/sort.js",
    "content": "// Returns a sorted array in ascending order (using bubble sort)\n// Note: use reverse(sort(...)) to get a descending order\nfunction sort(arr) const {\n    const N = size(arr);\n    if(N <= 1) {\n        return arr;\n    }\n    const N_1 = N - 1;\n    for(var i = 0; i < N_1; i++) {\n        const M = N_1 - i;\n        for(var j = 0; j < M; j++) {\n            const k = j + 1;\n            const L = arr[j];\n            const R = arr[k];\n            if(L > R) {\n                arr[j] = R;\n                arr[k] = L;\n            }\n        }\n    }\n    return arr;\n}\n"
  },
  {
    "path": "src/vm/var_t.cpp",
    "content": "/*\n * var_t.cpp\n *\n *  Created on: Apr 22, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/var_t.h>\n\n#include <vnx/Util.hpp>\n\n\nnamespace mmx {\nnamespace vm {\n\nstd::unique_ptr<var_t> clone(const var_t& src)\n{\n\tswitch(src.type) {\n\t\tcase TYPE_NIL:\n\t\tcase TYPE_TRUE:\n\t\tcase TYPE_FALSE:\n\t\t\treturn std::make_unique<var_t>(src);\n\t\tcase TYPE_REF:\n\t\t\treturn std::make_unique<ref_t>((const ref_t&)src);\n\t\tcase TYPE_UINT:\n\t\t\treturn std::make_unique<uint_t>((const uint_t&)src);\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY:\n\t\t\treturn binary_t::clone((const binary_t&)src);\n\t\tcase TYPE_ARRAY:\n\t\t\treturn std::make_unique<array_t>((const array_t&)src);\n\t\tcase TYPE_MAP:\n\t\t\treturn std::make_unique<map_t>((const map_t&)src);\n\t\tdefault:\n\t\t\treturn nullptr;\n\t}\n}\n\nstd::unique_ptr<var_t> clone(const var_t* var)\n{\n\tif(var) {\n\t\treturn clone(*var);\n\t}\n\treturn nullptr;\n}\n\nint compare(const var_t& lhs, const var_t& rhs)\n{\n\tif(lhs.type != rhs.type) {\n\t\treturn lhs.type < rhs.type ? -1 : 1;\n\t}\n\tswitch(lhs.type) {\n\t\tcase TYPE_NIL:\n\t\tcase TYPE_TRUE:\n\t\tcase TYPE_FALSE:\n\t\t\treturn 0;\n\t\tcase TYPE_REF: {\n\t\t\tconst auto& L = (const ref_t&)lhs;\n\t\t\tconst auto& R = (const ref_t&)rhs;\n\t\t\tif(L.address == R.address) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn L.address < R.address ? -1 : 1;\n\t\t}\n\t\tcase TYPE_UINT: {\n\t\t\tconst auto& L = ((const uint_t&)lhs).value;\n\t\t\tconst auto& R = ((const uint_t&)rhs).value;\n\t\t\tif(L == R) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn L < R ? -1 : 1;\n\t\t}\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY: {\n\t\t\tconst auto& L = (const binary_t&)lhs;\n\t\t\tconst auto& R = (const binary_t&)rhs;\n\t\t\tif(L.size == R.size) {\n\t\t\t\treturn ::memcmp(L.data(), R.data(), L.size);\n\t\t\t}\n\t\t\treturn L.size < R.size ? -1 : 1;\n\t\t}\n\t\tcase TYPE_ARRAY: {\n\t\t\tconst auto& L = (const array_t&)lhs;\n\t\t\tconst auto& R = (const array_t&)rhs;\n\t\t\tif(L.address == R.address) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn L.address < R.address ? -1 : 1;\n\t\t}\n\t\tcase TYPE_MAP: {\n\t\t\tconst auto& L = (const map_t&)lhs;\n\t\t\tconst auto& R = (const map_t&)rhs;\n\t\t\tif(L.address == R.address) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn L.address < R.address ? -1 : 1;\n\t\t}\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n}\n\nint compare(const var_t* lhs, const var_t* rhs)\n{\n\tif(lhs && rhs) {\n\t\treturn compare(*lhs, *rhs);\n\t}\n\tif(!lhs && !rhs) {\n\t\treturn 0;\n\t}\n\treturn rhs ? -1 : 1;\n}\n\nstd::pair<std::unique_ptr<uint8_t[]>, size_t> serialize(const var_t& src, bool with_rc, bool with_vf)\n{\n\tsize_t length = 1;\n\tif(with_rc) {\n\t\tlength += 4;\n\t}\n\tif(with_vf) {\n\t\tlength += 1;\n\t}\n\tswitch(src.type) {\n\t\tcase TYPE_REF:\n\t\t\tlength += 8; break;\n\t\tcase TYPE_UINT:\n\t\t\tlength += 32; break;\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY:\n\t\t\tlength += 4 + size_t(((const binary_t&)src).size); break;\n\t\tcase TYPE_ARRAY:\n\t\t\tlength += 12; break;\n\t\tcase TYPE_MAP:\n\t\t\tlength += 8; break;\n\t\tdefault: break;\n\t}\n\tauto data = std::make_unique<uint8_t[]>(length);\n\n\tsize_t offset = 0;\n\tif(with_rc) {\n\t\t::memcpy(data.get() + offset, &src.ref_count, 4); offset += 4;\n\t}\n\tif(with_vf) {\n\t\t::memcpy(data.get() + offset, &src.flags, 1); offset += 1;\n\t}\n\t::memcpy(data.get() + offset, &src.type, 1); offset += 1;\n\n\tswitch(src.type) {\n\t\tcase TYPE_REF:\n\t\t\t::memcpy(data.get() + offset, &((const ref_t&)src).address, 8); offset += 8;\n\t\t\tbreak;\n\t\tcase TYPE_UINT: {\n\t\t\tconst auto& val_256 = ((const uint_t&)src).value;\n\t\t\tif(val_256.upper()) {\n\t\t\t\tdata[offset - 1] = TYPE_UINT256;\n\t\t\t\t::memcpy(data.get() + offset, &val_256, 32); offset += 32;\n\t\t\t} else {\n\t\t\t\tconst auto& val_128 = val_256.lower();\n\t\t\t\tif(val_128.upper()) {\n\t\t\t\t\tdata[offset - 1] = TYPE_UINT128;\n\t\t\t\t\t::memcpy(data.get() + offset, &val_128, 16); offset += 16;\n\t\t\t\t} else {\n\t\t\t\t\tconst auto& val_64 = val_128.lower();\n\t\t\t\t\tif(val_64 >> 32) {\n\t\t\t\t\t\tdata[offset - 1] = TYPE_UINT64;\n\t\t\t\t\t\t::memcpy(data.get() + offset, &val_64, 8); offset += 8;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst uint32_t val_32 = val_64;\n\t\t\t\t\t\tif(val_32 >> 16) {\n\t\t\t\t\t\t\tdata[offset - 1] = TYPE_UINT32;\n\t\t\t\t\t\t\t::memcpy(data.get() + offset, &val_32, 4); offset += 4;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst uint16_t val_16 = val_32;\n\t\t\t\t\t\t\tdata[offset - 1] = TYPE_UINT16;\n\t\t\t\t\t\t\t::memcpy(data.get() + offset, &val_16, 2); offset += 2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY: {\n\t\t\tconst auto& bin = (const binary_t&)src;\n\t\t\t::memcpy(data.get() + offset, &bin.size, 4); offset += 4;\n\t\t\t::memcpy(data.get() + offset, bin.data(), bin.size); offset += bin.size;\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_ARRAY:\n\t\t\t::memcpy(data.get() + offset, &((const array_t&)src).address, 8); offset += 8;\n\t\t\t::memcpy(data.get() + offset, &((const array_t&)src).size, 4); offset += 4;\n\t\t\tbreak;\n\t\tcase TYPE_MAP:\n\t\t\t::memcpy(data.get() + offset, &((const map_t&)src).address, 8); offset += 8;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\treturn std::make_pair(std::move(data), offset);\n}\n\nsize_t deserialize(std::unique_ptr<var_t>& out, const void* data_, const size_t length, bool with_rc, bool with_vf)\n{\n\tsize_t offset = 0;\n\tconst uint8_t* data = (const uint8_t*)data_;\n\n\tuint8_t flags = 0;\n\tuint32_t ref_count = 0;\n\tif(with_rc) {\n\t\tif(length < offset + 4) {\n\t\t\tthrow std::runtime_error(\"unexpected eof\");\n\t\t}\n\t\t::memcpy(&ref_count, data + offset, 4); offset += 4;\n\t}\n\tif(with_vf) {\n\t\tif(length < offset + 1) {\n\t\t\tthrow std::runtime_error(\"unexpected eof\");\n\t\t}\n\t\tflags = data[offset]; offset += 1;\n\t}\n\tif(length < offset + 1) {\n\t\tthrow std::runtime_error(\"unexpected eof\");\n\t}\n\tconst auto type = vartype_e(data[offset]); offset += 1;\n\n\tswitch(type) {\n\t\tcase TYPE_NIL:\n\t\tcase TYPE_TRUE:\n\t\tcase TYPE_FALSE:\n\t\t\tout = std::make_unique<var_t>(type);\n\t\t\tbreak;\n\t\tcase TYPE_REF: {\n\t\t\tif(length < offset + 8) {\n\t\t\t\tthrow std::runtime_error(\"unexpected eof\");\n\t\t\t}\n\t\t\tauto var = std::make_unique<ref_t>();\n\t\t\t::memcpy(&var->address, data + offset, 8); offset += 8;\n\t\t\tout = std::move(var);\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_UINT:\n\t\tcase TYPE_UINT16:\n\t\tcase TYPE_UINT32:\n\t\tcase TYPE_UINT64:\n\t\tcase TYPE_UINT128:\n\t\tcase TYPE_UINT256: {\n\t\t\tsize_t size = 32;\n\t\t\tswitch(type) {\n\t\t\t\tcase TYPE_UINT16:  size = 2; break;\n\t\t\t\tcase TYPE_UINT32:  size = 4; break;\n\t\t\t\tcase TYPE_UINT64:  size = 8; break;\n\t\t\t\tcase TYPE_UINT128: size = 16; break;\n\t\t\t\tdefault: break;\n\t\t\t}\n\t\t\tif(length < offset + size) {\n\t\t\t\tthrow std::runtime_error(\"unexpected eof\");\n\t\t\t}\n\t\t\tauto var = std::make_unique<uint_t>();\n\t\t\tswitch(type) {\n\t\t\t\tcase TYPE_UINT16: {\n\t\t\t\t\tuint16_t tmp = 0;\n\t\t\t\t\t::memcpy(&tmp, data + offset, size);\n\t\t\t\t\tvar->value = tmp;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase TYPE_UINT32: {\n\t\t\t\t\tuint32_t tmp = 0;\n\t\t\t\t\t::memcpy(&tmp, data + offset, size);\n\t\t\t\t\tvar->value = tmp;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase TYPE_UINT64: {\n\t\t\t\t\tuint64_t tmp = 0;\n\t\t\t\t\t::memcpy(&tmp, data + offset, size);\n\t\t\t\t\tvar->value = tmp;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase TYPE_UINT128: {\n\t\t\t\t\tuint128_t tmp = 0;\n\t\t\t\t\t::memcpy(&tmp, data + offset, size);\n\t\t\t\t\tvar->value = uint256_t(tmp);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\t::memcpy(&var->value, data + offset, size);\n\t\t\t}\n\t\t\toffset += size;\n\t\t\tout = std::move(var);\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY: {\n\t\t\tif(length < offset + 4) {\n\t\t\t\tthrow std::runtime_error(\"unexpected eof\");\n\t\t\t}\n\t\t\tuint32_t size = 0;\n\t\t\t::memcpy(&size, data + offset, 4); offset += 4;\n\t\t\tif(length < offset + size) {\n\t\t\t\tthrow std::runtime_error(\"unexpected eof\");\n\t\t\t}\n\t\t\tauto bin = binary_t::unsafe_alloc(size, type);\n\t\t\tbin->size = size;\n\t\t\t::memcpy(bin->data(), data + offset, bin->size); offset += size;\n\t\t\t::memset(bin->data(bin->size), 0, bin->capacity - bin->size);\n\t\t\tout = std::move(bin);\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_ARRAY: {\n\t\t\tif(length < offset + 12) {\n\t\t\t\tthrow std::runtime_error(\"unexpected eof\");\n\t\t\t}\n\t\t\tauto var = std::make_unique<array_t>();\n\t\t\t::memcpy(&var->address, data + offset, 8); offset += 8;\n\t\t\t::memcpy(&var->size, data + offset, 4); offset += 4;\n\t\t\tout = std::move(var);\n\t\t\tbreak;\n\t\t}\n\t\tcase TYPE_MAP: {\n\t\t\tif(length < offset + 8) {\n\t\t\t\tthrow std::runtime_error(\"unexpected eof\");\n\t\t\t}\n\t\t\tauto var = std::make_unique<map_t>();\n\t\t\t::memcpy(&var->address, data + offset, 8); offset += 8;\n\t\t\tout = std::move(var);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tthrow std::runtime_error(\"invalid type: \" + std::to_string(int(type)));\n\t}\n\tif(out) {\n\t\tout->flags = flags;\n\t\tout->ref_count = ref_count;\n\t}\n\treturn offset;\n}\n\nstd::string to_string(const vartype_e& type)\n{\n\tswitch(type) {\n\t\tcase TYPE_ARRAY: return \"TYPE_ARRAY\";\n\t\tcase TYPE_BINARY: return \"TYPE_BINARY\";\n\t\tcase TYPE_FALSE: return \"TYPE_FALSE\";\n\t\tcase TYPE_MAP: return \"TYPE_MAP\";\n\t\tcase TYPE_NIL: return \"TYPE_NIL\";\n\t\tcase TYPE_REF: return \"TYPE_REF\";\n\t\tcase TYPE_STRING: return \"TYPE_STRING\";\n\t\tcase TYPE_TRUE: return \"TYPE_TRUE\";\n\t\tcase TYPE_UINT: return \"TYPE_UINT\";\n\t\tcase TYPE_UINT16: return \"TYPE_UINT16\";\n\t\tcase TYPE_UINT32: return \"TYPE_UINT32\";\n\t\tcase TYPE_UINT64: return \"TYPE_UINT64\";\n\t\tcase TYPE_UINT128: return \"TYPE_UINT128\";\n\t\tcase TYPE_UINT256: return \"TYPE_UINT256\";\n\t}\n\treturn std::to_string(uint8_t(type));\n}\n\nstd::string to_string(const var_t& var)\n{\n\tswitch(var.type) {\n\t\tcase TYPE_NIL:\n\t\t\treturn \"null\";\n\t\tcase TYPE_TRUE:\n\t\t\treturn \"true\";\n\t\tcase TYPE_FALSE:\n\t\t\treturn \"false\";\n\t\tcase TYPE_REF:\n\t\t\treturn \"<0x\" + vnx::to_hex_string(((const ref_t&)var).address) + \">\";\n\t\tcase TYPE_UINT:\n\t\t\treturn ((const uint_t&)var).value.str(10);\n\t\tcase TYPE_STRING:\n\t\t\treturn \"\\\"\" + ((const binary_t&)var).to_string() + \"\\\"\";\n\t\tcase TYPE_BINARY: {\n\t\t\tconst auto& bin = (const binary_t&)var;\n\t\t\tstd::string out = \"0x\" + bin.to_hex_string();\n\t\t\tif(bin.size == 32) {\n\t\t\t\tout += \" | \" + bin.to_addr().to_string();\n\t\t\t}\n\t\t\treturn out;\n\t\t}\n\t\tcase TYPE_ARRAY: {\n\t\t\tconst auto& array = (const array_t&)var;\n\t\t\treturn \"[0x\" + vnx::to_hex_string(array.address) + \",\" + std::to_string(array.size) + \"]\";\n\t\t}\n\t\tcase TYPE_MAP:\n\t\t\treturn \"{0x\" + vnx::to_hex_string(((const map_t&)var).address) + \"}\";\n\t\tdefault:\n\t\t\treturn \"?\";\n\t}\n}\n\nstd::string to_string_value(const var_t& var)\n{\n\tswitch(var.type) {\n\t\tcase TYPE_STRING:\n\t\t\treturn ((const binary_t&)var).to_string();\n\t\tdefault:\n\t\t\treturn to_string(var);\n\t}\n}\n\nstd::string to_string_value_hex(const var_t& var)\n{\n\tswitch(var.type) {\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY:\n\t\t\treturn ((const binary_t&)var).to_hex_string();\n\t\tdefault:\n\t\t\treturn to_string(var);\n\t}\n}\n\nuint64_t to_ref(const var_t& var)\n{\n\tswitch(var.type) {\n\t\tcase TYPE_REF:\n\t\t\treturn ((const ref_t&)var).address;\n\t\tcase TYPE_ARRAY:\n\t\t\treturn ((const array_t&)var).address;\n\t\tcase TYPE_MAP:\n\t\t\treturn ((const map_t&)var).address;\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n}\n\nuint256_t to_uint(const var_t& var)\n{\n\tswitch(var.type) {\n\t\tcase TYPE_UINT:\n\t\t\treturn ((const uint_t&)var).value;\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n}\n\nhash_t to_hash(const var_t& var)\n{\n\tswitch(var.type) {\n\t\tcase TYPE_BINARY:\n\t\t\treturn ((const binary_t&)var).to_hash();\n\t\tdefault:\n\t\t\treturn hash_t();\n\t}\n}\n\naddr_t to_addr(const var_t& var)\n{\n\tswitch(var.type) {\n\t\tcase TYPE_BINARY:\n\t\t\treturn ((const binary_t&)var).to_addr();\n\t\tcase TYPE_STRING:\n\t\t\treturn addr_t(((const binary_t&)var).to_string());\n\t\tdefault:\n\t\t\treturn addr_t();\n\t}\n}\n\nuint32_t get_size(const var_t& var)\n{\n\tswitch(var.type) {\n\t\tcase TYPE_STRING:\n\t\tcase TYPE_BINARY: {\n\t\t\tconst auto& bin = (const binary_t&)var;\n\t\t\treturn bin.size;\n\t\t}\n\t\tcase TYPE_ARRAY: {\n\t\t\tconst auto& array = (const array_t&)var;\n\t\t\treturn array.size;\n\t\t}\n\t\tdefault:\n\t\t\treturn 0;\n\t}\n}\n\n\n} // vm\n} // mmx\n"
  },
  {
    "path": "src/vm/varptr_t.cpp",
    "content": "/*\n * varptr_t.cpp\n *\n *  Created on: May 12, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/varptr_t.hpp>\n\n#include <vnx/vnx.h>\n\n\nnamespace vnx {\n\nvoid read(vnx::TypeInput& in, mmx::vm::varptr_t& value, const vnx::TypeCode* type_code, const uint16_t* code)\n{\n\tswitch(code[0]) {\n\t\tcase CODE_LIST:\n\t\tcase CODE_ALT_LIST: {\n\t\t\tstd::vector<uint8_t> data;\n\t\t\tvnx::read(in, data, type_code, code);\n\t\t\tstd::unique_ptr<mmx::vm::var_t> var;\n\t\t\tdeserialize(var, data.data(), data.size(), false, false);\n\t\t\tvalue = std::move(var);\n\t\t\tbreak;\n\t\t}\n\t\tcase CODE_STRING:\n\t\tcase CODE_ALT_STRING: {\n\t\t\tstd::string tmp;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\tvalue = mmx::vm::to_binary(tmp);\n\t\t\tbreak;\n\t\t}\n\t\tcase CODE_DYNAMIC:\n\t\tcase CODE_ALT_DYNAMIC: {\n\t\t\tvnx::Variant tmp;\n\t\t\tvnx::read(in, tmp, type_code, code);\n\t\t\tstd::unique_ptr<mmx::vm::var_t> var;\n\t\t\tconst auto data = tmp.to<std::vector<uint8_t>>();\n\t\t\tdeserialize(var, data.data(), data.size(), false, false);\n\t\t\tvalue = std::move(var);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tvnx::skip(in, type_code, code);\n\t}\n}\n\nvoid write(vnx::TypeOutput& out, const mmx::vm::varptr_t& value, const vnx::TypeCode* type_code, const uint16_t* code)\n{\n\tauto var = value;\n\tif(!var) {\n\t\tvar = std::make_unique<mmx::vm::var_t>();\n\t}\n\tconst auto data = mmx::vm::serialize(*var, false, false);\n\twrite(out, uint32_t(data.second));\n\tout.write(data.first.get(), data.second);\n}\n\nvoid read(std::istream& in, mmx::vm::varptr_t& value)\n{\n\tvnx::Variant tmp;\n\tvnx::read(in, tmp);\n\tif(tmp.is_null()) {\n\t\tvalue = std::make_unique<mmx::vm::var_t>();\n\t} else if(tmp.is_bool()) {\n\t\tvalue = std::make_unique<mmx::vm::var_t>(tmp.to<bool>() ? mmx::vm::TYPE_TRUE : mmx::vm::TYPE_FALSE);\n\t} else if(tmp.is_ulong()) {\n\t\tvalue = std::make_unique<mmx::vm::uint_t>(tmp.to<uint64_t>());\n\t} else if(tmp.is_long() || tmp.is_double()) {\n\t\tvalue = std::make_unique<mmx::vm::uint_t>(tmp.to<int64_t>());\n\t} else if(tmp.is_string()) {\n\t\tvalue = mmx::vm::binary_t::alloc(tmp.to<std::string>());\n\t} else {\n\t\tvalue = nullptr;\n\t}\n}\n\nvoid write(std::ostream& out, const mmx::vm::varptr_t& value)\n{\n\tvnx::DefaultPrinter visitor(out);\n\tvnx::accept(visitor, value);\n}\n\nvoid accept(vnx::Visitor& visitor, const mmx::vm::varptr_t& value)\n{\n\tconst auto var = value.get();\n\tswitch(var ? var->type : mmx::vm::TYPE_NIL) {\n\t\tcase mmx::vm::TYPE_NIL:\n\t\t\tvisitor.visit_null();\n\t\t\tbreak;\n\t\tcase mmx::vm::TYPE_TRUE:\n\t\t\tvisitor.visit(true);\n\t\t\tbreak;\n\t\tcase mmx::vm::TYPE_FALSE:\n\t\t\tvisitor.visit(false);\n\t\t\tbreak;\n\t\tcase mmx::vm::TYPE_UINT: {\n\t\t\tconst auto& value = ((const mmx::vm::uint_t*)var)->value;\n\t\t\tif(value >> 64) {\n\t\t\t\tvisitor.visit(\"0x\" + value.str(16));\n\t\t\t} else {\n\t\t\t\tvisitor.visit(value.lower().lower());\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tcase mmx::vm::TYPE_STRING: {\n\t\t\tvisitor.visit(((const mmx::vm::binary_t*)var)->to_string());\n\t\t\tbreak;\n\t\t}\n\t\tcase mmx::vm::TYPE_BINARY: {\n\t\t\tconst auto* bin = ((const mmx::vm::binary_t*)var);\n\t\t\tvisitor.visit(bin->data(), bin->size);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tvisitor.visit(\"vartype_e(\" + std::to_string(int(var->type)) + \")\");\n\t}\n}\n\n\n} // vnx\n"
  },
  {
    "path": "src/vm_interface.cpp",
    "content": "/*\n * vm_interface.cpp\n *\n *  Created on: May 12, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/Engine.h>\n#include <mmx/vm_interface.h>\n#include <mmx/uint128.hpp>\n#include <mmx/helpers.h>\n\n#include <vnx/vnx.h>\n\n\nnamespace mmx {\nnamespace vm {\n\nconst contract::method_t* find_method(std::shared_ptr<const contract::Binary> binary, const std::string& method_name)\n{\n\tauto iter = binary->methods.find(method_name);\n\tif(iter != binary->methods.end()) {\n\t\treturn &iter->second;\n\t}\n\treturn nullptr;\n}\n\nvoid set_deposit(std::shared_ptr<vm::Engine> engine, const addr_t& currency, const uint128& amount)\n{\n\tconst auto addr = vm::MEM_EXTERN + vm::EXTERN_DEPOSIT;\n\tengine->assign(addr, std::make_unique<vm::array_t>());\n\tengine->push_back(addr, to_binary(currency));\n\tengine->push_back(addr, vm::uint_t(amount));\n}\n\nstd::vector<std::unique_ptr<vm::var_t>> read_constants(const uint8_t* constant, const size_t constant_size)\n{\n\tsize_t offset = 0;\n\tstd::vector<std::unique_ptr<vm::var_t>> out;\n\twhile(offset < constant_size) {\n\t\tstd::unique_ptr<vm::var_t> var;\n\t\toffset += vm::deserialize(var, constant + offset, constant_size - offset, false, false);\n\t\tout.push_back(std::move(var));\n\t}\n\treturn out;\n}\n\nstd::vector<std::unique_ptr<vm::var_t>> read_constants(std::shared_ptr<const contract::Binary> binary)\n{\n\treturn read_constants(binary->constant.data(), binary->constant.size());\n}\n\nvoid load(\tstd::shared_ptr<vm::Engine> engine,\n\t\t\tstd::shared_ptr<const contract::Binary> binary)\n{\n\tuint64_t dst = 0;\n\tfor(auto& var : read_constants(binary)) {\n\t\tif(dst < vm::MEM_EXTERN) {\n\t\t\tengine->assign(dst++, std::move(var));\n\t\t}\n\t}\n\tif(dst >= vm::MEM_EXTERN) {\n\t\tthrow std::runtime_error(\"constant memory overflow\");\n\t}\n\tvm::deserialize(engine->code, binary->binary.data(), binary->binary.size());\n\n\tengine->init();\n\tengine->check_gas();\n}\n\nvoid copy(std::shared_ptr<vm::Engine> dst, std::shared_ptr<vm::Engine> src, const uint64_t dst_addr, const uint64_t src_addr, size_t call_depth);\n\nvoid copy(\tstd::shared_ptr<vm::Engine> dst, std::shared_ptr<vm::Engine> src,\n\t\t\tconst uint64_t dst_addr, const uint64_t* dst_key, const vm::var_t* var, size_t call_depth)\n{\n\tif(++call_depth > vm::MAX_COPY_RECURSION) {\n\t\tthrow std::runtime_error(\"copy recursion overflow\");\n\t}\n\tconst vm::var_t* out = nullptr;\n\tstd::unique_ptr<vm::var_t> tmp;\n\tif(var) {\n\t\tswitch(var->type) {\n\t\t\tcase vm::TYPE_REF: {\n\t\t\t\tconst auto heap = dst->alloc();\n\t\t\t\tcopy(dst, src, heap, ((const vm::ref_t*)var)->address, call_depth);\n\t\t\t\ttmp = std::make_unique<vm::ref_t>(heap);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase vm::TYPE_ARRAY: {\n\t\t\t\tif(dst_key) {\n\t\t\t\t\tthrow std::logic_error(\"cannot assign array here\");\n\t\t\t\t}\n\t\t\t\tconst auto array = (const vm::array_t*)var;\n\t\t\t\tdst->assign(dst_addr, std::make_unique<vm::array_t>(array->size));\n\n\t\t\t\tfor(uint64_t i = 0; i < array->size; ++i) {\n\t\t\t\t\tcopy(dst, src, dst_addr, &i, src->read_entry(array->address, i), call_depth);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase vm::TYPE_MAP: {\n\t\t\t\tif(dst_key) {\n\t\t\t\t\tthrow std::logic_error(\"cannot assign map here\");\n\t\t\t\t}\n\t\t\t\tconst auto map = (const vm::map_t*)var;\n\t\t\t\tif(map->flags & FLAG_STORED) {\n\t\t\t\t\tthrow std::logic_error(\"cannot copy map from storage at \" + to_hex(map->address));\n\t\t\t\t}\n\t\t\t\tdst->assign(dst_addr, std::make_unique<vm::map_t>());\n\n\t\t\t\tfor(const auto& entry : src->find_entries(map->address)) {\n\t\t\t\t\tconst auto key = dst->lookup(src->read(entry.first), false);\n\t\t\t\t\tcopy(dst, src, dst_addr, &key, entry.second, call_depth);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tout = var;\n\t\t}\n\t}\n\tif(!out) {\n\t\tout = tmp.get();\n\t}\n\tif(out) {\n\t\tif(dst_key) {\n\t\t\tdst->write_entry(dst_addr, *dst_key, *out);\n\t\t} else {\n\t\t\tdst->write(dst_addr, *out);\n\t\t}\n\t}\n\tdst->check_gas();\n}\n\nvoid copy(std::shared_ptr<vm::Engine> dst, std::shared_ptr<vm::Engine> src, const uint64_t dst_addr, const uint64_t src_addr, size_t call_depth)\n{\n\tcopy(dst, src, dst_addr, nullptr, src->read(src_addr), call_depth);\n}\n\nvoid copy(std::shared_ptr<vm::Engine> dst, std::shared_ptr<vm::Engine> src, const uint64_t dst_addr, const uint64_t src_addr)\n{\n\tcopy(dst, src, dst_addr, src_addr, 0);\n}\n\nclass AssignTo : public vnx::Visitor {\npublic:\n\t// Note: This class is consensus critical.\n\n\tstd::shared_ptr<vm::Engine> engine;\n\n\tAssignTo(std::shared_ptr<vm::Engine> engine, const uint64_t dst)\n\t\t:\tengine(engine)\n\t{\n\t\tframe_t frame;\n\t\tframe.dst = dst;\n\t\tstack.push_back(frame);\n\t}\n\n\tvoid visit_null() override {\n\t\thandle(std::make_unique<vm::var_t>());\n\t}\n\n\tvoid visit(const bool& value) override {\n\t\thandle(std::make_unique<vm::var_t>(value ? vm::TYPE_TRUE : vm::TYPE_FALSE));\n\t}\n\n\tvoid visit(const uint8_t& value) override {\n\t\tvisit(uint256_t(value));\n\t}\n\tvoid visit(const uint16_t& value) override {\n\t\tvisit(uint256_t(value));\n\t}\n\tvoid visit(const uint32_t& value) override {\n\t\tvisit(uint256_t(value));\n\t}\n\tvoid visit(const uint64_t& value) override {\n\t\tvisit(uint256_t(value));\n\t}\n\n\tvoid visit(const int8_t& value) override {\n\t\tif(value < 0) {\n\t\t\tthrow std::logic_error(\"negative values not supported\");\n\t\t}\n\t\tvisit(uint64_t(value));\n\t}\n\tvoid visit(const int16_t& value) override {\n\t\tif(value < 0) {\n\t\t\tthrow std::logic_error(\"negative values not supported\");\n\t\t}\n\t\tvisit(uint64_t(value));\n\t}\n\tvoid visit(const int32_t& value) override {\n\t\tif(value < 0) {\n\t\t\tthrow std::logic_error(\"negative values not supported\");\n\t\t}\n\t\tvisit(uint64_t(value));\n\t}\n\tvoid visit(const int64_t& value) override {\n\t\tif(value < 0) {\n\t\t\tthrow std::logic_error(\"negative values not supported\");\n\t\t}\n\t\tvisit(uint64_t(value));\n\t}\n\n\tvoid visit(const vnx::float32_t& value) override {\n\t\tthrow std::logic_error(\"type float not supported\");\n\t}\n\tvoid visit(const vnx::float64_t& value) override {\n\t\tthrow std::logic_error(\"type double not supported\");\n\t}\n\n\tvoid visit(const std::string& value) override {\n\t\thandle(vm::binary_t::alloc(value));\n\t}\n\n\tvoid visit(const uint8_t* data, const size_t length) override {\n\t\thandle(vm::binary_t::alloc(data, length));\n\t}\n\n\tvoid visit(const uint256_t& value) {\n\t\thandle(std::make_unique<vm::uint_t>(value));\n\t}\n\n\tvoid list_begin(size_t size) override {\n\t\tif(stack.size() >= vm::MAX_COPY_RECURSION) {\n\t\t\tthrow std::logic_error(\"assign recursion overflow\");\n\t\t}\n\t\tconst auto addr = engine->alloc();\n\t\tengine->assign(addr, std::make_unique<vm::array_t>(size));\n\t\tstack.emplace_back(addr);\n\t}\n\tvoid list_element(size_t index) override {\n\t\tstack.back().key = index;\n\t}\n\tvoid list_end(size_t size) override {\n\t\tconst auto addr = stack.back().dst;\n\t\tstack.pop_back();\n\t\thandle(std::make_unique<vm::ref_t>(addr));\n\t}\n\n\tvoid map_begin(size_t size) override {\n\t\tif(stack.size() >= vm::MAX_COPY_RECURSION) {\n\t\t\tthrow std::logic_error(\"assign recursion overflow\");\n\t\t}\n\t\tconst auto addr = engine->alloc();\n\t\tengine->assign(addr, std::make_unique<vm::map_t>());\n\t\tstack.emplace_back(addr);\n\t}\n\tvoid map_key(size_t index) override {\n\t\tstack.back().lookup = true;\n\t}\n\tvoid map_value(size_t index) override {\n\t\tstack.back().lookup = false;\n\t}\n\tvoid map_end(size_t size) override {\n\t\tconst auto addr = stack.back().dst;\n\t\tstack.pop_back();\n\t\thandle(std::make_unique<vm::ref_t>(addr));\n\t}\n\nprivate:\n\tvoid handle(std::unique_ptr<var_t> var) {\n\t\tauto& frame = stack.back();\n\t\tif(frame.lookup) {\n\t\t\tswitch(var->type) {\n\t\t\t\tcase TYPE_UINT:\n\t\t\t\tcase TYPE_STRING:\n\t\t\t\tcase TYPE_BINARY:\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow std::logic_error(\"invalid key type: \" + to_string(var->type));\n\t\t\t}\n\t\t\tframe.key = engine->lookup(*var, false);\n\t\t} else if(frame.key) {\n\t\t\tengine->write_entry(frame.dst, *frame.key, *var);\n\t\t} else {\n\t\t\tengine->assign(frame.dst, std::move(var));\n\t\t}\n\t}\n\nprivate:\n\tstruct frame_t {\n\t\tuint64_t dst = 0;\n\t\tvnx::optional<uint64_t> key;\n\t\tbool lookup = false;\n\t\tframe_t() = default;\n\t\tframe_t(const uint64_t& dst) : dst(dst) {}\n\t};\n\tstd::vector<frame_t> stack;\n\n};\n\nvoid assign(std::shared_ptr<vm::Engine> engine, const uint64_t dst, const vnx::Variant& value)\n{\n\tAssignTo visitor(engine, dst);\n\tvnx::accept(visitor, value);\n}\n\nvnx::Variant convert(std::shared_ptr<vm::Engine> engine, const vm::var_t* var)\n{\n\tif(var) {\n\t\tswitch(var->type) {\n\t\t\tcase vm::TYPE_NIL:\n\t\t\t\treturn vnx::Variant(nullptr);\n\t\t\tcase vm::TYPE_TRUE:\n\t\t\t\treturn vnx::Variant(true);\n\t\t\tcase vm::TYPE_FALSE:\n\t\t\t\treturn vnx::Variant(false);\n\t\t\tcase vm::TYPE_REF:\n\t\t\t\treturn convert(engine, engine->read(((const vm::ref_t*)var)->address));\n\t\t\tcase vm::TYPE_UINT: {\n\t\t\t\tconst auto& value = ((const vm::uint_t*)var)->value;\n\t\t\t\tif(value >> 64 == 0) {\n\t\t\t\t\treturn vnx::Variant(value.lower().lower());\n\t\t\t\t}\n\t\t\t\treturn vnx::Variant(\"0x\" + value.str(16));\n\t\t\t}\n\t\t\tcase vm::TYPE_STRING:\n\t\t\t\treturn vnx::Variant(((const vm::binary_t*)var)->to_string());\n\t\t\tcase vm::TYPE_BINARY:\n\t\t\t\treturn vnx::Variant(((const vm::binary_t*)var)->to_vector());\n\t\t\tcase vm::TYPE_ARRAY: {\n\t\t\t\tconst auto array = (const vm::array_t*)var;\n\t\t\t\tstd::vector<vnx::Variant> tmp;\n\t\t\t\tfor(uint32_t i = 0; i < array->size; ++i) {\n\t\t\t\t\ttmp.push_back(convert(engine, engine->read_entry(array->address, i)));\n\t\t\t\t}\n\t\t\t\treturn vnx::Variant(tmp);\n\t\t\t}\n\t\t\tcase vm::TYPE_MAP: {\n\t\t\t\tconst auto map = (const vm::map_t*)var;\n\t\t\t\tif(map->flags & FLAG_STORED) {\n\t\t\t\t\tthrow std::logic_error(\"cannot read map from storage at \" + to_hex(map->address));\n\t\t\t\t}\n\t\t\t\tstd::map<vnx::Variant, vnx::Variant> tmp;\n\t\t\t\tfor(const auto& entry : engine->find_entries(map->address)) {\n\t\t\t\t\ttmp[convert(engine, engine->read(entry.first))] = convert(engine, entry.second);\n\t\t\t\t}\n\t\t\t\tbool is_object = true;\n\t\t\t\tfor(const auto& entry : tmp) {\n\t\t\t\t\tif(!entry.first.is_string()) {\n\t\t\t\t\t\tis_object = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(is_object) {\n\t\t\t\t\tvnx::Object obj;\n\t\t\t\t\tfor(const auto& entry : tmp) {\n\t\t\t\t\t\tobj[entry.first.to_string_value()] = entry.second;\n\t\t\t\t\t}\n\t\t\t\t\treturn vnx::Variant(obj);\n\t\t\t\t}\n\t\t\t\treturn vnx::Variant(tmp);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn vnx::Variant();\n}\n\nvnx::Variant read(std::shared_ptr<vm::Engine> engine, const uint64_t address)\n{\n\treturn convert(engine, engine->read(address));\n}\n\nvoid set_args(std::shared_ptr<vm::Engine> engine, const std::vector<vnx::Variant>& args)\n{\n\tfor(size_t i = 0; i < args.size(); ++i) {\n\t\tconst auto dst = vm::MEM_STACK + 1 + i;\n\t\tif(dst >= vm::MEM_STATIC) {\n\t\t\tthrow std::runtime_error(\"stack overflow\");\n\t\t}\n\t\tassign(engine, dst, args[i]);\n\t}\n}\n\nvoid execute(std::shared_ptr<vm::Engine> engine, const contract::method_t& method, const bool commit)\n{\n\tengine->begin(method.entry_point);\n\tengine->run();\n\n\tif(!method.is_const && commit) {\n\t\tengine->commit();\n\t}\n\tengine->check_gas();\n}\n\nvoid dump_code(std::ostream& out, std::shared_ptr<const contract::Binary> bin, const vnx::optional<std::string>& method)\n{\n\t{\n\t\tuint32_t i = 0;\n\t\tout << \"constants:\" << std::endl;\n\t\tfor(const auto& var : mmx::vm::read_constants(bin)) {\n\t\t\tout << \"  [0x\" << vnx::to_hex_string(i++) << \"] \" << mmx::vm::to_string(var.get()) << std::endl;\n\t\t}\n\t}\n\tout << \"fields:\" << std::endl;\n\tfor(const auto& entry : bin->fields) {\n\t\tout << \"  [0x\" << vnx::to_hex_string(entry.second) << \"] \" << entry.first << std::endl;\n\t}\n\tstd::map<uint32_t, mmx::contract::method_t> method_table;\n\tfor(const auto& entry : bin->methods) {\n\t\tmethod_table[entry.second.entry_point] = entry.second;\n\t}\n\tstd::vector<mmx::vm::instr_t> code;\n\tconst auto length = mmx::vm::deserialize(code, bin->binary.data(), bin->binary.size());\n\n\tuint32_t i = 0;\n\tif(method) {\n\t\tif(auto tmp = bin->find_method(*method)) {\n\t\t\ti = tmp->entry_point;\n\t\t} else {\n\t\t\tout << \"No such method: \" << *method << std::endl;\n\t\t\treturn;\n\t\t}\n\t}\n\tout << \"code:\" << std::endl;\n\n\tfor(; i < code.size(); ++i) {\n\t\tif(auto entry = find_value(method_table, i)) {\n\t\t\tout << entry->name << \" (\";\n\t\t\tint k = 0;\n\t\t\tfor(const auto& arg : entry->args) {\n\t\t\t\tif(k++) {\n\t\t\t\t\tout << \", \";\n\t\t\t\t}\n\t\t\t\tout << arg;\n\t\t\t}\n\t\t\tout << \")\" << std::endl;\n\t\t}\n\t\tconst auto line = bin->find_line(i);\n\t\tout << \"  [0x\" << vnx::to_hex_string(i) << \", L\" << (line ? *line : -1) << \"] \" << to_string(code[i]) << std::endl;\n\n\t\tif(method && code[i].code == mmx::vm::OP_RET) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(!method) {\n\t\tout << \"Total size: \" << length << \" bytes\" << std::endl;\n\t\tout << \"Total instructions: \" << code.size() << std::endl;\n\t}\n}\n\n\n} // vm\n} // mmx\n"
  },
  {
    "path": "src/wordlist_en.cpp",
    "content": "#include <mmx/mnemonic.h>\n\nnamespace mmx {\nnamespace mnemonic {\n\nconst std::vector<std::string> wordlist_en = {\n\t\"abandon\",\n\t\"ability\",\n\t\"able\",\n\t\"about\",\n\t\"above\",\n\t\"absent\",\n\t\"absorb\",\n\t\"abstract\",\n\t\"absurd\",\n\t\"abuse\",\n\t\"access\",\n\t\"accident\",\n\t\"account\",\n\t\"accuse\",\n\t\"achieve\",\n\t\"acid\",\n\t\"acoustic\",\n\t\"acquire\",\n\t\"across\",\n\t\"act\",\n\t\"action\",\n\t\"actor\",\n\t\"actress\",\n\t\"actual\",\n\t\"adapt\",\n\t\"add\",\n\t\"addict\",\n\t\"address\",\n\t\"adjust\",\n\t\"admit\",\n\t\"adult\",\n\t\"advance\",\n\t\"advice\",\n\t\"aerobic\",\n\t\"affair\",\n\t\"afford\",\n\t\"afraid\",\n\t\"again\",\n\t\"age\",\n\t\"agent\",\n\t\"agree\",\n\t\"ahead\",\n\t\"aim\",\n\t\"air\",\n\t\"airport\",\n\t\"aisle\",\n\t\"alarm\",\n\t\"album\",\n\t\"alcohol\",\n\t\"alert\",\n\t\"alien\",\n\t\"all\",\n\t\"alley\",\n\t\"allow\",\n\t\"almost\",\n\t\"alone\",\n\t\"alpha\",\n\t\"already\",\n\t\"also\",\n\t\"alter\",\n\t\"always\",\n\t\"amateur\",\n\t\"amazing\",\n\t\"among\",\n\t\"amount\",\n\t\"amused\",\n\t\"analyst\",\n\t\"anchor\",\n\t\"ancient\",\n\t\"anger\",\n\t\"angle\",\n\t\"angry\",\n\t\"animal\",\n\t\"ankle\",\n\t\"announce\",\n\t\"annual\",\n\t\"another\",\n\t\"answer\",\n\t\"antenna\",\n\t\"antique\",\n\t\"anxiety\",\n\t\"any\",\n\t\"apart\",\n\t\"apology\",\n\t\"appear\",\n\t\"apple\",\n\t\"approve\",\n\t\"april\",\n\t\"arch\",\n\t\"arctic\",\n\t\"area\",\n\t\"arena\",\n\t\"argue\",\n\t\"arm\",\n\t\"armed\",\n\t\"armor\",\n\t\"army\",\n\t\"around\",\n\t\"arrange\",\n\t\"arrest\",\n\t\"arrive\",\n\t\"arrow\",\n\t\"art\",\n\t\"artefact\",\n\t\"artist\",\n\t\"artwork\",\n\t\"ask\",\n\t\"aspect\",\n\t\"assault\",\n\t\"asset\",\n\t\"assist\",\n\t\"assume\",\n\t\"asthma\",\n\t\"athlete\",\n\t\"atom\",\n\t\"attack\",\n\t\"attend\",\n\t\"attitude\",\n\t\"attract\",\n\t\"auction\",\n\t\"audit\",\n\t\"august\",\n\t\"aunt\",\n\t\"author\",\n\t\"auto\",\n\t\"autumn\",\n\t\"average\",\n\t\"avocado\",\n\t\"avoid\",\n\t\"awake\",\n\t\"aware\",\n\t\"away\",\n\t\"awesome\",\n\t\"awful\",\n\t\"awkward\",\n\t\"axis\",\n\t\"baby\",\n\t\"bachelor\",\n\t\"bacon\",\n\t\"badge\",\n\t\"bag\",\n\t\"balance\",\n\t\"balcony\",\n\t\"ball\",\n\t\"bamboo\",\n\t\"banana\",\n\t\"banner\",\n\t\"bar\",\n\t\"barely\",\n\t\"bargain\",\n\t\"barrel\",\n\t\"base\",\n\t\"basic\",\n\t\"basket\",\n\t\"battle\",\n\t\"beach\",\n\t\"bean\",\n\t\"beauty\",\n\t\"because\",\n\t\"become\",\n\t\"beef\",\n\t\"before\",\n\t\"begin\",\n\t\"behave\",\n\t\"behind\",\n\t\"believe\",\n\t\"below\",\n\t\"belt\",\n\t\"bench\",\n\t\"benefit\",\n\t\"best\",\n\t\"betray\",\n\t\"better\",\n\t\"between\",\n\t\"beyond\",\n\t\"bicycle\",\n\t\"bid\",\n\t\"bike\",\n\t\"bind\",\n\t\"biology\",\n\t\"bird\",\n\t\"birth\",\n\t\"bitter\",\n\t\"black\",\n\t\"blade\",\n\t\"blame\",\n\t\"blanket\",\n\t\"blast\",\n\t\"bleak\",\n\t\"bless\",\n\t\"blind\",\n\t\"blood\",\n\t\"blossom\",\n\t\"blouse\",\n\t\"blue\",\n\t\"blur\",\n\t\"blush\",\n\t\"board\",\n\t\"boat\",\n\t\"body\",\n\t\"boil\",\n\t\"bomb\",\n\t\"bone\",\n\t\"bonus\",\n\t\"book\",\n\t\"boost\",\n\t\"border\",\n\t\"boring\",\n\t\"borrow\",\n\t\"boss\",\n\t\"bottom\",\n\t\"bounce\",\n\t\"box\",\n\t\"boy\",\n\t\"bracket\",\n\t\"brain\",\n\t\"brand\",\n\t\"brass\",\n\t\"brave\",\n\t\"bread\",\n\t\"breeze\",\n\t\"brick\",\n\t\"bridge\",\n\t\"brief\",\n\t\"bright\",\n\t\"bring\",\n\t\"brisk\",\n\t\"broccoli\",\n\t\"broken\",\n\t\"bronze\",\n\t\"broom\",\n\t\"brother\",\n\t\"brown\",\n\t\"brush\",\n\t\"bubble\",\n\t\"buddy\",\n\t\"budget\",\n\t\"buffalo\",\n\t\"build\",\n\t\"bulb\",\n\t\"bulk\",\n\t\"bullet\",\n\t\"bundle\",\n\t\"bunker\",\n\t\"burden\",\n\t\"burger\",\n\t\"burst\",\n\t\"bus\",\n\t\"business\",\n\t\"busy\",\n\t\"butter\",\n\t\"buyer\",\n\t\"buzz\",\n\t\"cabbage\",\n\t\"cabin\",\n\t\"cable\",\n\t\"cactus\",\n\t\"cage\",\n\t\"cake\",\n\t\"call\",\n\t\"calm\",\n\t\"camera\",\n\t\"camp\",\n\t\"can\",\n\t\"canal\",\n\t\"cancel\",\n\t\"candy\",\n\t\"cannon\",\n\t\"canoe\",\n\t\"canvas\",\n\t\"canyon\",\n\t\"capable\",\n\t\"capital\",\n\t\"captain\",\n\t\"car\",\n\t\"carbon\",\n\t\"card\",\n\t\"cargo\",\n\t\"carpet\",\n\t\"carry\",\n\t\"cart\",\n\t\"case\",\n\t\"cash\",\n\t\"casino\",\n\t\"castle\",\n\t\"casual\",\n\t\"cat\",\n\t\"catalog\",\n\t\"catch\",\n\t\"category\",\n\t\"cattle\",\n\t\"caught\",\n\t\"cause\",\n\t\"caution\",\n\t\"cave\",\n\t\"ceiling\",\n\t\"celery\",\n\t\"cement\",\n\t\"census\",\n\t\"century\",\n\t\"cereal\",\n\t\"certain\",\n\t\"chair\",\n\t\"chalk\",\n\t\"champion\",\n\t\"change\",\n\t\"chaos\",\n\t\"chapter\",\n\t\"charge\",\n\t\"chase\",\n\t\"chat\",\n\t\"cheap\",\n\t\"check\",\n\t\"cheese\",\n\t\"chef\",\n\t\"cherry\",\n\t\"chest\",\n\t\"chicken\",\n\t\"chief\",\n\t\"child\",\n\t\"chimney\",\n\t\"choice\",\n\t\"choose\",\n\t\"chronic\",\n\t\"chuckle\",\n\t\"chunk\",\n\t\"churn\",\n\t\"cigar\",\n\t\"cinnamon\",\n\t\"circle\",\n\t\"citizen\",\n\t\"city\",\n\t\"civil\",\n\t\"claim\",\n\t\"clap\",\n\t\"clarify\",\n\t\"claw\",\n\t\"clay\",\n\t\"clean\",\n\t\"clerk\",\n\t\"clever\",\n\t\"click\",\n\t\"client\",\n\t\"cliff\",\n\t\"climb\",\n\t\"clinic\",\n\t\"clip\",\n\t\"clock\",\n\t\"clog\",\n\t\"close\",\n\t\"cloth\",\n\t\"cloud\",\n\t\"clown\",\n\t\"club\",\n\t\"clump\",\n\t\"cluster\",\n\t\"clutch\",\n\t\"coach\",\n\t\"coast\",\n\t\"coconut\",\n\t\"code\",\n\t\"coffee\",\n\t\"coil\",\n\t\"coin\",\n\t\"collect\",\n\t\"color\",\n\t\"column\",\n\t\"combine\",\n\t\"come\",\n\t\"comfort\",\n\t\"comic\",\n\t\"common\",\n\t\"company\",\n\t\"concert\",\n\t\"conduct\",\n\t\"confirm\",\n\t\"congress\",\n\t\"connect\",\n\t\"consider\",\n\t\"control\",\n\t\"convince\",\n\t\"cook\",\n\t\"cool\",\n\t\"copper\",\n\t\"copy\",\n\t\"coral\",\n\t\"core\",\n\t\"corn\",\n\t\"correct\",\n\t\"cost\",\n\t\"cotton\",\n\t\"couch\",\n\t\"country\",\n\t\"couple\",\n\t\"course\",\n\t\"cousin\",\n\t\"cover\",\n\t\"coyote\",\n\t\"crack\",\n\t\"cradle\",\n\t\"craft\",\n\t\"cram\",\n\t\"crane\",\n\t\"crash\",\n\t\"crater\",\n\t\"crawl\",\n\t\"crazy\",\n\t\"cream\",\n\t\"credit\",\n\t\"creek\",\n\t\"crew\",\n\t\"cricket\",\n\t\"crime\",\n\t\"crisp\",\n\t\"critic\",\n\t\"crop\",\n\t\"cross\",\n\t\"crouch\",\n\t\"crowd\",\n\t\"crucial\",\n\t\"cruel\",\n\t\"cruise\",\n\t\"crumble\",\n\t\"crunch\",\n\t\"crush\",\n\t\"cry\",\n\t\"crystal\",\n\t\"cube\",\n\t\"culture\",\n\t\"cup\",\n\t\"cupboard\",\n\t\"curious\",\n\t\"current\",\n\t\"curtain\",\n\t\"curve\",\n\t\"cushion\",\n\t\"custom\",\n\t\"cute\",\n\t\"cycle\",\n\t\"dad\",\n\t\"damage\",\n\t\"damp\",\n\t\"dance\",\n\t\"danger\",\n\t\"daring\",\n\t\"dash\",\n\t\"daughter\",\n\t\"dawn\",\n\t\"day\",\n\t\"deal\",\n\t\"debate\",\n\t\"debris\",\n\t\"decade\",\n\t\"december\",\n\t\"decide\",\n\t\"decline\",\n\t\"decorate\",\n\t\"decrease\",\n\t\"deer\",\n\t\"defense\",\n\t\"define\",\n\t\"defy\",\n\t\"degree\",\n\t\"delay\",\n\t\"deliver\",\n\t\"demand\",\n\t\"demise\",\n\t\"denial\",\n\t\"dentist\",\n\t\"deny\",\n\t\"depart\",\n\t\"depend\",\n\t\"deposit\",\n\t\"depth\",\n\t\"deputy\",\n\t\"derive\",\n\t\"describe\",\n\t\"desert\",\n\t\"design\",\n\t\"desk\",\n\t\"despair\",\n\t\"destroy\",\n\t\"detail\",\n\t\"detect\",\n\t\"develop\",\n\t\"device\",\n\t\"devote\",\n\t\"diagram\",\n\t\"dial\",\n\t\"diamond\",\n\t\"diary\",\n\t\"dice\",\n\t\"diesel\",\n\t\"diet\",\n\t\"differ\",\n\t\"digital\",\n\t\"dignity\",\n\t\"dilemma\",\n\t\"dinner\",\n\t\"dinosaur\",\n\t\"direct\",\n\t\"dirt\",\n\t\"disagree\",\n\t\"discover\",\n\t\"disease\",\n\t\"dish\",\n\t\"dismiss\",\n\t\"disorder\",\n\t\"display\",\n\t\"distance\",\n\t\"divert\",\n\t\"divide\",\n\t\"divorce\",\n\t\"dizzy\",\n\t\"doctor\",\n\t\"document\",\n\t\"dog\",\n\t\"doll\",\n\t\"dolphin\",\n\t\"domain\",\n\t\"donate\",\n\t\"donkey\",\n\t\"donor\",\n\t\"door\",\n\t\"dose\",\n\t\"double\",\n\t\"dove\",\n\t\"draft\",\n\t\"dragon\",\n\t\"drama\",\n\t\"drastic\",\n\t\"draw\",\n\t\"dream\",\n\t\"dress\",\n\t\"drift\",\n\t\"drill\",\n\t\"drink\",\n\t\"drip\",\n\t\"drive\",\n\t\"drop\",\n\t\"drum\",\n\t\"dry\",\n\t\"duck\",\n\t\"dumb\",\n\t\"dune\",\n\t\"during\",\n\t\"dust\",\n\t\"dutch\",\n\t\"duty\",\n\t\"dwarf\",\n\t\"dynamic\",\n\t\"eager\",\n\t\"eagle\",\n\t\"early\",\n\t\"earn\",\n\t\"earth\",\n\t\"easily\",\n\t\"east\",\n\t\"easy\",\n\t\"echo\",\n\t\"ecology\",\n\t\"economy\",\n\t\"edge\",\n\t\"edit\",\n\t\"educate\",\n\t\"effort\",\n\t\"egg\",\n\t\"eight\",\n\t\"either\",\n\t\"elbow\",\n\t\"elder\",\n\t\"electric\",\n\t\"elegant\",\n\t\"element\",\n\t\"elephant\",\n\t\"elevator\",\n\t\"elite\",\n\t\"else\",\n\t\"embark\",\n\t\"embody\",\n\t\"embrace\",\n\t\"emerge\",\n\t\"emotion\",\n\t\"employ\",\n\t\"empower\",\n\t\"empty\",\n\t\"enable\",\n\t\"enact\",\n\t\"end\",\n\t\"endless\",\n\t\"endorse\",\n\t\"enemy\",\n\t\"energy\",\n\t\"enforce\",\n\t\"engage\",\n\t\"engine\",\n\t\"enhance\",\n\t\"enjoy\",\n\t\"enlist\",\n\t\"enough\",\n\t\"enrich\",\n\t\"enroll\",\n\t\"ensure\",\n\t\"enter\",\n\t\"entire\",\n\t\"entry\",\n\t\"envelope\",\n\t\"episode\",\n\t\"equal\",\n\t\"equip\",\n\t\"era\",\n\t\"erase\",\n\t\"erode\",\n\t\"erosion\",\n\t\"error\",\n\t\"erupt\",\n\t\"escape\",\n\t\"essay\",\n\t\"essence\",\n\t\"estate\",\n\t\"eternal\",\n\t\"ethics\",\n\t\"evidence\",\n\t\"evil\",\n\t\"evoke\",\n\t\"evolve\",\n\t\"exact\",\n\t\"example\",\n\t\"excess\",\n\t\"exchange\",\n\t\"excite\",\n\t\"exclude\",\n\t\"excuse\",\n\t\"execute\",\n\t\"exercise\",\n\t\"exhaust\",\n\t\"exhibit\",\n\t\"exile\",\n\t\"exist\",\n\t\"exit\",\n\t\"exotic\",\n\t\"expand\",\n\t\"expect\",\n\t\"expire\",\n\t\"explain\",\n\t\"expose\",\n\t\"express\",\n\t\"extend\",\n\t\"extra\",\n\t\"eye\",\n\t\"eyebrow\",\n\t\"fabric\",\n\t\"face\",\n\t\"faculty\",\n\t\"fade\",\n\t\"faint\",\n\t\"faith\",\n\t\"fall\",\n\t\"false\",\n\t\"fame\",\n\t\"family\",\n\t\"famous\",\n\t\"fan\",\n\t\"fancy\",\n\t\"fantasy\",\n\t\"farm\",\n\t\"fashion\",\n\t\"fat\",\n\t\"fatal\",\n\t\"father\",\n\t\"fatigue\",\n\t\"fault\",\n\t\"favorite\",\n\t\"feature\",\n\t\"february\",\n\t\"federal\",\n\t\"fee\",\n\t\"feed\",\n\t\"feel\",\n\t\"female\",\n\t\"fence\",\n\t\"festival\",\n\t\"fetch\",\n\t\"fever\",\n\t\"few\",\n\t\"fiber\",\n\t\"fiction\",\n\t\"field\",\n\t\"figure\",\n\t\"file\",\n\t\"film\",\n\t\"filter\",\n\t\"final\",\n\t\"find\",\n\t\"fine\",\n\t\"finger\",\n\t\"finish\",\n\t\"fire\",\n\t\"firm\",\n\t\"first\",\n\t\"fiscal\",\n\t\"fish\",\n\t\"fit\",\n\t\"fitness\",\n\t\"fix\",\n\t\"flag\",\n\t\"flame\",\n\t\"flash\",\n\t\"flat\",\n\t\"flavor\",\n\t\"flee\",\n\t\"flight\",\n\t\"flip\",\n\t\"float\",\n\t\"flock\",\n\t\"floor\",\n\t\"flower\",\n\t\"fluid\",\n\t\"flush\",\n\t\"fly\",\n\t\"foam\",\n\t\"focus\",\n\t\"fog\",\n\t\"foil\",\n\t\"fold\",\n\t\"follow\",\n\t\"food\",\n\t\"foot\",\n\t\"force\",\n\t\"forest\",\n\t\"forget\",\n\t\"fork\",\n\t\"fortune\",\n\t\"forum\",\n\t\"forward\",\n\t\"fossil\",\n\t\"foster\",\n\t\"found\",\n\t\"fox\",\n\t\"fragile\",\n\t\"frame\",\n\t\"frequent\",\n\t\"fresh\",\n\t\"friend\",\n\t\"fringe\",\n\t\"frog\",\n\t\"front\",\n\t\"frost\",\n\t\"frown\",\n\t\"frozen\",\n\t\"fruit\",\n\t\"fuel\",\n\t\"fun\",\n\t\"funny\",\n\t\"furnace\",\n\t\"fury\",\n\t\"future\",\n\t\"gadget\",\n\t\"gain\",\n\t\"galaxy\",\n\t\"gallery\",\n\t\"game\",\n\t\"gap\",\n\t\"garage\",\n\t\"garbage\",\n\t\"garden\",\n\t\"garlic\",\n\t\"garment\",\n\t\"gas\",\n\t\"gasp\",\n\t\"gate\",\n\t\"gather\",\n\t\"gauge\",\n\t\"gaze\",\n\t\"general\",\n\t\"genius\",\n\t\"genre\",\n\t\"gentle\",\n\t\"genuine\",\n\t\"gesture\",\n\t\"ghost\",\n\t\"giant\",\n\t\"gift\",\n\t\"giggle\",\n\t\"ginger\",\n\t\"giraffe\",\n\t\"girl\",\n\t\"give\",\n\t\"glad\",\n\t\"glance\",\n\t\"glare\",\n\t\"glass\",\n\t\"glide\",\n\t\"glimpse\",\n\t\"globe\",\n\t\"gloom\",\n\t\"glory\",\n\t\"glove\",\n\t\"glow\",\n\t\"glue\",\n\t\"goat\",\n\t\"goddess\",\n\t\"gold\",\n\t\"good\",\n\t\"goose\",\n\t\"gorilla\",\n\t\"gospel\",\n\t\"gossip\",\n\t\"govern\",\n\t\"gown\",\n\t\"grab\",\n\t\"grace\",\n\t\"grain\",\n\t\"grant\",\n\t\"grape\",\n\t\"grass\",\n\t\"gravity\",\n\t\"great\",\n\t\"green\",\n\t\"grid\",\n\t\"grief\",\n\t\"grit\",\n\t\"grocery\",\n\t\"group\",\n\t\"grow\",\n\t\"grunt\",\n\t\"guard\",\n\t\"guess\",\n\t\"guide\",\n\t\"guilt\",\n\t\"guitar\",\n\t\"gun\",\n\t\"gym\",\n\t\"habit\",\n\t\"hair\",\n\t\"half\",\n\t\"hammer\",\n\t\"hamster\",\n\t\"hand\",\n\t\"happy\",\n\t\"harbor\",\n\t\"hard\",\n\t\"harsh\",\n\t\"harvest\",\n\t\"hat\",\n\t\"have\",\n\t\"hawk\",\n\t\"hazard\",\n\t\"head\",\n\t\"health\",\n\t\"heart\",\n\t\"heavy\",\n\t\"hedgehog\",\n\t\"height\",\n\t\"hello\",\n\t\"helmet\",\n\t\"help\",\n\t\"hen\",\n\t\"hero\",\n\t\"hidden\",\n\t\"high\",\n\t\"hill\",\n\t\"hint\",\n\t\"hip\",\n\t\"hire\",\n\t\"history\",\n\t\"hobby\",\n\t\"hockey\",\n\t\"hold\",\n\t\"hole\",\n\t\"holiday\",\n\t\"hollow\",\n\t\"home\",\n\t\"honey\",\n\t\"hood\",\n\t\"hope\",\n\t\"horn\",\n\t\"horror\",\n\t\"horse\",\n\t\"hospital\",\n\t\"host\",\n\t\"hotel\",\n\t\"hour\",\n\t\"hover\",\n\t\"hub\",\n\t\"huge\",\n\t\"human\",\n\t\"humble\",\n\t\"humor\",\n\t\"hundred\",\n\t\"hungry\",\n\t\"hunt\",\n\t\"hurdle\",\n\t\"hurry\",\n\t\"hurt\",\n\t\"husband\",\n\t\"hybrid\",\n\t\"ice\",\n\t\"icon\",\n\t\"idea\",\n\t\"identify\",\n\t\"idle\",\n\t\"ignore\",\n\t\"ill\",\n\t\"illegal\",\n\t\"illness\",\n\t\"image\",\n\t\"imitate\",\n\t\"immense\",\n\t\"immune\",\n\t\"impact\",\n\t\"impose\",\n\t\"improve\",\n\t\"impulse\",\n\t\"inch\",\n\t\"include\",\n\t\"income\",\n\t\"increase\",\n\t\"index\",\n\t\"indicate\",\n\t\"indoor\",\n\t\"industry\",\n\t\"infant\",\n\t\"inflict\",\n\t\"inform\",\n\t\"inhale\",\n\t\"inherit\",\n\t\"initial\",\n\t\"inject\",\n\t\"injury\",\n\t\"inmate\",\n\t\"inner\",\n\t\"innocent\",\n\t\"input\",\n\t\"inquiry\",\n\t\"insane\",\n\t\"insect\",\n\t\"inside\",\n\t\"inspire\",\n\t\"install\",\n\t\"intact\",\n\t\"interest\",\n\t\"into\",\n\t\"invest\",\n\t\"invite\",\n\t\"involve\",\n\t\"iron\",\n\t\"island\",\n\t\"isolate\",\n\t\"issue\",\n\t\"item\",\n\t\"ivory\",\n\t\"jacket\",\n\t\"jaguar\",\n\t\"jar\",\n\t\"jazz\",\n\t\"jealous\",\n\t\"jeans\",\n\t\"jelly\",\n\t\"jewel\",\n\t\"job\",\n\t\"join\",\n\t\"joke\",\n\t\"journey\",\n\t\"joy\",\n\t\"judge\",\n\t\"juice\",\n\t\"jump\",\n\t\"jungle\",\n\t\"junior\",\n\t\"junk\",\n\t\"just\",\n\t\"kangaroo\",\n\t\"keen\",\n\t\"keep\",\n\t\"ketchup\",\n\t\"key\",\n\t\"kick\",\n\t\"kid\",\n\t\"kidney\",\n\t\"kind\",\n\t\"kingdom\",\n\t\"kiss\",\n\t\"kit\",\n\t\"kitchen\",\n\t\"kite\",\n\t\"kitten\",\n\t\"kiwi\",\n\t\"knee\",\n\t\"knife\",\n\t\"knock\",\n\t\"know\",\n\t\"lab\",\n\t\"label\",\n\t\"labor\",\n\t\"ladder\",\n\t\"lady\",\n\t\"lake\",\n\t\"lamp\",\n\t\"language\",\n\t\"laptop\",\n\t\"large\",\n\t\"later\",\n\t\"latin\",\n\t\"laugh\",\n\t\"laundry\",\n\t\"lava\",\n\t\"law\",\n\t\"lawn\",\n\t\"lawsuit\",\n\t\"layer\",\n\t\"lazy\",\n\t\"leader\",\n\t\"leaf\",\n\t\"learn\",\n\t\"leave\",\n\t\"lecture\",\n\t\"left\",\n\t\"leg\",\n\t\"legal\",\n\t\"legend\",\n\t\"leisure\",\n\t\"lemon\",\n\t\"lend\",\n\t\"length\",\n\t\"lens\",\n\t\"leopard\",\n\t\"lesson\",\n\t\"letter\",\n\t\"level\",\n\t\"liar\",\n\t\"liberty\",\n\t\"library\",\n\t\"license\",\n\t\"life\",\n\t\"lift\",\n\t\"light\",\n\t\"like\",\n\t\"limb\",\n\t\"limit\",\n\t\"link\",\n\t\"lion\",\n\t\"liquid\",\n\t\"list\",\n\t\"little\",\n\t\"live\",\n\t\"lizard\",\n\t\"load\",\n\t\"loan\",\n\t\"lobster\",\n\t\"local\",\n\t\"lock\",\n\t\"logic\",\n\t\"lonely\",\n\t\"long\",\n\t\"loop\",\n\t\"lottery\",\n\t\"loud\",\n\t\"lounge\",\n\t\"love\",\n\t\"loyal\",\n\t\"lucky\",\n\t\"luggage\",\n\t\"lumber\",\n\t\"lunar\",\n\t\"lunch\",\n\t\"luxury\",\n\t\"lyrics\",\n\t\"machine\",\n\t\"mad\",\n\t\"magic\",\n\t\"magnet\",\n\t\"maid\",\n\t\"mail\",\n\t\"main\",\n\t\"major\",\n\t\"make\",\n\t\"mammal\",\n\t\"man\",\n\t\"manage\",\n\t\"mandate\",\n\t\"mango\",\n\t\"mansion\",\n\t\"manual\",\n\t\"maple\",\n\t\"marble\",\n\t\"march\",\n\t\"margin\",\n\t\"marine\",\n\t\"market\",\n\t\"marriage\",\n\t\"mask\",\n\t\"mass\",\n\t\"master\",\n\t\"match\",\n\t\"material\",\n\t\"math\",\n\t\"matrix\",\n\t\"matter\",\n\t\"maximum\",\n\t\"maze\",\n\t\"meadow\",\n\t\"mean\",\n\t\"measure\",\n\t\"meat\",\n\t\"mechanic\",\n\t\"medal\",\n\t\"media\",\n\t\"melody\",\n\t\"melt\",\n\t\"member\",\n\t\"memory\",\n\t\"mention\",\n\t\"menu\",\n\t\"mercy\",\n\t\"merge\",\n\t\"merit\",\n\t\"merry\",\n\t\"mesh\",\n\t\"message\",\n\t\"metal\",\n\t\"method\",\n\t\"middle\",\n\t\"midnight\",\n\t\"milk\",\n\t\"million\",\n\t\"mimic\",\n\t\"mind\",\n\t\"minimum\",\n\t\"minor\",\n\t\"minute\",\n\t\"miracle\",\n\t\"mirror\",\n\t\"misery\",\n\t\"miss\",\n\t\"mistake\",\n\t\"mix\",\n\t\"mixed\",\n\t\"mixture\",\n\t\"mobile\",\n\t\"model\",\n\t\"modify\",\n\t\"mom\",\n\t\"moment\",\n\t\"monitor\",\n\t\"monkey\",\n\t\"monster\",\n\t\"month\",\n\t\"moon\",\n\t\"moral\",\n\t\"more\",\n\t\"morning\",\n\t\"mosquito\",\n\t\"mother\",\n\t\"motion\",\n\t\"motor\",\n\t\"mountain\",\n\t\"mouse\",\n\t\"move\",\n\t\"movie\",\n\t\"much\",\n\t\"muffin\",\n\t\"mule\",\n\t\"multiply\",\n\t\"muscle\",\n\t\"museum\",\n\t\"mushroom\",\n\t\"music\",\n\t\"must\",\n\t\"mutual\",\n\t\"myself\",\n\t\"mystery\",\n\t\"myth\",\n\t\"naive\",\n\t\"name\",\n\t\"napkin\",\n\t\"narrow\",\n\t\"nasty\",\n\t\"nation\",\n\t\"nature\",\n\t\"near\",\n\t\"neck\",\n\t\"need\",\n\t\"negative\",\n\t\"neglect\",\n\t\"neither\",\n\t\"nephew\",\n\t\"nerve\",\n\t\"nest\",\n\t\"net\",\n\t\"network\",\n\t\"neutral\",\n\t\"never\",\n\t\"news\",\n\t\"next\",\n\t\"nice\",\n\t\"night\",\n\t\"noble\",\n\t\"noise\",\n\t\"nominee\",\n\t\"noodle\",\n\t\"normal\",\n\t\"north\",\n\t\"nose\",\n\t\"notable\",\n\t\"note\",\n\t\"nothing\",\n\t\"notice\",\n\t\"novel\",\n\t\"now\",\n\t\"nuclear\",\n\t\"number\",\n\t\"nurse\",\n\t\"nut\",\n\t\"oak\",\n\t\"obey\",\n\t\"object\",\n\t\"oblige\",\n\t\"obscure\",\n\t\"observe\",\n\t\"obtain\",\n\t\"obvious\",\n\t\"occur\",\n\t\"ocean\",\n\t\"october\",\n\t\"odor\",\n\t\"off\",\n\t\"offer\",\n\t\"office\",\n\t\"often\",\n\t\"oil\",\n\t\"okay\",\n\t\"old\",\n\t\"olive\",\n\t\"olympic\",\n\t\"omit\",\n\t\"once\",\n\t\"one\",\n\t\"onion\",\n\t\"online\",\n\t\"only\",\n\t\"open\",\n\t\"opera\",\n\t\"opinion\",\n\t\"oppose\",\n\t\"option\",\n\t\"orange\",\n\t\"orbit\",\n\t\"orchard\",\n\t\"order\",\n\t\"ordinary\",\n\t\"organ\",\n\t\"orient\",\n\t\"original\",\n\t\"orphan\",\n\t\"ostrich\",\n\t\"other\",\n\t\"outdoor\",\n\t\"outer\",\n\t\"output\",\n\t\"outside\",\n\t\"oval\",\n\t\"oven\",\n\t\"over\",\n\t\"own\",\n\t\"owner\",\n\t\"oxygen\",\n\t\"oyster\",\n\t\"ozone\",\n\t\"pact\",\n\t\"paddle\",\n\t\"page\",\n\t\"pair\",\n\t\"palace\",\n\t\"palm\",\n\t\"panda\",\n\t\"panel\",\n\t\"panic\",\n\t\"panther\",\n\t\"paper\",\n\t\"parade\",\n\t\"parent\",\n\t\"park\",\n\t\"parrot\",\n\t\"party\",\n\t\"pass\",\n\t\"patch\",\n\t\"path\",\n\t\"patient\",\n\t\"patrol\",\n\t\"pattern\",\n\t\"pause\",\n\t\"pave\",\n\t\"payment\",\n\t\"peace\",\n\t\"peanut\",\n\t\"pear\",\n\t\"peasant\",\n\t\"pelican\",\n\t\"pen\",\n\t\"penalty\",\n\t\"pencil\",\n\t\"people\",\n\t\"pepper\",\n\t\"perfect\",\n\t\"permit\",\n\t\"person\",\n\t\"pet\",\n\t\"phone\",\n\t\"photo\",\n\t\"phrase\",\n\t\"physical\",\n\t\"piano\",\n\t\"picnic\",\n\t\"picture\",\n\t\"piece\",\n\t\"pig\",\n\t\"pigeon\",\n\t\"pill\",\n\t\"pilot\",\n\t\"pink\",\n\t\"pioneer\",\n\t\"pipe\",\n\t\"pistol\",\n\t\"pitch\",\n\t\"pizza\",\n\t\"place\",\n\t\"planet\",\n\t\"plastic\",\n\t\"plate\",\n\t\"play\",\n\t\"please\",\n\t\"pledge\",\n\t\"pluck\",\n\t\"plug\",\n\t\"plunge\",\n\t\"poem\",\n\t\"poet\",\n\t\"point\",\n\t\"polar\",\n\t\"pole\",\n\t\"police\",\n\t\"pond\",\n\t\"pony\",\n\t\"pool\",\n\t\"popular\",\n\t\"portion\",\n\t\"position\",\n\t\"possible\",\n\t\"post\",\n\t\"potato\",\n\t\"pottery\",\n\t\"poverty\",\n\t\"powder\",\n\t\"power\",\n\t\"practice\",\n\t\"praise\",\n\t\"predict\",\n\t\"prefer\",\n\t\"prepare\",\n\t\"present\",\n\t\"pretty\",\n\t\"prevent\",\n\t\"price\",\n\t\"pride\",\n\t\"primary\",\n\t\"print\",\n\t\"priority\",\n\t\"prison\",\n\t\"private\",\n\t\"prize\",\n\t\"problem\",\n\t\"process\",\n\t\"produce\",\n\t\"profit\",\n\t\"program\",\n\t\"project\",\n\t\"promote\",\n\t\"proof\",\n\t\"property\",\n\t\"prosper\",\n\t\"protect\",\n\t\"proud\",\n\t\"provide\",\n\t\"public\",\n\t\"pudding\",\n\t\"pull\",\n\t\"pulp\",\n\t\"pulse\",\n\t\"pumpkin\",\n\t\"punch\",\n\t\"pupil\",\n\t\"puppy\",\n\t\"purchase\",\n\t\"purity\",\n\t\"purpose\",\n\t\"purse\",\n\t\"push\",\n\t\"put\",\n\t\"puzzle\",\n\t\"pyramid\",\n\t\"quality\",\n\t\"quantum\",\n\t\"quarter\",\n\t\"question\",\n\t\"quick\",\n\t\"quit\",\n\t\"quiz\",\n\t\"quote\",\n\t\"rabbit\",\n\t\"raccoon\",\n\t\"race\",\n\t\"rack\",\n\t\"radar\",\n\t\"radio\",\n\t\"rail\",\n\t\"rain\",\n\t\"raise\",\n\t\"rally\",\n\t\"ramp\",\n\t\"ranch\",\n\t\"random\",\n\t\"range\",\n\t\"rapid\",\n\t\"rare\",\n\t\"rate\",\n\t\"rather\",\n\t\"raven\",\n\t\"raw\",\n\t\"razor\",\n\t\"ready\",\n\t\"real\",\n\t\"reason\",\n\t\"rebel\",\n\t\"rebuild\",\n\t\"recall\",\n\t\"receive\",\n\t\"recipe\",\n\t\"record\",\n\t\"recycle\",\n\t\"reduce\",\n\t\"reflect\",\n\t\"reform\",\n\t\"refuse\",\n\t\"region\",\n\t\"regret\",\n\t\"regular\",\n\t\"reject\",\n\t\"relax\",\n\t\"release\",\n\t\"relief\",\n\t\"rely\",\n\t\"remain\",\n\t\"remember\",\n\t\"remind\",\n\t\"remove\",\n\t\"render\",\n\t\"renew\",\n\t\"rent\",\n\t\"reopen\",\n\t\"repair\",\n\t\"repeat\",\n\t\"replace\",\n\t\"report\",\n\t\"require\",\n\t\"rescue\",\n\t\"resemble\",\n\t\"resist\",\n\t\"resource\",\n\t\"response\",\n\t\"result\",\n\t\"retire\",\n\t\"retreat\",\n\t\"return\",\n\t\"reunion\",\n\t\"reveal\",\n\t\"review\",\n\t\"reward\",\n\t\"rhythm\",\n\t\"rib\",\n\t\"ribbon\",\n\t\"rice\",\n\t\"rich\",\n\t\"ride\",\n\t\"ridge\",\n\t\"rifle\",\n\t\"right\",\n\t\"rigid\",\n\t\"ring\",\n\t\"riot\",\n\t\"ripple\",\n\t\"risk\",\n\t\"ritual\",\n\t\"rival\",\n\t\"river\",\n\t\"road\",\n\t\"roast\",\n\t\"robot\",\n\t\"robust\",\n\t\"rocket\",\n\t\"romance\",\n\t\"roof\",\n\t\"rookie\",\n\t\"room\",\n\t\"rose\",\n\t\"rotate\",\n\t\"rough\",\n\t\"round\",\n\t\"route\",\n\t\"royal\",\n\t\"rubber\",\n\t\"rude\",\n\t\"rug\",\n\t\"rule\",\n\t\"run\",\n\t\"runway\",\n\t\"rural\",\n\t\"sad\",\n\t\"saddle\",\n\t\"sadness\",\n\t\"safe\",\n\t\"sail\",\n\t\"salad\",\n\t\"salmon\",\n\t\"salon\",\n\t\"salt\",\n\t\"salute\",\n\t\"same\",\n\t\"sample\",\n\t\"sand\",\n\t\"satisfy\",\n\t\"satoshi\",\n\t\"sauce\",\n\t\"sausage\",\n\t\"save\",\n\t\"say\",\n\t\"scale\",\n\t\"scan\",\n\t\"scare\",\n\t\"scatter\",\n\t\"scene\",\n\t\"scheme\",\n\t\"school\",\n\t\"science\",\n\t\"scissors\",\n\t\"scorpion\",\n\t\"scout\",\n\t\"scrap\",\n\t\"screen\",\n\t\"script\",\n\t\"scrub\",\n\t\"sea\",\n\t\"search\",\n\t\"season\",\n\t\"seat\",\n\t\"second\",\n\t\"secret\",\n\t\"section\",\n\t\"security\",\n\t\"seed\",\n\t\"seek\",\n\t\"segment\",\n\t\"select\",\n\t\"sell\",\n\t\"seminar\",\n\t\"senior\",\n\t\"sense\",\n\t\"sentence\",\n\t\"series\",\n\t\"service\",\n\t\"session\",\n\t\"settle\",\n\t\"setup\",\n\t\"seven\",\n\t\"shadow\",\n\t\"shaft\",\n\t\"shallow\",\n\t\"share\",\n\t\"shed\",\n\t\"shell\",\n\t\"sheriff\",\n\t\"shield\",\n\t\"shift\",\n\t\"shine\",\n\t\"ship\",\n\t\"shiver\",\n\t\"shock\",\n\t\"shoe\",\n\t\"shoot\",\n\t\"shop\",\n\t\"short\",\n\t\"shoulder\",\n\t\"shove\",\n\t\"shrimp\",\n\t\"shrug\",\n\t\"shuffle\",\n\t\"shy\",\n\t\"sibling\",\n\t\"sick\",\n\t\"side\",\n\t\"siege\",\n\t\"sight\",\n\t\"sign\",\n\t\"silent\",\n\t\"silk\",\n\t\"silly\",\n\t\"silver\",\n\t\"similar\",\n\t\"simple\",\n\t\"since\",\n\t\"sing\",\n\t\"siren\",\n\t\"sister\",\n\t\"situate\",\n\t\"six\",\n\t\"size\",\n\t\"skate\",\n\t\"sketch\",\n\t\"ski\",\n\t\"skill\",\n\t\"skin\",\n\t\"skirt\",\n\t\"skull\",\n\t\"slab\",\n\t\"slam\",\n\t\"sleep\",\n\t\"slender\",\n\t\"slice\",\n\t\"slide\",\n\t\"slight\",\n\t\"slim\",\n\t\"slogan\",\n\t\"slot\",\n\t\"slow\",\n\t\"slush\",\n\t\"small\",\n\t\"smart\",\n\t\"smile\",\n\t\"smoke\",\n\t\"smooth\",\n\t\"snack\",\n\t\"snake\",\n\t\"snap\",\n\t\"sniff\",\n\t\"snow\",\n\t\"soap\",\n\t\"soccer\",\n\t\"social\",\n\t\"sock\",\n\t\"soda\",\n\t\"soft\",\n\t\"solar\",\n\t\"soldier\",\n\t\"solid\",\n\t\"solution\",\n\t\"solve\",\n\t\"someone\",\n\t\"song\",\n\t\"soon\",\n\t\"sorry\",\n\t\"sort\",\n\t\"soul\",\n\t\"sound\",\n\t\"soup\",\n\t\"source\",\n\t\"south\",\n\t\"space\",\n\t\"spare\",\n\t\"spatial\",\n\t\"spawn\",\n\t\"speak\",\n\t\"special\",\n\t\"speed\",\n\t\"spell\",\n\t\"spend\",\n\t\"sphere\",\n\t\"spice\",\n\t\"spider\",\n\t\"spike\",\n\t\"spin\",\n\t\"spirit\",\n\t\"split\",\n\t\"spoil\",\n\t\"sponsor\",\n\t\"spoon\",\n\t\"sport\",\n\t\"spot\",\n\t\"spray\",\n\t\"spread\",\n\t\"spring\",\n\t\"spy\",\n\t\"square\",\n\t\"squeeze\",\n\t\"squirrel\",\n\t\"stable\",\n\t\"stadium\",\n\t\"staff\",\n\t\"stage\",\n\t\"stairs\",\n\t\"stamp\",\n\t\"stand\",\n\t\"start\",\n\t\"state\",\n\t\"stay\",\n\t\"steak\",\n\t\"steel\",\n\t\"stem\",\n\t\"step\",\n\t\"stereo\",\n\t\"stick\",\n\t\"still\",\n\t\"sting\",\n\t\"stock\",\n\t\"stomach\",\n\t\"stone\",\n\t\"stool\",\n\t\"story\",\n\t\"stove\",\n\t\"strategy\",\n\t\"street\",\n\t\"strike\",\n\t\"strong\",\n\t\"struggle\",\n\t\"student\",\n\t\"stuff\",\n\t\"stumble\",\n\t\"style\",\n\t\"subject\",\n\t\"submit\",\n\t\"subway\",\n\t\"success\",\n\t\"such\",\n\t\"sudden\",\n\t\"suffer\",\n\t\"sugar\",\n\t\"suggest\",\n\t\"suit\",\n\t\"summer\",\n\t\"sun\",\n\t\"sunny\",\n\t\"sunset\",\n\t\"super\",\n\t\"supply\",\n\t\"supreme\",\n\t\"sure\",\n\t\"surface\",\n\t\"surge\",\n\t\"surprise\",\n\t\"surround\",\n\t\"survey\",\n\t\"suspect\",\n\t\"sustain\",\n\t\"swallow\",\n\t\"swamp\",\n\t\"swap\",\n\t\"swarm\",\n\t\"swear\",\n\t\"sweet\",\n\t\"swift\",\n\t\"swim\",\n\t\"swing\",\n\t\"switch\",\n\t\"sword\",\n\t\"symbol\",\n\t\"symptom\",\n\t\"syrup\",\n\t\"system\",\n\t\"table\",\n\t\"tackle\",\n\t\"tag\",\n\t\"tail\",\n\t\"talent\",\n\t\"talk\",\n\t\"tank\",\n\t\"tape\",\n\t\"target\",\n\t\"task\",\n\t\"taste\",\n\t\"tattoo\",\n\t\"taxi\",\n\t\"teach\",\n\t\"team\",\n\t\"tell\",\n\t\"ten\",\n\t\"tenant\",\n\t\"tennis\",\n\t\"tent\",\n\t\"term\",\n\t\"test\",\n\t\"text\",\n\t\"thank\",\n\t\"that\",\n\t\"theme\",\n\t\"then\",\n\t\"theory\",\n\t\"there\",\n\t\"they\",\n\t\"thing\",\n\t\"this\",\n\t\"thought\",\n\t\"three\",\n\t\"thrive\",\n\t\"throw\",\n\t\"thumb\",\n\t\"thunder\",\n\t\"ticket\",\n\t\"tide\",\n\t\"tiger\",\n\t\"tilt\",\n\t\"timber\",\n\t\"time\",\n\t\"tiny\",\n\t\"tip\",\n\t\"tired\",\n\t\"tissue\",\n\t\"title\",\n\t\"toast\",\n\t\"tobacco\",\n\t\"today\",\n\t\"toddler\",\n\t\"toe\",\n\t\"together\",\n\t\"toilet\",\n\t\"token\",\n\t\"tomato\",\n\t\"tomorrow\",\n\t\"tone\",\n\t\"tongue\",\n\t\"tonight\",\n\t\"tool\",\n\t\"tooth\",\n\t\"top\",\n\t\"topic\",\n\t\"topple\",\n\t\"torch\",\n\t\"tornado\",\n\t\"tortoise\",\n\t\"toss\",\n\t\"total\",\n\t\"tourist\",\n\t\"toward\",\n\t\"tower\",\n\t\"town\",\n\t\"toy\",\n\t\"track\",\n\t\"trade\",\n\t\"traffic\",\n\t\"tragic\",\n\t\"train\",\n\t\"transfer\",\n\t\"trap\",\n\t\"trash\",\n\t\"travel\",\n\t\"tray\",\n\t\"treat\",\n\t\"tree\",\n\t\"trend\",\n\t\"trial\",\n\t\"tribe\",\n\t\"trick\",\n\t\"trigger\",\n\t\"trim\",\n\t\"trip\",\n\t\"trophy\",\n\t\"trouble\",\n\t\"truck\",\n\t\"true\",\n\t\"truly\",\n\t\"trumpet\",\n\t\"trust\",\n\t\"truth\",\n\t\"try\",\n\t\"tube\",\n\t\"tuition\",\n\t\"tumble\",\n\t\"tuna\",\n\t\"tunnel\",\n\t\"turkey\",\n\t\"turn\",\n\t\"turtle\",\n\t\"twelve\",\n\t\"twenty\",\n\t\"twice\",\n\t\"twin\",\n\t\"twist\",\n\t\"two\",\n\t\"type\",\n\t\"typical\",\n\t\"ugly\",\n\t\"umbrella\",\n\t\"unable\",\n\t\"unaware\",\n\t\"uncle\",\n\t\"uncover\",\n\t\"under\",\n\t\"undo\",\n\t\"unfair\",\n\t\"unfold\",\n\t\"unhappy\",\n\t\"uniform\",\n\t\"unique\",\n\t\"unit\",\n\t\"universe\",\n\t\"unknown\",\n\t\"unlock\",\n\t\"until\",\n\t\"unusual\",\n\t\"unveil\",\n\t\"update\",\n\t\"upgrade\",\n\t\"uphold\",\n\t\"upon\",\n\t\"upper\",\n\t\"upset\",\n\t\"urban\",\n\t\"urge\",\n\t\"usage\",\n\t\"use\",\n\t\"used\",\n\t\"useful\",\n\t\"useless\",\n\t\"usual\",\n\t\"utility\",\n\t\"vacant\",\n\t\"vacuum\",\n\t\"vague\",\n\t\"valid\",\n\t\"valley\",\n\t\"valve\",\n\t\"van\",\n\t\"vanish\",\n\t\"vapor\",\n\t\"various\",\n\t\"vast\",\n\t\"vault\",\n\t\"vehicle\",\n\t\"velvet\",\n\t\"vendor\",\n\t\"venture\",\n\t\"venue\",\n\t\"verb\",\n\t\"verify\",\n\t\"version\",\n\t\"very\",\n\t\"vessel\",\n\t\"veteran\",\n\t\"viable\",\n\t\"vibrant\",\n\t\"vicious\",\n\t\"victory\",\n\t\"video\",\n\t\"view\",\n\t\"village\",\n\t\"vintage\",\n\t\"violin\",\n\t\"virtual\",\n\t\"virus\",\n\t\"visa\",\n\t\"visit\",\n\t\"visual\",\n\t\"vital\",\n\t\"vivid\",\n\t\"vocal\",\n\t\"voice\",\n\t\"void\",\n\t\"volcano\",\n\t\"volume\",\n\t\"vote\",\n\t\"voyage\",\n\t\"wage\",\n\t\"wagon\",\n\t\"wait\",\n\t\"walk\",\n\t\"wall\",\n\t\"walnut\",\n\t\"want\",\n\t\"warfare\",\n\t\"warm\",\n\t\"warrior\",\n\t\"wash\",\n\t\"wasp\",\n\t\"waste\",\n\t\"water\",\n\t\"wave\",\n\t\"way\",\n\t\"wealth\",\n\t\"weapon\",\n\t\"wear\",\n\t\"weasel\",\n\t\"weather\",\n\t\"web\",\n\t\"wedding\",\n\t\"weekend\",\n\t\"weird\",\n\t\"welcome\",\n\t\"west\",\n\t\"wet\",\n\t\"whale\",\n\t\"what\",\n\t\"wheat\",\n\t\"wheel\",\n\t\"when\",\n\t\"where\",\n\t\"whip\",\n\t\"whisper\",\n\t\"wide\",\n\t\"width\",\n\t\"wife\",\n\t\"wild\",\n\t\"will\",\n\t\"win\",\n\t\"window\",\n\t\"wine\",\n\t\"wing\",\n\t\"wink\",\n\t\"winner\",\n\t\"winter\",\n\t\"wire\",\n\t\"wisdom\",\n\t\"wise\",\n\t\"wish\",\n\t\"witness\",\n\t\"wolf\",\n\t\"woman\",\n\t\"wonder\",\n\t\"wood\",\n\t\"wool\",\n\t\"word\",\n\t\"work\",\n\t\"world\",\n\t\"worry\",\n\t\"worth\",\n\t\"wrap\",\n\t\"wreck\",\n\t\"wrestle\",\n\t\"wrist\",\n\t\"write\",\n\t\"wrong\",\n\t\"yard\",\n\t\"year\",\n\t\"yellow\",\n\t\"you\",\n\t\"young\",\n\t\"youth\",\n\t\"zebra\",\n\t\"zero\",\n\t\"zone\",\n\t\"zoo\",\n};\n}\n}\n"
  },
  {
    "path": "start_harvester.sh",
    "content": "#!/bin/bash\n\nif pgrep -x \"mmx_harvester\" > /dev/null\nthen\n    echo \"Already running\"\n    exit\nfi\n\nDIR=$(dirname \"$0\")\nscreen -S mmx_harvester -d -m ${DIR}/run_harvester.sh $@\n\necho \"Started MMX harvester in screen, to attach type 'screen -r mmx_harvester'.\"\n\n"
  },
  {
    "path": "start_node.sh",
    "content": "#!/bin/bash\n\nif pgrep -x \"mmx_node\" > /dev/null\nthen\n    echo \"Already running\"\n    exit\nfi\n\nDIR=$(dirname \"$0\")\nscreen -S mmx_node -d -m ${DIR}/run_node.sh $@\n\necho \"Started MMX node in screen, to attach type 'screen -r mmx_node'.\"\n\n"
  },
  {
    "path": "start_wallet.sh",
    "content": "#!/bin/bash\n\nif pgrep -x \"mmx_wallet\" > /dev/null\nthen\n    echo \"Already running\"\n    exit\nfi\n\nDIR=$(dirname \"$0\")\nscreen -S mmx_wallet -d -m ${DIR}/run_wallet.sh $@\n\necho \"Started MMX wallet in screen, to attach type 'screen -r mmx_wallet'.\"\n\n"
  },
  {
    "path": "stop_harvester.sh",
    "content": "#!/bin/bash\nkillall mmx_harvester || exit\n"
  },
  {
    "path": "stop_node.sh",
    "content": "#!/bin/bash\nkillall mmx_node || exit\n"
  },
  {
    "path": "stop_wallet.sh",
    "content": "#!/bin/bash\nkillall mmx_wallet || exit\n"
  },
  {
    "path": "test/CMakeLists.txt",
    "content": "\nadd_executable(test_engine test_engine.cpp)\nadd_executable(test_mnemonic test_mnemonic.cpp)\nadd_executable(test_database test_database.cpp)\nadd_executable(test_compiler test_compiler.cpp)\nadd_executable(test_transactions test_transactions.cpp)\nadd_executable(test_swap_algo test_swap_algo.cpp)\nadd_executable(test_database_reads test_database_reads.cpp)\nadd_executable(test_mem_hash test_mem_hash.cpp)\nadd_executable(test_pos_compute test_pos_compute.cpp)\nadd_executable(test_encoding test_encoding.cpp)\nadd_executable(test_score_target test_score_target.cpp)\nadd_executable(test_space_diff test_space_diff.cpp)\nadd_executable(test_execute vm/test_execute.cpp)\nadd_executable(database_fill database_fill.cpp)\n\nadd_executable(test_write_bytes_vitest_gen test_write_bytes_vitest_gen.cpp)\n\nadd_executable(mmx_tests mmx_tests.cpp)\nadd_executable(vm_engine_tests vm/engine_tests.cpp)\nadd_executable(vm_storage_tests vm/storage_tests.cpp)\n\ntarget_link_libraries(test_engine mmx_vm)\ntarget_link_libraries(test_mnemonic mmx_iface)\ntarget_link_libraries(test_database mmx_db mmx_iface)\ntarget_link_libraries(test_compiler mmx_vm mmx_iface)\ntarget_link_libraries(test_transactions mmx_modules)\ntarget_link_libraries(test_swap_algo mmx_iface)\ntarget_link_libraries(test_database_reads mmx_db mmx_iface)\ntarget_link_libraries(database_fill mmx_db mmx_iface)\ntarget_link_libraries(test_mem_hash vnx_base mmx_pos)\ntarget_link_libraries(test_pos_compute mmx_iface mmx_pos)\ntarget_link_libraries(test_space_diff mmx_iface mmx_pos)\ntarget_link_libraries(test_encoding mmx_pos)\ntarget_link_libraries(test_execute mmx_vm mmx_iface)\n\ntarget_link_libraries(mmx_tests mmx_iface mmx_pos)\ntarget_link_libraries(vm_engine_tests mmx_vm)\ntarget_link_libraries(vm_storage_tests mmx_vm)\n\ntarget_link_libraries(test_write_bytes_vitest_gen mmx_iface)\n\nif(CUDA_FOUND)\n\tadd_executable(test_cuda_recompute test_cuda_recompute.cpp)\n\ttarget_link_libraries(test_cuda_recompute mmx_pos mmx_pos_cuda)\nendif()\n"
  },
  {
    "path": "test/README.md",
    "content": "\n## AFL\n\n### Install\n\n```\nsudo apt install llvm clang ninja-build\n\ngit clone https://github.com/AFLplusplus/AFLplusplus\ncd AFLplusplus\nmake distrib\nsudo make install\n```\n\n### Build with AFL\n\n```\nexport AFL_CC_COMPILER=LLVM\n./make_devel.sh -DCMAKE_C_COMPILER=afl-cc -DCMAKE_CXX_COMPILER=afl-c++\n```\n\n### Execute\n\n```\necho core | sudo tee /proc/sys/kernel/core_pattern\n```\n\n```\nAFL_SKIP_CPUFREQ=1 afl-fuzz -a binary -i test/vm/AFL/inputs/ -o test/vm/AFL/outputs/ ./build/test/test_execute @@\n```\n"
  },
  {
    "path": "test/attacks/cross_site_access.html",
    "content": "<html>\n\n<body>\n<script>\nfetch(\"http://localhost:11380/wapi/exit\")\n\t.then(response => console.log(response.text()));\n</script>\n\n<img src=\"http://localhost:11380/wapi/exit\"/>\n</body>\n\n</html>"
  },
  {
    "path": "test/code/contract_01.js",
    "content": "\nvar value = 0;\n\nfunction init() {}\n\nfunction add(count) public {\n\tvalue += count;\n}\n\nfunction increment() public {\n\tvalue++;\n}\n\nfunction get_value() public const {\n\treturn value;\n}\n\nfunction reset() public {\n\tvalue = 0;\n}\n\n"
  },
  {
    "path": "test/code/contract_02.js",
    "content": "\ninterface counter;\n\nfunction init() {}\n\nfunction cross_add(value) public {\n\tcounter.add(value);\n// \trcall(\"counter\", \"add\", value);\n}\n\nfunction cross_increment() public {\n\tcounter.increment();\n// \trcall(\"counter\", \"increment\");\n}\n\nfunction cross_read_update() public {\n\tconst value = counter.get_value();\n// \tconst value = rcall(\"counter\", \"get_value\");\n\tif(value % 2 != 0) {\n\t\tcounter.increment();\n// \t\trcall(\"counter\", \"increment\");\n\t}\n}\n"
  },
  {
    "path": "test/code/instr_loop.js",
    "content": "\nvar value = 0;\nvar array = [];\nvar map = {};\n\n// var string = \"A3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964A\";\n// for(var i = 0; i < 8; ++i) {\n// \tstring = concat(string, string);\n// }\n\n// for(var i = 0; i < 100000; ++i) {\n// \tmap[i] = i;\n// }\n\nfor(var i = 0; i < 100000; ++i)\n{\n// \tvalue = 1;\n// \tvalue = 1 / 115792089237316195423570985008687907853269984665640564039457584007913129639935;\n// \tvalue = 115792089237316195423570985008687907853269984665640564039457584007913129639935 / 11;\n// \tvalue = 115792089237316195423570985008687907853269984665640564039457584007913129639935 / 16;\n// \tvalue = 340282366920938463463374607431768211455 / 11;\n// \tvalue = 18446744073709551615 / 11;\n// \tvalue = 4294967295 / 11;\n// \tvalue = 4294967295 * 4294967295;\n// \tvalue = 18446744073709551615 * 18446744073709551615;\n// \tvalue = 340282366920938463463374607431768211455 * 340282366920938463463374607431768211455;\n// \tvalue = sha256(\"sajvnskjnvcksdjvnksjdnvkjsdnv\");\n// \tvalue = uint(\"18446744073709551615\");\n// \tvalue = uint(\"340282366920938463463374607431768211455\");\n\tvalue = uint(\"115792089237316195423570985008687907853269984665640564039457584007913129639935\");\n// \tvalue = uint(\"0xF3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964A\");\n// \tvalue = binary_hex(\"F3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964AF3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964AF3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964A\");\n// \tvalue = to_string(4294967295);\n// \tvalue = to_string(18446744073709551615);\n// \tvalue = to_string(340282366920938463463374607431768211455);\n// \tvalue = to_string(115792089237316195423570985008687907853269984665640564039457584007913129639935);\n// \tvalue = to_string_hex(115792089237316195423570985008687907853269984665640564039457584007913129639935);\n// \tvalue = bech32(\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\");\n// \tvalue = to_string_bech32(0xF3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964A);\n// \tvalue = ecdsa_verify(\n// \t\tbinary_hex(\"A3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964A\"),\n// \t\tbinary_hex(\"02054191D5103F7A04B2E5B53AF253A6476F11DDCDB3B4134D74CFD642969B082E\"),\n// \t\tbinary_hex(\"C05F13C85BDDFBB0A198697FAAC6973AA008AA45544FB7AB586B636405F73F215237D508C6FAE90C24BE424584640F824864B6FF3F2B99FB2104BBD5743E8E39\")\n// \t);\n// \tvalue = string == string;\n// \tvalue = [];\n// \tpush(array, null);\n// \tpush(array, string);\n// \tmap[i] = i;\n// \tvalue = map[i % 10000];\n// \terase(map, i);\n}\n\n// while(true) {}\n\narray = null;\nmap = null;\n"
  },
  {
    "path": "test/code/test.js",
    "content": "\nfunction func(a, b) { return; }\n\nvar map = {};\n\nvar test = [];\n\nfor(var i = 0, test = 0; i < 6; ++i, i = i + 1) {\n\t++test;\n}\n\nfor(const value of test) {\n\tvalue.field = 123;\n}\n\nvar owner;\n\nfunction check_owner() {\n    if (this.user != owner) {\n        fail(\"user != owner\", 1);\n    }\n    var tmp = to_string_bech32(this.user);\n}\n"
  },
  {
    "path": "test/contracts/MMX_USDM_swap.json",
    "content": "{\n\t\"__type\": \"mmx.contract.Executable\",\n\t\"name\": \"MMX / USDM Swap\",\n\t\"binary\": \"mmx15qd3lrqm7d7jyqx3rrwqav09n8sq2xlwpehq9ydxfn8peyh367lsxfsfqd\",\n\t\"init_args\": [\"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\", \"mmx1gk9s4xg265yxdujagqzu4tzsy3gygycy3nksr9ux8qxj8hs6zgys4shv5n\"]\n}\n"
  },
  {
    "path": "test/contracts/MultiSig.json",
    "content": "{\n\t\"__type\": \"mmx.contract.MultiSig\",\n\t\"num_required\": 1,\n\t\"owners\": [\n\t\t\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\",\n\t\t\"mmx1e7yktu9vpeyq7hx39cmagzfp2um3kddwjf4tlt8j3kmktwc7fk6qmyc6ns\",\n\t\t\"mmx1uj2dth7r9tcn3vas42f0hzz74dkz8ygv59mpx44n7px7j7yhvv4sfmkf0d\"\n\t]\n}"
  },
  {
    "path": "test/contracts/PlotNFT.json",
    "content": "{\n\t\"__type\": \"mmx.contract.Executable\",\n\t\"name\": \"test1\",\n\t\"binary\": \"mmx1cw4nwrhceunjd82tdcauy8yeg8ccygsrx3r4kzr8v35prv482qvqdvz80z\",\n\t\"init_args\": [\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\"]\n}\n"
  },
  {
    "path": "test/contracts/TEST_token.json",
    "content": "{\n\t\"__type\": \"mmx.contract.Executable\",\n\t\"name\": \"Test Token\",\n\t\"symbol\": \"TEST\",\n\t\"decimals\": 3,\n\t\"binary\": \"mmx17pzl9cgmesyjur7rvvev70fx7f55rvyv7549cvrtf7chjml4qh4sryu9yl\",\n\t\"init_args\": [\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\"]\n}\n"
  },
  {
    "path": "test/contracts/contract_01.json",
    "content": "{\n\t\"__type\": \"mmx.contract.Executable\",\n\t\"name\": \"contract_01\",\n\t\"binary\": \"mmx1dr7hxpdcc223hqnjyejvfj87w7jtulr8mglgspcmjm58690320csf5k4s5\",\n\t\"init_args\": []\n}"
  },
  {
    "path": "test/contracts/contract_02.json",
    "content": "{\n\t\"__type\": \"mmx.contract.Executable\",\n\t\"name\": \"contract_02\",\n\t\"binary\": \"mmx1xeux3zlku0w275e7u0llq9yfj6mh97hn4ytueevmwv9e9f9mtudq6gsstv\",\n\t\"init_args\": [],\n\t\"depends\": {\n\t\t\"counter\": \"mmx1886vtx08rt5pd0n6rgp6zagucfr2z70fkhg5erqthftkfmpllm0qvf7xs5\"\n\t}\n}"
  },
  {
    "path": "test/contracts/fixed_price_token.json",
    "content": "{\n\t\"__type\": \"mmx.contract.Executable\",\n\t\"name\": \"Fixed Price Token\",\n\t\"symbol\": \"FIXED\",\n\t\"decimals\": 0,\n\t\"binary\": \"mmx1tyes0rdg7z9a6xqlm8hzlkj9lwpq3j90yda6m7tafyr02kdm08sq4hn5et\",\n\t\"init_args\": [\"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\", \"9223372036854775808\", \"MMX\"]\n}\n"
  },
  {
    "path": "test/contracts/test_Data.json",
    "content": "{\n\t\"__type\": \"mmx.contract.Data\",\n\t\"value\": \"test123\"\n}\n"
  },
  {
    "path": "test/database_fill.cpp",
    "content": "/*\n * database_fill.cpp\n *\n *  Created on: May 24, 2023\n *      Author: mad\n */\n\n#include <mmx/DataBase.h>\n\n\nint main(int argc, char** argv)\n{\n\tconst std::string path = argc > 1 ? std::string(argv[1]) : \"tmp/test_table\";\n\tconst size_t num_rows = argc > 2 ? ::atoi(argv[2]) : 1;\n\tconst size_t key_size = argc > 3 ? ::atoi(argv[3]) : 32;\n\tconst size_t value_size = argc > 4 ? ::atoi(argv[4]) : 32;\n\n\t::srand(::time(nullptr));\n\n\tauto table = std::make_shared<mmx::Table>(path);\n\n\tauto version = table->current_version();\n\n\tstd::vector<uint8_t> key(key_size);\n\tstd::vector<uint8_t> value(value_size);\n\n\tfor(size_t i = 0; i < num_rows; ++i) {\n\t\tfor(size_t k = 0; k < key_size; ++k) {\n\t\t\tkey[k] = ::rand();\n\t\t}\n\t\ttable->insert(\n\t\t\t\tstd::make_shared<mmx::db_val_t>(key.data(), key.size()),\n\t\t\t\tstd::make_shared<mmx::db_val_t>(value.data(), value.size()));\n\n\t\tif(i % 10000 == 0) {\n\t\t\ttable->commit(++version);\n\t\t}\n\t}\n\n\ttable->commit(++version);\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "test/http/test_pipeline.txt",
    "content": "GET /wapi/node/info HTTP/1.1\nHost: localhost\nConnection: keep-alive\n\nGET /wapi/node/info HTTP/1.1\nHost: localhost\nConnection: close\n\n"
  },
  {
    "path": "test/mmx_tests.cpp",
    "content": "/*\n * mmx_tests.cpp\n *\n *  Created on: Dec 16, 2022\n *      Author: mad\n */\n\n#include <mmx/skey_t.hpp>\n#include <mmx/addr_t.hpp>\n#include <mmx/uint128.hpp>\n#include <mmx/fixed128.hpp>\n#include <mmx/tree_hash.h>\n#include <mmx/write_bytes.h>\n#include <mmx/mnemonic.h>\n#include <mmx/utils.h>\n\n#include <mmx/ChainParams.hxx>\n#include <mmx/contract/Data.hxx>\n#include <mmx/contract/Binary.hxx>\n#include <mmx/contract/MultiSig.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/contract/WebData.hxx>\n#include <mmx/contract/MultiSig.hxx>\n#include <mmx/solution/MultiSig.hxx>\n#include <mmx/solution/PubKey.hxx>\n\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/pos/verify.h>\n\n#include <vnx/vnx.h>\n#include <vnx/test/Test.h>\n\n#include <map>\n#include <iostream>\n#include <random>\n\nvoid expect_throw(const std::function<void()>& code)\n{\n\tbool did_throw = false;\n\ttry {\n\t\tcode();\n\t} catch(...) {\n\t\tdid_throw = true;\n\t}\n\tif(!did_throw) {\n\t\tthrow std::logic_error(\"expected failure\");\n\t}\n}\n\nusing namespace mmx;\n\n\nint main(int argc, char** argv)\n{\n\tmmx::secp256k1_init();\n\n\tvnx::test::init(\"mmx\");\n\n\tVNX_TEST_BEGIN(\"uint128\")\n\t{\n\t\tvnx::test::expect(uint128().to_double(), 0);\n\t\tvnx::test::expect(uint128(11).to_double(), 11);\n\t\tvnx::test::expect(uint128(1123456).to_double(), 1123456);\n\t\tvnx::test::expect((uint128(256) / 1).lower(), 256u);\n\t\tvnx::test::expect((uint128(256) / 2).lower(), 128u);\n\t\tvnx::test::expect((uint128(256) / 4).lower(), 64u);\n\t\tvnx::test::expect((uint128(256) / 8).lower(), 32u);\n\t\tvnx::test::expect((uint128(256) / 16).lower(), 16u);\n\t\tvnx::test::expect(vnx::Variant(uint128((uint128_1 << 127) + 3)).to<uint128>(), uint128((uint128_1 << 127) + 3));\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"hash_t\")\n\t{\n\t\tvnx::test::expect(hash_t().to_string(), \"0000000000000000000000000000000000000000000000000000000000000000\");\n\t\tvnx::test::expect(hash_t(std::string()).to_string(), \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\");\n\t\tvnx::test::expect(hash_t::empty().to_string(), \"E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855\");\n\t\tvnx::test::expect(hash_t() < hash_t(), false);\n\t\tvnx::test::expect(hash_t() > hash_t(), false);\n\t\tvnx::test::expect(hash_t() < hash_t(\"1\"), true);\n\t\tvnx::test::expect(hash_t() > hash_t(\"1\"), false);\n\t\tvnx::test::expect(hash_t(\"1\") > hash_t(), true);\n\t\tvnx::test::expect(hash_t(\"1\") < hash_t(), false);\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"addr_t\")\n\t{\n\t\tstd::map<std::pair<addr_t, addr_t>, uint128> balance;\n\t\tbalance[std::make_pair(addr_t(std::string(\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\")), addr_t())] = 1337;\n\n\t\tvnx::test::expect(balance[std::make_pair(addr_t(std::string(\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\")), addr_t())], 1337);\n\t\tvnx::test::expect(balance[std::make_pair(addr_t(std::string(\"mmx1hfyq6t2jartw9f8fkkertepxef0f8egegd3m438ndfttrlhzzmks7c99tv\")), addr_t())], 0);\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"fixed128\")\n\t{\n\t\tvnx::test::expect(fixed128().to_amount(0), 0);\n\t\tvnx::test::expect(fixed128().to_amount(6), 0);\n\t\tvnx::test::expect(fixed128(1).to_amount(0), 1);\n\t\tvnx::test::expect(fixed128(11).to_amount(6), 11000000);\n\t\tvnx::test::expect(fixed128(111, 3).to_string(), \"0.111\");\n\t\tvnx::test::expect(fixed128(1111, 3).to_string(), \"1.111\");\n\t\tvnx::test::expect(fixed128(1.1).to_amount(1), 11);\n\t\tvnx::test::expect(fixed128(1.01).to_amount(4), 10100);\n\t\tvnx::test::expect(fixed128(1.001).to_amount(4), 10010);\n\t\tvnx::test::expect(fixed128(1.0001).to_amount(4), 10001);\n\t\tvnx::test::expect(fixed128(1.00001).to_amount(6), 1000010);\n\t\tvnx::test::expect(fixed128(1.000001).to_amount(6), 1000001);\n\t\tvnx::test::expect(fixed128(\"1\").to_amount(0), 1);\n\t\tvnx::test::expect(fixed128(\"1.\").to_amount(0), 1);\n\t\tvnx::test::expect(fixed128(\"1.0\").to_amount(0), 1);\n\t\tvnx::test::expect(fixed128(\"1.000000\").to_amount(0), 1);\n\t\tvnx::test::expect(fixed128(\"1.2\").to_amount(0), 1);\n\t\tvnx::test::expect(fixed128(\"1,3\").to_amount(1), 13);\n\t\tvnx::test::expect(fixed128(\"1e1\").to_amount(1), 100);\n\t\tvnx::test::expect(fixed128(\"1,1e0\").to_amount(2), 110);\n\t\tvnx::test::expect(fixed128(\"1,1E2\").to_amount(3), 110000);\n\t\tvnx::test::expect(fixed128(\"1,4E-1\").to_amount(2), 14);\n\t\tvnx::test::expect(fixed128(\"123.000000\").to_amount(6), 123000000);\n\t\tvnx::test::expect(fixed128(\"123.000001\").to_amount(6), 123000001);\n\t\tvnx::test::expect(fixed128(\"123.000011\").to_amount(6), 123000011);\n\t\tvnx::test::expect(fixed128(\"0123.012345\").to_amount(6), 123012345);\n\t\tvnx::test::expect(fixed128(\"0123.1123456789\").to_amount(6), 123112345);\n\t\tvnx::test::expect(fixed128(\"1.1\").to_string(), \"1.1\");\n\t\tvnx::test::expect(fixed128(\"1.01\").to_string(), \"1.01\");\n\t\tvnx::test::expect(fixed128(\"1.000001\").to_string(), \"1.000001\");\n\t\tvnx::test::expect(fixed128(\"1.0123456789\").to_string(), \"1.0123456789\");\n\t\tvnx::test::expect(fixed128(\"1.200\").to_string(), \"1.2\");\n\t\tvnx::test::expect(fixed128(\"001.3\").to_string(), \"1.3\");\n\t\tvnx::test::expect(fixed128(\"1.4\").to_value(), 1.4);\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"to_amount()\")\n\t{\n\t\tvnx::test::expect<uint128, uint128>(mmx::to_amount(1.0, int(0)), 1);\n\t\tvnx::test::expect<uint128, uint128>(mmx::to_amount(1337.0, int(0)), 1337);\n\t\tvnx::test::expect<uint128, uint128>(mmx::to_amount(1337.1337, int(4)), 13371337);\n\t\tvnx::test::expect<uint128, uint128>(mmx::to_amount(1337.1337, int(6)), 1337133700);\n\t\tvnx::test::expect<uint128, uint128>(mmx::to_amount(1180591620717411303424.0, int(0)), uint128_1 << 70);\n\t\tvnx::test::expect<uint128, uint128>(mmx::to_amount(10, int(18)), 10000000000000000000ull);\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"calc_tree_hash()\")\n\t{\n\t\tstd::vector<hash_t> list;\n\t\tauto hash = mmx::calc_btree_hash(list);\n\t\tvnx::test::expect(hash, hash_t());\n\n\t\tfor(int i = 0; i < 1000; ++i) {\n\t\t\tlist.push_back(hash_t(std::to_string(i)));\n\t\t\tauto next = mmx::calc_btree_hash(list);\n\t\t\tvnx::test::expect(next != hash, true);\n\t\t\thash = next;\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"is_json()\")\n\t{\n\t\tvnx::test::expect(is_json(vnx::Variant()), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(nullptr)), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(false)), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(true)), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(1)), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(1 << 16)), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(uint64_t(1) << 32)), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(-1)), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(-256)), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(-65536)), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(-4294967296)), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(\"\")), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(\"test\")), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(std::vector<vnx::Variant>{})), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(std::vector<vnx::Variant>{vnx::Variant(1337), vnx::Variant(\"test\")})), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(vnx::Object())), true);\n\t\tvnx::test::expect(is_json(vnx::Variant(vnx::Object({{\"test\", vnx::Variant(1337)}, {\"test1\", vnx::Variant(\"test\")}}))), true);\n\n\t\tvnx::test::expect(is_json(vnx::Variant(std::array<int16_t, 10>())), false);\n\t\tvnx::test::expect(is_json(vnx::Variant(std::vector<uint32_t>{1, 2, 3})), false);\n\t\tvnx::test::expect(is_json(vnx::Variant(std::map<std::string, uint32_t>())), false);\n\t\tvnx::test::expect(is_json(vnx::Variant(std::vector<vnx::Variant>{vnx::Variant(std::vector<uint32_t>{1, 2, 3})})), false);\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"Contract::num_bytes()\")\n\t{\n\t\tauto params = mmx::ChainParams::create();\n\t\tparams->min_txfee_byte = 100;\n\t\tconst std::string str(1024 * 1024, 'A');\n\t\t{\n\t\t\tauto tmp = mmx::contract::Data::create();\n\t\t\ttmp->value = str;\n\t\t\tvnx::test::expect(tmp->num_bytes() > str.size(), true);\n\t\t\tvnx::test::expect(tmp->calc_cost(params) > str.size() * params->min_txfee_byte, true);\n\t\t}\n\t\t{\n\t\t\tauto tmp = mmx::contract::WebData::create();\n\t\t\ttmp->mime_type = str;\n\t\t\ttmp->payload = str;\n\t\t\tvnx::test::expect(tmp->num_bytes() > 2 * str.size(), true);\n\t\t}\n\t\t{\n\t\t\tauto tmp = mmx::contract::Binary::create();\n\t\t\ttmp->binary.resize(str.size());\n\t\t\ttmp->constant.resize(str.size());\n\t\t\ttmp->compiler = str;\n\t\t\ttmp->fields.emplace(str, 0);\n\t\t\ttmp->methods.emplace(str, mmx::contract::method_t());\n\t\t\ttmp->name = str;\n\t\t\ttmp->source = str;\n\t\t\tvnx::test::expect(tmp->num_bytes() > 7 * str.size(), true);\n\t\t}\n\t\t{\n\t\t\tauto tmp = mmx::contract::Binary::create();\n\t\t\tfor(uint32_t i = 0; i < 1024; ++i) {\n\t\t\t\ttmp->line_info.emplace(i, i);\n\t\t\t}\n\t\t\tvnx::test::expect(tmp->num_bytes() > 8 * 1024, true);\n\t\t}\n\t\t{\n\t\t\tauto tmp = mmx::contract::TokenBase::create();\n\t\t\ttmp->meta_data = str;\n\t\t\ttmp->name = str;\n\t\t\ttmp->symbol = str;\n\t\t\tvnx::test::expect(tmp->num_bytes() > 3 * str.size(), true);\n\t\t}\n\t\t{\n\t\t\tauto tmp = mmx::contract::Executable::create();\n\t\t\ttmp->depends.emplace(str, mmx::addr_t());\n\t\t\ttmp->init_args.emplace_back(str);\n\t\t\ttmp->init_method = str;\n\t\t\ttmp->meta_data = str;\n\t\t\ttmp->name = str;\n\t\t\ttmp->symbol = str;\n\t\t\tvnx::test::expect(tmp->num_bytes() > 6 * str.size(), true);\n\t\t}\n\t\t{\n\t\t\tauto tmp = mmx::contract::MultiSig::create();\n\t\t\tfor(uint32_t i = 0; i < 256; ++i) {\n\t\t\t\ttmp->owners.emplace(hash_t(std::to_string(i)));\n\t\t\t}\n\t\t\tvnx::test::expect(tmp->num_bytes() > 32 * 256, true);\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"write_bytes()\")\n\t{\n\t\t{\n\t\t\tconst bool value = true;\n\t\t\tstd::vector<uint8_t> tmp;\n\t\t\tvnx::VectorOutputStream stream(&tmp);\n\t\t\tvnx::OutputBuffer out(&stream);\n\t\t\twrite_bytes(out, value);\n\t\t\tout.flush();\n\t\t\tvnx::test::expect(tmp.size(), 1u);\n\t\t}\n\t\t{\n\t\t\tconst vnx::Variant value(true);\n\t\t\tstd::vector<uint8_t> tmp;\n\t\t\tvnx::VectorOutputStream stream(&tmp);\n\t\t\tvnx::OutputBuffer out(&stream);\n\t\t\twrite_bytes(out, value);\n\t\t\tout.flush();\n\t\t\tvnx::test::expect(tmp.size(), 1u);\n\t\t}\n\t\t{\n\t\t\tconst vnx::Variant value(1337);\n\t\t\tstd::vector<uint8_t> tmp;\n\t\t\tvnx::VectorOutputStream stream(&tmp);\n\t\t\tvnx::OutputBuffer out(&stream);\n\t\t\twrite_bytes(out, value);\n\t\t\tout.flush();\n\t\t\tvnx::test::expect(tmp.size(), 8u);\n\t\t}\n\t\t{\n\t\t\tconst vnx::Variant value(-1337);\n\t\t\tstd::vector<uint8_t> tmp;\n\t\t\tvnx::VectorOutputStream stream(&tmp);\n\t\t\tvnx::OutputBuffer out(&stream);\n\t\t\twrite_bytes(out, value);\n\t\t\tout.flush();\n\t\t\tvnx::test::expect(tmp.size(), 8u);\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"MultiSig\")\n\t{\n\t\tconst hash_t txid;\n\t\tstd::vector<std::pair<skey_t, pubkey_t>> keys;\n\t\tfor(int i = 0; i < 10; ++i) {\n\t\t\tconst auto skey = skey_t(hash_t(std::to_string(i)));\n\t\t\tkeys.emplace_back(skey, pubkey_t(skey));\n\t\t}\n\t\t{\n\t\t\tauto tmp = mmx::contract::MultiSig::create();\n\t\t\tfor(int i = 0; i < 3; ++i) {\n\t\t\t\ttmp->owners.insert(keys[i].second.get_addr());\n\t\t\t}\n\t\t\ttmp->num_required = 1;\n\t\t\tvnx::test::expect(tmp->is_valid(), true);\n\n\t\t\tfor(int i = 0; i < 3; ++i) {\n\t\t\t\tauto sol = mmx::solution::PubKey::create();\n\t\t\t\tsol->pubkey = keys[i].second;\n\t\t\t\tsol->signature = signature_t::sign(keys[i].first, txid);\n\t\t\t\ttmp->validate(sol, txid);\n\t\t\t}\n\t\t\t{\n\t\t\t\tauto sol = mmx::solution::MultiSig::create();\n\t\t\t\tsol->num_required = tmp->num_required;\n\t\t\t\tfor(int i = 0; i < 3; ++i) {\n\t\t\t\t\tauto tmp = mmx::solution::PubKey::create();\n\t\t\t\t\ttmp->pubkey = keys[i].second;\n\t\t\t\t\ttmp->signature = signature_t::sign(keys[i].first, txid);\n\t\t\t\t\tsol->solutions[tmp->pubkey.get_addr()] = tmp;\n\t\t\t\t}\n\t\t\t\ttmp->validate(sol, txid);\n\t\t\t}\n\t\t\t{\n\t\t\t\tauto sol = mmx::solution::PubKey::create();\n\t\t\t\tconst auto skey = skey_t(hash_t::random());\n\t\t\t\tsol->pubkey = pubkey_t(skey);\n\t\t\t\tsol->signature = signature_t::sign(skey, txid);\n\t\t\t\texpect_throw([=]() {\n\t\t\t\t\ttmp->validate(sol, txid);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tauto tmp = mmx::contract::MultiSig::create();\n\t\t\tfor(int i = 0; i < 5; ++i) {\n\t\t\t\ttmp->owners.insert(keys[i].second.get_addr());\n\t\t\t}\n\t\t\ttmp->num_required = 3;\n\t\t\tvnx::test::expect(tmp->is_valid(), true);\n\t\t\t{\n\t\t\t\tauto sol = mmx::solution::MultiSig::create();\n\t\t\t\tfor(int i = 0; i < 3; ++i) {\n\t\t\t\t\tauto tmp = mmx::solution::PubKey::create();\n\t\t\t\t\ttmp->pubkey = keys[i].second;\n\t\t\t\t\ttmp->signature = signature_t::sign(keys[i].first, txid);\n\t\t\t\t\tsol->solutions[tmp->pubkey.get_addr()] = tmp;\n\t\t\t\t}\n\t\t\t\ttmp->validate(sol, txid);\n\t\t\t}\n\t\t\t{\n\t\t\t\tauto sol = mmx::solution::MultiSig::create();\n\t\t\t\tfor(int i = 2; i < 5; ++i) {\n\t\t\t\t\tauto tmp = mmx::solution::PubKey::create();\n\t\t\t\t\ttmp->pubkey = keys[i].second;\n\t\t\t\t\ttmp->signature = signature_t::sign(keys[i].first, txid);\n\t\t\t\t\tsol->solutions[tmp->pubkey.get_addr()] = tmp;\n\t\t\t\t}\n\t\t\t\ttmp->validate(sol, txid);\n\t\t\t}\n\t\t\t{\n\t\t\t\tauto sol = mmx::solution::MultiSig::create();\n\t\t\t\tfor(uint32_t i = 0; i < tmp->num_required; ++i) {\n\t\t\t\t\tauto tmp = mmx::solution::PubKey::create();\n\t\t\t\t\tconst auto skey = skey_t(hash_t::random());\n\t\t\t\t\ttmp->pubkey = skey;\n\t\t\t\t\ttmp->signature = signature_t::sign(skey, txid);\n\t\t\t\t\tsol->solutions[tmp->pubkey.get_addr()] = tmp;\n\t\t\t\t}\n\t\t\t\texpect_throw([=]() {\n\t\t\t\t\ttmp->validate(sol, txid);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"proof_verify\")\n\t{\n\t\tmmx::hash_t plot_id;\n\t\tmmx::hash_t challenge;\n\t\tstd::vector<uint32_t> x_values;\n\t\tvnx::from_string(\"156EBEA58EF0E25E9647C87380238F45E4E446114ED78F6B40C626319EE7DD21\", challenge);\n\t\tvnx::from_string(\"60C67427E27FBD77C8BDFF5EB1CC3696C08926FA12BCE8B1AE48E87099F9366B\", plot_id);\n\t\tvnx::from_string(\"[3684070240, 4088919472, 4255854024, 2557705011, 2826775019, 784116104, 3002057429, 1544955509, 1600690361, 1551417277, 2728397286, 1771107893, 1187799433, 1044600637, 1880286022, 1921473397, 4059605908, 3921758377, 1663788388, 2187951111, 1469314847, 2221602546, 3049849478, 2483049477, 783906790, 1769349661, 627534699, 1664365119, 3108470239, 4050165503, 1719994423, 2296755013, 3689388662, 173076783, 178304083, 3395522713, 1454472817, 3194528037, 1512291786, 1987638418, 1143780087, 3120478614, 2855051906, 693584283, 3818941816, 4127002689, 2989697755, 3891407791, 2509655266, 4258376726, 1843252036, 3191219821, 2088352375, 213252018, 4115819364, 3175076101, 3561808706, 1948511669, 3322128563, 3750559212, 2272209440, 1293941526, 437177217, 2820197201, 3807400022, 7496129, 2683510002, 3807839482, 2233243744, 2411092355, 1331204979, 2038088672, 2167782813, 3830146105, 537456114, 2401528407, 2652250456, 2221908904, 890566783, 708924513, 2596290458, 340917615, 3250050811, 3771386335, 3494357838, 1179822413, 2341748577, 602106011, 1122065619, 252962133, 278550961, 1768804869, 669497081, 1990086308, 2491380917, 51625349, 4207300886, 3095591768, 1852131389, 609642249, 2918683512, 2059312217, 3335572914, 2736167997, 1528047374, 4124848408, 902683345, 4263117025, 108772979, 485864815, 2410357795, 908723453, 1183430568, 2815414658, 2737238764, 2669408162, 2850938826, 2890536155, 491707862, 2553723643, 1034532861, 3214153497, 3097594346, 2701020101, 678153046, 2932267943, 1365864923, 532310940, 2351720145, 4080824906, 2893128375, 2595930727, 1064911548, 3834810248, 3565525092, 163085774, 685730942, 2810511962, 2540444228, 1857924416, 4174369771, 2145288036, 587439552, 718732787, 1169724691, 3254817017, 3946843084, 954721517, 3373230078, 3637676521, 1331632982, 4086478124, 4116294100, 4120279824, 476981752, 2430423022, 220679215, 4117454286, 4166904409, 2171504903, 2001727739, 3383221100, 2596677253, 988991329, 2638232513, 1095569023, 3303068778, 1931231583, 2226576220, 1480273400, 3911488963, 1608929138, 1376754282, 61629307, 3957255986, 514129543, 2169952004, 3308565016, 3572656193, 1573653323, 961047589, 2310528924, 2099635716, 817068327, 3653864895, 4168803514, 2147588334, 2794673138, 492271828, 3268899536, 1623851505, 1985375222, 396546240, 3609981176, 2079278511, 2161006185, 2007577134, 2954139926, 1277553298, 3205868414, 4257573912, 3376256719, 4227206123, 585150605, 2904436845, 2619013042, 3125718317, 3035845111, 2049651560, 161957643, 393761167, 2783560380, 1211203226, 3313590097, 479870197, 830535414, 3613172362, 3953259697, 265953611, 1493207470, 955279780, 2133758876, 2884678190, 3234737433, 1365475005, 2908229202, 2072744826, 4263640821, 2236131683, 894009793, 307201858, 3291293763, 2184230914, 776021200, 867100221, 4032840254, 2454442006, 1289389606, 1247346023, 386849697, 1757849095, 973341783, 3958516371, 1277136670, 205471439, 2514111789, 1777386820, 1436581469, 1494466641, 512070215, 2845825157, 329403080, 1115243938, 4009264613, 3806285763, 3170487941]\", x_values);\n\n\t\tconst auto plot_challenge = get_plot_challenge(challenge, plot_id);\n\t\tmmx::pos::verify(x_values, plot_challenge, plot_id, 4, 0, 32, false);\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"proof_order\")\n\t{\n\t\tmmx::ProofOfSpaceOG proof;\n\t\tvnx::from_string(\"{\\\n\t\t\t\\\"plot_id\\\": \\\"8FA05447F4F0849B7875E0D0D25B99360F8A7981C67DE7CA5FCF1E1483089F82\\\",\\\n\t\t\t\\\"challenge\\\": \\\"3BD3D3158D26678DBD4910F4F8975F5177C4C45A5B68D52686939566C5D88239\\\",\\\n\t\t\t\\\"farmer_key\\\": \\\"027D7562FB5A8967E57A22F876302F75BA3AE3980607FB32E4439681F820AE398F\\\",\\\n\t\t\t\\\"ksize\\\": 29,\\\n\t\t\t\\\"seed\\\": \\\"B655BE5A884F7CC18FB3D423F6E9D48B229DD13DD1CC3B9D7A165012077D49D3\\\",\\\n\t\t\t\\\"proof_xs\\\": [41526030, 190034280, 27487774, 360531876, 157328122, 533344899, 348912715, 158286857, 500512399, 286789283, 309409411, 33301427, 291496595, 292537, 431952279, 209584997, 111041179, 225686812, 377306265, 45918619, 136492725, 443847657, 63762825, 455772217, 299457809, 62819158, 423066079, 70184667, 116121877, 262069313, 94597380, 277096972, 178726801, 264024912, 497654815, 81149636, 201256170, 209529847, 86228594, 32668245, 122504482, 174029193, 404468875, 222875439, 241585134, 438378901, 310806690, 77808852, 506242593, 337807442, 171130081, 360833911, 483590771, 498133539, 78329797, 41557646, 163327753, 315798381, 131747531, 361264561, 216455451, 179665178, 51870911, 429035183, 295349671, 152798101, 253786116, 433103191, 476044027, 346642880, 47227825, 208846273, 206436033, 245874067, 427075796, 180779200, 410970246, 1143092, 50889398, 224426279, 375125060, 188487454, 319636984, 272259131, 377087291, 271901983, 531636482, 454874007, 274228377, 431843070, 523612467, 361408983, 423618927, 339345523, 86142409, 160801159, 22024508, 233678781, 241239177, 475088783, 400172747, 362038581, 429952975, 121634389, 179032692, 152394426, 223298082, 93030597, 63400229, 175256560, 530644023, 21993664, 153789041, 515107385, 135370091, 156498932, 72211704, 400919262, 136383461, 504380151, 239462247, 184409768, 245564618, 264419588, 183760152, 303573155, 280701899, 412267540, 281366400, 318612884, 281199257, 28786199, 280595286, 469254350, 516006656, 76648711, 534052766, 109825608, 383408610, 400602196, 201747007, 232103494, 225366639, 473932026, 373853689, 523521134, 385137715, 297896772, 460856009, 253065215, 191027004, 302714203, 102745112, 118857551, 531336719, 298547044, 308312588, 441150850, 177353289, 366287353, 117270343, 323760640, 436125237, 193628024, 496102441, 192425221, 174984738, 267393617, 119828474, 382207855, 157357834, 102830320, 69524625, 32453159, 470198640, 253550250, 12023423, 143563219, 38100930, 259685561, 358040000, 277554148, 502359901, 375665759, 268245745, 193785837, 21177576, 97132723, 237830009, 390049154, 424082856, 287383135, 482999386, 93334862, 211737164, 32954960, 379554381, 329067393, 322071582, 452967760, 223523925, 394112637, 91770475, 33515598, 41541163, 159354561, 448723432, 360714676, 298810627, 463092740, 8253330, 416722492, 172191294, 358486549, 286025427, 260690064, 290924466, 157109118, 14568701, 256902937, 225155064, 507728616, 21730277, 31804253, 365161673, 184388967, 36778686, 241694509, 71357500, 429209559, 275960351, 244822214, 345055770, 122399096, 93423247, 5590085, 299893246, 386457316, 300993063, 533350058, 313848074, 106703937, 516682805, 49602142, 321158224, 265493627, 329208949, 45211675, 112966538, 523299896, 80915641, 499055347, 124794444, 78543398, 155955534, 393135459]\\\n\t\t}\", proof);\n\n\t\tconst auto plot_filter = 4;\n\t\tconst auto plot_challenge = get_plot_challenge(proof.challenge, proof.plot_id);\n\n\t\tmmx::pos::verify(proof.proof_xs, plot_challenge, proof.plot_id, plot_filter, 0, proof.ksize, false);\n\n\t\tstd::default_random_engine engine;\n\t\tfor(int i = 0; i < 100; ++i) {\n\t\t\tstd::shuffle(proof.proof_xs.begin(), proof.proof_xs.end(), engine);\n\t\t\texpect_throw([=]() {\n\t\t\t\tmmx::pos::verify(proof.proof_xs, plot_challenge, proof.plot_id, plot_filter, 0, proof.ksize, false);\n\t\t\t});\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"mnemonic\")\n\t{\n\t\tvnx::test::expect(\n\t\t\t\tmmx::mnemonic::words_to_string(mmx::mnemonic::seed_to_words(hash_t(), mmx::mnemonic::wordlist_en)),\n\t\t\t\t\"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art\");\n\t\tvnx::test::expect(\n\t\t\t\tmmx::mnemonic::words_to_seed(mmx::mnemonic::string_to_words(\"void come effort suffer camp survey warrior heavy shoot primary clutch crush open amazing screen patrol group space point ten exist slush involve unfold\"), mmx::mnemonic::wordlist_en).to_string(),\n\t\t\t\t\"8F9D98FD746F9D0AFA660965B00FB2891AB25495C653D37DB50D52EC1AC185F5\");\n\t\thash_t seed;\n\t\tvnx::from_string(\"8F9D98FD746F9D0AFA660965B00FB2891AB25495C653D37DB50D52EC1AC185F5\", seed);\n\t\tvnx::test::expect(seed.to_string(), \"8F9D98FD746F9D0AFA660965B00FB2891AB25495C653D37DB50D52EC1AC185F5\");\n\t\tvnx::test::expect(\n\t\t\t\tmmx::mnemonic::words_to_string(mmx::mnemonic::seed_to_words(seed, mmx::mnemonic::wordlist_en)),\n\t\t\t\t\"void come effort suffer camp survey warrior heavy shoot primary clutch crush open amazing screen patrol group space point ten exist slush involve unfold\");\n\t}\n\tVNX_TEST_END()\n\n\tmmx::secp256k1_free();\n\n\treturn vnx::test::done();\n}\n\n\n\n"
  },
  {
    "path": "test/test_challenge_grind.cpp",
    "content": "/*\n * test_challenge_grind.cpp\n *\n *  Created on: Jan 10, 2025\n *      Author: mad\n */\n\n#include <iostream>\n#include <cstdint>\n#include <cmath>\n#include <random>\n\nint main()\n{\n    const int N = 5;\n    const int M = 2;\t\t\t\t\t// number of choices\n    const int P = 500;\t\t\t\t\t// netspace / 1000\n    const int num_iter = 10000;\n\n    const auto free_chance = pow(double(P) / 1000, M - 1);\n\n    std::default_random_engine engine;\n    std::uniform_real_distribution<double> dist(0, 1);\n\n    uint64_t total = 0;\n    uint64_t lost = 0;\n\n    for(int iter = 0; iter < num_iter; ++iter)\n    {\n        int sum[M] = {};\n        for(int k = 0; k < M; ++k) {\n            for(int i = 0; i < N; ++i) {\n                sum[k] += (engine() % 1000) < P ? 1 : 0;\n            }\n        }\n        int best = 0;\n        int index = 0;\n        for(int k = 0; k < M; ++k) {\n            if(sum[k] > best) {\n                best = sum[k];\n                index = k;\n            }\n        }\n        total += best;\n\n        if(index > 0) {\n            if(dist(engine) > free_chance) {\n                lost++;\n            }\n        }\n    }\n\n    const auto loss_chance = double(lost) / num_iter;\n    const auto avg_blocks = double(total) / num_iter - loss_chance;\n    const auto exp_blocks = double(N * P) / 1000;\n    const auto gain = avg_blocks / exp_blocks;\n    const auto effective = (gain - 1) * double(P) / 1000 / 256 * 100;\n\n    std::cout << \"free_chance = \" << free_chance << std::endl;\n    std::cout << \"loss_chance = \" << loss_chance << std::endl;\n    std::cout << \"avg_blocks =  \" << avg_blocks << std::endl;\n    std::cout << \"exp_blocks =  \" << exp_blocks << std::endl;\n    std::cout << \"gain =        \" << gain << std::endl;\n    std::cout << \"effective =   \" << effective << \" %\" << std::endl;\n\n    return 0;\n}\n\n\n"
  },
  {
    "path": "test/test_compiler.cpp",
    "content": "/*\n * test_compiler.cpp\n *\n *  Created on: Dec 19, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/Compiler.h>\n\n#include <vnx/vnx.h>\n\n\nusing namespace mmx;\n\n\nint main(int argc, char** argv)\n{\n\tstd::map<std::string, std::string> options;\n\toptions[\"f\"] = \"file\";\n\n\tvnx::init(\"test_compiler\", argc, argv, options);\n\n\tstd::string file_name;\n\tif(vnx::read_config(\"file\", file_name))\n\t{\n\t\tstd::ifstream stream(file_name);\n\t\tstd::stringstream buffer;\n\t\tbuffer << stream.rdbuf();\n\n\t\tauto bin = vm::compile(buffer.str());\n\t\tvnx::write_to_file(\"binary.dat\", bin);\n\t}\n\n\tvnx::close();\n\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "test/test_cuda_recompute.cpp",
    "content": "/*\n * test_cuda_recompute.cpp\n *\n *  Created on: Feb 5, 2025\n *      Author: mad\n */\n\n#include <mmx/utils.h>\n#include <mmx/pos/cuda_recompute.h>\n\n#include <vnx/vnx.h>\n\nusing namespace mmx;\nusing namespace mmx::pos;\n\n\nint main(int argc, char** argv)\n{\n\tstd::map<std::string, std::string> options;\n\toptions[\"C\"] = \"clevel\";\n\toptions[\"N\"] = \"count\";\n\toptions[\"devices\"] = \"list\";\n\n\tvnx::init(\"test_cuda_recompute\", argc, argv, options);\n\n\tint count = 1;\n\tint clevel = 0;\n\tstd::vector<int> device_list;\n\tvnx::read_config(\"count\", count);\n\tvnx::read_config(\"clevel\", clevel);\n\tvnx::read_config(\"devices\", device_list);\n\n\tcuda_recompute_init(true, device_list);\n\n\tint ksize = 29;\n\thash_t plot_id;\n\tstd::vector<uint32_t> x_values;\n\tvnx::from_string(\"8FA05447F4F0849B7875E0D0D25B99360F8A7981C67DE7CA5FCF1E1483089F82\", plot_id);\n\tvnx::from_string(\"[41526030, 190034280, 27487774, 360531876, 157328122, 533344899, 348912715, 158286857, 500512399, 286789283, 309409411, 33301427, 291496595, 292537, 431952279, 209584997, 111041179, 225686812, 377306265, 45918619, 136492725, 443847657, 63762825, 455772217, 299457809, 62819158, 423066079, 70184667, 116121877, 262069313, 94597380, 277096972, 178726801, 264024912, 497654815, 81149636, 201256170, 209529847, 86228594, 32668245, 122504482, 174029193, 404468875, 222875439, 241585134, 438378901, 310806690, 77808852, 506242593, 337807442, 171130081, 360833911, 483590771, 498133539, 78329797, 41557646, 163327753, 315798381, 131747531, 361264561, 216455451, 179665178, 51870911, 429035183, 295349671, 152798101, 253786116, 433103191, 476044027, 346642880, 47227825, 208846273, 206436033, 245874067, 427075796, 180779200, 410970246, 1143092, 50889398, 224426279, 375125060, 188487454, 319636984, 272259131, 377087291, 271901983, 531636482, 454874007, 274228377, 431843070, 523612467, 361408983, 423618927, 339345523, 86142409, 160801159, 22024508, 233678781, 241239177, 475088783, 400172747, 362038581, 429952975, 121634389, 179032692, 152394426, 223298082, 93030597, 63400229, 175256560, 530644023, 21993664, 153789041, 515107385, 135370091, 156498932, 72211704, 400919262, 136383461, 504380151, 239462247, 184409768, 245564618, 264419588, 183760152, 303573155, 280701899, 412267540, 281366400, 318612884, 281199257, 28786199, 280595286, 469254350, 516006656, 76648711, 534052766, 109825608, 383408610, 400602196, 201747007, 232103494, 225366639, 473932026, 373853689, 523521134, 385137715, 297896772, 460856009, 253065215, 191027004, 302714203, 102745112, 118857551, 531336719, 298547044, 308312588, 441150850, 177353289, 366287353, 117270343, 323760640, 436125237, 193628024, 496102441, 192425221, 174984738, 267393617, 119828474, 382207855, 157357834, 102830320, 69524625, 32453159, 470198640, 253550250, 12023423, 143563219, 38100930, 259685561, 358040000, 277554148, 502359901, 375665759, 268245745, 193785837, 21177576, 97132723, 237830009, 390049154, 424082856, 287383135, 482999386, 93334862, 211737164, 32954960, 379554381, 329067393, 322071582, 452967760, 223523925, 394112637, 91770475, 33515598, 41541163, 159354561, 448723432, 360714676, 298810627, 463092740, 8253330, 416722492, 172191294, 358486549, 286025427, 260690064, 290924466, 157109118, 14568701, 256902937, 225155064, 507728616, 21730277, 31804253, 365161673, 184388967, 36778686, 241694509, 71357500, 429209559, 275960351, 244822214, 345055770, 122399096, 93423247, 5590085, 299893246, 386457316, 300993063, 533350058, 313848074, 106703937, 516682805, 49602142, 321158224, 265493627, 329208949, 45211675, 112966538, 523299896, 80915641, 499055347, 124794444, 78543398, 155955534, 393135459]\", x_values);\n\n\tauto x_in = x_values;\n\tfor(auto& x : x_in) {\n\t\tx >>= clevel;\n\t}\n\n\tconst auto time_begin = get_time_ms();\n\n\tstd::set<uint64_t> jobs;\n\tfor(int i = 0; i < count; ++i) {\n\t\tconst auto id = cuda_recompute(ksize, clevel, plot_id, x_in);\n\t\tjobs.insert(id);\n\t}\n\n\twhile(!jobs.empty()) {\n\t\tconst auto res = cuda_recompute_poll(jobs);\n\t\tif(res->failed) {\n\t\t\tstd::cout << \"[\" << res->id << \"] failed with: \" << res->error << std::endl;\n\t\t} else {\n\t\t\tfor(const auto& entry : res->entries) {\n\t\t\t\tstd::cout << \"[\" << res->id << \"] Y = \" << entry.first << std::endl;\n\t\t\t\tstd::cout << \"[\" << res->id << \"] M = \" << entry.second.to_string() << std::endl;\n\t\t\t}\n\t\t\tif(res->X != x_values) {\n\t\t\t\tstd::cout << vnx::to_string(res->X) << std::endl;\n\t\t\t\tthrow std::logic_error(\"X mismatch\");\n\t\t\t}\n\t\t}\n\t\tjobs.erase(res->id);\n\t}\n\n\tstd::cout << \"Took \" << get_time_ms() - time_begin << \" ms\" << std::endl;\n\n\tcuda_recompute_shutdown();\n\n\tvnx::close();\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "test/test_database.cpp",
    "content": "/*\n * test_database.cpp\n *\n *  Created on: Jun 9, 2022\n *      Author: mad\n */\n\n#include <mmx/DataBase.h>\n#include <mmx/table.h>\n#include <mmx/multi_table.h>\n\n#include <vnx/vnx.h>\n#include <vnx/test/Test.h>\n\n\ntemplate<typename T>\nstd::shared_ptr<mmx::db_val_t> db_write(T value)\n{\n\tauto out = std::make_shared<mmx::db_val_t>(sizeof(T));\n\tvnx::write_value(out->data, vnx::to_big_endian(value));\n\treturn out;\n}\n\ntemplate<typename T>\nT db_read(std::shared_ptr<mmx::db_val_t> value)\n{\n\tif(!value) {\n\t\tthrow std::runtime_error(\"!value\");\n\t}\n\tif(value->size != sizeof(T)) {\n\t\tthrow std::runtime_error(\"size mismatch: \" + std::to_string(value->size) + \" != \" + std::to_string(sizeof(T)));\n\t}\n\tT out = T();\n\t::memcpy(&out, value->data, sizeof(T));\n\treturn vnx::from_big_endian(out);\n}\n\n\nint main(int argc, char** argv)\n{\n\tvnx::test::init(\"mmx.database\");\n\n\tVNX_TEST_BEGIN(\"test_table\")\n\t{\n\t\tconst uint32_t num_entries = 100;\n\n\t\tmmx::Table::options_t options;\n\t\toptions.max_block_size = 1024 * 1024;\n\t\tauto table = std::make_shared<mmx::Table>(\"tmp/test_table\", options);\n\n\t\tif(table->current_version() == 1) {\n\t\t\tfor(uint32_t i = 0; i < num_entries; ++i) {\n\t\t\t\tvnx::test::expect(db_read<uint64_t>(table->find(db_write(uint32_t(i * 2)))), i);\n\t\t\t}\n\t\t}\n\t\ttable->revert(0);\n\n\t\tfor(uint32_t i = 0; i < num_entries; ++i) {\n\t\t\ttable->insert(db_write(uint32_t(i * 2)), db_write(uint64_t(i)));\n\t\t}\n\t\ttable->commit(1);\n\n\t\tfor(uint32_t i = 0; i < num_entries; ++i) {\n\t\t\tvnx::test::expect(db_read<uint64_t>(table->find(db_write(uint32_t(i * 2)))), i);\n\t\t}\n\t\t{\n\t\t\tauto iter = std::make_shared<mmx::Table::Iterator>(table);\n\t\t\titer->seek_begin();\n\t\t\tuint32_t i = 0;\n\t\t\twhile(iter->is_valid()) {\n\t\t\t\tvnx::test::expect(db_read<uint32_t>(iter->key()), i * 2);\n\t\t\t\tvnx::test::expect(db_read<uint64_t>(iter->value()), i);\n\t\t\t\titer->next();\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t\ttable->flush();\n\n\t\tfor(uint32_t i = 0; i < num_entries; ++i) {\n\t\t\tvnx::test::expect(db_read<uint64_t>(table->find(db_write(uint32_t(i * 2)))), i);\n\t\t}\n\t\t{\n\t\t\tauto iter = std::make_shared<mmx::Table::Iterator>(table);\n\t\t\titer->seek_begin();\n\t\t\tuint32_t i = 0;\n\t\t\twhile(iter->is_valid()) {\n\t\t\t\tvnx::test::expect(db_read<uint32_t>(iter->key()), i * 2);\n\t\t\t\tvnx::test::expect(db_read<uint64_t>(iter->value()), i);\n\t\t\t\titer->next();\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\n\t\tfor(uint32_t i = 2 * num_entries; i > 0; --i) {\n\t\t\ttable->insert(db_write(uint32_t((i - 1) * 2)), db_write(uint64_t(i)));\n\t\t}\n\t\ttable->commit(2);\n\n\t\tfor(uint32_t i = 0; i < 2 * num_entries; ++i) {\n\t\t\tvnx::test::expect(db_read<uint64_t>(table->find(db_write(uint32_t(i * 2)))), i + 1);\n\t\t}\n\t\tfor(uint32_t i = 0; i < num_entries; ++i) {\n\t\t\tvnx::test::expect(db_read<uint64_t>(table->find(db_write(uint32_t(i * 2)), 0)), i);\n\t\t}\n\t\ttable->flush();\n\n\t\tfor(uint32_t i = 0; i < 2 * num_entries; ++i) {\n\t\t\tvnx::test::expect(db_read<uint64_t>(table->find(db_write(uint32_t(i * 2)))), i + 1);\n\t\t}\n\t\tfor(uint32_t i = 0; i < num_entries; ++i) {\n\t\t\tvnx::test::expect(db_read<uint64_t>(table->find(db_write(uint32_t(i * 2)), 0)), i);\n\t\t}\n\t\tif(table->find(db_write(uint32_t(5 * num_entries)))) {\n\t\t\tthrow std::logic_error(\"found something\");\n\t\t}\n\t\t{\n\t\t\tauto iter = std::make_shared<mmx::Table::Iterator>(table);\n\t\t\titer->seek_begin();\n\t\t\tuint32_t i = 0;\n\t\t\twhile(iter->is_valid()) {\n\t\t\t\tvnx::test::expect(db_read<uint32_t>(iter->key()), i * 2);\n\t\t\t\tvnx::test::expect(db_read<uint64_t>(iter->value()), i + 1);\n\t\t\t\titer->next();\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tauto iter = std::make_shared<mmx::Table::Iterator>(table);\n\t\t\titer->seek(db_write(uint32_t(num_entries + 1)));\n\t\t\tvnx::test::expect(iter->is_valid(), true);\n\t\t\tvnx::test::expect(db_read<uint32_t>(iter->key()), num_entries + 2);\n\t\t\titer->prev();\n\t\t\tvnx::test::expect(iter->is_valid(), true);\n\t\t\tvnx::test::expect(db_read<uint32_t>(iter->key()), num_entries);\n\t\t\titer->prev();\n\t\t\tvnx::test::expect(iter->is_valid(), true);\n\t\t\tvnx::test::expect(db_read<uint32_t>(iter->key()), num_entries - 2);\n\t\t}\n\t\ttable->revert(1);\n\n\t\tfor(uint32_t i = 0; i < num_entries; ++i) {\n\t\t\tvnx::test::expect(db_read<uint64_t>(table->find(db_write(uint32_t(i * 2)))), i);\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"uint_table\")\n\t{\n\t\tmmx::uint_table<uint32_t, std::string> table(\"tmp/uint_table\");\n\t\ttable.revert(0);\n\t\ttable.insert(3, \"dfhgdfgdfgdfg\");\n\t\ttable.insert(1, \"sdfsdfsdf\");\n\t\t{\n\t\t\tstd::string value;\n\t\t\tconst auto res = table.find(1, value);\n\t\t\tvnx::test::expect(res, true);\n\t\t\tvnx::test::expect(value, \"sdfsdfsdf\");\n\t\t}\n\t\t{\n\t\t\tstd::string value;\n\t\t\tconst auto res = table.find(3, value);\n\t\t\tvnx::test::expect(res, true);\n\t\t\tvnx::test::expect(value, \"dfhgdfgdfgdfg\");\n\t\t}\n\t\ttable.commit(1);\n\t\ttable.flush();\n\t\t{\n\t\t\tstd::string value;\n\t\t\tconst auto res = table.find(1, value);\n\t\t\tvnx::test::expect(res, true);\n\t\t\tvnx::test::expect(value, \"sdfsdfsdf\");\n\t\t}\n\t\t{\n\t\t\tstd::string value;\n\t\t\tconst auto res = table.find(3, value);\n\t\t\tvnx::test::expect(res, true);\n\t\t\tvnx::test::expect(value, \"dfhgdfgdfgdfg\");\n\t\t}\n//\t\ttable.scan([](const uint32_t& key, const std::string& value) {\n//\t\t\tstd::cout << key << \" => \" << value << std::endl;\n//\t\t});\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"uint_multi_table\")\n\t{\n\t\tmmx::uint_multi_table<uint32_t, std::string> table(\"tmp/uint_multi_table\");\n\t\ttable.revert(0);\n\t\ttable.insert(1, \"234523345\");\n\t\ttable.insert(3, \"dfhgdfgdfgdfg\");\n\t\ttable.insert(1, \"sdfsdfsdf\");\n\t\t{\n\t\t\tstd::vector<std::string> value;\n\t\t\tconst auto res = table.find(1, value);\n\t\t\tvnx::test::expect(res, size_t(2));\n\t\t\tvnx::test::expect(value[0], \"234523345\");\n\t\t\tvnx::test::expect(value[1], \"sdfsdfsdf\");\n\t\t}\n\t\t{\n\t\t\tstd::vector<std::string> value;\n\t\t\tconst auto res = table.find(3, value);\n\t\t\tvnx::test::expect(res, size_t(1));\n\t\t\tvnx::test::expect(value[0], \"dfhgdfgdfgdfg\");\n\t\t}\n\t\ttable.commit(1);\n\t\ttable.flush();\n\t\t{\n\t\t\tstd::vector<std::string> value;\n\t\t\tconst auto res = table.find(1, value);\n\t\t\tvnx::test::expect(res, size_t(2));\n\t\t\tvnx::test::expect(value[0], \"234523345\");\n\t\t\tvnx::test::expect(value[1], \"sdfsdfsdf\");\n\t\t}\n\t\t{\n\t\t\tstd::vector<std::string> value;\n\t\t\tconst auto res = table.find(3, value);\n\t\t\tvnx::test::expect(res, size_t(1));\n\t\t\tvnx::test::expect(value[0], \"dfhgdfgdfgdfg\");\n\t\t}\n//\t\ttable.scan([](const uint32_t& key, const std::string& value) {\n//\t\t\tstd::cout << key << \" => \" << value << std::endl;\n//\t\t});\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"test_table_1\")\n\t{\n\t\tmmx::Table::options_t options;\n\t\toptions.force_flush_threshold = 10;\n\t\tauto table = std::make_shared<mmx::Table>(\"tmp/test_table_1\", options);\n\t\ttable->revert(0);\n\n\t\tconst uint32_t num_iter = 100 * options.force_flush_threshold + options.force_flush_threshold / 2;\n\n\t\tconst auto key = db_write(uint64_t(1337));\n\t\tconst auto key2 = db_write(uint64_t(-1));\n\n\t\tfor(uint32_t i = 0; i < num_iter; ++i)\n\t\t{\n\t\t\ttable->insert(key, db_write<uint32_t>(-1));\n\t\t\ttable->commit(i + 1);\n\t\t\ttable->revert(i);\n\n\t\t\tif(i) {\n\t\t\t\tvnx::test::expect(db_read<uint32_t>(table->find(key)), uint32_t(i - 1));\n\t\t\t}\n\t\t\ttable->insert(key, db_write<uint32_t>(-1));\n\t\t\ttable->insert(key, db_write(i));\n\t\t\ttable->commit(i + 1);\n\t\t}\n\t\tvnx::test::expect(bool(table->find(key2)), false);\n\n\t\ttable->insert(key2, db_write<uint32_t>(-1));\n\n\t\ttable = nullptr;\n\t\ttable = std::make_shared<mmx::Table>(\"tmp/test_table_1\", options);\n\n\t\tvnx::test::expect(bool(table->find(key2)), false);\n\n\t\tfor(int32_t i = num_iter - 1; i >= 0; --i)\n\t\t{\n\t\t\tauto value = table->find(key, i);\n\t\t\tvnx::test::expect(bool(value), true);\n\t\t\tvnx::test::expect(db_read<uint32_t>(value), uint32_t(i));\n\t\t}\n\n\t\tfor(int32_t i = num_iter; i >= 0; --i)\n\t\t{\n\t\t\ttable->revert(i);\n\t\t\tauto value = table->find(key);\n\t\t\tif(i) {\n\t\t\t\tvnx::test::expect(bool(value), true);\n\t\t\t\tvnx::test::expect(db_read<uint32_t>(value), uint32_t(i - 1));\n\t\t\t} else {\n\t\t\t\tvnx::test::expect(bool(value), false);\n\t\t\t}\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"empty_force_flush\")\n\t{\n\t\tmmx::Table::options_t options;\n\t\toptions.force_flush_threshold = 10;\n\t\tauto table = std::make_shared<mmx::Table>(\"tmp/empty_force_flush\", options);\n\t\ttable->revert(0);\n\n\t\tconst uint32_t num_iter = 100 * options.force_flush_threshold;\n\n\t\tfor(uint32_t i = 0; i < num_iter; ++i)\n\t\t{\n\t\t\ttable->commit(i + 1);\n\t\t}\n\t\ttable = nullptr;\n\t\ttable = std::make_shared<mmx::Table>(\"tmp/empty_force_flush\", options);\n\n\t\tvnx::test::expect(table->current_version(), num_iter);\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"write_log_corruption\")\n\t{\n\t\tauto table = std::make_shared<mmx::Table>(\"tmp/write_log_corruption\");\n\t\ttable->revert(0);\n\n\t\tconst uint32_t num_iter = 1000;\n\t\tconst uint32_t num_bytes = 256;\n\n\t\tconst auto key = db_write(uint64_t(1337));\n\n\t\tfor(uint32_t i = 0; i < num_iter; ++i)\n\t\t{\n\t\t\ttable->insert(key, db_write(i));\n\t\t\ttable->commit(i + 1);\n\t\t}\n\t\ttable = nullptr;\n\t\t{\n\t\t\tvnx::File write_log(\"tmp/write_log_corruption/write_log.dat\");\n\t\t\twrite_log.open(\"rb+\");\n\t\t\twrite_log.seek_to(write_log.file_size() - num_bytes);\n\t\t\tstd::vector<uint8_t> zeros(num_bytes);\n\t\t\twrite_log.out.write(zeros.data(), zeros.size());\n\t\t\twrite_log.close();\n\t\t}\n\t\ttable = std::make_shared<mmx::Table>(\"tmp/write_log_corruption\");\n\n\t\tmmx::Table::Iterator iter(table);\n\t\titer.seek_begin();\n\t\twhile(iter.is_valid()) {\n\t\t\tif(iter.key()->size == 0) {\n\t\t\t\tthrow std::logic_error(\"key size == 0\");\n\t\t\t}\n\t\t\tif(iter.value()->size == 0) {\n\t\t\t\tthrow std::logic_error(\"value size == 0\");\n\t\t\t}\n\t\t\titer.next();\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\treturn vnx::test::done();\n}\n\n"
  },
  {
    "path": "test/test_database_reads.cpp",
    "content": "/*\n * test_database_reads.cpp\n *\n *  Created on: May 24, 2023\n *      Author: mad\n */\n\n#include <mmx/DataBase.h>\n\n#include <vnx/vnx.h>\n#include <math.h>\n\n\nint main(int argc, char** argv)\n{\n\tconst std::string path = argc > 1 ? std::string(argv[1]) : \"tmp/test_table\";\n\tconst int num_rows = argc > 2 ? ::atoi(argv[2]) : 1000;\n\tconst int num_threads = argc > 3 ? ::atoi(argv[3]) : 1;\n\tconst uint64_t seed = argc > 4 ? ::atoi(argv[4]) : vnx::get_time_micros();\n\n\t::srand(seed);\n\n\tauto table = std::make_shared<mmx::Table>(path);\n\n\tstd::atomic<uint64_t> total_bytes {0};\n\n\tconst auto time_begin = vnx::get_time_micros();\n\n#pragma omp parallel for num_threads(num_threads)\n\tfor(int i = 0; i < num_rows; ++i)\n\t{\n\t\tauto key = std::make_shared<mmx::db_val_t>(8);\n\t\tfor(size_t k = 0; k < key->size; ++k) {\n\t\t\tkey->data[k] = ::rand();\n\t\t}\n\t\tmmx::Table::Iterator iter(table);\n\t\titer.seek(key);\n\n\t\tif(iter.is_valid()) {\n\t\t\ttotal_bytes += iter.value()->size;\n\t\t}\n\t}\n\n\tconst auto elapsed = (vnx::get_time_micros() - time_begin) / 1e3;\n\n\tstd::cout << \"Total Read: \" << total_bytes / pow(1024, 2) << \" MiB\" << std::endl;\n\tstd::cout << \"Total Time: \" << elapsed << \" ms\" << std::endl;\n\tstd::cout << \"Lookup Time: \" << elapsed / num_rows << \" ms\" << std::endl;\n\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "test/test_encoding.cpp",
    "content": "/*\n * test_encoding.cpp\n *\n *  Created on: Nov 20, 2023\n *      Author: mad\n */\n\n#include <mmx/pos/encoding.h>\n\n#include <iostream>\n\n\nint main(int argc, char** argv)\n{\n\tconst int num_symbols = argc > 1 ? ::atoi(argv[1]) : 4096;\n\n\tstd::vector<uint8_t> symbols;\n\n\tfor(int i = 0; i < num_symbols; ++i)\n\t{\n\t\tuint8_t sym = 0;\n\t\tconst auto ticket = ::rand() % 1000;\n\t\tif(ticket < 900) {\n\t\t\tsym = ticket % 3;\n\t\t} else if(ticket < 990) {\n\t\t\tsym = 3 + ticket % 3;\n\t\t} else {\n\t\t\tsym = 6 + ticket % 3;\n\t\t}\n\t\tsymbols.push_back(sym);\n\t}\n\n\tfor(auto sym : symbols) {\n\t\tstd::cout << int(sym) << \" \";\n\t}\n\tstd::cout << std::endl;\n\n\tuint64_t total_bits = 0;\n\tconst auto bit_stream = mmx::pos::encode(symbols, total_bits);\n\n\tstd::cout << \"symbols = \" << num_symbols << std::endl;\n\tstd::cout << \"bit_stream = \" << (total_bits + 7) / 8 << \" bytes, \" << double(total_bits) / num_symbols << \" bits / symbol\" << std::endl;\n\n\tconst auto test = mmx::pos::decode(bit_stream, symbols.size());\n\n\tif(test != symbols) {\n\t\tfor(auto sym : test) {\n\t\t\tstd::cout << int(sym) << \" \";\n\t\t}\n\t\tthrow std::logic_error(\"test != symbols\");\n\t}\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "test/test_engine.cpp",
    "content": "/*\n * test_engine.cpp\n *\n *  Created on: May 1, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/Engine.h>\n#include <mmx/vm/StorageDB.h>\n#include <mmx/vm/StorageRAM.h>\n#include <mmx/vm/StorageCache.h>\n\n#include <iostream>\n\nusing namespace mmx;\n\n\nint main(int arcv, char** argv)\n{\n\tauto db = std::make_shared<mmx::DataBase>(1);\n//\tauto storage = std::make_shared<vm::StorageRAM>();\n\tauto backend = std::make_shared<vm::StorageDB>(\"tmp/\", db);\n\tdb->revert(0);\n\tauto storage = std::make_shared<vm::StorageCache>(backend);\n\t{\n\t\tvm::Engine engine(addr_t(), storage, false);\n\t\tengine.write(vm::MEM_CONST + 0, vm::var_t());\n\t\tengine.write(vm::MEM_CONST + 1, vm::uint_t(1337));\n\t\tengine.write(vm::MEM_CONST + 2, vm::map_t());\n\t\tengine.assign(vm::MEM_CONST + 3, vm::binary_t::alloc(\"value\"));\n\t\tengine.write(vm::MEM_CONST + 4, vm::uint_t(11337));\n\t\tengine.write(vm::MEM_CONST + 5, vm::array_t());\n\n\t\tauto& code = engine.code;\n\t\tcode.emplace_back(vm::OP_CLONE, 0, vm::MEM_STACK + 1, vm::MEM_CONST + 1);\n\t\tcode.emplace_back(vm::OP_COPY, vm::OPFLAG_REF_B, vm::MEM_STACK + 0, vm::MEM_STACK + 1);\n\t\tcode.emplace_back(vm::OP_COPY, 0, vm::MEM_STATIC + 0, vm::MEM_CONST + 2);\n\t\tcode.emplace_back(vm::OP_CLONE, 0, vm::MEM_STACK + 3, vm::MEM_CONST + 3);\n\t\tcode.emplace_back(vm::OP_CONCAT, 0, vm::MEM_STACK + 4, vm::MEM_CONST + 3, vm::MEM_CONST + 3);\n\t\tcode.emplace_back(vm::OP_SET, 0, vm::MEM_STATIC + 0, vm::MEM_CONST + 3, vm::MEM_CONST + 1);\n\t\tcode.emplace_back(vm::OP_SET, 0, vm::MEM_STATIC + 0, vm::MEM_STACK + 4, vm::MEM_CONST + 3);\n\t\tcode.emplace_back(vm::OP_SET, vm::OPFLAG_REF_B, vm::MEM_STATIC + 0, vm::MEM_STACK + 3, vm::MEM_CONST + 4);\n\t\tcode.emplace_back(vm::OP_GET, 0, vm::MEM_STACK + 2, vm::MEM_STATIC + 0, vm::MEM_CONST + 3);\n\t\tcode.emplace_back(vm::OP_COPY, 0, vm::MEM_STATIC + 1, vm::MEM_CONST + 5);\n\t\tcode.emplace_back(vm::OP_PUSH_BACK, vm::OPFLAG_REF_A, vm::MEM_STATIC + 1, vm::MEM_CONST + 1);\n\t\tcode.emplace_back(vm::OP_PUSH_BACK, vm::OPFLAG_REF_A, vm::MEM_STATIC + 1, vm::MEM_CONST + 4);\n\t\tcode.emplace_back(vm::OP_PUSH_BACK, vm::OPFLAG_REF_A, vm::MEM_STATIC + 1, vm::MEM_CONST + 3);\n\t\tcode.emplace_back(vm::OP_SIZE, 0, vm::MEM_STATIC + 8, vm::MEM_STATIC + 1);\n\t\tcode.emplace_back(vm::OP_TYPE, 0, vm::MEM_STATIC + 9, vm::MEM_STATIC + 0);\n\t\tcode.emplace_back(vm::OP_RET);\n\n\t\tengine.gas_limit = 1000000;\n\t\tengine.init();\n\t\tengine.begin(0);\n\t\tengine.run();\n\t\tengine.dump_memory();\n\t\tengine.commit();\n\t\tstd::cout << \"Cost: \" << engine.gas_used << std::endl;\n\t}\n\tstorage->commit();\n\tdb->commit(1);\n\t{\n\t\tvm::Engine engine(addr_t(), storage, false);\n\t\tengine.write(vm::MEM_CONST + 0, vm::var_t());\n\t\tengine.write(vm::MEM_CONST + 1, vm::uint_t());\n\t\tengine.write(vm::MEM_CONST + 2, vm::uint_t(1));\n\t\tengine.assign(vm::MEM_CONST + 3, vm::binary_t::alloc(\"value\"));\n\n\t\tauto& code = engine.code;\n\t\tcode.emplace_back(vm::OP_GET, 0, vm::MEM_STACK + 0, vm::MEM_STATIC + 0, vm::MEM_CONST + 3);\n\t\tcode.emplace_back(vm::OP_ERASE, 0, vm::MEM_STATIC + 0, vm::MEM_CONST + 3);\n\t\tcode.emplace_back(vm::OP_GET, 0, vm::MEM_STATIC + 16, vm::MEM_STATIC + 1, vm::MEM_CONST + 1);\n\t\tcode.emplace_back(vm::OP_GET, 0, vm::MEM_STATIC + 17, vm::MEM_STATIC + 1, vm::MEM_CONST + 2);\n\t\tcode.emplace_back(vm::OP_POP_BACK, 0, vm::MEM_STATIC + 18, vm::MEM_STATIC + 1);\n\t\tcode.emplace_back(vm::OP_RET);\n\n\t\tengine.gas_limit = 100000;\n\t\tengine.init();\n\t\tengine.begin(0);\n\t\tengine.run();\n\t\tengine.dump_memory();\n\t\tengine.commit();\n\t\tstd::cout << \"Cost: \" << engine.gas_used << std::endl;\n\t}\n\tstorage->commit();\n\tdb->commit(2);\n\t{\n\t\tvm::Engine engine(addr_t(), storage, true);\n\t\tengine.write(vm::MEM_CONST + 0, vm::var_t());\n\t\tengine.write(vm::MEM_CONST + 1, vm::uint_t());\n\t\tengine.write(vm::MEM_CONST + 2, vm::uint_t(1));\n\t\tengine.assign(vm::MEM_CONST + 3, vm::binary_t::alloc(\"value\"));\n\t\tengine.write(vm::MEM_CONST + 4, vm::uint_t(2));\n\n\t\tauto& code = engine.code;\n\t\tcode.emplace_back(vm::OP_GET, 0, vm::MEM_STACK + 0, vm::MEM_STATIC + 0, vm::MEM_CONST + 3);\n\t\tcode.emplace_back(vm::OP_GET, 0, vm::MEM_STATIC + 32, vm::MEM_STATIC + 1, vm::MEM_CONST + 1);\n\t\tcode.emplace_back(vm::OP_GET, 0, vm::MEM_STATIC + 33, vm::MEM_STATIC + 1, vm::MEM_CONST + 2);\n\t\tcode.emplace_back(vm::OP_GET, 0, vm::MEM_STATIC + 34, vm::MEM_STATIC + 1, vm::MEM_CONST + 4);\n\t\tcode.emplace_back(vm::OP_CLONE, 0, vm::MEM_STACK + 1, vm::MEM_STATIC + 32);\n\t\tcode.emplace_back(vm::OP_CLONE, 0, vm::MEM_STATIC + 40, vm::MEM_STATIC + 32);\n\t\tcode.emplace_back(vm::OP_RET);\n\n\t\tengine.gas_limit = 100000;\n\t\tengine.init();\n\t\tengine.begin(0);\n\t\tengine.run();\n\t\tengine.dump_memory();\n\t\tstd::cout << \"Cost: \" << engine.gas_used << std::endl;\n\t}\n\t{\n\t\tvm::Engine engine(addr_t(), storage, true);\n\t\tengine.write(vm::MEM_CONST + 0, vm::var_t());\n\t\tengine.write(vm::MEM_CONST + 1, vm::uint_t());\n\t\tengine.write(vm::MEM_CONST + 2, vm::uint_t(1));\n\t\tengine.write(vm::MEM_CONST + 3, vm::uint_t(10000));\n\n\t\tauto& code = engine.code;\n\t\tcode.emplace_back(vm::OP_COPY, 0, vm::MEM_STACK + 0, vm::MEM_CONST + 1);\n\t\tcode.emplace_back(vm::OP_CMP_GTE, 0, vm::MEM_STACK + 1, vm::MEM_STACK + 0, vm::MEM_CONST + 3);\n\t\tcode.emplace_back(vm::OP_JUMPI, 0, 5, vm::MEM_STACK + 1);\n\t\tcode.emplace_back(vm::OP_ADD, 0, vm::MEM_STACK + 0, vm::MEM_STACK + 0, vm::MEM_CONST + 2);\n\t\tcode.emplace_back(vm::OP_JUMP, 0, 1);\n\t\tcode.emplace_back(vm::OP_RET);\n\n\t\tengine.gas_limit = 10000000;\n\t\tengine.init();\n\t\tengine.begin(0);\n\t\tengine.run();\n\t\tengine.dump_memory();\n\t\tstd::cout << \"Cost: \" << engine.gas_used << std::endl;\n\t}\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "test/test_hash_vdl.cpp",
    "content": "/*\n * test_hash_vdl.cpp\n *\n *  Created on: Dec 6, 2021\n *      Author: mad\n */\n\n#include <mmx/ProofOfTime.hxx>\n\n#include <vnx/vnx.h>\n\nusing namespace mmx;\n\n\nint main(int argc, char** argv)\n{\n\tconst size_t num_iter = 5000 * 1000;\n\tconst size_t segment_len = num_iter / 256;\n\n\tconst auto vdl_begin = vnx::get_time_micros();\n\n\tconst hash_t begin(\"test\");\n\tstd::vector<time_segment_t> proof;\n\t{\n\t\tsize_t j = 0;\n\t\thash_t point = begin;\n\t\tfor(size_t i = 0; i < num_iter; ++i)\n\t\t{\n\t\t\tif(i > 0 && i % segment_len == 0)\n\t\t\t{\n\t\t\t\ttime_segment_t seg;\n\t\t\t\tseg.num_iters = i - j;\n\t\t\t\tseg.output = point;\n\t\t\t\tproof.push_back(seg);\n\t\t\t\tj = i;\n\t\t\t}\n\t\t\tpoint = hash_t(point.bytes);\n\t\t}\n\t\tif(num_iter > j)\n\t\t{\n\t\t\ttime_segment_t seg;\n\t\t\tseg.num_iters = num_iter - j;\n\t\t\tseg.output = point;\n\t\t\tproof.push_back(seg);\n\t\t}\n\t}\n\tstd::cout << \"VDL took \" << (vnx::get_time_micros() - vdl_begin) / 1000 << \" ms\" << std::endl;\n\n\tconst auto verify_begin = vnx::get_time_micros();\n\n#pragma omp parallel for\n\tfor(size_t i = 0; i < proof.size(); ++i)\n\t{\n\t\thash_t point;\n\t\tif(i > 0) {\n\t\t\tpoint = proof[i - 1].output;\n\t\t} else {\n\t\t\tpoint = begin;\n\t\t}\n\t\tfor(size_t k = 0; k < proof[i].num_iters; ++k) {\n\t\t\tpoint = hash_t(point.bytes);\n\t\t}\n\t\tif(point != proof[i].output) {\n\t\t\tthrow std::logic_error(\"invalid proof at segment \" + std::to_string(i));\n\t\t}\n\t}\n\n\tstd::cout << \"Verify took \" << (vnx::get_time_micros() - verify_begin) / 1000 << \" ms\" << std::endl;\n\n\treturn 0;\n}\n"
  },
  {
    "path": "test/test_mem_hash.cpp",
    "content": "/*\n * test_mem_hash.cpp\n *\n *  Created on: Oct 30, 2023\n *      Author: mad\n */\n\n#include <mmx/bytes_t.hpp>\n#include <mmx/hash_512_t.hpp>\n#include <mmx/pos/mem_hash.h>\n\n#include <vnx/vnx.h>\n\n#include <map>\n#include <cmath>\n#include <cstring>\n#include <iostream>\n\nusing namespace mmx::pos;\n\n\nint main(int argc, char** argv)\n{\n\tconst int N = 32;\n\n\tconst int count = argc > 1 ? std::atoi(argv[1]) : 1;\n\tconst int num_iter = argc > 2 ? std::atoi(argv[2]) : 256;\n\n\tconst uint64_t mem_size = uint64_t(N) * N;\n\n\tstd::cout << \"count = \" << count << std::endl;\n\tstd::cout << \"num_iter = \" << num_iter << std::endl;\n\tstd::cout << \"mem_size = \" << mem_size << \" (\" << mem_size * 4 / 1024 << \" KiB)\" << std::endl;\n\n\tsize_t pop_sum = 0;\n\tsize_t min_pop_count = 1024;\n\tsize_t bit_sum[1024] = {};\n\n\tuint32_t* mem = new uint32_t[mem_size];\n\n\tfor(int iter = 0; iter < count; ++iter)\n\t{\n\t\tuint32_t msg[9] = {};\n\t\tmsg[0] = iter;\n\n\t\tconst mmx::hash_512_t key(&msg, sizeof(msg));\n\n\t\tgen_mem_array(mem, key.data(), mem_size);\n\n\t\tif(iter == 0) {\n\t\t\tstd::map<uint32_t, uint32_t> init_count;\n\n\t\t\tfor(int k = 0; k < 32; ++k) {\n\t\t\t\tstd::cout << \"[\" << k << \"] \";\n\t\t\t\tfor(int i = 0; i < N; ++i) {\n\t\t\t\t\tinit_count[mem[k * N + i]]++;\n\t\t\t\t\tstd::cout << vnx::to_hex_string(&mem[k * N + i], 4, true, true) << \" \";\n\t\t\t\t}\n\t\t\t\tstd::cout << std::endl;\n\t\t\t}\n\n\t\t\tfor(const auto& entry : init_count) {\n\t\t\t\tif(entry.second > 1) {\n\t\t\t\t\tstd::cout << \"WARN [\" << std::hex << entry.first << std::dec << \"] \" << entry.second << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\tstd::cout << \"key[0] = \" << key.to_string() << std::endl;\n\t\t}\n\t\tmmx::bytes_t<128> hash;\n\n\t\tcalc_mem_hash(mem, hash.data(), num_iter);\n\n\t\tsize_t pop = 0;\n\t\tfor(int i = 0; i < 1024; ++i) {\n\t\t\tconst auto bit = (hash[i / 8] >> (i % 8)) & 1;\n\t\t\tpop += bit;\n\t\t\tbit_sum[i] += bit;\n\t\t}\n\t\tpop_sum += pop;\n\n\t\tmin_pop_count = std::min(min_pop_count, pop);\n\n\t\tstd::cout << \"[\" << iter << \"] \" << hash << \" (\" << pop << \")\" << std::endl;\n\t}\n\n\tfor(int i = 0; i < 1024; ++i) {\n\t\tconst auto val = bit_sum[i] / double(count);\n\t\tif(std::fabs(val - 0.5) > std::fmax(1000 / double(count), 0.01)) {\n\t\t\tstd::cout << \"WARN: bit[\" << i << \"] \" << val << std::endl;\n\t\t}\n\t}\n//\tfor(int i = 0; i < 1024; ++i) {\n//\t\tconst auto val = ((dir_counter[i] * 1024) / num_iter) / double(count);\n//\t\tif(std::fabs(val - 1) > std::fmax(1000 / double(count), 0.02)) {\n//\t\t\tstd::cout << \"WARN: dir_counter[\" << i << \"] \" << val << std::endl;\n//\t\t}\n//\t}\n\n\tstd::cout << \"min_pop_count = \" << min_pop_count << std::endl;\n\tstd::cout << \"avg_pop_count = \" << pop_sum / double(count) << std::endl;\n\n\tdelete [] mem;\n\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "test/test_mnemonic.cpp",
    "content": "/*\n * test_mnemonic.cpp\n *\n *  Created on: Sep 12, 2022\n *      Author: mad\n */\n\n#include <mmx/mnemonic.h>\n\n#include <iostream>\n\nusing namespace mmx;\n\nvoid test_both(const hash_t& seed)\n{\n\tconst auto words = mnemonic::seed_to_words(seed);\n\tconst auto res = mnemonic::words_to_seed(words);\n\tif(res != seed) {\n\t\tthrow std::logic_error(\"conversion failed\");\n\t}\n}\n\n\nint main(int argc, char** argv)\n{\n\tstd::cout << vnx::to_string(mnemonic::seed_to_words(hash_t())) << std::endl;\n\tstd::cout << vnx::to_string(mnemonic::seed_to_words(hash_t(\"test\"))) << std::endl;\n\n\tfor(int i = 0; i < 10000; ++i) {\n\t\tconst auto k = ::rand();\n\t\ttest_both(hash_t(&k, sizeof(k)));\n\t}\n}\n\n"
  },
  {
    "path": "test/test_pos_compute.cpp",
    "content": "/*\n * test_pos_compute.cpp\n *\n *  Created on: Nov 6, 2023\n *      Author: mad\n */\n\n#include <mmx/pos/verify.h>\n#include <vnx/vnx.h>\n#include <random>\n\nusing namespace mmx;\n\n\nint main(int argc, char** argv)\n{\n\tconst int ksize = argc > 1 ? std::atoi(argv[1]) : 32;\n\tconst int xbits = argc > 2 ? std::atoi(argv[2]) : 0;\n\n\tvnx::init(\"test_pos_compute\", 0, nullptr);\n\n\tstd::cout << \"ksize = \" << ksize << std::endl;\n\tstd::cout << \"xbits = \" << xbits << std::endl;\n\n\tconst bool full_mode = (xbits == ksize);\n\n\tconst hash_t id;\n\n\tstd::mt19937_64 generator(1337);\n\tstd::uniform_int_distribution<uint64_t> dist(0, (uint64_t(1) << (ksize - xbits)) - 1);\n\n\tstd::vector<uint32_t> X_values;\n\tif(!full_mode) {\n\t\tfor(int i = 0; i < 256; ++i) {\n\t\t\tX_values.push_back(dist(generator));\n\t\t}\n\t} else {\n\t\tfor(int i = 0; i < 256; ++i) {\n\t\t\tX_values.push_back(i);\n\t\t}\n\t}\n\n\tstd::cout << \"X = \";\n\tfor(auto X : X_values) {\n\t\tstd::cout << X << \" \";\n\t}\n\tstd::cout << std::endl;\n\n\tstd::vector<uint32_t> X_out;\n\tconst auto res = pos::compute(X_values, &X_out, id, ksize, full_mode ? ksize - 8 : xbits);\n\n\tfor(size_t i = 0; i < std::min<size_t>(res.size(), 5); ++i)\n\t{\n\t\tstd::cout << \"Y = \" << res[i].first << std::endl;\n\t\tstd::cout << \"M = \" << res[i].second.to_string() << std::endl;\n\t\tstd::cout << \"X = \";\n\t\tfor(size_t k = 0; k < 256; ++k) {\n\t\t\tstd::cout << X_out[i * 256 + k] << \" \";\n\t\t}\n\t\tstd::cout << std::endl;\n\t}\n\tstd::cout << \"num_entries = \" << res.size() << std::endl;\n\n\tvnx::close();\n}\n\n\n"
  },
  {
    "path": "test/test_proof_grind.cpp",
    "content": "/*\n * test_proof_grind.cpp\n *\n *  Created on: Jan 10, 2025\n *      Author: mad\n */\n\n#include <iostream>\n#include <cstdint>\n#include <random>\n\nint main()\n{\n    const int N = 256;\n    const int M = 2;\t\t\t\t\t// number of choices\n    const int P = 4;\t\t\t\t\t// avg num proofs\n    const int num_iter = 10000;\n\n    std::default_random_engine engine;\n    std::uniform_real_distribution<double> dist(0, 2 * P);\n\n    uint64_t total = 0;\n    uint64_t expected = 0;\n\n    for(int iter = 0; iter < num_iter; ++iter)\n    {\n        int sum[M] = {};\n        for(int k = 0; k < M; ++k) {\n            for(int i = 0; i < N; ++i) {\n                sum[k] += dist(engine) + 0.5;\n            }\n        }\n        int best = 0;\n        for(int k = 0; k < M; ++k) {\n            best = std::max(best, sum[k]);\n            expected += sum[k];\n        }\n        total += best;\n    }\n\n    const auto avg_proofs = double(total) / num_iter;\n    const auto exp_proofs = double(expected) / M / num_iter;\n\n    std::cout << \"avg_proofs = \" << avg_proofs << std::endl;\n    std::cout << \"exp_proofs = \" << exp_proofs << std::endl;\n\n   \tstd::cout << \"gain = \" << avg_proofs / exp_proofs << std::endl;\n\n    return 0;\n}\n\n\n"
  },
  {
    "path": "test/test_score_target.cpp",
    "content": "/*\n * test_score_target.cpp\n *\n *  Created on: Dec 27, 2024\n *      Author: mad\n */\n\n#include <iostream>\n#include <cstdint>\n\nint main(int argc, char** argv)\n{\n\tconst int N = argc > 1 ? std::atoi(argv[1]) : 1;\n    const int K = 10000000;\n\n    int64_t sum = 0;\n    for(int i = 0; i < K; ++i)\n    {\n        int tmp = 1 << 16;\n        for(int k = 0; k < N; ++k) {\n            tmp = std::min(tmp, rand() % (1 << 16));\n        }\n        sum += tmp;\n    }\n\n    std::cout << sum / K << std::endl;\n\n    return 0;\n}\n\n\n"
  },
  {
    "path": "test/test_secp256k1.cpp",
    "content": "/*\n * test_secp256k1.cpp\n *\n *  Created on: Nov 28, 2021\n *      Author: mad\n */\n\n\n#include <mmx/Block.hxx>\n#include <mmx/skey_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/txio_key_t.hpp>\n#include <mmx/solution/PubKey.hxx>\n\n#include <vnx/vnx.h>\n#include <unordered_map>\n\nusing namespace mmx;\n\n\nstatic constexpr uint64_t COIN = 1000000;\n\nstd::unordered_map<mmx::txio_key_t, mmx::tx_out_t> utxo_map;\n\nstd::unordered_map<hash_t, std::shared_ptr<const Contract>> contract_map;\n\nint64_t total_tx_count = 0;\nint64_t total_verify_time = 0;\nint64_t total_process_time = 0;\n\n\nhash_t validate(std::shared_ptr<const Transaction> tx, bool is_base = false)\n{\n\tconst auto id = tx->calc_hash();\n\n\tuint64_t base_amount = 0;\n\tstd::unordered_map<hash_t, uint64_t> amounts;\n\n\tfor(const auto& in : tx->inputs)\n\t{\n\t\tauto iter = utxo_map.find(in.prev);\n\t\tif(iter == utxo_map.end()) {\n\t\t\tthrow std::logic_error(\"invalid prev_tx + index\");\n\t\t}\n\t\tconst auto& out = iter->second;\n\n\t\t// verify signature\n\t\tif(!in.solution) {\n\t\t\tthrow std::logic_error(\"no solution\");\n\t\t}\n\t\t{\n\t\t\tauto iter = contract_map.find(out.address);\n\t\t\tif(iter != contract_map.end()) {\n\t\t\t\tauto contract = iter->second;\n\t\t\t\t// TODO\n\t\t\t}\n\t\t\telse if(auto sol = std::dynamic_pointer_cast<const solution::PubKey>(in.solution))\n\t\t\t{\n\t\t\t\tif(sol->pubkey.get_addr() != out.address) {\n\t\t\t\t\tthrow std::logic_error(\"invalid pubkey\");\n\t\t\t\t}\n\t\t\t\tif(!sol->signature.verify(sol->pubkey, id)) {\n\t\t\t\t\tthrow std::logic_error(\"invalid signature\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow std::logic_error(\"invalid solution\");\n\t\t\t}\n\t\t}\n\t\tamounts[out.contract] += out.amount;\n\t}\n\tfor(const auto& op : tx->execute)\n\t{\n\t\t// TODO\n\t}\n\tfor(const auto& out : tx->outputs)\n\t{\n\t\tif(is_base) {\n\t\t\tif(out.contract != hash_t()) {\n\t\t\t\tthrow std::logic_error(\"invalid coin base contract\");\n\t\t\t}\n\t\t\tbase_amount += out.amount;\n\t\t}\n\t\telse {\n\t\t\tauto iter = amounts.find(out.contract);\n\t\t\tif(iter == amounts.end()) {\n\t\t\t\tthrow std::logic_error(\"invalid output contract\");\n\t\t\t}\n\t\t\tauto& value = iter->second;\n\t\t\tif(out.amount > value) {\n\t\t\t\tthrow std::logic_error(\"output > input\");\n\t\t\t}\n\t\t\tvalue -= out.amount;\n\t\t}\n\t}\n\treturn id;\n}\n\nvoid process(std::shared_ptr<const Transaction> tx, const hash_t& txid, bool is_base = false)\n{\n\tfor(const auto& in : tx->inputs)\n\t{\n\t\tauto iter = utxo_map.find(in.prev);\n\t\tif(iter != utxo_map.end()) {\n\t\t\tutxo_map.erase(iter);\n\t\t} else {\n\t\t\tthrow std::logic_error(\"no such utxo\");\n\t\t}\n\t}\n\tfor(size_t i = 0; i < tx->outputs.size(); ++i) {\n\t\ttxio_key_t key;\n\t\tkey.txid = txid;\n\t\tkey.index = i;\n\t\tutxo_map[key] = tx->outputs[i];\n\t}\n\ttotal_tx_count++;\n}\n\nvoid process(std::shared_ptr<const Block> block)\n{\n\tconst auto begin = vnx::get_wall_time_micros();\n\n\tif(!block->is_valid()) {\n\t\tthrow std::logic_error(\"invalid block hash\");\n\t}\n\tif(auto tx = block->tx_base) {\n\t\tconst auto id = validate(tx, true);\n\t\tprocess(tx, id, true);\n\t}\n\tstd::vector<hash_t> tx_id(block->tx_list.size());\n\n\tconst auto verify_begin = vnx::get_wall_time_micros();\n\n#pragma omp parallel for\n\tfor(size_t i = 0; i < block->tx_list.size(); ++i) {\n\t\ttx_id[i] = validate(block->tx_list[i]);\n\t}\n\ttotal_verify_time += vnx::get_wall_time_micros() - verify_begin;\n\n\tfor(size_t i = 0; i < block->tx_list.size(); ++i) {\n\t\tprocess(block->tx_list[i], tx_id[i]);\n\t}\n\ttotal_process_time += vnx::get_wall_time_micros() - begin;\n}\n\nint main(int argc, char** argv)\n{\n\tvnx::init(\"test_validation\", argc, argv);\n\n\tint num_keys = 10;\n\tint num_blocks = 10;\n\tvnx::read_config(\"nkeys\", num_keys);\n\tvnx::read_config(\"nblocks\", num_blocks);\n\n\tmmx::secp256k1_init();\n\n\tvector<uint8_t> seed(32);\n\n\tstd::vector<skey_t> skeys;\n\t{\n\t\thash_t state(seed.data(), seed.size());\n\t\tfor(int i = 0; i < num_keys; ++i) {\n\t\t\tskey_t key;\n\t\t\tkey.bytes = state.bytes;\n\t\t\tstate = hash_t(state.bytes);\n\t\t\tskeys.push_back(key);\n\t\t}\n\t}\n\n\tstd::vector<pubkey_t> pubkeys;\n\tstd::unordered_map<pubkey_t, skey_t> skey_map;\n\tfor(const auto& skey : skeys) {\n\t\tconst auto pubkey = pubkey_t::from_skey(skey);\n\t\tskey_map[pubkey] = skey;\n\t\tpubkeys.push_back(pubkey);\n\t}\n\n\tstd::vector<hash_t> addrs;\n\tstd::unordered_map<hash_t, pubkey_t> pubkey_map;\n\tfor(const auto& key : pubkeys) {\n\t\tconst auto addr = key.get_addr();\n\t\tpubkey_map[addr] = key;\n\t\taddrs.push_back(addr);\n\t}\n\n\tauto genesis = Block::create();\n\t{\n\t\tauto base = Transaction::create();\n\t\tfor(int i = 0; i < num_keys; ++i) {\n\t\t\ttx_out_t out;\n\t\t\tout.address = addrs[i];\n\t\t\tout.amount = 1 * COIN;\n\t\t\tbase->outputs.push_back(out);\n\t\t}\n\t\tgenesis->tx_base = base;\n\t}\n\tgenesis->finalize();\n\n\tstd::cout << \"Genesis block hash: \" << genesis->hash << std::endl;\n\n\tprocess(genesis);\n\n\tauto prev = genesis;\n\tfor(int b = 0; b < num_blocks; ++b)\n\t{\n\t\tauto block = Block::create();\n\t\tblock->prev = prev->hash;\n\n\t\tfor(const auto& entry : utxo_map)\n\t\t{\n\t\t\tauto tx = Transaction::create();\n\t\t\tstd::shared_ptr<solution::PubKey> to_sign;\n\n\t\t\tconst auto dst_addr = addrs[rand() % addrs.size()];\n\t\t\t{\n\t\t\t\ttx_out_t out;\n\t\t\t\tout.address = dst_addr;\n\t\t\t\tout.amount = entry.second.amount;\n\t\t\t\ttx->outputs.push_back(out);\n\t\t\t}\n\t\t\t{\n\t\t\t\ttx_in_t in;\n\t\t\t\tin.prev = entry.first;\n\t\t\t\t{\n\t\t\t\t\tauto sol = solution::PubKey::create();\n\t\t\t\t\tsol->pubkey = pubkey_map[entry.second.address];\n\t\t\t\t\tin.solution = sol;\n\t\t\t\t\tto_sign = sol;\n\t\t\t\t}\n\t\t\t\ttx->inputs.push_back(in);\n\t\t\t}\n\t\t\tconst auto id = tx->calc_hash();\n\n\t\t\tif(to_sign) {\n\t\t\t\tto_sign->signature = signature_t::sign(skey_map[to_sign->pubkey], id);\n\t\t\t}\n\t\t\tblock->tx_list.push_back(tx);\n\t\t}\n\t\tblock->finalize();\n\n\t\tstd::cout << \"Block: hash=\" << block->hash << \" ntx=\" << block->tx_list.size() << std::endl;\n\n\t\tprocess(block);\n\n\t\tprev = block;\n\t}\n\n\tstd::cout << \"total_tx_count = \" << total_tx_count << std::endl;\n\tstd::cout << \"total_verify_time = \" << total_verify_time / 1000 << \" ms\" << std::endl;\n\tstd::cout << \"total_process_time = \" << total_process_time / 1000 << \" ms\" << std::endl;\n\tstd::cout << \"tps = \" << 1e6 / (total_process_time / total_tx_count) << std::endl;\n\n\tvnx::close();\n\n\tmmx::secp256k1_free();\n\n\treturn 0;\n}\n\n\n\n\n\n"
  },
  {
    "path": "test/test_space_diff.cpp",
    "content": "/*\n * test_space_diff.cpp\n *\n *  Created on: Dec 30, 2024\n *      Author: mad\n */\n\n\n#include <mmx/pos/Prover.h>\n#include <mmx/pos/verify.h>\n#include <mmx/utils.h>\n\n#include <vnx/vnx.h>\n\nusing namespace mmx;\n\n\nint main(int argc, char** argv)\n{\n\tmmx::secp256k1_init();\n\n\tstd::map<std::string, std::string> options;\n\toptions[\"f\"] = \"file\";\n\toptions[\"n\"] = \"iter\";\n\toptions[\"s\"] = \"diff\";\n\toptions[\"file\"] = \"plot file\";\n\toptions[\"iter\"] = \"number of iterations\";\n\toptions[\"diff\"] = \"space diff\";\n\n\tvnx::write_config(\"log_level\", 2);\n\n\tvnx::init(\"test_space_diff\", argc, argv, options);\n\n\tint num_iter = 1000;\n\tint plot_filter = 4;\n\tstd::string file_name;\n\tuint64_t space_diff = 1;\n\n\tvnx::read_config(\"file\", file_name);\n\tvnx::read_config(\"iter\", num_iter);\n\tvnx::read_config(\"diff\", space_diff);\n\n\tconst auto params = get_params();\n\n\tstd::cout << \"Iterations: \" << num_iter << std::endl;\n\tstd::cout << \"Difficulty: \" << space_diff << std::endl;\n\n\tconst auto prover = std::make_shared<pos::Prover>(file_name);\n\tconst auto ksize = prover->get_ksize();\n\n\tstd::cout << \"K Size: \" << ksize << std::endl;\n\tstd::cout << \"Effective Size: \" << get_effective_plot_size(ksize) / 1e12 << \" TB\" << std::endl;\n\n\tint total_proofs = 0;\n\n\tfor(int iter = 0; iter < num_iter; ++iter)\n\t{\n\t\tconst hash_t challenge(prover->get_plot_id() + std::to_string(iter));\n\n\t\tconst auto qualities = prover->get_qualities(challenge, plot_filter);\n\n\t\tfor(const auto& entry : qualities) {\n\t\t\ttry {\n\t\t\t\tif(!entry.valid) {\n\t\t\t\t\tthrow std::runtime_error(entry.error_msg);\n\t\t\t\t}\n\t\t\t\tconst auto quality = pos::calc_quality(challenge, entry.meta);\n\n\t\t\t\tif(check_proof_threshold(params, ksize, quality, space_diff, false)) {\n\t\t\t\t\ttotal_proofs++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch(const std::exception& ex) {\n\t\t\t\tstd::cerr << \"Threw: \" << ex.what() << std::endl;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst int total_challenges = num_iter << plot_filter;\n\n\tstd::cout << \"---------------------------------------------------\" << std::endl;\n\tstd::cout << \"Total Proofs: \" << total_proofs << std::endl;\n\tstd::cout << \"Total Challenges: \" << total_challenges << std::endl;\n\tstd::cout << \"Proof Chance: \" << double(total_proofs) / total_challenges << std::endl;\n\n\n\tvnx::close();\n\tmmx::secp256k1_free();\n\n\treturn 0;\n}\n\n\n\n\n"
  },
  {
    "path": "test/test_swap_algo.cpp",
    "content": "/*\n * test_swap_algo.cpp\n *\n *  Created on: Oct 26, 2022\n *      Author: mad\n */\n\n#include <array>\n#include <iostream>\n#include <vnx/vnx.h>\n#include <uint256_t.h>\n\nconstexpr int FRACT_BITS = 20;\n\n\nclass User {\npublic:\n\tstd::array<uint256_t, 2> wallet = {0, 0};\n\tstd::array<uint256_t, 2> balance = {0, 0};\n\n\tstd::array<uint256_t, 2> last_user_total = {0, 0};\t\t// user total at last payout\n\tstd::array<uint256_t, 2> last_fees_paid = {0, 0};\t\t// pool fees at last payout\n\n};\n\nclass Swap {\npublic:\n\tstd::array<uint256_t, 2> wallet = {0, 0};\n\tstd::array<uint256_t, 2> balance = {0, 0};\n\tstd::array<uint256_t, 2> user_total = {0, 0};\n\tstd::array<uint256_t, 2> fees_paid = {0, 0};\n\tstd::array<uint256_t, 2> fees_claimed = {0, 0};\n\n\tconst uint256_t max_fee_rate = (uint256_t(1) << FRACT_BITS) / 4;\n\tconst uint256_t min_fee_rate = (uint256_t(1) << FRACT_BITS) / 2048;\n\n\tvoid add_liquid(User& user, std::array<uint256_t, 2> amount)\n\t{\n\t\tpayout(user);\n\n\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\tif(amount[i]) {\n\t\t\t\twallet[i] += amount[i];\n\t\t\t\tbalance[i] += amount[i];\n\t\t\t\tuser_total[i] += amount[i];\n\t\t\t\tuser.balance[i] += amount[i];\n\t\t\t\tuser.last_user_total[i] = user_total[i];\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid rem_liquid(User& user, const int i, uint256_t amount)\n\t{\n\t\tif(amount == 0) {\n\t\t\tthrow std::logic_error(\"amount == 0\");\n\t\t}\n\t\tif(amount > user.balance[i]) {\n\t\t\tthrow std::logic_error(\"amount > user balance\");\n\t\t}\n\t\tuint256_t ret_amount = amount;\n\n\t\tif(balance[i] < user_total[i]) {\n\t\t\tret_amount = (amount * balance[i]) / user_total[i];\n\n\t\t\tconst int k = (i + 1) % 2;\n\t\t\tif(balance[k] > user_total[k]) {\n\t\t\t\tconst auto trade_amount = ((balance[k] - user_total[k]) * amount) / user_total[i];\n\t\t\t\tuser.wallet[k] += trade_amount;\n\t\t\t\twallet[k] -= trade_amount;\n\t\t\t\tbalance[k] -= trade_amount;\n\t\t\t}\n\t\t}\n\t\tuser.wallet[i] += ret_amount;\n\t\tuser.balance[i] -= amount;\n\t\twallet[i] -= ret_amount;\n\t\tbalance[i] -= ret_amount;\n\t\tuser_total[i] -= amount;\n\t}\n\n\tvoid trade(User& user, const int i, uint256_t amount)\n\t{\n\t\tif(amount == 0) {\n\t\t\treturn;\n\t\t}\n\t\tconst int k = (i + 1) % 2;\n\t\tif(balance[k] == 0) {\n\t\t\tthrow std::logic_error(\"nothing to buy\");\n\t\t}\n\t\twallet[i] += amount;\n\t\tbalance[i] += amount;\n\n\t\tconst auto trade_amount = (amount * balance[k]) / balance[i];\n\t\tif(trade_amount < 4) {\n\t\t\tthrow std::logic_error(\"trade_amount < 4\");\n\t\t}\n\t\tconst auto fee_rate = std::max((trade_amount * max_fee_rate) / balance[k], min_fee_rate);\n\t\tconst auto fee_amount = std::max((trade_amount * fee_rate) >> FRACT_BITS, uint256_t(1));\n\n\t\tauto actual_amount = trade_amount - fee_amount;\n\t\tactual_amount = std::min(actual_amount, wallet[k]);\n\t\tuser.wallet[k] += actual_amount;\n\t\twallet[k] -= actual_amount;\n\t\tbalance[k] -= trade_amount;\n\t\tfees_paid[k] += fee_amount;\n\t}\n\n\tvoid payout(User& user)\n\t{\n\t\tconst auto user_share = get_earned_fees(user);\n\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\tif(user_share[i]) {\n\t\t\t\twallet[i] -= user_share[i];\n\t\t\t\tfees_claimed[i] += user_share[i];\n\t\t\t\tuser.wallet[i] += user_share[i];\n\t\t\t}\n\t\t\tuser.last_user_total[i] = user_total[i];\n\t\t\tuser.last_fees_paid[i] = fees_paid[i];\n\t\t}\n\t}\n\n\tstd::array<uint256_t, 2> get_earned_fees(User& user)\n\t{\n\t\tstd::array<uint256_t, 2> user_share = {0, 0};\n\t\tfor(int i = 0; i < 2; ++i) {\n\t\t\tif(user.balance[i]) {\n\t\t\t\tconst auto total_fees = fees_paid[i] - user.last_fees_paid[i];\n\t\t\t\tuser_share[i] = (2 * total_fees * user.balance[i])\n\t\t\t\t\t\t/ (user_total[i] + user.last_user_total[i]);\n\t\t\t\tuser_share[i] = std::min(user_share[i], wallet[i] - balance[i]);\n\t\t\t}\n\t\t}\n\t\treturn user_share;\n\t}\n\n};\n\n\nint main()\n{\n\t{\n\t\tSwap swap;\n\n\t\tUser A;\n\t\tUser B;\n\t\tUser C;\n\n\t\tswap.add_liquid(A, {1000, 0});\n\t\tswap.add_liquid(B, {0, 5000});\n\t\tswap.add_liquid(A, {1000, 0});\n\t\tswap.add_liquid(B, {0, 5000});\n\t\tstd::cout << \"A_balance = [\" << A.balance[0] << \", \" << A.balance[1] << \"]\" << std::endl;\n\t\tstd::cout << \"B_balance = [\" << B.balance[0] << \", \" << B.balance[1] << \"]\" << std::endl;\n\t\tstd::cout << \"balance =   [\" << swap.balance[0] << \", \" << swap.balance[1] << \"]\" << std::endl;\n\t\tstd::cout << \"wallet =    [\" << swap.wallet[0] << \", \" << swap.wallet[1] << \"]\" << std::endl << std::endl;\n\n\t\tswap.trade(C, 0, 1000);\n\t\tstd::cout << \"wallet =   [\" << swap.wallet[0] << \", \" << swap.wallet[1] << \"]\" << std::endl;\n\t\tstd::cout << \"balance =  [\" << swap.balance[0] << \", \" << swap.balance[1] << \"]\" << std::endl;\n\t\tstd::cout << \"C_wallet = [\" << C.wallet[0] << \", \" << C.wallet[1] << \"]\" << std::endl << std::endl;\n\n\t\tswap.payout(B);\n\t\tstd::cout << \"fees_paid =    [\" << swap.fees_paid[0] << \", \" << swap.fees_paid[1] << \"]\" << std::endl;\n\t\tstd::cout << \"fees_claimed = [\" << swap.fees_claimed[0] << \", \" << swap.fees_claimed[1] << \"]\" << std::endl << std::endl;\n\n\t\tswap.rem_liquid(B, 1, 5000);\n\t\tstd::cout << \"wallet =    [\" << swap.wallet[0] << \", \" << swap.wallet[1] << \"]\" << std::endl;\n\t\tstd::cout << \"balance =   [\" << swap.balance[0] << \", \" << swap.balance[1] << \"]\" << std::endl;\n\t\tstd::cout << \"B_balance = [\" << B.balance[0] << \", \" << B.balance[1] << \"]\" << std::endl;\n\t\tstd::cout << \"B_wallet =  [\" << B.wallet[0] << \", \" << B.wallet[1] << \"]\" << std::endl << std::endl;\n\n\t\tswap.rem_liquid(A, 0, A.balance[0]);\n\t\tswap.rem_liquid(B, 1, B.balance[1]);\n\t\tstd::cout << \"wallet =   [\" << swap.wallet[0] << \", \" << swap.wallet[1] << \"]\" << std::endl;\n\t\tstd::cout << \"balance =  [\" << swap.balance[0] << \", \" << swap.balance[1] << \"]\" << std::endl;\n\t\tstd::cout << \"A_wallet = [\" << A.wallet[0] << \", \" << A.wallet[1] << \"]\" << std::endl;\n\t\tstd::cout << \"B_wallet = [\" << B.wallet[0] << \", \" << B.wallet[1] << \"]\" << std::endl << std::endl;\n\t}\n\n\n\treturn 0;\n}\n\n"
  },
  {
    "path": "test/test_transactions.cpp",
    "content": "/*\n * test_transactions.cpp\n *\n *  Created on: Sep 23, 2022\n *      Author: mad\n */\n\n#include <mmx/ECDSA_Wallet.h>\n#include <mmx/NodeClient.hxx>\n#include <mmx/KeyFile.hxx>\n#include <mmx/contract/MultiSig.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/operation/Execute.hxx>\n#include <mmx/solution/MultiSig.hxx>\n#include <mmx/utils.h>\n\n#include <vnx/vnx.h>\n#include <vnx/Proxy.h>\n\nusing namespace mmx;\n\nvoid expect_fail(NodeClient& node, std::shared_ptr<Transaction> tx)\n{\n\ttry {\n\t\tnode.add_transaction(tx, true);\n\t} catch(...) {\n\t\treturn;\n\t}\n\tthrow std::logic_error(\"expected fail\");\n}\n\n\nint main(int argc, char** argv)\n{\n\tmmx::secp256k1_init();\n\n\tstd::map<std::string, std::string> options;\n\toptions[\"w\"] = \"wallet\";\n\toptions[\"n\"] = \"node\";\n\n\tvnx::init(\"test_transactions\", argc, argv, options);\n\n\tstd::string key_path = \"wallet.dat\";\n\tstd::string node_url = \":11331\";\n\tvnx::read_config(\"wallet\", key_path);\n\n\tauto key_file = vnx::read_from_file<KeyFile>(key_path);\n\tif(!key_file) {\n\t\tthrow std::logic_error(\"missing wallet: \" + key_path);\n\t}\n\tconst auto params = mmx::get_params();\n\tif(params->network.empty()) {\n\t\tthrow std::logic_error(\"no network configured\");\n\t}\n\n\tvnx::Handle<vnx::Proxy> proxy = new vnx::Proxy(\"Proxy\", vnx::Endpoint::from_url(node_url));\n\tproxy->forward_list = {\"Node\"};\n\tproxy.start();\n\n\tNodeClient node(\"Node\");\n\n\taccount_t config;\n\tconfig.key_file = key_path;\n\tconfig.num_addresses = 100;\n\n\tECDSA_Wallet wallet(key_file->seed_value, config, params);\n\twallet.unlock();\n\n\tconst auto height = node.get_height();\n\tconst auto balances = node.get_all_balances(wallet.get_all_addresses());\n\twallet.update_cache(balances, {}, height);\n\n\t{\n\t\tauto tx = Transaction::create();\n\t\ttx->sender = wallet.get_address(0);\n\t\ttx->max_fee_amount = 0;\n\t\twallet.sign_off(tx);\n\n\t\tstd::cout << tx->to_string() << std::endl;\n\t\texpect_fail(node, tx);\n\t}\n\t{\n\t\tauto tx = Transaction::create();\n\t\ttx->sender = wallet.get_address(0);\n\t\ttx->fee_ratio = 0;\n\t\ttx->max_fee_amount = 100000;\n\t\twallet.sign_off(tx);\n\n\t\tstd::cout << tx->to_string() << std::endl;\n\t\texpect_fail(node, tx);\n\t}\n\t{\n\t\tauto tx = Transaction::create();\n\t\ttx->sender = wallet.get_address(0);\n\t\ttx->fee_ratio = 100 * 1024;\n\t\ttx->max_fee_amount = 100000;\n\t\twallet.sign_off(tx);\n\n\t\tstd::cout << tx->to_string() << std::endl;\n\t\texpect_fail(node, tx);\n\t}\n\t{\n\t\tauto tx = Transaction::create();\n\t\ttx->sender = wallet.get_address(config.num_addresses - 1);\n\t\ttx->max_fee_amount = 100000;\n\t\twallet.sign_off(tx);\n\n\t\tstd::cout << tx->to_string() << std::endl;\n\t\texpect_fail(node, tx);\n\t}\n\t{\n\t\tauto tx = Transaction::create();\n\t\ttx->expires = 0;\n\t\ttx->sender = wallet.get_address(0);\n\t\ttx->max_fee_amount = 100000;\n\t\twallet.sign_off(tx);\n\n\t\tstd::cout << tx->to_string() << std::endl;\n\t\texpect_fail(node, tx);\n\t}\n\t{\n\t\tauto tx = Transaction::create();\n\t\ttx->sender = wallet.get_address(0);\n\t\ttx->add_output(addr_t(), addr_t(), -1);\n\t\ttx->max_fee_amount = 100000;\n\t\twallet.sign_off(tx);\n\n\t\tstd::cout << tx->to_string() << std::endl;\n\t\texpect_fail(node, tx);\n\t}\n\t{\n\t\tauto tx = Transaction::create();\n\t\ttx->sender = wallet.get_address(0);\n\t\ttx->add_input(addr_t(), wallet.get_address(0), -1);\n\t\ttx->add_output(addr_t(), addr_t(), -1);\n\t\ttx->max_fee_amount = 100000;\n\t\twallet.sign_off(tx);\n\n\t\tstd::cout << tx->to_string() << std::endl;\n\t\texpect_fail(node, tx);\n\t}\n\t{\n\t\tauto tx = Transaction::create();\n\t\ttx->sender = wallet.get_address(0);\n\t\ttx->add_input(addr_t(), wallet.get_address(0), 100000);\n\t\tfor(int i = 0; i < 100000; ++i) {\n\t\t\ttx->add_output(addr_t(), addr_t(), 1);\n\t\t}\n\t\ttx->max_fee_amount = -1;\n\t\twallet.sign_off(tx);\n\n\t\texpect_fail(node, tx);\n\t}\n\t{\n\t\tauto tx = Transaction::create();\n\t\ttx->sender = wallet.get_address(0);\n\t\ttx->add_input(addr_t(), wallet.get_address(0), 1);\n\t\ttx->add_output(addr_t(), addr_t(), 1);\n\t\ttx->outputs[0].memo = std::string(txio_t::MAX_MEMO_SIZE + 1, 'M');\n\t\ttx->max_fee_amount = -1;\n\t\twallet.sign_off(tx);\n\n\t\tstd::cout << tx->to_string() << std::endl;\n\t\texpect_fail(node, tx);\n\t}\n\t{\n\t\tauto tx = Transaction::create();\n\t\ttx->sender = wallet.get_address(0);\n\t\tauto exec = mmx::contract::Executable::create();\n\t\texec->binary = params->plot_nft_binary;\n\t\texec->init_args.emplace_back(tx->sender->to_string());\n\t\ttx->deploy = exec;\n\t\tauto op = mmx::operation::Execute::create();\n\t\top->method = \"transfer\";\n\t\top->user = wallet.get_address(0);\n\t\top->args.emplace_back(wallet.get_address(1).to_string());\n\t\ttx->execute.push_back(op);\n\t\ttx->max_fee_amount = -1;\n\t\twallet.sign_off(tx);\n\n\t\tstd::cout << tx->to_string() << std::endl;\n\t\tnode.add_transaction(tx, true);\n\t}\n\t{\n\t\tauto tx = Transaction::create();\n\t\ttx->sender = wallet.get_address(0);\n\t\tauto multi = contract::MultiSig::create();\n\t\tmulti->num_required = 3;\n\t\tfor(int i = 0; i < 3; ++i) {\n\t\t\tmulti->owners.insert(wallet.get_address(i));\n\t\t}\n\t\ttx->deploy = multi;\n\t\ttx->max_fee_amount = -1;\n\t\twallet.sign_off(tx);\n\n\t\tstd::cout << tx->to_string() << std::endl;\n\t\tnode.add_transaction(tx, true);\n\t}\n\n\tvnx::close();\n\n\tmmx::secp256k1_free();\n\n\treturn 0;\n}\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "test/test_validation.cpp",
    "content": "/*\n * test_validation.cpp\n *\n *  Created on: Nov 27, 2021\n *      Author: mad\n */\n\n#include <mmx/Block.hxx>\n#include <mmx/skey_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/solution/PubKey.hxx>\n\n#include <vnx/vnx.h>\n\nusing namespace mmx;\n\n\nstatic constexpr uint64_t COIN = 1000000;\n\nstd::unordered_map<hash_t, std::shared_ptr<const Contract>> contract_map;\n\nstd::unordered_map<hash_t, std::unordered_map<size_t, tx_out_t>> utxo_map;\n\nint64_t total_tx_count = 0;\nint64_t total_verify_time = 0;\nint64_t total_process_time = 0;\n\n\nhash_t validate(std::shared_ptr<const Transaction> tx, bool is_base = false)\n{\n\tconst auto id = tx->calc_hash();\n\n\tbls::AugSchemeMPL MPL;\n\tuint64_t base_amount = 0;\n\tstd::unordered_map<hash_t, uint64_t> amounts;\n\n\tfor(const auto& in : tx->inputs)\n\t{\n\t\tauto iter = utxo_map.find(in.prev_tx);\n\t\tif(iter == utxo_map.end()) {\n\t\t\tthrow std::logic_error(\"invalid prev_tx\");\n\t\t}\n\t\tconst auto& entry = iter->second;\n\n\t\tauto iter2 = entry.find(in.index);\n\t\tif(iter2 == entry.end()) {\n\t\t\tthrow std::logic_error(\"invalid index\");\n\t\t}\n\t\tconst auto& out = iter2->second;\n\n\t\t// verify signature\n\t\tif(!in.solution) {\n\t\t\tthrow std::logic_error(\"no solution\");\n\t\t}\n\t\t{\n\t\t\tauto iter = contract_map.find(out.address);\n\t\t\tif(iter != contract_map.end()) {\n\t\t\t\tauto contract = iter->second;\n\t\t\t\t// TODO\n\t\t\t}\n\t\t\telse if(auto sol = std::dynamic_pointer_cast<const solution::PubKey>(in.solution))\n\t\t\t{\n\t\t\t\tif(sol->pubkey.get_addr() != out.address) {\n\t\t\t\t\tthrow std::logic_error(\"wrong pubkey\");\n\t\t\t\t}\n\t\t\t\tconst auto G1 = sol->pubkey.to_bls();\n\t\t\t\tconst auto G2 = sol->signature.to_bls();\n\n\t\t\t\tif(!MPL.Verify(G1, bls::Bytes(id.bytes.data(), id.bytes.size()), G2)) {\n\t\t\t\t\tthrow std::logic_error(\"wrong signature\");\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow std::logic_error(\"invalid solution\");\n\t\t\t}\n\t\t}\n\t\tamounts[out.contract] += out.amount;\n\t}\n\tfor(const auto& op : tx->execute)\n\t{\n\t\t// TODO\n\t}\n\tfor(const auto& out : tx->outputs)\n\t{\n\t\tif(is_base) {\n\t\t\tif(out.contract != hash_t()) {\n\t\t\t\tthrow std::logic_error(\"invalid coin base contract\");\n\t\t\t}\n\t\t\tbase_amount += out.amount;\n\t\t}\n\t\telse {\n\t\t\tauto iter = amounts.find(out.contract);\n\t\t\tif(iter == amounts.end()) {\n\t\t\t\tthrow std::logic_error(\"invalid output contract\");\n\t\t\t}\n\t\t\tauto& value = iter->second;\n\t\t\tif(out.amount > value) {\n\t\t\t\tthrow std::logic_error(\"output > input\");\n\t\t\t}\n\t\t\tvalue -= out.amount;\n\t\t}\n\t}\n\treturn id;\n}\n\nvoid process(std::shared_ptr<const Transaction> tx, const hash_t& tx_id, bool is_base = false)\n{\n\tfor(const auto& in : tx->inputs)\n\t{\n\t\tauto iter = utxo_map.find(in.prev_tx);\n\t\tif(iter != utxo_map.end()) {\n\t\t\tauto& entry = iter->second;\n\t\t\tauto iter2 = entry.find(in.index);\n\t\t\tif(iter2 != entry.end()) {\n\t\t\t\tentry.erase(iter2);\n\t\t\t}\n\t\t\tif(entry.empty()) {\n\t\t\t\tutxo_map.erase(iter);\n\t\t\t}\n\t\t}\n\t}\n\tauto& entry = utxo_map[tx_id];\n\tentry.reserve(tx->outputs.size());\n\n\tfor(size_t i = 0; i < tx->outputs.size(); ++i) {\n\t\tentry[i] = tx->outputs[i];\n\t}\n\ttotal_tx_count++;\n}\n\nvoid process(std::shared_ptr<const Block> block)\n{\n\tconst auto begin = vnx::get_wall_time_micros();\n\n\tif(!block->is_valid()) {\n\t\tthrow std::logic_error(\"invalid block hash\");\n\t}\n\tif(auto tx = block->coin_base) {\n\t\tconst auto id = validate(tx, true);\n\t\tprocess(tx, id, true);\n\t}\n\tstd::vector<hash_t> tx_id(block->tx_list.size());\n\n\tconst auto verify_begin = vnx::get_wall_time_micros();\n\n#pragma omp parallel for\n\tfor(size_t i = 0; i < block->tx_list.size(); ++i) {\n\t\ttx_id[i] = validate(block->tx_list[i]);\n\t}\n\ttotal_verify_time += vnx::get_wall_time_micros() - verify_begin;\n\n\tfor(size_t i = 0; i < block->tx_list.size(); ++i) {\n\t\tprocess(block->tx_list[i], tx_id[i]);\n\t}\n\ttotal_process_time += vnx::get_wall_time_micros() - begin;\n}\n\nint main(int argc, char** argv)\n{\n\tvnx::init(\"test_validation\", argc, argv);\n\n\tint num_keys = 10;\n\tint num_blocks = 10;\n\tvnx::read_config(\"nkeys\", num_keys);\n\tvnx::read_config(\"nblocks\", num_blocks);\n\n\tvector<uint8_t> seed(32);\n\n\tbls::AugSchemeMPL MPL;\n\tconst bls::PrivateKey master_sk = MPL.KeyGen(seed);\n\n\tstd::vector<bls::PrivateKey> keys;\n\tfor(int i = 0; i < num_keys; ++i) {\n\t\tkeys.push_back(MPL.DeriveChildSk(master_sk, i));\n\t}\n\n\tstd::vector<pubkey_t> pubkeys;\n\tstd::unordered_map<pubkey_t, skey_t> skey_map;\n\tfor(const auto& key : keys) {\n\t\tconst auto G1 = key.GetG1Element();\n\t\tskey_map[G1] = key;\n\t\tpubkeys.emplace_back(G1);\n\t}\n\n\tstd::vector<hash_t> addrs;\n\tstd::unordered_map<hash_t, pubkey_t> pubkey_map;\n\tfor(const auto& key : pubkeys) {\n\t\tconst auto addr = key.get_addr();\n\t\tpubkey_map[addr] = key;\n\t\taddrs.push_back(addr);\n\t}\n\n\tauto genesis = Block::create();\n\t{\n\t\tauto base = Transaction::create();\n\t\tfor(int i = 0; i < num_keys; ++i) {\n\t\t\ttx_out_t out;\n\t\t\tout.address = addrs[i];\n\t\t\tout.amount = 1 * COIN;\n\t\t\tbase->outputs.push_back(out);\n\t\t}\n\t\tgenesis->coin_base = base;\n\t}\n\tgenesis->finalize();\n\n\tstd::cout << \"Genesis block hash: \" << genesis->hash << std::endl;\n\n\tprocess(genesis);\n\n\tauto prev = genesis;\n\t{\n\t\tauto block = Block::create();\n\t\tblock->prev = prev->hash;\n\n\t\tconst auto prev_tx = genesis->coin_base->calc_hash();\n\n\t\tfor(const auto& utxo : utxo_map[prev_tx])\n\t\t{\n\t\t\tauto tx = Transaction::create();\n\t\t\tstd::vector<std::shared_ptr<solution::PubKey>> to_sign;\n\t\t\t{\n\t\t\t\tconst auto dst_addr = addrs[rand() % addrs.size()];\n\t\t\t\t{\n\t\t\t\t\ttx_out_t out;\n\t\t\t\t\tout.address = dst_addr;\n\t\t\t\t\tout.amount = utxo.second.amount;\n\t\t\t\t\ttx->outputs.push_back(out);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\ttx_in_t in;\n\t\t\t\t\tin.prev_tx = prev_tx;\n\t\t\t\t\tin.index = utxo.first;\n\t\t\t\t\t{\n\t\t\t\t\t\tauto sol = solution::PubKey::create();\n\t\t\t\t\t\tsol->pubkey = pubkey_map[utxo.second.address];\n\t\t\t\t\t\tin.solution = sol;\n\t\t\t\t\t\tto_sign.push_back(sol);\n\t\t\t\t\t}\n\t\t\t\t\ttx->inputs.push_back(in);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst auto id = tx->calc_hash();\n\n\t\t\tfor(const auto& sol : to_sign)\n\t\t\t{\n\t\t\t\tsol->signature = MPL.Sign(skey_map[sol->pubkey].to_bls(), bls::Bytes(id.bytes.data(), id.bytes.size()));\n\t\t\t}\n\t\t\tblock->tx_list.push_back(tx);\n\t\t}\n\t\tblock->finalize();\n\n\t\tstd::cout << \"Block: hash=\" << block->hash << \" ntx=\" << block->tx_list.size() << std::endl;\n\n\t\tprocess(block);\n\n\t\tprev = block;\n\t}\n\n\tfor(int b = 0; b < num_blocks; ++b)\n\t{\n\t\tauto block = Block::create();\n\t\tblock->prev = prev->hash;\n\n\t\tfor(const auto& entry : utxo_map)\n\t\t{\n\t\t\tauto tx = Transaction::create();\n\t\t\tstd::vector<std::shared_ptr<solution::PubKey>> to_sign;\n\n\t\t\tfor(const auto& utxo : entry.second)\n\t\t\t{\n\t\t\t\tconst auto dst_addr = addrs[rand() % addrs.size()];\n\t\t\t\t{\n\t\t\t\t\ttx_out_t out;\n\t\t\t\t\tout.address = dst_addr;\n\t\t\t\t\tout.amount = utxo.second.amount;\n\t\t\t\t\ttx->outputs.push_back(out);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\ttx_in_t in;\n\t\t\t\t\tin.prev_tx = entry.first;\n\t\t\t\t\tin.index = utxo.first;\n\t\t\t\t\t{\n\t\t\t\t\t\tauto sol = solution::PubKey::create();\n\t\t\t\t\t\tsol->pubkey = pubkey_map[utxo.second.address];\n\t\t\t\t\t\tin.solution = sol;\n\t\t\t\t\t\tto_sign.push_back(sol);\n\t\t\t\t\t}\n\t\t\t\t\ttx->inputs.push_back(in);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst auto id = tx->calc_hash();\n\n\t\t\tfor(const auto& sol : to_sign)\n\t\t\t{\n\t\t\t\tsol->signature = MPL.Sign(skey_map[sol->pubkey].to_bls(), bls::Bytes(id.bytes.data(), id.bytes.size()));\n\t\t\t}\n\t\t\tblock->tx_list.push_back(tx);\n\t\t}\n\t\tblock->finalize();\n\n\t\tstd::cout << \"Block: hash=\" << block->hash << \" ntx=\" << block->tx_list.size() << std::endl;\n\n\t\tprocess(block);\n\n\t\tprev = block;\n\t}\n\n\tstd::cout << \"total_tx_count = \" << total_tx_count << std::endl;\n\tstd::cout << \"total_verify_time = \" << total_verify_time / 1000 << \" ms\" << std::endl;\n\tstd::cout << \"total_process_time = \" << total_process_time / 1000 << \" ms\" << std::endl;\n\tstd::cout << \"tps = \" << 1e6 / (total_process_time / total_tx_count) << std::endl;\n\n\tvnx::close();\n\n\treturn 0;\n}\n\n\n\n\n\n\n"
  },
  {
    "path": "test/test_write_bytes_vitest_gen.cpp",
    "content": "#include <limits>\n\n#include <vnx/vnx.h>\n#include <mmx/write_bytes.h>\n\nusing namespace mmx;\n\ntemplate<typename T>\nvoid static print_test(const std::string& testname, const T& value, const std::string& jsvalue) {\n\tstd::vector<uint8_t> buffer;\n\tvnx::VectorOutputStream stream(&buffer);\n\tvnx::OutputBuffer out(&stream);\n\twrite_field(out, \"field_name\", value);\n\tout.flush();\n\tconst auto cppHex = vnx::to_hex_string(buffer.data(), buffer.size());\n\n\tconst auto test =\n\t\t\"it(\\\"\" + testname + \"\\\", () => {\\n\"\n\t\t\"   const wb = new WriteBytes();\\n\"\n\t\t\"   wb.write_field(\\\"field_name\\\", \" + jsvalue + \");\\n\"\n\t\t\"   const jsHex = wb.buffer.toHex();\\n\"\n\t\t\"   const cppHex = \\\"\" + cppHex + \"\\\";\\n\"\n\t\t\"   assert.equal(jsHex, cppHex);\\n\"\n\t\t\"});\";\n\n\tstd::cout << test << std::endl << std::endl;\n}\n\nint main(int argc, char** argv)\n{\n\t{\n\t\tconst auto testname = \"bool true\";\n\t\tconstexpr auto value = true;\n\t\tconst std::string jsvalue = \"true\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"bool false\";\n\t\tconstexpr auto value = false;\n\t\tconst std::string jsvalue = \"false\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"uint64_t\";\n\t\tconstexpr auto value = (uint64_t)1337;\n\t\tconst std::string jsvalue = std::to_string(value) + \"n\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"uint64_t min\";\n\t\tconstexpr auto value = std::numeric_limits<uint64_t>::min();\n\t\tconst std::string jsvalue = std::to_string(value) + \"n\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"uint64_t max\";\n\t\tconstexpr auto value = std::numeric_limits<uint64_t>::max();\n\t\tconst std::string jsvalue = std::to_string(value) + \"n\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t//{\n\t//\tconst auto testname = \"uint32_t\";\n\t//\tconst auto value = (uint32_t)1337;\n\t//\tconst std::string jsvalue = std::to_string(value);\n\t//\tprint_test(testname, value, jsvalue);\n\t//}\n\n\t//{\n\t//\tconst auto testname = \"uint16_t\";\n\t//\tconst auto value = (uint16_t)1337;\n\t//\tconst std::string jsvalue = std::to_string(value);\n\t//\tprint_test(testname, value, jsvalue);\n\t//}\n\n\t//{\n\t//\tconst auto testname = \"uint8_t\";\n\t//\tconst auto value = (uint16_t)1337;\n\t//\tconst std::string jsvalue = std::to_string(value);\n\t//\tprint_test(testname, value, jsvalue);\n\t//}\n\n\t{\n\t\tconst auto testname = \"int64_t\";\n\t\tconstexpr auto value = (int64_t)1337;\n\t\tconst std::string jsvalue = std::to_string(value) + \"n\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"int64_t min\";\n\t\tconstexpr auto value = std::numeric_limits<int64_t>::min();\n\t\tconst std::string jsvalue = std::to_string(value) + \"n\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"int64_t max\";\n\t\tconstexpr auto value = std::numeric_limits<int64_t>::max();\n\t\tconst std::string jsvalue = std::to_string(value) + \"n\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t//{\n\t//\tconst auto testname = \"int32_t\";\n\t//\tconst auto value = (int32_t)1337;\n\t//\tconst std::string jsvalue = std::to_string(value);\n\t//\tprint_test(testname, value, jsvalue);\n\t//}\n\n\t//{\n\t//\tconst auto testname = \"int16_t\";\n\t//\tconst auto value = (int16_t)1337;\n\t//\tconst std::string jsvalue = std::to_string(value);\n\t//\tprint_test(testname, value, jsvalue);\n\t//}\n\n\t//{\n\t//\tconst auto testname = \"int8_t\";\n\t//\tconst auto value = (int16_t)1337;\n\t//\tconst std::string jsvalue = std::to_string(value);\n\t//\tprint_test(testname, value, jsvalue);\n\t//}\n\n\t// TODO uint128\n\n\t{\n\t\tconst auto testname = \"string\";\n\t\tconst std::string value = \"string\";\n\t\tconst std::string jsvalue = \"\\\"\" + value + \"\\\"\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\tconst auto test_vector = std::vector<uint8_t>{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };\n\n\t{\n\t\tconst auto testname = \"bytes_t\";\n\t\tconst auto value = bytes_t<16>(test_vector);\n\t\tconst std::string jsvalue = \"new bytes_t(new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]))\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"bytes_t empty\";\n\t\tconst auto value = bytes_t<0>();\n\t\tconst std::string jsvalue = \"new bytes_t()\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"bytes_t addr_t\";\n\t\tconst auto value = addr_t(\"mmx1ckyz0x7fpet4y7zmckyg7lklp8dc5gdr2kjd8hamk49rnk8zu9eq2cnz7a\");\n\t\tconst std::string jsvalue = \"new addr_t(\\\"mmx1ckyz0x7fpet4y7zmckyg7lklp8dc5gdr2kjd8hamk49rnk8zu9eq2cnz7a\\\")\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"vector\";\n\t\tconst auto value = test_vector;\n\t\tconst std::string jsvalue = \"new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"vector string\";\n\t\tconst auto value = std::vector<std::string>{ \"1337\", \"hello\", \"world\"};\n\t\tconst std::string jsvalue = \"[\\\"1337\\\", \\\"hello\\\", \\\"world\\\"]\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"vector uint64_t\";\n\t\tconst auto value = std::vector<uint64_t>{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };\n\t\tconst std::string jsvalue = \"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"vector empty\";\n\t\tconst auto value = std::vector<uint8_t>{};\n\t\tconst std::string jsvalue = \"new Uint8Array([])\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"Variant empty\";\n\t\tconst vnx::Variant value;\n\t\tconst std::string jsvalue = \"new Variant()\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"Variant bool true\";\n\t\tconst vnx::Variant value(true);\n\t\tconst std::string jsvalue = \"new Variant(true)\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"Variant bool false\";\n\t\tconst vnx::Variant value(false);\n\t\tconst std::string jsvalue = \"new Variant(false)\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"Variant int\";\n\t\tconst vnx::Variant value(255);\n\t\tconst std::string jsvalue = \"new Variant(255)\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"Variant string\";\n\t\tconst vnx::Variant value(\"1337\");\n\t\tconst std::string jsvalue = \"new Variant(\\\"1337\\\")\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"Variant vector\";\n\t\tconst vnx::Variant value(test_vector);\n\t\tconst std::string jsvalue = \"new Variant([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\t\n\t{\n\t\tconst auto testname = \"Variant vnx::Object\";\n\t\tvnx::Object obj;\n\t\tobj[\"field1\"] = \"1337\";\n\t\tobj[\"field2\"] = (uint64_t)1337;\n\t\tconst vnx::Variant value(obj);\n\t\tconst std::string jsvalue = \"new Variant(new vnxObject({field1: \\\"1337\\\", field2: 1337}))\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"vnx::Object\";\n\t\tvnx::Object value;\n\t\tvalue[\"field1\"] = \"1337\";\n\t\tvalue[\"field2\"] = (uint64_t)1337;\n\t\tconst std::string jsvalue = \"new vnxObject({field1: \\\"1337\\\", field2: 1337})\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"vnx::Object empty\";\n\t\tconst vnx::Object value;\n\t\tconst std::string jsvalue = \"new vnxObject()\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"txout_t\";\n\t\ttxout_t value;\n\t\tvalue.address = addr_t(\"mmx1ckyz0x7fpet4y7zmckyg7lklp8dc5gdr2kjd8hamk49rnk8zu9eq2cnz7a\");\n\t\tvalue.contract = addr_t();\n\t\tvalue.amount = 255;\n\t\tvalue.memo = \"memo\";\n\n\t\tconst std::string jsvalue = \"new txout_t({address: \\\"mmx1ckyz0x7fpet4y7zmckyg7lklp8dc5gdr2kjd8hamk49rnk8zu9eq2cnz7a\\\", contract : \\\"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\\\", amount : 255,memo : \\\"memo\\\"})\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"txin_t\";\n\t\ttxin_t value;\n\t\tvalue.address = addr_t(\"mmx1ckyz0x7fpet4y7zmckyg7lklp8dc5gdr2kjd8hamk49rnk8zu9eq2cnz7a\");\n\t\tvalue.contract = addr_t();\n\t\tvalue.amount = 255;\n\t\tvalue.memo = \"memo\";\n\t\tvalue.solution = 255;\n\t\tvalue.flags = 255;\n\n\t\tconst std::string jsvalue = \"new txin_t({address: \\\"mmx1ckyz0x7fpet4y7zmckyg7lklp8dc5gdr2kjd8hamk49rnk8zu9eq2cnz7a\\\", contract : \\\"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\\\", amount : 255,memo : \\\"memo\\\", solution: 255, flags: 255 })\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t// TODO ulong_fraction_t time_segment_t compile_flags_t method_t\n\n\t{\n\t\tconst auto testname = \"optional\";\n\t\tconst auto value = vnx::optional<std::vector<uint8_t>>(test_vector);\n\t\tconst std::string jsvalue = \"new optional(new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]))\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"optional nullptr\";\n\t\tconst auto value = vnx::optional<std::vector<uint8_t>>(nullptr);\n\t\tconst std::string jsvalue = \"new optional(null)\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"pair\";\n\t\tstd::pair <std::string, uint8_t> value(\"test1\", 255);\n\t\tconst std::string jsvalue = \"new pair(\\\"test1\\\", 255)\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"map\";\n\t\tstd::map<std::string, uint8_t> value = { {\"test1\", 255}, {\"test2\", 255} };\n\t\tconst std::string jsvalue = \"new Map([ [\\\"test1\\\", 255], [\\\"test2\\\", 255] ])\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n\t{\n\t\tconst auto testname = \"map empty\";\n\t\tstd::map<std::string, uint8_t> value = {};\n\t\tconst std::string jsvalue = \"new Map([])\";\n\t\tprint_test(testname, value, jsvalue);\n\t}\n\n}\n\n"
  },
  {
    "path": "test/vm/AFL/compile_all.sh",
    "content": "#!/bin/bash\n\nmmx_compile -f ../compiler_tests.js -o inputs/compiler_tests.js.dat\nmmx_compile -f ../engine_tests.js -o inputs/engine_tests.js.dat\n\nfor file in ../fails/*.js; do\n        echo \"Compiling [$file]\"\n        mmx_compile -f $file -o inputs/${file}.dat\ndone\n\nmv fails/*.dat inputs/\nrmdir fails\n\n"
  },
  {
    "path": "test/vm/AFL/inputs/js/compiler_tests.js",
    "content": "\nnull;\n\n{\n\tvar test;\n\tif(test != null) {\n\t\tfail(\"empty var\");\n\t}\n}\n\nfunction test1(a, b = 1) {\n\treturn a + b;\n}\n\nif(test1(1) != 2) {\n\tfail(\"test1\");\n}\n\nif(concat(to_string(1), to_string(2), to_string(3)) != \"123\") {\n\tfail(\"concat()\", 1);\n}\n\n{\n\tvar map = {};\n\tif(map.test != null) {\n\t\tfail(\"map.test != null\");\n\t}\n}\n{\n\tvar map = {};\n\tmap.tmp = 123;\n\tif(map.tmp != 123) {\n\t\tfail(\"var to key assignment\");\n\t}\n}\n{\n\tvar map = {\"test\": 123};\n\tconst tmp = map.test;\n\tif(tmp != 123) {\n\t\tfail(\"key to var assignment\");\n\t}\n\tmap.tmp = map.test;\n\tif(map.tmp != 123) {\n\t\tfail(\"key to key assignment\");\n\t}\n}\n\nif(balance() != 0) {\n\tfail(\"balance() != 0\");\n}\nif(balance(sha256(\"test\")) != 0) {\n\tfail(\"balance(test) != 0\");\n}\nif(this.balance[bech32()] != 0) {\n\tfail(\"this.balance != 0\");\n}\n{\n\tvar tmp = balance();\n\tif(tmp != 0) {\n\t\tfail(\"balance() != 0\");\n\t}\n\ttmp = 1337;\n}\n{\n\tvar tmp = this.balance[bech32()];\n\tif(tmp != 0) {\n\t\tfail(\"this.balance != 0\");\n\t}\n\ttmp = 1337;\n}\n\n{\n\tvar array = [1, 2, 3];\n\tfor(var entry of array) {\n\t\tentry = 0;\n\t}\n\tfor(const entry of array) {\n\t\tif(entry == 0) {\n\t\t\tfail(\"var entry of array (integer)\");\n\t\t}\n\t}\n}\n{\n\tvar array = [\"1\", \"2\", \"3\"];\n\tfor(var entry of array) {\n\t\tentry = \"0\";\n\t}\n\tfor(const entry of array) {\n\t\tif(entry == \"0\") {\n\t\t\tfail(\"var entry of array (string)\");\n\t\t}\n\t}\n}\n{\n\tvar array = [[1], [2], [3]];\n\tfor(var entry of array) {\n\t\tentry = [];\n\t}\n\tfor(const entry of array) {\n\t\tif(size(entry) == 0) {\n\t\t\tfail(\"var entry of array (array)\");\n\t\t}\n\t}\n}\n{\n\tvar array = [{val: 1}, {val: 2}, {val: 3}];\n\tfor(var entry of array) {\n\t\tentry = {val: 0};\n\t}\n\tfor(const entry of array) {\n\t\tif(entry.val == 0) {\n\t\t\tfail(\"var entry of array (object)\");\n\t\t}\n\t}\n}\n\n{\n\tvar obj = {key: \"value\"};\n\tif(obj.key != \"value\") {\n\t\tfail(\"object key (1)\");\n\t}\n}\n{\n\tvar obj = {\"key\": \"value\"};\n\tif(obj.key != \"value\") {\n\t\tfail(\"object key (2)\");\n\t}\n}\n{\n\tvar obj = {test: 123, key: \"value\"};\n\tif(obj.key != \"value\") {\n\t\tfail(\"object key (3)\");\n\t}\n}\n{\n\tvar obj = { key : \"value\" };\n\tif(obj.key != \"value\") {\n\t\tfail(\"object key (4)\");\n\t}\n}\n{\n\tvar obj = { \tkey\t\t : \t\"value\" };\n\tif(obj.key != \"value\") {\n\t\tfail(\"object key (5)\");\n\t}\n}\n{\n\tvar obj = {_key_: \"value\"};\n\tif(obj._key_ != \"value\") {\n\t\tfail(\"object _key_\");\n\t}\n}\n\nif(1337 / 16 != 83) {\n\tfail(\"1337 / 16 != 83\");\n}\nif(1337 % 16 != 9) {\n\tfail(\"1337 % 16 != 9\");\n}\nif(1337133713371337 / 1024 != 1305794641964) {\n\tfail(\"1337133713371337 / 1024 != 1305794641964\");\n}\nif(1337133713371337 % 1024 != 201) {\n\tfail(\"1337133713371337 % 1024 != 201\");\n}\n\nif(false) {\n\tfail(\"if(false)\");\n}\nif(!true) {\n\tfail(\"if(!true)\");\n}\nif(1 == 2) {\n\tfail(\"if(1 == 2)\");\n}\nif(1 != 1) {\n\tfail(\"if(1 != 1)\");\n}\nif(2 < 1) {\n\tfail(\"if(2 < 1)\");\n}\nif(1 > 2) {\n\tfail(\"if(1 > 2)\");\n}\nif(2 <= 1) {\n\tfail(\"if(2 <= 1)\");\n}\nif(1 >= 2) {\n\tfail(\"if(1 >= 2)\");\n}\nif(!(1 == 1)) {\n\tfail(\"if(!(1 == 1))\");\n}\nif((1 == 1) && (1 == 0)) {\n\tfail(\"if((1 == 1) && (1 == 0))\");\n}\nif((1 != 1) || (1 != 1)) {\n\tfail(\"if((1 != 1) || (1 != 1))\");\n}\nif(0) {\n\tfail(\"if(0)\");\n}\nif(null) {\n\tfail(\"if(null)\");\n}\nif(\"\") {\n\tfail(\"if('')\");\n}\nif(!1337) {\n\tfail(\"if(!1337)\");\n}\nif(!\"test\") {\n\tfail(\"if(!'test')\");\n}\nif(!(true && 1337 && \"test\")) {\n\tfail(\"if(!(1 && true && 'test'))\");\n}\nif(0 || null || \"\") {\n\tfail(\"if(0 || null || '')\");\n}\nif(!(0 || null || 1)) {\n\tfail(\"if(!(null || null || 1))\");\n}\n{\n\tvar cond = (1 > 2);\n\tif(cond) {\n\t\tfail(\"if(cond)\");\n\t}\n}\n{\n\tconst cond = (1 > 2);\n\tif(cond) {\n\t\tfail(\"if(cond)\");\n\t}\n}\n\n\n\n"
  },
  {
    "path": "test/vm/AFL/inputs/js/engine_tests.js",
    "content": "\n{}\n\n{\n}\n\nif(false) {\n\tfail(\"false\");\n}\nif(!true) {\n\tfail(\"!\");\n}\nif(!(!false)) {\n\tfail(\"!!\");\n}\nif(true && false) {\n\tfail(\"true && false\");\n}\nif(false && true) {\n\tfail(\"false && true\");\n}\nif(!(true || false)) {\n\tfail(\"true || false\");\n}\nif(!(false || true)) {\n\tfail(\"false || true\");\n}\nif(!(true && true)) {\n\tfail(\"true && true\");\n}\nif(!(true || true)) {\n\tfail(\"true && true\");\n}\nif(false || false) {\n\tfail(\"false || false\");\n}\nif(false && false) {\n\tfail(\"false && false\");\n}\nif(false ^ false) {\n\tfail(\"false ^ false\");\n}\nif(true ^ true) {\n\tfail(\"true ^ true\");\n}\nif(!(false ^ true)) {\n\tfail(\"false ^ true\");\n}\nif(!(true ^ false)) {\n\tfail(\"false ^ true\");\n}\nif(true) {\n\t// pass\n} else {\n\tfail(\"else\");\n}\nif(false) {\n\tfail(\"else-if\");\n} else if(false) {\n\tfail(\"else-if\");\n} else if(false) {\n\tfail(\"else-if\");\n} else {\n\t// pass\n}\n\nif(null != null) {\n\tfail(\"null != null\");\n}\nif(null == 0) {\n\tfail(\"null == 0\");\n}\nif(null == false) {\n\tfail(\"null == false\");\n}\nif(null == true) {\n\tfail(\"null == true\");\n}\nif(null == \"\") {\n\tfail(\"null == ''\");\n}\nif(!(null == null)) {\n\tfail(\"!(null == null)\");\n}\nif(!(null != 0)) {\n\tfail(\"!(null != 0)\");\n}\nif(!(null != false)) {\n\tfail(\"!(null != false)\");\n}\nif(!(null != true)) {\n\tfail(\"!(null != true)\");\n}\nif(!(null != \"\")) {\n\tfail(\"!(null != '')\");\n}\n\nif(!(1 > 0)) {\n\tfail(\"1 > 0\");\n}\nif(!(1 >= 0)) {\n\tfail(\"1 >= 0\");\n}\nif(!(1 >= 1)) {\n\tfail(\"1 >= 1\");\n}\nif(!(0 < 1)) {\n\tfail(\"0 < 1\");\n}\nif(!(0 <= 1)) {\n\tfail(\"0 <= 1\");\n}\nif(!(1 <= 1)) {\n\tfail(\"1 <= 1\");\n}\n\nif((1 >> 0) != 1) {\n\tfail(\"1 >> 0\");\n}\nif((2 >> 1) != 1) {\n\tfail(\"2 >> 1\");\n}\nif((1 << 0) != 1) {\n\tfail(\"1 << 0\");\n}\nif((1 << 1) != 2) {\n\tfail(\"1 << 1\");\n}\n\nif(1 + 1 != 2) {\n\tfail(\"add\", 1);\n}\nif(1 - 1 != 0) {\n\tfail(\"sub\", 1);\n}\n\nif(1 * 1 != 1) {\n\tfail(\"mul\", 1);\n}\nif(1337 * 1337 != 1787569) {\n\tfail(\"mul\", 2);\n}\nif(18446744073709551615 * 18446744073709551615 != 340282366920938463426481119284349108225) {\n\tfail(\"mul\", 3);\n}\nif(340282366920938463463374607431768211455 * 340282366920938463463374607431768211455 != 115792089237316195423570985008687907852589419931798687112530834793049593217025) {\n\tfail(\"mul\", 4);\n}\nif(86605900701059233675071791330357447908204924955602516110289890806217748420 * 1337 != 115792089237316195423570985008687907853269984665640564039457584007913129637540) {\n\tfail(\"mul\", 5);\n}\n\nif(3 / 2 != 1) {\n\tfail(\"div\", 1);\n}\nif(13371337 / 1337 != 10001) {\n\tfail(\"div\", 2);\n}\nif(340282366920938463463374607431768211455 / 1337 != 254511867554927796158096191048442940) {\n\tfail(\"div\", 3);\n}\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 / 1337 != 86605900701059233675071791330357447908204924955602516110289890806217748421) {\n\tfail(\"div\", 4);\n}\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 / 340282366920938463463374607431768211455 != 340282366920938463463374607431768211457) {\n\tfail(\"div\", 5);\n}\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 / 86605900701059233675071791330357447908204924955602516110289890806217748420 != 1337) {\n\tfail(\"div\", 6);\n}\nif((3 >> 0) != 3) {\n\tfail(\"3 >> 0\");\n}\nif(3 / 1 != 3) {\n\tfail(concat(\"div 3 / 1 => \", to_string(3 / 1)));\n}\nif(13371337 / 1024 != 13057) {\n\tfail(\"div 13371337 / 1024\");\n}\nfor(var i = 1; i < 100; ++i) {\n\tif((11 * i) / i != 11) {\n\t\tfail(concat(\"div (11 * i) / i: \", to_string(i)));\n\t}\n}\n\nif(3 % 2 != 1) {\n\tfail(\"mod\", 1);\n}\nif(13371337 % 1337 != 0) {\n\tfail(\"mod\", 2);\n}\nif(340282366920938463463374607431768211455 % 1337 != 675) {\n\tfail(\"mod\", 3);\n}\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 % 1337 != 1058) {\n\tfail(\"mod\", 4);\n}\nif(3 % 1 != 0) {\n\tfail(\"mod 3 % 1\");\n}\nif(13371337 % 1024 != 969) {\n\tfail(\"mod 13371337 % 1024\");\n}\nfor(var i = 1; i < 100; ++i) {\n\tif((11 * i) % i != 0) {\n\t\tfail(concat(\"mod (11 * i) % i: \", to_string(i)));\n\t}\n}\n\nif((0xFF00FF ^ 0xFF00FF) != 0) {\n\tfail(\"xor\", 1);\n}\nif((0xFF00FF & 0xFFFFFF) != 0xFF00FF) {\n\tfail(\"and\", 1);\n}\nif((0xFF00FF | 0) != 0xFF00FF) {\n\tfail(\"or\", 1);\n}\nif((~0xFF00FF & 0xFFFFFF) != 0x00FF00) {\n\tfail(\"not\", 1);\n}\n\n{\n\tvar res = 0;\n\tfor(var i = 0; i < 10; ++i) {\n\t\tres += 2;\n\t}\n\tif(res != 20) {\n\t\tfail(\"for\", 1);\n\t}\n}\n{\n\tvar res = 0;\n\tfor(var i of [1, 2, 3]) {\n\t\tres += i;\n\t}\n\tif(res != 6) {\n\t\tfail(\"for\", 2);\n\t}\n}\n\nif(0x100 != 256) {\n\tfail(\"hex\", 1);\n}\nif(0b100 != 4) {\n\tfail(\"bin\", 1);\n}\nif(uint(\"\") != 0) {\n\tfail(\"uint('')\");\n}\nif(uint(\"0b01011101010001\") != 0b01011101010001) {\n\tfail(\"uint(bin)\", 1);\n}\nif(uint(111) != 111) {\n\tfail(\"uint(dec)\", 1);\n}\nif(uint(\"111820312618873087563030836565815045174850059154595088905299609727287843170569\") != 111820312618873087563030836565815045174850059154595088905299609727287843170569) {\n\tfail(\"uint(dec)\", 2);\n}\nif(uint(\"0x0123456789ABCDEF\") != 0x0123456789ABCDEF) {\n\tfail(\"uint(hex)\", 1);\n}\nif(uint(\"0x0123456789abcdef\") != 0x0123456789abcdef) {\n\tfail(\"uint(hex)\", 2);\n}\nif(uint(\"0x09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7\") != 0x09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7) {\n\tfail(\"uint(hex)\", 3);\n}\nif(uint(\"0b1001\") != 9) {\n\tfail(\"uint(bin)\", 1);\n}\nif(bech32(\"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\") != binary_hex(\"0000000000000000000000000000000000000000000000000000000000000000\")) {\n\tfail(\"bech32\", 1);\n}\nif(bech32(\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\") != binary_hex(\"09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7\")) {\n\tfail(\"bech32\", 2);\n}\nif(to_string_bech32(binary_hex(\"09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7\")) != \"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\") {\n\tfail(\"bech32\", 3);\n}\nif(bech32(\"MMX\") != bech32()) {\n\tfail(\"bech32\", 4);\n}\nif(bech32() != binary_hex(\"0000000000000000000000000000000000000000000000000000000000000000\")) {\n\tfail(\"bech32\", 5);\n}\nif(bech32(null) != bech32()) {\n\tfail(\"bech32\", 6);\n}\nif(to_string(1337) != \"1337\") {\n\tfail(\"to_string(1337)\");\n}\nif(to_string(18446744073709551615) != \"18446744073709551615\") {\n\tfail(\"to_string(18446744073709551615)\");\n}\nif(to_string(340282366920938463463374607431768211455) != \"340282366920938463463374607431768211455\") {\n\tfail(\"to_string(340282366920938463463374607431768211455)\");\n}\nif(to_string_hex(0x01234567ABCDE) != \"1234567abcde\") {\n\tfail(\"to_string_hex(0x01234567ABCDE)\");\n}\nif(to_string_hex(0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855) != \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\") {\n\tfail(\"to_string_hex(0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855)\");\n}\nif(to_string_bech32(bech32(\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\")) != \"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\") {\n\tfail(\"to_string_bech32(mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf)\");\n}\nif(to_string(binary(\"ABCDEF\")) != \"ABCDEF\") {\n\tfail(\"binary(ABCDEF)\");\n}\nif(to_string_hex(binary(\"AB\")) != \"4142\") {\n\tfail(\"binary(AB)\");\n}\nif(to_string_hex(binary_hex(\"0123456789ABCDEF\")) != \"0123456789ABCDEF\") {\n\tfail(\"binary_hex(0123456789ABCDEF)\");\n}\nif(to_string_hex(binary_hex(\"0x0123456789ABCDEF\")) != \"0123456789ABCDEF\") {\n\tfail(\"binary_hex(0x0123456789ABCDEF)\");\n}\nif(concat(\"A\", \"BC\", \"D\") != \"ABCD\") {\n\tfail(\"concat()\", 1);\n}\nif(memcpy(\"ABC\", 1) != \"A\") {\n\tfail(concat(\"memcpy(ABC, 1): '\", memcpy(\"ABC\", 1), \"'\"));\n}\nif(memcpy(\"ABC\", 2, 1) != \"BC\") {\n\tfail(\"memcpy(ABC, 2, 1)\");\n}\nif(sha256(\"\") != binary_hex(\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\")) {\n\tfail(\"sha256()\", 1);\n}\nif(sha256(\"abc\") != binary_hex(\"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad\")) {\n\tfail(\"sha256()\", 2);\n}\nif(ecdsa_verify(\n\t\tbinary_hex(\"F3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964A\"),\n\t\tbinary_hex(\"02054191D5103F7A04B2E5B53AF253A6476F11DDCDB3B4134D74CFD642969B082E\"),\n\t\tbinary_hex(\"C05F13C85BDDFBB0A198697FAAC6973AA008AA45544FB7AB586B636405F73F215237D508C6FAE90C24BE424584640F824864B6FF3F2B99FB2104BBD5743E8E39\")) != true)\n{\n\tfail(\"ecdsa_verify\", 1);\n}\nif(ecdsa_verify(\n\t\tbinary_hex(\"A3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964A\"),\n\t\tbinary_hex(\"02054191D5103F7A04B2E5B53AF253A6476F11DDCDB3B4134D74CFD642969B082E\"),\n\t\tbinary_hex(\"C05F13C85BDDFBB0A198697FAAC6973AA008AA45544FB7AB586B636405F73F215237D508C6FAE90C24BE424584640F824864B6FF3F2B99FB2104BBD5743E8E39\")) != false)\n{\n\tfail(\"ecdsa_verify\", 2);\n}\nif(size(\"123\") != 3) {\n\tfail(\"size('123')\");\n}\nif(size(binary(\"123\")) != 3) {\n\tfail(\"size(binary('123'))\");\n}\nif(min(1, 2, 3) != 1) {\n\tfail(\"min()\");\n}\nif(max(1, 2, 3) != 3) {\n\tfail(\"max()\");\n}\nif(typeof(null) != 0) {\n\tfail(\"typeof(null)\");\n}\nif(typeof(false) != 1) {\n\tfail(\"typeof(false)\");\n}\nif(typeof(true) != 2) {\n\tfail(\"typeof(true)\");\n}\nif(typeof(1) != 4) {\n\tfail(\"typeof(1)\");\n}\nif(typeof(\"\") != 5) {\n\tfail(\"typeof('')\");\n}\nif(typeof(binary(\"\")) != 6) {\n\tfail(\"typeof(binary)\");\n}\nif(typeof([]) != 7) {\n\tfail(\"typeof([])\");\n}\nif(typeof({}) != 8) {\n\tfail(\"typeof({})\");\n}\nif(deref(clone(1)) != 1) {\n\tfail(\"deref(clone(1)) != 1\");\n}\nif(bool(null) != false) {\n\tfail(\"bool(null)\");\n}\nif(bool(false) != false) {\n\tfail(\"bool(false)\");\n}\nif(bool(true) != true) {\n\tfail(\"bool(true)\");\n}\nif(bool(0) != false) {\n\tfail(\"bool(0)\");\n}\nif(bool(10) != true) {\n\tfail(\"bool(10)\");\n}\nif(bool(\"\") != false) {\n\tfail(\"bool('')\");\n}\nif(bool(\"0\") != true) {\n\tfail(\"bool('0')\");\n}\nif(bool(binary(\"\")) != false) {\n\tfail(\"bool(binary(''))\");\n}\nif(bool(binary(\"0\")) != true) {\n\tfail(\"bool(binary('0')\");\n}\nif(bool([]) != true) {\n\tfail(\"bool([])\");\n}\nif(bool({}) != true) {\n\tfail(\"bool({})\");\n}\nif(uint(null) != 0) {\n\tfail(\"uint(null)\");\n}\nif(uint(false) != 0) {\n\tfail(\"uint(false)\");\n}\nif(uint(true) != 1) {\n\tfail(\"uint(true)\");\n}\nif(uint_hex(\"aabbc\") != 0xaabbc) {\n\tfail(\"uint_hex('aabbc')\");\n}\nif(uint(binary(0xABCDEF0)) != 0xABCDEF0) {\n\tfail(\"uint(binary(0xABCDEF0))\");\n}\nif(uint(binary(binary(0xABCDEF0))) != 0xABCDEF0) {\n\tfail(\"uint(binary(binary(0xABCDEF0)))\");\n}\nif(uint_le(binary_le(0xABCDEF0)) != 0xABCDEF0) {\n\tfail(\"uint_le(binary_le(0xABCDEF0))\");\n}\nif(bech32(binary(bech32(\"MMX\"))) != bech32(\"MMX\")) {\n\tfail(\"bech32(binary(bech32(MMX)))\");\n}\nif([] == []) {\n\tfail(\"[] == []\");\n}\nif({} == {}) {\n\tfail(\"[] == []\");\n}\nif(to_string(\"test\") != \"test\") {\n\tfail(\"to_string(test)\");\n}\n\n__nop();\n\n{\n\tvar array = [];\n\tif(size(array) != 0) {\n\t\tfail(\"size(array) != 0\");\n\t}\n\tpush(array, 11);\n\tif(array[0] != 11) {\n\t\tfail(\"array[0] != 11\");\n\t}\n\tif(size(array) != 1) {\n\t\tfail(\"size(array) != 1\");\n\t}\n\tarray[0] = 12;\n\t{\n\t\tvar tmp = clone(array);\n\t\tif(tmp[0] != 12) {\n\t\t\tfail(\"clone: array[0] != 12\");\n\t\t}\n\t\tpop(tmp);\n\t}\n\tif(pop(array) != 12) {\n\t\tfail(\"pop(array) != 12\");\n\t}\n\tif(size(array) != 0) {\n\t\tfail(\"size(array) != 0\");\n\t}\n\tif(array[35345345345] != null) {\n\t\tfail(\"array[35345345345] != null\");\n\t}\n}\n{\n\tvar map = {};\n\tif(map.field != null) {\n\t\tfail(\"map.field != null\");\n\t}\n\tmap.field = 1337;\n\tif(get(map, \"field\") != 1337) {\n\t\tfail(\"map.field != 1337\");\n\t}\n\tmap.field++;\n\tif(map.field != 1338) {\n\t\tfail(\"map.field != 1338\");\n\t}\n\tset(map, \"field\", 1339);\n\t{\n\t\tvar tmp = clone(map);\n\t\tif(tmp.field != 1339) {\n\t\t\tfail(\"clone: tmp.field != 1339\");\n\t\t}\n\t\terase(tmp, \"field\");\n\t}\n\tif(map.field != 1339) {\n\t\tfail(\"map.field != 1339\");\n\t}\n\terase(map, \"field\");\n\tif(map.field != null) {\n\t\tfail(\"after erase: map.field != null\");\n\t}\n\t{\n\t\tvar tmp = clone(map);\n\t\tif(tmp.field != null) {\n\t\t\tfail(\"clone: tmp.field != null\");\n\t\t}\n\t}\n}\n{\n\tvar map = {};\n\tmap[0] = true;\n\tmap[false] = true;\n\tmap[true] = true;\n\tmap[\"test\"] = true;\n\tmap[binary(\"bin123\")] = true;\n\tvar tmp0 = [];\n\tmap[tmp0] = true;\n\tvar tmp1 = {};\n\tmap[tmp1] = true;\n\t\n\tif(map[0] == null) {\n\t\tfail(\"map[0] == null\");\n\t}\n\tif(map[false] == null) {\n\t\tfail(\"map[false] == null\");\n\t}\n\tif(map[true] == null) {\n\t\tfail(\"map[true] == null\");\n\t}\n\tif(map[\"test\"] == null) {\n\t\tfail(\"map['test'] == null\");\n\t}\n\tif(map[binary(\"bin123\")] == null) {\n\t\tfail(\"map[bin123] == null\");\n\t}\n\tif(map[tmp0] == null) {\n\t\tfail(\"map[tmp0] == null\");\n\t}\n\tif(map[tmp1] == null) {\n\t\tfail(\"map[tmp1] == null\");\n\t}\n}\n{\n\tvar test = {\n\t\tfield: \"value\",\n\t\t\"field1\": 123\n\t};\n\tif(test.field != \"value\") {\n\t\tfail(\"test.field\");\n\t}\n\tif(test.field1 != 123) {\n\t\tfail(\"test.field1\");\n\t}\n\tvar test2 = {};\n\ttest2.field = test.field;\n\tif(test2.field != test.field) {\n\t\tfail(\"test2.field\");\n\t}\n}\n{\n\tvar test = null;\n\tif(test.field != null) {\n\t\tfail(\"null.field != null\");\n\t}\n}\n{\n\tvar test = concat([1, 2], [3, 4], [5]);\n\tif(size(test) != 5) {\n\t\tfail(\"concat: size(test) != 5\");\n\t}\n\tfor(var i = 0; i < 5; ++i) {\n\t\tif(test[i] != i + 1) {\n\t\t\tfail(\"test[i] != i + 1\");\n\t\t}\n\t}\n}\n{\n\tvar test = {\n\t\tfield: {\n\t\t\tfield: 1337\n\t\t}\n\t};\n\tvar test2 = test;\n\ttest = null;\n\tif(test2.field.field != 1337) {\n\t\tfail(\"test2.field.field != 1337\");\n\t}\n}\n{\n\tvar test = 1;\n\tdelete(test);\n\ttest = 1;\n\tif(test != 1) {\n\t\tfail(\"use after delete()\");\n\t}\n}\n{\n\tvar test = [1, 2, 3];\n\tpop(test);\n\tpush(test, 4);\n\tif(test[2] != 4) {\n\t\tfail(\"test[2] != 4\");\n\t}\n}\n{\n\tvar test = [1, 2, 3];\n\tvar test2 = deref(test);\n\tif(size(test2) != 3) {\n\t\tfail(\"size(test2) != 3\");\n\t}\n\tfor(var i = 0; i < size(test2); ++i) {\n\t\tif(test2[i] != i + 1) {\n\t\t\tfail(\"test2[i] != i + 1\");\n\t\t}\n\t}\n\tpop(test2);\n\tpop(test2);\n\tif(size(test) != 3) {\n\t\tfail(\"size(test) != 3\");\n\t}\n\tfor(var i = 0; i < size(test); ++i) {\n\t\tif(test[i] != i + 1) {\n\t\t\tfail(\"test[i] != i + 1\");\n\t\t}\n\t}\n}\n{\n\tvar test = [null, true, false, 1, \"test\", [], {}];\n\tif(test[0] != null) {\n\t\tfail(\"test[0] != null\");\n\t}\n\tif(test[1] != true) {\n\t\tfail(\"test[1] != true\");\n\t}\n\tif(test[2] != false) {\n\t\tfail(\"test[2] != false\");\n\t}\n\tif(test[3] != 1) {\n\t\tfail(\"test[3] != 1\");\n\t}\n\tif(test[4] != \"test\") {\n\t\tfail(\"test[4] != test\");\n\t}\n}\n{\n\tvar map = {};\n\tconst key = bech32(\"mmx1cxn9nan8xyw3zflxheaf2c2mrzgexzp33j9rwqmxw7ed3ut09wqsr06jmq\");\n\tmap[key] = 1337;\n\tif(map[key] != 1337) {\n\t\tfail(\"map[key] != 1337 (key = bech32())\");\n\t}\n}\n{\n\tconst array = [1, 2, 3];\n\tconst tmp = array;\n\tpush(tmp, 4);\n\tif(array[3] != 4) {\n\t\tfail(\"array[3] != 4\");\n\t}\n}\n{\n\tconst object = {\"foo\": {}};\n\tconst foo = object.foo;\n\tfoo.bar = true;\n\tif(object.foo.bar != true) {\n\t\tfail(\"object.foo.bar != true\");\n\t}\n}\n{\n\tconst obj = {\"foo\": true};\n\tdelete(obj.foo);\n\tif(obj.foo != true) {\n\t\tfail(\"delete(): obj.foo != true\");\n\t}\n}\n{\n\tvar map = {};\n\tif(map[bech32()] == 0) {\n\t\tfail(\"map[bech32()] == 0\");\n\t}\n}\n{\n\tvar obj = {test: \"data\"};\n\tobj.ptr = obj;\n\tdelete(obj);\n}\n{\n\tconst A = {};\n\tconst B = {ptr: A};\n\tA.ptr = B;\n}\n{\n\tvar array = [1, 2, 3];\n\tpop(array);\n\tif(array[2] != null) {\n\t\tfail(\"array[2] != null\");\n\t}\n\tif(array[1337] != null) {\n\t\tfail(\"array[1337] != null\");\n\t}\n}\n\n\n"
  },
  {
    "path": "test/vm/AFL/inputs/js/test_plot_nft.js",
    "content": "\ninterface __test;\ninterface plot_nft;\n\nconst MMX = bech32();\nconst binary = __test.compile(\"src/contract/plot_nft.js\");\n\nconst owner = \"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\";\n\nconst plot_nft_addr = plot_nft.__deploy({\n\t__type: \"mmx.contract.Executable\",\n\tbinary: binary,\n\tinit_args: [owner]\n});\n\nplot_nft.check_owner({__test: 1, user: owner});\nplot_nft.check_owner({__test: 1, user: bech32(owner)});\nplot_nft.check_owner({__test: 1, assert_fail: true});\n\n__test.assert(plot_nft.is_locked() == false);\n\n__test.assert(__test.get_balance(plot_nft_addr, bech32()) == 0);\n\nconst farmer = \"mmx1e7yktu9vpeyq7hx39cmagzfp2um3kddwjf4tlt8j3kmktwc7fk6qmyc6ns\";\n\n__test.assert(plot_nft.mmx_reward_target(null) == owner);\n__test.assert(plot_nft.mmx_reward_target(farmer) == farmer);\n\nconst pool_target = \"mmx1uj2dth7r9tcn3vas42f0hzz74dkz8ygv59mpx44n7px7j7yhvv4sfmkf0d\";\n\nplot_nft.lock(pool_target, null, {__test: 1, user: owner});\n\n__test.assert(plot_nft.is_locked() == true);\n__test.assert(plot_nft.mmx_reward_target(null) == pool_target);\n__test.assert(plot_nft.mmx_reward_target(farmer) == pool_target);\n\nplot_nft.set_server_url(\"http://pool.mmx.network\", {__test: 1, user: owner});\n\nconst pool_wallet = \"mmx13nf0pdarcfdm7tmxxlchnq9yw8gdvnymg5avfad04t5yqu7myewq6wkcqp\";\n\n__test.send(plot_nft_addr, 500000, MMX);\n\nplot_nft.claim_all(owner, MMX, {__test: 1, user: owner, assert_fail: true});\nplot_nft.claim_all(pool_wallet, MMX, {__test: 1, user: pool_target});\n\n__test.assert(__test.get_balance(pool_wallet, MMX) == 500000);\n\nplot_nft.unlock({__test: true, user: owner});\n\n__test.assert(plot_nft.is_locked() == true);\n__test.inc_height(1);\n__test.assert(plot_nft.is_locked() == true);\n__test.inc_height(255);\n__test.assert(plot_nft.is_locked() == false);\n\n__test.assert(plot_nft.mmx_reward_target(null) == owner);\n__test.assert(plot_nft.mmx_reward_target(farmer) == farmer);\n\nconst owner_wallet = \"mmx1mlurm4px73xghkdn02u60qff4f795nnmt04e4as595tf4luvasmsggxmfk\";\n\n__test.send(plot_nft_addr, 500000, MMX);\n\nplot_nft.claim_all(owner_wallet, MMX, {__test: 1, user: owner});\nplot_nft.claim_all(pool_wallet, MMX, {__test: 1, user: pool_target, assert_fail: true});\n\n__test.assert(__test.get_balance(owner_wallet, MMX) == 500000);\n\n__test.inc_height(100);\n\n__test.assert(plot_nft.is_locked() == false);\n\nplot_nft.lock(pool_target, null, {__test: 1, user: owner});\n\n__test.assert(plot_nft.is_locked() == true);\n__test.assert(plot_nft.mmx_reward_target(null) == pool_target);\n__test.assert(plot_nft.mmx_reward_target(farmer) == pool_target);\n\n__test.inc_height(100);\n\n__test.assert(plot_nft.is_locked() == true);\n\nconst new_owner = \"mmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\";\n\nplot_nft.transfer(new_owner, null, {__test: 1, user: owner});\n\nplot_nft.unlock({__test: true, user: owner, assert_fail: true});\nplot_nft.unlock({__test: true, user: new_owner});\n\n\n"
  },
  {
    "path": "test/vm/AFL/inputs/json/engine_tests.js.json",
    "content": "{\"__type\": \"mmx.contract.Binary\", \"version\": 0, \"name\": \"\", \"fields\": [], \"methods\": [], \"constant\": [0, 1, 5, 5, 0, 0, 0, 102, 97, 108, 115, 101, 2, 5, 1, 0, 0, 0, 33, 5, 2, 0, 0, 0, 33, 33, 5, 13, 0, 0, 0, 116, 114, 117, 101, 32, 38, 38, 32, 102, 97, 108, 115, 101, 5, 13, 0, 0, 0, 102, 97, 108, 115, 101, 32, 38, 38, 32, 116, 114, 117, 101, 5, 13, 0, 0, 0, 116, 114, 117, 101, 32, 124, 124, 32, 102, 97, 108, 115, 101, 5, 13, 0, 0, 0, 102, 97, 108, 115, 101, 32, 124, 124, 32, 116, 114, 117, 101, 5, 12, 0, 0, 0, 116, 114, 117, 101, 32, 38, 38, 32, 116, 114, 117, 101, 5, 14, 0, 0, 0, 102, 97, 108, 115, 101, 32, 124, 124, 32, 102, 97, 108, 115, 101, 5, 14, 0, 0, 0, 102, 97, 108, 115, 101, 32, 38, 38, 32, 102, 97, 108, 115, 101, 5, 13, 0, 0, 0, 102, 97, 108, 115, 101, 32, 94, 32, 102, 97, 108, 115, 101, 5, 11, 0, 0, 0, 116, 114, 117, 101, 32, 94, 32, 116, 114, 117, 101, 5, 12, 0, 0, 0, 102, 97, 108, 115, 101, 32, 94, 32, 116, 114, 117, 101, 5, 4, 0, 0, 0, 101, 108, 115, 101, 5, 7, 0, 0, 0, 101, 108, 115, 101, 45, 105, 102, 5, 12, 0, 0, 0, 110, 117, 108, 108, 32, 33, 61, 32, 110, 117, 108, 108, 9, 0, 0, 5, 9, 0, 0, 0, 110, 117, 108, 108, 32, 61, 61, 32, 48, 5, 13, 0, 0, 0, 110, 117, 108, 108, 32, 61, 61, 32, 102, 97, 108, 115, 101, 5, 12, 0, 0, 0, 110, 117, 108, 108, 32, 61, 61, 32, 116, 114, 117, 101, 5, 0, 0, 0, 0, 5, 10, 0, 0, 0, 110, 117, 108, 108, 32, 61, 61, 32, 39, 39, 5, 15, 0, 0, 0, 33, 40, 110, 117, 108, 108, 32, 61, 61, 32, 110, 117, 108, 108, 41, 5, 12, 0, 0, 0, 33, 40, 110, 117, 108, 108, 32, 33, 61, 32, 48, 41, 5, 16, 0, 0, 0, 33, 40, 110, 117, 108, 108, 32, 33, 61, 32, 102, 97, 108, 115, 101, 41, 5, 15, 0, 0, 0, 33, 40, 110, 117, 108, 108, 32, 33, 61, 32, 116, 114, 117, 101, 41, 5, 13, 0, 0, 0, 33, 40, 110, 117, 108, 108, 32, 33, 61, 32, 39, 39, 41, 9, 1, 0, 5, 5, 0, 0, 0, 49, 32, 62, 32, 48, 5, 6, 0, 0, 0, 49, 32, 62, 61, 32, 48, 5, 6, 0, 0, 0, 49, 32, 62, 61, 32, 49, 5, 5, 0, 0, 0, 48, 32, 60, 32, 49, 5, 6, 0, 0, 0, 48, 32, 60, 61, 32, 49, 5, 6, 0, 0, 0, 49, 32, 60, 61, 32, 49, 5, 6, 0, 0, 0, 49, 32, 62, 62, 32, 48, 9, 2, 0, 5, 6, 0, 0, 0, 50, 32, 62, 62, 32, 49, 5, 6, 0, 0, 0, 49, 32, 60, 60, 32, 48, 5, 6, 0, 0, 0, 49, 32, 60, 60, 32, 49, 5, 3, 0, 0, 0, 97, 100, 100, 5, 3, 0, 0, 0, 115, 117, 98, 5, 3, 0, 0, 0, 109, 117, 108, 9, 57, 5, 10, 177, 70, 27, 0, 11, 255, 255, 255, 255, 255, 255, 255, 255, 12, 1, 0, 0, 0, 0, 0, 0, 0, 254, 255, 255, 255, 255, 255, 255, 255, 9, 3, 0, 12, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 9, 4, 0, 13, 196, 175, 186, 185, 230, 163, 232, 73, 110, 192, 171, 119, 7, 161, 111, 129, 60, 228, 24, 110, 201, 4, 31, 78, 168, 25, 74, 101, 103, 4, 49, 0, 13, 164, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 9, 5, 0, 5, 3, 0, 0, 0, 100, 105, 118, 10, 201, 7, 204, 0, 9, 17, 39, 12, 60, 228, 24, 110, 201, 4, 31, 78, 168, 25, 74, 101, 103, 4, 49, 0, 13, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 13, 197, 175, 186, 185, 230, 163, 232, 73, 110, 192, 171, 119, 7, 161, 111, 129, 60, 228, 24, 110, 201, 4, 31, 78, 168, 25, 74, 101, 103, 4, 49, 0, 13, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 6, 0, 5, 6, 0, 0, 0, 51, 32, 62, 62, 32, 48, 5, 13, 0, 0, 0, 100, 105, 118, 32, 51, 32, 47, 32, 49, 32, 61, 62, 32, 9, 0, 4, 9, 1, 51, 5, 19, 0, 0, 0, 100, 105, 118, 32, 49, 51, 51, 55, 49, 51, 51, 55, 32, 47, 32, 49, 48, 50, 52, 9, 100, 0, 9, 11, 0, 5, 18, 0, 0, 0, 100, 105, 118, 32, 40, 49, 49, 32, 42, 32, 105, 41, 32, 47, 32, 105, 58, 32, 5, 3, 0, 0, 0, 109, 111, 100, 9, 163, 2, 9, 34, 4, 5, 9, 0, 0, 0, 109, 111, 100, 32, 51, 32, 37, 32, 49, 9, 255, 3, 9, 201, 3, 5, 19, 0, 0, 0, 109, 111, 100, 32, 49, 51, 51, 55, 49, 51, 51, 55, 32, 37, 32, 49, 48, 50, 52, 5, 18, 0, 0, 0, 109, 111, 100, 32, 40, 49, 49, 32, 42, 32, 105, 41, 32, 37, 32, 105, 58, 32, 10, 255, 0, 255, 0, 5, 3, 0, 0, 0, 120, 111, 114, 10, 255, 255, 255, 0, 5, 3, 0, 0, 0, 97, 110, 100, 5, 2, 0, 0, 0, 111, 114, 9, 0, 255, 5, 3, 0, 0, 0, 110, 111, 116, 9, 10, 0, 9, 20, 0, 5, 3, 0, 0, 0, 102, 111, 114, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 1, 5, 3, 0, 0, 0, 104, 101, 120, 5, 3, 0, 0, 0, 98, 105, 110, 5, 8, 0, 0, 0, 117, 105, 110, 116, 40, 39, 39, 41, 5, 16, 0, 0, 0, 48, 98, 48, 49, 48, 49, 49, 49, 48, 49, 48, 49, 48, 48, 48, 49, 9, 81, 23, 5, 9, 0, 0, 0, 117, 105, 110, 116, 40, 98, 105, 110, 41, 9, 111, 0, 5, 9, 0, 0, 0, 117, 105, 110, 116, 40, 100, 101, 99, 41, 5, 78, 0, 0, 0, 49, 49, 49, 56, 50, 48, 51, 49, 50, 54, 49, 56, 56, 55, 51, 48, 56, 55, 53, 54, 51, 48, 51, 48, 56, 51, 54, 53, 54, 53, 56, 49, 53, 48, 52, 53, 49, 55, 52, 56, 53, 48, 48, 53, 57, 49, 53, 52, 53, 57, 53, 48, 56, 56, 57, 48, 53, 50, 57, 57, 54, 48, 57, 55, 50, 55, 50, 56, 55, 56, 52, 51, 49, 55, 48, 53, 54, 57, 13, 9, 41, 45, 119, 168, 223, 142, 121, 13, 70, 127, 69, 139, 41, 89, 28, 26, 251, 17, 240, 103, 108, 199, 171, 187, 119, 140, 96, 217, 13, 56, 247, 5, 18, 0, 0, 0, 48, 120, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 11, 239, 205, 171, 137, 103, 69, 35, 1, 5, 9, 0, 0, 0, 117, 105, 110, 116, 40, 104, 101, 120, 41, 5, 18, 0, 0, 0, 48, 120, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102, 5, 66, 0, 0, 0, 48, 120, 48, 57, 50, 57, 50, 68, 55, 55, 65, 56, 68, 70, 56, 69, 55, 57, 48, 68, 52, 54, 55, 70, 52, 53, 56, 66, 50, 57, 53, 57, 49, 67, 49, 65, 70, 66, 49, 49, 70, 48, 54, 55, 54, 67, 67, 55, 65, 66, 66, 66, 55, 55, 56, 67, 54, 48, 68, 57, 48, 68, 51, 56, 70, 55, 13, 247, 56, 13, 217, 96, 140, 119, 187, 171, 199, 108, 103, 240, 17, 251, 26, 28, 89, 41, 139, 69, 127, 70, 13, 121, 142, 223, 168, 119, 45, 41, 9, 5, 6, 0, 0, 0, 48, 98, 49, 48, 48, 49, 9, 9, 0, 5, 62, 0, 0, 0, 109, 109, 120, 49, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 100, 103, 121, 116, 101, 118, 5, 64, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 5, 6, 0, 0, 0, 98, 101, 99, 104, 51, 50, 5, 62, 0, 0, 0, 109, 109, 120, 49, 55, 117, 117, 113, 109, 107, 116, 113, 51, 51, 109, 109, 104, 50, 55, 56, 100, 51, 110, 108, 113, 121, 48, 109, 114, 103, 119, 57, 106, 50, 118, 116, 103, 52, 108, 53, 118, 114, 116, 101, 51, 109, 48, 54, 115, 97, 101, 100, 57, 121, 121, 115, 50, 113, 53, 104, 114, 102, 5, 64, 0, 0, 0, 48, 57, 50, 57, 50, 68, 55, 55, 65, 56, 68, 70, 56, 69, 55, 57, 48, 68, 52, 54, 55, 70, 52, 53, 56, 66, 50, 57, 53, 57, 49, 67, 49, 65, 70, 66, 49, 49, 70, 48, 54, 55, 54, 67, 67, 55, 65, 66, 66, 66, 55, 55, 56, 67, 54, 48, 68, 57, 48, 68, 51, 56, 70, 55, 5, 3, 0, 0, 0, 77, 77, 88, 6, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0, 49, 51, 51, 55, 5, 15, 0, 0, 0, 116, 111, 95, 115, 116, 114, 105, 110, 103, 40, 49, 51, 51, 55, 41, 5, 20, 0, 0, 0, 49, 56, 52, 52, 54, 55, 52, 52, 48, 55, 51, 55, 48, 57, 53, 53, 49, 54, 49, 53, 5, 31, 0, 0, 0, 116, 111, 95, 115, 116, 114, 105, 110, 103, 40, 49, 56, 52, 52, 54, 55, 52, 52, 48, 55, 51, 55, 48, 57, 53, 53, 49, 54, 49, 53, 41, 5, 39, 0, 0, 0, 51, 52, 48, 50, 56, 50, 51, 54, 54, 57, 50, 48, 57, 51, 56, 52, 54, 51, 52, 54, 51, 51, 55, 52, 54, 48, 55, 52, 51, 49, 55, 54, 56, 50, 49, 49, 52, 53, 53, 5, 50, 0, 0, 0, 116, 111, 95, 115, 116, 114, 105, 110, 103, 40, 51, 52, 48, 50, 56, 50, 51, 54, 54, 57, 50, 48, 57, 51, 56, 52, 54, 51, 52, 54, 51, 51, 55, 52, 54, 48, 55, 52, 51, 49, 55, 54, 56, 50, 49, 49, 52, 53, 53, 41, 11, 222, 188, 122, 86, 52, 18, 0, 0, 5, 12, 0, 0, 0, 49, 50, 51, 52, 53, 54, 55, 97, 98, 99, 100, 101, 5, 30, 0, 0, 0, 116, 111, 95, 115, 116, 114, 105, 110, 103, 95, 104, 101, 120, 40, 48, 120, 48, 49, 50, 51, 52, 53, 54, 55, 65, 66, 67, 68, 69, 41, 13, 85, 184, 82, 120, 27, 153, 149, 164, 76, 147, 155, 100, 228, 65, 174, 39, 36, 185, 111, 153, 200, 244, 251, 154, 20, 28, 252, 152, 66, 196, 176, 227, 5, 64, 0, 0, 0, 101, 51, 98, 48, 99, 52, 52, 50, 57, 56, 102, 99, 49, 99, 49, 52, 57, 97, 102, 98, 102, 52, 99, 56, 57, 57, 54, 102, 98, 57, 50, 52, 50, 55, 97, 101, 52, 49, 101, 52, 54, 52, 57, 98, 57, 51, 52, 99, 97, 52, 57, 53, 57, 57, 49, 98, 55, 56, 53, 50, 98, 56, 53, 53, 5, 81, 0, 0, 0, 116, 111, 95, 115, 116, 114, 105, 110, 103, 95, 104, 101, 120, 40, 48, 120, 101, 51, 98, 48, 99, 52, 52, 50, 57, 56, 102, 99, 49, 99, 49, 52, 57, 97, 102, 98, 102, 52, 99, 56, 57, 57, 54, 102, 98, 57, 50, 52, 50, 55, 97, 101, 52, 49, 101, 52, 54, 52, 57, 98, 57, 51, 52, 99, 97, 52, 57, 53, 57, 57, 49, 98, 55, 56, 53, 50, 98, 56, 53, 53, 41, 5, 80, 0, 0, 0, 116, 111, 95, 115, 116, 114, 105, 110, 103, 95, 98, 101, 99, 104, 51, 50, 40, 109, 109, 120, 49, 55, 117, 117, 113, 109, 107, 116, 113, 51, 51, 109, 109, 104, 50, 55, 56, 100, 51, 110, 108, 113, 121, 48, 109, 114, 103, 119, 57, 106, 50, 118, 116, 103, 52, 108, 53, 118, 114, 116, 101, 51, 109, 48, 54, 115, 97, 101, 100, 57, 121, 121, 115, 50, 113, 53, 104, 114, 102, 41, 5, 6, 0, 0, 0, 65, 66, 67, 68, 69, 70, 5, 14, 0, 0, 0, 98, 105, 110, 97, 114, 121, 40, 65, 66, 67, 68, 69, 70, 41, 5, 2, 0, 0, 0, 65, 66, 5, 4, 0, 0, 0, 52, 49, 52, 50, 5, 10, 0, 0, 0, 98, 105, 110, 97, 114, 121, 40, 65, 66, 41, 5, 16, 0, 0, 0, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 5, 28, 0, 0, 0, 98, 105, 110, 97, 114, 121, 95, 104, 101, 120, 40, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 41, 5, 30, 0, 0, 0, 98, 105, 110, 97, 114, 121, 95, 104, 101, 120, 40, 48, 120, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 41, 5, 1, 0, 0, 0, 65, 5, 2, 0, 0, 0, 66, 67, 5, 1, 0, 0, 0, 68, 5, 4, 0, 0, 0, 65, 66, 67, 68, 5, 8, 0, 0, 0, 99, 111, 110, 99, 97, 116, 40, 41, 5, 3, 0, 0, 0, 65, 66, 67, 5, 17, 0, 0, 0, 109, 101, 109, 99, 112, 121, 40, 65, 66, 67, 44, 32, 49, 41, 58, 32, 39, 5, 1, 0, 0, 0, 39, 5, 17, 0, 0, 0, 109, 101, 109, 99, 112, 121, 40, 65, 66, 67, 44, 32, 50, 44, 32, 49, 41, 5, 8, 0, 0, 0, 115, 104, 97, 50, 53, 54, 40, 41, 5, 3, 0, 0, 0, 97, 98, 99, 5, 64, 0, 0, 0, 98, 97, 55, 56, 49, 54, 98, 102, 56, 102, 48, 49, 99, 102, 101, 97, 52, 49, 52, 49, 52, 48, 100, 101, 53, 100, 97, 101, 50, 50, 50, 51, 98, 48, 48, 51, 54, 49, 97, 51, 57, 54, 49, 55, 55, 97, 57, 99, 98, 52, 49, 48, 102, 102, 54, 49, 102, 50, 48, 48, 49, 53, 97, 100, 5, 64, 0, 0, 0, 70, 51, 68, 54, 67, 55, 56, 49, 55, 48, 48, 49, 70, 52, 56, 57, 52, 54, 50, 55, 48, 67, 68, 48, 48, 67, 69, 49, 69, 65, 50, 49, 48, 53, 70, 52, 55, 48, 70, 54, 53, 68, 65, 54, 54, 67, 49, 70, 66, 67, 65, 65, 68, 69, 51, 69, 55, 67, 65, 66, 57, 54, 52, 65, 5, 66, 0, 0, 0, 48, 50, 48, 53, 52, 49, 57, 49, 68, 53, 49, 48, 51, 70, 55, 65, 48, 52, 66, 50, 69, 53, 66, 53, 51, 65, 70, 50, 53, 51, 65, 54, 52, 55, 54, 70, 49, 49, 68, 68, 67, 68, 66, 51, 66, 52, 49, 51, 52, 68, 55, 52, 67, 70, 68, 54, 52, 50, 57, 54, 57, 66, 48, 56, 50, 69, 5, 128, 0, 0, 0, 67, 48, 53, 70, 49, 51, 67, 56, 53, 66, 68, 68, 70, 66, 66, 48, 65, 49, 57, 56, 54, 57, 55, 70, 65, 65, 67, 54, 57, 55, 51, 65, 65, 48, 48, 56, 65, 65, 52, 53, 53, 52, 52, 70, 66, 55, 65, 66, 53, 56, 54, 66, 54, 51, 54, 52, 48, 53, 70, 55, 51, 70, 50, 49, 53, 50, 51, 55, 68, 53, 48, 56, 67, 54, 70, 65, 69, 57, 48, 67, 50, 52, 66, 69, 52, 50, 52, 53, 56, 52, 54, 52, 48, 70, 56, 50, 52, 56, 54, 52, 66, 54, 70, 70, 51, 70, 50, 66, 57, 57, 70, 66, 50, 49, 48, 52, 66, 66, 68, 53, 55, 52, 51, 69, 56, 69, 51, 57, 5, 12, 0, 0, 0, 101, 99, 100, 115, 97, 95, 118, 101, 114, 105, 102, 121, 5, 64, 0, 0, 0, 65, 51, 68, 54, 67, 55, 56, 49, 55, 48, 48, 49, 70, 52, 56, 57, 52, 54, 50, 55, 48, 67, 68, 48, 48, 67, 69, 49, 69, 65, 50, 49, 48, 53, 70, 52, 55, 48, 70, 54, 53, 68, 65, 54, 54, 67, 49, 70, 66, 67, 65, 65, 68, 69, 51, 69, 55, 67, 65, 66, 57, 54, 52, 65, 5, 3, 0, 0, 0, 49, 50, 51, 5, 11, 0, 0, 0, 115, 105, 122, 101, 40, 39, 49, 50, 51, 39, 41, 5, 19, 0, 0, 0, 115, 105, 122, 101, 40, 98, 105, 110, 97, 114, 121, 40, 39, 49, 50, 51, 39, 41, 41, 5, 5, 0, 0, 0, 109, 105, 110, 40, 41, 5, 5, 0, 0, 0, 109, 97, 120, 40, 41, 5, 12, 0, 0, 0, 116, 121, 112, 101, 111, 102, 40, 110, 117, 108, 108, 41, 5, 13, 0, 0, 0, 116, 121, 112, 101, 111, 102, 40, 102, 97, 108, 115, 101, 41, 5, 12, 0, 0, 0, 116, 121, 112, 101, 111, 102, 40, 116, 114, 117, 101, 41, 5, 9, 0, 0, 0, 116, 121, 112, 101, 111, 102, 40, 49, 41, 5, 10, 0, 0, 0, 116, 121, 112, 101, 111, 102, 40, 39, 39, 41, 5, 14, 0, 0, 0, 116, 121, 112, 101, 111, 102, 40, 98, 105, 110, 97, 114, 121, 41, 9, 7, 0, 5, 10, 0, 0, 0, 116, 121, 112, 101, 111, 102, 40, 91, 93, 41, 8, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 0, 5, 10, 0, 0, 0, 116, 121, 112, 101, 111, 102, 40, 123, 125, 41, 5, 20, 0, 0, 0, 100, 101, 114, 101, 102, 40, 99, 108, 111, 110, 101, 40, 49, 41, 41, 32, 33, 61, 32, 49, 5, 10, 0, 0, 0, 98, 111, 111, 108, 40, 110, 117, 108, 108, 41, 5, 11, 0, 0, 0, 98, 111, 111, 108, 40, 102, 97, 108, 115, 101, 41, 5, 10, 0, 0, 0, 98, 111, 111, 108, 40, 116, 114, 117, 101, 41, 5, 7, 0, 0, 0, 98, 111, 111, 108, 40, 48, 41, 5, 8, 0, 0, 0, 98, 111, 111, 108, 40, 49, 48, 41, 5, 8, 0, 0, 0, 98, 111, 111, 108, 40, 39, 39, 41, 5, 1, 0, 0, 0, 48, 5, 9, 0, 0, 0, 98, 111, 111, 108, 40, 39, 48, 39, 41, 5, 16, 0, 0, 0, 98, 111, 111, 108, 40, 98, 105, 110, 97, 114, 121, 40, 39, 39, 41, 41, 5, 16, 0, 0, 0, 98, 111, 111, 108, 40, 98, 105, 110, 97, 114, 121, 40, 39, 48, 39, 41, 5, 8, 0, 0, 0, 98, 111, 111, 108, 40, 91, 93, 41, 5, 8, 0, 0, 0, 98, 111, 111, 108, 40, 123, 125, 41, 5, 10, 0, 0, 0, 117, 105, 110, 116, 40, 110, 117, 108, 108, 41, 5, 11, 0, 0, 0, 117, 105, 110, 116, 40, 102, 97, 108, 115, 101, 41, 5, 10, 0, 0, 0, 117, 105, 110, 116, 40, 116, 114, 117, 101, 41, 5, 5, 0, 0, 0, 97, 97, 98, 98, 99, 10, 188, 171, 10, 0, 5, 17, 0, 0, 0, 117, 105, 110, 116, 95, 104, 101, 120, 40, 39, 97, 97, 98, 98, 99, 39, 41, 10, 240, 222, 188, 10, 5, 23, 0, 0, 0, 117, 105, 110, 116, 40, 98, 105, 110, 97, 114, 121, 40, 48, 120, 65, 66, 67, 68, 69, 70, 48, 41, 41, 5, 31, 0, 0, 0, 117, 105, 110, 116, 40, 98, 105, 110, 97, 114, 121, 40, 98, 105, 110, 97, 114, 121, 40, 48, 120, 65, 66, 67, 68, 69, 70, 48, 41, 41, 41, 5, 29, 0, 0, 0, 117, 105, 110, 116, 95, 108, 101, 40, 98, 105, 110, 97, 114, 121, 95, 108, 101, 40, 48, 120, 65, 66, 67, 68, 69, 70, 48, 41, 41, 5, 27, 0, 0, 0, 98, 101, 99, 104, 51, 50, 40, 98, 105, 110, 97, 114, 121, 40, 98, 101, 99, 104, 51, 50, 40, 77, 77, 88, 41, 41, 41, 5, 8, 0, 0, 0, 91, 93, 32, 61, 61, 32, 91, 93, 5, 4, 0, 0, 0, 116, 101, 115, 116, 5, 15, 0, 0, 0, 116, 111, 95, 115, 116, 114, 105, 110, 103, 40, 116, 101, 115, 116, 41, 5, 16, 0, 0, 0, 115, 105, 122, 101, 40, 97, 114, 114, 97, 121, 41, 32, 33, 61, 32, 48, 5, 14, 0, 0, 0, 97, 114, 114, 97, 121, 91, 48, 93, 32, 33, 61, 32, 49, 49, 5, 16, 0, 0, 0, 115, 105, 122, 101, 40, 97, 114, 114, 97, 121, 41, 32, 33, 61, 32, 49, 9, 12, 0, 5, 21, 0, 0, 0, 99, 108, 111, 110, 101, 58, 32, 97, 114, 114, 97, 121, 91, 48, 93, 32, 33, 61, 32, 49, 50, 5, 16, 0, 0, 0, 112, 111, 112, 40, 97, 114, 114, 97, 121, 41, 32, 33, 61, 32, 49, 50, 11, 65, 43, 191, 58, 8, 0, 0, 0, 5, 26, 0, 0, 0, 97, 114, 114, 97, 121, 91, 51, 53, 51, 52, 53, 51, 52, 53, 51, 52, 53, 93, 32, 33, 61, 32, 110, 117, 108, 108, 5, 5, 0, 0, 0, 102, 105, 101, 108, 100, 5, 17, 0, 0, 0, 109, 97, 112, 46, 102, 105, 101, 108, 100, 32, 33, 61, 32, 110, 117, 108, 108, 5, 17, 0, 0, 0, 109, 97, 112, 46, 102, 105, 101, 108, 100, 32, 33, 61, 32, 49, 51, 51, 55, 9, 58, 5, 5, 17, 0, 0, 0, 109, 97, 112, 46, 102, 105, 101, 108, 100, 32, 33, 61, 32, 49, 51, 51, 56, 9, 59, 5, 5, 24, 0, 0, 0, 99, 108, 111, 110, 101, 58, 32, 116, 109, 112, 46, 102, 105, 101, 108, 100, 32, 33, 61, 32, 49, 51, 51, 57, 5, 17, 0, 0, 0, 109, 97, 112, 46, 102, 105, 101, 108, 100, 32, 33, 61, 32, 49, 51, 51, 57, 5, 30, 0, 0, 0, 97, 102, 116, 101, 114, 32, 101, 114, 97, 115, 101, 58, 32, 109, 97, 112, 46, 102, 105, 101, 108, 100, 32, 33, 61, 32, 110, 117, 108, 108, 5, 24, 0, 0, 0, 99, 108, 111, 110, 101, 58, 32, 116, 109, 112, 46, 102, 105, 101, 108, 100, 32, 33, 61, 32, 110, 117, 108, 108, 5, 6, 0, 0, 0, 98, 105, 110, 49, 50, 51, 5, 14, 0, 0, 0, 109, 97, 112, 91, 48, 93, 32, 61, 61, 32, 110, 117, 108, 108, 5, 18, 0, 0, 0, 109, 97, 112, 91, 102, 97, 108, 115, 101, 93, 32, 61, 61, 32, 110, 117, 108, 108, 5, 17, 0, 0, 0, 109, 97, 112, 91, 116, 114, 117, 101, 93, 32, 61, 61, 32, 110, 117, 108, 108, 5, 19, 0, 0, 0, 109, 97, 112, 91, 39, 116, 101, 115, 116, 39, 93, 32, 61, 61, 32, 110, 117, 108, 108, 5, 19, 0, 0, 0, 109, 97, 112, 91, 98, 105, 110, 49, 50, 51, 93, 32, 61, 61, 32, 110, 117, 108, 108, 5, 17, 0, 0, 0, 109, 97, 112, 91, 116, 109, 112, 48, 93, 32, 61, 61, 32, 110, 117, 108, 108, 5, 17, 0, 0, 0, 109, 97, 112, 91, 116, 109, 112, 49, 93, 32, 61, 61, 32, 110, 117, 108, 108, 5, 5, 0, 0, 0, 118, 97, 108, 117, 101, 5, 6, 0, 0, 0, 102, 105, 101, 108, 100, 49, 9, 123, 0, 5, 10, 0, 0, 0, 116, 101, 115, 116, 46, 102, 105, 101, 108, 100, 5, 11, 0, 0, 0, 116, 101, 115, 116, 46, 102, 105, 101, 108, 100, 49, 5, 11, 0, 0, 0, 116, 101, 115, 116, 50, 46, 102, 105, 101, 108, 100, 5, 18, 0, 0, 0, 110, 117, 108, 108, 46, 102, 105, 101, 108, 100, 32, 33, 61, 32, 110, 117, 108, 108, 5, 23, 0, 0, 0, 99, 111, 110, 99, 97, 116, 58, 32, 115, 105, 122, 101, 40, 116, 101, 115, 116, 41, 32, 33, 61, 32, 53, 5, 16, 0, 0, 0, 116, 101, 115, 116, 91, 105, 93, 32, 33, 61, 32, 105, 32, 43, 32, 49, 5, 25, 0, 0, 0, 116, 101, 115, 116, 50, 46, 102, 105, 101, 108, 100, 46, 102, 105, 101, 108, 100, 32, 33, 61, 32, 49, 51, 51, 55, 5, 18, 0, 0, 0, 117, 115, 101, 32, 97, 102, 116, 101, 114, 32, 100, 101, 108, 101, 116, 101, 40, 41, 5, 12, 0, 0, 0, 116, 101, 115, 116, 91, 50, 93, 32, 33, 61, 32, 52, 5, 16, 0, 0, 0, 115, 105, 122, 101, 40, 116, 101, 115, 116, 50, 41, 32, 33, 61, 32, 51, 5, 17, 0, 0, 0, 116, 101, 115, 116, 50, 91, 105, 93, 32, 33, 61, 32, 105, 32, 43, 32, 49, 5, 15, 0, 0, 0, 115, 105, 122, 101, 40, 116, 101, 115, 116, 41, 32, 33, 61, 32, 51, 5, 15, 0, 0, 0, 116, 101, 115, 116, 91, 48, 93, 32, 33, 61, 32, 110, 117, 108, 108, 5, 15, 0, 0, 0, 116, 101, 115, 116, 91, 49, 93, 32, 33, 61, 32, 116, 114, 117, 101, 5, 16, 0, 0, 0, 116, 101, 115, 116, 91, 50, 93, 32, 33, 61, 32, 102, 97, 108, 115, 101, 5, 12, 0, 0, 0, 116, 101, 115, 116, 91, 51, 93, 32, 33, 61, 32, 49, 5, 15, 0, 0, 0, 116, 101, 115, 116, 91, 52, 93, 32, 33, 61, 32, 116, 101, 115, 116, 5, 62, 0, 0, 0, 109, 109, 120, 49, 99, 120, 110, 57, 110, 97, 110, 56, 120, 121, 119, 51, 122, 102, 108, 120, 104, 101, 97, 102, 50, 99, 50, 109, 114, 122, 103, 101, 120, 122, 112, 51, 51, 106, 57, 114, 119, 113, 109, 120, 119, 55, 101, 100, 51, 117, 116, 48, 57, 119, 113, 115, 114, 48, 54, 106, 109, 113, 5, 33, 0, 0, 0, 109, 97, 112, 91, 107, 101, 121, 93, 32, 33, 61, 32, 49, 51, 51, 55, 32, 40, 107, 101, 121, 32, 61, 32, 98, 101, 99, 104, 51, 50, 40, 41, 41, 5, 13, 0, 0, 0, 97, 114, 114, 97, 121, 91, 51, 93, 32, 33, 61, 32, 52, 5, 3, 0, 0, 0, 102, 111, 111, 5, 3, 0, 0, 0, 98, 97, 114, 5, 22, 0, 0, 0, 111, 98, 106, 101, 99, 116, 46, 102, 111, 111, 46, 98, 97, 114, 32, 33, 61, 32, 116, 114, 117, 101, 5, 25, 0, 0, 0, 100, 101, 108, 101, 116, 101, 40, 41, 58, 32, 111, 98, 106, 46, 102, 111, 111, 32, 33, 61, 32, 116, 114, 117, 101, 5, 18, 0, 0, 0, 109, 97, 112, 91, 98, 101, 99, 104, 51, 50, 40, 41, 93, 32, 61, 61, 32, 48, 5, 4, 0, 0, 0, 100, 97, 116, 97, 5, 3, 0, 0, 0, 112, 116, 114, 5, 16, 0, 0, 0, 97, 114, 114, 97, 121, 91, 50, 93, 32, 33, 61, 32, 110, 117, 108, 108, 5, 19, 0, 0, 0, 97, 114, 114, 97, 121, 91, 49, 51, 51, 55, 93, 32, 33, 61, 32, 110, 117, 108, 108], \"binary\": [1, 228, 1, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 196, 0, 0, 0, 97, 0, 0, 0, 160, 0, 0, 0, 52, 1, 0, 8, 30, 0, 0, 0, 3, 0, 0, 0, 53, 1, 0, 8, 2, 0, 0, 0, 130, 2, 0, 0, 196, 2, 0, 0, 5, 0, 0, 0, 19, 0, 0, 0, 54, 1, 0, 8, 1, 0, 0, 0, 55, 1, 0, 8, 133, 1, 0, 0, 56, 1, 0, 8, 8, 0, 0, 0, 49, 0, 0, 0, 4, 0, 0, 0, 38, 0, 0, 0, 58, 1, 0, 8, 131, 1, 0, 0, 62, 1, 0, 8, 206, 0, 0, 0, 57, 1, 0, 8, 64, 0, 0, 0, 60, 1, 0, 8, 90, 0, 0, 0, 168, 0, 0, 0, 63, 1, 0, 8, 45, 0, 0, 0, 61, 1, 0, 8, 96, 0, 0, 0, 59, 1, 0, 8, 64, 1, 0, 8, 32, 32, 0, 0, 52, 0, 0, 0, 137, 0, 0, 8, 10, 0, 0, 0, 65, 1, 0, 8, 129, 2, 0, 0, 115, 0, 0, 8, 7, 0, 0, 0, 98, 0, 0, 0, 136, 0, 0, 8, 138, 0, 0, 8, 161, 6, 0, 0, 127, 0, 0, 8, 23, 0, 0, 0, 128, 2, 0, 0, 55, 0, 0, 0, 56, 0, 0, 0, 80, 0, 0, 0, 34, 32, 0, 0, 139, 0, 0, 8, 50, 0, 0, 0, 65, 0, 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 112, 0, 0, 0, 190, 0, 0, 0, 247, 0, 0, 0, 134, 2, 0, 0, 35, 32, 0, 0, 66, 1, 0, 8, 67, 1, 0, 8, 44, 0, 0, 0, 60, 0, 0, 0, 69, 0, 0, 0, 70, 0, 0, 0, 113, 0, 0, 0, 7, 4, 0, 0, 17, 0, 0, 0, 57, 0, 0, 0, 63, 0, 0, 0, 72, 0, 0, 0, 99, 0, 0, 0, 116, 0, 0, 0, 201, 0, 0, 0, 3, 2, 0, 0, 36, 32, 0, 0, 71, 32, 0, 0, 113, 0, 0, 8, 114, 0, 0, 8, 116, 0, 0, 8, 117, 0, 0, 8, 118, 0, 0, 8, 119, 0, 0, 8, 120, 0, 0, 8, 121, 0, 0, 8, 128, 0, 0, 8, 129, 0, 0, 8, 130, 0, 0, 8, 131, 0, 0, 8, 132, 0, 0, 8, 133, 0, 0, 8, 140, 0, 0, 8, 141, 0, 0, 8, 202, 0, 0, 8, 203, 0, 0, 8, 204, 0, 0, 8, 225, 0, 0, 8, 227, 0, 0, 8, 68, 1, 0, 8, 69, 1, 0, 8, 12, 0, 0, 0, 47, 0, 0, 0, 68, 0, 0, 0, 82, 0, 0, 0, 100, 0, 0, 0, 101, 0, 0, 0, 102, 0, 0, 0, 104, 0, 0, 0, 115, 0, 0, 0, 135, 0, 0, 0, 143, 0, 0, 0, 153, 0, 0, 0, 163, 0, 0, 0, 164, 0, 0, 0, 211, 0, 0, 0, 232, 0, 0, 0, 248, 0, 0, 0, 253, 0, 0, 0, 71, 4, 0, 0, 162, 12, 0, 0, 66, 32, 0, 0, 15, 0, 0, 0, 22, 0, 0, 0, 28, 0, 0, 0, 34, 0, 0, 0, 40, 0, 0, 0, 46, 0, 0, 0, 51, 0, 0, 0, 53, 0, 0, 0, 74, 0, 0, 0, 77, 0, 0, 0, 78, 0, 0, 0, 86, 0, 0, 0, 87, 0, 0, 0, 89, 0, 0, 0, 91, 0, 0, 0, 93, 0, 0, 0, 103, 0, 0, 0, 105, 0, 0, 0, 109, 0, 0, 0, 111, 0, 0, 0, 114, 0, 0, 0, 117, 0, 0, 0, 121, 0, 0, 0, 125, 0, 0, 0, 127, 0, 0, 0, 129, 0, 0, 0, 130, 0, 0, 0, 133, 0, 0, 0, 137, 0, 0, 0, 138, 0, 0, 0, 139, 0, 0, 0, 141, 0, 0, 0, 145, 0, 0, 0, 147, 0, 0, 0, 149, 0, 0, 0, 151, 0, 0, 0, 152, 0, 0, 0, 155, 0, 0, 0, 157, 0, 0, 0, 161, 0, 0, 0, 165, 0, 0, 0, 169, 0, 0, 0, 173, 0, 0, 0, 177, 0, 0, 0, 178, 0, 0, 0, 181, 0, 0, 0, 185, 0, 0, 0, 189, 0, 0, 0, 193, 0, 0, 0, 195, 0, 0, 0, 197, 0, 0, 0, 198, 0, 0, 0, 205, 0, 0, 0, 209, 0, 0, 0, 213, 0, 0, 0, 216, 0, 0, 0, 217, 0, 0, 0, 221, 0, 0, 0, 224, 0, 0, 0, 225, 0, 0, 0, 226, 0, 0, 0, 228, 0, 0, 0, 233, 0, 0, 0, 242, 0, 0, 0, 244, 0, 0, 0, 252, 0, 0, 0, 132, 1, 0, 0, 2, 2, 0, 0, 70, 4, 0, 0, 7, 10, 0, 0, 0, 0, 0, 8, 1, 0, 0, 8, 2, 0, 0, 8, 3, 0, 0, 8, 4, 0, 0, 8, 5, 0, 0, 8, 6, 0, 0, 8, 7, 0, 0, 8, 8, 0, 0, 8, 9, 0, 0, 8, 10, 0, 0, 8, 11, 0, 0, 8, 12, 0, 0, 8, 13, 0, 0, 8, 14, 0, 0, 8, 15, 0, 0, 8, 16, 0, 0, 8, 17, 0, 0, 8, 18, 0, 0, 8, 19, 0, 0, 8, 20, 0, 0, 8, 21, 0, 0, 8, 22, 0, 0, 8, 23, 0, 0, 8, 24, 0, 0, 8, 25, 0, 0, 8, 26, 0, 0, 8, 27, 0, 0, 8, 28, 0, 0, 8, 29, 0, 0, 8, 30, 0, 0, 8, 31, 0, 0, 8, 32, 0, 0, 8, 33, 0, 0, 8, 34, 0, 0, 8, 35, 0, 0, 8, 36, 0, 0, 8, 37, 0, 0, 8, 38, 0, 0, 8, 39, 0, 0, 8, 40, 0, 0, 8, 41, 0, 0, 8, 42, 0, 0, 8, 43, 0, 0, 8, 44, 0, 0, 8, 45, 0, 0, 8, 46, 0, 0, 8, 47, 0, 0, 8, 48, 0, 0, 8, 49, 0, 0, 8, 50, 0, 0, 8, 51, 0, 0, 8, 52, 0, 0, 8, 53, 0, 0, 8, 54, 0, 0, 8, 55, 0, 0, 8, 56, 0, 0, 8, 57, 0, 0, 8, 58, 0, 0, 8, 59, 0, 0, 8, 60, 0, 0, 8, 61, 0, 0, 8, 62, 0, 0, 8, 63, 0, 0, 8, 64, 0, 0, 8, 65, 0, 0, 8, 66, 0, 0, 8, 67, 0, 0, 8, 68, 0, 0, 8, 69, 0, 0, 8, 70, 0, 0, 8, 71, 0, 0, 8, 72, 0, 0, 8, 73, 0, 0, 8, 74, 0, 0, 8, 75, 0, 0, 8, 76, 0, 0, 8, 77, 0, 0, 8, 78, 0, 0, 8, 79, 0, 0, 8, 80, 0, 0, 8, 81, 0, 0, 8, 82, 0, 0, 8, 83, 0, 0, 8, 84, 0, 0, 8, 85, 0, 0, 8, 86, 0, 0, 8, 87, 0, 0, 8, 88, 0, 0, 8, 89, 0, 0, 8, 90, 0, 0, 8, 91, 0, 0, 8, 92, 0, 0, 8, 93, 0, 0, 8, 94, 0, 0, 8, 95, 0, 0, 8, 96, 0, 0, 8, 97, 0, 0, 8, 98, 0, 0, 8, 99, 0, 0, 8, 100, 0, 0, 8, 101, 0, 0, 8, 102, 0, 0, 8, 103, 0, 0, 8, 104, 0, 0, 8, 105, 0, 0, 8, 106, 0, 0, 8, 107, 0, 0, 8, 108, 0, 0, 8, 109, 0, 0, 8, 110, 0, 0, 8, 111, 0, 0, 8, 112, 0, 0, 8, 122, 0, 0, 8, 123, 0, 0, 8, 124, 0, 0, 8, 125, 0, 0, 8, 126, 0, 0, 8, 134, 0, 0, 8, 135, 0, 0, 8, 142, 0, 0, 8, 143, 0, 0, 8, 144, 0, 0, 8, 145, 0, 0, 8, 146, 0, 0, 8, 147, 0, 0, 8, 148, 0, 0, 8, 149, 0, 0, 8, 150, 0, 0, 8, 151, 0, 0, 8, 152, 0, 0, 8, 153, 0, 0, 8, 154, 0, 0, 8, 155, 0, 0, 8, 156, 0, 0, 8, 157, 0, 0, 8, 158, 0, 0, 8, 159, 0, 0, 8, 160, 0, 0, 8, 161, 0, 0, 8, 162, 0, 0, 8, 163, 0, 0, 8, 164, 0, 0, 8, 165, 0, 0, 8, 166, 0, 0, 8, 167, 0, 0, 8, 168, 0, 0, 8, 169, 0, 0, 8, 170, 0, 0, 8, 171, 0, 0, 8, 172, 0, 0, 8, 173, 0, 0, 8, 174, 0, 0, 8, 175, 0, 0, 8, 176, 0, 0, 8, 177, 0, 0, 8, 178, 0, 0, 8, 179, 0, 0, 8, 180, 0, 0, 8, 181, 0, 0, 8, 182, 0, 0, 8, 183, 0, 0, 8, 184, 0, 0, 8, 185, 0, 0, 8, 186, 0, 0, 8, 187, 0, 0, 8, 188, 0, 0, 8, 189, 0, 0, 8, 190, 0, 0, 8, 191, 0, 0, 8, 192, 0, 0, 8, 193, 0, 0, 8, 194, 0, 0, 8, 195, 0, 0, 8, 196, 0, 0, 8, 197, 0, 0, 8, 198, 0, 0, 8, 199, 0, 0, 8, 200, 0, 0, 8, 201, 0, 0, 8, 205, 0, 0, 8, 206, 0, 0, 8, 207, 0, 0, 8, 208, 0, 0, 8, 209, 0, 0, 8, 210, 0, 0, 8, 211, 0, 0, 8, 212, 0, 0, 8, 213, 0, 0, 8, 214, 0, 0, 8, 215, 0, 0, 8, 216, 0, 0, 8, 217, 0, 0, 8, 218, 0, 0, 8, 219, 0, 0, 8, 220, 0, 0, 8, 221, 0, 0, 8, 222, 0, 0, 8, 223, 0, 0, 8, 224, 0, 0, 8, 226, 0, 0, 8, 228, 0, 0, 8, 229, 0, 0, 8, 230, 0, 0, 8, 231, 0, 0, 8, 232, 0, 0, 8, 233, 0, 0, 8, 234, 0, 0, 8, 235, 0, 0, 8, 236, 0, 0, 8, 237, 0, 0, 8, 238, 0, 0, 8, 239, 0, 0, 8, 240, 0, 0, 8, 241, 0, 0, 8, 242, 0, 0, 8, 243, 0, 0, 8, 244, 0, 0, 8, 245, 0, 0, 8, 246, 0, 0, 8, 247, 0, 0, 8, 248, 0, 0, 8, 249, 0, 0, 8, 250, 0, 0, 8, 251, 0, 0, 8, 252, 0, 0, 8, 253, 0, 0, 8, 254, 0, 0, 8, 255, 0, 0, 8, 0, 1, 0, 8, 1, 1, 0, 8, 2, 1, 0, 8, 3, 1, 0, 8, 4, 1, 0, 8, 5, 1, 0, 8, 6, 1, 0, 8, 7, 1, 0, 8, 8, 1, 0, 8, 9, 1, 0, 8, 10, 1, 0, 8, 11, 1, 0, 8, 12, 1, 0, 8, 13, 1, 0, 8, 14, 1, 0, 8, 15, 1, 0, 8, 16, 1, 0, 8, 17, 1, 0, 8, 18, 1, 0, 8, 19, 1, 0, 8, 20, 1, 0, 8, 21, 1, 0, 8, 22, 1, 0, 8, 23, 1, 0, 8, 24, 1, 0, 8, 25, 1, 0, 8, 26, 1, 0, 8, 27, 1, 0, 8, 28, 1, 0, 8, 29, 1, 0, 8, 30, 1, 0, 8, 31, 1, 0, 8, 32, 1, 0, 8, 33, 1, 0, 8, 34, 1, 0, 8, 35, 1, 0, 8, 36, 1, 0, 8, 37, 1, 0, 8, 38, 1, 0, 8, 39, 1, 0, 8, 40, 1, 0, 8, 41, 1, 0, 8, 42, 1, 0, 8, 43, 1, 0, 8, 44, 1, 0, 8, 45, 1, 0, 8, 46, 1, 0, 8, 47, 1, 0, 8, 48, 1, 0, 8, 49, 1, 0, 8, 50, 1, 0, 8, 51, 1, 0, 8, 70, 1, 0, 8, 71, 1, 0, 8, 72, 1, 0, 8, 73, 1, 0, 8, 212, 3, 0, 0, 4, 199, 15, 12, 0, 1, 7, 199, 2, 9, 0, 4, 201, 7, 12, 0, 28, 200, 201, 1, 45, 200, 2, 21, 0, 4, 203, 15, 12, 0, 28, 202, 203, 28, 204, 202, 1, 108, 204, 2, 12, 0, 4, 206, 7, 12, 0, 4, 207, 15, 12, 0, 60, 205, 206, 207, 1, 75, 205, 2, 1, 0, 4, 209, 15, 12, 0, 4, 210, 7, 12, 0, 60, 208, 209, 210, 1, 130, 208, 2, 45, 0, 4, 212, 7, 12, 0, 4, 213, 15, 12, 0, 61, 211, 212, 213, 28, 214, 211, 1, 131, 214, 2, 19, 0, 4, 216, 15, 12, 0, 4, 217, 7, 12, 0, 61, 215, 216, 217, 28, 218, 215, 1, 132, 218, 2, 255, 9, 128, 0, 4, 220, 7, 12, 0, 4, 221, 7, 12, 0, 60, 219, 220, 221, 28, 222, 219, 1, 133, 222, 2, 41, 0, 4, 224, 7, 12, 0, 4, 225, 7, 12, 0, 61, 223, 224, 225, 28, 226, 223, 1, 134, 226, 2, 41, 0, 4, 228, 15, 12, 0, 4, 229, 15, 12, 0, 61, 227, 228, 229, 1, 135, 227, 2, 255, 11, 128, 0, 4, 231, 15, 12, 0, 4, 232, 15, 12, 0, 60, 230, 231, 232, 1, 54, 230, 2, 108, 0, 59, 233, 15, 15, 4, 234, 233, 12, 0, 1, 70, 234, 2, 255, 13, 128, 0, 59, 235, 7, 7, 4, 236, 235, 12, 0, 1, 28, 236, 2, 255, 14, 128, 0, 59, 237, 15, 7, 4, 239, 237, 12, 0, 28, 238, 239, 1, 71, 238, 2, 129, 0, 59, 240, 7, 15, 4, 242, 240, 12, 0, 28, 241, 242, 1, 137, 241, 2, 129, 0, 4, 243, 7, 12, 0, 1, 138, 243, 21, 139, 2, 255, 16, 128, 0, 4, 244, 15, 12, 0, 1, 111, 244, 2, 75, 0, 21, 30, 4, 245, 15, 12, 0, 1, 140, 245, 2, 75, 0, 21, 30, 4, 246, 15, 12, 0, 1, 30, 246, 2, 75, 0, 21, 30, 3, 247, 0, 0, 1, 144, 247, 2, 255, 18, 128, 0, 35, 248, 0, 13, 1, 35, 248, 2, 255, 20, 128, 0, 35, 249, 0, 15, 1, 79, 249, 2, 255, 21, 128, 0, 35, 250, 0, 7, 1, 114, 250, 2, 130, 0, 35, 251, 0, 51, 1, 146, 251, 2, 255, 24, 128, 0, 35, 252, 0, 0, 28, 253, 252, 1, 147, 253, 2, 255, 25, 128, 0, 3, 254, 0, 13, 28, 255, 0, 0, 254, 1, 73, 255, 0, 0, 2, 255, 26, 128, 0, 3, 255, 1, 0, 0, 15, 28, 255, 2, 0, 255, 1, 0, 1, 150, 255, 2, 0, 2, 255, 27, 128, 0, 3, 255, 3, 0, 0, 7, 28, 255, 4, 0, 255, 3, 0, 1, 151, 255, 4, 0, 2, 131, 0, 3, 255, 5, 0, 0, 51, 28, 255, 6, 0, 255, 5, 0, 1, 152, 255, 6, 0, 2, 255, 29, 128, 0, 79, 255, 7, 0, 6, 13, 28, 255, 8, 0, 255, 7, 0, 1, 154, 255, 8, 0, 2, 255, 31, 128, 0, 113, 255, 9, 0, 6, 13, 28, 255, 10, 0, 255, 9, 0, 1, 156, 255, 10, 0, 2, 255, 32, 128, 0, 113, 255, 11, 0, 6, 6, 28, 255, 12, 0, 255, 11, 0, 1, 157, 255, 12, 0, 2, 255, 33, 128, 0, 46, 255, 13, 0, 13, 6, 28, 255, 14, 0, 255, 13, 0, 1, 160, 255, 14, 0, 2, 132, 0, 112, 255, 15, 0, 13, 6, 28, 255, 16, 0, 255, 15, 0, 1, 161, 255, 16, 0, 2, 255, 35, 128, 0, 112, 255, 17, 0, 6, 6, 28, 255, 18, 0, 255, 17, 0, 1, 163, 255, 18, 0, 2, 255, 36, 128, 0, 126, 255, 19, 0, 6, 13, 3, 255, 20, 0, 255, 19, 0, 6, 1, 119, 255, 20, 0, 2, 255, 37, 128, 0, 126, 255, 21, 0, 22, 6, 3, 255, 22, 0, 255, 21, 0, 6, 1, 167, 255, 22, 0, 2, 255, 39, 128, 0, 197, 255, 23, 0, 6, 13, 3, 255, 24, 0, 255, 23, 0, 6, 1, 168, 255, 24, 0, 2, 133, 0, 197, 255, 25, 0, 6, 6, 3, 255, 26, 0, 255, 25, 0, 22, 1, 169, 255, 26, 0, 2, 255, 41, 128, 0, 38, 255, 27, 0, 6, 6, 3, 255, 28, 0, 255, 27, 0, 22, 1, 170, 255, 28, 0, 11, 255, 42, 128, 6, 255, 33, 160, 255, 29, 0, 6, 6, 3, 255, 30, 0, 255, 29, 0, 13, 1, 171, 255, 30, 0, 11, 255, 43, 128, 6, 56, 255, 31, 0, 6, 6, 3, 255, 32, 0, 255, 31, 0, 6, 1, 172, 255, 32, 0, 11, 69, 6, 56, 255, 33, 0, 33, 33, 3, 255, 34, 0, 255, 33, 0, 134, 1, 174, 255, 34, 0, 11, 69, 22, 56, 255, 35, 0, 109, 109, 3, 255, 36, 0, 255, 35, 0, 255, 48, 128, 1, 175, 255, 36, 0, 11, 69, 20, 56, 255, 37, 0, 58, 58, 3, 255, 38, 0, 255, 37, 0, 135, 1, 176, 255, 38, 0, 11, 69, 39, 56, 255, 39, 0, 136, 33, 3, 255, 40, 0, 255, 39, 0, 255, 54, 128, 1, 177, 255, 40, 0, 11, 69, 53, 84, 255, 41, 0, 20, 15, 3, 255, 42, 0, 255, 41, 0, 6, 1, 179, 255, 42, 0, 11, 54, 6, 66, 255, 43, 0, 76, 33, 3, 255, 44, 0, 255, 43, 0, 255, 58, 128, 1, 81, 255, 44, 0, 11, 54, 22, 66, 255, 45, 0, 58, 33, 3, 255, 46, 0, 255, 45, 0, 255, 59, 128, 1, 181, 255, 46, 0, 11, 54, 20, 66, 255, 47, 0, 70, 33, 3, 255, 48, 0, 255, 47, 0, 255, 61, 128, 1, 182, 255, 48, 0, 11, 54, 39, 66, 255, 49, 0, 70, 58, 3, 255, 50, 0, 255, 49, 0, 255, 62, 128, 1, 183, 255, 50, 0, 11, 54, 53, 66, 255, 51, 0, 70, 136, 3, 255, 52, 0, 255, 51, 0, 33, 1, 185, 255, 52, 0, 11, 54, 77, 126, 255, 53, 0, 20, 13, 3, 255, 54, 0, 255, 53, 0, 20, 1, 186, 255, 54, 0, 2, 28, 0, 84, 255, 55, 0, 20, 0, 3, 255, 56, 0, 255, 55, 0, 20, 1, 190, 255, 56, 0, 84, 44, 20, 0, 4, 86, 44, 45, 0, 49, 85, 59, 86, 2, 85, 0, 84, 85, 76, 41, 3, 86, 85, 61, 1, 123, 86, 2, 110, 0, 9, 44, 6, 46, 87, 44, 71, 1, 193, 87, 56, 88, 72, 44, 66, 89, 88, 44, 3, 90, 89, 72, 1, 192, 90, 4, 92, 44, 45, 0, 49, 91, 255, 71, 128, 92, 2, 91, 0, 38, 44, 44, 6, 21, 191, 128, 44, 20, 6, 3, 87, 44, 6, 1, 124, 87, 11, 78, 6, 83, 88, 76, 33, 3, 89, 88, 13, 1, 194, 89, 11, 78, 22, 83, 90, 58, 33, 3, 91, 90, 255, 73, 128, 1, 255, 0, 129, 91, 11, 78, 20, 83, 92, 70, 33, 3, 255, 57, 0, 92, 137, 1, 255, 4, 129, 255, 57, 0, 11, 78, 39, 128, 255, 58, 0, 20, 13, 3, 255, 59, 0, 255, 58, 0, 13, 1, 255, 8, 129, 255, 59, 0, 2, 255, 75, 128, 0, 128, 255, 60, 0, 76, 255, 76, 128, 3, 255, 61, 0, 255, 60, 0, 138, 1, 255, 12, 129, 255, 61, 0, 2, 139, 0, 9, 50, 6, 46, 93, 50, 71, 1, 255, 24, 129, 93, 56, 94, 72, 50, 83, 95, 94, 50, 3, 96, 95, 13, 1, 255, 22, 129, 96, 4, 98, 50, 45, 0, 49, 97, 255, 79, 128, 98, 2, 97, 0, 38, 50, 50, 6, 21, 255, 13, 129, 59, 50, 55, 55, 3, 93, 50, 13, 1, 255, 28, 129, 93, 11, 255, 81, 128, 6, 60, 94, 55, 111, 3, 95, 94, 55, 1, 255, 32, 129, 95, 11, 255, 83, 128, 6, 61, 96, 55, 13, 3, 97, 96, 55, 1, 255, 36, 129, 97, 11, 255, 84, 128, 6, 28, 98, 55, 60, 255, 62, 0, 98, 111, 3, 255, 63, 0, 255, 62, 0, 255, 85, 128, 1, 255, 41, 129, 255, 63, 0, 11, 140, 6, 9, 47, 13, 9, 40, 13, 46, 48, 40, 141, 1, 255, 48, 129, 48, 38, 47, 47, 22, 38, 40, 40, 6, 21, 255, 43, 129, 3, 40, 47, 255, 88, 128, 1, 255, 51, 129, 40, 11, 142, 6, 9, 47, 13, 9, 40, 0, 7, 48, 30, 17, 48, 6, 17, 48, 22, 17, 48, 20, 9, 57, 13, 43, 99, 48, 46, 100, 57, 99, 1, 255, 65, 129, 100, 10, 40, 48, 57, 38, 47, 47, 40, 38, 57, 57, 6, 21, 255, 59, 129, 3, 40, 47, 77, 1, 255, 68, 129, 40, 11, 142, 22, 3, 47, 143, 143, 1, 255, 71, 129, 47, 11, 255, 92, 128, 6, 3, 40, 39, 39, 1, 255, 74, 129, 40, 11, 144, 6, 4, 48, 51, 1, 0, 3, 57, 48, 13, 1, 255, 78, 129, 57, 2, 255, 94, 128, 0, 4, 99, 255, 95, 128, 1, 0, 3, 100, 99, 35, 1, 255, 82, 129, 100, 11, 3, 6, 4, 255, 64, 0, 46, 1, 0, 3, 255, 65, 0, 255, 64, 0, 46, 1, 255, 86, 129, 255, 65, 0, 11, 79, 6, 4, 255, 66, 0, 112, 1, 0, 3, 255, 67, 0, 255, 66, 0, 113, 1, 255, 90, 129, 255, 67, 0, 11, 79, 22, 4, 255, 68, 0, 114, 1, 0, 3, 255, 69, 0, 255, 68, 0, 145, 1, 255, 94, 129, 255, 69, 0, 11, 115, 6, 4, 255, 70, 0, 146, 1, 0, 3, 255, 71, 0, 255, 70, 0, 145, 1, 255, 98, 129, 255, 71, 0, 11, 115, 22, 4, 255, 72, 0, 255, 106, 128, 1, 0, 3, 255, 73, 0, 255, 72, 0, 255, 107, 128, 1, 255, 102, 129, 255, 73, 0, 11, 115, 20, 4, 255, 74, 0, 255, 108, 128, 1, 0, 3, 255, 75, 0, 255, 74, 0, 147, 1, 255, 106, 129, 255, 75, 0, 11, 3, 6, 4, 255, 76, 0, 255, 110, 128, 41, 0, 4, 255, 77, 0, 148, 19, 21, 3, 255, 78, 0, 255, 76, 0, 255, 77, 0, 1, 255, 111, 129, 255, 78, 0, 11, 62, 6, 4, 255, 79, 0, 73, 41, 0, 4, 255, 80, 0, 149, 19, 21, 3, 255, 81, 0, 255, 79, 0, 255, 80, 0, 1, 255, 116, 129, 255, 81, 0, 11, 62, 22, 4, 255, 83, 0, 149, 19, 21, 4, 255, 82, 0, 255, 83, 0, 198, 0, 3, 255, 84, 0, 255, 82, 0, 73, 1, 255, 121, 129, 255, 84, 0, 11, 62, 20, 4, 255, 85, 0, 116, 41, 0, 9, 255, 86, 0, 80, 3, 255, 87, 0, 255, 85, 0, 255, 86, 0, 1, 255, 126, 129, 255, 87, 0, 11, 62, 39, 9, 255, 88, 0, 80, 4, 255, 89, 0, 148, 19, 21, 3, 255, 90, 0, 255, 88, 0, 255, 89, 0, 1, 24, 255, 90, 0, 11, 62, 53, 4, 255, 91, 0, 0, 41, 0, 9, 255, 92, 0, 80, 3, 255, 93, 0, 255, 91, 0, 255, 92, 0, 1, 255, 136, 129, 255, 93, 0, 11, 62, 77, 4, 255, 94, 0, 33, 45, 0, 3, 255, 95, 0, 255, 94, 0, 150, 1, 255, 140, 129, 255, 95, 0, 2, 255, 118, 128, 0, 4, 255, 96, 0, 109, 45, 0, 3, 255, 97, 0, 255, 96, 0, 255, 119, 128, 1, 255, 144, 129, 255, 97, 0, 2, 255, 120, 128, 0, 4, 255, 98, 0, 58, 45, 0, 3, 255, 99, 0, 255, 98, 0, 151, 1, 255, 148, 129, 255, 99, 0, 2, 255, 122, 128, 0, 4, 255, 100, 0, 255, 123, 128, 74, 0, 3, 255, 101, 0, 255, 100, 0, 255, 124, 128, 1, 255, 152, 129, 255, 101, 0, 2, 152, 0, 4, 255, 102, 0, 255, 126, 128, 74, 0, 3, 255, 103, 0, 255, 102, 0, 153, 1, 255, 156, 129, 255, 103, 0, 2, 255, 128, 128, 0, 4, 255, 105, 0, 73, 41, 0, 4, 255, 104, 0, 255, 105, 0, 198, 0, 3, 255, 106, 0, 255, 104, 0, 73, 1, 255, 161, 129, 255, 106, 0, 2, 154, 0, 4, 255, 108, 0, 155, 19, 0, 4, 255, 107, 0, 255, 108, 0, 45, 0, 3, 255, 109, 0, 255, 107, 0, 155, 1, 255, 166, 129, 255, 109, 0, 2, 255, 131, 128, 0, 4, 255, 111, 0, 255, 132, 128, 19, 0, 4, 255, 110, 0, 255, 111, 0, 74, 0, 3, 255, 112, 0, 255, 110, 0, 156, 1, 255, 171, 129, 255, 112, 0, 2, 255, 134, 128, 0, 4, 255, 114, 0, 117, 19, 21, 4, 255, 113, 0, 255, 114, 0, 74, 0, 3, 255, 115, 0, 255, 113, 0, 117, 1, 255, 176, 129, 255, 115, 0, 2, 255, 136, 128, 0, 4, 255, 117, 0, 114, 19, 21, 4, 255, 116, 0, 255, 117, 0, 74, 0, 3, 255, 118, 0, 255, 116, 0, 117, 1, 255, 181, 129, 255, 118, 0, 2, 157, 0, 49, 255, 119, 0, 158, 159, 49, 255, 120, 0, 255, 119, 0, 255, 140, 128, 3, 255, 121, 0, 255, 120, 0, 160, 1, 255, 186, 129, 255, 121, 0, 11, 255, 142, 128, 6, 127, 255, 122, 0, 118, 6, 13, 3, 255, 123, 0, 255, 122, 0, 158, 1, 255, 193, 129, 255, 123, 0, 127, 102, 118, 6, 13, 49, 101, 255, 144, 128, 102, 49, 103, 101, 161, 2, 103, 0, 127, 101, 118, 22, 6, 3, 102, 101, 159, 1, 255, 197, 129, 102, 2, 255, 146, 128, 0, 120, 103, 51, 4, 255, 124, 0, 153, 19, 21, 3, 255, 125, 0, 103, 255, 124, 0, 1, 255, 202, 129, 255, 125, 0, 11, 162, 6, 120, 255, 126, 0, 255, 148, 128, 4, 255, 127, 0, 163, 19, 21, 3, 255, 128, 0, 255, 126, 0, 255, 127, 0, 1, 255, 207, 129, 255, 128, 0, 11, 162, 22, 4, 255, 130, 0, 255, 150, 128, 19, 21, 4, 255, 131, 0, 164, 19, 21, 4, 255, 132, 0, 165, 19, 21, 121, 255, 129, 0, 255, 130, 0, 255, 131, 0, 255, 132, 0, 3, 255, 133, 0, 255, 129, 0, 7, 1, 255, 214, 129, 255, 133, 0, 11, 119, 6, 4, 255, 135, 0, 255, 154, 128, 19, 21, 4, 255, 136, 0, 164, 19, 21, 4, 255, 137, 0, 165, 19, 21, 121, 255, 134, 0, 255, 135, 0, 255, 136, 0, 255, 137, 0, 3, 255, 138, 0, 255, 134, 0, 15, 1, 255, 221, 129, 255, 138, 0, 11, 119, 22, 43, 255, 139, 0, 166, 3, 255, 140, 0, 255, 139, 0, 20, 1, 255, 225, 129, 255, 140, 0, 2, 255, 156, 128, 0, 4, 255, 142, 0, 166, 19, 0, 43, 255, 141, 0, 255, 142, 0, 3, 255, 143, 0, 255, 141, 0, 20, 1, 255, 230, 129, 255, 143, 0, 2, 167, 0, 110, 104, 6, 22, 110, 104, 104, 20, 3, 255, 144, 0, 104, 6, 1, 255, 235, 129, 255, 144, 0, 2, 255, 158, 128, 0, 71, 105, 6, 22, 71, 105, 105, 20, 3, 255, 145, 0, 105, 20, 1, 255, 240, 129, 255, 145, 0, 2, 255, 159, 128, 0, 52, 255, 146, 0, 0, 3, 255, 147, 0, 255, 146, 0, 13, 1, 255, 244, 129, 255, 147, 0, 2, 4, 0, 52, 255, 148, 0, 15, 3, 255, 149, 0, 255, 148, 0, 6, 1, 255, 248, 129, 255, 149, 0, 2, 168, 0, 52, 255, 150, 0, 7, 3, 255, 151, 0, 255, 150, 0, 22, 1, 255, 252, 129, 255, 151, 0, 2, 255, 162, 128, 0, 52, 255, 152, 0, 6, 3, 255, 153, 0, 255, 152, 0, 39, 1, 255, 0, 130, 255, 153, 0, 2, 120, 0, 52, 255, 154, 0, 51, 3, 255, 155, 0, 255, 154, 0, 53, 1, 255, 4, 130, 255, 155, 0, 2, 121, 0, 4, 255, 157, 0, 51, 19, 0, 52, 255, 156, 0, 255, 157, 0, 3, 255, 158, 0, 255, 156, 0, 77, 1, 255, 9, 130, 255, 158, 0, 2, 169, 0, 7, 255, 160, 0, 30, 52, 255, 159, 0, 255, 160, 0, 3, 255, 161, 0, 255, 159, 0, 255, 166, 128, 1, 255, 14, 130, 255, 161, 0, 2, 255, 167, 128, 0, 7, 255, 163, 0, 31, 52, 255, 162, 0, 255, 163, 0, 3, 255, 164, 0, 255, 162, 0, 170, 1, 255, 19, 130, 255, 164, 0, 2, 255, 170, 128, 0, 82, 255, 166, 0, 6, 196, 255, 165, 0, 255, 166, 0, 3, 255, 167, 0, 255, 165, 0, 6, 1, 255, 24, 130, 255, 167, 0, 2, 255, 171, 128, 0, 4, 255, 168, 0, 0, 12, 0, 3, 255, 169, 0, 255, 168, 0, 15, 1, 255, 28, 130, 255, 169, 0, 2, 255, 172, 128, 0, 4, 255, 170, 0, 15, 12, 0, 3, 255, 171, 0, 255, 170, 0, 15, 1, 255, 32, 130, 255, 171, 0, 2, 171, 0, 4, 255, 172, 0, 7, 12, 0, 3, 255, 173, 0, 255, 172, 0, 7, 1, 255, 36, 130, 255, 173, 0, 2, 255, 174, 128, 0, 4, 255, 174, 0, 13, 12, 0, 3, 255, 175, 0, 255, 174, 0, 15, 1, 255, 40, 130, 255, 175, 0, 2, 255, 175, 128, 0, 4, 255, 176, 0, 141, 12, 0, 3, 255, 177, 0, 255, 176, 0, 7, 1, 255, 44, 130, 255, 177, 0, 2, 255, 176, 128, 0, 4, 255, 178, 0, 51, 12, 0, 3, 255, 179, 0, 255, 178, 0, 15, 1, 255, 48, 130, 255, 179, 0, 2, 172, 0, 4, 255, 180, 0, 173, 12, 0, 3, 255, 181, 0, 255, 180, 0, 7, 1, 255, 52, 130, 255, 181, 0, 2, 255, 179, 128, 0, 4, 255, 183, 0, 51, 19, 0, 4, 255, 182, 0, 255, 183, 0, 12, 0, 3, 255, 184, 0, 255, 182, 0, 15, 1, 255, 57, 130, 255, 184, 0, 2, 255, 180, 128, 0, 4, 255, 186, 0, 173, 19, 0, 4, 255, 185, 0, 255, 186, 0, 12, 0, 3, 255, 187, 0, 255, 185, 0, 7, 1, 255, 62, 130, 255, 187, 0, 2, 174, 0, 7, 255, 189, 0, 30, 4, 255, 188, 0, 255, 189, 0, 12, 0, 3, 255, 190, 0, 255, 188, 0, 7, 1, 255, 67, 130, 255, 190, 0, 2, 255, 182, 128, 0, 7, 255, 192, 0, 31, 4, 255, 191, 0, 255, 192, 0, 12, 0, 3, 255, 193, 0, 255, 191, 0, 7, 1, 255, 72, 130, 255, 193, 0, 2, 255, 183, 128, 0, 4, 255, 194, 0, 0, 1, 0, 3, 255, 195, 0, 255, 194, 0, 13, 1, 255, 76, 130, 255, 195, 0, 2, 255, 184, 128, 0, 4, 255, 196, 0, 15, 1, 0, 3, 255, 197, 0, 255, 196, 0, 13, 1, 255, 80, 130, 255, 197, 0, 2, 175, 0, 4, 255, 198, 0, 7, 1, 0, 3, 255, 199, 0, 255, 198, 0, 6, 1, 255, 84, 130, 255, 199, 0, 2, 255, 186, 128, 0, 4, 255, 200, 0, 255, 187, 128, 1, 21, 3, 255, 201, 0, 255, 200, 0, 255, 188, 128, 1, 255, 88, 130, 255, 201, 0, 2, 176, 0, 4, 255, 203, 0, 63, 19, 0, 4, 255, 202, 0, 255, 203, 0, 1, 0, 3, 255, 204, 0, 255, 202, 0, 63, 1, 255, 93, 130, 255, 204, 0, 2, 255, 191, 128, 0, 4, 255, 207, 0, 63, 19, 0, 4, 255, 206, 0, 255, 207, 0, 19, 0, 4, 255, 205, 0, 255, 206, 0, 1, 0, 3, 255, 208, 0, 255, 205, 0, 63, 1, 255, 99, 130, 255, 208, 0, 2, 255, 192, 128, 0, 4, 255, 210, 0, 63, 255, 8, 140, 0, 4, 255, 209, 0, 255, 210, 0, 1, 108, 3, 255, 211, 0, 255, 209, 0, 63, 1, 255, 104, 130, 255, 211, 0, 2, 177, 0, 4, 255, 214, 0, 116, 41, 0, 4, 255, 213, 0, 255, 214, 0, 19, 0, 4, 255, 212, 0, 255, 213, 0, 41, 0, 4, 255, 215, 0, 116, 41, 0, 3, 255, 216, 0, 255, 212, 0, 255, 215, 0, 1, 255, 111, 130, 255, 216, 0, 2, 255, 194, 128, 0, 7, 255, 217, 0, 30, 7, 255, 218, 0, 30, 35, 255, 219, 0, 255, 217, 0, 255, 218, 0, 1, 255, 116, 130, 255, 219, 0, 2, 178, 0, 7, 255, 220, 0, 31, 7, 255, 221, 0, 31, 35, 255, 222, 0, 255, 220, 0, 255, 221, 0, 1, 255, 121, 130, 255, 222, 0, 2, 178, 0, 4, 255, 223, 0, 2, 45, 0, 3, 255, 224, 0, 255, 223, 0, 2, 1, 255, 125, 130, 255, 224, 0, 2, 179, 0, 0, 7, 8, 30, 9, 5, 8, 43, 14, 5, 3, 16, 14, 13, 1, 255, 132, 130, 16, 2, 180, 0, 17, 5, 72, 10, 27, 5, 13, 3, 18, 27, 72, 1, 255, 137, 130, 18, 2, 255, 199, 128, 0, 43, 23, 5, 3, 36, 23, 6, 1, 255, 141, 130, 36, 2, 255, 200, 128, 0, 24, 5, 13, 81, 82, 34, 5, 9, 29, 34, 10, 32, 29, 13, 3, 25, 32, 81, 1, 255, 148, 130, 25, 2, 255, 202, 128, 0, 65, 37, 29, 65, 29, 5, 3, 34, 29, 81, 1, 255, 153, 130, 34, 2, 255, 203, 128, 0, 43, 25, 5, 3, 32, 25, 13, 1, 255, 157, 130, 32, 2, 180, 0, 10, 42, 5, 255, 204, 128, 3, 37, 42, 0, 1, 255, 161, 130, 37, 2, 181, 0, 7, 8, 31, 9, 5, 8, 10, 16, 5, 26, 3, 14, 16, 0, 1, 255, 167, 130, 14, 2, 255, 207, 128, 0, 24, 5, 26, 33, 10, 18, 5, 26, 3, 27, 18, 33, 1, 255, 172, 130, 27, 2, 255, 208, 128, 0, 10, 23, 5, 26, 38, 36, 23, 6, 24, 5, 26, 36, 10, 34, 5, 26, 3, 29, 34, 182, 1, 255, 179, 130, 29, 2, 255, 210, 128, 0, 24, 5, 26, 122, 82, 32, 5, 9, 25, 32, 10, 42, 25, 26, 3, 37, 42, 122, 1, 255, 186, 130, 37, 2, 255, 212, 128, 0, 195, 25, 26, 10, 32, 5, 26, 3, 25, 32, 122, 1, 255, 191, 130, 25, 2, 183, 0, 195, 5, 26, 10, 42, 5, 26, 3, 37, 42, 0, 1, 11, 37, 2, 255, 214, 128, 0, 82, 68, 5, 9, 67, 68, 10, 107, 67, 26, 3, 106, 107, 0, 1, 255, 202, 130, 106, 2, 255, 215, 128, 0, 7, 8, 31, 9, 5, 8, 24, 5, 13, 7, 24, 5, 15, 7, 24, 5, 7, 7, 24, 5, 2, 7, 4, 14, 184, 19, 0, 24, 5, 14, 7, 7, 18, 30, 9, 16, 18, 24, 5, 16, 7, 7, 23, 31, 9, 27, 23, 24, 5, 27, 7, 10, 29, 5, 13, 35, 36, 29, 0, 1, 255, 220, 130, 36, 2, 185, 0, 10, 25, 5, 15, 35, 34, 25, 0, 1, 255, 224, 130, 34, 2, 255, 218, 128, 0, 10, 37, 5, 7, 35, 32, 37, 0, 1, 255, 228, 130, 32, 2, 255, 219, 128, 0, 10, 67, 5, 2, 35, 42, 67, 0, 1, 255, 232, 130, 42, 2, 255, 220, 128, 0, 4, 68, 184, 19, 0, 10, 107, 5, 68, 35, 106, 107, 0, 1, 255, 237, 130, 106, 2, 186, 0, 10, 255, 226, 0, 5, 16, 35, 255, 225, 0, 255, 226, 0, 0, 1, 255, 241, 130, 255, 225, 0, 2, 255, 222, 128, 0, 10, 255, 228, 0, 5, 27, 35, 255, 227, 0, 255, 228, 0, 0, 1, 255, 245, 130, 255, 227, 0, 2, 255, 223, 128, 0, 7, 8, 31, 24, 8, 26, 187, 24, 8, 188, 189, 9, 5, 8, 10, 16, 5, 26, 3, 14, 16, 187, 1, 255, 253, 130, 14, 2, 255, 227, 128, 0, 10, 27, 5, 188, 3, 18, 27, 189, 1, 255, 1, 131, 18, 2, 190, 0, 7, 36, 31, 9, 23, 36, 10, 29, 5, 26, 24, 23, 26, 29, 10, 34, 5, 26, 10, 32, 23, 26, 3, 25, 32, 34, 1, 255, 10, 131, 25, 2, 255, 229, 128, 0, 9, 5, 0, 10, 14, 5, 26, 3, 8, 14, 0, 1, 255, 15, 131, 8, 2, 255, 230, 128, 0, 7, 8, 30, 17, 8, 6, 17, 8, 22, 7, 16, 30, 17, 16, 20, 17, 16, 39, 49, 14, 8, 16, 7, 27, 30, 17, 27, 53, 49, 18, 14, 27, 9, 5, 18, 43, 23, 5, 3, 36, 23, 53, 1, 255, 30, 131, 36, 2, 255, 231, 128, 0, 9, 29, 13, 46, 34, 29, 53, 1, 255, 40, 131, 34, 38, 25, 29, 6, 10, 37, 5, 29, 3, 32, 37, 25, 1, 255, 38, 131, 32, 2, 123, 0, 38, 29, 29, 6, 21, 255, 31, 131, 7, 8, 31, 7, 14, 31, 24, 14, 26, 33, 24, 8, 26, 14, 9, 5, 8, 9, 16, 5, 9, 5, 0, 10, 18, 16, 26, 10, 23, 18, 26, 3, 27, 23, 33, 1, 255, 52, 131, 27, 2, 191, 0, 9, 5, 6, 15, 5, 9, 5, 6, 3, 8, 5, 6, 1, 255, 58, 131, 8, 2, 255, 234, 128, 0, 7, 8, 30, 17, 8, 6, 17, 8, 22, 17, 8, 20, 9, 5, 8, 65, 14, 5, 17, 5, 39, 10, 18, 5, 22, 3, 16, 18, 39, 1, 255, 69, 131, 16, 2, 255, 235, 128, 0, 7, 8, 30, 17, 8, 6, 17, 8, 22, 17, 8, 20, 9, 5, 8, 196, 16, 5, 9, 14, 16, 43, 18, 14, 3, 27, 18, 20, 1, 255, 80, 131, 27, 2, 255, 236, 128, 0, 9, 23, 13, 43, 36, 14, 46, 29, 23, 36, 1, 255, 91, 131, 29, 38, 34, 23, 6, 10, 32, 14, 23, 3, 25, 32, 34, 1, 255, 89, 131, 25, 2, 255, 237, 128, 0, 38, 23, 23, 6, 21, 255, 81, 131, 65, 23, 14, 65, 36, 14, 43, 29, 5, 3, 34, 29, 20, 1, 255, 97, 131, 34, 2, 255, 238, 128, 0, 9, 25, 13, 43, 32, 5, 46, 37, 25, 32, 1, 255, 108, 131, 37, 38, 42, 25, 6, 10, 68, 5, 25, 3, 67, 68, 42, 1, 255, 106, 131, 67, 2, 123, 0, 38, 25, 25, 6, 21, 255, 98, 131, 7, 8, 30, 17, 8, 0, 17, 8, 7, 17, 8, 15, 17, 8, 6, 17, 8, 2, 7, 14, 30, 17, 8, 14, 7, 16, 31, 17, 8, 16, 9, 5, 8, 10, 27, 5, 13, 3, 18, 27, 0, 1, 255, 123, 131, 18, 2, 255, 239, 128, 0, 10, 36, 5, 6, 3, 23, 36, 7, 1, 255, 127, 131, 23, 2, 255, 240, 128, 0, 10, 34, 5, 22, 3, 29, 34, 15, 1, 255, 131, 131, 29, 2, 255, 241, 128, 0, 10, 32, 5, 20, 3, 25, 32, 6, 1, 255, 135, 131, 25, 2, 192, 0, 10, 42, 5, 39, 3, 37, 42, 2, 1, 255, 139, 131, 37, 2, 255, 243, 128, 0, 7, 8, 31, 9, 5, 8, 4, 16, 193, 41, 0, 9, 14, 16, 24, 5, 14, 33, 10, 27, 5, 14, 3, 18, 27, 33, 1, 255, 148, 131, 18, 2, 255, 245, 128, 0, 7, 8, 30, 17, 8, 6, 17, 8, 22, 17, 8, 20, 9, 5, 8, 9, 14, 5, 17, 14, 39, 10, 18, 5, 20, 3, 16, 18, 39, 1, 255, 159, 131, 16, 2, 255, 246, 128, 0, 7, 8, 31, 7, 14, 31, 24, 8, 64, 14, 9, 5, 8, 10, 16, 5, 64, 24, 16, 124, 7, 10, 18, 5, 64, 10, 23, 18, 124, 3, 27, 23, 7, 1, 255, 170, 131, 27, 2, 255, 249, 128, 0, 7, 8, 31, 24, 8, 64, 7, 9, 5, 8, 10, 14, 5, 64, 15, 14, 10, 18, 5, 64, 3, 16, 18, 7, 1, 255, 179, 131, 16, 2, 255, 250, 128, 0, 7, 8, 31, 9, 5, 8, 9, 14, 80, 10, 18, 5, 14, 35, 16, 18, 13, 1, 255, 186, 131, 16, 2, 255, 251, 128, 0, 7, 8, 31, 24, 8, 2, 194, 9, 5, 8, 24, 5, 125, 5, 15, 5, 7, 8, 31, 9, 5, 8, 7, 16, 31, 24, 16, 125, 5, 9, 14, 16, 24, 5, 125, 14, 7, 8, 30, 17, 8, 6, 17, 8, 22, 17, 8, 20, 9, 5, 8, 65, 14, 5, 10, 18, 5, 22, 3, 16, 18, 0, 1, 255, 207, 131, 16, 2, 255, 254, 128, 0, 10, 23, 5, 33, 3, 27, 23, 0, 1, 255, 211, 131, 27, 2, 255, 255, 128, 0, 19], \"line_info\": [], \"source\": \"\\n{}\\n\\n{\\n}\\n\\nif(false) {\\n\\tfail(\\\"false\\\");\\n}\\nif(!true) {\\n\\tfail(\\\"!\\\");\\n}\\nif(!(!false)) {\\n\\tfail(\\\"!!\\\");\\n}\\nif(true && false) {\\n\\tfail(\\\"true && false\\\");\\n}\\nif(false && true) {\\n\\tfail(\\\"false && true\\\");\\n}\\nif(!(true || false)) {\\n\\tfail(\\\"true || false\\\");\\n}\\nif(!(false || true)) {\\n\\tfail(\\\"false || true\\\");\\n}\\nif(!(true && true)) {\\n\\tfail(\\\"true && true\\\");\\n}\\nif(!(true || true)) {\\n\\tfail(\\\"true && true\\\");\\n}\\nif(false || false) {\\n\\tfail(\\\"false || false\\\");\\n}\\nif(false && false) {\\n\\tfail(\\\"false && false\\\");\\n}\\nif(false ^ false) {\\n\\tfail(\\\"false ^ false\\\");\\n}\\nif(true ^ true) {\\n\\tfail(\\\"true ^ true\\\");\\n}\\nif(!(false ^ true)) {\\n\\tfail(\\\"false ^ true\\\");\\n}\\nif(!(true ^ false)) {\\n\\tfail(\\\"false ^ true\\\");\\n}\\nif(true) {\\n\\t// pass\\n} else {\\n\\tfail(\\\"else\\\");\\n}\\nif(false) {\\n\\tfail(\\\"else-if\\\");\\n} else if(false) {\\n\\tfail(\\\"else-if\\\");\\n} else if(false) {\\n\\tfail(\\\"else-if\\\");\\n} else {\\n\\t// pass\\n}\\n\\nif(null != null) {\\n\\tfail(\\\"null != null\\\");\\n}\\nif(null == 0) {\\n\\tfail(\\\"null == 0\\\");\\n}\\nif(null == false) {\\n\\tfail(\\\"null == false\\\");\\n}\\nif(null == true) {\\n\\tfail(\\\"null == true\\\");\\n}\\nif(null == \\\"\\\") {\\n\\tfail(\\\"null == ''\\\");\\n}\\nif(!(null == null)) {\\n\\tfail(\\\"!(null == null)\\\");\\n}\\nif(!(null != 0)) {\\n\\tfail(\\\"!(null != 0)\\\");\\n}\\nif(!(null != false)) {\\n\\tfail(\\\"!(null != false)\\\");\\n}\\nif(!(null != true)) {\\n\\tfail(\\\"!(null != true)\\\");\\n}\\nif(!(null != \\\"\\\")) {\\n\\tfail(\\\"!(null != '')\\\");\\n}\\n\\nif(!(1 > 0)) {\\n\\tfail(\\\"1 > 0\\\");\\n}\\nif(!(1 >= 0)) {\\n\\tfail(\\\"1 >= 0\\\");\\n}\\nif(!(1 >= 1)) {\\n\\tfail(\\\"1 >= 1\\\");\\n}\\nif(!(0 < 1)) {\\n\\tfail(\\\"0 < 1\\\");\\n}\\nif(!(0 <= 1)) {\\n\\tfail(\\\"0 <= 1\\\");\\n}\\nif(!(1 <= 1)) {\\n\\tfail(\\\"1 <= 1\\\");\\n}\\n\\nif((1 >> 0) != 1) {\\n\\tfail(\\\"1 >> 0\\\");\\n}\\nif((2 >> 1) != 1) {\\n\\tfail(\\\"2 >> 1\\\");\\n}\\nif((1 << 0) != 1) {\\n\\tfail(\\\"1 << 0\\\");\\n}\\nif((1 << 1) != 2) {\\n\\tfail(\\\"1 << 1\\\");\\n}\\n\\nif(1 + 1 != 2) {\\n\\tfail(\\\"add\\\", 1);\\n}\\nif(1 - 1 != 0) {\\n\\tfail(\\\"sub\\\", 1);\\n}\\n\\nif(1 * 1 != 1) {\\n\\tfail(\\\"mul\\\", 1);\\n}\\nif(1337 * 1337 != 1787569) {\\n\\tfail(\\\"mul\\\", 2);\\n}\\nif(18446744073709551615 * 18446744073709551615 != 340282366920938463426481119284349108225) {\\n\\tfail(\\\"mul\\\", 3);\\n}\\nif(340282366920938463463374607431768211455 * 340282366920938463463374607431768211455 != 115792089237316195423570985008687907852589419931798687112530834793049593217025) {\\n\\tfail(\\\"mul\\\", 4);\\n}\\nif(86605900701059233675071791330357447908204924955602516110289890806217748420 * 1337 != 115792089237316195423570985008687907853269984665640564039457584007913129637540) {\\n\\tfail(\\\"mul\\\", 5);\\n}\\n\\nif(3 / 2 != 1) {\\n\\tfail(\\\"div\\\", 1);\\n}\\nif(13371337 / 1337 != 10001) {\\n\\tfail(\\\"div\\\", 2);\\n}\\nif(340282366920938463463374607431768211455 / 1337 != 254511867554927796158096191048442940) {\\n\\tfail(\\\"div\\\", 3);\\n}\\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 / 1337 != 86605900701059233675071791330357447908204924955602516110289890806217748421) {\\n\\tfail(\\\"div\\\", 4);\\n}\\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 / 340282366920938463463374607431768211455 != 340282366920938463463374607431768211457) {\\n\\tfail(\\\"div\\\", 5);\\n}\\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 / 86605900701059233675071791330357447908204924955602516110289890806217748420 != 1337) {\\n\\tfail(\\\"div\\\", 6);\\n}\\nif((3 >> 0) != 3) {\\n\\tfail(\\\"3 >> 0\\\");\\n}\\nif(3 / 1 != 3) {\\n\\tfail(concat(\\\"div 3 / 1 => \\\", to_string(3 / 1)));\\n}\\nif(13371337 / 1024 != 13057) {\\n\\tfail(\\\"div 13371337 / 1024\\\");\\n}\\nfor(var i = 1; i < 100; ++i) {\\n\\tif((11 * i) / i != 11) {\\n\\t\\tfail(concat(\\\"div (11 * i) / i: \\\", to_string(i)));\\n\\t}\\n}\\n\\nif(3 % 2 != 1) {\\n\\tfail(\\\"mod\\\", 1);\\n}\\nif(13371337 % 1337 != 0) {\\n\\tfail(\\\"mod\\\", 2);\\n}\\nif(340282366920938463463374607431768211455 % 1337 != 675) {\\n\\tfail(\\\"mod\\\", 3);\\n}\\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 % 1337 != 1058) {\\n\\tfail(\\\"mod\\\", 4);\\n}\\nif(3 % 1 != 0) {\\n\\tfail(\\\"mod 3 % 1\\\");\\n}\\nif(13371337 % 1024 != 969) {\\n\\tfail(\\\"mod 13371337 % 1024\\\");\\n}\\nfor(var i = 1; i < 100; ++i) {\\n\\tif((11 * i) % i != 0) {\\n\\t\\tfail(concat(\\\"mod (11 * i) % i: \\\", to_string(i)));\\n\\t}\\n}\\n\\nif((0xFF00FF ^ 0xFF00FF) != 0) {\\n\\tfail(\\\"xor\\\", 1);\\n}\\nif((0xFF00FF & 0xFFFFFF) != 0xFF00FF) {\\n\\tfail(\\\"and\\\", 1);\\n}\\nif((0xFF00FF | 0) != 0xFF00FF) {\\n\\tfail(\\\"or\\\", 1);\\n}\\nif((~0xFF00FF & 0xFFFFFF) != 0x00FF00) {\\n\\tfail(\\\"not\\\", 1);\\n}\\n\\n{\\n\\tvar res = 0;\\n\\tfor(var i = 0; i < 10; ++i) {\\n\\t\\tres += 2;\\n\\t}\\n\\tif(res != 20) {\\n\\t\\tfail(\\\"for\\\", 1);\\n\\t}\\n}\\n{\\n\\tvar res = 0;\\n\\tfor(var i of [1, 2, 3]) {\\n\\t\\tres += i;\\n\\t}\\n\\tif(res != 6) {\\n\\t\\tfail(\\\"for\\\", 2);\\n\\t}\\n}\\n\\nif(0x100 != 256) {\\n\\tfail(\\\"hex\\\", 1);\\n}\\nif(0b100 != 4) {\\n\\tfail(\\\"bin\\\", 1);\\n}\\nif(uint(\\\"\\\") != 0) {\\n\\tfail(\\\"uint('')\\\");\\n}\\nif(uint(\\\"0b01011101010001\\\") != 0b01011101010001) {\\n\\tfail(\\\"uint(bin)\\\", 1);\\n}\\nif(uint(111) != 111) {\\n\\tfail(\\\"uint(dec)\\\", 1);\\n}\\nif(uint(\\\"111820312618873087563030836565815045174850059154595088905299609727287843170569\\\") != 111820312618873087563030836565815045174850059154595088905299609727287843170569) {\\n\\tfail(\\\"uint(dec)\\\", 2);\\n}\\nif(uint(\\\"0x0123456789ABCDEF\\\") != 0x0123456789ABCDEF) {\\n\\tfail(\\\"uint(hex)\\\", 1);\\n}\\nif(uint(\\\"0x0123456789abcdef\\\") != 0x0123456789abcdef) {\\n\\tfail(\\\"uint(hex)\\\", 2);\\n}\\nif(uint(\\\"0x09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7\\\") != 0x09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7) {\\n\\tfail(\\\"uint(hex)\\\", 3);\\n}\\nif(uint(\\\"0b1001\\\") != 9) {\\n\\tfail(\\\"uint(bin)\\\", 1);\\n}\\nif(bech32(\\\"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\\\") != binary_hex(\\\"0000000000000000000000000000000000000000000000000000000000000000\\\")) {\\n\\tfail(\\\"bech32\\\", 1);\\n}\\nif(bech32(\\\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\\\") != binary_hex(\\\"09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7\\\")) {\\n\\tfail(\\\"bech32\\\", 2);\\n}\\nif(to_string_bech32(binary_hex(\\\"09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7\\\")) != \\\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\\\") {\\n\\tfail(\\\"bech32\\\", 3);\\n}\\nif(bech32(\\\"MMX\\\") != bech32()) {\\n\\tfail(\\\"bech32\\\", 4);\\n}\\nif(bech32() != binary_hex(\\\"0000000000000000000000000000000000000000000000000000000000000000\\\")) {\\n\\tfail(\\\"bech32\\\", 5);\\n}\\nif(bech32(null) != bech32()) {\\n\\tfail(\\\"bech32\\\", 6);\\n}\\nif(to_string(1337) != \\\"1337\\\") {\\n\\tfail(\\\"to_string(1337)\\\");\\n}\\nif(to_string(18446744073709551615) != \\\"18446744073709551615\\\") {\\n\\tfail(\\\"to_string(18446744073709551615)\\\");\\n}\\nif(to_string(340282366920938463463374607431768211455) != \\\"340282366920938463463374607431768211455\\\") {\\n\\tfail(\\\"to_string(340282366920938463463374607431768211455)\\\");\\n}\\nif(to_string_hex(0x01234567ABCDE) != \\\"1234567abcde\\\") {\\n\\tfail(\\\"to_string_hex(0x01234567ABCDE)\\\");\\n}\\nif(to_string_hex(0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855) != \\\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\\") {\\n\\tfail(\\\"to_string_hex(0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855)\\\");\\n}\\nif(to_string_bech32(bech32(\\\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\\\")) != \\\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\\\") {\\n\\tfail(\\\"to_string_bech32(mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf)\\\");\\n}\\nif(to_string(binary(\\\"ABCDEF\\\")) != \\\"ABCDEF\\\") {\\n\\tfail(\\\"binary(ABCDEF)\\\");\\n}\\nif(to_string_hex(binary(\\\"AB\\\")) != \\\"4142\\\") {\\n\\tfail(\\\"binary(AB)\\\");\\n}\\nif(to_string_hex(binary_hex(\\\"0123456789ABCDEF\\\")) != \\\"0123456789ABCDEF\\\") {\\n\\tfail(\\\"binary_hex(0123456789ABCDEF)\\\");\\n}\\nif(to_string_hex(binary_hex(\\\"0x0123456789ABCDEF\\\")) != \\\"0123456789ABCDEF\\\") {\\n\\tfail(\\\"binary_hex(0x0123456789ABCDEF)\\\");\\n}\\nif(concat(\\\"A\\\", \\\"BC\\\", \\\"D\\\") != \\\"ABCD\\\") {\\n\\tfail(\\\"concat()\\\", 1);\\n}\\nif(memcpy(\\\"ABC\\\", 1) != \\\"A\\\") {\\n\\tfail(concat(\\\"memcpy(ABC, 1): '\\\", memcpy(\\\"ABC\\\", 1), \\\"'\\\"));\\n}\\nif(memcpy(\\\"ABC\\\", 2, 1) != \\\"BC\\\") {\\n\\tfail(\\\"memcpy(ABC, 2, 1)\\\");\\n}\\nif(sha256(\\\"\\\") != binary_hex(\\\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\\\")) {\\n\\tfail(\\\"sha256()\\\", 1);\\n}\\nif(sha256(\\\"abc\\\") != binary_hex(\\\"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad\\\")) {\\n\\tfail(\\\"sha256()\\\", 2);\\n}\\nif(ecdsa_verify(\\n\\t\\tbinary_hex(\\\"F3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964A\\\"),\\n\\t\\tbinary_hex(\\\"02054191D5103F7A04B2E5B53AF253A6476F11DDCDB3B4134D74CFD642969B082E\\\"),\\n\\t\\tbinary_hex(\\\"C05F13C85BDDFBB0A198697FAAC6973AA008AA45544FB7AB586B636405F73F215237D508C6FAE90C24BE424584640F824864B6FF3F2B99FB2104BBD5743E8E39\\\")) != true)\\n{\\n\\tfail(\\\"ecdsa_verify\\\", 1);\\n}\\nif(ecdsa_verify(\\n\\t\\tbinary_hex(\\\"A3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964A\\\"),\\n\\t\\tbinary_hex(\\\"02054191D5103F7A04B2E5B53AF253A6476F11DDCDB3B4134D74CFD642969B082E\\\"),\\n\\t\\tbinary_hex(\\\"C05F13C85BDDFBB0A198697FAAC6973AA008AA45544FB7AB586B636405F73F215237D508C6FAE90C24BE424584640F824864B6FF3F2B99FB2104BBD5743E8E39\\\")) != false)\\n{\\n\\tfail(\\\"ecdsa_verify\\\", 2);\\n}\\nif(size(\\\"123\\\") != 3) {\\n\\tfail(\\\"size('123')\\\");\\n}\\nif(size(binary(\\\"123\\\")) != 3) {\\n\\tfail(\\\"size(binary('123'))\\\");\\n}\\nif(min(1, 2, 3) != 1) {\\n\\tfail(\\\"min()\\\");\\n}\\nif(max(1, 2, 3) != 3) {\\n\\tfail(\\\"max()\\\");\\n}\\nif(typeof(null) != 0) {\\n\\tfail(\\\"typeof(null)\\\");\\n}\\nif(typeof(false) != 1) {\\n\\tfail(\\\"typeof(false)\\\");\\n}\\nif(typeof(true) != 2) {\\n\\tfail(\\\"typeof(true)\\\");\\n}\\nif(typeof(1) != 4) {\\n\\tfail(\\\"typeof(1)\\\");\\n}\\nif(typeof(\\\"\\\") != 5) {\\n\\tfail(\\\"typeof('')\\\");\\n}\\nif(typeof(binary(\\\"\\\")) != 6) {\\n\\tfail(\\\"typeof(binary)\\\");\\n}\\nif(typeof([]) != 7) {\\n\\tfail(\\\"typeof([])\\\");\\n}\\nif(typeof({}) != 8) {\\n\\tfail(\\\"typeof({})\\\");\\n}\\nif(deref(clone(1)) != 1) {\\n\\tfail(\\\"deref(clone(1)) != 1\\\");\\n}\\nif(bool(null) != false) {\\n\\tfail(\\\"bool(null)\\\");\\n}\\nif(bool(false) != false) {\\n\\tfail(\\\"bool(false)\\\");\\n}\\nif(bool(true) != true) {\\n\\tfail(\\\"bool(true)\\\");\\n}\\nif(bool(0) != false) {\\n\\tfail(\\\"bool(0)\\\");\\n}\\nif(bool(10) != true) {\\n\\tfail(\\\"bool(10)\\\");\\n}\\nif(bool(\\\"\\\") != false) {\\n\\tfail(\\\"bool('')\\\");\\n}\\nif(bool(\\\"0\\\") != true) {\\n\\tfail(\\\"bool('0')\\\");\\n}\\nif(bool(binary(\\\"\\\")) != false) {\\n\\tfail(\\\"bool(binary(''))\\\");\\n}\\nif(bool(binary(\\\"0\\\")) != true) {\\n\\tfail(\\\"bool(binary('0')\\\");\\n}\\nif(bool([]) != true) {\\n\\tfail(\\\"bool([])\\\");\\n}\\nif(bool({}) != true) {\\n\\tfail(\\\"bool({})\\\");\\n}\\nif(uint(null) != 0) {\\n\\tfail(\\\"uint(null)\\\");\\n}\\nif(uint(false) != 0) {\\n\\tfail(\\\"uint(false)\\\");\\n}\\nif(uint(true) != 1) {\\n\\tfail(\\\"uint(true)\\\");\\n}\\nif(uint_hex(\\\"aabbc\\\") != 0xaabbc) {\\n\\tfail(\\\"uint_hex('aabbc')\\\");\\n}\\nif(uint(binary(0xABCDEF0)) != 0xABCDEF0) {\\n\\tfail(\\\"uint(binary(0xABCDEF0))\\\");\\n}\\nif(uint(binary(binary(0xABCDEF0))) != 0xABCDEF0) {\\n\\tfail(\\\"uint(binary(binary(0xABCDEF0)))\\\");\\n}\\nif(uint_le(binary_le(0xABCDEF0)) != 0xABCDEF0) {\\n\\tfail(\\\"uint_le(binary_le(0xABCDEF0))\\\");\\n}\\nif(bech32(binary(bech32(\\\"MMX\\\"))) != bech32(\\\"MMX\\\")) {\\n\\tfail(\\\"bech32(binary(bech32(MMX)))\\\");\\n}\\nif([] == []) {\\n\\tfail(\\\"[] == []\\\");\\n}\\nif({} == {}) {\\n\\tfail(\\\"[] == []\\\");\\n}\\nif(to_string(\\\"test\\\") != \\\"test\\\") {\\n\\tfail(\\\"to_string(test)\\\");\\n}\\n\\n__nop();\\n\\n{\\n\\tvar array = [];\\n\\tif(size(array) != 0) {\\n\\t\\tfail(\\\"size(array) != 0\\\");\\n\\t}\\n\\tpush(array, 11);\\n\\tif(array[0] != 11) {\\n\\t\\tfail(\\\"array[0] != 11\\\");\\n\\t}\\n\\tif(size(array) != 1) {\\n\\t\\tfail(\\\"size(array) != 1\\\");\\n\\t}\\n\\tarray[0] = 12;\\n\\t{\\n\\t\\tvar tmp = clone(array);\\n\\t\\tif(tmp[0] != 12) {\\n\\t\\t\\tfail(\\\"clone: array[0] != 12\\\");\\n\\t\\t}\\n\\t\\tpop(tmp);\\n\\t}\\n\\tif(pop(array) != 12) {\\n\\t\\tfail(\\\"pop(array) != 12\\\");\\n\\t}\\n\\tif(size(array) != 0) {\\n\\t\\tfail(\\\"size(array) != 0\\\");\\n\\t}\\n\\tif(array[35345345345] != null) {\\n\\t\\tfail(\\\"array[35345345345] != null\\\");\\n\\t}\\n}\\n{\\n\\tvar map = {};\\n\\tif(map.field != null) {\\n\\t\\tfail(\\\"map.field != null\\\");\\n\\t}\\n\\tmap.field = 1337;\\n\\tif(get(map, \\\"field\\\") != 1337) {\\n\\t\\tfail(\\\"map.field != 1337\\\");\\n\\t}\\n\\tmap.field++;\\n\\tif(map.field != 1338) {\\n\\t\\tfail(\\\"map.field != 1338\\\");\\n\\t}\\n\\tset(map, \\\"field\\\", 1339);\\n\\t{\\n\\t\\tvar tmp = clone(map);\\n\\t\\tif(tmp.field != 1339) {\\n\\t\\t\\tfail(\\\"clone: tmp.field != 1339\\\");\\n\\t\\t}\\n\\t\\terase(tmp, \\\"field\\\");\\n\\t}\\n\\tif(map.field != 1339) {\\n\\t\\tfail(\\\"map.field != 1339\\\");\\n\\t}\\n\\terase(map, \\\"field\\\");\\n\\tif(map.field != null) {\\n\\t\\tfail(\\\"after erase: map.field != null\\\");\\n\\t}\\n\\t{\\n\\t\\tvar tmp = clone(map);\\n\\t\\tif(tmp.field != null) {\\n\\t\\t\\tfail(\\\"clone: tmp.field != null\\\");\\n\\t\\t}\\n\\t}\\n}\\n{\\n\\tvar map = {};\\n\\tmap[0] = true;\\n\\tmap[false] = true;\\n\\tmap[true] = true;\\n\\tmap[\\\"test\\\"] = true;\\n\\tmap[binary(\\\"bin123\\\")] = true;\\n\\tvar tmp0 = [];\\n\\tmap[tmp0] = true;\\n\\tvar tmp1 = {};\\n\\tmap[tmp1] = true;\\n\\t\\n\\tif(map[0] == null) {\\n\\t\\tfail(\\\"map[0] == null\\\");\\n\\t}\\n\\tif(map[false] == null) {\\n\\t\\tfail(\\\"map[false] == null\\\");\\n\\t}\\n\\tif(map[true] == null) {\\n\\t\\tfail(\\\"map[true] == null\\\");\\n\\t}\\n\\tif(map[\\\"test\\\"] == null) {\\n\\t\\tfail(\\\"map['test'] == null\\\");\\n\\t}\\n\\tif(map[binary(\\\"bin123\\\")] == null) {\\n\\t\\tfail(\\\"map[bin123] == null\\\");\\n\\t}\\n\\tif(map[tmp0] == null) {\\n\\t\\tfail(\\\"map[tmp0] == null\\\");\\n\\t}\\n\\tif(map[tmp1] == null) {\\n\\t\\tfail(\\\"map[tmp1] == null\\\");\\n\\t}\\n}\\n{\\n\\tvar test = {\\n\\t\\tfield: \\\"value\\\",\\n\\t\\t\\\"field1\\\": 123\\n\\t};\\n\\tif(test.field != \\\"value\\\") {\\n\\t\\tfail(\\\"test.field\\\");\\n\\t}\\n\\tif(test.field1 != 123) {\\n\\t\\tfail(\\\"test.field1\\\");\\n\\t}\\n\\tvar test2 = {};\\n\\ttest2.field = test.field;\\n\\tif(test2.field != test.field) {\\n\\t\\tfail(\\\"test2.field\\\");\\n\\t}\\n}\\n{\\n\\tvar test = null;\\n\\tif(test.field != null) {\\n\\t\\tfail(\\\"null.field != null\\\");\\n\\t}\\n}\\n{\\n\\tvar test = concat([1, 2], [3, 4], [5]);\\n\\tif(size(test) != 5) {\\n\\t\\tfail(\\\"concat: size(test) != 5\\\");\\n\\t}\\n\\tfor(var i = 0; i < 5; ++i) {\\n\\t\\tif(test[i] != i + 1) {\\n\\t\\t\\tfail(\\\"test[i] != i + 1\\\");\\n\\t\\t}\\n\\t}\\n}\\n{\\n\\tvar test = {\\n\\t\\tfield: {\\n\\t\\t\\tfield: 1337\\n\\t\\t}\\n\\t};\\n\\tvar test2 = test;\\n\\ttest = null;\\n\\tif(test2.field.field != 1337) {\\n\\t\\tfail(\\\"test2.field.field != 1337\\\");\\n\\t}\\n}\\n{\\n\\tvar test = 1;\\n\\tdelete(test);\\n\\ttest = 1;\\n\\tif(test != 1) {\\n\\t\\tfail(\\\"use after delete()\\\");\\n\\t}\\n}\\n{\\n\\tvar test = [1, 2, 3];\\n\\tpop(test);\\n\\tpush(test, 4);\\n\\tif(test[2] != 4) {\\n\\t\\tfail(\\\"test[2] != 4\\\");\\n\\t}\\n}\\n{\\n\\tvar test = [1, 2, 3];\\n\\tvar test2 = deref(test);\\n\\tif(size(test2) != 3) {\\n\\t\\tfail(\\\"size(test2) != 3\\\");\\n\\t}\\n\\tfor(var i = 0; i < size(test2); ++i) {\\n\\t\\tif(test2[i] != i + 1) {\\n\\t\\t\\tfail(\\\"test2[i] != i + 1\\\");\\n\\t\\t}\\n\\t}\\n\\tpop(test2);\\n\\tpop(test2);\\n\\tif(size(test) != 3) {\\n\\t\\tfail(\\\"size(test) != 3\\\");\\n\\t}\\n\\tfor(var i = 0; i < size(test); ++i) {\\n\\t\\tif(test[i] != i + 1) {\\n\\t\\t\\tfail(\\\"test[i] != i + 1\\\");\\n\\t\\t}\\n\\t}\\n}\\n{\\n\\tvar test = [null, true, false, 1, \\\"test\\\", [], {}];\\n\\tif(test[0] != null) {\\n\\t\\tfail(\\\"test[0] != null\\\");\\n\\t}\\n\\tif(test[1] != true) {\\n\\t\\tfail(\\\"test[1] != true\\\");\\n\\t}\\n\\tif(test[2] != false) {\\n\\t\\tfail(\\\"test[2] != false\\\");\\n\\t}\\n\\tif(test[3] != 1) {\\n\\t\\tfail(\\\"test[3] != 1\\\");\\n\\t}\\n\\tif(test[4] != \\\"test\\\") {\\n\\t\\tfail(\\\"test[4] != test\\\");\\n\\t}\\n}\\n{\\n\\tvar map = {};\\n\\tconst key = bech32(\\\"mmx1cxn9nan8xyw3zflxheaf2c2mrzgexzp33j9rwqmxw7ed3ut09wqsr06jmq\\\");\\n\\tmap[key] = 1337;\\n\\tif(map[key] != 1337) {\\n\\t\\tfail(\\\"map[key] != 1337 (key = bech32())\\\");\\n\\t}\\n}\\n{\\n\\tconst array = [1, 2, 3];\\n\\tconst tmp = array;\\n\\tpush(tmp, 4);\\n\\tif(array[3] != 4) {\\n\\t\\tfail(\\\"array[3] != 4\\\");\\n\\t}\\n}\\n{\\n\\tconst object = {\\\"foo\\\": {}};\\n\\tconst foo = object.foo;\\n\\tfoo.bar = true;\\n\\tif(object.foo.bar != true) {\\n\\t\\tfail(\\\"object.foo.bar != true\\\");\\n\\t}\\n}\\n{\\n\\tconst obj = {\\\"foo\\\": true};\\n\\tdelete(obj.foo);\\n\\tif(obj.foo != true) {\\n\\t\\tfail(\\\"delete(): obj.foo != true\\\");\\n\\t}\\n}\\n{\\n\\tvar map = {};\\n\\tif(map[bech32()] == 0) {\\n\\t\\tfail(\\\"map[bech32()] == 0\\\");\\n\\t}\\n}\\n{\\n\\tvar obj = {test: \\\"data\\\"};\\n\\tobj.ptr = obj;\\n\\tdelete(obj);\\n}\\n{\\n\\tconst A = {};\\n\\tconst B = {ptr: A};\\n\\tA.ptr = B;\\n}\\n{\\n\\tvar array = [1, 2, 3];\\n\\tpop(array);\\n\\tif(array[2] != null) {\\n\\t\\tfail(\\\"array[2] != null\\\");\\n\\t}\\n\\tif(array[1337] != null) {\\n\\t\\tfail(\\\"array[1337] != null\\\");\\n\\t}\\n}\\n\\n\\n\", \"compiler\": \"mmx-1.0.0\", \"build_flags\": {\"__type\": \"mmx.compile_flags_t\", \"verbose\": 0, \"opt_level\": 3, \"catch_overflow\": true}}\n"
  },
  {
    "path": "test/vm/compiler_tests.js",
    "content": "\nnull;\nassert(true);\nassert(true, \"test\");\nassert(1 == 1);\n\n{\n\tvar test;\n\tassert(test == null);\n}\n\nfunction test1(a, b = 1) {\n\treturn a + b;\n}\n\nassert(test1(1) == 2);\nassert(test1(1, 2) == 3);\n\nfunction no_return() {}\n\nassert(no_return() == null);\n\nfunction multi_return(v) {\n\tif(v < 10) {\n\t\treturn \"SMALL\";\n\t}\n\tif(v < 100) {\n\t\treturn \"MEDIUM\";\n\t}\n\treturn \"LARGE\";\n}\n\nassert(multi_return(0) == \"SMALL\");\nassert(multi_return(11) == \"MEDIUM\");\nassert(multi_return(111) == \"LARGE\");\n\nfunction return_array() {\n\treturn [1, 2, 3];\n}\n\nassert(return_array()[0] == 1);\nassert(return_array()[1] == 2);\nassert(return_array()[2] == 3);\n\nassert(concat(string(1), string(2), string(3)) == \"123\");\n\n{\n\tvar map = {};\n\tassert(map.test == null);\n}\n{\n\tvar map = {};\n\tmap.tmp = 123;\n\tassert(map.tmp == 123);\n}\n{\n\tvar map = {\"test\": 123};\n\tmap.test = 1234;\n\tassert(map.test == 1234);\n}\n{\n\tvar map = {\"test\": 123};\n\tconst tmp = map.test;\n\tassert(tmp == 123);\n\tmap.tmp = map.test;\n\tassert(map.tmp == 123);\n}\n\nassert(balance() == 0);\nassert(balance(sha256(\"test\")) == 0);\nassert(this.balance[bech32()] == 0);\n{\n\tvar tmp = balance();\n\tassert(tmp == 0);\n\ttmp = 1337;\n\tassert(balance() == 0);\n}\n{\n\tvar tmp = this.balance[bech32()];\n\tassert(tmp == 0);\n\ttmp = 1337;\n\tassert(balance(bech32()) == 0);\n}\n\n{\n\tvar array = [1, 2, 3];\n\tfor(var entry of array) {\n\t\tentry = 0;\n\t}\n\tfor(const entry of array) {\n\t\tassert(entry);\n\t}\n}\n{\n\tvar array = [\"1\", \"2\", \"3\"];\n\tfor(var entry of array) {\n\t\tentry = \"0\";\n\t}\n\tfor(const entry of array) {\n\t\tassert(entry != \"0\");\n\t}\n}\n{\n\tvar array = [[1], [2], [3]];\n\tfor(var entry of array) {\n\t\tentry = [];\n\t}\n\tfor(const entry of array) {\n\t\tassert(size(entry));\n\t}\n}\n{\n\tvar array = [{val: 1}, {val: 2}, {val: 3}];\n\tfor(var entry of array) {\n\t\tentry = {val: 0};\n\t}\n\tfor(const entry of array) {\n\t\tassert(entry.val);\n\t}\n}\n\n{\n\tvar obj = {key: \"value\"};\n\tassert(obj.key == \"value\");\n}\n{\n\tvar obj = {\"key\": \"value\"};\n\tassert(obj.key == \"value\");\n}\n{\n\tvar obj = {test: 123, key: \"value\"};\n\tassert(obj.key == \"value\");\n}\n{\n\tvar obj = { key : \"value\" };\n\tassert(obj.key == \"value\");\n}\n{\n\tvar obj = { \tkey\t\t : \t\"value\" };\n\tassert(obj.key == \"value\");\n}\n{\n\tvar obj = {_key_: \"value\"};\n\tassert(obj._key_ == \"value\");\n}\n\nassert(1337 / 16 == 83);\nassert(1337 % 16 == 9);\nassert(1337133713371337 / 1024 == 1305794641964);\nassert(1337133713371337 % 1024 == 201);\n\nif(false) {\n\tfail(\"if(false)\");\n}\nif(!true) {\n\tfail(\"if(!true)\");\n}\nif(1 == 2) {\n\tfail(\"if(1 == 2)\");\n}\nif(1 != 1) {\n\tfail(\"if(1 != 1)\");\n}\nif(2 < 1) {\n\tfail(\"if(2 < 1)\");\n}\nif(1 > 2) {\n\tfail(\"if(1 > 2)\");\n}\nif(2 <= 1) {\n\tfail(\"if(2 <= 1)\");\n}\nif(1 >= 2) {\n\tfail(\"if(1 >= 2)\");\n}\nif(!(1 == 1)) {\n\tfail(\"if(!(1 == 1))\");\n}\nif((1 == 1) && (1 == 0)) {\n\tfail(\"if((1 == 1) && (1 == 0))\");\n}\nif((1 != 1) || (1 != 1)) {\n\tfail(\"if((1 != 1) || (1 != 1))\");\n}\nif(0) {\n\tfail(\"if(0)\");\n}\nif(null) {\n\tfail(\"if(null)\");\n}\nif(\"\") {\n\tfail(\"if('')\");\n}\nif(!1337) {\n\tfail(\"if(!1337)\");\n}\nif(!\"test\") {\n\tfail(\"if(!'test')\");\n}\nif(!(true && 1337 && \"test\")) {\n\tfail(\"if(!(1 && true && 'test'))\");\n}\nif(0 || null || \"\") {\n\tfail(\"if(0 || null || '')\");\n}\nif(!(0 || null || 1)) {\n\tfail(\"if(!(null || null || 1))\");\n}\n{\n\tvar cond = (1 > 2);\n\tif(cond) {\n\t\tfail(\"if(cond)\");\n\t}\n}\n{\n\tconst cond = (1 > 2);\n\tif(cond) {\n\t\tfail(\"if(cond)\");\n\t}\n}\n{\n\tvar tmp = 1;\n\ttmp += 1;\n\tassert(tmp == 2);\n}\n{\n\tvar tmp = 1;\n\ttmp -= 1;\n\tassert(tmp == 0);\n}\n{\n\tvar tmp = 10;\n\ttmp *= 2;\n\tassert(tmp == 20);\n}\n{\n\tvar tmp = 10;\n\ttmp /= 2;\n\tassert(tmp == 5);\n}\n{\n\tvar tmp = 0;\n\ttmp ^= 0xFF;\n\tassert(tmp == 0xFF);\n}\n{\n\tvar tmp = 0xFF;\n\ttmp &= 0xFF;\n\tassert(tmp == 0xFF);\n}\n{\n\tvar tmp = 0;\n\ttmp |= 0xFF;\n\tassert(tmp == 0xFF);\n}\n{\n\tvar tmp = false;\n\ttmp ^^= true;\n\tassert(tmp == true);\n}\n{\n\tvar tmp = false;\n\ttmp &&= true;\n\tassert(tmp == false);\n}\n{\n\tvar tmp = false;\n\ttmp ||= true;\n\tassert(tmp == true);\n}\n{\n\tassert(is_uint(1337));\n\tassert(is_string(\"test\"));\n\tassert(is_binary(bech32()));\n\tassert(is_array([]));\n\tassert(is_map({}));\n}\n{\n\tassert(!is_uint(null));\n\tassert(!is_uint(true));\n\tassert(!is_uint(false));\n\tassert(!is_uint(\"test\"));\n\tassert(!is_string(null));\n\tassert(!is_string(true));\n\tassert(!is_string(false));\n\tassert(!is_string(1337));\n\tassert(!is_array(null));\n\tassert(!is_map(null));\n}\n{\n\twhile(false) {\n\t\tfail(\"while(false)\");\n\t}\n}\n{\n\tvar i = 0;\n\twhile(i < 10) {\n\t\ti++;\n\t}\n\tassert(i == 10);\n}\n{\n\tvar map = {};\n\tmap[0] = 0;\n\tmap[0] += 1;\n\tassert(map[0] == 1);\n}\n{\n\tvar map = {};\n\tmap[1] = 1;\n\tmap[1] -= 1;\n\tassert(map[1] == 0);\n}\n{\n\tvar N = 1;\n\tfor(var i = 0; i < N; ++i) {\n\t\tif(i < 10) {\n\t\t\tN++;\n\t\t}\n\t}\n\tassert(N == 11);\n}\n{\n\tvar N = 1;\n\tvar i = 0;\n\twhile(i < N) {\n\t\tif(i < 10) {\n\t\t\tN++;\n\t\t}\n\t\ti++;\n\t}\n\tassert(N == 11);\n}\n\n\n"
  },
  {
    "path": "test/vm/contract_tests.sh",
    "content": "#!/bin/bash\n\nset -e\n\nfor file in test/vm/test_*.js; do\n\techo \"Unit tests [$file]\"\n\t./build/tools/mmx_compile -e -f $file\n\techo \"Pass\"\ndone\n"
  },
  {
    "path": "test/vm/engine_tests.cpp",
    "content": "/*\n * engine_tests.cpp\n *\n *  Created on: May 21, 2022\n *      Author: mad\n */\n\n#include <mmx/vm/Engine.h>\n#include <mmx/vm/StorageDB.h>\n#include <mmx/vm/StorageRAM.h>\n#include <mmx/vm/StorageCache.h>\n#include <mmx/vm_interface.h>\n\n#include <vnx/vnx.h>\n#include <vnx/test/Test.h>\n\n#include <iostream>\n\nusing namespace mmx;\n\n\nvoid expect(const vm::var_t* got, const vm::var_t* want) {\n\tif(compare(got, want)) {\n\t\tthrow std::logic_error(\"expected \" + to_string(want) + \" but got \" + to_string(got));\n\t}\n}\n\nvoid expect(const vm::var_t* got, const vm::var_t& want) {\n\texpect(got, &want);\n}\n\nvoid expect(const vm::var_t* got, vm::varptr_t want) {\n\texpect(got, want.get());\n}\n\nvoid test_serialize(vm::varptr_t var, bool with_rc, bool with_vf)\n{\n\tconst auto data = serialize(*var.get(), with_rc, with_vf);\n\tstd::unique_ptr<vm::var_t> res;\n\tauto size = deserialize(res, data.first.get(), data.second, with_rc, with_vf);\n\tvnx::test::expect(size, data.second);\n\tvnx::test::expect(compare(res.get(), var.get()), 0);\n\tif(with_rc) {\n\t\tvnx::test::expect(res->ref_count, var->ref_count);\n\t}\n\tif(with_vf) {\n\t\tvnx::test::expect(res->flags, var->flags);\n\t}\n}\n\nvoid test_serialize(vm::varptr_t var) {\n\ttest_serialize(var, true, true);\n\ttest_serialize(var, false, true);\n\ttest_serialize(var, true, false);\n\ttest_serialize(var, false, false);\n}\n\nvoid test_compare(vm::varptr_t var) {\n\tvnx::test::expect(var == var, true);\n\tvnx::test::expect(var != var, false);\n\tvnx::test::expect(var < var, false);\n\tvnx::test::expect(var > var, false);\n\n\tvm::varptr_t null;\n\tvnx::test::expect(var == null, var.get() == nullptr);\n\tvnx::test::expect(var < null, false);\n\tvnx::test::expect(var > null, var.get() != nullptr);\n}\n\nvoid test_clone(vm::varptr_t var) {\n\tconst auto res = clone(var.get());\n\tvnx::test::expect(compare(res.get(), var.get()), 0);\n}\n\n\nint main(int argc, char** argv)\n{\n\tvnx::test::init(\"mmx.vm.engine\");\n\n\tVNX_TEST_BEGIN(\"serialize\")\n\t{\n\t\ttest_serialize(std::make_unique<vm::var_t>());\n\t\ttest_serialize(std::make_unique<vm::var_t>(true));\n\t\ttest_serialize(std::make_unique<vm::var_t>(false));\n\t\ttest_serialize(std::make_unique<vm::ref_t>(uint64_t(-1)));\n\t\ttest_serialize(std::make_unique<vm::uint_t>());\n\t\ttest_serialize(std::make_unique<vm::uint_t>(uint64_t(1) << 8));\n\t\ttest_serialize(std::make_unique<vm::uint_t>(uint64_t(1) << 16));\n\t\ttest_serialize(std::make_unique<vm::uint_t>(uint64_t(1) << 32));\n\t\ttest_serialize(std::make_unique<vm::uint_t>(uint128_t(1) << 64));\n\t\ttest_serialize(std::make_unique<vm::uint_t>(uint256_t(1) << 128));\n\t\ttest_serialize(std::make_unique<vm::uint_t>(uint256_max));\n\t\ttest_serialize(vm::binary_t::alloc(\"test\"));\n\t\ttest_serialize(vm::binary_t::alloc(10, vm::TYPE_BINARY));\n\t\ttest_serialize(std::make_unique<vm::array_t>(-1));\n\t\ttest_serialize(std::make_unique<vm::map_t>());\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"clone\")\n\t{\n\t\ttest_clone(nullptr);\n\t\ttest_clone(std::make_unique<vm::var_t>());\n\t\ttest_clone(std::make_unique<vm::var_t>(true));\n\t\ttest_clone(std::make_unique<vm::var_t>(false));\n\t\ttest_clone(std::make_unique<vm::ref_t>(uint64_t(-1)));\n\t\ttest_clone(std::make_unique<vm::uint_t>(uint256_max));\n\t\ttest_clone(vm::binary_t::alloc(\"test\"));\n\t\ttest_clone(vm::binary_t::alloc(10, vm::TYPE_BINARY));\n\t\ttest_clone(std::make_unique<vm::array_t>(-1));\n\t\ttest_clone(std::make_unique<vm::map_t>());\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"compare_func\")\n\t{\n\t\ttest_compare(std::make_unique<vm::var_t>());\n\t\ttest_compare(std::make_unique<vm::var_t>(true));\n\t\ttest_compare(std::make_unique<vm::var_t>(false));\n\t\ttest_compare(std::make_unique<vm::ref_t>(0));\n\t\ttest_compare(std::make_unique<vm::uint_t>());\n\t\ttest_compare(std::make_unique<vm::uint_t>(uint256_max));\n\t\ttest_compare(vm::binary_t::alloc(\"test\"));\n\t\ttest_compare(vm::binary_t::alloc(10, vm::TYPE_BINARY));\n\t\ttest_compare(std::make_unique<vm::array_t>());\n\t\ttest_compare(std::make_unique<vm::map_t>());\n\t\tvnx::test::expect(compare(vm::var_t(), vm::var_t(false)), -1);\n\t\tvnx::test::expect(compare(vm::var_t(false), vm::var_t(true)), -1);\n\t\tvnx::test::expect(compare(vm::ref_t(0), vm::ref_t(1)), -1);\n\t\tvnx::test::expect(compare(vm::ref_t(1), vm::ref_t(1)), 0);\n\t\tvnx::test::expect(compare(vm::uint_t(), vm::uint_t(1)), -1);\n\t\tvnx::test::expect(compare(vm::uint_t(1), vm::uint_t(1)), 0);\n\t\tvnx::test::expect(vm::varptr_t(vm::binary_t::alloc(\"\")) < vm::varptr_t(vm::binary_t::alloc(\"test\")), true);\n\t\tvnx::test::expect(vm::varptr_t(vm::binary_t::alloc(\"test\")) == vm::varptr_t(vm::binary_t::alloc(\"test\")), true);\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"stuff\")\n\t{\n\t\tvnx::test::expect(vm::to_binary(hash_t(\"\"))->to_hash(), hash_t(\"\"));\n\t\t{\n\t\t\tauto var = vm::binary_t::alloc(\"test\");\n\t\t\tvar = vm::binary_t::alloc(\"test1\");\n\t\t\tvnx::test::expect(var->to_string(), std::string(\"test1\"));\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tauto backend = std::make_shared<vm::StorageRAM>();\n\tauto storage = std::make_shared<vm::StorageCache>(backend);\n\tauto engine = std::make_shared<vm::Engine>(addr_t(), storage, false);\n\tengine->gas_limit = 1000000;\n\n\tVNX_TEST_BEGIN(\"setup\")\n\t{\n\t\tvm::assign(engine, vm::MEM_STATIC + 1, vnx::Variant());\n\t\tvm::assign(engine, vm::MEM_STATIC + 2, vnx::Variant(true));\n\t\tvm::assign(engine, vm::MEM_STATIC + 3, vnx::Variant(false));\n\t\tvm::assign(engine, vm::MEM_STATIC + 4, vnx::Variant(1337));\n\t\tvm::assign(engine, vm::MEM_STATIC + 5, vnx::Variant(\"test\"));\n\t\tvm::assign(engine, vm::MEM_STATIC + 6, vnx::Variant(std::vector<uint8_t>{1, 2, 3, 4}));\n\t\tvm::assign(engine, vm::MEM_STATIC + 7, vnx::Variant(hash_t(\"test\")));\n\t\tvm::assign(engine, vm::MEM_STATIC + 8, vnx::Variant(addr_t(\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\")));\n\t\tvm::assign(engine, vm::MEM_STATIC + 9, vnx::Variant(std::vector<int64_t>{11, 12, 13, 14}));\n\t\t{\n\t\t\tvnx::Object tmp;\n\t\t\ttmp[\"field\"] = 123;\n\t\t\ttmp[\"field1\"] = \"test\";\n\t\t\ttmp[\"field2\"] = std::vector<uint32_t>{11, 12, 13, 14};\n\t\t\tvm::assign(engine, vm::MEM_STATIC + 10, vnx::Variant(tmp));\n\t\t}\n\t\tengine->write(vm::MEM_STATIC + 11, vm::uint_t(-1));\n\t\tvm::assign(engine, vm::MEM_STATIC + 12, vnx::Variant(uint8_t(137)));\n\t\tvm::assign(engine, vm::MEM_STATIC + 13, vnx::Variant(uint16_t(1337)));\n\t\tvm::assign(engine, vm::MEM_STATIC + 14, vnx::Variant(int8_t(127)));\n\t\tvm::assign(engine, vm::MEM_STATIC + 15, vnx::Variant(int16_t(1337)));\n\t\t{\n\t\t\tengine->assign(vm::MEM_STATIC + 16, std::make_unique<vm::map_t>());\n\t\t\tengine->write_key(vm::MEM_STATIC + 16, vm::uint_t(88), vm::uint_t(99));\n\t\t\tengine->write_key(vm::MEM_STATIC + 16, vm::uint_t(888), vm::uint_t(999));\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"parse_memo\")\n\t{\n\t\t{\n\t\t\tauto memo = engine->parse_memo(vm::MEM_STATIC + 1);\n\t\t\tvnx::test::expect(bool(memo), false);\n\t\t}\n\t\t{\n\t\t\tauto memo = engine->parse_memo(vm::MEM_STATIC + 5);\n\t\t\tvnx::test::expect(bool(memo), true);\n\t\t\tvnx::test::expect(*memo, \"test\");\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tconst auto check_func_1 = [](std::shared_ptr<vm::Engine> engine, const uint64_t offset)\n\t{\n\t\texpect(engine->read(offset + 1), vm::var_t());\n\t\texpect(engine->read(offset + 2), vm::var_t(true));\n\t\texpect(engine->read(offset + 3), vm::var_t(false));\n\t\texpect(engine->read(offset + 4), vm::uint_t(1337));\n\t\texpect(engine->read(offset + 5), vm::to_binary(\"test\"));\n\t\texpect(engine->read(offset + 6), vm::to_binary(bytes_t<4>(std::vector<uint8_t>{1, 2, 3, 4})));\n\t\texpect(engine->read(offset + 7), vm::to_binary(hash_t(\"test\")));\n\t\texpect(engine->read(offset + 8), vm::to_binary(addr_t(\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\")));\n\t\t{\n\t\t\tconst auto& ref = engine->read_fail<vm::ref_t>(offset + 9, vm::TYPE_REF);\n\t\t\tconst auto& var = engine->read_fail<vm::array_t>(ref.address, vm::TYPE_ARRAY);\n\t\t\tvnx::test::expect(var.size, 4u);\n\t\t\tvnx::test::expect(var.address, ref.address);\n\t\t\tfor(size_t i = 0; i < 4; ++i) {\n\t\t\t\texpect(engine->read_entry(ref.address, i), vm::uint_t(i + 11));\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tconst auto& ref = engine->read_fail<vm::ref_t>(offset + 10, vm::TYPE_REF);\n\t\t\tconst auto& var = engine->read_fail<vm::map_t>(ref.address, vm::TYPE_MAP);\n\t\t\tvnx::test::expect(var.address, ref.address);\n\t\t\texpect(engine->read_key(ref.address, vm::to_binary(\"field\")), vm::uint_t(123));\n\t\t\texpect(engine->read_key(ref.address, vm::to_binary(\"field1\")), vm::to_binary(\"test\"));\n\t\t\t{\n\t\t\t\tconst auto& ref2 = engine->read_key_fail<vm::ref_t>(ref.address,\n\t\t\t\t\t\tengine->lookup(vm::to_binary(\"field2\"), true), vm::TYPE_REF);\n\t\t\t\tconst auto& var = engine->read_fail<vm::array_t>(ref2.address, vm::TYPE_ARRAY);\n\t\t\t\tvnx::test::expect(var.size, 4u);\n\t\t\t\tfor(size_t i = 0; i < 4; ++i) {\n\t\t\t\t\texpect(engine->read_entry(ref2.address, i), vm::uint_t(i + 11));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\texpect(engine->read(offset + 11), vm::uint_t(-1));\n\t\texpect(engine->read(offset + 12), vm::uint_t(137));\n\t\texpect(engine->read(offset + 13), vm::uint_t(1337));\n\t\texpect(engine->read(offset + 14), vm::uint_t(127));\n\t\texpect(engine->read(offset + 15), vm::uint_t(1337));\n\t};\n\n\tVNX_TEST_BEGIN(\"copy\")\n\t{\n\t\tauto engine1 = std::make_shared<vm::Engine>(hash_t(\"copy:1\"), storage, false);\n\t\tengine1->gas_limit = 1000000;\n\t\tfor(size_t i = 1; i <= 16; ++i) {\n\t\t\tvm::copy(engine1, engine, vm::MEM_STACK + i, vm::MEM_STATIC + i);\n\t\t}\n\t\tcheck_func_1(engine1, vm::MEM_STACK);\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"data_recursion\")\n\t{\n\t\tauto engine1 = std::make_shared<vm::Engine>(hash_t(\"data_recursion:1\"), storage, false);\n\t\tengine1->gas_limit = 10000000;\n\n\t\tconst auto addr = engine1->alloc();\n\t\tengine1->write(addr, vm::map_t());\n\t\tengine1->write(vm::MEM_STATIC + 1, vm::ref_t(addr));\n\t\tengine1->write_key(addr, vm::uint_t(0), vm::ref_t(addr));\n\n\t\tauto engine2 = std::make_shared<vm::Engine>(hash_t(\"data_recursion:2\"), storage, false);\n\t\tengine2->gas_limit = 10000000;\n\n\t\tbool failed = false;\n\t\ttry {\n\t\t\tvm::copy(engine2, engine1, vm::MEM_STACK + 1, vm::MEM_STATIC + 1);\n\t\t} catch(...) {\n\t\t\tfailed = true;\n\t\t}\n\t\tif(!failed) {\n\t\t\tthrow std::logic_error(\"expected vm::copy() to fail\");\n\t\t}\n\t\tengine1->commit();\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"convert\")\n\t{\n\t\tvnx::test::expect(vm::read(engine, vm::MEM_STATIC + 1).is_null(), true);\n\t\tvnx::test::expect(vm::read(engine, vm::MEM_STATIC + 2).to<bool>(), true);\n\t\tvnx::test::expect(vm::read(engine, vm::MEM_STATIC + 3).to<bool>(), false);\n\t\tvnx::test::expect(vm::read(engine, vm::MEM_STATIC + 4).to<int64_t>(), 1337);\n\t\tvnx::test::expect(vm::read(engine, vm::MEM_STATIC + 5).to<std::string>(), \"test\");\n\t\tvnx::test::expect(vm::read(engine, vm::MEM_STATIC + 6).to<std::vector<uint8_t>>(), std::vector<uint8_t>{1, 2, 3, 4});\n\t\tvnx::test::expect(vm::read(engine, vm::MEM_STATIC + 7).to<hash_t>(), hash_t(\"test\"));\n\t\tvnx::test::expect(vm::read(engine, vm::MEM_STATIC + 8).to<addr_t>(), addr_t(\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\"));\n\t\tvnx::test::expect(vm::read(engine, vm::MEM_STATIC + 9).to<std::vector<int64_t>>(), std::vector<int64_t>{11, 12, 13, 14});\n\t\t{\n\t\t\tconst auto var = vm::read(engine, vm::MEM_STATIC + 10);\n\t\t\tvnx::test::expect(var.is_object(), true);\n\t\t\tconst auto value = var.to_object();\n\t\t\tvnx::test::expect(value[\"field\"].to<uint64_t>(), 123u);\n\t\t\tvnx::test::expect(value[\"field1\"].to<std::string>(), \"test\");\n\t\t\tvnx::test::expect(value[\"field2\"].to<std::vector<uint32_t>>(), std::vector<uint32_t>{11, 12, 13, 14});\n\t\t}\n\t\tvnx::test::expect(vm::read(engine, vm::MEM_STATIC + 11).to<std::string>(), \"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n\t\t{\n\t\t\tauto value = vm::read(engine, vm::MEM_STATIC + 16).to<std::map<uint64_t, uint64_t>>();\n\t\t\tvnx::test::expect(value[88], 99u);\n\t\t\tvnx::test::expect(value[888], 999u);\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"log_event\")\n\t{\n\t\tengine->log_func = [](uint32_t level, const std::string& msg) {\n\t\t\tvnx::test::expect(level, 1337u);\n\t\t\tvnx::test::expect(msg, \"test\");\n\t\t};\n\t\tengine->event_func = [&engine](const std::string& name, const uint64_t data) {\n\t\t\tvnx::test::expect(name, \"test\");\n\t\t\texpect(engine->read(data), vm::to_binary(hash_t(\"test\")));\n\t\t};\n\t\tengine->code.emplace_back(vm::OP_LOG, vm::OPFLAG_REF_A, vm::MEM_STATIC + 4, vm::MEM_STATIC + 5);\n\t\tengine->code.emplace_back(vm::OP_EVENT, 0, vm::MEM_STATIC + 5, vm::MEM_STATIC + 7);\n\t\tengine->code.emplace_back(vm::OP_RET);\n\t\tengine->init();\n\t\tengine->begin(0);\n\t\tengine->run();\n\t}\n\tVNX_TEST_END()\n\n\tengine->commit();\n\tstorage->commit();\n\n\tVNX_TEST_BEGIN(\"assign\")\n\t{\n\t\tauto engine = std::make_shared<vm::Engine>(addr_t(), backend, true);\n\t\tengine->gas_limit = 1000000;\n\t\tcheck_func_1(engine, vm::MEM_STATIC);\n\t}\n\tVNX_TEST_END()\n\n\treturn vnx::test::done();\n}\n\n\n\n\n\n\n"
  },
  {
    "path": "test/vm/engine_tests.js",
    "content": "\n{}\n\n{\n}\n\nif(false) {\n\tfail(\"false\");\n}\nif(!true) {\n\tfail(\"!\");\n}\nif(!(!false)) {\n\tfail(\"!!\");\n}\nif(true && false) {\n\tfail(\"true && false\");\n}\nif(false && true) {\n\tfail(\"false && true\");\n}\nif(!(true || false)) {\n\tfail(\"true || false\");\n}\nif(!(false || true)) {\n\tfail(\"false || true\");\n}\nif(!(true && true)) {\n\tfail(\"true && true\");\n}\nif(!(true || true)) {\n\tfail(\"true && true\");\n}\nif(false || false) {\n\tfail(\"false || false\");\n}\nif(false && false) {\n\tfail(\"false && false\");\n}\nif(false ^^ false) {\n\tfail(\"false ^ false\");\n}\nif(true ^^ true) {\n\tfail(\"true ^ true\");\n}\nif(!(false ^^ true)) {\n\tfail(\"false ^ true\");\n}\nif(!(true ^^ false)) {\n\tfail(\"false ^ true\");\n}\nif(true) {\n\t// pass\n} else {\n\tfail(\"else\");\n}\nif(false) {\n\tfail(\"else-if\");\n} else if(false) {\n\tfail(\"else-if\");\n} else if(false) {\n\tfail(\"else-if\");\n} else {\n\t// pass\n}\n\nif(null != null) {\n\tfail(\"null != null\");\n}\nif(null == 0) {\n\tfail(\"null == 0\");\n}\nif(null == false) {\n\tfail(\"null == false\");\n}\nif(null == true) {\n\tfail(\"null == true\");\n}\nif(null == \"\") {\n\tfail(\"null == ''\");\n}\nif(!(null == null)) {\n\tfail(\"!(null == null)\");\n}\nif(!(null != 0)) {\n\tfail(\"!(null != 0)\");\n}\nif(!(null != false)) {\n\tfail(\"!(null != false)\");\n}\nif(!(null != true)) {\n\tfail(\"!(null != true)\");\n}\nif(!(null != \"\")) {\n\tfail(\"!(null != '')\");\n}\n\nif(!(1 > 0)) {\n\tfail(\"1 > 0\");\n}\nif(!(1 >= 0)) {\n\tfail(\"1 >= 0\");\n}\nif(!(1 >= 1)) {\n\tfail(\"1 >= 1\");\n}\nif(!(0 < 1)) {\n\tfail(\"0 < 1\");\n}\nif(!(0 <= 1)) {\n\tfail(\"0 <= 1\");\n}\nif(!(1 <= 1)) {\n\tfail(\"1 <= 1\");\n}\n\nif((1 >> 0) != 1) {\n\tfail(\"1 >> 0\");\n}\nif((2 >> 1) != 1) {\n\tfail(\"2 >> 1\");\n}\nif((1 << 0) != 1) {\n\tfail(\"1 << 0\");\n}\nif((1 << 1) != 2) {\n\tfail(\"1 << 1\");\n}\n\nif(1 + 1 != 2) {\n\tfail(\"add\", 1);\n}\nif(1 - 1 != 0) {\n\tfail(\"sub\", 1);\n}\n\nif(1 * 1 != 1) {\n\tfail(\"mul\", 1);\n}\nif(1337 * 1337 != 1787569) {\n\tfail(\"mul\", 2);\n}\nif(18446744073709551615 * 18446744073709551615 != 340282366920938463426481119284349108225) {\n\tfail(\"mul\", 3);\n}\nif(340282366920938463463374607431768211455 * 340282366920938463463374607431768211455 != 115792089237316195423570985008687907852589419931798687112530834793049593217025) {\n\tfail(\"mul\", 4);\n}\nif(86605900701059233675071791330357447908204924955602516110289890806217748420 * 1337 != 115792089237316195423570985008687907853269984665640564039457584007913129637540) {\n\tfail(\"mul\", 5);\n}\n\nif(3 / 2 != 1) {\n\tfail(\"div\", 1);\n}\nif(13371337 / 1337 != 10001) {\n\tfail(\"div\", 2);\n}\nif(340282366920938463463374607431768211455 / 1337 != 254511867554927796158096191048442940) {\n\tfail(\"div\", 3);\n}\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 / 1337 != 86605900701059233675071791330357447908204924955602516110289890806217748421) {\n\tfail(\"div\", 4);\n}\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 / 340282366920938463463374607431768211455 != 340282366920938463463374607431768211457) {\n\tfail(\"div\", 5);\n}\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 / 86605900701059233675071791330357447908204924955602516110289890806217748420 != 1337) {\n\tfail(\"div\", 6);\n}\nif((3 >> 0) != 3) {\n\tfail(\"3 >> 0\");\n}\nif(3 / 1 != 3) {\n\tfail(concat(\"div 3 / 1 => \", string(3 / 1)));\n}\nif(13371337 / 1024 != 13057) {\n\tfail(\"div 13371337 / 1024\");\n}\nfor(var i = 1; i < 100; ++i) {\n\tif((11 * i) / i != 11) {\n\t\tfail(concat(\"div (11 * i) / i: \", string(i)));\n\t}\n}\n\nif(3 % 2 != 1) {\n\tfail(\"mod\", 1);\n}\nif(13371337 % 1337 != 0) {\n\tfail(\"mod\", 2);\n}\nif(340282366920938463463374607431768211455 % 1337 != 675) {\n\tfail(\"mod\", 3);\n}\nif(115792089237316195423570985008687907853269984665640564039457584007913129639935 % 1337 != 1058) {\n\tfail(\"mod\", 4);\n}\nif(3 % 1 != 0) {\n\tfail(\"mod 3 % 1\");\n}\nif(13371337 % 1024 != 969) {\n\tfail(\"mod 13371337 % 1024\");\n}\nfor(var i = 1; i < 100; ++i) {\n\tif((11 * i) % i != 0) {\n\t\tfail(concat(\"mod (11 * i) % i: \", string(i)));\n\t}\n}\n\nif((0xFF00FF ^ 0xFF00FF) != 0) {\n\tfail(\"xor\", 1);\n}\nif((0xFF00FF & 0xFFFFFF) != 0xFF00FF) {\n\tfail(\"and\", 1);\n}\nif((0xFF00FF | 0) != 0xFF00FF) {\n\tfail(\"or\", 1);\n}\nif((~0xFF00FF & 0xFFFFFF) != 0x00FF00) {\n\tfail(\"not\", 1);\n}\n\n{\n\tvar res = 0;\n\tfor(var i = 0; i < 10; ++i) {\n\t\tres += 2;\n\t}\n\tif(res != 20) {\n\t\tfail(\"for\", 1);\n\t}\n}\n{\n\tvar res = 0;\n\tfor(var i of [1, 2, 3]) {\n\t\tres += i;\n\t}\n\tif(res != 6) {\n\t\tfail(\"for\", 2);\n\t}\n}\n\nif(0x100 != 256) {\n\tfail(\"hex\", 1);\n}\nif(0b100 != 4) {\n\tfail(\"bin\", 1);\n}\nif(uint(\"\") != 0) {\n\tfail(\"uint('')\");\n}\nif(uint(\"0b01011101010001\") != 0b01011101010001) {\n\tfail(\"uint(bin)\", 1);\n}\nif(uint(111) != 111) {\n\tfail(\"uint(dec)\", 1);\n}\nif(uint(\"111820312618873087563030836565815045174850059154595088905299609727287843170569\") != 111820312618873087563030836565815045174850059154595088905299609727287843170569) {\n\tfail(\"uint(dec)\", 2);\n}\nif(uint(\"0x0123456789ABCDEF\") != 0x0123456789ABCDEF) {\n\tfail(\"uint(hex)\", 1);\n}\nif(uint(\"0x0123456789abcdef\") != 0x0123456789abcdef) {\n\tfail(\"uint(hex)\", 2);\n}\nif(uint(\"0x09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7\") != 0x09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7) {\n\tfail(\"uint(hex)\", 3);\n}\nif(uint(\"0b1001\") != 9) {\n\tfail(\"uint(bin)\", 1);\n}\nif(bech32(\"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\") != binary_hex(\"0000000000000000000000000000000000000000000000000000000000000000\")) {\n\tfail(\"bech32\", 1);\n}\nif(bech32(\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\") != binary_hex(\"09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7\")) {\n\tfail(\"bech32\", 2);\n}\nif(string_bech32(binary_hex(\"09292D77A8DF8E790D467F458B29591C1AFB11F0676CC7ABBB778C60D90D38F7\")) != \"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\") {\n\tfail(\"bech32\", 3);\n}\nif(bech32(\"MMX\") != bech32()) {\n\tfail(\"bech32\", 4);\n}\nif(bech32() != binary_hex(\"0000000000000000000000000000000000000000000000000000000000000000\")) {\n\tfail(\"bech32\", 5);\n}\nif(bech32(null) != bech32()) {\n\tfail(\"bech32\", 6);\n}\nif(string(1337) != \"1337\") {\n\tfail(\"string(1337)\");\n}\nif(string(18446744073709551615) != \"18446744073709551615\") {\n\tfail(\"string(18446744073709551615)\");\n}\nif(string(340282366920938463463374607431768211455) != \"340282366920938463463374607431768211455\") {\n\tfail(\"string(340282366920938463463374607431768211455)\");\n}\nif(string_hex(0x01234567ABCDE) != \"1234567abcde\") {\n\tfail(\"string_hex(0x01234567ABCDE)\");\n}\nif(string_hex(0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855) != \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\") {\n\tfail(\"string_hex(0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855)\");\n}\nif(string_bech32(bech32(\"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\")) != \"mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf\") {\n\tfail(\"string_bech32(mmx17uuqmktq33mmh278d3nlqy0mrgw9j2vtg4l5vrte3m06saed9yys2q5hrf)\");\n}\nif(string(binary(\"ABCDEF\")) != \"ABCDEF\") {\n\tfail(\"binary(ABCDEF)\");\n}\nif(string_hex(binary(\"AB\")) != \"4142\") {\n\tfail(\"binary(AB)\");\n}\nif(string_hex(binary_hex(\"0123456789ABCDEF\")) != \"0123456789ABCDEF\") {\n\tfail(\"binary_hex(0123456789ABCDEF)\");\n}\nif(string_hex(binary_hex(\"0x0123456789ABCDEF\")) != \"0123456789ABCDEF\") {\n\tfail(\"binary_hex(0x0123456789ABCDEF)\");\n}\nif(concat(\"A\", \"BC\", \"D\") != \"ABCD\") {\n\tfail(\"concat()\", 1);\n}\nif(memcpy(\"ABC\", 1) != \"A\") {\n\tfail(concat(\"memcpy(ABC, 1): '\", memcpy(\"ABC\", 1), \"'\"));\n}\nif(memcpy(\"ABC\", 2, 1) != \"BC\") {\n\tfail(\"memcpy(ABC, 2, 1)\");\n}\nif(sha256(\"\") != binary_hex(\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\")) {\n\tfail(\"sha256()\", 1);\n}\nif(sha256(\"abc\") != binary_hex(\"ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad\")) {\n\tfail(\"sha256()\", 2);\n}\nif(ecdsa_verify(\n\t\tbinary_hex(\"F3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964A\"),\n\t\tbinary_hex(\"02054191D5103F7A04B2E5B53AF253A6476F11DDCDB3B4134D74CFD642969B082E\"),\n\t\tbinary_hex(\"C05F13C85BDDFBB0A198697FAAC6973AA008AA45544FB7AB586B636405F73F215237D508C6FAE90C24BE424584640F824864B6FF3F2B99FB2104BBD5743E8E39\")) != true)\n{\n\tfail(\"ecdsa_verify\", 1);\n}\nif(ecdsa_verify(\n\t\tbinary_hex(\"A3D6C7817001F48946270CD00CE1EA2105F470F65DA66C1FBCAADE3E7CAB964A\"),\n\t\tbinary_hex(\"02054191D5103F7A04B2E5B53AF253A6476F11DDCDB3B4134D74CFD642969B082E\"),\n\t\tbinary_hex(\"C05F13C85BDDFBB0A198697FAAC6973AA008AA45544FB7AB586B636405F73F215237D508C6FAE90C24BE424584640F824864B6FF3F2B99FB2104BBD5743E8E39\")) != false)\n{\n\tfail(\"ecdsa_verify\", 2);\n}\nif(size(\"123\") != 3) {\n\tfail(\"size('123')\");\n}\nif(size(binary(\"123\")) != 3) {\n\tfail(\"size(binary('123'))\");\n}\nif(min(1, 2, 3) != 1) {\n\tfail(\"min()\");\n}\nif(max(1, 2, 3) != 3) {\n\tfail(\"max()\");\n}\nif(typeof(null) != 0) {\n\tfail(\"typeof(null)\");\n}\nif(typeof(false) != 1) {\n\tfail(\"typeof(false)\");\n}\nif(typeof(true) != 2) {\n\tfail(\"typeof(true)\");\n}\nif(typeof(1) != 4) {\n\tfail(\"typeof(1)\");\n}\nif(typeof(\"\") != 5) {\n\tfail(\"typeof('')\");\n}\nif(typeof(binary(\"\")) != 6) {\n\tfail(\"typeof(binary)\");\n}\nif(typeof([]) != 7) {\n\tfail(\"typeof([])\");\n}\nif(typeof({}) != 8) {\n\tfail(\"typeof({})\");\n}\nif(deref(clone(1)) != 1) {\n\tfail(\"deref(clone(1)) != 1\");\n}\nif(bool(null) != false) {\n\tfail(\"bool(null)\");\n}\nif(bool(false) != false) {\n\tfail(\"bool(false)\");\n}\nif(bool(true) != true) {\n\tfail(\"bool(true)\");\n}\nif(bool(0) != false) {\n\tfail(\"bool(0)\");\n}\nif(bool(10) != true) {\n\tfail(\"bool(10)\");\n}\nif(bool(\"\") != false) {\n\tfail(\"bool('')\");\n}\nif(bool(\"0\") != true) {\n\tfail(\"bool('0')\");\n}\nif(bool(binary(\"\")) != false) {\n\tfail(\"bool(binary(''))\");\n}\nif(bool(binary(\"0\")) != true) {\n\tfail(\"bool(binary('0')\");\n}\nif(bool([]) != true) {\n\tfail(\"bool([])\");\n}\nif(bool({}) != true) {\n\tfail(\"bool({})\");\n}\nif(uint(null) != 0) {\n\tfail(\"uint(null)\");\n}\nif(uint(false) != 0) {\n\tfail(\"uint(false)\");\n}\nif(uint(true) != 1) {\n\tfail(\"uint(true)\");\n}\nif(uint_hex(\"aabbc\") != 0xaabbc) {\n\tfail(\"uint_hex('aabbc')\");\n}\nif(uint(binary(0xABCDEF0)) != 0xABCDEF0) {\n\tfail(\"uint(binary(0xABCDEF0))\");\n}\nif(uint(binary(binary(0xABCDEF0))) != 0xABCDEF0) {\n\tfail(\"uint(binary(binary(0xABCDEF0)))\");\n}\nif(uint_le(binary_le(0xABCDEF0)) != 0xABCDEF0) {\n\tfail(\"uint_le(binary_le(0xABCDEF0))\");\n}\nif(bech32(binary(bech32(\"MMX\"))) != bech32(\"MMX\")) {\n\tfail(\"bech32(binary(bech32(MMX)))\");\n}\nif([] == []) {\n\tfail(\"[] == []\");\n}\nif({} == {}) {\n\tfail(\"[] == []\");\n}\nif(string(\"test\") != \"test\") {\n\tfail(\"string(test)\");\n}\n\n__nop();\n\n{\n\tvar array = [];\n\tif(size(array) != 0) {\n\t\tfail(\"size(array) != 0\");\n\t}\n\tpush(array, 11);\n\tif(array[0] != 11) {\n\t\tfail(\"array[0] != 11\");\n\t}\n\tif(size(array) != 1) {\n\t\tfail(\"size(array) != 1\");\n\t}\n\tarray[0] = 12;\n\t{\n\t\tvar tmp = clone(array);\n\t\tif(tmp[0] != 12) {\n\t\t\tfail(\"clone: array[0] != 12\");\n\t\t}\n\t\tpop(tmp);\n\t}\n\tif(pop(array) != 12) {\n\t\tfail(\"pop(array) != 12\");\n\t}\n\tif(size(array) != 0) {\n\t\tfail(\"size(array) != 0\");\n\t}\n\tif(array[35345345345] != null) {\n\t\tfail(\"array[35345345345] != null\");\n\t}\n}\n{\n\tvar map = {};\n\tif(map.field != null) {\n\t\tfail(\"map.field != null\");\n\t}\n\tmap.field = 1337;\n\tif(get(map, \"field\") != 1337) {\n\t\tfail(\"map.field != 1337\");\n\t}\n\tmap.field++;\n\tif(map.field != 1338) {\n\t\tfail(\"map.field != 1338\");\n\t}\n\tset(map, \"field\", 1339);\n\t{\n\t\tvar tmp = clone(map);\n\t\tif(tmp.field != 1339) {\n\t\t\tfail(\"clone: tmp.field != 1339\");\n\t\t}\n\t\terase(tmp, \"field\");\n\t}\n\tif(map.field != 1339) {\n\t\tfail(\"map.field != 1339\");\n\t}\n\terase(map, \"field\");\n\tif(map.field != null) {\n\t\tfail(\"after erase: map.field != null\");\n\t}\n\t{\n\t\tvar tmp = clone(map);\n\t\tif(tmp.field != null) {\n\t\t\tfail(\"clone: tmp.field != null\");\n\t\t}\n\t}\n}\n{\n\tvar map = {};\n\tmap[0] = true;\n\tmap[false] = true;\n\tmap[true] = true;\n\tmap[\"test\"] = true;\n\tmap[binary(\"bin123\")] = true;\n\tvar tmp0 = [];\n\tmap[tmp0] = true;\n\tvar tmp1 = {};\n\tmap[tmp1] = true;\n\t\n\tif(map[0] == null) {\n\t\tfail(\"map[0] == null\");\n\t}\n\tif(map[false] == null) {\n\t\tfail(\"map[false] == null\");\n\t}\n\tif(map[true] == null) {\n\t\tfail(\"map[true] == null\");\n\t}\n\tif(map[\"test\"] == null) {\n\t\tfail(\"map['test'] == null\");\n\t}\n\tif(map[binary(\"bin123\")] == null) {\n\t\tfail(\"map[bin123] == null\");\n\t}\n\tif(map[tmp0] == null) {\n\t\tfail(\"map[tmp0] == null\");\n\t}\n\tif(map[tmp1] == null) {\n\t\tfail(\"map[tmp1] == null\");\n\t}\n}\n{\n\tvar test = {\n\t\tfield: \"value\",\n\t\t\"field1\": 123\n\t};\n\tif(test.field != \"value\") {\n\t\tfail(\"test.field\");\n\t}\n\tif(test.field1 != 123) {\n\t\tfail(\"test.field1\");\n\t}\n\tvar test2 = {};\n\ttest2.field = test.field;\n\tif(test2.field != test.field) {\n\t\tfail(\"test2.field\");\n\t}\n}\n{\n\tvar test = null;\n\tif(test.field != null) {\n\t\tfail(\"null.field != null\");\n\t}\n}\n{\n\tvar test = concat([1, 2], [3, 4], [5]);\n\tif(size(test) != 5) {\n\t\tfail(\"concat: size(test) != 5\");\n\t}\n\tfor(var i = 0; i < 5; ++i) {\n\t\tif(test[i] != i + 1) {\n\t\t\tfail(\"test[i] != i + 1\");\n\t\t}\n\t}\n}\n{\n\tvar test = {\n\t\tfield: {\n\t\t\tfield: 1337\n\t\t}\n\t};\n\tvar test2 = test;\n\ttest = null;\n\tif(test2.field.field != 1337) {\n\t\tfail(\"test2.field.field != 1337\");\n\t}\n}\n{\n\tvar test = 1;\n\tdelete(test);\n\ttest = 1;\n\tif(test != 1) {\n\t\tfail(\"use after delete()\");\n\t}\n}\n{\n\tvar test = [1, 2, 3];\n\tpop(test);\n\tpush(test, 4);\n\tif(test[2] != 4) {\n\t\tfail(\"test[2] != 4\");\n\t}\n}\n{\n\tvar test = [1, 2, 3];\n\tvar test2 = deref(test);\n\tif(size(test2) != 3) {\n\t\tfail(\"size(test2) != 3\");\n\t}\n\tfor(var i = 0; i < size(test2); ++i) {\n\t\tif(test2[i] != i + 1) {\n\t\t\tfail(\"test2[i] != i + 1\");\n\t\t}\n\t}\n\tpop(test2);\n\tpop(test2);\n\tif(size(test) != 3) {\n\t\tfail(\"size(test) != 3\");\n\t}\n\tfor(var i = 0; i < size(test); ++i) {\n\t\tif(test[i] != i + 1) {\n\t\t\tfail(\"test[i] != i + 1\");\n\t\t}\n\t}\n}\n{\n\tvar test = [null, true, false, 1, \"test\", [], {}];\n\tif(test[0] != null) {\n\t\tfail(\"test[0] != null\");\n\t}\n\tif(test[1] != true) {\n\t\tfail(\"test[1] != true\");\n\t}\n\tif(test[2] != false) {\n\t\tfail(\"test[2] != false\");\n\t}\n\tif(test[3] != 1) {\n\t\tfail(\"test[3] != 1\");\n\t}\n\tif(test[4] != \"test\") {\n\t\tfail(\"test[4] != test\");\n\t}\n}\n{\n\tvar map = {};\n\tconst key = bech32(\"mmx1cxn9nan8xyw3zflxheaf2c2mrzgexzp33j9rwqmxw7ed3ut09wqsr06jmq\");\n\tmap[key] = 1337;\n\tif(map[key] != 1337) {\n\t\tfail(\"map[key] != 1337 (key = bech32())\");\n\t}\n}\n{\n\tconst array = [1, 2, 3];\n\tconst tmp = array;\n\tpush(tmp, 4);\n\tif(array[3] != 4) {\n\t\tfail(\"array[3] != 4\");\n\t}\n}\n{\n\tconst object = {\"foo\": {}};\n\tconst foo = object.foo;\n\tfoo.bar = true;\n\tif(object.foo.bar != true) {\n\t\tfail(\"object.foo.bar != true\");\n\t}\n}\n{\n\tconst obj = {\"foo\": true};\n\tdelete(obj.foo);\n\tif(obj.foo != true) {\n\t\tfail(\"delete(): obj.foo != true\");\n\t}\n}\n{\n\tvar map = {};\n\tif(map[bech32()] == 0) {\n\t\tfail(\"map[bech32()] == 0\");\n\t}\n}\n{\n\tvar obj = {test: \"data\"};\n\tobj.ptr = obj;\n\tdelete(obj);\n}\n{\n\tconst A = {};\n\tconst B = {ptr: A};\n\tA.ptr = B;\n}\n{\n\tvar array = [1, 2, 3];\n\tpop(array);\n\tif(array[2] != null) {\n\t\tfail(\"array[2] != null\");\n\t}\n\tif(array[1337] != null) {\n\t\tfail(\"array[1337] != null\");\n\t}\n}\n\nif(~binary_hex(\"F000\") != binary_hex(\"0FFF\")) {\n\tfail(\"~binary_hex\");\n}\nif((binary_hex(\"F000\") ^ binary_hex(\"FFF0\")) != binary_hex(\"0FF0\")) {\n\tfail(\"binary ^ binary\");\n}\nif((binary_hex(\"F000\") & binary_hex(\"FFF0\")) != binary_hex(\"F000\")) {\n\tfail(\"binary & binary\");\n}\nif((binary_hex(\"F000\") | binary_hex(\"FFF0\")) != binary_hex(\"FFF0\")) {\n\tfail(\"binary | binary\");\n}\n\n\n"
  },
  {
    "path": "test/vm/engine_tests.sh",
    "content": "#!/bin/bash\n\nset -e\n\necho \"Unit tests [test/vm/compiler_tests.js]\"\n./build/tools/mmx_compile -e -f test/vm/compiler_tests.js\necho \"Pass\"\n\necho \"Unit tests [test/vm/engine_tests.js]\"\n./build/tools/mmx_compile -e -f test/vm/engine_tests.js\necho \"Pass\"\n\nfor file in test/vm/fails/*.js; do\n\techo \"Asserting fail on [$file]\"\n\t./build/tools/mmx_compile -e -w -g 10000000 --assert-fail -f $file\n\techo \"Pass\"\ndone\n"
  },
  {
    "path": "test/vm/fails/assert.js",
    "content": "assert(false && true);"
  },
  {
    "path": "test/vm/fails/assert_code.js",
    "content": "assert(false, \"msg\", 1337);"
  },
  {
    "path": "test/vm/fails/assert_msg.js",
    "content": "assert(false, \"test\");"
  },
  {
    "path": "test/vm/fails/commit_out_of_gas.js",
    "content": "\nvar test = [];\n\nfor(var i = 0; i < 10000; ++i) {\n\tpush(test, i);\n}\n"
  },
  {
    "path": "test/vm/fails/div_by_zero.js",
    "content": "1 / 0;"
  },
  {
    "path": "test/vm/fails/endless_loop.js",
    "content": "\nwhile(true) {}\n"
  },
  {
    "path": "test/vm/fails/erase_recursion_overflow.js",
    "content": "\nvar test;\n\nfor(var i = 0; i < 102; ++i) {\n\ttest = [test];\n}\n\ntest = null;\n"
  },
  {
    "path": "test/vm/fails/integer_overflow_0.js",
    "content": "0 - 1;"
  },
  {
    "path": "test/vm/fails/integer_overflow_1.js",
    "content": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF + 1;"
  },
  {
    "path": "test/vm/fails/integer_overflow_2.js",
    "content": "0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF * 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;"
  },
  {
    "path": "test/vm/fails/invalid_array_index.js",
    "content": "\nvar test = [];\ntest[\"123\"] = true;\n"
  },
  {
    "path": "test/vm/fails/invalid_bech32_0.js",
    "content": "bech32(\"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\");"
  },
  {
    "path": "test/vm/fails/invalid_bech32_1.js",
    "content": "bech32(\"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\");"
  },
  {
    "path": "test/vm/fails/invalid_binary_and.js",
    "content": "binary_hex(\"FF\") & binary_hex(\"FF00\");"
  },
  {
    "path": "test/vm/fails/invalid_binary_hex.js",
    "content": "binary_hex(\"0xjlklklLKTY\");"
  },
  {
    "path": "test/vm/fails/invalid_binary_or.js",
    "content": "binary_hex(\"FF\") | binary_hex(\"FF00\");"
  },
  {
    "path": "test/vm/fails/invalid_binary_xor.js",
    "content": "binary_hex(\"FF\") ^ binary_hex(\"FF00\");"
  },
  {
    "path": "test/vm/fails/invalid_bitwise_and.js",
    "content": "0xFF & true;"
  },
  {
    "path": "test/vm/fails/invalid_bitwise_and2.js",
    "content": "true & true;"
  },
  {
    "path": "test/vm/fails/invalid_bitwise_not.js",
    "content": "~false;"
  },
  {
    "path": "test/vm/fails/invalid_bitwise_or.js",
    "content": "0 | true;"
  },
  {
    "path": "test/vm/fails/invalid_bitwise_or2.js",
    "content": "true | true;"
  },
  {
    "path": "test/vm/fails/invalid_bitwise_xor.js",
    "content": "0xFF ^ false;"
  },
  {
    "path": "test/vm/fails/invalid_bitwise_xor2.js",
    "content": "false ^ false;"
  },
  {
    "path": "test/vm/fails/invalid_concat_0.js",
    "content": "concat(\"123\", 456);"
  },
  {
    "path": "test/vm/fails/invalid_concat_1.js",
    "content": "concat(123, 456);"
  },
  {
    "path": "test/vm/fails/invalid_conv_integer_256_bit.js",
    "content": "\nstring(340282366920938463463374607431768211457);\n"
  },
  {
    "path": "test/vm/fails/invalid_conv_integer_negative.js",
    "content": "\nuint(\"-1\");\n"
  },
  {
    "path": "test/vm/fails/invalid_conv_integer_string_10.js",
    "content": "\nuint(\"abcdef\");\n"
  },
  {
    "path": "test/vm/fails/invalid_conv_integer_string_11.js",
    "content": "\nuint(\"...\");\n"
  },
  {
    "path": "test/vm/fails/invalid_conv_integer_string_16.js",
    "content": "\nuint(\"0xghj\");\n"
  },
  {
    "path": "test/vm/fails/invalid_conv_integer_string_2.js",
    "content": "\nuint(\"0b23456789\");\n"
  },
  {
    "path": "test/vm/fails/invalid_erase.js",
    "content": "\nvar test = [1, 2, 3];\nerase(test, 2);\n"
  },
  {
    "path": "test/vm/fails/invalid_fail.js",
    "content": "\nfail(123);\n"
  },
  {
    "path": "test/vm/fails/invalid_greater_equal.js",
    "content": "\nconst res = (11 >= \"111\");\n"
  },
  {
    "path": "test/vm/fails/invalid_greater_than.js",
    "content": "\nconst res = (11 > \"123\");\n"
  },
  {
    "path": "test/vm/fails/invalid_hex_string_0.js",
    "content": "\nbinary_hex(\"G0\");\n"
  },
  {
    "path": "test/vm/fails/invalid_hex_string_1.js",
    "content": "\nbinary_hex(\"000\");\n"
  },
  {
    "path": "test/vm/fails/invalid_less_equal.js",
    "content": "\nconst res = (11 <= \"111\");"
  },
  {
    "path": "test/vm/fails/invalid_less_than.js",
    "content": "\nconst res = (0 < \"1234\");\n"
  },
  {
    "path": "test/vm/fails/invalid_mint.js",
    "content": "mint(bech32(\"MMX\"), 1 << 80);"
  },
  {
    "path": "test/vm/fails/invalid_neg_0.js",
    "content": "~false;"
  },
  {
    "path": "test/vm/fails/invalid_neg_1.js",
    "content": "~\"test\";"
  },
  {
    "path": "test/vm/fails/invalid_op_add.js",
    "content": "\n1 + \"test\";\n"
  },
  {
    "path": "test/vm/fails/invalid_op_div.js",
    "content": "\n1 / \"test\";\n"
  },
  {
    "path": "test/vm/fails/invalid_op_mod.js",
    "content": "\n1 % \"test\";\n"
  },
  {
    "path": "test/vm/fails/invalid_op_mul.js",
    "content": "\n1 * \"test\";\n"
  },
  {
    "path": "test/vm/fails/invalid_op_set.js",
    "content": "\nvar map;\nmap[123] = true;\n"
  },
  {
    "path": "test/vm/fails/invalid_op_sub.js",
    "content": "\n1 - \"test\";\n"
  },
  {
    "path": "test/vm/fails/invalid_rcall.js",
    "content": "rcall(\"test\", \"func\", 1, false, []);"
  },
  {
    "path": "test/vm/fails/invalid_read.js",
    "content": "read(bech32(), \"field\");"
  },
  {
    "path": "test/vm/fails/invalid_send_0.js",
    "content": "send(bech32(\"MMX\"), 1 << 128);"
  },
  {
    "path": "test/vm/fails/invalid_send_1.js",
    "content": "send(bech32(\"MMX\"), 1, bech32(\"MMX\"));"
  },
  {
    "path": "test/vm/fails/invalid_size.js",
    "content": "size(123);"
  },
  {
    "path": "test/vm/fails/key_size_overflow.js",
    "content": "\nvar key = \"0123456789ABCDEF\";\n\nfor(var i = 0; i < 8; ++i) {\n\tkey = concat(key, key);\n}\nkey = concat(key, \".\");\n\nvar map = {};\nmap[key] = 1;\n"
  },
  {
    "path": "test/vm/fails/mod_by_zero.js",
    "content": "1 % 0;"
  },
  {
    "path": "test/vm/fails/modify_balance.js",
    "content": "\nthis.balance[bech32()] = 1337;\n"
  },
  {
    "path": "test/vm/fails/modify_user.js",
    "content": "\n__copy(this.user, bech32());\n"
  },
  {
    "path": "test/vm/fails/null_map_key.js",
    "content": "\nvar map = {};\nmap[null] = null;\n"
  },
  {
    "path": "test/vm/fails/out_of_bounds_array_set.js",
    "content": "\nvar array = [];\narray[1111] = true;\n"
  },
  {
    "path": "test/vm/fails/out_of_bounds_memcpy.js",
    "content": "\nmemcpy(\"ABC\", 1, 4);\n"
  },
  {
    "path": "test/vm/fails/read_fail.js",
    "content": "\nvar test = 0;\ndelete(test);\ntest++;\n"
  },
  {
    "path": "test/vm/fails/recursive_loop.js",
    "content": "\nfunction func(a, b, c, d) {\n\tfunc(a, b, c, d);\n}\n\nfunc(1, 2, 3, 4);\n"
  },
  {
    "path": "test/vm/fails/value_size_overflow.js",
    "content": "\nvar value = \"0123456789ABCDEF\";\n\nfor(var i = 0; i < 29; ++i) {\n\tvalue = concat(value, value);\n}\n\nvalue = null;\n"
  },
  {
    "path": "test/vm/storage_tests.cpp",
    "content": "/*\n * storage_tests.cpp\n *\n *  Created on: Apr 23, 2024\n *      Author: mad\n */\n\n#include <mmx/vm/Engine.h>\n#include <mmx/vm/StorageDB.h>\n#include <mmx/vm/StorageRAM.h>\n#include <mmx/vm/StorageCache.h>\n#include <mmx/vm_interface.h>\n\n#include <vnx/vnx.h>\n#include <vnx/test/Test.h>\n\n#include <iostream>\n\nusing namespace mmx;\n\n\nvoid expect(const vm::var_t* got, const vm::var_t* want) {\n\tif(compare(got, want)) {\n\t\tthrow std::logic_error(\"expected \" + to_string(want) + \" but got \" + to_string(got));\n\t}\n}\n\nvoid expect(const vm::var_t* got, const vm::var_t& want) {\n\texpect(got, &want);\n}\n\nvoid expect(const vm::var_t* got, vm::varptr_t want) {\n\texpect(got, want.get());\n}\n\nstd::shared_ptr<vm::Engine> new_engine(std::shared_ptr<vm::Storage> storage, bool read_only)\n{\n\tauto engine = std::make_shared<vm::Engine>(addr_t(), storage, read_only);\n\tengine->gas_limit = 1000000;\n\tengine->init();\n\treturn engine;\n}\n\n\nint main(int argc, char** argv)\n{\n\tvnx::test::init(\"mmx.vm.storage\");\n\n\tauto db = std::make_shared<mmx::DataBase>(1);\n\tauto storage = std::make_shared<vm::StorageDB>(\"tmp/\", db);\n\n\tVNX_TEST_BEGIN(\"stack\")\n\t{\n\t\tdb->revert(0);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tengine->write(vm::MEM_STACK, vm::uint_t(1337));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(1);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\texpect(engine->read(vm::MEM_STACK), nullptr);\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"heap\")\n\t{\n\t\tdb->revert(0);\n\t\tuint64_t addr = 0;\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\taddr = engine->alloc();\n\t\t\tengine->write(addr, vm::uint_t(1337));\n\t\t\tengine->write(vm::MEM_STATIC, vm::ref_t(addr));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(1);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\tconst auto ref = engine->read(vm::MEM_STATIC);\n\t\t\tvnx::test::expect(bool(ref), true);\n\t\t\tconst auto value = engine->read(vm::to_ref(ref));\n\t\t\texpect(value, vm::uint_t(1337));\n\t\t}\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tengine->erase(vm::MEM_STATIC);\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(2);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\texpect(engine->read(vm::MEM_STATIC), nullptr);\n\t\t\texpect(engine->read(addr), vm::uint_t(1337));\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"heap_erase\")\n\t{\n\t\tdb->revert(0);\n\t\tuint64_t addr = 0;\n\t\tuint64_t addr2 = 0;\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\taddr = engine->alloc();\n\t\t\tengine->write(addr, vm::uint_t(1337));\n\t\t\tengine->write(vm::MEM_STATIC, vm::ref_t(addr));\n\t\t\texpect(engine->read(addr), vm::uint_t(1337));\n\n\t\t\taddr2 = engine->alloc();\n\t\t\tengine->write(addr2, vm::uint_t(11));\n\t\t\tengine->write(vm::MEM_STATIC, vm::ref_t(addr2));\n\t\t\texpect(engine->read(addr), nullptr);\n\n\t\t\tengine->erase(vm::MEM_STATIC);\n\t\t\texpect(engine->read(vm::MEM_STATIC), nullptr);\n\t\t\texpect(engine->read(addr2), nullptr);\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(1);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\texpect(engine->read(vm::MEM_STATIC), nullptr);\n\t\t\texpect(engine->read(addr), nullptr);\n\t\t\texpect(engine->read(addr2), nullptr);\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"heap_recursive_erase\")\n\t{\n\t\tdb->revert(0);\n\t\tuint64_t addr = 0;\n\t\tuint64_t addr2 = 0;\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\taddr = engine->alloc();\n\t\t\taddr2 = engine->alloc();\n\t\t\tengine->write(addr, vm::map_t());\n\t\t\tengine->write(addr2, vm::map_t());\n\t\t\tengine->write(vm::MEM_STATIC, vm::ref_t(addr));\n\t\t\tengine->write_key(addr, vm::uint_t(1337), vm::ref_t(addr2));\n\t\t\tengine->write_key(addr2, vm::uint_t(1337), vm::uint_t(1337));\n\t\t\texpect(engine->read_key(addr2, vm::uint_t(1337)), vm::uint_t(1337));\n\n\t\t\tengine->erase(vm::MEM_STATIC);\n\t\t\texpect(engine->read(vm::MEM_STATIC), nullptr);\n\t\t\texpect(engine->read(addr), nullptr);\n\t\t\texpect(engine->read(addr2), nullptr);\n\t\t\texpect(engine->read_key(addr2, vm::uint_t(1337)), nullptr);\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(1);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\texpect(engine->read(vm::MEM_STATIC), nullptr);\n\t\t\texpect(engine->read(addr), nullptr);\n\t\t\texpect(engine->read(addr2), nullptr);\n\t\t\texpect(engine->read_key(addr2, vm::uint_t(1337)), nullptr);\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"lookup\")\n\t{\n\t\tdb->revert(0);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tconst auto key = engine->lookup(vm::to_binary(\"test\"), false);\n\t\t\tengine->write(vm::MEM_STATIC, vm::map_t());\n\t\t\tvnx::test::expect(vm::to_ref(engine->read(vm::MEM_STATIC)), vm::MEM_STATIC);\n\t\t\tengine->write_key(vm::MEM_STATIC, key, vm::uint_t(1337));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(1);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\tconst auto key = engine->lookup(vm::to_binary(\"test\"), true);\n\t\t\tconst auto value = engine->read_key(vm::MEM_STATIC, key);\n\t\t\texpect(value, vm::uint_t(1337));\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"over_write\")\n\t{\n\t\tdb->revert(0);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tengine->write(vm::MEM_STATIC, vm::uint_t(1337));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(1);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tengine->write(vm::MEM_STATIC, vm::uint_t(11337));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(2);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\tconst auto value = engine->read(vm::MEM_STATIC);\n\t\t\texpect(value, vm::uint_t(11337));\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"array\")\n\t{\n\t\tdb->revert(0);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tengine->write(vm::MEM_STATIC, vm::array_t());\n\t\t\tvnx::test::expect(vm::to_ref(engine->read(vm::MEM_STATIC)), vm::MEM_STATIC);\n\t\t\tengine->push_back(vm::MEM_STATIC, vm::uint_t(1));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(1);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tvnx::test::expect(vm::to_ref(engine->read(vm::MEM_STATIC)), vm::MEM_STATIC);\n\t\t\tengine->push_back(vm::MEM_STATIC, vm::to_binary(\"test\"));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(2);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\tconst auto value = engine->read(vm::MEM_STATIC);\n\t\t\tvnx::test::expect(bool(value), true);\n\t\t\tvnx::test::expect(value->type, vm::TYPE_ARRAY);\n\t\t\tauto array = (vm::array_t*)value;\n\t\t\tvnx::test::expect(array->size, 2u);\n\t\t\texpect(engine->read_entry(vm::MEM_STATIC, 0), vm::uint_t(1));\n\t\t\texpect(engine->read_entry(vm::MEM_STATIC, 1), vm::to_binary(\"test\"));\n\n\t\t\tengine->copy(vm::MEM_STACK, vm::MEM_STATIC);\n\t\t\t{\n\t\t\t\tconst auto value = engine->read(vm::MEM_STACK);\n\t\t\t\tvnx::test::expect(bool(value), true);\n\t\t\t\tvnx::test::expect(value->type, vm::TYPE_ARRAY);\n\t\t\t\tauto array = (vm::array_t*)value;\n\t\t\t\tvnx::test::expect(array->size, 2u);\n\t\t\t\texpect(engine->read_entry(vm::MEM_STACK, 0), vm::uint_t(1));\n\t\t\t\texpect(engine->read_entry(vm::MEM_STACK, 1), vm::to_binary(\"test\"));\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tengine->pop_back(vm::MEM_STACK, vm::MEM_STATIC);\n\t\t\texpect(engine->read(vm::MEM_STACK), vm::to_binary(\"test\"));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(3);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\tconst auto value = engine->read(vm::MEM_STATIC);\n\t\t\tvnx::test::expect(bool(value), true);\n\t\t\tvnx::test::expect(value->type, vm::TYPE_ARRAY);\n\t\t\tauto array = (vm::array_t*)value;\n\t\t\tvnx::test::expect(array->size, 1u);\n\t\t\texpect(engine->read_entry(vm::MEM_STATIC, 0), vm::uint_t(1));\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"map\")\n\t{\n\t\tdb->revert(0);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tengine->write(vm::MEM_STATIC, vm::map_t());\n\t\t\tconst auto value = engine->read(vm::MEM_STATIC);\n\t\t\tvnx::test::expect(bool(value), true);\n\t\t\tvnx::test::expect(value->type, vm::TYPE_MAP);\n\t\t\tvnx::test::expect(vm::to_ref(value), vm::MEM_STATIC);\n\n\t\t\tengine->write_key(vm::MEM_STATIC, vm::uint_t(1), vm::var_t(vm::TYPE_TRUE));\n\t\t\tengine->write_key(vm::MEM_STATIC, vm::to_binary(addr_t()), vm::to_binary(addr_t()));\n\n\t\t\tengine->copy(vm::MEM_STACK, vm::MEM_STATIC);\n\t\t\t{\n\t\t\t\tconst auto value = engine->read(vm::MEM_STACK);\n\t\t\t\tvnx::test::expect(bool(value), true);\n\t\t\t\tvnx::test::expect(value->type, vm::TYPE_MAP);\n\t\t\t\tvnx::test::expect(vm::to_ref(value), vm::MEM_STACK);\n\t\t\t\texpect(engine->read_key(vm::MEM_STACK, vm::uint_t(1)), vm::var_t(vm::TYPE_TRUE));\n\t\t\t\texpect(engine->read_key(vm::MEM_STACK, vm::to_binary(addr_t())), vm::to_binary(addr_t()));\n\t\t\t}\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(1);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tconst auto value = engine->read(vm::MEM_STATIC);\n\t\t\tvnx::test::expect(bool(value), true);\n\t\t\tvnx::test::expect(value->type, vm::TYPE_MAP);\n\t\t\tvnx::test::expect(vm::to_ref(value), vm::MEM_STATIC);\n\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::uint_t(1)), vm::var_t(vm::TYPE_TRUE));\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::to_binary(addr_t())), vm::to_binary(addr_t()));\n\n\t\t\tengine->write_key(vm::MEM_STATIC, vm::uint_t(1), vm::uint_t(2));\n\t\t\tengine->write_key(vm::MEM_STATIC, vm::to_binary(addr_t()), vm::to_binary(hash_t(\"test\")));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(2);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::uint_t(1)), vm::uint_t(2));\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::to_binary(addr_t())), vm::to_binary(hash_t(\"test\")));\n\t\t}\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tengine->erase_key(vm::MEM_STATIC, engine->lookup(vm::uint_t(1), true));\n\t\t\tengine->erase_key(vm::MEM_STATIC, engine->lookup(vm::to_binary(addr_t()), true));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(3);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::uint_t(1)), nullptr);\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::to_binary(addr_t())), nullptr);\n\n\t\t\tengine->write_key(vm::MEM_STATIC, vm::uint_t(1), vm::uint_t(3));\n\t\t\tengine->write_key(vm::MEM_STATIC, vm::to_binary(addr_t()), nullptr);\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(4);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::uint_t(1)), vm::uint_t(3));\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::to_binary(addr_t())), vm::var_t());\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"delete_write\")\n\t{\n\t\tdb->revert(0);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tengine->write(vm::MEM_STATIC, vm::uint_t(1337));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(1);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\texpect(engine->read(vm::MEM_STATIC), vm::uint_t(1337));\n\n\t\t\tengine->erase(vm::MEM_STATIC);\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(2);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\texpect(engine->read(vm::MEM_STATIC), nullptr);\n\n\t\t\tengine->write(vm::MEM_STATIC, vm::uint_t(11337));\n\t\t\texpect(engine->read(vm::MEM_STATIC), vm::uint_t(11337));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(3);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\texpect(engine->read(vm::MEM_STATIC), vm::uint_t(11337));\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\tVNX_TEST_BEGIN(\"delete_write_key\")\n\t{\n\t\tdb->revert(0);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\tengine->write(vm::MEM_STATIC, vm::map_t());\n\t\t\tengine->write_key(vm::MEM_STATIC, vm::uint_t(1337), vm::uint_t(11));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(1);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::uint_t(1337)), vm::uint_t(11));\n\n\t\t\tengine->erase_key(vm::MEM_STATIC, engine->lookup(vm::uint_t(1337), true));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(2);\n\t\t{\n\t\t\tauto engine = new_engine(storage, false);\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::uint_t(1337)), nullptr);\n\n\t\t\tengine->write_key(vm::MEM_STATIC, vm::uint_t(1337), vm::uint_t(111));\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::uint_t(1337)), vm::uint_t(111));\n\t\t\tengine->commit();\n\t\t}\n\t\tdb->commit(3);\n\t\t{\n\t\t\tauto engine = new_engine(storage, true);\n\t\t\texpect(engine->read_key(vm::MEM_STATIC, vm::uint_t(1337)), vm::uint_t(111));\n\t\t}\n\t}\n\tVNX_TEST_END()\n\n\treturn vnx::test::done();\n}\n\n"
  },
  {
    "path": "test/vm/test_execute.cpp",
    "content": "/*\n * test_execute.cpp\n *\n *  Created on: Oct 23, 2024\n *      Author: mad\n */\n\n#include <mmx/vm/Engine.h>\n#include <mmx/vm/StorageRAM.h>\n#include <mmx/contract/Binary.hxx>\n#include <mmx/vm_interface.h>\n#include <mmx/secp256k1.hpp>\n\n#include <vnx/vnx.h>\n\nusing namespace mmx;\n\n\nint main(int argc, char** argv)\n{\n\tmmx::secp256k1_init();\n\n\tstd::map<std::string, std::string> options;\n\toptions[\"f\"] = \"file\";\n\toptions[\"n\"] = \"repeat\";\n\toptions[\"file\"] = \"binary file\";\n\toptions[\"gas\"] = \"gas limit\";\n\toptions[\"assert-fail\"] = \"assert fail\";\n\n\tvnx::write_config(\"log_level\", 2);\n\n\tvnx::init(\"test_execute\", argc, argv, options);\n\n\tuint64_t gas_limit = 25 * 1000 * 1000;\n\tstd::string network = \"mainnet\";\n\tstd::string file_name = \"binary\";\n\tvnx::read_config(\"file\", file_name);\n\tvnx::read_config(\"gas\", gas_limit);\n\n\ttry {\n\t\tstd::shared_ptr<const contract::Binary> binary;\n\t\tif(file_name == \"binary\") {\n\t\t\tvnx::Memory data;\n\t\t\tstd::vector<char> buffer(4096);\n\t\t\twhile(std::cin.read(buffer.data(), buffer.size()) || std::cin.gcount() > 0) {\n\t\t\t\tconst auto bytes_read = std::cin.gcount();\n\t\t\t\t::memcpy(data.add_chunk(bytes_read), buffer.data(), bytes_read);\n\t\t\t}\n\t\t\tvnx::MemoryInputStream stream(&data);\n\t\t\tvnx::TypeInput in(&stream);\n\t\t\tvnx::read(in, binary);\n\t\t} else if(file_name == \"json\") {\n\t\t\tvnx::read(std::cin).to(binary);\n\t\t} else {\n\t\t\tbinary = vnx::read_from_file<contract::Binary>(file_name);\n\t\t}\n\t\tif(!binary) {\n\t\t\tthrow std::logic_error(\"failed to read file: \" + file_name);\n\t\t}\n\t\tauto storage = std::make_shared<vm::StorageRAM>();\n\n\t\tauto engine = std::make_shared<vm::Engine>(hash_t(\"__test\"), storage, false);\n\t\tengine->gas_limit = gas_limit;\n\n\t\tvm::load(engine, binary);\n\n\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_USER, vm::var_t());\n\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_ADDRESS, vm::to_binary(engine->contract));\n\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_NETWORK, vm::to_binary(network));\n\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_HEIGHT, vm::uint_t(0));\n\t\tengine->begin(0);\n\n\t\ttry {\n\t\t\tengine->run();\n\t\t\tengine->commit();\n\t\t}\n\t\tcatch(const std::exception& ex) {\n\t\t\tstd::cerr << \"Failed at \" << vm::to_hex(engine->error_addr)\n\t\t\t\t\t<< \" line \" << vnx::to_string(binary->find_line(engine->error_addr))\n\t\t\t\t\t<< \" with: \" << ex.what() << \" (code \" << engine->error_code << \")\" << std::endl;\n\t\t}\n\t}\n\tcatch(const std::exception& ex) {\n\t\tstd::cerr << ex.what() << std::endl;\n\t}\n\n\tvnx::close();\n\n\tmmx::secp256k1_free();\n\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "test/vm/test_nft.js",
    "content": "\ninterface __test;\ninterface nft;\n\nconst nft_binary = __test.compile(\"src/contract/nft.js\");\n\nconst creator = \"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\";\n\nconst nft_addr = nft.__deploy({\n\t__type: \"mmx.contract.Executable\",\n\tbinary: nft_binary,\n\tinit_args: [creator]\n});\n\nconst wallet = \"mmx1e7yktu9vpeyq7hx39cmagzfp2um3kddwjf4tlt8j3kmktwc7fk6qmyc6ns\";\n\nnft.mint_to(wallet, null, {__test: 1, assert_fail: true});\nnft.mint_to(wallet, null, {__test: 1, user: creator});\nnft.mint_to(wallet, null, {__test: 1, user: creator, assert_fail: true});\n\nassert(__test.get_balance(wallet, nft_addr) == 1);\n"
  },
  {
    "path": "test/vm/test_nft_n.js",
    "content": "\ninterface __test;\ninterface template;\ninterface nft_1;\ninterface nft_2;\ninterface nft_test;\n\nconst nft_binary = __test.compile(\"src/contract/nft.js\");\nconst template_binary = __test.compile(\"src/contract/template.js\");\n\nconst creator_skey = sha256(\"skey\");\nconst creator_key = __test.get_public_key(creator_skey);\nconst creator_key_hex = string_hex(creator_key);\nconst creator = string_bech32(sha256(creator_key));\n\nconst template_addr = template.__deploy({\n\t__type: \"mmx.contract.Executable\",\n\tbinary: template_binary,\n\tinit_args: [creator]\n});\n\nconst msg_0 = concat(string_bech32(template_addr), \"/\", string(0));\nconst signature_0 = string_hex(__test.ecdsa_sign(creator_skey, sha256(msg_0)));\n\n// fail due to serial 0\nnft_1.__deploy({\n\t__type: \"mmx.contract.Executable\",\n\tbinary: nft_binary,\n\tdepends: {template: template_addr},\n\tinit_method: \"init_n\",\n\tinit_args: [creator_key_hex, 0, signature_0, {__test: 1, assert_fail: true}]\n});\n\nconst msg_1 = concat(string_bech32(template_addr), \"/\", string(1));\nconst signature_1 = string_hex(__test.ecdsa_sign(creator_skey, sha256(msg_1)));\n\nconst nft_1_addr = nft_1.__deploy({\n\t__type: \"mmx.contract.Executable\",\n\tbinary: nft_binary,\n\tdepends: {template: template_addr},\n\tinit_method: \"init_n\",\n\tinit_args: [creator_key_hex, 1, signature_1]\n});\n\n// fail due to duplicate serial\nnft_test.__deploy({\n\t__type: \"mmx.contract.Executable\",\n\tbinary: nft_binary,\n\tdepends: {template: template_addr},\n\tinit_method: \"init_n\",\n\tinit_args: [creator_key_hex, 1, signature_1, {__test: 1, assert_fail: true}]\n});\n\nconst msg_2 = concat(string_bech32(template_addr), \"/\", string(2));\nconst signature_2 = string_hex(__test.ecdsa_sign(creator_skey, sha256(msg_2)));\n\nconst nft_2_addr = nft_2.__deploy({\n\t__type: \"mmx.contract.Executable\",\n\tbinary: nft_binary,\n\tdepends: {template: template_addr},\n\tinit_method: \"init_n\",\n\tinit_args: [creator_key_hex, 2, signature_2]\n});\n"
  },
  {
    "path": "test/vm/test_offer.js",
    "content": "\ninterface __test;\ninterface offer;\n\nconst MMX = string_bech32(bech32());\nconst USD = string_bech32(sha256(\"USD\"));\nconst binary = __test.compile(\"src/contract/offer.js\");\n\nconst owner = \"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\";\nvar price = (1 << 64) / 2;\n\nconst offer_addr = offer.__deploy({\n\t__type: \"mmx.contract.Executable\",\n\tbinary: binary,\n\tinit_args: [owner, MMX, USD, string(price), null]\n});\n\n__test.send(offer_addr, 10000000, MMX);\n\nconst user = \"mmx1e7yktu9vpeyq7hx39cmagzfp2um3kddwjf4tlt8j3kmktwc7fk6qmyc6ns\";\n\noffer.trade(user, string(price), {__test: 1, assert_fail: true});\noffer.trade(user, string(price), {__test: 1, assert_fail: true, deposit: [1000, MMX]});\noffer.trade(user, string(price), {__test: 1, assert_fail: true, deposit: [1000000000000000, USD]});\noffer.trade(user, \"0x000000000\", {__test: 1, assert_fail: true, deposit: [1000000, USD]});\n\noffer.trade(user, string(price), {__test: 1, deposit: [1000000, USD]});\n\nassert(__test.get_balance(user, MMX) = 500000);\n\nprice = (1 << 64);\noffer.set_price(string(price), {__test: 1, user: owner, assert_fail: true});\n\n__test.inc_height(1080);\n\noffer.set_price(string(price), {__test: 1, user: owner});\n\noffer.trade(user, string(price), {__test: 1, deposit: [1000000, USD]});\n\nassert(__test.get_balance(user, MMX) = 1500000);\n\n__test.inc_height(1080);\n\nprice = (100 << 64);\noffer.set_price(string(price), {__test: 1, user: owner});\n"
  },
  {
    "path": "test/vm/test_plot_nft.js",
    "content": "\ninterface __test;\ninterface plot_nft;\n\nconst MMX = string_bech32(bech32());\nconst binary = __test.compile(\"src/contract/plot_nft.js\");\n\nconst owner = \"mmx1kx69pm743rshqac5lgcstlr8nq4t93hzm8gumkkxmp5y9fglnkes6ve09z\";\n\nconst plot_nft_addr = plot_nft.__deploy({\n\t__type: \"mmx.contract.Executable\",\n\tbinary: binary,\n\tinit_args: [owner]\n});\n\nplot_nft.check_owner({__test: 1, user: owner});\nplot_nft.check_owner({__test: 1, user: bech32(owner)});\nplot_nft.check_owner({__test: 1, assert_fail: true});\n\nassert(plot_nft.is_locked() == false);\n\nassert(__test.get_balance(plot_nft_addr, bech32()) == 0);\n\nconst farmer = \"mmx1e7yktu9vpeyq7hx39cmagzfp2um3kddwjf4tlt8j3kmktwc7fk6qmyc6ns\";\n\nassert(plot_nft.mmx_reward_target(null) == owner);\nassert(plot_nft.mmx_reward_target(farmer) == farmer);\n\nconst pool_target = \"mmx1uj2dth7r9tcn3vas42f0hzz74dkz8ygv59mpx44n7px7j7yhvv4sfmkf0d\";\n\nplot_nft.lock(pool_target, null, {__test: 1, user: owner});\n\nassert(plot_nft.is_locked() == true);\nassert(plot_nft.mmx_reward_target(null) == pool_target);\nassert(plot_nft.mmx_reward_target(farmer) == pool_target);\n\nplot_nft.set_server_url(\"http://pool.mmx.network\", {__test: 1, user: owner});\n\n__test.send(plot_nft_addr, 500000, MMX);\n\nplot_nft.claim_all(MMX, {__test: 1, user: owner, assert_fail: true});\nplot_nft.claim_all(MMX, {__test: 1, user: pool_target});\n\nassert(__test.get_balance(pool_target, MMX) == 500000);\n\nplot_nft.unlock({__test: true, user: owner});\n\nassert(plot_nft.is_locked() == true);\n__test.inc_height(1);\nassert(plot_nft.is_locked() == true);\n__test.inc_height(255);\nassert(plot_nft.is_locked() == false);\n\nassert(plot_nft.mmx_reward_target(null) == owner);\nassert(plot_nft.mmx_reward_target(farmer) == farmer);\n\n__test.send(plot_nft_addr, 500000, MMX);\n\nplot_nft.claim_all(MMX, {__test: 1, user: owner});\nplot_nft.claim_all(MMX, {__test: 1, user: pool_target, assert_fail: true});\n\nassert(__test.get_balance(owner, MMX) == 500000);\n\n__test.inc_height(100);\n\nassert(plot_nft.is_locked() == false);\n\nplot_nft.lock(pool_target, null, {__test: 1, user: owner});\n\nassert(plot_nft.is_locked() == true);\nassert(plot_nft.mmx_reward_target(null) == pool_target);\nassert(plot_nft.mmx_reward_target(farmer) == pool_target);\n\n__test.inc_height(100);\n\nassert(plot_nft.is_locked() == true);\n\nconst new_owner = \"mmx1rc6ezc4pmjw2vx7m7t63cl3qz6na56nnuywweekt88ds2j6q3c0qvy4qmr\";\n\nplot_nft.transfer(new_owner, null, {__test: 1, user: owner});\n\nplot_nft.unlock({__test: true, user: owner, assert_fail: true});\nplot_nft.unlock({__test: true, user: new_owner});\n\n\n"
  },
  {
    "path": "test/vm/test_poker.js",
    "content": "import {equals} from \"std\";\n\ninterface __test;\ninterface poker;\n\nconst poker_binary = __test.compile(\"src/contract/poker.js\");\n\nconst poker_addr = poker.__deploy({\n\t__type: \"mmx.contract.Executable\",\n\tbinary: poker_binary,\n\tinit_args: []\n});\n\nfunction main() {\n\n{\n    const rank = poker.get_rank([[\"2\", \"H\"], [\"4\", \"D\"], [\"7\", \"C\"], [\"9\", \"S\"], [\"J\", \"H\"]]);\n    assert(rank[0] == 0); // High Card\n}\n{\n    const rank = poker.get_rank([[\"4\", \"H\"], [\"4\", \"D\"], [\"7\", \"C\"], [\"9\", \"S\"], [\"J\", \"H\"]]);\n    assert(rank[0] == 1); // One Pair\n}\n{\n    const rank = poker.get_rank([[\"4\", \"H\"], [\"4\", \"D\"], [\"7\", \"C\"], [\"7\", \"S\"], [\"J\", \"H\"]]);\n    assert(rank[0] == 2); // Two Pair\n}\n{\n    const rank = poker.get_rank([[\"6\", \"H\"], [\"6\", \"D\"], [\"6\", \"C\"], [\"9\", \"S\"], [\"J\", \"H\"]]);\n    assert(rank[0] == 3); // Three of a Kind\n}\n{\n    const rank = poker.get_rank([[\"A\", \"H\"], [\"2\", \"H\"], [\"3\", \"D\"], [\"4\", \"C\"], [\"5\", \"S\"]]);\n    assert(rank[0] == 4); // Ace Low Straight\n}\n{\n    const rank = poker.get_rank([[\"2\", \"H\"], [\"3\", \"D\"], [\"4\", \"C\"], [\"5\", \"S\"], [\"6\", \"H\"]]);\n    assert(rank[0] == 5); // Straight\n}\n{\n    const rank = poker.get_rank([[\"2\", \"H\"], [\"5\", \"H\"], [\"8\", \"H\"], [\"J\", \"H\"], [\"K\", \"H\"]]);\n    assert(rank[0] == 6); // Flush\n}\n{\n    const rank = poker.get_rank([[\"3\", \"D\"], [\"3\", \"H\"], [\"3\", \"S\"], [\"5\", \"C\"], [\"5\", \"H\"]]);\n    assert(rank[0] == 7); // Full House\n}\n{\n    const rank = poker.get_rank([[\"9\", \"H\"], [\"9\", \"D\"], [\"9\", \"C\"], [\"9\", \"S\"], [\"K\", \"H\"]]);\n    assert(rank[0] == 8); // Four of a Kind\n}\n{\n    const rank = poker.get_rank([[\"A\", \"H\"], [\"2\", \"H\"], [\"3\", \"H\"], [\"4\", \"H\"], [\"5\", \"H\"]]);\n    assert(rank[0] == 9); // Ace Low Straight Flush\n}\n{\n    const rank = poker.get_rank([[\"5\", \"S\"], [\"6\", \"S\"], [\"7\", \"S\"], [\"8\", \"S\"], [\"9\", \"S\"]]);\n    assert(rank[0] == 10); // Straight Flush\n}\n{\n    const rank = poker.get_rank([[\"10\", \"S\"], [\"J\", \"S\"], [\"Q\", \"S\"], [\"K\", \"S\"], [\"A\", \"S\"]]);\n    assert(rank[0] == 10); // Royal Flush\n}\n\nassert(poker.check_win(\n    [[\"2\", \"H\"], [\"4\", \"D\"], [\"7\", \"C\"], [\"9\", \"S\"], [\"J\", \"H\"]],   // High Card\n    [[\"2\", \"H\"], [\"4\", \"D\"], [\"7\", \"C\"], [\"9\", \"S\"], [\"J\", \"H\"]]    // High Card\n) == \"EQ\");\n\nassert(poker.check_win(\n    [[\"A\", \"H\"], [\"4\", \"D\"], [\"7\", \"C\"], [\"9\", \"S\"], [\"J\", \"H\"]],   // High Card\n    [[\"2\", \"H\"], [\"4\", \"D\"], [\"7\", \"C\"], [\"9\", \"S\"], [\"J\", \"H\"]]    // High Card\n) == \"GT\");\n\nassert(poker.check_win(\n    [[\"2\", \"H\"], [\"4\", \"D\"], [\"7\", \"C\"], [\"9\", \"S\"], [\"J\", \"H\"]],   // High Card\n    [[\"A\", \"H\"], [\"4\", \"D\"], [\"7\", \"C\"], [\"9\", \"S\"], [\"J\", \"H\"]]    // High Card\n) == \"LT\");\n\nassert(poker.check_win(\n    [[\"2\", \"H\"], [\"3\", \"D\"], [\"4\", \"C\"], [\"5\", \"S\"], [\"6\", \"H\"]],   // Straight\n    [[\"2\", \"H\"], [\"3\", \"D\"], [\"4\", \"C\"], [\"5\", \"S\"], [\"6\", \"H\"]]    // Straight\n) == \"EQ\");\n\nassert(poker.check_win(\n    [[\"2\", \"H\"], [\"5\", \"H\"], [\"8\", \"H\"], [\"J\", \"H\"], [\"K\", \"H\"]],   // Flush\n    [[\"2\", \"H\"], [\"5\", \"H\"], [\"8\", \"H\"], [\"J\", \"H\"], [\"K\", \"H\"]]    // Flush\n) == \"EQ\");\n\nassert(poker.check_win(\n    [[\"A\", \"H\"], [\"5\", \"H\"], [\"8\", \"H\"], [\"J\", \"H\"], [\"K\", \"H\"]],   // Flush\n    [[\"2\", \"H\"], [\"5\", \"H\"], [\"8\", \"H\"], [\"J\", \"H\"], [\"K\", \"H\"]]    // Flush\n) == \"GT\");\n\nassert(poker.check_win(\n    [[\"2\", \"H\"], [\"5\", \"H\"], [\"8\", \"H\"], [\"J\", \"H\"], [\"K\", \"H\"]],   // Flush\n    [[\"A\", \"H\"], [\"5\", \"H\"], [\"8\", \"H\"], [\"J\", \"H\"], [\"K\", \"H\"]]    // Flush\n) == \"LT\");\n\nassert(poker.check_win(\n    [[\"A\", \"H\"], [\"2\", \"H\"], [\"3\", \"D\"], [\"4\", \"C\"], [\"5\", \"S\"]],   // Ace Low Straight\n    [[\"2\", \"H\"], [\"3\", \"D\"], [\"4\", \"C\"], [\"5\", \"S\"], [\"6\", \"H\"]]    // Straight\n) == \"LT\");\n\nassert(poker.check_win(\n    [[\"A\", \"H\"], [\"2\", \"H\"], [\"3\", \"H\"], [\"4\", \"H\"], [\"5\", \"H\"]],   // Ace Low Straight Flush\n    [[\"2\", \"H\"], [\"3\", \"H\"], [\"4\", \"H\"], [\"5\", \"H\"], [\"6\", \"H\"]]    // Straight Flush\n) == \"LT\");\n\n} // main\n\nmain();\n"
  },
  {
    "path": "test/vm/test_std.js",
    "content": "import {equals, sort, reverse, compare} from \"std\";\n\nfunction main() {\n\nassert(equals(1, 1));\nassert(equals(1, 2) == false);\nassert(equals(1, true) == false);\nassert(equals(null, null));\nassert(equals(null, false) == false);\nassert(equals(true, true));\nassert(equals([], []));\nassert(equals([1, 2], [1, 2]));\nassert(equals([1, 2], [1, 3]) == false);\nassert(equals([1, 2], [2, 1]) == false);\nassert(equals([1, 2], [1, 2, 3]) == false);\nassert(equals([1, 2, 3], [1, 2]) == false);\n\nassert(equals(sort([]), []));\nassert(equals(sort([1]), [1]));\nassert(equals(sort([5, 2, 9, 1, 5, 6]), [1, 2, 5, 5, 6, 9]));\nassert(equals(sort([1, 2, 3, 4, 5, 6]), [1, 2, 3, 4, 5, 6]));\n\nassert(equals(reverse([]), []));\nassert(equals(reverse([1]), [1]));\nassert(equals(reverse([1, 2]), [2, 1]));\nassert(equals(reverse([1, 2, 3]), [3, 2, 1]));\n\nassert(compare(0, 1) == \"LT\");\nassert(compare(1, 0) == \"GT\");\nassert(compare(1, 1) == \"EQ\");\nassert(compare([], []) == \"EQ\");\nassert(compare([0], [0]) == \"EQ\");\nassert(compare([1, 2], [1, 2]) == \"EQ\");\nassert(compare([1, 2], [1, 3]) == \"LT\");\nassert(compare([0, 2], [1, 2]) == \"LT\");\nassert(compare([1, 3], [1, 2]) == \"GT\");\nassert(compare([2, 2], [1, 2]) == \"GT\");\nassert(compare([0, 0], [1, 0]) == \"LT\");\nassert(compare([0, 1], [0, 0]) == \"GT\");\n\n} // main\n\nmain();\n"
  },
  {
    "path": "test_all.sh",
    "content": "#!/bin/bash\n\nset -e\n\nrm -rf tmp\n\n./scripts/reset_coverage.sh\n\necho \"Unit tests [mmx_tests]\"\n./build/test/mmx_tests\n\necho \"Unit tests [test_database]\"\n./build/test/test_database\n\necho \"Unit tests [vm_engine_tests]\"\n./build/test/vm_engine_tests\n\necho \"Unit tests [vm_storage_tests]\"\n./build/test/vm_storage_tests\n\n./test/vm/engine_tests.sh\n\n./test/vm/contract_tests.sh\n\n"
  },
  {
    "path": "tools/CMakeLists.txt",
    "content": "\nadd_executable(tx_bench tx_bench.cpp)\nadd_executable(mmx_compile mmx_compile.cpp)\nadd_executable(mmx_postool mmx_postool.cpp)\nadd_executable(mmx_posbench mmx_posbench.cpp)\nadd_executable(dump_table dump_table.cpp)\nadd_executable(dump_binary dump_binary.cpp)\nadd_executable(generate_passwd generate_passwd.cpp)\nadd_executable(calc_test_rewards calc_test_rewards.cpp)\n\ntarget_link_libraries(tx_bench mmx_iface)\ntarget_link_libraries(mmx_compile mmx_iface mmx_vm)\ntarget_link_libraries(mmx_postool mmx_iface mmx_pos)\ntarget_link_libraries(mmx_posbench mmx_iface mmx_pos)\ntarget_link_libraries(dump_table mmx_iface mmx_db)\ntarget_link_libraries(dump_binary mmx_iface mmx_vm)\ntarget_link_libraries(generate_passwd mmx_iface)\ntarget_link_libraries(calc_test_rewards mmx_iface)\n\ninstall(TARGETS\n\tmmx_compile mmx_postool mmx_posbench\n\tDESTINATION bin\n)\ninstall(TARGETS\n\tgenerate_passwd dump_binary tx_bench\n\tDESTINATION ${NODE_INSTALL_PATH}/bin\n)\n"
  },
  {
    "path": "tools/calc_test_rewards.cpp",
    "content": "/*\n * calc_test_rewards.cpp\n *\n *  Created on: Oct 10, 2022\n *      Author: mad\n */\n\n#include <mmx/BlockHeader.hxx>\n#include <mmx/Transaction.hxx>\n#include <mmx/ProofOfSpaceOG.hxx>\n#include <mmx/NodeClient.hxx>\n\n#include <vnx/vnx.h>\n#include <vnx/Proxy.h>\n\nusing namespace mmx;\n\n\nint main(int argc, char** argv)\n{\n\tstd::map<std::string, std::string> options;\n\toptions[\"s\"] = \"start\";\n\toptions[\"e\"] = \"end\";\n\toptions[\"j\"] = \"json\";\n\toptions[\"r\"] = \"reward\";\n\toptions[\"start\"] = \"height\";\n\toptions[\"end\"] = \"height\";\n\toptions[\"reward\"] = \"MMX\";\n\toptions[\"timelord\"] = \"TL rewards\";\n\n\tvnx::init(\"calc_test_rewards\", argc, argv, options);\n\n\tuint32_t start_height = 25000;\n\tuint32_t end_height = -1;\n\tdouble reward = 0;\n\tbool json = false;\n\tbool timelord = false;\n\tvnx::read_config(\"start\", start_height);\n\tvnx::read_config(\"end\", end_height);\n\tvnx::read_config(\"reward\", reward);\n\tvnx::read_config(\"json\", json);\n\tvnx::read_config(\"timelord\", timelord);\n\n\tif(reward <= 0) {\n\t\tif(timelord) {\n\t\t\treward = 0.01;\n\t\t} else {\n\t\t\treward = 0.5;\n\t\t}\n\t}\n\n\tvnx::Handle<vnx::Proxy> proxy = new vnx::Proxy(\"Proxy\", vnx::Endpoint::from_url(\":11330\"));\n\tproxy->forward_list = {\"Node\"};\n\tproxy.start();\n\n\tNodeClient node(\"Node\");\n\n\tstd::map<addr_t, size_t> reward_count;\n\n\tfor(uint32_t height = start_height; height <= end_height; ++height)\n\t{\n\t\tconst auto block = node.get_header_at(height);\n\t\tif(!block) {\n\t\t\tbreak;\n\t\t}\n\t\tif(timelord) {\n\t\t\tfor(auto addr : block->vdf_reward_addr) {\n\t\t\t\treward_count[addr]++;\n\t\t\t}\n\t\t} else {\n\t\t\tif(auto addr = block->reward_addr) {\n\t\t\t\treward_count[*addr]++;\n\t\t\t}\n\t\t}\n\t}\n\n\tif(json) {\n\t\tstd::cout << vnx::to_string(reward_count) << std::endl;\n\t}\n\telse {\n\t\tstd::vector<std::pair<addr_t, size_t>> sorted(reward_count.begin(), reward_count.end());\n\t\tstd::sort(sorted.begin(), sorted.end(),\n\t\t\t[](const std::pair<addr_t, size_t>& L, const std::pair<addr_t, size_t>& R) -> bool {\n\t\t\t\treturn L.second > R.second;\n\t\t\t});\n\t\tfor(const auto& entry : sorted) {\n\t\t\tstd::cout << entry.first << \"\\t\" << entry.second << \"\\t\" << entry.second * reward << std::endl;\n\t\t}\n\t}\n\n\tvnx::close();\n\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "tools/dump_binary.cpp",
    "content": "/*\n * dump_binary.cpp\n *\n *  Created on: Jan 6, 2023\n *      Author: mad\n */\n\n#include <mmx/contract/Binary.hxx>\n#include <mmx/vm_interface.h>\n\n#include <vnx/vnx.h>\n\n\nint main(int argc, char** argv)\n{\n\tstd::map<std::string, std::string> options;\n\toptions[\"f\"] = \"file\";\n\toptions[\"m\"] = \"method\";\n\n\tvnx::init(\"dump_binary\", argc, argv, options);\n\n\tvnx::optional<std::string> method;\n\tvnx::read_config(\"method\", method);\n\n\tstd::string file_name;\n\tif(vnx::read_config(\"file\", file_name))\n\t{\n\t\tif(auto bin = vnx::read_from_file<mmx::contract::Binary>(file_name))\n\t\t{\n\t\t\tmmx::vm::dump_code(std::cout, bin, method);\n\t\t}\n\t\telse {\n\t\t\tstd::cerr << \"Not a binary!\" << std::endl;\n\t\t}\n\t}\n\n\tvnx::close();\n\n\treturn 0;\n}\n\n\n"
  },
  {
    "path": "tools/dump_table.cpp",
    "content": "/*\n * dump_table.cpp\n *\n *  Created on: Oct 22, 2023\n *      Author: mad\n */\n\n#include <mmx/DataBase.h>\n\n\nint main(int argc, char** argv)\n{\n\tif(argc < 1) {\n\t\treturn -1;\n\t}\n\tmmx::Table table(argv[1]);\n\n\tmmx::Table::Iterator iter(&table);\n\n\titer.seek_begin();\n\n\twhile(iter.is_valid())\n\t{\n\t\tconst auto key = iter.key();\n\t\tconst auto value = iter.value();\n\t\tstd::cout << \"[\" << key->to_hex_string() << \"] => \" << value->to_hex_string() << std::endl;\n\n\t\titer.next();\n\t}\n\tstd::cout << \"version = \" << table.current_version() << std::endl;\n}\n\n\n"
  },
  {
    "path": "tools/generate_passwd.cpp",
    "content": "/*\n * generate_passwd.cpp\n *\n *  Created on: May 24, 2022\n *      Author: mad\n */\n\n#include <mmx/hash_t.hpp>\n\n#include <iostream>\n\n\nint main()\n{\n\tstd::cout << mmx::hash_t::secure_random().to_string() << std::endl;\n\treturn 0;\n}\n\n"
  },
  {
    "path": "tools/mmx_compile.cpp",
    "content": "/*\n * mmx_compile.cpp\n *\n *  Created on: Apr 19, 2023\n *      Author: mad\n */\n\n#include <mmx/Transaction.hxx>\n#include <mmx/contract/Binary.hxx>\n#include <mmx/contract/Executable.hxx>\n#include <mmx/vm/Compiler.h>\n#include <mmx/vm/Engine.h>\n#include <mmx/vm/StorageRAM.h>\n#include <mmx/vm/StorageCache.h>\n#include <mmx/vm_interface.h>\n#include <mmx/skey_t.hpp>\n#include <mmx/pubkey_t.hpp>\n#include <mmx/signature_t.hpp>\n#include <mmx/secp256k1.hpp>\n#include <mmx/utils.h>\n\n#include <vnx/vnx.h>\n\nusing namespace mmx;\n\n\nint main(int argc, char** argv)\n{\n\tmmx::secp256k1_init();\n\n\tstd::map<std::string, std::string> options;\n\toptions[\"f\"] = \"files\";\n\toptions[\"o\"] = \"output\";\n\toptions[\"t\"] = \"txmode\";\n\toptions[\"v\"] = \"verbose\";\n\toptions[\"e\"] = \"execute\";\n\toptions[\"n\"] = \"network\";\n\toptions[\"w\"] = \"commit\";\n\toptions[\"g\"] = \"gas\";\n\toptions[\"O\"] = \"opt-level\";\n\toptions[\"files\"] = \"source files\";\n\toptions[\"output\"] = \"output name\";\n\toptions[\"gas\"] = \"gas limit\";\n\toptions[\"assert-fail\"] = \"assert fail\";\n\n\tvnx::write_config(\"log_level\", 2);\n\n\tvnx::init(\"mmx_compile\", argc, argv, options);\n\n\tcompile_flags_t flags;\n\n\tint verbose = 0;\n\tint opt_level = 3;\n\tbool txmode = false;\n\tbool execute = false;\n\tbool commit = false;\n\tbool assert_fail = false;\n\tuint64_t gas_limit = -1;\n\tstd::string network = \"mainnet\";\n\tstd::string output;\n\tstd::vector<std::string> file_names;\n\tvnx::read_config(\"verbose\", verbose);\n\tvnx::read_config(\"opt-level\", opt_level);\n\tvnx::read_config(\"txmode\", txmode);\n\tvnx::read_config(\"execute\", execute);\n\tvnx::read_config(\"commit\", commit);\n\tvnx::read_config(\"network\", network);\n\tvnx::read_config(\"output\", output);\n\tvnx::read_config(\"files\", file_names);\n\tvnx::read_config(\"gas\", gas_limit);\n\tvnx::read_config(\"assert-fail\", assert_fail);\n\n\tflags.verbose = verbose;\n\tflags.opt_level = opt_level;\n\n\tint ret_value = 0;\n\tstd::shared_ptr<const contract::Binary> binary;\n\n\ttry {\n\t\tif(file_names.empty()) {\n\t\t\tstd::string source;\n\t\t\tstd::vector<char> buffer(4096);\n\t\t\twhile(std::cin.read(buffer.data(), buffer.size()) || std::cin.gcount() > 0) {\n\t\t\t\tconst auto bytes_read = std::cin.gcount();\n\t\t\t\tsource += std::string(buffer.data(), bytes_read);\n\t\t\t}\n\t\t\tbinary = vm::compile(source, flags);\n\t\t} else {\n\t\t\tbinary = vm::compile_files(file_names, flags);\n\t\t}\n\t}\n\tcatch(const std::exception& ex) {\n\t\tstd::cerr << \"Compilation failed with:\" << std::endl << \"\\t\" << ex.what() << std::endl;\n\t\tvnx::close();\n\t\treturn 1;\n\t}\n\n\tif(!output.empty()) {\n\t\tif(txmode) {\n\t\t\tauto tx = Transaction::create();\n\t\t\ttx->deploy = binary;\n\t\t\ttx->network = network;\n\t\t\ttx->id = tx->calc_hash(false);\n\t\t\ttx->content_hash = tx->calc_hash(true);\n\t\t\tvnx::write_to_file(output, tx);\n\t\t\tstd::cout << addr_t(tx->id).to_string() << std::endl;\n\t\t} else {\n\t\t\tvnx::write_to_file(output, binary);\n\t\t}\n\t}\n\n\tif(execute) {\n\t\tif(verbose) {\n\t\t\tstd::cerr << \"-------------------------------------------\" << std::endl;\n\t\t}\n\t\tconst auto time_begin = vnx::get_wall_time_micros();\n\n\t\tauto storage = std::make_shared<vm::StorageRAM>();\n\t\tauto engine = std::make_shared<vm::Engine>(hash_t(\"__test\"), storage, false);\n\t\tengine->is_debug = verbose;\n\t\tengine->gas_limit = gas_limit;\n\n\t\tuint32_t height = 0;\n\t\tstd::map<addr_t, std::shared_ptr<const Contract>> contract_map;\n\t\tstd::map<addr_t, std::shared_ptr<const contract::Binary>> binary_map;\n\n\t\tengine->log_func = [](uint32_t level, const std::string& msg) {\n\t\t\tstd::cout << \"LOG[\" << level << \"] \" << msg << std::endl;\n\t\t};\n\t\tengine->event_func = [&engine](const std::string& name, const uint64_t data) {\n\t\t\tstd::cout << \"EVENT[\" << name << \"] \" << vm::read(engine, data).to_string() << std::endl;\n\t\t};\n\t\tconst auto main_engine = engine;\n\t\tstd::function<void(std::weak_ptr<vm::Engine>, const std::string&, const std::string&, const uint32_t)> remote_call;\n\n\t\tremote_call = [verbose, network, storage, &main_engine, &height, &contract_map, &binary_map, &remote_call]\n\t\t\t(std::weak_ptr<vm::Engine> w_engine, const std::string& name, const std::string& method, const uint32_t nargs)\n\t\t{\n\t\t\tconst auto engine = w_engine.lock();\n\t\t\tconst addr_t address = hash_t(name);\n\t\t\tstd::shared_ptr<const contract::Executable> exec;\n\t\t\t{\n\t\t\t\tauto iter = contract_map.find(address);\n\t\t\t\tif(iter != contract_map.end()) {\n\t\t\t\t\texec = std::dynamic_pointer_cast<const contract::Executable>(iter->second);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst auto stack_ptr = engine->get_stack_ptr();\n\t\t\tengine->write(stack_ptr, vm::var_t());\n\n\t\t\tif(exec) {\n\t\t\t\tconst auto cache = std::make_shared<vm::StorageCache>(storage);\n\t\t\t\tconst auto child = std::make_shared<vm::Engine>(address, cache, false);\n\t\t\t\tchild->gas_limit = engine->gas_limit;\n\t\t\t\tchild->log_func = [](uint32_t level, const std::string& msg) {\n\t\t\t\t\tstd::cout << \"LOG[\" << level << \"] \" << msg << std::endl;\n\t\t\t\t};\n\t\t\t\tchild->event_func = [&child](const std::string& name, const uint64_t data) {\n\t\t\t\t\tstd::cout << \"EVENT[\" << name << \"] \" << vm::read(child, data).to_string() << std::endl;\n\t\t\t\t};\n\t\t\t\tchild->remote_call = std::bind(remote_call, child, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);\n\t\t\t\tchild->read_contract = [&child, &contract_map]\n\t\t\t\t\t(const addr_t& address, const std::string& field, const uint64_t dst)\n\t\t\t\t{\n\t\t\t\t\tauto iter = contract_map.find(address);\n\t\t\t\t\tif(iter != contract_map.end()) {\n\t\t\t\t\t\tvm::assign(child, dst, iter->second->read_field(field));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow std::logic_error(\"no such contract: \" + address.to_string());\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tbool assert_fail = false;\n\t\t\t\tvnx::optional<addr_t> user = engine->contract;\n\t\t\t\tvnx::optional<std::pair<uint128, addr_t>> deposit;\n\n\t\t\t\tfor(uint32_t i = 0; i < nargs; ++i) {\n\t\t\t\t\tconst auto src = stack_ptr + 1 + i;\n\t\t\t\t\tconst auto arg = vm::read(engine, src);\n\t\t\t\t\tif(arg.is_object()) {\n\t\t\t\t\t\tauto opt = arg.to_object();\n\t\t\t\t\t\tif(opt[\"__test\"]) {\n\t\t\t\t\t\t\tconst auto& value = opt[\"user\"];\n\t\t\t\t\t\t\tif(!value.empty()) {\n\t\t\t\t\t\t\t\tvalue.to(user);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(const auto& value = opt[\"deposit\"]) {\n\t\t\t\t\t\t\t\tif(value.is_object()) {\n\t\t\t\t\t\t\t\t\tauto obj = value.to_object();\n\t\t\t\t\t\t\t\t\tdeposit = std::make_pair(obj[\"amount\"].to<uint128>(), obj[\"currency\"].to<addr_t>());\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tvalue.to(deposit);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\topt[\"assert_fail\"].to(assert_fail);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(engine == main_engine && !is_json(arg)) {\n\t\t\t\t\t\tthrow std::logic_error(\"argument not strict json: \" + arg.to_string());\n\t\t\t\t\t}\n\t\t\t\t\tvm::copy(child, engine, vm::MEM_STACK + 1 + i, src);\n\t\t\t\t}\n\n\t\t\t\tif(verbose && (!user || *user != engine->contract)) {\n\t\t\t\t\tstd::cout << \"user = \" << vnx::to_string(user) << std::endl;\n\t\t\t\t}\n\t\t\t\tif(deposit) {\n\t\t\t\t\tconst auto& amount = deposit->first;\n\t\t\t\t\tconst auto& currency = deposit->second;\n\t\t\t\t\tvm::set_deposit(child, currency, amount);\n\t\t\t\t\tif(verbose) {\n\t\t\t\t\t\tstd::cout << \"deposit = \" << amount.to_string() << \" [\" << currency.to_string() << \"]\" << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\tconst auto balance = cache->get_balance(address, currency);\n\t\t\t\t\tcache->set_balance(address, currency, (balance ? *balance : uint128()) + amount);\n\t\t\t\t}\n\t\t\t\tif(user) {\n\t\t\t\t\tchild->write(vm::MEM_EXTERN + vm::EXTERN_USER, vm::to_binary(*user));\n\t\t\t\t} else {\n\t\t\t\t\tchild->write(vm::MEM_EXTERN + vm::EXTERN_USER, vm::var_t());\n\t\t\t\t}\n\t\t\t\tchild->write(vm::MEM_EXTERN + vm::EXTERN_ADDRESS, vm::to_binary(address));\n\t\t\t\tchild->write(vm::MEM_EXTERN + vm::EXTERN_NETWORK, vm::to_binary(network));\n\t\t\t\tchild->write(vm::MEM_EXTERN + vm::EXTERN_HEIGHT, vm::uint_t(height));\n\t\t\t\tchild->write(vm::MEM_EXTERN + vm::EXTERN_TXID, vm::to_binary(addr_t()));\n\n\t\t\t\tstd::shared_ptr<const contract::Binary> binary;\n\t\t\t\t{\n\t\t\t\t\tauto iter = binary_map.find(exec->binary);\n\t\t\t\t\tif(iter != binary_map.end()) {\n\t\t\t\t\t\tbinary = iter->second;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(!binary) {\n\t\t\t\t\tthrow std::logic_error(\"no such binary: \" + exec->binary.to_string());\n\t\t\t\t}\n\t\t\t\tconst auto func = vm::find_method(binary, method);\n\t\t\t\tif(!func) {\n\t\t\t\t\tthrow std::logic_error(\"no such method: \" + method);\n\t\t\t\t}\n\t\t\t\tif(!func->is_payable && deposit) {\n\t\t\t\t\tthrow std::logic_error(\"method does not allow deposit: \" + method);\n\t\t\t\t}\n\t\t\t\tvm::load(child, binary);\n\n\t\t\t\tbool did_fail = true;\n\t\t\t\ttry {\n\t\t\t\t\tvm::execute(child, *func, false);\n\t\t\t\t\tdid_fail = false;\n\t\t\t\t}\n\t\t\t\tcatch(const std::exception& ex) {\n\t\t\t\t\tif(verbose) {\n\t\t\t\t\t\tif(assert_fail) {\n\t\t\t\t\t\t\tstd::cout << name << \".\" << method << \"() failed as expected: \"\n\t\t\t\t\t\t\t\t\t<< ex.what()  << \" (code \" << child->error_code << \")\" << std::endl;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstd::cerr << name << \".\" << method << \"() failed at \" << vm::to_hex(child->error_addr)\n\t\t\t\t\t\t\t\t\t<< \" line \" << vnx::to_string(binary->find_line(child->error_addr))\n\t\t\t\t\t\t\t\t\t<< \" with: \" << ex.what() << \" (code \" << child->error_code << \")\" << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!assert_fail) {\n\t\t\t\t\t\tthrow;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(assert_fail) {\n\t\t\t\t\tif(!did_fail) {\n\t\t\t\t\t\tthrow std::logic_error(\"expected call to fail\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif(verbose) {\n\t\t\t\t\t\tstd::cout << name << \".\" << method << \"() => \"\n\t\t\t\t\t\t\t\t<< vm::read(child, vm::MEM_STACK).to_string() << std::endl;\n\t\t\t\t\t}\n\t\t\t\t\tfor(const auto& out : child->outputs) {\n\t\t\t\t\t\tif(verbose) {\n\t\t\t\t\t\t\tstd::cout << \">>> \" << out.amount.to_string()\n\t\t\t\t\t\t\t\t\t<< \" [\" << out.contract.to_string() << \"] to \" << out.address.to_string() << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst auto src_bal = cache->get_balance(address, out.contract);\n\t\t\t\t\t\tif(!src_bal || (*src_bal) < out.amount) {\n\t\t\t\t\t\t\tthrow std::logic_error(\"insufficient funds\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcache->set_balance(address, out.contract, (*src_bal) - out.amount);\n\n\t\t\t\t\t\tconst auto dst_bal = cache->get_balance(out.address, out.contract);\n\t\t\t\t\t\tcache->set_balance(out.address, out.contract, (dst_bal ? *dst_bal : uint128()) + out.amount);\n\t\t\t\t\t}\n\t\t\t\t\tfor(const auto& out : child->mint_outputs) {\n\t\t\t\t\t\tif(verbose) {\n\t\t\t\t\t\t\tstd::cout << \"--> \" << out.amount.to_string()\n\t\t\t\t\t\t\t\t\t<< \" [\" << out.contract.to_string() << \"] to \" << out.address.to_string() << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst auto dst_bal = cache->get_balance(out.address, out.contract);\n\t\t\t\t\t\tcache->set_balance(out.address, out.contract, (dst_bal ? *dst_bal : uint128()) + out.amount);\n\t\t\t\t\t}\n\t\t\t\t\tvm::copy(engine, child, stack_ptr, vm::MEM_STACK);\n\t\t\t\t\tif(!func->is_const) {\n\t\t\t\t\t\tchild->commit();\n\t\t\t\t\t}\n\t\t\t\t\tcache->commit();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(name != \"__test\") {\n\t\t\t\tif(method == \"__deploy\") {\n\t\t\t\t\tconst auto contract = vm::read(engine, stack_ptr + 1).to<std::shared_ptr<const Contract>>();\n\t\t\t\t\tif(!contract) {\n\t\t\t\t\t\tthrow std::logic_error(\"invalid __deploy()\");\n\t\t\t\t\t}\n\t\t\t\t\tconst addr_t address = hash_t(name);\n\t\t\t\t\tcontract_map[address] = contract;\n\n\t\t\t\t\tbool is_fail = false;\n\t\t\t\t\tif(auto exec = std::dynamic_pointer_cast<const contract::Executable>(contract)) {\n\t\t\t\t\t\tengine->call(0, 3);\n\t\t\t\t\t\tuint32_t i = 1;\n\t\t\t\t\t\tfor(const auto& arg : exec->init_args) {\n\t\t\t\t\t\t\tif(arg.is_object()) {\n\t\t\t\t\t\t\t\tauto obj = arg.to_object();\n\t\t\t\t\t\t\t\tif(obj[\"__test\"] && obj[\"assert_fail\"].to<bool>()) {\n\t\t\t\t\t\t\t\t\tis_fail = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvm::assign(engine, engine->get_stack_ptr() + i, arg); i++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tengine->remote_call(name, exec->init_method, exec->init_args.size());\n\t\t\t\t\t\tengine->ret();\n\t\t\t\t\t}\n\t\t\t\t\tif(is_fail) {\n\t\t\t\t\t\tif(verbose) {\n\t\t\t\t\t\t\tstd::cout << \"Deployment of '\" << name << \"' failed as expected\" << std::endl;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontract_map.erase(address);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif(verbose) {\n\t\t\t\t\t\t\tstd::cout << \"Deployed '\" << name << \"' as \" << address.to_string() << std::endl << vnx::to_pretty_string(contract);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tengine->write(stack_ptr, vm::to_binary(address));\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthrow std::logic_error(\"invalid remote call: \" + name + \".\" + method + \"()\");\n\t\t\t}\n\t\t\tif(method == \"set_height\") {\n\t\t\t\theight = vm::read(engine, stack_ptr + 1).to<uint32_t>();\n\t\t\t\tif(verbose) {\n\t\t\t\t\tstd::cout << \"height = \" << height << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(method == \"inc_height\") {\n\t\t\t\theight += vm::read(engine, stack_ptr + 1).to<uint32_t>();\n\t\t\t\tif(verbose) {\n\t\t\t\t\tstd::cout << \"height = \" << height << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(method == \"get_height\") {\n\t\t\t\tengine->write(stack_ptr, vm::uint_t(height));\n\t\t\t}\n\t\t\telse if(method == \"get_balance\") {\n\t\t\t\tconst auto address = vm::read(engine, stack_ptr + 1).to<addr_t>();\n\t\t\t\tconst auto currency = vm::read(engine, stack_ptr + 2).to<addr_t>();\n\t\t\t\tif(auto balance = storage->get_balance(address, currency)) {\n\t\t\t\t\tengine->write(stack_ptr, vm::uint_t(*balance));\n\t\t\t\t} else {\n\t\t\t\t\tengine->write(stack_ptr, vm::uint_t());\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(method == \"assert\") {\n\t\t\t\tif(!vm::read(engine, stack_ptr + 1)) {\n\t\t\t\t\tif(auto msg = vm::read(engine, stack_ptr + 2)) {\n\t\t\t\t\t\tthrow std::logic_error(\"assert failed (\" + msg.to_string_value() + \")\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow std::logic_error(\"assert failed\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(method == \"get_public_key\") {\n\t\t\t\tconst auto skey = vm::read(engine, stack_ptr + 1).to<skey_t>();\n\t\t\t\tengine->write(stack_ptr, vm::to_binary(pubkey_t(skey)));\n\t\t\t}\n\t\t\telse if(method == \"ecdsa_sign\") {\n\t\t\t\tconst auto skey = vm::read(engine, stack_ptr + 1).to<skey_t>();\n\t\t\t\tconst auto hash = vm::read(engine, stack_ptr + 2).to<hash_t>();\n\t\t\t\tengine->write(stack_ptr, vm::to_binary(signature_t::sign(skey, hash)));\n\t\t\t}\n\t\t\telse if(method == \"send\") {\n\t\t\t\tconst auto dst = vm::read(engine, stack_ptr + 1);\n\t\t\t\tconst auto amount = engine->read_fail<vm::uint_t>(stack_ptr + 2, vm::TYPE_UINT).value;\n\t\t\t\tconst auto currency = vm::read(engine, stack_ptr + 3).to<addr_t>();\n\t\t\t\tif(amount >> 128) {\n\t\t\t\t\tthrow std::logic_error(\"amount too large\");\n\t\t\t\t}\n\t\t\t\taddr_t address;\n\t\t\t\tstd::string dst_name;\n\t\t\t\tif(dst.is_string()) {\n\t\t\t\t\tdst_name = dst.to_string_value();\n\t\t\t\t\taddress = hash_t(dst_name);\n\t\t\t\t} else {\n\t\t\t\t\taddress = dst.to<addr_t>();\n\t\t\t\t\tdst_name = address.to_string();\n\t\t\t\t}\n\t\t\t\tconst auto balance = storage->get_balance(address, currency);\n\t\t\t\tstorage->set_balance(address, currency, (balance ? *balance : uint128()) + amount.lower());\n\t\t\t\tif(verbose) {\n\t\t\t\t\tstd::cout << \"--> \" << amount.str(10) << \" [\" << currency.to_string() << \"] to \" << dst_name << std::endl;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if(method == \"compile\") {\n\t\t\t\tconst auto list = vm::read(engine, stack_ptr + 1).to<std::vector<std::string>>();\n\t\t\t\tconst auto flags = vm::read(engine, stack_ptr + 2).to<compile_flags_t>();\n\t\t\t\tif(verbose) {\n\t\t\t\t\tstd::cout << \"Compiling \" << vnx::to_string(list) << std::endl << vnx::to_pretty_string(flags);\n\t\t\t\t}\n\t\t\t\tconst auto bin = vm::compile_files(list, flags);\n\t\t\t\tconst addr_t addr = bin->calc_hash();\n\t\t\t\tif(verbose) {\n\t\t\t\t\tstd::cout << \"binary = \" << addr.to_string() << std::endl;\n\t\t\t\t}\n\t\t\t\tbinary_map[addr] = bin;\n\t\t\t\tengine->write(stack_ptr, vm::to_binary(addr));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthrow std::logic_error(\"invalid __test method: \" + method);\n\t\t\t}\n\t\t};\n\n\t\tengine->remote_call = std::bind(\n\t\t\t\tremote_call, std::weak_ptr<vm::Engine>(engine),\n\t\t\t\tstd::placeholders::_1, std::placeholders::_2, std::placeholders::_3);\n\n\t\tvm::load(engine, binary);\n\n\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_USER, vm::var_t());\n\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_ADDRESS, vm::to_binary(engine->contract));\n\t\tengine->write(vm::MEM_EXTERN + vm::EXTERN_NETWORK, vm::to_binary(network));\n\t\tengine->begin(0);\n\n\t\ttry {\n\t\t\tengine->run();\n\t\t\tif(commit) {\n\t\t\t\tengine->commit();\n\t\t\t\tif(verbose) {\n\t\t\t\t\tstd::cerr << \"-------------------------------------------\" << std::endl;\n\t\t\t\t\tstorage->dump_memory(std::cerr);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch(const std::exception& ex) {\n\t\t\tif(verbose || !assert_fail) {\n\t\t\t\tstd::cerr << \"Failed at \" << vm::to_hex(engine->error_addr)\n\t\t\t\t\t\t<< \" line \" << vnx::to_string(binary->find_line(engine->error_addr))\n\t\t\t\t\t\t<< \" with: \" << ex.what() << \" (code \" << engine->error_code << \")\" << std::endl;\n\t\t\t}\n\t\t\tret_value = 1;\n\t\t}\n\t\tif(assert_fail) {\n\t\t\tif(ret_value) {\n\t\t\t\tret_value = 0;\n\t\t\t} else {\n\t\t\t\tstd::cerr << \"Expected execution failure on \" << vnx::to_string(file_names) << std::endl;\n\t\t\t\tret_value = 1;\n\t\t\t}\n\t\t}\n\t\tif(verbose) {\n\t\t\tconst auto exec_time_ms = (vnx::get_wall_time_micros() - time_begin) / 1e3;\n\t\t\tstd::cerr << \"-------------------------------------------\" << std::endl;\n\t\t\tstd::cerr << \"Total cost: \" << engine->gas_used << std::endl;\n\t\t\tstd::cerr << \"Execution time: \" << exec_time_ms << \" ms\" << std::endl;\n\t\t\tstd::cerr << \"Execution time cost: \" << exec_time_ms / (engine->gas_used / 1e6) << \" ms/MMX\" << std::endl;\n\t\t}\n\t}\n\n\tvnx::close();\n\n\tmmx::secp256k1_free();\n\n\treturn ret_value;\n}\n\n"
  },
  {
    "path": "tools/mmx_posbench.cpp",
    "content": "/*\n * mmx_posbench.cpp\n *\n *  Created on: Feb 5, 2025\n *      Author: mad\n */\n\n#include <mmx/utils.h>\n#include <mmx/pos/verify.h>\n#include <vnx/vnx.h>\n#include <thread>\n\n#ifdef WITH_CUDA\n#include <mmx/pos/cuda_recompute.h>\n#endif\n\n\nint main(int argc, char** argv)\n{\n\tstd::map<std::string, std::string> options;\n\toptions[\"n\"] = \"iter\";\n\toptions[\"k\"] = \"ksize\";\n\toptions[\"r\"] = \"threads\";\n\toptions[\"v\"] = \"verbose\";\n\toptions[\"C\"] = \"clevel\";\n\toptions[\"cuda\"] = \"flag\";\n\toptions[\"devices\"] = \"CUDA devices\";\n\toptions[\"iter\"] = \"number of iterations\";\n\toptions[\"threads\"] = \"number of threads\";\n\n\tvnx::write_config(\"log_level\", 2);\n\n\tvnx::init(\"mmx_posbench\", argc, argv, options);\n\n\tint num_iter = 0;\n\tint num_threads = 0;\n\tint ksize = 32;\n\tint clevel = 0;\n\tbool cuda = true;\n\tbool verbose = false;\n\tstd::vector<int> cuda_devices;\n\n\tvnx::read_config(\"iter\", num_iter);\n\tvnx::read_config(\"threads\", num_threads);\n\tvnx::read_config(\"ksize\", ksize);\n\tvnx::read_config(\"clevel\", clevel);\n\tvnx::read_config(\"verbose\", verbose);\n\tvnx::read_config(\"cuda\", cuda);\n\tvnx::read_config(\"devices\", cuda_devices);\n\n\tif(num_threads <= 0) {\n\t\tnum_threads = std::max(std::thread::hardware_concurrency(), 16u);\n\t}\n\tif(num_iter <= 0) {\n\t\tnum_iter = std::max(1 << std::max(16 - clevel, 0), 4);\n\t}\n\n\tstd::cout << \"Threads: \" << num_threads << std::endl;\n\tstd::cout << \"Iterations: \" << num_iter << std::endl;\n\n#ifdef WITH_CUDA\n\tif(cuda) {\n\t\tstd::cout << \"CUDA available: yes\" << std::endl;\n\t} else {\n\t\tstd::cout << \"CUDA available: disabled\" << std::endl;\n\t}\n\tmmx::pos::cuda_recompute_init(cuda, cuda_devices);\n\tstd::this_thread::sleep_for(std::chrono::milliseconds(200));\t// wait for CUDA alloc\n#else\n\tstd::cout << \"CUDA available: no\" << std::endl;\n#endif\n\n\tvnx::ThreadPool threads(num_threads, 1000);\n\n\tmmx::hash_t plot_id;\n\tstd::vector<uint32_t> x_values;\n\tvnx::from_string(\"60C67427E27FBD77C8BDFF5EB1CC3696C08926FA12BCE8B1AE48E87099F9366B\", plot_id);\n\tvnx::from_string(\"[3684070240, 4088919472, 4255854024, 2557705011, 2826775019, 784116104, 3002057429, 1544955509, 1600690361, 1551417277, 2728397286, 1771107893, 1187799433, 1044600637, 1880286022, 1921473397, 4059605908, 3921758377, 1663788388, 2187951111, 1469314847, 2221602546, 3049849478, 2483049477, 783906790, 1769349661, 627534699, 1664365119, 3108470239, 4050165503, 1719994423, 2296755013, 3689388662, 173076783, 178304083, 3395522713, 1454472817, 3194528037, 1512291786, 1987638418, 1143780087, 3120478614, 2855051906, 693584283, 3818941816, 4127002689, 2989697755, 3891407791, 2509655266, 4258376726, 1843252036, 3191219821, 2088352375, 213252018, 4115819364, 3175076101, 3561808706, 1948511669, 3322128563, 3750559212, 2272209440, 1293941526, 437177217, 2820197201, 3807400022, 7496129, 2683510002, 3807839482, 2233243744, 2411092355, 1331204979, 2038088672, 2167782813, 3830146105, 537456114, 2401528407, 2652250456, 2221908904, 890566783, 708924513, 2596290458, 340917615, 3250050811, 3771386335, 3494357838, 1179822413, 2341748577, 602106011, 1122065619, 252962133, 278550961, 1768804869, 669497081, 1990086308, 2491380917, 51625349, 4207300886, 3095591768, 1852131389, 609642249, 2918683512, 2059312217, 3335572914, 2736167997, 1528047374, 4124848408, 902683345, 4263117025, 108772979, 485864815, 2410357795, 908723453, 1183430568, 2815414658, 2737238764, 2669408162, 2850938826, 2890536155, 491707862, 2553723643, 1034532861, 3214153497, 3097594346, 2701020101, 678153046, 2932267943, 1365864923, 532310940, 2351720145, 4080824906, 2893128375, 2595930727, 1064911548, 3834810248, 3565525092, 163085774, 685730942, 2810511962, 2540444228, 1857924416, 4174369771, 2145288036, 587439552, 718732787, 1169724691, 3254817017, 3946843084, 954721517, 3373230078, 3637676521, 1331632982, 4086478124, 4116294100, 4120279824, 476981752, 2430423022, 220679215, 4117454286, 4166904409, 2171504903, 2001727739, 3383221100, 2596677253, 988991329, 2638232513, 1095569023, 3303068778, 1931231583, 2226576220, 1480273400, 3911488963, 1608929138, 1376754282, 61629307, 3957255986, 514129543, 2169952004, 3308565016, 3572656193, 1573653323, 961047589, 2310528924, 2099635716, 817068327, 3653864895, 4168803514, 2147588334, 2794673138, 492271828, 3268899536, 1623851505, 1985375222, 396546240, 3609981176, 2079278511, 2161006185, 2007577134, 2954139926, 1277553298, 3205868414, 4257573912, 3376256719, 4227206123, 585150605, 2904436845, 2619013042, 3125718317, 3035845111, 2049651560, 161957643, 393761167, 2783560380, 1211203226, 3313590097, 479870197, 830535414, 3613172362, 3953259697, 265953611, 1493207470, 955279780, 2133758876, 2884678190, 3234737433, 1365475005, 2908229202, 2072744826, 4263640821, 2236131683, 894009793, 307201858, 3291293763, 2184230914, 776021200, 867100221, 4032840254, 2454442006, 1289389606, 1247346023, 386849697, 1757849095, 973341783, 3958516371, 1277136670, 205471439, 2514111789, 1777386820, 1436581469, 1494466641, 512070215, 2845825157, 329403080, 1115243938, 4009264613, 3806285763, 3170487941]\", x_values);\n\n\tfor(auto& x : x_values) {\n\t\tx >>= clevel;\n\t}\n\n\tstd::atomic<int64_t> progress {0};\n\tconst auto time_begin = mmx::get_time_ms();\n\n\tfor(int i = 0; i < num_iter; ++i)\n\t{\n\t\tthreads.add_task([&]() {\n\t\t\tif(!vnx::do_run()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstd::vector<uint32_t> x_out;\n\t\t\tconst auto entries = mmx::pos::compute(x_values, &x_out, plot_id, 32, clevel);\n\t\t\tif(entries.empty() || x_out.size() != entries.size() * 256) {\n\t\t\t\tthrow std::logic_error(\"invalid proof\");\n\t\t\t}\n\t\t\tif((progress++) % std::max((num_iter / 100), 1) == 0) {\n\t\t\t\tstd::cout << \".\";\n\t\t\t\tstd::cout.flush();\n\t\t\t}\n\t\t});\n\t}\n\n\tthreads.sync();\n\n\tconst auto elapsed_sec = (mmx::get_time_ms() - time_begin) / 1e3;\n\n\tstd::cout << std::endl;\n\tif(verbose) {\n\t\tstd::cout << \"Took \" << elapsed_sec << \" sec\" << std::endl;\n\t}\n\tconst double proof_time = elapsed_sec / num_iter;\n\tstd::cout << \"Proof time: \" << proof_time << \" sec (average)\" << std::endl;\n\n\tconst double max_plots_ssd = 8.0 / proof_time;\n\tconst double max_plots_hdd = max_plots_ssd * 1024;\n\n\tconst double saved_per_level = 1.0 * pow(1024, 3) / pow(1000, 3) / pow(2, 32 - ksize);\t// GB\n\n\tconst double plot_size = mmx::get_effective_plot_size(ksize) / pow(1000, 3);\n\tconst double plot_size_hdd = plot_size - saved_per_level * clevel;\n\tconst double plot_size_ssd = plot_size / 2.5 - saved_per_level * clevel;\n\n\tconst double max_farm_size_ssd = max_plots_ssd * plot_size_ssd / pow(1000, 2);\n\tconst double max_farm_size_hdd = max_plots_hdd * plot_size_hdd / pow(1000, 2);\n\n\tconst double GiB_factor = pow(1000, 3) / pow(1024, 3);\n\tconst double PiB_factor = pow(1000, 5) / pow(1024, 5);\n\n\tstd::cout << \"Plot: k\" << ksize << \" C\" << clevel << std::endl;\n\tstd::cout << \"Plot Size (SSD): \" << plot_size_ssd << \" GB / \" << plot_size_ssd * GiB_factor << \" GiB\" << std::endl;\n\tstd::cout << \"Plot Size (HDD): \" << plot_size_hdd << \" GB / \" << plot_size_hdd * GiB_factor << \" GiB\" << std::endl;;\n\tstd::cout << \"Max Farm Size (SSD): \" << max_farm_size_ssd << \" PB / \" << max_farm_size_ssd * PiB_factor << \" PiB\" << std::endl;\n\tstd::cout << \"Max Farm Size (HDD): \" << max_farm_size_hdd << \" PB / \" << max_farm_size_hdd * PiB_factor << \" PiB\" << std::endl;\n\n#ifdef WITH_CUDA\n\tmmx::pos::cuda_recompute_shutdown();\n#endif\n\n\tvnx::close();\n\n\treturn 0;\n}\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "tools/mmx_postool.cpp",
    "content": "/*\n * mmx_postool.cpp\n *\n *  Created on: Apr 5, 2024\n *      Author: mad\n */\n\n#include <mmx/pos/Prover.h>\n#include <mmx/pos/verify.h>\n\n#include <vnx/vnx.h>\n#include <cmath>\n#include <thread>\n\n#ifdef WITH_CUDA\n#include <mmx/pos/cuda_recompute.h>\n#endif\n\nusing namespace mmx;\n\n\nint main(int argc, char** argv)\n{\n\tmmx::secp256k1_init();\n\n\tstd::map<std::string, std::string> options;\n\toptions[\"f\"] = \"file\";\n\toptions[\"n\"] = \"iter\";\n\toptions[\"r\"] = \"threads\";\n\toptions[\"v\"] = \"verbose\";\n\toptions[\"D\"] = \"verbose-debug\";\n\toptions[\"file\"] = \"plot files\";\n\toptions[\"cuda\"] = \"flag\";\n\toptions[\"devices\"] = \"CUDA devices\";\n\toptions[\"plotdir\"] = \"plot files directory\";\n\toptions[\"iter\"] = \"number of iterations\";\n\toptions[\"threads\"] = \"number of threads\";\n\n\tvnx::write_config(\"log_level\", 2);\n\n\tvnx::init(\"mmx_postool\", argc, argv, options);\n\n\tbool debug = false;\n\tbool verbose = false;\n\tbool cuda = true;\n\tint num_iter = 10;\n\n\tconst auto processor_count = std::thread::hardware_concurrency();\n\tint num_threads = processor_count ? processor_count : 16;\n\tint plot_filter = 4;\n\tint post_filter = 10;\n\tstd::vector<std::string> file_names;\n\tstd::vector<std::string> dir_names;\n\tstd::vector<int> cuda_devices;\n\n\tvnx::read_config(\"verbose-debug\", debug);\n\tvnx::read_config(\"verbose\", verbose);\n\tvnx::read_config(\"file\", file_names);\n\tvnx::read_config(\"plotdir\", dir_names);\n\tvnx::read_config(\"iter\", num_iter);\n\tvnx::read_config(\"threads\", num_threads);\n\tvnx::read_config(\"cuda\", cuda);\n\tvnx::read_config(\"devices\", cuda_devices);\n\n\tif(debug) {\n\t\tverbose = true;\n\t}\n\tif(verbose) {\n\t\tstd::cout << \"Threads: \" << num_threads << std::endl;\n\t\tstd::cout << \"Iterations: \" << num_iter << std::endl;\n\t}\n\n#ifdef WITH_CUDA\n\tif(cuda) {\n\t\tstd::cout << \"CUDA available: yes\" << std::endl;\n\t} else {\n\t\tstd::cout << \"CUDA available: disabled\" << std::endl;\n\t}\n\tmmx::pos::cuda_recompute_init(cuda, cuda_devices);\n#else\n\tstd::cout << \"CUDA available: no\" << std::endl;\n#endif\n\n\tvnx::ThreadPool threads(num_threads, 10);\n\n\tstruct summary_t {\n\t\tstd::string file;\n\t\tbool valid = false;\n\t\tstd::atomic<uint32_t> num_pass {0};\n\t\tstd::atomic<uint32_t> num_proof {0};\n\t\tstd::atomic<uint32_t> num_fail {0};\n\t};\n\n\tstd::mutex mutex;\n\tstd::vector<std::shared_ptr<summary_t>> result;\n\n\tfor (const auto& dir_name : dir_names)\n\t{\n\t\ttry {\n\t\t\tvnx::Directory dir(dir_name);\n\n\t\t\tfor (const auto& file : dir.files()) {\n\t\t\t\tif (file && file->get_extension() == \".plot\") {\n\t\t\t\t\tfile_names.push_back(file->get_path());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (const std::exception& ex) {\n\t\t\tstd::cerr << \"Threw: \" << ex.what() << std::endl;\n\t\t}\n\t}\n\n\tfor(const auto& file_name : file_names)\n\t{\n\t\tauto out = std::make_shared<summary_t>();\n\t\tout->file = file_name;\n\t\ttry {\n\t\t\tauto prover = std::make_shared<pos::Prover>(file_name);\n\t\t\tprover->debug = debug;\n\n\t\t\tstd::cout << \"--------------------------------------------------------------------------------\" << std::endl;\n\t\t\tstd::cout << \"Checking '\" << file_name << \"'\" << std::endl;\n\n\t\t\tconst auto header = prover->get_header();\n\t\t\tif(verbose) {\n\t\t\t\tstd::cout << \"Size: \" << (header->has_meta ? \"HDD\" : \"SSD\") << \" K\" << header->ksize << \" C\" << prover->get_clevel()\n\t\t\t\t\t\t<< \" (\" << header->plot_size / pow(1024, 3) << \" GiB)\" << std::endl;\n\t\t\t\tstd::cout << \"Plot ID: \" << prover->get_plot_id().to_string() << std::endl;\n\t\t\t\tstd::cout << \"Farmer Key: \" << header->farmer_key.to_string() << std::endl;\n\t\t\t\tstd::cout << \"Contract: \" << (header->contract ? header->contract->to_string() : std::string(\"N/A\")) << std::endl;\n\t\t\t}\n\t\t\tout->valid = true;\n\n\t\t\tconst auto time_begin = vnx::get_wall_time_millis();\n\n\t\t\tfor(int iter = 0; iter < num_iter && vnx::do_run(); ++iter)\n\t\t\t{\n\t\t\t\tthreads.add_task([iter, prover, header, out, plot_filter, post_filter, verbose, debug, &mutex]()\n\t\t\t\t{\n\t\t\t\t\tconst auto plot_id = prover->get_plot_id();\n\t\t\t\t\tconst hash_t challenge(plot_id + std::to_string(iter));\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst auto qualities = prover->get_qualities(challenge, plot_filter);\n\n\t\t\t\t\t\tfor(const auto& entry : qualities) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif(!entry.valid) {\n\t\t\t\t\t\t\t\t\tthrow std::runtime_error(entry.error_msg);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(debug) {\n\t\t\t\t\t\t\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\t\t\t\t\t\t\tstd::cout << \"[\" << iter << \"] index = \" << entry.index << \", meta = \" << entry.meta.to_string() << std::endl;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstd::vector<uint32_t> proof;\n\t\t\t\t\t\t\t\tif(entry.proof.size()) {\n\t\t\t\t\t\t\t\t\tproof = entry.proof;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconst auto res = prover->get_full_proof(entry.index);\n\t\t\t\t\t\t\t\t\tif(!res.valid) {\n\t\t\t\t\t\t\t\t\t\tthrow std::runtime_error(entry.error_msg);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tproof = res.proof;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tpos::verify(proof, challenge, header->plot_id, plot_filter, 0, header->ksize, true);\n\t\t\t\t\t\t\t\tif(debug) {\n\t\t\t\t\t\t\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\t\t\t\t\t\t\tstd::cout << \"Proof \" << entry.index << \" passed: \";\n\t\t\t\t\t\t\t\t\tfor(const auto X : proof) {\n\t\t\t\t\t\t\t\t\t\tstd::cout << X << \" \";\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tstd::cout << std::endl;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(pos::check_post_filter(challenge, entry.meta, post_filter)) {\n\t\t\t\t\t\t\t\t\tout->num_proof++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tout->num_pass++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcatch(const std::exception& ex) {\n\t\t\t\t\t\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\t\t\t\t\t\tstd::cerr << \"Threw: \" << ex.what() << std::endl;\n\t\t\t\t\t\t\t\tout->num_fail++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcatch(const std::exception& ex) {\n\t\t\t\t\t\tstd::lock_guard<std::mutex> lock(mutex);\n\t\t\t\t\t\tstd::cerr << \"Threw: \" << ex.what() << std::endl;\n\t\t\t\t\t\tout->num_fail++;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tthreads.sync();\n\n\t\t\tconst auto time_end = vnx::get_wall_time_millis();\n\t\t\tconst auto elapsed = (time_end - time_begin) / 1e3;\n\n\t\t\tconst auto expected = uint64_t(num_iter) << plot_filter;\n\t\t\tstd::cout << \"Pass: \" << out->num_pass << \" / \" << expected << \", \" << float(100 * out->num_pass) / expected << \" %\" << std::endl;\n\t\t\tstd::cout << \"Fail: \" << out->num_fail << \" / \" << expected << \", \" << float(100 * out->num_fail) / expected << \" %\" << std::endl;\n\t\t\tif(verbose) {\n\t\t\t\tstd::cout << \"Proofs: \" << out->num_proof << \", \" << float(100 * out->num_proof) / expected << \" %\" << std::endl;\n\t\t\t}\n\n\t\t\tif(prover->has_meta()) {\n\t\t\t\tstd::cout << \"Full Proof Time: \" << elapsed / out->num_pass << \" sec (should be less than 20)\" << std::endl;\n\t\t\t} else {\n\t\t\t\tconst auto max_time = 8.0;\n\t\t\t\tconst auto plot_size = vnx::File(file_name).file_size();\n\t\t\t\tstd::cout << \"Max Farm Size: \" << double(plot_size) / pow(1024, 5) * max_time * out->num_pass / elapsed << \" PiB (physical)\" << std::endl;\n\t\t\t}\n\t\t\tif(!vnx::do_run()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tcatch(const std::exception& ex) {\n\t\t\tstd::cerr << \"--------------------------------------------------------------------------------\" << std::endl;\n\t\t\tstd::cerr << \"Failed to open plot \" << file_name << \": \" << ex.what() << std::endl;\n\t\t}\n\t\tresult.push_back(out);\n\t}\n\n\tstd::vector<std::string> bad_plots;\n\tfor(auto entry : result) {\n\t\tif(entry->num_fail > 1) {\n\t\t\tbad_plots.push_back(entry->file);\n\t\t}\n\t}\n\n\tstd::cout << \"--------------------------------------------------------------------------------\" << std::endl;\n\tstd::cout << \"Bad plots: \";\n\tif(bad_plots.empty()) {\n\t\tstd::cout << \"None\" << std::endl;\n\t} else {\n\t\tstd::cout << bad_plots.size() << std::endl;\n\t\tfor(auto file : bad_plots) {\n\t\t\tstd::cout << file << std::endl;\n\t\t}\n\t}\n\n\tthreads.close();\n\n#ifdef WITH_CUDA\n\tmmx::pos::cuda_recompute_shutdown();\n#endif\n\n\tvnx::close();\n\n\tmmx::secp256k1_free();\n\n\treturn bad_plots.size() ? -1 : 0;\n}\n\n\n"
  },
  {
    "path": "tools/tx_bench.cpp",
    "content": "/*\n * tx_bench.cpp\n *\n *  Created on: Dec 30, 2021\n *      Author: mad\n */\n\n#include <mmx/NodeClient.hxx>\n#include <mmx/WalletClient.hxx>\n\n#include <vnx/vnx.h>\n#include <vnx/Proxy.h>\n\n\nint main(int argc, char** argv)\n{\n\tstd::map<std::string, std::string> options;\n\toptions[\"n\"] = \"node\";\n\toptions[\"s\"] = \"speed\";\n\toptions[\"j\"] = \"index\";\n\toptions[\"a\"] = \"amount\";\n\toptions[\"t\"] = \"target\";\n\toptions[\"w\"] = \"swap\";\n\toptions[\"r\"] = \"fee-ratio\";\n\toptions[\"x\"] = \"contract\";\n\toptions[\"node\"] = \"address\";\n\toptions[\"speed\"] = \"TPS\";\n\toptions[\"index\"] = \"0\";\n\toptions[\"amount\"] = \"1000\";\n\toptions[\"target\"] = \"address\";\n\toptions[\"swap\"] = \"address\";\n\toptions[\"fee-ratio\"] = \"1\";\n\toptions[\"contract\"] = \"address\";\n\n\tvnx::write_config(\"log_level\", 2);\n\n\tvnx::init(\"tx_bench\", argc, argv, options);\n\n\tstd::string node_url = \":11331\";\n\tvnx::optional<mmx::addr_t> target;\n\tvnx::optional<mmx::addr_t> swap;\n\tmmx::addr_t contract;\n\tint64_t index = 0;\n\tmmx::uint128 amount = 1000;\n\tdouble speed = 1;\n\tdouble fee_ratio = 1;\n\tvnx::read_config(\"node\", node_url);\n\tvnx::read_config(\"speed\", speed);\n\tvnx::read_config(\"index\", index);\n\tvnx::read_config(\"amount\", amount);\n\tvnx::read_config(\"target\", target);\n\tvnx::read_config(\"swap\", swap);\n\tvnx::read_config(\"fee-ratio\", fee_ratio);\n\tvnx::read_config(\"contract\", contract);\n\n\tconst int64_t interval = 1e6 / speed;\n\n\tstd::cout << \"Sending amount \" << amount << \" at speed of \" << speed << \" TX/s\" << std::endl;\n\n\tmmx::NodeClient node(\"Node\");\n\tmmx::WalletClient wallet(\"Wallet\");\n\n\t{\n\t\tvnx::Handle<vnx::Proxy> module = new vnx::Proxy(\"Proxy\", vnx::Endpoint::from_url(node_url));\n\t\tmodule->forward_list = {\"Wallet\", \"Node\"};\n\t\tmodule.start_detached();\n\t}\n\tmmx::spend_options_t spend_options;\n\tspend_options.fee_ratio = fee_ratio * 1024;\n\n\tsize_t total = 0;\n\tsize_t counter = 0;\n\tint64_t time_next = vnx::get_wall_time_micros();\n\tint64_t last_info = time_next;\n\twhile(true)\n\t{\n\t\ttry {\n\t\t\tif(target) {\n\t\t\t\twallet.send(index, amount, *target, contract, spend_options);\n\t\t\t}\n\t\t\telse if(swap) {\n\t\t\t\twallet.swap_trade(index, *swap, amount, contract, nullptr, 5, spend_options);\n\t\t\t}\n\t\t\telse {\n\t\t\t\twallet.send(index, amount, mmx::hash_t::random(), contract, spend_options);\n\t\t\t}\n\t\t\tcounter++;\n\t\t\ttotal++;\n\t\t} catch(...) {\n\t\t\tif(vnx::do_run()) {\n\t\t\t\tthrow;\n\t\t\t}\n\t\t}\n\t\tif(total % 1000 == 0 || !vnx::do_run())\n\t\t{\n\t\t\tconst auto now = vnx::get_wall_time_micros();\n\t\t\tconst auto actual = (counter * 1e6) / (now - last_info);\n\t\t\tstd::cout << \"Sent \" << total << \" total so far, speed = \" << actual << \" TX/s\" << std::endl;\n\t\t\tlast_info = now;\n\t\t\tcounter = 0;\n\t\t}\n\t\tif(!vnx::do_run()) {\n\t\t\tbreak;\n\t\t}\n\t\ttime_next += interval;\n\t\tconst auto left = time_next - vnx::get_wall_time_micros();\n\t\tif(left > 0) {\n\t\t\tstd::this_thread::sleep_for(std::chrono::microseconds(left));\n\t\t}\n\t}\n\n\tvnx::close();\n\n\treturn 0;\n}\n\n\n\n\n\n"
  },
  {
    "path": "update.sh",
    "content": "#!/bin/bash\n\nset -e\n\ngit pull\ngit submodule update --init --recursive\n\n./make_devel.sh $@\n\n./activate.sh\n\n"
  },
  {
    "path": "vcpkg.json",
    "content": "{\r\n    \"name\": \"mmx-node\",\r\n    \"dependencies\": [\r\n        \"zlib\",\r\n        \"zstd\",\r\n        \"opencl\",\r\n        \"cuda\",\r\n        \"secp256k1\",\r\n        \"miniupnpc\"\r\n    ],\r\n    \"builtin-baseline\":\"74e6536215718009aae747d86d84b78376bf9e09\",\r\n    \"overrides\": [\r\n        { \"name\": \"secp256k1\", \"version\": \"2017-19-10#4\" }\r\n    ]\r\n}\r\n"
  },
  {
    "path": "www/.gitignore",
    "content": "node_modules\n"
  },
  {
    "path": "www/explorer/public/assets/fonts/material-icons/material-icons.css",
    "content": "/* material-icons-regular - latin */\r\n@font-face {\r\n  font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n  font-family: 'Material Design Icons';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  src: url('material-icons-v142-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n}\r\n"
  },
  {
    "path": "www/explorer/public/assets/fonts/roboto/roboto.css",
    "content": "/* roboto-100 - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n@font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 100;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-100.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-100italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 100;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-100italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-300 - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 300;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-300.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-300italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 300;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-300italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-regular - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 400;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 400;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-500 - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 500;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-500.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-500italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 500;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-500italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-700 - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 700;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-700italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 700;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-700italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-900 - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 900;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-900.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-900italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 900;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-900italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  "
  },
  {
    "path": "www/explorer/public/explorer.js",
    "content": "\nVue.component('explore-menu', {\n\tdata() {\n\t\treturn {\n\t\t\tinput: null,\n\t\t\terror: null\n\t\t}\n\t},\n\tmethods: {\n\t\tsubmit() {\n\t\t\tconst hex = /[0-9A-Fa-f]{8}/g;\n\t\t\tif(this.input) {\n\t\t\t\tthis.error = null;\n\t\t\t\tif(this.input.startsWith(\"mmx1\")) {\n\t\t\t\t\tthis.$router.push(\"/explore/address/\" + this.input);\n\t\t\t\t}\n\t\t\t\telse if(hex.test(this.input)) {\n\t\t\t\t\tif(this.input.length == 64) {\n\t\t\t\t\t\tfetch(WAPI_URL + '/header?hash=' + this.input)\n\t\t\t\t\t\t\t.then(response => {\n\t\t\t\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\t\t\t\tthis.$router.push(\"/explore/block/hash/\" + this.input);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tthis.$router.push(\"/explore/transaction/\" + this.input);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if(this.input.length == 66) {\n\t\t\t\t\t\tthis.$router.push(\"/explore/farmer/\" + this.input);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.error = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(parseInt(this.input) != NaN) {\n\t\t\t\t\tthis.$router.push(\"/explore/block/height/\" + this.input);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.error = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-text-field class=\"mx-2\"\n\t\t\t\tv-model=\"input\"\n\t\t\t\t@keyup.enter=\"submit\"\n\t\t\t\t@click:append=\"submit\"\n\t\t\t\t:error=\"error\"\n\t\t\t\t:placeholder=\"$t('explore_menu.placeholder')\"\n\t\t\t\tappend-icon=\"mdi-magnify\"></v-text-field>\n\n\t\t\t<v-tabs class=\"mb-2\">\n\t\t\t\t<v-tab to=\"/explore/blocks\">{{ $t('explore_menu.blocks') }}</v-tab>\n\t\t\t\t<v-tab to=\"/explore/transactions\">{{ $t('explore_menu.transactions') }}</v-tab>\n\t\t\t\t<v-tab to=\"/explore/farmers\">{{ $t('explore_menu.farmers') }}</v-tab>\n\t\t\t</v-tabs>\n\t\t</div>\n\t`\n})\n\nVue.component('blocks-table', {\n\tprops: {\n\t\tdata: [],\n\t\tloaded: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('explore_blocks.height'), value: 'height', width: \"5%\"},\n\t\t\t\t{ text: \"VDF\", value: 'vdf_count' },\n\t\t\t\t{ text: this.$t('explore_blocks.tx'), value: 'tx_count' },\n\t\t\t\t{ text: this.$t('explore_blocks.k'), value: 'ksize' },\n\t\t\t\t{ text: this.$t('explore_blocks.score'), value: 'score' },\n\t\t\t\t{ text: this.$t('explore_blocks.reward'), value: 'reward' },\n\t\t\t\t{ text: \"TX Fees\", value: 'tx_fees' },\n\t\t\t\t{ text: this.$t('explore_blocks.size'), value: 'static_cost_ratio' },\n\t\t\t\t{ text: this.$t('explore_blocks.cost'), value: 'total_cost_ratio' },\n\t\t\t\t{ text: this.$t('explore_blocks.hash'), value: 'hash' },\n\t\t\t]\n\t\t}\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.height=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/block/height/' + item.height\">{{item.height}}</router-link>\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.vdf_count=\"{ item }\">\n\t\t\t\t+{{item.vdf_count}}\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.ksize=\"{ item }\">\n\t\t\t\tk{{item.ksize}}\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.reward=\"{ item }\">\n\t\t\t\t{{item.reward_addr ? (item.reward_amount.value).toFixed(3) + \" MMX\" : null}}\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.tx_fees=\"{ item }\">\n\t\t\t\t{{item.tx_count ? (item.tx_fees.value).toFixed(3) + \" MMX\" : null}}\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.static_cost_ratio=\"{ item }\">\n\t\t\t\t{{(item.static_cost_ratio * 100).toFixed(1)}}&nbsp;%\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.total_cost_ratio=\"{ item }\">\n\t\t\t\t{{(item.total_cost_ratio * 100).toFixed(1)}}&nbsp;%\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.hash=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/block/hash/' + item.hash\">{{get_short_hash(item.hash, 16)}}</router-link>\n\t\t\t</template>\n\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('explore-blocks', {\n\tprops: {\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\ttimer: null,\n\t\t\tloaded: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch(WAPI_URL + '/headers?limit=' + this.limit)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<blocks-table :data=\"data\" :loaded=\"loaded\"></blocks-table>\n\t\t`\n})\n\nVue.component('explore-transactions', {\n\tprops: {\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\ttimer: null,\n\t\t\tloaded: false\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('explore_transactions.height'), value: 'height' },\n\t\t\t\t{ text: this.$t('explore_transactions.type'), value: 'type' },\n\t\t\t\t{ text: this.$t('explore_transactions.fee'), value: 'fee' },\n\t\t\t\t{ text: this.$t('explore_transactions.n_in'), value: 'inputs.length' },\n\t\t\t\t{ text: this.$t('explore_transactions.n_out'), value: 'outputs.length' },\n\t\t\t\t{ text: this.$t('explore_transactions.n_op'), value: 'operations.length' },\n\t\t\t\t{ text: this.$t('explore_transactions.transaction_id'), value: 'transaction_id' },\n\t\t\t\t{ text: this.$t('account_tx_history.time'), value: 'time' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch(WAPI_URL + '/transactions?limit=' + this.limit)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\t\t\t\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.height=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/block/height/' + item.height\">{{item.height}}</router-link>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.type=\"{ item }\">\n\t\t\t\t{{item.note ? item.note : \"\"}}\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.fee=\"{ item }\">\n\t\t\t\t<b :class=\"{'red--text': item.did_fail}\">{{item.fee.value}}</b>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.transaction_id=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/transaction/' + item.id\">{{get_short_hash(item.id, 16)}}</router-link>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.time=\"{ item }\">\n\t\t\t\t{{new Date(item.time_stamp).toLocaleString()}}\n\t\t\t</template>\n\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('explore-farmers', {\n\tprops: {\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\ttimer: null,\n\t\t\tloaded: false\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('explore_farmers.no_blocks'), value: 'block_count'},\n\t\t\t\t{ text: this.$t('explore_farmers.farmer_key'), value: 'farmer_key'},\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch(WAPI_URL + '/farmers?limit=' + this.limit)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 30000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t</template>\n\t\t\t<template v-slot:item.farmer_key=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/farmer/' + item.farmer_key\">{{item.farmer_key}}</router-link>\n\t\t\t</template>\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('block-view', {\n\tprops: {\n\t\thash: String,\n\t\theight: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tloading: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tlet url = null;\n\t\t\tif(this.hash) {\n\t\t\t\turl = WAPI_URL + '/block?hash=' + this.hash;\n\t\t\t}\n\t\t\tif(this.height >= 0) {\n\t\t\t\turl = WAPI_URL + '/block?height=' + this.height;\n\t\t\t}\n\t\t\tif(url) {\n\t\t\t\tthis.loading = true;\n\t\t\t\tfetch(url)\n\t\t\t\t\t.then(response => {\n\t\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\t\tresponse.json()\n\t\t\t\t\t\t\t\t.then(data => {\n\t\t\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\t\t\tthis.data = data;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\tthis.data = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\twatch: {\n\t\thash() {\n\t\t\tthis.update();\n\t\t},\n\t\theight() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-toolbar dense flat class=\"pa-0 no-padding\">\n\t\t\t\t<template v-if=\"data\">\n\t\t\t\t\t<v-btn outlined :to=\"'/explore/block/hash/' + data.prev\"><v-icon>mdi-arrow-left</v-icon>{{ $t('block_view.previous') }}</v-btn>\n\t\t\t\t\t<v-spacer></v-spacer>\n\t\t\t\t\t<v-btn outlined :to=\"'/explore/block/height/' + (data.height + 1)\">{{ $t('block_view.next') }}<v-icon>mdi-arrow-right</v-icon></v-btn>\n\t\t\t\t</template>\n\n\t\t\t\t<template v-if=\"!data && height\">\n\t\t\t\t\t<div v-if=\"height > 0\">\n\t\t\t\t\t\t<v-btn outlined :to=\"'/explore/block/height/' + (height - 1)\"><v-icon>mdi-arrow-left</v-icon>{{ $t('block_view.previous') }}</v-btn>\n\t\t\t\t\t</div>\n\t\t\t\t\t<v-spacer></v-spacer>\n\t\t\t\t\t<v-btn outlined :to=\"'/explore/block/height/' + (height + 1)\">{{ $t('block_view.next') }}<v-icon>mdi-arrow-right</v-icon></v-btn>\n\t\t\t\t</template>\n\t\t\t\t<v-progress-linear :active=\"loading\" indeterminate absolute top></v-progress-linear>\n\t\t\t</v-toolbar>\n\n\t\t\t<v-card class=\"my-2\">\n\t\t\t<v-card-text>\n\t\t\t\t<template v-if=\"data\">\n\t\t\t\t\t<v-chip label>{{ $t('block_view.block') }}</v-chip>\n\t\t\t\t\t<v-chip label>{{ data.height }}</v-chip>\n\t\t\t\t\t<v-chip label>{{ data.hash }}</v-chip>\n\t\t\t\t</template>\n\t\t\t\t\t\t\t\n\t\t\t\t<v-alert\n\t\t\t\t\tborder=\"left\"\n\t\t\t\t\tcolored-border\n\t\t\t\t\ttype=\"error\"\n\t\t\t\t\tv-if=\"!data && !loading\"\n\t\t\t\t\televation=\"2\"\n\t\t\t\t\tclass=\"my-2\"\n\t\t\t\t>\n\t\t\t\t\t{{ $t('block_view.no_such_block') }}\n\t\t\t\t</v-alert>\n\t\n\t\t\t\t<template v-if=\"data\">\n\t\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t\t<template v-slot:default>\n\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.height') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.height}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.hash') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.hash}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.previous') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.prev}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.time') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{new Date(data.time_stamp).toLocaleString()}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<template v-if=\"data.reward_addr\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Reward Address</td>\n\t\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.reward_addr\">{{data.reward_addr}}</router-link></td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<template v-if=\"data.reward_contract\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Reward Contract</td>\n\t\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.reward_contract\">{{data.reward_contract}}</router-link></td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<template v-if=\"data.reward_account\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Farmer Address</td>\n\t\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.reward_account\">{{data.reward_account}}</router-link></td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Block Reward</td>\n\t\t\t\t\t\t\t\t\t\t<td><b>{{data.reward_amount.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">TX Fees</td>\n\t\t\t\t\t\t\t\t\t\t<td><b>{{data.tx_fees.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.tx_count') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.tx_count}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.time_diff') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.time_diff}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.space_diff') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.space_diff}}<template v-if=\"data.is_space_fork\"> (updated)</template></td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Reward Vote</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.reward_vote}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Reward Vote Sum</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.reward_vote_sum}} / {{data.reward_vote_count}} ({{(data.reward_vote_count / ((data.height % 8640) + 1) * 100).toFixed(1)}} %)</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Base Reward</td>\n\t\t\t\t\t\t\t\t\t\t<td><b>{{data.base_reward.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Avg. TX Fee</td>\n\t\t\t\t\t\t\t\t\t\t<td><b>{{data.average_txfee.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">VDF Height</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.vdf_height}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">VDF Count</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.vdf_count}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.vdf_iterations') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.vdf_iters}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<template v-for=\"(addr, index) in data.vdf_reward_addr\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Timelord [{{index}}]</td>\n\t\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + addr\">{{addr}}</router-link></td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<template v-if=\"data.vdf_reward_payout\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Timelord Reward</td>\n\t\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.vdf_reward_payout\">{{data.vdf_reward_payout}}</router-link></td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.k_size') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.ksize}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.proof_score') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.score}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">No. Proofs</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.proof.length}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Space Fork</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.space_fork_proofs}} / {{data.space_fork_len}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<template v-if=\"data.proof[0]\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.plot_id') }}</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{{data.proof[0].plot_id}}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Challenge</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{{data.proof[0].challenge}}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.farmer_key') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/farmer/' + data.farmer_key\">{{data.farmer_key}}</router-link></td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</v-simple-table>\n\t\t\t\t\t</v-card>\n\t\n\t\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t\t<v-simple-table v-if=\"data.tx_list.length\">\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th class=\"key-cell\"></th>\n\t\t\t\t\t\t\t\t\t<th>{{ $t('block_view.inputs') }}</th>\n\t\t\t\t\t\t\t\t\t<th>{{ $t('block_view.outputs') }}</th>\n\t\t\t\t\t\t\t\t\t<th>{{ $t('block_view.operations') }}</th>\n\t\t\t\t\t\t\t\t\t<th>{{ $t('block_view.transaction_id') }}</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr v-for=\"(item, index) in data.tx_list\" :key=\"index\">\n\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">TX[{{index}}]</td>\n\t\t\t\t\t\t\t\t\t<td>{{item.inputs.length + (item.exec_result ? item.exec_result.inputs.length : 0)}}</td>\n\t\t\t\t\t\t\t\t\t<td>{{item.outputs.length + (item.exec_result ? item.exec_result.outputs.length : 0)}}</td>\n\t\t\t\t\t\t\t\t\t<td>{{item.execute.length}}</td>\n\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/transaction/' + item.id\">{{item.id}}</router-link></td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</v-simple-table>\n\t\t\t\t\t</v-card>\n\t\t\t\t</template>\n\t\t\t</v-card-text>\n\t\t\t</v-card>\n\t\t</div>\n\t`\n})\n\nVue.component('transaction-view', {\n\tprops: {\n\t\tid: String\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\ttimer: null,\n\t\t\tloading: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tif(this.id) {\n\t\t\t\tthis.loading = true;\n\t\t\t\tfetch(WAPI_URL + '/transaction?id=' + this.id)\n\t\t\t\t\t.then(response => {\n\t\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\t\tresponse.json()\n\t\t\t\t\t\t\t\t.then(data => {\n\t\t\t\t\t\t\t\t\tfor(const op of data.operations) {\n\t\t\t\t\t\t\t\t\t\tdelete op.solution;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\t\t\tthis.data = data;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\tthis.data = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\twatch: {\n\t\tid() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-card class=\"my-2\">\n\t\t<v-progress-linear :active=\"loading\" indeterminate absolute top></v-progress-linear>\n\t\t<v-card-text>\n\t\t\t<v-chip label>{{ $t('transaction_view.transaction') }}</v-chip>\n\t\t\t<v-chip label>{{ id }}</v-chip>\n\t\t\t\t\t\t\t\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\tv-if=\"!data && !loading\"\n\t\t\t\televation=\"2\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('transaction_view.no_such_transaction') }}\n\t\t\t</v-alert>\n\t\n\t\t\t<template v-if=\"data\">\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.height') }}</td>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<template v-if=\"data.height != null\">\n\t\t\t\t\t\t\t\t\t<router-link :to=\"'/explore/block/height/' + data.height\">{{data.height}}</router-link>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<template v-if=\"data.height == null\"><i>{{ $t('common.pending') }}</i></template>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.did_fail\" class=\"red--text\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.message') }}</td>\n\t\t\t\t\t\t\t<td>{{data.message}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.confirm\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.confirmed') }}</td>\n\t\t\t\t\t\t\t<td>{{data.confirm}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.expires < 4294967295\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.expires') }}</td>\n\t\t\t\t\t\t\t<td>{{data.expires}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.note') }}</td>\n\t\t\t\t\t\t\t<td>{{data.note}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.time\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.time') }}</td>\n\t\t\t\t\t\t\t<td>{{new Date(data.time_stamp).toLocaleString()}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.deployed\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.address') }}</td>\n\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.address\">{{data.address}}</router-link></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.sender\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.sender') }}</td>\n\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.sender\">{{data.sender}}</router-link></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.cost') }}</td>\n\t\t\t\t\t\t\t<td><b>{{data.cost.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.fee') }}</td>\n\t\t\t\t\t\t\t<td><b>{{data.fee.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table v-if=\"data.inputs.length\">\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th class=\"key-cell\"></th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.amount') }}</th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.token') }}</th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.address') }}</th>\n\t\t\t\t\t\t\t<th>Memo</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr v-for=\"(item, index) in data.inputs\" :key=\"index\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.input') }}[{{index}}]</td>\n\t\t\t\t\t\t\t<td><b>{{item.value}}</b></td>\n\t\t\t\t\t\t\t<template v-if=\"item.is_native\">\n\t\t\t\t\t\t\t\t<td>{{item.symbol}}</td>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<template v-if=\"!item.is_native\">\n\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.contract\">{{item.is_nft ? \"[NFT]\" : item.symbol}}</router-link></td>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.address\">{{item.address}}</router-link></td>\n\t\t\t\t\t\t\t<td>{{item.memo}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table v-if=\"data.outputs.length\">\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th class=\"key-cell\"></th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.amount') }}</th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.token') }}</th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.address') }}</th>\n\t\t\t\t\t\t\t<th>Memo</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr v-for=\"(item, index) in data.outputs\" :key=\"index\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.output') }}[{{index}}]</td>\n\t\t\t\t\t\t\t<td><b>{{item.value}}</b></td>\n\t\t\t\t\t\t\t<template v-if=\"item.is_native\">\n\t\t\t\t\t\t\t\t<td>{{item.symbol}}</td>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<template v-if=\"!item.is_native\">\n\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.contract\">{{item.is_nft ? \"[NFT]\" : item.symbol}}</router-link></td>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.address\">{{item.address}}</router-link></td>\n\t\t\t\t\t\t\t<td>{{item.memo}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\n\t\t\t\t<div class=\"my-2\" v-for=\"(op, index) in data.operations\" :key=\"index\">\t\t\t\t\n\t\t\t\t\t<v-chip label>Operation[{{index}}]</v-chip>\n\t\t\t\t\t<v-chip label>{{op.__type}}</v-chip>\n\t\t\t\t\t<object-table :data=\"op\" class=\"my-2\"></object-table>\n\t\t\t\t</div>\n\t\n\t\t\t\t<div class=\"my-2\" v-if=\"data.deployed\">\n\t\t\t\t\t<v-chip label>{{data.deployed.__type}}</v-chip>\n\t\t\t\t\t<object-table :data=\"data.deployed\" class=\"my-2\"></object-table>\n\t\t\t\t</div>\n\t\n\t\t\t</template>\n\t\t</v-card-text>\n\t\t</v-card>\n\t`\n})\n\nVue.component('farmer-view', {\n\tprops: {\n\t\tfarmer_key: String,\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tblocks: [],\n\t\t\ttimer: null,\n\t\t\tloaded: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch(WAPI_URL + '/farmer?id=' + this.farmer_key)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t});\n\t\t\tfetch(WAPI_URL + '/farmer/blocks?id=' + this.farmer_key + '&limit=' + this.limit)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.blocks = data;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 30000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-card class=\"my-2\">\n\t\t<v-card-text>\n\t\t\t<v-chip label>Farmer</v-chip>\n\t\t\t<v-chip label>{{farmer_key}}</v-chip>\n\t\t\t<template v-if=\"data\">\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">No. Blocks</td>\n\t\t\t\t\t\t\t<td>{{data.block_count}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">Total Rewards</td>\n\t\t\t\t\t\t\t<td><b>{{data.total_reward_value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>Reward</th>\n\t\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.address') }}</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr v-for=\"item in data.rewards\" :key=\"item.address\">\n\t\t\t\t\t\t\t<td><b>{{item.value}}</b></td>\n\t\t\t\t\t\t\t<td>MMX</td>\n\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.address\">{{item.address}}</router-link></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\t\t</template>\n\t\t\t<blocks-table :data=\"blocks\" :loaded=\"loaded\"></blocks-table>\n\t\t</v-card-text>\n\t\t</v-card>\n\t`\n})\n\nVue.component('address-view', {\n\tprops: {\n\t\taddress: String\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tthis.loading = true;\n\t\t\tfetch(WAPI_URL + '/contract?id=' + this.address)\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tresponse.json()\n\t\t\t\t\t\t\t.then(data => {\n\t\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\t\tthis.data = data;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\tthis.data = null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t},\n\twatch: {\n\t\taddress() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\ttemplate: `\n\t\t<v-card class=\"my-2\">\n\t\t<v-card-text>\n\t\t\t<v-chip label>{{ $t('common.address') }}</v-chip>\n\t\t\t<v-chip label>{{ address }}</v-chip>\n\n\t\t\t<balance-table :address=\"address\" :show_empty=\"true\" class=\"my-2\"></balance-table>\n\n\t\t\t<div v-if=\"data\">\n\t\t\t\t<v-chip label class=\"my-2\">{{ data.__type }}</v-chip>\n\t\t\t\t<object-table :data=\"data\"></object-table>\n\t\t\t</div>\n\n\t\t\t<address-history-table :address=\"address\" :limit=\"200\" :show_empty=\"false\" class=\"my-2\"></address-history-table>\n\t\t</v-card-text>\n\t\t</v-card>\n\t`\n})\n\nVue.component('address-history-table', {\n\tprops: {\n\t\taddress: String,\n\t\tlimit: Number,\n\t\tshow_empty: Boolean\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\tloaded: false,\n\t\t\ttimer: null\t\t\n\t\t}\n\t},\t\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('address_history_table.height'), value: 'height'},\n\t\t\t\t{ text: this.$t('address_history_table.type'), value: 'type'},\n\t\t\t\t{ text: this.$t('address_history_table.amount'), value: 'amount'},\n\t\t\t\t{ text: this.$t('address_history_table.token'), value: 'token'},\n\t\t\t\t{ text: \"Transaction ID\", value: 'txid'},\n\t\t\t\t{ text: \"Memo\", value: 'memo'},\n\t\t\t\t{ text: this.$t('address_history_table.time'), value: 'time'},\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch(WAPI_URL + '/address/history?limit=' + this.limit + '&id=' + this.address)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t\tthis.data = data;\n\t\t\t\t}).catch(() => {\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\twatch: {\n\t\taddress() {\n\t\t\tthis.update();\n\t\t},\n\t\tlimit() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 60000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t\tv-if=\"!loaded || loaded && (data.length || show_empty)\"\n\t\t>\n\t\t\t<template v-slot:item.height=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/block/height/' + item.height\">{{item.height}}</router-link>\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.type=\"{ item }\">\n\t\t\t\t<span :class=\"get_tx_type_color(item.type, $vuetify.theme.dark)\">{{item.type}}</span>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.amount=\"{ item }\">\n\t\t\t\t<b>{{ item.value }}</b>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.token=\"{ item }\">\n\t\t\t\t<template v-if=\"item.is_native\">\n\t\t\t\t\t{{item.symbol}}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<router-link :to=\"'/explore/address/' + item.contract\">{{item.is_nft ? \"[NFT]\" : item.symbol}}</router-link>\n\t\t\t\t</template>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.memo=\"{ item }\">\n\t\t\t\t<span style=\"word-break: break-all;\">{{ item.memo }}</span>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.txid=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/transaction/' + item.txid\">{{get_short_hash(item.txid)}}</router-link>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.time=\"{ item }\">\n\t\t\t\t<span class=\"text-no-wrap\">{{ new Date(item.time_stamp).toLocaleString() }}</span>\n\t\t\t</template>\n\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('object-table', {\n\tprops: {\n\t\tdata: Object\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttt: [],\n\t\t}\n\t},\n\tmethods: {\n\t\tstringify(value) {\n\t\t\treturn JSON.stringify(value, null, 4);\n\t\t}\n\t},\n\ttemplate: `\n\t\t<v-card>\n\t\t\t<v-simple-table class=\"object-table\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<template v-for=\"(value, key) in data\" :key=\"key\">\n\t\t\t\t\t\t<tr v-if=\"key != '__type'\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ key }}</td>\n\t\t\t\t\t\t\t<td v-if=\"value instanceof Object && value.length > 0\">\n\n\t\t\t\t\t\t\t\t\t<v-btn-toggle v-model=\"tt[key]\" class=\"float-right mr-n4\">\n\t\t\t\t\t\t\t\t\t\t<v-btn fab x-small> \n\t\t\t\t\t\t\t\t\t\t\t<v-icon v-if=\"tt[key] != 0\">mdi-arrow-expand</v-icon>\n\t\t\t\t\t\t\t\t\t\t\t<v-icon v-else>mdi-arrow-collapse</v-icon>\n\t\t\t\t\t\t\t\t\t\t</v-btn>\n\t\t\t\t\t\t\t\t\t</v-btn-toggle>\t\t\t\t\n\t\t\n\n\t\t\t\t\t\t\t\t<div v-if=\"tt[key] != 0\" style=\"overflow-wrap: anywhere;\">\n\t\t\t\t\t\t\t\t\t{{ value }}\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div v-else>\n\t\t\t\t\t\t\t\t\t<div style=\"white-space: pre-wrap; overflow-wrap: anywhere;\">{{ stringify(value) }}</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td v-else>\n\t\t\t\t\t\t\t\t{{ value }}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</template>\n\t\t\t\t</tbody>\n\t\t\t</v-simple-table>\n\t\t</v-card>\n\t\t`\n})\n"
  },
  {
    "path": "www/explorer/public/i18n.utils.js",
    "content": "\nconst availableLanguages = [\n    { code: \"en\", language: \"English\" },\n    { code: \"id\", language: \"Bahasa Indonesia\" },\n    { code: \"de\", language: \"Deutsch\" },\n    { code: \"es\", language: \"Español\" },\n    { code: \"nl\", language: \"Nederlands\" },\n    { code: \"pt\", language: \"Português\" },\n    { code: \"ru\", language: \"Русский\" },\n    { code: \"uk\", language: \"Українська\" },\n    { code: \"zh\", language: \"简体中文\" }\n];\n\nconst defaultLocale = 'en';\nconst loadedLanguages = ['en']\n\nconst i18n = new VueI18n({\n    globalInjection: true,\n    legacy: false,\n    locale: 'en',\n    fallbackLocale: 'en',\n    messages: { \n        'en': mergeDeep({}, commonLocale, enLocale)\n    }\n})\n\nfunction setI18nLanguage(locale) {\n\n    i18n.locale = locale\n\n    /**\n     * NOTE:\n     * If you need to specify the language setting for headers, such as the `fetch` API, set it here.\n     * The following is an example for axios.\n     *\n     * axios.defaults.headers.common['Accept-Language'] = locale\n     */\n    document.querySelector('html').setAttribute('lang', locale)\n}\n\n\nfunction isObject(item) {\n    return (item && typeof item === 'object' && !Array.isArray(item));\n}\n  \nfunction mergeDeep(target, ...sources) {\n\n    if (!sources.length) return target;\n    const source = sources.shift();\n\n    if (isObject(target) && isObject(source)) {\n        for (const key in source) {\n            if (isObject(source[key])) {\n                if (!target[key]) Object.assign(target, {\n                    [key]: {}\n                });\n                mergeDeep(target[key], source[key]);\n            } else {\n                Object.assign(target, {\n                    [key]: source[key]\n                });\n            }\n        }\n    }\n\n    return mergeDeep(target, ...sources);\n}\n\n\nfunction customFallback(msg) {\n    let result = mergeDeep({}, commonLocale, enLocale, msg)\n    return result;\n}   \n\nfunction loadLanguageAsync(locale) {\n    //console.log('loadLanguageAsync', locale);\n\n\t//if (i18n.locale === locale) {\n\t//\treturn Promise.resolve(setI18nLanguage(locale))\n\t//}\n\n\tif (loadedLanguages.includes(locale)) {\n\t\treturn Promise.resolve(setI18nLanguage(locale))\n\t}\n\n    if (availableLanguages.filter( lang => lang.code == locale ).length > 0 ) {\n        return fetch(`./locales/${locale}.json`).then(\n            response => response.json()\n        ).then(\n            messages => {            \n                messages = customFallback(messages);\n                i18n.setLocaleMessage(locale, messages);\n                //console.log('setLocaleMessage', locale, messages);\n                loadedLanguages.push(locale)\n                return setI18nLanguage(locale)\n            },\n        )\n    } else {\n        return Promise.resolve(setI18nLanguage(locale))\n    }\n}\n\n"
  },
  {
    "path": "www/explorer/public/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>Explorer - MMX</title>\n    <meta charset=\"utf-8\">\n    <link rel=\"icon\" type=\"image/x-icon\" href=\"favicon.ico\">\n\n    <link href=\"assets/fonts/roboto/roboto.css\" rel=\"stylesheet\">\n    <link href=\"assets/fonts/materialdesignicons/materialdesignicons.min.css\" rel=\"stylesheet\">\n    <link href=\"assets/vuetify/vuetify.min.css\" rel=\"stylesheet\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui\">\n\n    <script src=\"assets/vuetify/vue.min.js\"></script>\n    <script src=\"assets/vuetify/vue-i18n.min.js\"></script>\n    <script src=\"assets/vuetify/vue-router.min.js\"></script>\n    <script src=\"assets/vuetify/vuetify.min.js\"></script>\n\n    <script src=\"index.js\" defer></script>\n    <script src=\"explorer.js\" defer></script>\n        \n    <script src=\"locales/common.js\" defer></script>\n    <script src=\"locales/en.js\" defer></script>\n    <script src=\"i18n.utils.js\" defer></script>\n    \n    <script src=\"mount.js\" defer></script>\n\n\n    <style>\n        .theme--light.v-data-table tbody tr:nth-of-type(odd) td {\n            background-color: rgba(0, 0, 0, .03);\n        }\n        .theme--dark.v-data-table tbody tr:nth-of-type(odd) td {\n            background-color: rgba(0, 0, 0, .5);\n        }\n        .v-data-table.object-table tr:hover {\n            background: transparent !important;\n        }\n\n        .no-padding .v-toolbar__content {\n            padding-left: 0px;\n            padding-right: 0px;\n        }\n        .text-align-right .v-text-field__slot input {\n            text-align: right;\n        }\n        .key-cell {\n            min-width: 150px; \n            width: 5%;\n        }\n        .theme--dark .key-cell {\n            background-color: black !important;\n        }\n        .theme--light .key-cell {\n            background-color: #EEEEEE !important;\n        }\n        .v-tabs-bar {\n            background-color: transparent !important;\n        }\n    </style>\n</head>\n<body>\n    <div id=\"app\">\n        <app></app>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "www/explorer/public/index.js",
    "content": "\nconst WAPI_URL = \"https://rpc.mmx.network\";\n\nfunction validate_address(address) {\n\treturn address && address.length == 62 && address.startsWith(\"mmx1\");\n}\n\nfunction get_short_addr(address, length) {\n\tif(!length) {\n\t\tlength = 10;\n\t}\n\treturn address.substring(0, length) + '...' + address.substring(62 - length);\n}\n\nfunction get_short_hash(hash, length) {\n\tif(!length) {\n\t\tlength = 10;\n\t}\n\treturn hash.substring(0, length) + '...' + hash.substring(64 - length);\n}\n\nconst intl_format = new Intl.NumberFormat(navigator.language, {minimumFractionDigits: 1, maximumFractionDigits: 12});\n\nfunction amount_format(value) {\n\treturn intl_format.format(value);\n}\n\nfunction get_tx_type_color(type, dark = false) {\n\tif(type == \"REWARD\") return dark ? \"lime--text\" : \"lime--text text--darken-2\";\n\tif(type == \"RECEIVE\" || type == \"REWARD\" || type == \"VDF_REWARD\") return \"green--text\";\n\tif(type == \"SPEND\") return \"red--text\";\n\tif(type == \"TXFEE\") return \"grey--text\";\n\treturn \"\";\n}\n\nconst MMX_ADDR = \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\";\n\nconst Explore = {\n\ttemplate: `\n\t\t<div>\n\t\t\t<explore-menu></explore-menu>\n\t\t\t<router-view></router-view>\n\t\t<div>\n\t`\n}\nconst ExploreBlocks = {\n\ttemplate: `\n\t\t<explore-blocks :limit=\"20\"></explore-blocks>\n\t`\n}\nconst ExploreTransactions = {\n\ttemplate: `\n\t\t<explore-transactions :limit=\"100\"></explore-transactions>\n\t`\n}\nconst ExploreFarmers = {\n\ttemplate: `\n\t\t<explore-farmers :limit=\"200\"></explore-farmers>\n\t`\n}\nconst ExploreBlock = {\n\ttemplate: `\n\t\t<block-view :hash=\"$route.params.hash\" :height=\"parseInt($route.params.height)\"></block-view>\n\t`\n}\nconst ExploreFarmer = {\n\ttemplate: `\n\t\t<farmer-view :farmer_key=\"$route.params.id\" limit=\"100\"></farmer-view>\n\t`\n}\nconst ExploreAddress = {\n\ttemplate: `\n\t\t<address-view :address=\"$route.params.address\"></address-view>\n\t`\n}\nconst ExploreTransaction = {\n\ttemplate: `\n\t\t<transaction-view :id=\"$route.params.id\"></transaction-view>\n\t`\n}\n\nVue.component('main-menu', {\n\tmethods: {\n\t\ttoggle_dark_mode() {\n\t\t\tconst value = !this.$vuetify.theme.dark;\n\t\t\tthis.$vuetify.theme.dark = value;\n\t\t\tlocalStorage.setItem('theme_dark', value);\n\t\t}\n\t},\n\ttemplate: `\n\t\t<v-tabs>\n\t\t\t<v-img src=\"assets/img/logo_text_color_cy256_square.png\" class=\"mx-2\" :max-width=\"100\"/>\n\t\t\t<v-tab to=\"/explore\">{{ $t('main_menu.explore') }}</v-tab>\n\t\t\t<v-spacer></v-spacer>\n\t\t\t<v-btn icon color=\"info\" @click=\"toggle_dark_mode\">\n\t\t\t\t<v-icon class=\"m-1\">{{$vuetify.theme.dark ? 'mdi-moon-waxing-crescent' : 'mdi-white-balance-sunny'}}</v-icon>\n\t\t\t</v-btn>\n\t\t</v-tabs>\n\t\t`\n})\n\nVue.component('balance-table', {\n\tprops: {\n\t\taddress: String,\n\t\tshow_empty: Boolean\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\tloading: false,\n\t\t\tloaded: false,\n\t\t\ttimer: null\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('balance_table.balance'), value: 'total'},\n\t\t\t\t{ text: this.$t('balance_table.locked'), value: 'locked'},\n\t\t\t\t{ text: this.$t('balance_table.spendable'), value: 'spendable'},\n\t\t\t\t{ text: this.$t('balance_table.token'), value: 'symbol'},\n\t\t\t\t{ text: this.$t('balance_table.contract'), value: 'contract', width: '50%'},\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tthis.loading = true;\n\t\t\tfetch(WAPI_URL + '/balance?id=' + this.address)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t\tthis.data = data.balances;\n\t\t\t\t});\n\t\t}\n\t},\n\twatch: {\n\t\taddress() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t\tv-if=\"!loaded || loaded && (data.length || show_empty)\"\n\t\t>\n\t\t\t<template v-slot:item.total=\"{ item }\">\n\t\t\t\t<b>{{amount_format(item.total)}}</b>\n\t\t\t</template>\n\t\t\t<template v-slot:item.locked=\"{ item }\">\n\t\t\t\t<b>{{amount_format(item.locked)}}</b>\n\t\t\t</template>\n\t\t\t<template v-slot:item.spendable=\"{ item }\">\n\t\t\t\t<b>{{amount_format(item.spendable)}}</b>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.contract=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/address/' + item.contract\">{{item.is_native ? '' : item.contract}}</router-link>\n\t\t\t</template>\n\t\t</v-data-table>\n\n\t\t<template v-if=\"!data && loading\">\n\t\t\t<div class=\"ui basic loading placeholder segment\"></div>\n\t\t</template>\n\t\t</div>\n\t\t`\n})\n\nVue.component('app', {\n\tcomputed: {\n\t\tcolClass(){\n\t\t\treturn 'cols-12 col-xl-8 offset-xl-2';\n\t\t},\n\t\tfluid() {\n\t\t\treturn !(this.$vuetify.breakpoint.xl || this.$vuetify.breakpoint.lg);\n\t\t}\n\t},\n\ttemplate: `\n\t\t<v-app>\n\t\t\t<v-app-bar app dense>\n\t\t\t\t<v-container :fluid=\"fluid\" class=\"main_container\">\n\t\t\t\t\t<v-row>\n\t\t\t\t\t\t<v-col :class=\"colClass\">\n\t\t\t\t\t\t\t<main-menu></main-menu>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t</v-container>\n\t\t\t</v-app-bar>\n\t\t\t<v-main>\n\t\t\t\t<v-container :fluid=\"fluid\" class=\"main_container\">\n\t\t\t\t\t<v-row>\n\t\t\t\t\t\t<v-col :class=\"colClass\">\n\t\t\t\t\t\t\t<router-view></router-view>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t</v-container>\n\t\t\t</v-main>\n\t\t\t<!--v-footer app>\n\t\t\t</v-footer-->\n\t\t</v-app>\n\t\t`\n})\n\n"
  },
  {
    "path": "www/explorer/public/locales/common.js",
    "content": "const commonLocale = {\r\n    \"common\": {\r\n        \"reward_address_placeholder\": \"<@.lower:common.default>\"\r\n    },\r\n\r\n    \"main_menu\": {\r\n        \"node\": \"@:common.node\",\r\n        \"wallet\": \"@:common.wallet\"\r\n    },\r\n\r\n    \"node_menu\": {\r\n        \"netspace\": \"@:node_common.netspace\",\r\n        \"blocks\": \"@:common.blocks\",        \r\n        \"vdf_speed\": \"@:node_common.vdf_speed\",        \r\n        \"block_reward\": \"@:node_common.block_reward\"\r\n    },\r\n\r\n    \"node_info\": {\r\n        \"height\": \"@:common.height\",\r\n        \"netspace\": \"@:node_common.netspace\",\r\n        \"vdf_speed\": \"@:node_common.vdf_speed\",\r\n        \"block_reward\": \"@:node_common.block_reward\",\r\n        \"block_size\": \"@:node_common.block_size\"\r\n    },\r\n\r\n    \"node_log\": {\r\n        \"wallet\": \"@:common.wallet\",\r\n        \"node\": \"@:common.node\",\r\n        \"harvester\": \"@:common.harvester\",\r\n    },\r\n\r\n    \"harvester_settings\": {\r\n        \"harvester\": \"@:common.harvester\"\r\n    },\r\n\r\n    \"node_log_table\": {\r\n        \"time\": \"@:common.time\",\r\n    },\r\n\r\n    \"node_peers\": {\r\n    \t\"ip\": \"IP\",\r\n        \"height\": \"@:common.height\",\r\n        \"type\": \"@:common.type\"\r\n    },\r\n\r\n    \"netspace_graph\": {\r\n        \"title\": \"@:node_common.netspace ({0})\"\r\n    },\r\n\r\n    \"vdf_speed_graph\": {\r\n        \"title\": \"@:node_common.vdf_speed ({0})\"\r\n    },\r\n\r\n    \"block_reward_graph\": {\r\n        \"title\": \"@:node_common.block_reward ({0})\"\r\n    },\r\n    \r\n    \"tx_fees_graph\": {\r\n        \"title\": \"@:node_common.tx_fees ({0})\"\r\n    },    \r\n\r\n    \"wallet_summary\": {\r\n        \"new_wallet\": \"@:wallet_summary.new @:common.wallet\"\r\n    },\r\n\r\n    \"account_menu\": {\r\n        \"balance\": \"@:common.balance\",\r\n        \"log\": \"@:node_menu.log\"\r\n    },\r\n\r\n    \"account_header\": {\r\n        \"wallet\": \"@:common.wallet\"\r\n    },    \r\n\r\n    \"account_addresses\": {\r\n        \"address\": \"@:common.address\",\r\n    },\r\n\r\n    \"account_send_form\": {\r\n        \"amount\": \"@:common.amount\",\r\n        \"wallet\": \"@:common.wallet\", \r\n        \"confirm\": \"@:common.confirm\",\r\n        \"currency\": \"@:common.currency\"\r\n    },\r\n\r\n    \"wallet_settings\": {\r\n        \"name\": \"@:common.name\",\r\n        \"symbol\": \"@:common.symbol\",\r\n        \"contract\": \"@:common.contract\"\r\n    },\r\n\r\n    \"balance_table\": {\r\n        \"token\": \"@:common.token\",\r\n        \"balance\": \"@:common.balance\",\r\n        \"contract\": \"@:common.contract\"\r\n    },\r\n\r\n    \"account_balance\": {\r\n        \"balance\": \"@:common.balance\",\r\n        \"spendable\": \"@:balance_table.spendable\",\r\n        \"token\": \"@:common.token\",\r\n        \"contract\": \"@:balance_table.contract\"\r\n    },\r\n\r\n    \"account_plots\": {\r\n        \"balance\": \"@:common.balance\",\r\n        \"address\": \"@:common.address\"\r\n    },\r\n\r\n    \"account_history\": {\r\n        \"height\": \"@:common.height\",\r\n        \"type\": \"@:common.type\",\r\n        \"amount\": \"@:common.amount\",\r\n        \"token\": \"@:common.token\",\r\n        \"address\": \"@:common.address\",\r\n        \"time\": \"@:common.time\",\r\n        \"link\": \"@:common.link\"\r\n    },    \r\n\r\n    \"account_tx_history\": {\r\n        \"height\": \"@:common.height\",\r\n        \"confirmed\": \"@:transaction_view.confirmed\",\r\n        \"transaction_id\": \"@:explore_transactions.transaction_id\",\r\n        \"time\": \"@:common.time\",\r\n        \"status\": \"@:common.status\",\r\n        \"pending\": \"@:common.pending\",\r\n        \"expired\": \"@:common.expired\",\r\n        \"failed\": \"@:common.failed\"\r\n    },\r\n\r\n    \"account_offers\": {\r\n        \"any\": \"@:common.any\",\r\n        \"height\": \"@:common.height\",\r\n        \"address\": \"@:common.address\",\r\n        \"time\": \"@:common.time\",\r\n        \"deposit\": \"@:common.deposit\",\r\n        \"price\": \"@:common.price\"\r\n    },\r\n\r\n    \"account_offer_form\": {\r\n        \"confirm\": \"@:common.confirm\",\r\n    },    \r\n\r\n    \"explore_menu\": {\r\n        \"blocks\": \"@:common.blocks\",\r\n\r\n        \"transaction_id\": \"@:explore_transactions.transaction_id\",\r\n        \"address\": \"@.lower:common.address\",\r\n\r\n        \"placeholder\": \"@.lower:explore_menu.address | @.lower:explore_menu.transaction_id | @.lower:explore_menu.block_height\"\r\n    },\r\n\r\n    \"explore_blocks\": {\r\n        \"height\": \"@:common.height\",\r\n        \"reward\": \"@:common.reward\",\r\n        \"hash\": \"@:common.hash\"\r\n    },\r\n\r\n    \"explore_transactions\": {\r\n        \"height\": \"@:common.height\",\r\n\r\n        \"type\": \"@:common.type\",\r\n        \"fee\": \"@:common.fee\"\r\n    },\r\n\r\n    \"block_view\": {\r\n        \"height\": \"@:common.height\",\r\n        \"hash\": \"@:common.hash\",\r\n\r\n        \"amount\": \"@:common.amount\",\r\n        \"address\": \"@:common.address\",\r\n        \"reward\": \"@:common.reward\",        \r\n\r\n        \"time\": \"@:common.time\",\r\n\r\n        \"transaction_id\": \"@:explore_transactions.transaction_id\"     \r\n    },\r\n\r\n    \"address_history_table\": {\r\n        \"height\": \"@:common.height\",\r\n        \"type\": \"@:common.type\",\r\n        \"amount\": \"@:common.amount\",\r\n        \"token\": \"@:common.token\",\r\n        \"address\": \"@:common.address\",\r\n        \"time\": \"@:common.time\",\r\n        \"link\": \"@:common.link\"\r\n    },\r\n\r\n    \"transaction_view\": {\r\n\r\n        \"height\": \"@:common.height\",\r\n        \"time\": \"@:common.time\",\r\n        \"address\": \"@:common.address\",\r\n        \"fee\": \"@:common.fee\",\r\n        \"amount\": \"@:common.amount\",\r\n        \"token\": \"@:common.token\"\r\n    },\r\n\r\n    \"market_menu\": {\r\n        \"wallet\": \"@:common.wallet\"\r\n    },\r\n\r\n    \"market_offers\": {\r\n        \"price\": \"@:common.price\",\r\n        \"they_offer\": \"@:market_menu.they_offer\",\r\n        \"they_ask\": \"@:market_menu.they_ask\",\r\n        \"time\": \"@:common.time\",\r\n        \"link\": \"@:common.link\",\r\n        \"address\": \"@:common.address\",\r\n\r\n        \"accept\": \"@:common.accept\",\r\n        \"cancel\": \"@:common.cancel\"\r\n    },\r\n\r\n    \"account_history_form\": {\r\n        \"any\": \"@:common.any\"\r\n    },\r\n\r\n    \"farmer_blocks\": {\r\n        \"height\": \"@:common.height\",\r\n        \"reward\": \"@:common.reward\",\r\n        \"score\": \"@:explore_blocks.score\",\r\n        \"tx_fees\": \"@:node_common.tx_fees\",\r\n        \"time\": \"@:common.time\"\r\n    },\r\n\r\n    \"farmer_proofs\": {\r\n        \"height\": \"@:common.height\",\r\n        \"score\": \"@:explore_blocks.score\",\r\n        \"sdiff\": \"@:explore_blocks.sdiff\",\r\n        \"time\": \"@:common.time\",\r\n        \"plot_id\": \"@:block_view.plot_id\",\r\n        \"harvester\": \"@:common.harvester\"\r\n    },\r\n\r\n    \"swap\": {\r\n        \"volume_24h\": \"@:swap.volume (@:swap.24h)\",\r\n        \"volume_7d\": \"@:swap.volume (@:swap.7d)\"\r\n    }\r\n\r\n}"
  },
  {
    "path": "www/explorer/public/locales/en.js",
    "content": "const enLocale = {\r\n    \"common\": {\r\n        \"yes\": \"Yes\",\r\n        \"no\": \"No\",\r\n\r\n        \"default\": \"default\",\r\n\r\n        \"node\": \"Node\",\r\n        \"wallet\": \"Wallet\",\r\n        \"height\": \"Height\",\r\n        \"blocks\": \"Blocks\",\r\n        \"balance\": \"Balance\",\r\n        \"name\": \"Name\",\r\n        \"token\": \"Token\",\r\n        \"currency\": \"Currency\",\r\n        \"symbol\": \"Symbol\",\r\n        \"price\": \"Price\",\r\n        \"hash\": \"Hash\",\r\n        \"reward\": \"Reward\",\r\n        \"amount\": \"Amount\",\r\n        \"address\": \"Address\",\r\n        \"contract\": \"Contract\",\r\n        \"type\": \"Type\",\r\n        \"time\": \"Time\",\r\n        \"fee\": \"Fee\",\r\n        \"status\": \"Status\",\r\n        \"pending\": \"pending\",\r\n        \"expired\": \"expired\",\r\n        \"failed\": \"failed\",\r\n        \r\n        \"confirm\": \"Confirm\",\r\n        \"deploy\": \"Deploy\",\r\n        \"create\": \"Create\",\r\n        \"remove\": \"Remove\",\r\n\r\n        \"accept\": \"Accept\",\r\n        \"cancel\": \"Cancel\",\r\n\r\n        \"transaction_has_been_sent\": \"Transaction has been sent\",\r\n        \"failed_with\": \"Failed with\",\r\n        \"deployed_as\": \"Deployed as\",\r\n\r\n        \"any\": \"Any\",\r\n\r\n        \"link\": \"Link\",\r\n        \"owner\": \"Owner\",\r\n        \"manage\": \"Manage\",\r\n        \"harvester\": \"Harvester\",\r\n        \"deposit\": \"Deposit\",\r\n\r\n        \"user\": \"User\"\r\n    },\r\n\r\n    \"main_menu\": {\r\n        \"explore\": \"Explore\",\r\n        \"market\": \"Market\",\r\n        \"farmer\": \"Farmer\",\r\n        \"exchange\": \"Exchange\",\r\n        \"swap\": \"Swap\",\r\n        \"settings\": \"Settings\",\r\n        \"logout\": \"Logout\"\r\n    },\r\n\r\n    \"node_status\": {\r\n        \"disconnected\": \"Disconnected from node\",\r\n        \"logged_off\": \"Logged off\",\r\n        \"connecting\": \"Connecting...\",\r\n        \"syncing\": \"Syncing\",\r\n        \"synced\": \"Synced\"\r\n    },\r\n\r\n    \"node_common\": {\r\n        \"vdf_speed\": \"VDF Speed\",\r\n        \"block_reward\": \"Block Reward\",\r\n        \"block_size\": \"Block Size\",\r\n        \"tx_fees\": \"Transaction Fees\",\r\n        \"netspace\": \"Netspace\"\r\n    },\r\n\r\n    \"node_menu\": {\r\n        \"log\": \"Log\",\r\n        \"peers\": \"Peers\"\r\n    },\r\n\r\n    \"node_info\": {\r\n        \"synced\": \"Synced\",\r\n        \"supply\": \"Supply\",\r\n        \"no_addresses\": \"No. Addresses\"\r\n    },\r\n\r\n    \"farmer_info\": {\r\n        \"virtual_balance\": \"Virtual Balance\",\r\n        \"virtual_size\": \"Virtual Size\",\r\n        \"physical_size\": \"Physical Size\",\r\n        \"total_farm_size\": \"Total Farm Size\"\r\n    },\r\n\r\n    \"node_log\": {\r\n        \"terminal\": \"Terminal\",\r\n        \"router\": \"Router\",\r\n        \"farmer\": \"Farmer\",\r\n        \"timelord\": \"TimeLord\"\r\n    },\r\n\r\n    \"node_log_table\": {\r\n        \"module\": \"Module\",\r\n        \"message\": \"Message\"\r\n    },\r\n\r\n    \"node_peers\": {\r\n        \"version\": \"Version\",\r\n        \"received\": \"Received\",\r\n        \"send\": \"Sent\",\r\n        \"ping\": \"Ping\",\r\n        \"duration\": \"Duration\",\r\n        \"credits\": \"Credits\",\r\n        \"tx_gas\": \"TX Gas\",\r\n        \"connection\": \"Connection\",\r\n        \"outbound\": \"outbound\",\r\n        \"inbound\": \"inbound\"\r\n    },\r\n\r\n    \"wallet_summary\": {\r\n        \"new\": \"New\"\r\n    },\r\n\r\n    \"account_menu\": {\r\n        \"nfts\": \"NFTs\",\r\n        \"contracts\": \"Contracts\",\r\n        \"addresses\": \"Addresses\",\r\n        \"send\": \"Send\",\r\n        \"plots\": \"Plots\",\r\n        \"offer\": \"Offer\",\r\n        \"history\": \"History\",\r\n        \"liquidity\": \"Liquidity\",\r\n        \"info\": \"Info\",\r\n        \"details\": \"Details\"\r\n    },\r\n\r\n    \"account_addresses\": {\r\n        \"index\": \"#\",\r\n        \"n_recv\": \"N(Recv)\",\r\n        \"n_spend\": \"N(Spend)\",\r\n        \"last_recv\": \"Last Recv\",\r\n        \"last_spend\": \"Last Spend\"\r\n\t},\r\n\t\r\n\t\"wallet_common\": {\r\n\t\t\"enter_passphrase\": \"Passphrase required\"\r\n\t},\r\n\r\n    \"account_send_form\": {\r\n        \"source_address\": \"Source Address\",\r\n        \"destination\": \"Destination\",\r\n        \"destination_address\": \"Destination Address\",\r\n        \"address_input\": \"Address Input\",\r\n        \"send\": \"Send\"\r\n    },\r\n\r\n    \"balance_table\": {\r\n        \"locked\": \"Locked\",\r\n        \"spendable\": \"Spendable\"\r\n    },\r\n\r\n    \"account_balance\": {\r\n        \"reserved\": \"Reserved\",\r\n        \"show_unknown\": \"Show unknown\"\r\n    },\r\n\r\n    \"account_plots\": {\r\n        \"size\": \"Size\",\r\n        \"new_plot\": \"New Plot\",\r\n\r\n        \"from\": \"from\",\r\n        \"to\": \"to\",\r\n        \r\n        \"deposit_warning\": \"Only 90% of the amount deposited will be returned on withdrawal, the remaining 10% is burned as fee.\",\r\n        \"withdraw_warning\": \"Only 90% of the amount will be returned, the remaining 10% is burned as fee.\"\r\n    },\r\n\r\n    \"account_offers\": {\r\n        \"offering\": \"Offering\",\r\n        \"received\": \"Received\",\r\n        \"status\": \"Status\",\r\n        \"actions\": \"Actions\",\r\n        \"revoke\": \"Revoke\",\r\n\r\n        \"accepted\": \"Accepted\",\r\n        \"revoked\": \"Revoked\",\r\n\r\n        \"open\": \"Open\",\r\n        \"deposit_to\": \"Deposit to\"\r\n    },\r\n\r\n    \"account_offer_form\": {\r\n        \"offer_amount\": \"Offer Amount\",\r\n        \"offer_currency\": \"Offer Currency\",\r\n        \"receive_amount\": \"Receive Amount\",\r\n        \"receive_currency_contract\": \"Receive Currency Contract\",\r\n        \"symbol\": \"Symbol\",\r\n        \"offer\": \"Offer\"\r\n    },\r\n\r\n    \"explore_menu\": {\r\n        \"transactions\": \"Transactions\",\r\n        \"farmers\": \"Farmers\",\r\n        \"block_height\": \"block height\",\r\n    },\r\n\r\n    \"explore_blocks\": {\r\n        \"k\": \"K\",\r\n        \"tx\": \"TX\",\r\n        \r\n        \"score\": \"Score\",\r\n        \r\n        \"tdiff\": \"T-Diff\",\r\n        \"sdiff\": \"S-Diff\",\r\n\r\n        \"size\": \"Size\",\r\n        \"cost\": \"Cost\"\r\n    },\r\n\r\n    \"explore_transactions\": {\r\n        \"n_in\": \"N(in)\",\r\n        \"n_out\": \"N(out)\",\r\n        \"n_op\": \"N(op)\",\r\n        \"transaction_id\": \"Transaction ID\"\r\n    },\r\n\r\n    \"explore_farmers\": {\r\n        \"no_blocks\": \"No. Blocks\",\r\n        \"farmer_key\": \"Farmer Key\"\r\n    },\r\n\r\n    \"block_view\": {\r\n        \"previous\": \"Previous\",\r\n        \"next\": \"Next\",\r\n        \"block\": \"Block\",\r\n        \"no_such_block\": \"No such block!\",\r\n\r\n        \"time_diff\": \"Time Diff\",\r\n        \"space_diff\": \"Space Diff\",\r\n        \"vdf_iterations\": \"VDF Iterations\",\r\n        \"tx_base\": \"TX Base\",\r\n        \"tx_count\": \"TX Count\",\r\n        \"k_size\": \"K Size\",\r\n        \"proof_score\": \"Proof Score\",\r\n        \"plot_id\": \"Plot ID\",\r\n        \"farmer_key\": \"Farmer Key\",\r\n\r\n        \"inputs\": \"Inputs\",\r\n        \"outputs\": \"Outputs\",\r\n        \"operations\": \"Operations\"\r\n    },\r\n\r\n    \"transaction_view\": {\r\n        \"transaction\": \"Transaction\",\r\n        \"message\": \"Message\",\r\n        \"confirmed\": \"Confirmed\",\r\n        \"expires\": \"Expires\",\r\n        \"note\": \"Note\",\r\n\r\n        \"sender\": \"Sender\",\r\n        \"cost\": \"Cost\",\r\n\r\n        \"input\": \"Input\",\r\n        \"output\": \"Output\",\r\n\r\n        \"no_such_transaction\": \"No such transaction!\"\r\n    },\r\n\r\n    \"create_contract_menu\": {\r\n        \"contract_type\": \"Contract Type\"\r\n    },\r\n\r\n    \"account_contract_summary\": {\r\n        \"deposit\": \"Deposit\",\r\n        \"withdraw\": \"Withdraw\"\r\n    },\r\n\r\n    \"node_settings\": {\r\n        \"gui\": \"GUI\",\r\n        \"language\": \"Language\",\r\n\r\n        \"theme\": \"Theme\",\r\n        \"light\": \"Light\",\r\n        \"dark\": \"Dark\",\r\n\r\n        \"general\": \"General\",\r\n        \"enable_timelord\": \"Enable TimeLord\",\r\n        \"enable_timelord_reward\": \"Enable TimeLord Rewards (requires one more CPU core)\",\r\n        \"verify_timelord_reward\": \"Verify TimeLord Rewards (disable to speed up VDF verify)\",\r\n        \"open_port\": \"Open network port to allow incoming connections (UPnP)\",\r\n\r\n        \"reward\": \"Reward\",\r\n        \"farmer_reward_address\": \"Farmer Reward Address\",\r\n        \"timeLord_reward_address\": \"TimeLord Reward Address\",\r\n        \"restart_needed\": \"(restart needed to apply)\",\r\n\r\n        \"opencl_device\": \"OpenCL Device\",\r\n\r\n        \"blockchain\": \"Blockchain\",\r\n        \"revert_db_to_height\": \"Revert DB to height\",\r\n        \"revert\": \"Revert\"\r\n    },\r\n\r\n    \"harvester_settings\": {\r\n        \"harvester_reload_interval\": \"Harvester Reload Interval (sec)\",\r\n        \"plot_directory\": \"Plot Directory\",\r\n        \"add_directory\": \"Add Directory\"\r\n    },\r\n\r\n    \"wallet_settings\": {\r\n        \"token_whitelist\": \"Token Whitelist\",\r\n        \"token_address\": \"Token Address\",\r\n        \"add_token\": \"Add Token\"\r\n    },\r\n\r\n    \"build_version\": {\r\n        \"build\": \"Build\",\r\n        \"version\": \"Version\",\r\n        \"commit\": \"Commit\"\r\n    },\r\n\r\n    \"create_locked_contract\": {\r\n        \"owner_address\": \"Owner Address\",\r\n        \"unlock_height\": \"Unlock at Chain Height\"\r\n    },\r\n\r\n    \"create_virtual_plot_contract\": {\r\n        \"farmer_public_key\": \"Farmer Public Key\",\r\n        \"reward_address\": \"Reward Address (optional, for pooling)\"\r\n    },\r\n    \r\n    \"account_details\": {\r\n        \"copy_keys_to_plotter\": \"Copy keys to plotter\"\r\n    },\r\n\r\n    \"account_actions\": {\r\n        \"reset_cache\": \"Reset Cache\",\r\n        \"show_seed\": \"Show Seed\"\r\n    },\r\n\r\n    \"create_account\": {\r\n        \"account_index\": \"Account Index\",\r\n        \"account_name\": \"Account Name\",\r\n        \"number_of_addresses\": \"Number of Addresses\",\r\n        \"create_account\": \"Create Account\"\r\n    },\r\n\r\n    \"create_wallet\": {\r\n        \"account_name\": \"Account Name\",\r\n        \"number_of_addresses\": \"Number of Addresses\",\r\n        \"use_custom_seed\": \"Use Custom Seed\",\r\n        \"use_passphrase\": \"With Passphrase\",\r\n        \"seed_words\": \"Mnemonic Seed Words (optional, 24 words)\",\r\n        \"passphrase\": \"Passphrase (secure password, 10+ characters)\",\r\n        \"placeholder\": \"<random>\",\r\n        \"create_wallet\": \"Create Wallet\"\r\n    },\r\n\r\n    \"market_menu\": {\r\n        \"they_offer\": \"They Offer\",\r\n        \"they_ask\": \"They Ask\",\r\n        \"anything\": \"Anything\",\r\n        \"offers\": \"Offers\",\r\n        \"history\": \"History\"\r\n    },\r\n\r\n    \"market_offers\": {\r\n        \"accept_offer\": \"Accept Offer\",\r\n        \"wallet_ballance\": \"Wallet Balance\",\r\n        \"you_send\": \"You send\",\r\n        \"you_receive\": \"You Receive\",\r\n        \"you_pay\": \"You Pay\",\r\n\r\n        \"increase\": \"Increase\",\r\n        \"trade\": \"Trade\"\r\n    },\r\n\r\n    \"login\": {\r\n        \"password_label\": \"Password (see PASSWD file)\",\r\n        \"login\": \"Login\"\r\n    },\r\n\r\n    \"account_history_form\": {\r\n        \"spend\": \"Spend\",\r\n        \"receive\": \"Receive\",\r\n        \"reward\": \"Reward\",\r\n        \"tx_fee\": \"TX Fee\"\r\n    },\r\n\r\n    \"farmer_menu\": {\r\n        \"plots\": \"Plots\",\r\n        \"blocks\": \"Blocks\",\r\n        \"proofs\": \"Proofs\"\r\n    },\r\n\r\n    \"farmer_plots\": {\r\n        \"type\": \"Type\",\r\n        \"count\": \"Count\",\r\n        \"reload_plots\": \"Reload Plots\"\r\n    },\r\n\r\n    \"farmer_plot_dirs\": {\r\n        \"path\": \"Path\"\r\n    },\r\n\r\n    \"swap\": {\r\n        \"swap\": \"Swap\",\r\n        \"pool_balance\": \"Pool Balance\",\r\n        \"volume\": \"Volume\",\r\n        \"24h\": \"24h\",\r\n        \"7d\": \"7 days\",\r\n        \"apy\": \"APY\",\r\n\r\n        \"trade\": \"Trade\",\r\n        \"history\": \"History\",\r\n        \"my_liquidity\": \"My Liquidity\",\r\n        \"pool_state\": \"Pool State\",\r\n\r\n        \"my_balance\": \"My Balance\",\r\n        \"fees_earned\": \"Fees Earned\",\r\n        \"fee_level\": \"Fee Level\",\r\n        \"unlock_height\": \"Unlock Height\",\r\n\r\n        \"user_total\": \"User Total\",\r\n\r\n        \"token_amount\": \"Token Amount\",\r\n        \"currency_amount\": \"Currency Amount\",\r\n\r\n        \"price_match\": \"Price Match\",\r\n        \"payout\": \"Payout\",\r\n        \"switch_fee\": \"Switch Fee\",\r\n        \"add_liquidity\": \"Add Liquidity\",\r\n        \"remove_iquidity\": \"Remove Liquidity\",\r\n        \"remove_all\": \"Remove All\",\r\n\r\n        \"wallet_ballance\": \"Wallet Balance\",\r\n        \"buy_amount\": \"Buy Amount\",\r\n        \"sell_amount\": \"Sell Amount\",\r\n        \"trade_fee_estimated\": \"Trade Fee (estimated)\",\r\n        \"you_receive_estimated\": \"You receive (estimated)\",\r\n\r\n        \"sell\": \"Sell\",\r\n        \"buy\": \"Buy\"\r\n    },\r\n\r\n    \"$vuetify\": {\r\n        close: 'Close',\r\n        dataIterator: {\r\n            pageText: '{0}-{1} of {2}',\r\n            noResultsText: 'No matching records found',\r\n            loadingText: 'Loading items...',\r\n        },\r\n        dataTable: {\r\n            itemsPerPageText: 'Rows per page:',\r\n            ariaLabel: {\r\n            sortDescending: ': Sorted descending. Activate to remove sorting.',\r\n            sortAscending: ': Sorted ascending. Activate to sort descending.',\r\n            sortNone: ': Not sorted. Activate to sort ascending.',\r\n            },\r\n            sortBy: 'Sort by',\r\n        },\r\n        dataFooter: {\r\n            itemsPerPageText: 'Items per page:',\r\n            itemsPerPageAll: 'All',\r\n            nextPage: 'Next page',\r\n            prevPage: 'Previous page',\r\n            firstPage: 'First page',\r\n            lastPage: 'Last page',\r\n        },\r\n        datePicker: {\r\n            itemsSelected: '{0} selected',\r\n        },\r\n        noDataText: 'No data available',\r\n        carousel: {\r\n            prev: 'Previous visual',\r\n            next: 'Next visual',\r\n        },\r\n        calendar: {\r\n            moreEvents: '{0} more',\r\n        },\r\n        fileInput: {\r\n            counter: '{0} files',\r\n            counterSize: '{0} files ({1} in total)',\r\n        },\r\n    }\r\n}"
  },
  {
    "path": "www/explorer/public/mount.js",
    "content": "\nconst routes = [\n\t{ path: '/', redirect: \"/explore\" },\n\t{ path: '/explore',\n\t\tcomponent: Explore,\n\t\tredirect: \"/explore/blocks\",\n\t\tchildren: [\n\t\t\t{ path: 'blocks', component: ExploreBlocks, meta: { page: 'blocks' } },\n\t\t\t{ path: 'transactions', component: ExploreTransactions, meta: { page: 'transactions' } },\n\t\t\t{ path: 'farmers', component: ExploreFarmers, meta: { page: 'farmers' } },\n\t\t\t{ path: 'block/hash/:hash', component: ExploreBlock, meta: { page: 'block' } },\n\t\t\t{ path: 'block/height/:height', component: ExploreBlock, meta: { page: 'block' } },\n\t\t\t{ path: 'farmer/:id', component: ExploreFarmer, meta: { page: 'farmer' } },\n\t\t\t{ path: 'address/:address', component: ExploreAddress, meta: { page: 'address' } },\n\t\t\t{ path: 'transaction/:id', component: ExploreTransaction, meta: { page: 'transaction' } },\n\t\t]\n\t}\n]\n\nconst router = new VueRouter({\n\troutes\n})\n\nvar vuetify = new Vuetify({\n\tlang: {\n\t\tt: (key, ...params) => i18n.t(key, params),\n\t},\n});\n\n(async () => {\n\n    var locale = localStorage.getItem('language');\n\n    if (locale) {\n        await loadLanguageAsync(locale);\n    } else {\n        setI18nLanguage('en');\n    }\n\n    new Vue({\n        data: {\n            nodeInfo: null\n        },\n        el: '#app',\n        vuetify: vuetify,\n        router: router,\n        i18n: i18n,\n    \n        beforeMount() {\n            this.$vuetify.theme.dark = localStorage.getItem('theme_dark') === 'true';\n        }\n    });\n})();\n\n\n\n\n\n"
  },
  {
    "path": "www/old/explorer/index.js",
    "content": "const express = require('express')\nconst axios = require('axios')\nconst {bech32, bech32m} = require('bech32')\nconst {createProxyMiddleware} = require('http-proxy-middleware');\nconst app = express();\nconst port = 3000;\nconst host = 'http://localhost:11380';\n\naxios.defaults.headers.common['x-api-token'] = '94660788ae448af0a59793ad1b7d2f971406a421103f9559408b63ac560e1404';\n\napp.set('views', './views');\napp.set('view engine', 'ejs');\n\napp.use(express.static('data'));\napp.use(express.static(\"public\"));\n\nconst MMX_ADDR = \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\";\n\nfunction to_hex(a)\n{\n\tvar b = a.map(function (x) {\n\t\tx = x.toString(16); // to hex\n\t\tx = (\"00\"+x).substr(-2); // zero-pad to 2-digits\n\t\treturn x;\n\t}).join('');\n\treturn b;\n}\n\nfunction to_addr(array) {\n\treturn bech32m.encode('mmx', bech32m.toWords(array.reverse()));\n}\n\nfunction to_balance(amount) {\n\treturn amount / 1e6;\n}\n\nfunction on_error(res, ex)\n{\n\tconsole.log(ex.message);\n\tres.status(500).send(ex.message);\n}\n\nfunction parse_block(data)\n{\n\tlet block = data;\n\tif(block.proof) {\n\t\tblock.ksize = block.proof.ksize;\n\t\tblock.score = block.proof.score;\n\t\tblock.pool_key = block.proof.pool_key;\n\t\tblock.farmer_key = block.proof.farmer_key;\n\t}\n\tblock.reward = 0;\n\tblock.rewards = [];\n\tif(block.tx_base) {\n\t\tfor(const out of block.tx_base.outputs) {\n\t\t\tblock.reward += out.amount;\n\t\t\tblock.rewards.push({address: out.address, value: out.value});\n\t\t}\n\t\tblock.reward = to_balance(block.reward);\n\t}\n\treturn block\n}\n\nfunction on_block(res, ret)\n{\n\tif(!ret.data) {\n\t\tres.status(404).send(\"no such block\");\n\t\treturn;\n\t}\n\tlet args = {};\n\targs.body = 'block';\n\targs.block = parse_block(ret.data);\n\tres.render('index', args);\n}\n\nasync function on_recent_blocks(res, ret)\n{\n\tif(!ret.data) {\n\t\tres.status(404).send(\"nothing found\");\n\t\treturn;\n\t}\n\tconst height = ret.data;\n\tvar blocks = [];\n\tfor(let i = 0; i < 30 && i < height; i++) {\n\t\ttry {\n\t\t\tconst ret = await axios.get(host + '/wapi/header?height=' + (height - i));\n\t\t\tblocks.push(parse_block(ret.data));\n\t\t} catch(err) {\n\t\t\tbreak;\n\t\t}\n\t}\n\tlet args = {};\n\targs.body = 'recent';\n\targs.blocks = blocks;\n\tres.render('index', args);\n}\n\nfunction on_recent_transactions(res, ret)\n{\n\tif(!ret.data) {\n\t\tres.status(404).send(\"nothing found\");\n\t\treturn;\n\t}\n\tlet args = {};\n\targs.body = 'recent_transactions';\n\targs.transactions = ret.data;\n\tres.render('index', args);\n}\n\nasync function on_address(res, address)\n{\n\tlet ret = null;\n\tret = await axios.get(host + '/wapi/address?id=' + address);\n\tconst contract = ret.data.contract;\n\tconst all_balances = ret.data.balances;\n\tret = await axios.get(host + '/wapi/address/history?limit=1000&id=' + address);\n\tconst history = ret.data;\n\t\n\tlet nfts = [];\n\tlet balances = [];\n\tfor(const entry of all_balances) {\n\t\tif(entry.is_nft) {\n\t\t\tnfts.push(entry);\n\t\t} else {\n\t\t\tbalances.push(entry);\n\t\t}\n\t}\n\t\n\tlet args = {};\n\targs.body = 'address';\n\targs.address = address;\n\targs.nfts = nfts;\n\targs.balances = balances;\n\targs.contract = contract;\n\targs.history = history;\n\tres.render('index', args);\n}\n\nasync function on_transaction(res, tx)\n{\n\tlet args = {};\n\targs.body = 'transaction';\n\targs.tx = tx;\n\tres.render('index', args);\n}\n\napp.get('/', (req, res) => {\n\tres.redirect('/recent');\n});\n\napp.get('/recent', (req, res) => {\n\taxios.get(host + '/api/node/get_height')\n\t\t.then(on_recent_blocks.bind(null, res))\n\t\t.catch(on_error.bind(null, res));\n});\n\napp.get('/transactions', (req, res) => {\n\taxios.get(host + '/wapi/transactions?limit=100')\n\t\t.then(on_recent_transactions.bind(null, res))\n\t\t.catch(on_error.bind(null, res));\n});\n\napp.get('/block', (req, res) => {\n\tif(req.query.hash) {\n\t\taxios.get(host + '/wapi/block?hash=' + req.query.hash)\n\t\t\t.then(on_block.bind(null, res))\n\t\t\t.catch(on_error.bind(null, res));\n\t} else if(req.query.height) {\n\t\taxios.get(host + '/wapi/block?height=' + req.query.height)\n\t\t\t.then(on_block.bind(null, res))\n\t\t\t.catch(on_error.bind(null, res));\n\t} else {\n\t\tres.status(404).send(\"missing hash or height param\");\n\t}\n});\n\napp.get('/address', async (req, res) => {\n\tif(!req.query.addr) {\n\t\tres.status(404).send(\"missing addr param\");\n\t\treturn;\n\t}\n\tconst address = req.query.addr;\n\ton_address(res, address).catch(on_error.bind(null, res));\n});\n\napp.get('/transaction', (req, res) => {\n\tif(!req.query.id) {\n\t\tres.status(404).send(\"missing id param\");\n\t\treturn;\n\t}\n\taxios.get(host + '/wapi/transaction?id=' + req.query.id)\n\t\t.then((ret) => {\n\t\t\tconst tx = ret.data;\n\t\t\tif(tx) {\n\t\t\t\ton_transaction(res, tx).catch(on_error.bind(null, res));\n\t\t\t} else {\n\t\t\t\tres.status(404).send(\"no such transaction\");\n\t\t\t}\n\t\t})\n\t\t.catch(on_error.bind(null, res));\n});\n\n\n/*\napp.get('/search', (req, res) => {\n\t\n});\n*/\n\napp.use('/api', createProxyMiddleware({target: host, changeOrigin: true}));\n\napp.listen(port, '0.0.0.0', () => {\n\tconsole.log(`Listening at http://0.0.0.0:${port}`);\n});\n\n\n\n\n\n"
  },
  {
    "path": "www/old/explorer/package.json",
    "content": "{\n  \"name\": \"MMX-explorer\",\n  \"version\": \"1.0.0\",\n  \"description\": \"MMX block explorer\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"Max Wittal\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"axios\": \"^0.21.4\",\n    \"bech32\": \"^2.0.0\",\n    \"ejs\": \"^3.1.7\",\n    \"express\": \"^4.17.2\",\n    \"http-proxy-middleware\": \"^1.3.1\"\n  }\n}\n"
  },
  {
    "path": "www/old/explorer/public/js/bootstrap.bundle.js",
    "content": "/*!\n  * Bootstrap v5.1.3 (https://getbootstrap.com/)\n  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory());\n})(this, (function () { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const MAX_UID = 1000000;\n  const MILLISECONDS_MULTIPLIER = 1000;\n  const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  const toType = obj => {\n    if (obj === null || obj === undefined) {\n      return `${obj}`;\n    }\n\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  };\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  const getUID = prefix => {\n    do {\n      prefix += Math.floor(Math.random() * MAX_UID);\n    } while (document.getElementById(prefix));\n\n    return prefix;\n  };\n\n  const getSelector = element => {\n    let selector = element.getAttribute('data-bs-target');\n\n    if (!selector || selector === '#') {\n      let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,\n      // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n      // `document.querySelector` will rightfully complain it is invalid.\n      // See https://github.com/twbs/bootstrap/issues/32273\n\n      if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {\n        return null;\n      } // Just in case some CMS puts out a full URL with the anchor appended\n\n\n      if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n        hrefAttr = `#${hrefAttr.split('#')[1]}`;\n      }\n\n      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;\n    }\n\n    return selector;\n  };\n\n  const getSelectorFromElement = element => {\n    const selector = getSelector(element);\n\n    if (selector) {\n      return document.querySelector(selector) ? selector : null;\n    }\n\n    return null;\n  };\n\n  const getElementFromSelector = element => {\n    const selector = getSelector(element);\n    return selector ? document.querySelector(selector) : null;\n  };\n\n  const getTransitionDurationFromElement = element => {\n    if (!element) {\n      return 0;\n    } // Get transition-duration of the element\n\n\n    let {\n      transitionDuration,\n      transitionDelay\n    } = window.getComputedStyle(element);\n    const floatTransitionDuration = Number.parseFloat(transitionDuration);\n    const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n    if (!floatTransitionDuration && !floatTransitionDelay) {\n      return 0;\n    } // If multiple durations are defined, take the first\n\n\n    transitionDuration = transitionDuration.split(',')[0];\n    transitionDelay = transitionDelay.split(',')[0];\n    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n  };\n\n  const triggerTransitionEnd = element => {\n    element.dispatchEvent(new Event(TRANSITION_END));\n  };\n\n  const isElement$1 = obj => {\n    if (!obj || typeof obj !== 'object') {\n      return false;\n    }\n\n    if (typeof obj.jquery !== 'undefined') {\n      obj = obj[0];\n    }\n\n    return typeof obj.nodeType !== 'undefined';\n  };\n\n  const getElement = obj => {\n    if (isElement$1(obj)) {\n      // it's a jQuery object or a node element\n      return obj.jquery ? obj[0] : obj;\n    }\n\n    if (typeof obj === 'string' && obj.length > 0) {\n      return document.querySelector(obj);\n    }\n\n    return null;\n  };\n\n  const typeCheckConfig = (componentName, config, configTypes) => {\n    Object.keys(configTypes).forEach(property => {\n      const expectedTypes = configTypes[property];\n      const value = config[property];\n      const valueType = value && isElement$1(value) ? 'element' : toType(value);\n\n      if (!new RegExp(expectedTypes).test(valueType)) {\n        throw new TypeError(`${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n      }\n    });\n  };\n\n  const isVisible = element => {\n    if (!isElement$1(element) || element.getClientRects().length === 0) {\n      return false;\n    }\n\n    return getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n  };\n\n  const isDisabled = element => {\n    if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n      return true;\n    }\n\n    if (element.classList.contains('disabled')) {\n      return true;\n    }\n\n    if (typeof element.disabled !== 'undefined') {\n      return element.disabled;\n    }\n\n    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n  };\n\n  const findShadowRoot = element => {\n    if (!document.documentElement.attachShadow) {\n      return null;\n    } // Can find the shadow root otherwise it'll return the document\n\n\n    if (typeof element.getRootNode === 'function') {\n      const root = element.getRootNode();\n      return root instanceof ShadowRoot ? root : null;\n    }\n\n    if (element instanceof ShadowRoot) {\n      return element;\n    } // when we don't find a shadow root\n\n\n    if (!element.parentNode) {\n      return null;\n    }\n\n    return findShadowRoot(element.parentNode);\n  };\n\n  const noop = () => {};\n  /**\n   * Trick to restart an element's animation\n   *\n   * @param {HTMLElement} element\n   * @return void\n   *\n   * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n   */\n\n\n  const reflow = element => {\n    // eslint-disable-next-line no-unused-expressions\n    element.offsetHeight;\n  };\n\n  const getjQuery = () => {\n    const {\n      jQuery\n    } = window;\n\n    if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n      return jQuery;\n    }\n\n    return null;\n  };\n\n  const DOMContentLoadedCallbacks = [];\n\n  const onDOMContentLoaded = callback => {\n    if (document.readyState === 'loading') {\n      // add listener on the first call when the document is in loading state\n      if (!DOMContentLoadedCallbacks.length) {\n        document.addEventListener('DOMContentLoaded', () => {\n          DOMContentLoadedCallbacks.forEach(callback => callback());\n        });\n      }\n\n      DOMContentLoadedCallbacks.push(callback);\n    } else {\n      callback();\n    }\n  };\n\n  const isRTL = () => document.documentElement.dir === 'rtl';\n\n  const defineJQueryPlugin = plugin => {\n    onDOMContentLoaded(() => {\n      const $ = getjQuery();\n      /* istanbul ignore if */\n\n      if ($) {\n        const name = plugin.NAME;\n        const JQUERY_NO_CONFLICT = $.fn[name];\n        $.fn[name] = plugin.jQueryInterface;\n        $.fn[name].Constructor = plugin;\n\n        $.fn[name].noConflict = () => {\n          $.fn[name] = JQUERY_NO_CONFLICT;\n          return plugin.jQueryInterface;\n        };\n      }\n    });\n  };\n\n  const execute = callback => {\n    if (typeof callback === 'function') {\n      callback();\n    }\n  };\n\n  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n    if (!waitForTransition) {\n      execute(callback);\n      return;\n    }\n\n    const durationPadding = 5;\n    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n    let called = false;\n\n    const handler = ({\n      target\n    }) => {\n      if (target !== transitionElement) {\n        return;\n      }\n\n      called = true;\n      transitionElement.removeEventListener(TRANSITION_END, handler);\n      execute(callback);\n    };\n\n    transitionElement.addEventListener(TRANSITION_END, handler);\n    setTimeout(() => {\n      if (!called) {\n        triggerTransitionEnd(transitionElement);\n      }\n    }, emulatedDuration);\n  };\n  /**\n   * Return the previous/next element of a list.\n   *\n   * @param {array} list    The list of elements\n   * @param activeElement   The active element\n   * @param shouldGetNext   Choose to get next or previous element\n   * @param isCycleAllowed\n   * @return {Element|elem} The proper element\n   */\n\n\n  const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n    let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n\n    if (index === -1) {\n      return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];\n    }\n\n    const listLength = list.length;\n    index += shouldGetNext ? 1 : -1;\n\n    if (isCycleAllowed) {\n      index = (index + listLength) % listLength;\n    }\n\n    return list[Math.max(0, Math.min(index, listLength - 1))];\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): dom/event-handler.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\n  const stripNameRegex = /\\..*/;\n  const stripUidRegex = /::\\d+$/;\n  const eventRegistry = {}; // Events storage\n\n  let uidEvent = 1;\n  const customEvents = {\n    mouseenter: 'mouseover',\n    mouseleave: 'mouseout'\n  };\n  const customEventsRegex = /^(mouseenter|mouseleave)/i;\n  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n  /**\n   * ------------------------------------------------------------------------\n   * Private methods\n   * ------------------------------------------------------------------------\n   */\n\n  function getUidEvent(element, uid) {\n    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n  }\n\n  function getEvent(element) {\n    const uid = getUidEvent(element);\n    element.uidEvent = uid;\n    eventRegistry[uid] = eventRegistry[uid] || {};\n    return eventRegistry[uid];\n  }\n\n  function bootstrapHandler(element, fn) {\n    return function handler(event) {\n      event.delegateTarget = element;\n\n      if (handler.oneOff) {\n        EventHandler.off(element, event.type, fn);\n      }\n\n      return fn.apply(element, [event]);\n    };\n  }\n\n  function bootstrapDelegationHandler(element, selector, fn) {\n    return function handler(event) {\n      const domElements = element.querySelectorAll(selector);\n\n      for (let {\n        target\n      } = event; target && target !== this; target = target.parentNode) {\n        for (let i = domElements.length; i--;) {\n          if (domElements[i] === target) {\n            event.delegateTarget = target;\n\n            if (handler.oneOff) {\n              EventHandler.off(element, event.type, selector, fn);\n            }\n\n            return fn.apply(target, [event]);\n          }\n        }\n      } // To please ESLint\n\n\n      return null;\n    };\n  }\n\n  function findHandler(events, handler, delegationSelector = null) {\n    const uidEventList = Object.keys(events);\n\n    for (let i = 0, len = uidEventList.length; i < len; i++) {\n      const event = events[uidEventList[i]];\n\n      if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n        return event;\n      }\n    }\n\n    return null;\n  }\n\n  function normalizeParams(originalTypeEvent, handler, delegationFn) {\n    const delegation = typeof handler === 'string';\n    const originalHandler = delegation ? delegationFn : handler;\n    let typeEvent = getTypeEvent(originalTypeEvent);\n    const isNative = nativeEvents.has(typeEvent);\n\n    if (!isNative) {\n      typeEvent = originalTypeEvent;\n    }\n\n    return [delegation, originalHandler, typeEvent];\n  }\n\n  function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return;\n    }\n\n    if (!handler) {\n      handler = delegationFn;\n      delegationFn = null;\n    } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n    // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n\n\n    if (customEventsRegex.test(originalTypeEvent)) {\n      const wrapFn = fn => {\n        return function (event) {\n          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n            return fn.call(this, event);\n          }\n        };\n      };\n\n      if (delegationFn) {\n        delegationFn = wrapFn(delegationFn);\n      } else {\n        handler = wrapFn(handler);\n      }\n    }\n\n    const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);\n    const events = getEvent(element);\n    const handlers = events[typeEvent] || (events[typeEvent] = {});\n    const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null);\n\n    if (previousFn) {\n      previousFn.oneOff = previousFn.oneOff && oneOff;\n      return;\n    }\n\n    const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''));\n    const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler);\n    fn.delegationSelector = delegation ? handler : null;\n    fn.originalHandler = originalHandler;\n    fn.oneOff = oneOff;\n    fn.uidEvent = uid;\n    handlers[uid] = fn;\n    element.addEventListener(typeEvent, fn, delegation);\n  }\n\n  function removeHandler(element, events, typeEvent, handler, delegationSelector) {\n    const fn = findHandler(events[typeEvent], handler, delegationSelector);\n\n    if (!fn) {\n      return;\n    }\n\n    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n    delete events[typeEvent][fn.uidEvent];\n  }\n\n  function removeNamespacedHandlers(element, events, typeEvent, namespace) {\n    const storeElementEvent = events[typeEvent] || {};\n    Object.keys(storeElementEvent).forEach(handlerKey => {\n      if (handlerKey.includes(namespace)) {\n        const event = storeElementEvent[handlerKey];\n        removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);\n      }\n    });\n  }\n\n  function getTypeEvent(event) {\n    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n    event = event.replace(stripNameRegex, '');\n    return customEvents[event] || event;\n  }\n\n  const EventHandler = {\n    on(element, event, handler, delegationFn) {\n      addHandler(element, event, handler, delegationFn, false);\n    },\n\n    one(element, event, handler, delegationFn) {\n      addHandler(element, event, handler, delegationFn, true);\n    },\n\n    off(element, originalTypeEvent, handler, delegationFn) {\n      if (typeof originalTypeEvent !== 'string' || !element) {\n        return;\n      }\n\n      const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);\n      const inNamespace = typeEvent !== originalTypeEvent;\n      const events = getEvent(element);\n      const isNamespace = originalTypeEvent.startsWith('.');\n\n      if (typeof originalHandler !== 'undefined') {\n        // Simplest case: handler is passed, remove that listener ONLY.\n        if (!events || !events[typeEvent]) {\n          return;\n        }\n\n        removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null);\n        return;\n      }\n\n      if (isNamespace) {\n        Object.keys(events).forEach(elementEvent => {\n          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n        });\n      }\n\n      const storeElementEvent = events[typeEvent] || {};\n      Object.keys(storeElementEvent).forEach(keyHandlers => {\n        const handlerKey = keyHandlers.replace(stripUidRegex, '');\n\n        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n          const event = storeElementEvent[keyHandlers];\n          removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);\n        }\n      });\n    },\n\n    trigger(element, event, args) {\n      if (typeof event !== 'string' || !element) {\n        return null;\n      }\n\n      const $ = getjQuery();\n      const typeEvent = getTypeEvent(event);\n      const inNamespace = event !== typeEvent;\n      const isNative = nativeEvents.has(typeEvent);\n      let jQueryEvent;\n      let bubbles = true;\n      let nativeDispatch = true;\n      let defaultPrevented = false;\n      let evt = null;\n\n      if (inNamespace && $) {\n        jQueryEvent = $.Event(event, args);\n        $(element).trigger(jQueryEvent);\n        bubbles = !jQueryEvent.isPropagationStopped();\n        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n        defaultPrevented = jQueryEvent.isDefaultPrevented();\n      }\n\n      if (isNative) {\n        evt = document.createEvent('HTMLEvents');\n        evt.initEvent(typeEvent, bubbles, true);\n      } else {\n        evt = new CustomEvent(event, {\n          bubbles,\n          cancelable: true\n        });\n      } // merge custom information in our event\n\n\n      if (typeof args !== 'undefined') {\n        Object.keys(args).forEach(key => {\n          Object.defineProperty(evt, key, {\n            get() {\n              return args[key];\n            }\n\n          });\n        });\n      }\n\n      if (defaultPrevented) {\n        evt.preventDefault();\n      }\n\n      if (nativeDispatch) {\n        element.dispatchEvent(evt);\n      }\n\n      if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n        jQueryEvent.preventDefault();\n      }\n\n      return evt;\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): dom/data.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  const elementMap = new Map();\n  const Data = {\n    set(element, key, instance) {\n      if (!elementMap.has(element)) {\n        elementMap.set(element, new Map());\n      }\n\n      const instanceMap = elementMap.get(element); // make it clear we only want one instance per element\n      // can be removed later when multiple key/instances are fine to be used\n\n      if (!instanceMap.has(key) && instanceMap.size !== 0) {\n        // eslint-disable-next-line no-console\n        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n        return;\n      }\n\n      instanceMap.set(key, instance);\n    },\n\n    get(element, key) {\n      if (elementMap.has(element)) {\n        return elementMap.get(element).get(key) || null;\n      }\n\n      return null;\n    },\n\n    remove(element, key) {\n      if (!elementMap.has(element)) {\n        return;\n      }\n\n      const instanceMap = elementMap.get(element);\n      instanceMap.delete(key); // free up element references if there are no instances left for an element\n\n      if (instanceMap.size === 0) {\n        elementMap.delete(element);\n      }\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): base-component.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const VERSION = '5.1.3';\n\n  class BaseComponent {\n    constructor(element) {\n      element = getElement(element);\n\n      if (!element) {\n        return;\n      }\n\n      this._element = element;\n      Data.set(this._element, this.constructor.DATA_KEY, this);\n    }\n\n    dispose() {\n      Data.remove(this._element, this.constructor.DATA_KEY);\n      EventHandler.off(this._element, this.constructor.EVENT_KEY);\n      Object.getOwnPropertyNames(this).forEach(propertyName => {\n        this[propertyName] = null;\n      });\n    }\n\n    _queueCallback(callback, element, isAnimated = true) {\n      executeAfterTransition(callback, element, isAnimated);\n    }\n    /** Static */\n\n\n    static getInstance(element) {\n      return Data.get(getElement(element), this.DATA_KEY);\n    }\n\n    static getOrCreateInstance(element, config = {}) {\n      return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n    }\n\n    static get VERSION() {\n      return VERSION;\n    }\n\n    static get NAME() {\n      throw new Error('You have to implement the static method \"NAME\", for each component!');\n    }\n\n    static get DATA_KEY() {\n      return `bs.${this.NAME}`;\n    }\n\n    static get EVENT_KEY() {\n      return `.${this.DATA_KEY}`;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/component-functions.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const enableDismissTrigger = (component, method = 'hide') => {\n    const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n    const name = component.NAME;\n    EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n      if (['A', 'AREA'].includes(this.tagName)) {\n        event.preventDefault();\n      }\n\n      if (isDisabled(this)) {\n        return;\n      }\n\n      const target = getElementFromSelector(this) || this.closest(`.${name}`);\n      const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n\n      instance[method]();\n    });\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): alert.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$d = 'alert';\n  const DATA_KEY$c = 'bs.alert';\n  const EVENT_KEY$c = `.${DATA_KEY$c}`;\n  const EVENT_CLOSE = `close${EVENT_KEY$c}`;\n  const EVENT_CLOSED = `closed${EVENT_KEY$c}`;\n  const CLASS_NAME_FADE$5 = 'fade';\n  const CLASS_NAME_SHOW$8 = 'show';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Alert extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$d;\n    } // Public\n\n\n    close() {\n      const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n\n      if (closeEvent.defaultPrevented) {\n        return;\n      }\n\n      this._element.classList.remove(CLASS_NAME_SHOW$8);\n\n      const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n\n      this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n    } // Private\n\n\n    _destroyElement() {\n      this._element.remove();\n\n      EventHandler.trigger(this._element, EVENT_CLOSED);\n      this.dispose();\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Alert.getOrCreateInstance(this);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](this);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  enableDismissTrigger(Alert, 'close');\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Alert to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Alert);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): button.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$c = 'button';\n  const DATA_KEY$b = 'bs.button';\n  const EVENT_KEY$b = `.${DATA_KEY$b}`;\n  const DATA_API_KEY$7 = '.data-api';\n  const CLASS_NAME_ACTIVE$3 = 'active';\n  const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\n  const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$b}${DATA_API_KEY$7}`;\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Button extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$c;\n    } // Public\n\n\n    toggle() {\n      // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n      this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Button.getOrCreateInstance(this);\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n    event.preventDefault();\n    const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n    const data = Button.getOrCreateInstance(button);\n    data.toggle();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Button to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Button);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): dom/manipulator.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  function normalizeData(val) {\n    if (val === 'true') {\n      return true;\n    }\n\n    if (val === 'false') {\n      return false;\n    }\n\n    if (val === Number(val).toString()) {\n      return Number(val);\n    }\n\n    if (val === '' || val === 'null') {\n      return null;\n    }\n\n    return val;\n  }\n\n  function normalizeDataKey(key) {\n    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n  }\n\n  const Manipulator = {\n    setDataAttribute(element, key, value) {\n      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n    },\n\n    removeDataAttribute(element, key) {\n      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n    },\n\n    getDataAttributes(element) {\n      if (!element) {\n        return {};\n      }\n\n      const attributes = {};\n      Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {\n        let pureKey = key.replace(/^bs/, '');\n        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n        attributes[pureKey] = normalizeData(element.dataset[key]);\n      });\n      return attributes;\n    },\n\n    getDataAttribute(element, key) {\n      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n    },\n\n    offset(element) {\n      const rect = element.getBoundingClientRect();\n      return {\n        top: rect.top + window.pageYOffset,\n        left: rect.left + window.pageXOffset\n      };\n    },\n\n    position(element) {\n      return {\n        top: element.offsetTop,\n        left: element.offsetLeft\n      };\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): dom/selector-engine.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const NODE_TEXT = 3;\n  const SelectorEngine = {\n    find(selector, element = document.documentElement) {\n      return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n    },\n\n    findOne(selector, element = document.documentElement) {\n      return Element.prototype.querySelector.call(element, selector);\n    },\n\n    children(element, selector) {\n      return [].concat(...element.children).filter(child => child.matches(selector));\n    },\n\n    parents(element, selector) {\n      const parents = [];\n      let ancestor = element.parentNode;\n\n      while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n        if (ancestor.matches(selector)) {\n          parents.push(ancestor);\n        }\n\n        ancestor = ancestor.parentNode;\n      }\n\n      return parents;\n    },\n\n    prev(element, selector) {\n      let previous = element.previousElementSibling;\n\n      while (previous) {\n        if (previous.matches(selector)) {\n          return [previous];\n        }\n\n        previous = previous.previousElementSibling;\n      }\n\n      return [];\n    },\n\n    next(element, selector) {\n      let next = element.nextElementSibling;\n\n      while (next) {\n        if (next.matches(selector)) {\n          return [next];\n        }\n\n        next = next.nextElementSibling;\n      }\n\n      return [];\n    },\n\n    focusableChildren(element) {\n      const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ');\n      return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): carousel.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$b = 'carousel';\n  const DATA_KEY$a = 'bs.carousel';\n  const EVENT_KEY$a = `.${DATA_KEY$a}`;\n  const DATA_API_KEY$6 = '.data-api';\n  const ARROW_LEFT_KEY = 'ArrowLeft';\n  const ARROW_RIGHT_KEY = 'ArrowRight';\n  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  const SWIPE_THRESHOLD = 40;\n  const Default$a = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  const DefaultType$a = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  const ORDER_NEXT = 'next';\n  const ORDER_PREV = 'prev';\n  const DIRECTION_LEFT = 'left';\n  const DIRECTION_RIGHT = 'right';\n  const KEY_TO_DIRECTION = {\n    [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n    [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n  };\n  const EVENT_SLIDE = `slide${EVENT_KEY$a}`;\n  const EVENT_SLID = `slid${EVENT_KEY$a}`;\n  const EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`;\n  const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`;\n  const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`;\n  const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$a}`;\n  const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$a}`;\n  const EVENT_TOUCHEND = `touchend${EVENT_KEY$a}`;\n  const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$a}`;\n  const EVENT_POINTERUP = `pointerup${EVENT_KEY$a}`;\n  const EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;\n  const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`;\n  const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n  const CLASS_NAME_CAROUSEL = 'carousel';\n  const CLASS_NAME_ACTIVE$2 = 'active';\n  const CLASS_NAME_SLIDE = 'slide';\n  const CLASS_NAME_END = 'carousel-item-end';\n  const CLASS_NAME_START = 'carousel-item-start';\n  const CLASS_NAME_NEXT = 'carousel-item-next';\n  const CLASS_NAME_PREV = 'carousel-item-prev';\n  const CLASS_NAME_POINTER_EVENT = 'pointer-event';\n  const SELECTOR_ACTIVE$1 = '.active';\n  const SELECTOR_ACTIVE_ITEM = '.active.carousel-item';\n  const SELECTOR_ITEM = '.carousel-item';\n  const SELECTOR_ITEM_IMG = '.carousel-item img';\n  const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';\n  const SELECTOR_INDICATORS = '.carousel-indicators';\n  const SELECTOR_INDICATOR = '[data-bs-target]';\n  const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\n  const SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\n  const POINTER_TYPE_TOUCH = 'touch';\n  const POINTER_TYPE_PEN = 'pen';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Carousel extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    static get Default() {\n      return Default$a;\n    }\n\n    static get NAME() {\n      return NAME$b;\n    } // Public\n\n\n    next() {\n      this._slide(ORDER_NEXT);\n    }\n\n    nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && isVisible(this._element)) {\n        this.next();\n      }\n    }\n\n    prev() {\n      this._slide(ORDER_PREV);\n    }\n\n    pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n        triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    }\n\n    cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config && this._config.interval && !this._isPaused) {\n        this._updateInterval();\n\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    }\n\n    to(index) {\n      this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      const activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n\n      this._slide(order, this._items[index]);\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$a,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$b, config, DefaultType$a);\n      return config;\n    }\n\n    _handleSwipe() {\n      const absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      const direction = absDeltax / this.touchDeltaX;\n      this.touchDeltaX = 0;\n\n      if (!direction) {\n        return;\n      }\n\n      this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT);\n    }\n\n    _addEventListeners() {\n      if (this._config.keyboard) {\n        EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));\n      }\n\n      if (this._config.pause === 'hover') {\n        EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event));\n        EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event));\n      }\n\n      if (this._config.touch && this._touchSupported) {\n        this._addTouchEventListeners();\n      }\n    }\n\n    _addTouchEventListeners() {\n      const hasPointerPenTouch = event => {\n        return this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n      };\n\n      const start = event => {\n        if (hasPointerPenTouch(event)) {\n          this.touchStartX = event.clientX;\n        } else if (!this._pointerEvent) {\n          this.touchStartX = event.touches[0].clientX;\n        }\n      };\n\n      const move = event => {\n        // ensure swiping with one touch and not pinching\n        this.touchDeltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX;\n      };\n\n      const end = event => {\n        if (hasPointerPenTouch(event)) {\n          this.touchDeltaX = event.clientX - this.touchStartX;\n        }\n\n        this._handleSwipe();\n\n        if (this._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          this.pause();\n\n          if (this.touchTimeout) {\n            clearTimeout(this.touchTimeout);\n          }\n\n          this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n        }\n      };\n\n      SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n        EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault());\n      });\n\n      if (this._pointerEvent) {\n        EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event));\n        EventHandler.on(this._element, EVENT_POINTERUP, event => end(event));\n\n        this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n      } else {\n        EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event));\n        EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event));\n        EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event));\n      }\n    }\n\n    _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      const direction = KEY_TO_DIRECTION[event.key];\n\n      if (direction) {\n        event.preventDefault();\n\n        this._slide(direction);\n      }\n    }\n\n    _getItemIndex(element) {\n      this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : [];\n      return this._items.indexOf(element);\n    }\n\n    _getItemByOrder(order, activeElement) {\n      const isNext = order === ORDER_NEXT;\n      return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap);\n    }\n\n    _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      const targetIndex = this._getItemIndex(relatedTarget);\n\n      const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element));\n\n      return EventHandler.trigger(this._element, EVENT_SLIDE, {\n        relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n    }\n\n    _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE$1, this._indicatorsElement);\n        activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n        activeIndicator.removeAttribute('aria-current');\n        const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement);\n\n        for (let i = 0; i < indicators.length; i++) {\n          if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n            indicators[i].classList.add(CLASS_NAME_ACTIVE$2);\n            indicators[i].setAttribute('aria-current', 'true');\n            break;\n          }\n        }\n      }\n    }\n\n    _updateInterval() {\n      const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      if (!element) {\n        return;\n      }\n\n      const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n\n      if (elementInterval) {\n        this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n        this._config.interval = elementInterval;\n      } else {\n        this._config.interval = this._config.defaultInterval || this._config.interval;\n      }\n    }\n\n    _slide(directionOrOrder, element) {\n      const order = this._directionToOrder(directionOrOrder);\n\n      const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      const activeElementIndex = this._getItemIndex(activeElement);\n\n      const nextElement = element || this._getItemByOrder(order, activeElement);\n\n      const nextElementIndex = this._getItemIndex(nextElement);\n\n      const isCycling = Boolean(this._interval);\n      const isNext = order === ORDER_NEXT;\n      const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n      const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n\n      const eventDirectionName = this._orderToDirection(order);\n\n      if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE$2)) {\n        this._isSliding = false;\n        return;\n      }\n\n      if (this._isSliding) {\n        return;\n      }\n\n      const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.defaultPrevented) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      this._activeElement = nextElement;\n\n      const triggerSlidEvent = () => {\n        EventHandler.trigger(this._element, EVENT_SLID, {\n          relatedTarget: nextElement,\n          direction: eventDirectionName,\n          from: activeElementIndex,\n          to: nextElementIndex\n        });\n      };\n\n      if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n        nextElement.classList.add(orderClassName);\n        reflow(nextElement);\n        activeElement.classList.add(directionalClassName);\n        nextElement.classList.add(directionalClassName);\n\n        const completeCallBack = () => {\n          nextElement.classList.remove(directionalClassName, orderClassName);\n          nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n          activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n          this._isSliding = false;\n          setTimeout(triggerSlidEvent, 0);\n        };\n\n        this._queueCallback(completeCallBack, activeElement, true);\n      } else {\n        activeElement.classList.remove(CLASS_NAME_ACTIVE$2);\n        nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n        this._isSliding = false;\n        triggerSlidEvent();\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    }\n\n    _directionToOrder(direction) {\n      if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n        return direction;\n      }\n\n      if (isRTL()) {\n        return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n      }\n\n      return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n    }\n\n    _orderToDirection(order) {\n      if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n        return order;\n      }\n\n      if (isRTL()) {\n        return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n      }\n\n      return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n    } // Static\n\n\n    static carouselInterface(element, config) {\n      const data = Carousel.getOrCreateInstance(element, config);\n      let {\n        _config\n      } = data;\n\n      if (typeof config === 'object') {\n        _config = { ..._config,\n          ...config\n        };\n      }\n\n      const action = typeof config === 'string' ? config : _config.slide;\n\n      if (typeof config === 'number') {\n        data.to(config);\n      } else if (typeof action === 'string') {\n        if (typeof data[action] === 'undefined') {\n          throw new TypeError(`No method named \"${action}\"`);\n        }\n\n        data[action]();\n      } else if (_config.interval && _config.ride) {\n        data.pause();\n        data.cycle();\n      }\n    }\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        Carousel.carouselInterface(this, config);\n      });\n    }\n\n    static dataApiClickHandler(event) {\n      const target = getElementFromSelector(this);\n\n      if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n        return;\n      }\n\n      const config = { ...Manipulator.getDataAttributes(target),\n        ...Manipulator.getDataAttributes(this)\n      };\n      const slideIndex = this.getAttribute('data-bs-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel.carouselInterface(target, config);\n\n      if (slideIndex) {\n        Carousel.getInstance(target).to(slideIndex);\n      }\n\n      event.preventDefault();\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler);\n  EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n    const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n\n    for (let i = 0, len = carousels.length; i < len; i++) {\n      Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]));\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Carousel to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Carousel);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): collapse.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$a = 'collapse';\n  const DATA_KEY$9 = 'bs.collapse';\n  const EVENT_KEY$9 = `.${DATA_KEY$9}`;\n  const DATA_API_KEY$5 = '.data-api';\n  const Default$9 = {\n    toggle: true,\n    parent: null\n  };\n  const DefaultType$9 = {\n    toggle: 'boolean',\n    parent: '(null|element)'\n  };\n  const EVENT_SHOW$5 = `show${EVENT_KEY$9}`;\n  const EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`;\n  const EVENT_HIDE$5 = `hide${EVENT_KEY$9}`;\n  const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`;\n  const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`;\n  const CLASS_NAME_SHOW$7 = 'show';\n  const CLASS_NAME_COLLAPSE = 'collapse';\n  const CLASS_NAME_COLLAPSING = 'collapsing';\n  const CLASS_NAME_COLLAPSED = 'collapsed';\n  const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\n  const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\n  const WIDTH = 'width';\n  const HEIGHT = 'height';\n  const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\n  const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Collapse extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._isTransitioning = false;\n      this._config = this._getConfig(config);\n      this._triggerArray = [];\n      const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n\n      for (let i = 0, len = toggleList.length; i < len; i++) {\n        const elem = toggleList[i];\n        const selector = getSelectorFromElement(elem);\n        const filterElement = SelectorEngine.find(selector).filter(foundElem => foundElem === this._element);\n\n        if (selector !== null && filterElement.length) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._initializeChildren();\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    static get Default() {\n      return Default$9;\n    }\n\n    static get NAME() {\n      return NAME$a;\n    } // Public\n\n\n    toggle() {\n      if (this._isShown()) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    }\n\n    show() {\n      if (this._isTransitioning || this._isShown()) {\n        return;\n      }\n\n      let actives = [];\n      let activesData;\n\n      if (this._config.parent) {\n        const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n        actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth\n      }\n\n      const container = SelectorEngine.findOne(this._selector);\n\n      if (actives.length) {\n        const tempActiveData = actives.find(elem => container !== elem);\n        activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$5);\n\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n\n      actives.forEach(elemActive => {\n        if (container !== elemActive) {\n          Collapse.getOrCreateInstance(elemActive, {\n            toggle: false\n          }).hide();\n        }\n\n        if (!activesData) {\n          Data.set(elemActive, DATA_KEY$9, null);\n        }\n      });\n\n      const dimension = this._getDimension();\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSE);\n\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n      this._element.style[dimension] = 0;\n\n      this._addAriaAndCollapsedClass(this._triggerArray, true);\n\n      this._isTransitioning = true;\n\n      const complete = () => {\n        this._isTransitioning = false;\n\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n        this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n        this._element.style[dimension] = '';\n        EventHandler.trigger(this._element, EVENT_SHOWN$5);\n      };\n\n      const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      const scrollSize = `scroll${capitalizedDimension}`;\n\n      this._queueCallback(complete, this._element, true);\n\n      this._element.style[dimension] = `${this._element[scrollSize]}px`;\n    }\n\n    hide() {\n      if (this._isTransitioning || !this._isShown()) {\n        return;\n      }\n\n      const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$5);\n\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n\n      const dimension = this._getDimension();\n\n      this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n      reflow(this._element);\n\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n      const triggerArrayLength = this._triggerArray.length;\n\n      for (let i = 0; i < triggerArrayLength; i++) {\n        const trigger = this._triggerArray[i];\n        const elem = getElementFromSelector(trigger);\n\n        if (elem && !this._isShown(elem)) {\n          this._addAriaAndCollapsedClass([trigger], false);\n        }\n      }\n\n      this._isTransitioning = true;\n\n      const complete = () => {\n        this._isTransitioning = false;\n\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n        this._element.classList.add(CLASS_NAME_COLLAPSE);\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$5);\n      };\n\n      this._element.style[dimension] = '';\n\n      this._queueCallback(complete, this._element, true);\n    }\n\n    _isShown(element = this._element) {\n      return element.classList.contains(CLASS_NAME_SHOW$7);\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$9,\n        ...Manipulator.getDataAttributes(this._element),\n        ...config\n      };\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      config.parent = getElement(config.parent);\n      typeCheckConfig(NAME$a, config, DefaultType$9);\n      return config;\n    }\n\n    _getDimension() {\n      return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n    }\n\n    _initializeChildren() {\n      if (!this._config.parent) {\n        return;\n      }\n\n      const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n      SelectorEngine.find(SELECTOR_DATA_TOGGLE$4, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {\n        const selected = getElementFromSelector(element);\n\n        if (selected) {\n          this._addAriaAndCollapsedClass([element], this._isShown(selected));\n        }\n      });\n    }\n\n    _addAriaAndCollapsedClass(triggerArray, isOpen) {\n      if (!triggerArray.length) {\n        return;\n      }\n\n      triggerArray.forEach(elem => {\n        if (isOpen) {\n          elem.classList.remove(CLASS_NAME_COLLAPSED);\n        } else {\n          elem.classList.add(CLASS_NAME_COLLAPSED);\n        }\n\n        elem.setAttribute('aria-expanded', isOpen);\n      });\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const _config = {};\n\n        if (typeof config === 'string' && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        const data = Collapse.getOrCreateInstance(this, _config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    const selector = getSelectorFromElement(this);\n    const selectorElements = SelectorEngine.find(selector);\n    selectorElements.forEach(element => {\n      Collapse.getOrCreateInstance(element, {\n        toggle: false\n      }).toggle();\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Collapse to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Collapse);\n\n  var top = 'top';\n  var bottom = 'bottom';\n  var right = 'right';\n  var left = 'left';\n  var auto = 'auto';\n  var basePlacements = [top, bottom, right, left];\n  var start = 'start';\n  var end = 'end';\n  var clippingParents = 'clippingParents';\n  var viewport = 'viewport';\n  var popper = 'popper';\n  var reference = 'reference';\n  var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n    return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n  }, []);\n  var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n    return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n  }, []); // modifiers that need to read the DOM\n\n  var beforeRead = 'beforeRead';\n  var read = 'read';\n  var afterRead = 'afterRead'; // pure-logic modifiers\n\n  var beforeMain = 'beforeMain';\n  var main = 'main';\n  var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\n  var beforeWrite = 'beforeWrite';\n  var write = 'write';\n  var afterWrite = 'afterWrite';\n  var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];\n\n  function getNodeName(element) {\n    return element ? (element.nodeName || '').toLowerCase() : null;\n  }\n\n  function getWindow(node) {\n    if (node == null) {\n      return window;\n    }\n\n    if (node.toString() !== '[object Window]') {\n      var ownerDocument = node.ownerDocument;\n      return ownerDocument ? ownerDocument.defaultView || window : window;\n    }\n\n    return node;\n  }\n\n  function isElement(node) {\n    var OwnElement = getWindow(node).Element;\n    return node instanceof OwnElement || node instanceof Element;\n  }\n\n  function isHTMLElement(node) {\n    var OwnElement = getWindow(node).HTMLElement;\n    return node instanceof OwnElement || node instanceof HTMLElement;\n  }\n\n  function isShadowRoot(node) {\n    // IE 11 has no ShadowRoot\n    if (typeof ShadowRoot === 'undefined') {\n      return false;\n    }\n\n    var OwnElement = getWindow(node).ShadowRoot;\n    return node instanceof OwnElement || node instanceof ShadowRoot;\n  }\n\n  // and applies them to the HTMLElements such as popper and arrow\n\n  function applyStyles(_ref) {\n    var state = _ref.state;\n    Object.keys(state.elements).forEach(function (name) {\n      var style = state.styles[name] || {};\n      var attributes = state.attributes[name] || {};\n      var element = state.elements[name]; // arrow is optional + virtual elements\n\n      if (!isHTMLElement(element) || !getNodeName(element)) {\n        return;\n      } // Flow doesn't support to extend this property, but it's the most\n      // effective way to apply styles to an HTMLElement\n      // $FlowFixMe[cannot-write]\n\n\n      Object.assign(element.style, style);\n      Object.keys(attributes).forEach(function (name) {\n        var value = attributes[name];\n\n        if (value === false) {\n          element.removeAttribute(name);\n        } else {\n          element.setAttribute(name, value === true ? '' : value);\n        }\n      });\n    });\n  }\n\n  function effect$2(_ref2) {\n    var state = _ref2.state;\n    var initialStyles = {\n      popper: {\n        position: state.options.strategy,\n        left: '0',\n        top: '0',\n        margin: '0'\n      },\n      arrow: {\n        position: 'absolute'\n      },\n      reference: {}\n    };\n    Object.assign(state.elements.popper.style, initialStyles.popper);\n    state.styles = initialStyles;\n\n    if (state.elements.arrow) {\n      Object.assign(state.elements.arrow.style, initialStyles.arrow);\n    }\n\n    return function () {\n      Object.keys(state.elements).forEach(function (name) {\n        var element = state.elements[name];\n        var attributes = state.attributes[name] || {};\n        var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n        var style = styleProperties.reduce(function (style, property) {\n          style[property] = '';\n          return style;\n        }, {}); // arrow is optional + virtual elements\n\n        if (!isHTMLElement(element) || !getNodeName(element)) {\n          return;\n        }\n\n        Object.assign(element.style, style);\n        Object.keys(attributes).forEach(function (attribute) {\n          element.removeAttribute(attribute);\n        });\n      });\n    };\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const applyStyles$1 = {\n    name: 'applyStyles',\n    enabled: true,\n    phase: 'write',\n    fn: applyStyles,\n    effect: effect$2,\n    requires: ['computeStyles']\n  };\n\n  function getBasePlacement(placement) {\n    return placement.split('-')[0];\n  }\n\n  // import { isHTMLElement } from './instanceOf';\n  function getBoundingClientRect(element, // eslint-disable-next-line unused-imports/no-unused-vars\n  includeScale) {\n\n    var rect = element.getBoundingClientRect();\n    var scaleX = 1;\n    var scaleY = 1; // FIXME:\n    // `offsetWidth` returns an integer while `getBoundingClientRect`\n    // returns a float. This results in `scaleX` or `scaleY` being\n    // non-1 when it should be for elements that aren't a full pixel in\n    // width or height.\n    // if (isHTMLElement(element) && includeScale) {\n    //   const offsetHeight = element.offsetHeight;\n    //   const offsetWidth = element.offsetWidth;\n    //   // Do not attempt to divide by 0, otherwise we get `Infinity` as scale\n    //   // Fallback to 1 in case both values are `0`\n    //   if (offsetWidth > 0) {\n    //     scaleX = rect.width / offsetWidth || 1;\n    //   }\n    //   if (offsetHeight > 0) {\n    //     scaleY = rect.height / offsetHeight || 1;\n    //   }\n    // }\n\n    return {\n      width: rect.width / scaleX,\n      height: rect.height / scaleY,\n      top: rect.top / scaleY,\n      right: rect.right / scaleX,\n      bottom: rect.bottom / scaleY,\n      left: rect.left / scaleX,\n      x: rect.left / scaleX,\n      y: rect.top / scaleY\n    };\n  }\n\n  // means it doesn't take into account transforms.\n\n  function getLayoutRect(element) {\n    var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n    // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n    var width = element.offsetWidth;\n    var height = element.offsetHeight;\n\n    if (Math.abs(clientRect.width - width) <= 1) {\n      width = clientRect.width;\n    }\n\n    if (Math.abs(clientRect.height - height) <= 1) {\n      height = clientRect.height;\n    }\n\n    return {\n      x: element.offsetLeft,\n      y: element.offsetTop,\n      width: width,\n      height: height\n    };\n  }\n\n  function contains(parent, child) {\n    var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n    if (parent.contains(child)) {\n      return true;\n    } // then fallback to custom implementation with Shadow DOM support\n    else if (rootNode && isShadowRoot(rootNode)) {\n        var next = child;\n\n        do {\n          if (next && parent.isSameNode(next)) {\n            return true;\n          } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n          next = next.parentNode || next.host;\n        } while (next);\n      } // Give up, the result is false\n\n\n    return false;\n  }\n\n  function getComputedStyle$1(element) {\n    return getWindow(element).getComputedStyle(element);\n  }\n\n  function isTableElement(element) {\n    return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n  }\n\n  function getDocumentElement(element) {\n    // $FlowFixMe[incompatible-return]: assume body is always available\n    return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n    element.document) || window.document).documentElement;\n  }\n\n  function getParentNode(element) {\n    if (getNodeName(element) === 'html') {\n      return element;\n    }\n\n    return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n      // $FlowFixMe[incompatible-return]\n      // $FlowFixMe[prop-missing]\n      element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n      element.parentNode || ( // DOM Element detected\n      isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n      // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n      getDocumentElement(element) // fallback\n\n    );\n  }\n\n  function getTrueOffsetParent(element) {\n    if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n    getComputedStyle$1(element).position === 'fixed') {\n      return null;\n    }\n\n    return element.offsetParent;\n  } // `.offsetParent` reports `null` for fixed elements, while absolute elements\n  // return the containing block\n\n\n  function getContainingBlock(element) {\n    var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n    var isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n    if (isIE && isHTMLElement(element)) {\n      // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n      var elementCss = getComputedStyle$1(element);\n\n      if (elementCss.position === 'fixed') {\n        return null;\n      }\n    }\n\n    var currentNode = getParentNode(element);\n\n    while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n      var css = getComputedStyle$1(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n      // create a containing block.\n      // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n      if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n        return currentNode;\n      } else {\n        currentNode = currentNode.parentNode;\n      }\n    }\n\n    return null;\n  } // Gets the closest ancestor positioned element. Handles some edge cases,\n  // such as table ancestors and cross browser bugs.\n\n\n  function getOffsetParent(element) {\n    var window = getWindow(element);\n    var offsetParent = getTrueOffsetParent(element);\n\n    while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === 'static') {\n      offsetParent = getTrueOffsetParent(offsetParent);\n    }\n\n    if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle$1(offsetParent).position === 'static')) {\n      return window;\n    }\n\n    return offsetParent || getContainingBlock(element) || window;\n  }\n\n  function getMainAxisFromPlacement(placement) {\n    return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n  }\n\n  var max = Math.max;\n  var min = Math.min;\n  var round = Math.round;\n\n  function within(min$1, value, max$1) {\n    return max(min$1, min(value, max$1));\n  }\n\n  function getFreshSideObject() {\n    return {\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0\n    };\n  }\n\n  function mergePaddingObject(paddingObject) {\n    return Object.assign({}, getFreshSideObject(), paddingObject);\n  }\n\n  function expandToHashMap(value, keys) {\n    return keys.reduce(function (hashMap, key) {\n      hashMap[key] = value;\n      return hashMap;\n    }, {});\n  }\n\n  var toPaddingObject = function toPaddingObject(padding, state) {\n    padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n      placement: state.placement\n    })) : padding;\n    return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n  };\n\n  function arrow(_ref) {\n    var _state$modifiersData$;\n\n    var state = _ref.state,\n        name = _ref.name,\n        options = _ref.options;\n    var arrowElement = state.elements.arrow;\n    var popperOffsets = state.modifiersData.popperOffsets;\n    var basePlacement = getBasePlacement(state.placement);\n    var axis = getMainAxisFromPlacement(basePlacement);\n    var isVertical = [left, right].indexOf(basePlacement) >= 0;\n    var len = isVertical ? 'height' : 'width';\n\n    if (!arrowElement || !popperOffsets) {\n      return;\n    }\n\n    var paddingObject = toPaddingObject(options.padding, state);\n    var arrowRect = getLayoutRect(arrowElement);\n    var minProp = axis === 'y' ? top : left;\n    var maxProp = axis === 'y' ? bottom : right;\n    var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n    var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n    var arrowOffsetParent = getOffsetParent(arrowElement);\n    var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n    var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n    // outside of the popper bounds\n\n    var min = paddingObject[minProp];\n    var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n    var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n    var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n    var axisProp = axis;\n    state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n  }\n\n  function effect$1(_ref2) {\n    var state = _ref2.state,\n        options = _ref2.options;\n    var _options$element = options.element,\n        arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n    if (arrowElement == null) {\n      return;\n    } // CSS selector\n\n\n    if (typeof arrowElement === 'string') {\n      arrowElement = state.elements.popper.querySelector(arrowElement);\n\n      if (!arrowElement) {\n        return;\n      }\n    }\n\n    if (!contains(state.elements.popper, arrowElement)) {\n\n      return;\n    }\n\n    state.elements.arrow = arrowElement;\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const arrow$1 = {\n    name: 'arrow',\n    enabled: true,\n    phase: 'main',\n    fn: arrow,\n    effect: effect$1,\n    requires: ['popperOffsets'],\n    requiresIfExists: ['preventOverflow']\n  };\n\n  function getVariation(placement) {\n    return placement.split('-')[1];\n  }\n\n  var unsetSides = {\n    top: 'auto',\n    right: 'auto',\n    bottom: 'auto',\n    left: 'auto'\n  }; // Round the offsets to the nearest suitable subpixel based on the DPR.\n  // Zooming can change the DPR, but it seems to report a value that will\n  // cleanly divide the values into the appropriate subpixels.\n\n  function roundOffsetsByDPR(_ref) {\n    var x = _ref.x,\n        y = _ref.y;\n    var win = window;\n    var dpr = win.devicePixelRatio || 1;\n    return {\n      x: round(round(x * dpr) / dpr) || 0,\n      y: round(round(y * dpr) / dpr) || 0\n    };\n  }\n\n  function mapToStyles(_ref2) {\n    var _Object$assign2;\n\n    var popper = _ref2.popper,\n        popperRect = _ref2.popperRect,\n        placement = _ref2.placement,\n        variation = _ref2.variation,\n        offsets = _ref2.offsets,\n        position = _ref2.position,\n        gpuAcceleration = _ref2.gpuAcceleration,\n        adaptive = _ref2.adaptive,\n        roundOffsets = _ref2.roundOffsets;\n\n    var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,\n        _ref3$x = _ref3.x,\n        x = _ref3$x === void 0 ? 0 : _ref3$x,\n        _ref3$y = _ref3.y,\n        y = _ref3$y === void 0 ? 0 : _ref3$y;\n\n    var hasX = offsets.hasOwnProperty('x');\n    var hasY = offsets.hasOwnProperty('y');\n    var sideX = left;\n    var sideY = top;\n    var win = window;\n\n    if (adaptive) {\n      var offsetParent = getOffsetParent(popper);\n      var heightProp = 'clientHeight';\n      var widthProp = 'clientWidth';\n\n      if (offsetParent === getWindow(popper)) {\n        offsetParent = getDocumentElement(popper);\n\n        if (getComputedStyle$1(offsetParent).position !== 'static' && position === 'absolute') {\n          heightProp = 'scrollHeight';\n          widthProp = 'scrollWidth';\n        }\n      } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n      offsetParent = offsetParent;\n\n      if (placement === top || (placement === left || placement === right) && variation === end) {\n        sideY = bottom; // $FlowFixMe[prop-missing]\n\n        y -= offsetParent[heightProp] - popperRect.height;\n        y *= gpuAcceleration ? 1 : -1;\n      }\n\n      if (placement === left || (placement === top || placement === bottom) && variation === end) {\n        sideX = right; // $FlowFixMe[prop-missing]\n\n        x -= offsetParent[widthProp] - popperRect.width;\n        x *= gpuAcceleration ? 1 : -1;\n      }\n    }\n\n    var commonStyles = Object.assign({\n      position: position\n    }, adaptive && unsetSides);\n\n    if (gpuAcceleration) {\n      var _Object$assign;\n\n      return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n    }\n\n    return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n  }\n\n  function computeStyles(_ref4) {\n    var state = _ref4.state,\n        options = _ref4.options;\n    var _options$gpuAccelerat = options.gpuAcceleration,\n        gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n        _options$adaptive = options.adaptive,\n        adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n        _options$roundOffsets = options.roundOffsets,\n        roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n    var commonStyles = {\n      placement: getBasePlacement(state.placement),\n      variation: getVariation(state.placement),\n      popper: state.elements.popper,\n      popperRect: state.rects.popper,\n      gpuAcceleration: gpuAcceleration\n    };\n\n    if (state.modifiersData.popperOffsets != null) {\n      state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n        offsets: state.modifiersData.popperOffsets,\n        position: state.options.strategy,\n        adaptive: adaptive,\n        roundOffsets: roundOffsets\n      })));\n    }\n\n    if (state.modifiersData.arrow != null) {\n      state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n        offsets: state.modifiersData.arrow,\n        position: 'absolute',\n        adaptive: false,\n        roundOffsets: roundOffsets\n      })));\n    }\n\n    state.attributes.popper = Object.assign({}, state.attributes.popper, {\n      'data-popper-placement': state.placement\n    });\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const computeStyles$1 = {\n    name: 'computeStyles',\n    enabled: true,\n    phase: 'beforeWrite',\n    fn: computeStyles,\n    data: {}\n  };\n\n  var passive = {\n    passive: true\n  };\n\n  function effect(_ref) {\n    var state = _ref.state,\n        instance = _ref.instance,\n        options = _ref.options;\n    var _options$scroll = options.scroll,\n        scroll = _options$scroll === void 0 ? true : _options$scroll,\n        _options$resize = options.resize,\n        resize = _options$resize === void 0 ? true : _options$resize;\n    var window = getWindow(state.elements.popper);\n    var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n    if (scroll) {\n      scrollParents.forEach(function (scrollParent) {\n        scrollParent.addEventListener('scroll', instance.update, passive);\n      });\n    }\n\n    if (resize) {\n      window.addEventListener('resize', instance.update, passive);\n    }\n\n    return function () {\n      if (scroll) {\n        scrollParents.forEach(function (scrollParent) {\n          scrollParent.removeEventListener('scroll', instance.update, passive);\n        });\n      }\n\n      if (resize) {\n        window.removeEventListener('resize', instance.update, passive);\n      }\n    };\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const eventListeners = {\n    name: 'eventListeners',\n    enabled: true,\n    phase: 'write',\n    fn: function fn() {},\n    effect: effect,\n    data: {}\n  };\n\n  var hash$1 = {\n    left: 'right',\n    right: 'left',\n    bottom: 'top',\n    top: 'bottom'\n  };\n  function getOppositePlacement(placement) {\n    return placement.replace(/left|right|bottom|top/g, function (matched) {\n      return hash$1[matched];\n    });\n  }\n\n  var hash = {\n    start: 'end',\n    end: 'start'\n  };\n  function getOppositeVariationPlacement(placement) {\n    return placement.replace(/start|end/g, function (matched) {\n      return hash[matched];\n    });\n  }\n\n  function getWindowScroll(node) {\n    var win = getWindow(node);\n    var scrollLeft = win.pageXOffset;\n    var scrollTop = win.pageYOffset;\n    return {\n      scrollLeft: scrollLeft,\n      scrollTop: scrollTop\n    };\n  }\n\n  function getWindowScrollBarX(element) {\n    // If <html> has a CSS width greater than the viewport, then this will be\n    // incorrect for RTL.\n    // Popper 1 is broken in this case and never had a bug report so let's assume\n    // it's not an issue. I don't think anyone ever specifies width on <html>\n    // anyway.\n    // Browsers where the left scrollbar doesn't cause an issue report `0` for\n    // this (e.g. Edge 2019, IE11, Safari)\n    return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n  }\n\n  function getViewportRect(element) {\n    var win = getWindow(element);\n    var html = getDocumentElement(element);\n    var visualViewport = win.visualViewport;\n    var width = html.clientWidth;\n    var height = html.clientHeight;\n    var x = 0;\n    var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n    // can be obscured underneath it.\n    // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n    // if it isn't open, so if this isn't available, the popper will be detected\n    // to overflow the bottom of the screen too early.\n\n    if (visualViewport) {\n      width = visualViewport.width;\n      height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n      // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n      // errors due to floating point numbers, so we need to check precision.\n      // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n      // Feature detection fails in mobile emulation mode in Chrome.\n      // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n      // 0.001\n      // Fallback here: \"Not Safari\" userAgent\n\n      if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n        x = visualViewport.offsetLeft;\n        y = visualViewport.offsetTop;\n      }\n    }\n\n    return {\n      width: width,\n      height: height,\n      x: x + getWindowScrollBarX(element),\n      y: y\n    };\n  }\n\n  // of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\n  function getDocumentRect(element) {\n    var _element$ownerDocumen;\n\n    var html = getDocumentElement(element);\n    var winScroll = getWindowScroll(element);\n    var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n    var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n    var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n    var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n    var y = -winScroll.scrollTop;\n\n    if (getComputedStyle$1(body || html).direction === 'rtl') {\n      x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n    }\n\n    return {\n      width: width,\n      height: height,\n      x: x,\n      y: y\n    };\n  }\n\n  function isScrollParent(element) {\n    // Firefox wants us to check `-x` and `-y` variations as well\n    var _getComputedStyle = getComputedStyle$1(element),\n        overflow = _getComputedStyle.overflow,\n        overflowX = _getComputedStyle.overflowX,\n        overflowY = _getComputedStyle.overflowY;\n\n    return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n  }\n\n  function getScrollParent(node) {\n    if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n      // $FlowFixMe[incompatible-return]: assume body is always available\n      return node.ownerDocument.body;\n    }\n\n    if (isHTMLElement(node) && isScrollParent(node)) {\n      return node;\n    }\n\n    return getScrollParent(getParentNode(node));\n  }\n\n  /*\n  given a DOM element, return the list of all scroll parents, up the list of ancesors\n  until we get to the top window object. This list is what we attach scroll listeners\n  to, because if any of these parent elements scroll, we'll need to re-calculate the\n  reference element's position.\n  */\n\n  function listScrollParents(element, list) {\n    var _element$ownerDocumen;\n\n    if (list === void 0) {\n      list = [];\n    }\n\n    var scrollParent = getScrollParent(element);\n    var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n    var win = getWindow(scrollParent);\n    var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n    var updatedList = list.concat(target);\n    return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n    updatedList.concat(listScrollParents(getParentNode(target)));\n  }\n\n  function rectToClientRect(rect) {\n    return Object.assign({}, rect, {\n      left: rect.x,\n      top: rect.y,\n      right: rect.x + rect.width,\n      bottom: rect.y + rect.height\n    });\n  }\n\n  function getInnerBoundingClientRect(element) {\n    var rect = getBoundingClientRect(element);\n    rect.top = rect.top + element.clientTop;\n    rect.left = rect.left + element.clientLeft;\n    rect.bottom = rect.top + element.clientHeight;\n    rect.right = rect.left + element.clientWidth;\n    rect.width = element.clientWidth;\n    rect.height = element.clientHeight;\n    rect.x = rect.left;\n    rect.y = rect.top;\n    return rect;\n  }\n\n  function getClientRectFromMixedType(element, clippingParent) {\n    return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n  } // A \"clipping parent\" is an overflowable container with the characteristic of\n  // clipping (or hiding) overflowing elements with a position different from\n  // `initial`\n\n\n  function getClippingParents(element) {\n    var clippingParents = listScrollParents(getParentNode(element));\n    var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle$1(element).position) >= 0;\n    var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n    if (!isElement(clipperElement)) {\n      return [];\n    } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n    return clippingParents.filter(function (clippingParent) {\n      return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n    });\n  } // Gets the maximum area that the element is visible in due to any number of\n  // clipping parents\n\n\n  function getClippingRect(element, boundary, rootBoundary) {\n    var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n    var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n    var firstClippingParent = clippingParents[0];\n    var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n      var rect = getClientRectFromMixedType(element, clippingParent);\n      accRect.top = max(rect.top, accRect.top);\n      accRect.right = min(rect.right, accRect.right);\n      accRect.bottom = min(rect.bottom, accRect.bottom);\n      accRect.left = max(rect.left, accRect.left);\n      return accRect;\n    }, getClientRectFromMixedType(element, firstClippingParent));\n    clippingRect.width = clippingRect.right - clippingRect.left;\n    clippingRect.height = clippingRect.bottom - clippingRect.top;\n    clippingRect.x = clippingRect.left;\n    clippingRect.y = clippingRect.top;\n    return clippingRect;\n  }\n\n  function computeOffsets(_ref) {\n    var reference = _ref.reference,\n        element = _ref.element,\n        placement = _ref.placement;\n    var basePlacement = placement ? getBasePlacement(placement) : null;\n    var variation = placement ? getVariation(placement) : null;\n    var commonX = reference.x + reference.width / 2 - element.width / 2;\n    var commonY = reference.y + reference.height / 2 - element.height / 2;\n    var offsets;\n\n    switch (basePlacement) {\n      case top:\n        offsets = {\n          x: commonX,\n          y: reference.y - element.height\n        };\n        break;\n\n      case bottom:\n        offsets = {\n          x: commonX,\n          y: reference.y + reference.height\n        };\n        break;\n\n      case right:\n        offsets = {\n          x: reference.x + reference.width,\n          y: commonY\n        };\n        break;\n\n      case left:\n        offsets = {\n          x: reference.x - element.width,\n          y: commonY\n        };\n        break;\n\n      default:\n        offsets = {\n          x: reference.x,\n          y: reference.y\n        };\n    }\n\n    var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n    if (mainAxis != null) {\n      var len = mainAxis === 'y' ? 'height' : 'width';\n\n      switch (variation) {\n        case start:\n          offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n          break;\n\n        case end:\n          offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n          break;\n      }\n    }\n\n    return offsets;\n  }\n\n  function detectOverflow(state, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var _options = options,\n        _options$placement = _options.placement,\n        placement = _options$placement === void 0 ? state.placement : _options$placement,\n        _options$boundary = _options.boundary,\n        boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n        _options$rootBoundary = _options.rootBoundary,\n        rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n        _options$elementConte = _options.elementContext,\n        elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n        _options$altBoundary = _options.altBoundary,\n        altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n        _options$padding = _options.padding,\n        padding = _options$padding === void 0 ? 0 : _options$padding;\n    var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n    var altContext = elementContext === popper ? reference : popper;\n    var popperRect = state.rects.popper;\n    var element = state.elements[altBoundary ? altContext : elementContext];\n    var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n    var referenceClientRect = getBoundingClientRect(state.elements.reference);\n    var popperOffsets = computeOffsets({\n      reference: referenceClientRect,\n      element: popperRect,\n      strategy: 'absolute',\n      placement: placement\n    });\n    var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n    var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n    // 0 or negative = within the clipping rect\n\n    var overflowOffsets = {\n      top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n      bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n      left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n      right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n    };\n    var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n    if (elementContext === popper && offsetData) {\n      var offset = offsetData[placement];\n      Object.keys(overflowOffsets).forEach(function (key) {\n        var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n        var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n        overflowOffsets[key] += offset[axis] * multiply;\n      });\n    }\n\n    return overflowOffsets;\n  }\n\n  function computeAutoPlacement(state, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var _options = options,\n        placement = _options.placement,\n        boundary = _options.boundary,\n        rootBoundary = _options.rootBoundary,\n        padding = _options.padding,\n        flipVariations = _options.flipVariations,\n        _options$allowedAutoP = _options.allowedAutoPlacements,\n        allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;\n    var variation = getVariation(placement);\n    var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n      return getVariation(placement) === variation;\n    }) : basePlacements;\n    var allowedPlacements = placements$1.filter(function (placement) {\n      return allowedAutoPlacements.indexOf(placement) >= 0;\n    });\n\n    if (allowedPlacements.length === 0) {\n      allowedPlacements = placements$1;\n    } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n    var overflows = allowedPlacements.reduce(function (acc, placement) {\n      acc[placement] = detectOverflow(state, {\n        placement: placement,\n        boundary: boundary,\n        rootBoundary: rootBoundary,\n        padding: padding\n      })[getBasePlacement(placement)];\n      return acc;\n    }, {});\n    return Object.keys(overflows).sort(function (a, b) {\n      return overflows[a] - overflows[b];\n    });\n  }\n\n  function getExpandedFallbackPlacements(placement) {\n    if (getBasePlacement(placement) === auto) {\n      return [];\n    }\n\n    var oppositePlacement = getOppositePlacement(placement);\n    return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n  }\n\n  function flip(_ref) {\n    var state = _ref.state,\n        options = _ref.options,\n        name = _ref.name;\n\n    if (state.modifiersData[name]._skip) {\n      return;\n    }\n\n    var _options$mainAxis = options.mainAxis,\n        checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n        _options$altAxis = options.altAxis,\n        checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n        specifiedFallbackPlacements = options.fallbackPlacements,\n        padding = options.padding,\n        boundary = options.boundary,\n        rootBoundary = options.rootBoundary,\n        altBoundary = options.altBoundary,\n        _options$flipVariatio = options.flipVariations,\n        flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n        allowedAutoPlacements = options.allowedAutoPlacements;\n    var preferredPlacement = state.options.placement;\n    var basePlacement = getBasePlacement(preferredPlacement);\n    var isBasePlacement = basePlacement === preferredPlacement;\n    var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n    var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n      return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n        placement: placement,\n        boundary: boundary,\n        rootBoundary: rootBoundary,\n        padding: padding,\n        flipVariations: flipVariations,\n        allowedAutoPlacements: allowedAutoPlacements\n      }) : placement);\n    }, []);\n    var referenceRect = state.rects.reference;\n    var popperRect = state.rects.popper;\n    var checksMap = new Map();\n    var makeFallbackChecks = true;\n    var firstFittingPlacement = placements[0];\n\n    for (var i = 0; i < placements.length; i++) {\n      var placement = placements[i];\n\n      var _basePlacement = getBasePlacement(placement);\n\n      var isStartVariation = getVariation(placement) === start;\n      var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n      var len = isVertical ? 'width' : 'height';\n      var overflow = detectOverflow(state, {\n        placement: placement,\n        boundary: boundary,\n        rootBoundary: rootBoundary,\n        altBoundary: altBoundary,\n        padding: padding\n      });\n      var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n      if (referenceRect[len] > popperRect[len]) {\n        mainVariationSide = getOppositePlacement(mainVariationSide);\n      }\n\n      var altVariationSide = getOppositePlacement(mainVariationSide);\n      var checks = [];\n\n      if (checkMainAxis) {\n        checks.push(overflow[_basePlacement] <= 0);\n      }\n\n      if (checkAltAxis) {\n        checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n      }\n\n      if (checks.every(function (check) {\n        return check;\n      })) {\n        firstFittingPlacement = placement;\n        makeFallbackChecks = false;\n        break;\n      }\n\n      checksMap.set(placement, checks);\n    }\n\n    if (makeFallbackChecks) {\n      // `2` may be desired in some cases – research later\n      var numberOfChecks = flipVariations ? 3 : 1;\n\n      var _loop = function _loop(_i) {\n        var fittingPlacement = placements.find(function (placement) {\n          var checks = checksMap.get(placement);\n\n          if (checks) {\n            return checks.slice(0, _i).every(function (check) {\n              return check;\n            });\n          }\n        });\n\n        if (fittingPlacement) {\n          firstFittingPlacement = fittingPlacement;\n          return \"break\";\n        }\n      };\n\n      for (var _i = numberOfChecks; _i > 0; _i--) {\n        var _ret = _loop(_i);\n\n        if (_ret === \"break\") break;\n      }\n    }\n\n    if (state.placement !== firstFittingPlacement) {\n      state.modifiersData[name]._skip = true;\n      state.placement = firstFittingPlacement;\n      state.reset = true;\n    }\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const flip$1 = {\n    name: 'flip',\n    enabled: true,\n    phase: 'main',\n    fn: flip,\n    requiresIfExists: ['offset'],\n    data: {\n      _skip: false\n    }\n  };\n\n  function getSideOffsets(overflow, rect, preventedOffsets) {\n    if (preventedOffsets === void 0) {\n      preventedOffsets = {\n        x: 0,\n        y: 0\n      };\n    }\n\n    return {\n      top: overflow.top - rect.height - preventedOffsets.y,\n      right: overflow.right - rect.width + preventedOffsets.x,\n      bottom: overflow.bottom - rect.height + preventedOffsets.y,\n      left: overflow.left - rect.width - preventedOffsets.x\n    };\n  }\n\n  function isAnySideFullyClipped(overflow) {\n    return [top, right, bottom, left].some(function (side) {\n      return overflow[side] >= 0;\n    });\n  }\n\n  function hide(_ref) {\n    var state = _ref.state,\n        name = _ref.name;\n    var referenceRect = state.rects.reference;\n    var popperRect = state.rects.popper;\n    var preventedOffsets = state.modifiersData.preventOverflow;\n    var referenceOverflow = detectOverflow(state, {\n      elementContext: 'reference'\n    });\n    var popperAltOverflow = detectOverflow(state, {\n      altBoundary: true\n    });\n    var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n    var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n    var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n    var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n    state.modifiersData[name] = {\n      referenceClippingOffsets: referenceClippingOffsets,\n      popperEscapeOffsets: popperEscapeOffsets,\n      isReferenceHidden: isReferenceHidden,\n      hasPopperEscaped: hasPopperEscaped\n    };\n    state.attributes.popper = Object.assign({}, state.attributes.popper, {\n      'data-popper-reference-hidden': isReferenceHidden,\n      'data-popper-escaped': hasPopperEscaped\n    });\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const hide$1 = {\n    name: 'hide',\n    enabled: true,\n    phase: 'main',\n    requiresIfExists: ['preventOverflow'],\n    fn: hide\n  };\n\n  function distanceAndSkiddingToXY(placement, rects, offset) {\n    var basePlacement = getBasePlacement(placement);\n    var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n    var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n      placement: placement\n    })) : offset,\n        skidding = _ref[0],\n        distance = _ref[1];\n\n    skidding = skidding || 0;\n    distance = (distance || 0) * invertDistance;\n    return [left, right].indexOf(basePlacement) >= 0 ? {\n      x: distance,\n      y: skidding\n    } : {\n      x: skidding,\n      y: distance\n    };\n  }\n\n  function offset(_ref2) {\n    var state = _ref2.state,\n        options = _ref2.options,\n        name = _ref2.name;\n    var _options$offset = options.offset,\n        offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n    var data = placements.reduce(function (acc, placement) {\n      acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n      return acc;\n    }, {});\n    var _data$state$placement = data[state.placement],\n        x = _data$state$placement.x,\n        y = _data$state$placement.y;\n\n    if (state.modifiersData.popperOffsets != null) {\n      state.modifiersData.popperOffsets.x += x;\n      state.modifiersData.popperOffsets.y += y;\n    }\n\n    state.modifiersData[name] = data;\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const offset$1 = {\n    name: 'offset',\n    enabled: true,\n    phase: 'main',\n    requires: ['popperOffsets'],\n    fn: offset\n  };\n\n  function popperOffsets(_ref) {\n    var state = _ref.state,\n        name = _ref.name;\n    // Offsets are the actual position the popper needs to have to be\n    // properly positioned near its reference element\n    // This is the most basic placement, and will be adjusted by\n    // the modifiers in the next step\n    state.modifiersData[name] = computeOffsets({\n      reference: state.rects.reference,\n      element: state.rects.popper,\n      strategy: 'absolute',\n      placement: state.placement\n    });\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const popperOffsets$1 = {\n    name: 'popperOffsets',\n    enabled: true,\n    phase: 'read',\n    fn: popperOffsets,\n    data: {}\n  };\n\n  function getAltAxis(axis) {\n    return axis === 'x' ? 'y' : 'x';\n  }\n\n  function preventOverflow(_ref) {\n    var state = _ref.state,\n        options = _ref.options,\n        name = _ref.name;\n    var _options$mainAxis = options.mainAxis,\n        checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n        _options$altAxis = options.altAxis,\n        checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n        boundary = options.boundary,\n        rootBoundary = options.rootBoundary,\n        altBoundary = options.altBoundary,\n        padding = options.padding,\n        _options$tether = options.tether,\n        tether = _options$tether === void 0 ? true : _options$tether,\n        _options$tetherOffset = options.tetherOffset,\n        tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n    var overflow = detectOverflow(state, {\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding,\n      altBoundary: altBoundary\n    });\n    var basePlacement = getBasePlacement(state.placement);\n    var variation = getVariation(state.placement);\n    var isBasePlacement = !variation;\n    var mainAxis = getMainAxisFromPlacement(basePlacement);\n    var altAxis = getAltAxis(mainAxis);\n    var popperOffsets = state.modifiersData.popperOffsets;\n    var referenceRect = state.rects.reference;\n    var popperRect = state.rects.popper;\n    var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n      placement: state.placement\n    })) : tetherOffset;\n    var data = {\n      x: 0,\n      y: 0\n    };\n\n    if (!popperOffsets) {\n      return;\n    }\n\n    if (checkMainAxis || checkAltAxis) {\n      var mainSide = mainAxis === 'y' ? top : left;\n      var altSide = mainAxis === 'y' ? bottom : right;\n      var len = mainAxis === 'y' ? 'height' : 'width';\n      var offset = popperOffsets[mainAxis];\n      var min$1 = popperOffsets[mainAxis] + overflow[mainSide];\n      var max$1 = popperOffsets[mainAxis] - overflow[altSide];\n      var additive = tether ? -popperRect[len] / 2 : 0;\n      var minLen = variation === start ? referenceRect[len] : popperRect[len];\n      var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n      // outside the reference bounds\n\n      var arrowElement = state.elements.arrow;\n      var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n        width: 0,\n        height: 0\n      };\n      var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n      var arrowPaddingMin = arrowPaddingObject[mainSide];\n      var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n      // to include its full size in the calculation. If the reference is small\n      // and near the edge of a boundary, the popper can overflow even if the\n      // reference is not overflowing as well (e.g. virtual elements with no\n      // width or height)\n\n      var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n      var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n      var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n      var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n      var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n      var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n      var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n      var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n\n      if (checkMainAxis) {\n        var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1);\n        popperOffsets[mainAxis] = preventedOffset;\n        data[mainAxis] = preventedOffset - offset;\n      }\n\n      if (checkAltAxis) {\n        var _mainSide = mainAxis === 'x' ? top : left;\n\n        var _altSide = mainAxis === 'x' ? bottom : right;\n\n        var _offset = popperOffsets[altAxis];\n\n        var _min = _offset + overflow[_mainSide];\n\n        var _max = _offset - overflow[_altSide];\n\n        var _preventedOffset = within(tether ? min(_min, tetherMin) : _min, _offset, tether ? max(_max, tetherMax) : _max);\n\n        popperOffsets[altAxis] = _preventedOffset;\n        data[altAxis] = _preventedOffset - _offset;\n      }\n    }\n\n    state.modifiersData[name] = data;\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  const preventOverflow$1 = {\n    name: 'preventOverflow',\n    enabled: true,\n    phase: 'main',\n    fn: preventOverflow,\n    requiresIfExists: ['offset']\n  };\n\n  function getHTMLElementScroll(element) {\n    return {\n      scrollLeft: element.scrollLeft,\n      scrollTop: element.scrollTop\n    };\n  }\n\n  function getNodeScroll(node) {\n    if (node === getWindow(node) || !isHTMLElement(node)) {\n      return getWindowScroll(node);\n    } else {\n      return getHTMLElementScroll(node);\n    }\n  }\n\n  function isElementScaled(element) {\n    var rect = element.getBoundingClientRect();\n    var scaleX = rect.width / element.offsetWidth || 1;\n    var scaleY = rect.height / element.offsetHeight || 1;\n    return scaleX !== 1 || scaleY !== 1;\n  } // Returns the composite rect of an element relative to its offsetParent.\n  // Composite means it takes into account transforms as well as layout.\n\n\n  function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n    if (isFixed === void 0) {\n      isFixed = false;\n    }\n\n    var isOffsetParentAnElement = isHTMLElement(offsetParent);\n    isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n    var documentElement = getDocumentElement(offsetParent);\n    var rect = getBoundingClientRect(elementOrVirtualElement);\n    var scroll = {\n      scrollLeft: 0,\n      scrollTop: 0\n    };\n    var offsets = {\n      x: 0,\n      y: 0\n    };\n\n    if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n      if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n      isScrollParent(documentElement)) {\n        scroll = getNodeScroll(offsetParent);\n      }\n\n      if (isHTMLElement(offsetParent)) {\n        offsets = getBoundingClientRect(offsetParent);\n        offsets.x += offsetParent.clientLeft;\n        offsets.y += offsetParent.clientTop;\n      } else if (documentElement) {\n        offsets.x = getWindowScrollBarX(documentElement);\n      }\n    }\n\n    return {\n      x: rect.left + scroll.scrollLeft - offsets.x,\n      y: rect.top + scroll.scrollTop - offsets.y,\n      width: rect.width,\n      height: rect.height\n    };\n  }\n\n  function order(modifiers) {\n    var map = new Map();\n    var visited = new Set();\n    var result = [];\n    modifiers.forEach(function (modifier) {\n      map.set(modifier.name, modifier);\n    }); // On visiting object, check for its dependencies and visit them recursively\n\n    function sort(modifier) {\n      visited.add(modifier.name);\n      var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n      requires.forEach(function (dep) {\n        if (!visited.has(dep)) {\n          var depModifier = map.get(dep);\n\n          if (depModifier) {\n            sort(depModifier);\n          }\n        }\n      });\n      result.push(modifier);\n    }\n\n    modifiers.forEach(function (modifier) {\n      if (!visited.has(modifier.name)) {\n        // check for visited object\n        sort(modifier);\n      }\n    });\n    return result;\n  }\n\n  function orderModifiers(modifiers) {\n    // order based on dependencies\n    var orderedModifiers = order(modifiers); // order based on phase\n\n    return modifierPhases.reduce(function (acc, phase) {\n      return acc.concat(orderedModifiers.filter(function (modifier) {\n        return modifier.phase === phase;\n      }));\n    }, []);\n  }\n\n  function debounce(fn) {\n    var pending;\n    return function () {\n      if (!pending) {\n        pending = new Promise(function (resolve) {\n          Promise.resolve().then(function () {\n            pending = undefined;\n            resolve(fn());\n          });\n        });\n      }\n\n      return pending;\n    };\n  }\n\n  function mergeByName(modifiers) {\n    var merged = modifiers.reduce(function (merged, current) {\n      var existing = merged[current.name];\n      merged[current.name] = existing ? Object.assign({}, existing, current, {\n        options: Object.assign({}, existing.options, current.options),\n        data: Object.assign({}, existing.data, current.data)\n      }) : current;\n      return merged;\n    }, {}); // IE11 does not support Object.values\n\n    return Object.keys(merged).map(function (key) {\n      return merged[key];\n    });\n  }\n\n  var DEFAULT_OPTIONS = {\n    placement: 'bottom',\n    modifiers: [],\n    strategy: 'absolute'\n  };\n\n  function areValidElements() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return !args.some(function (element) {\n      return !(element && typeof element.getBoundingClientRect === 'function');\n    });\n  }\n\n  function popperGenerator(generatorOptions) {\n    if (generatorOptions === void 0) {\n      generatorOptions = {};\n    }\n\n    var _generatorOptions = generatorOptions,\n        _generatorOptions$def = _generatorOptions.defaultModifiers,\n        defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n        _generatorOptions$def2 = _generatorOptions.defaultOptions,\n        defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n    return function createPopper(reference, popper, options) {\n      if (options === void 0) {\n        options = defaultOptions;\n      }\n\n      var state = {\n        placement: 'bottom',\n        orderedModifiers: [],\n        options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n        modifiersData: {},\n        elements: {\n          reference: reference,\n          popper: popper\n        },\n        attributes: {},\n        styles: {}\n      };\n      var effectCleanupFns = [];\n      var isDestroyed = false;\n      var instance = {\n        state: state,\n        setOptions: function setOptions(setOptionsAction) {\n          var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n          cleanupModifierEffects();\n          state.options = Object.assign({}, defaultOptions, state.options, options);\n          state.scrollParents = {\n            reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n            popper: listScrollParents(popper)\n          }; // Orders the modifiers based on their dependencies and `phase`\n          // properties\n\n          var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n          state.orderedModifiers = orderedModifiers.filter(function (m) {\n            return m.enabled;\n          }); // Validate the provided modifiers so that the consumer will get warned\n\n          runModifierEffects();\n          return instance.update();\n        },\n        // Sync update – it will always be executed, even if not necessary. This\n        // is useful for low frequency updates where sync behavior simplifies the\n        // logic.\n        // For high frequency updates (e.g. `resize` and `scroll` events), always\n        // prefer the async Popper#update method\n        forceUpdate: function forceUpdate() {\n          if (isDestroyed) {\n            return;\n          }\n\n          var _state$elements = state.elements,\n              reference = _state$elements.reference,\n              popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n          // anymore\n\n          if (!areValidElements(reference, popper)) {\n\n            return;\n          } // Store the reference and popper rects to be read by modifiers\n\n\n          state.rects = {\n            reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n            popper: getLayoutRect(popper)\n          }; // Modifiers have the ability to reset the current update cycle. The\n          // most common use case for this is the `flip` modifier changing the\n          // placement, which then needs to re-run all the modifiers, because the\n          // logic was previously ran for the previous placement and is therefore\n          // stale/incorrect\n\n          state.reset = false;\n          state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n          // is filled with the initial data specified by the modifier. This means\n          // it doesn't persist and is fresh on each update.\n          // To ensure persistent data, use `${name}#persistent`\n\n          state.orderedModifiers.forEach(function (modifier) {\n            return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n          });\n\n          for (var index = 0; index < state.orderedModifiers.length; index++) {\n\n            if (state.reset === true) {\n              state.reset = false;\n              index = -1;\n              continue;\n            }\n\n            var _state$orderedModifie = state.orderedModifiers[index],\n                fn = _state$orderedModifie.fn,\n                _state$orderedModifie2 = _state$orderedModifie.options,\n                _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n                name = _state$orderedModifie.name;\n\n            if (typeof fn === 'function') {\n              state = fn({\n                state: state,\n                options: _options,\n                name: name,\n                instance: instance\n              }) || state;\n            }\n          }\n        },\n        // Async and optimistically optimized update – it will not be executed if\n        // not necessary (debounced to run at most once-per-tick)\n        update: debounce(function () {\n          return new Promise(function (resolve) {\n            instance.forceUpdate();\n            resolve(state);\n          });\n        }),\n        destroy: function destroy() {\n          cleanupModifierEffects();\n          isDestroyed = true;\n        }\n      };\n\n      if (!areValidElements(reference, popper)) {\n\n        return instance;\n      }\n\n      instance.setOptions(options).then(function (state) {\n        if (!isDestroyed && options.onFirstUpdate) {\n          options.onFirstUpdate(state);\n        }\n      }); // Modifiers have the ability to execute arbitrary code before the first\n      // update cycle runs. They will be executed in the same order as the update\n      // cycle. This is useful when a modifier adds some persistent data that\n      // other modifiers need to use, but the modifier is run after the dependent\n      // one.\n\n      function runModifierEffects() {\n        state.orderedModifiers.forEach(function (_ref3) {\n          var name = _ref3.name,\n              _ref3$options = _ref3.options,\n              options = _ref3$options === void 0 ? {} : _ref3$options,\n              effect = _ref3.effect;\n\n          if (typeof effect === 'function') {\n            var cleanupFn = effect({\n              state: state,\n              name: name,\n              instance: instance,\n              options: options\n            });\n\n            var noopFn = function noopFn() {};\n\n            effectCleanupFns.push(cleanupFn || noopFn);\n          }\n        });\n      }\n\n      function cleanupModifierEffects() {\n        effectCleanupFns.forEach(function (fn) {\n          return fn();\n        });\n        effectCleanupFns = [];\n      }\n\n      return instance;\n    };\n  }\n  var createPopper$2 = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\n  var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1];\n  var createPopper$1 = /*#__PURE__*/popperGenerator({\n    defaultModifiers: defaultModifiers$1\n  }); // eslint-disable-next-line import/no-unused-modules\n\n  var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1];\n  var createPopper = /*#__PURE__*/popperGenerator({\n    defaultModifiers: defaultModifiers\n  }); // eslint-disable-next-line import/no-unused-modules\n\n  const Popper = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    popperGenerator,\n    detectOverflow,\n    createPopperBase: createPopper$2,\n    createPopper,\n    createPopperLite: createPopper$1,\n    top,\n    bottom,\n    right,\n    left,\n    auto,\n    basePlacements,\n    start,\n    end,\n    clippingParents,\n    viewport,\n    popper,\n    reference,\n    variationPlacements,\n    placements,\n    beforeRead,\n    read,\n    afterRead,\n    beforeMain,\n    main,\n    afterMain,\n    beforeWrite,\n    write,\n    afterWrite,\n    modifierPhases,\n    applyStyles: applyStyles$1,\n    arrow: arrow$1,\n    computeStyles: computeStyles$1,\n    eventListeners,\n    flip: flip$1,\n    hide: hide$1,\n    offset: offset$1,\n    popperOffsets: popperOffsets$1,\n    preventOverflow: preventOverflow$1\n  });\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): dropdown.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$9 = 'dropdown';\n  const DATA_KEY$8 = 'bs.dropdown';\n  const EVENT_KEY$8 = `.${DATA_KEY$8}`;\n  const DATA_API_KEY$4 = '.data-api';\n  const ESCAPE_KEY$2 = 'Escape';\n  const SPACE_KEY = 'Space';\n  const TAB_KEY$1 = 'Tab';\n  const ARROW_UP_KEY = 'ArrowUp';\n  const ARROW_DOWN_KEY = 'ArrowDown';\n  const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\n  const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`);\n  const EVENT_HIDE$4 = `hide${EVENT_KEY$8}`;\n  const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`;\n  const EVENT_SHOW$4 = `show${EVENT_KEY$8}`;\n  const EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`;\n  const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const CLASS_NAME_SHOW$6 = 'show';\n  const CLASS_NAME_DROPUP = 'dropup';\n  const CLASS_NAME_DROPEND = 'dropend';\n  const CLASS_NAME_DROPSTART = 'dropstart';\n  const CLASS_NAME_NAVBAR = 'navbar';\n  const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]';\n  const SELECTOR_MENU = '.dropdown-menu';\n  const SELECTOR_NAVBAR_NAV = '.navbar-nav';\n  const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\n  const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\n  const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\n  const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\n  const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\n  const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\n  const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\n  const Default$8 = {\n    offset: [0, 2],\n    boundary: 'clippingParents',\n    reference: 'toggle',\n    display: 'dynamic',\n    popperConfig: null,\n    autoClose: true\n  };\n  const DefaultType$8 = {\n    offset: '(array|string|function)',\n    boundary: '(string|element)',\n    reference: '(string|element|object)',\n    display: 'string',\n    popperConfig: '(null|object|function)',\n    autoClose: '(boolean|string)'\n  };\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Dropdown extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n    } // Getters\n\n\n    static get Default() {\n      return Default$8;\n    }\n\n    static get DefaultType() {\n      return DefaultType$8;\n    }\n\n    static get NAME() {\n      return NAME$9;\n    } // Public\n\n\n    toggle() {\n      return this._isShown() ? this.hide() : this.show();\n    }\n\n    show() {\n      if (isDisabled(this._element) || this._isShown(this._menu)) {\n        return;\n      }\n\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, relatedTarget);\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar\n\n      if (this._inNavbar) {\n        Manipulator.setDataAttribute(this._menu, 'popper', 'none');\n      } else {\n        this._createPopper(parent);\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {\n        [].concat(...document.body.children).forEach(elem => EventHandler.on(elem, 'mouseover', noop));\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      this._menu.classList.add(CLASS_NAME_SHOW$6);\n\n      this._element.classList.add(CLASS_NAME_SHOW$6);\n\n      EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);\n    }\n\n    hide() {\n      if (isDisabled(this._element) || !this._isShown(this._menu)) {\n        return;\n      }\n\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n\n      this._completeHide(relatedTarget);\n    }\n\n    dispose() {\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      super.dispose();\n    }\n\n    update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper) {\n        this._popper.update();\n      }\n    } // Private\n\n\n    _completeHide(relatedTarget) {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      } // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(elem => EventHandler.off(elem, 'mouseover', noop));\n      }\n\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      this._menu.classList.remove(CLASS_NAME_SHOW$6);\n\n      this._element.classList.remove(CLASS_NAME_SHOW$6);\n\n      this._element.setAttribute('aria-expanded', 'false');\n\n      Manipulator.removeDataAttribute(this._menu, 'popper');\n      EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget);\n    }\n\n    _getConfig(config) {\n      config = { ...this.constructor.Default,\n        ...Manipulator.getDataAttributes(this._element),\n        ...config\n      };\n      typeCheckConfig(NAME$9, config, this.constructor.DefaultType);\n\n      if (typeof config.reference === 'object' && !isElement$1(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n        // Popper virtual elements require a getBoundingClientRect method\n        throw new TypeError(`${NAME$9.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n      }\n\n      return config;\n    }\n\n    _createPopper(parent) {\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n      }\n\n      let referenceElement = this._element;\n\n      if (this._config.reference === 'parent') {\n        referenceElement = parent;\n      } else if (isElement$1(this._config.reference)) {\n        referenceElement = getElement(this._config.reference);\n      } else if (typeof this._config.reference === 'object') {\n        referenceElement = this._config.reference;\n      }\n\n      const popperConfig = this._getPopperConfig();\n\n      const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);\n      this._popper = createPopper(referenceElement, this._menu, popperConfig);\n\n      if (isDisplayStatic) {\n        Manipulator.setDataAttribute(this._menu, 'popper', 'static');\n      }\n    }\n\n    _isShown(element = this._element) {\n      return element.classList.contains(CLASS_NAME_SHOW$6);\n    }\n\n    _getMenuElement() {\n      return SelectorEngine.next(this._element, SELECTOR_MENU)[0];\n    }\n\n    _getPlacement() {\n      const parentDropdown = this._element.parentNode;\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n        return PLACEMENT_RIGHT;\n      }\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n        return PLACEMENT_LEFT;\n      } // We need to trim the value because custom properties can also include spaces\n\n\n      const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n        return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n      }\n\n      return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n    }\n\n    _detectNavbar() {\n      return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;\n    }\n\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n\n      if (typeof offset === 'string') {\n        return offset.split(',').map(val => Number.parseInt(val, 10));\n      }\n\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n\n      return offset;\n    }\n\n    _getPopperConfig() {\n      const defaultBsPopperConfig = {\n        placement: this._getPlacement(),\n        modifiers: [{\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }]\n      }; // Disable Popper if we have a static display\n\n      if (this._config.display === 'static') {\n        defaultBsPopperConfig.modifiers = [{\n          name: 'applyStyles',\n          enabled: false\n        }];\n      }\n\n      return { ...defaultBsPopperConfig,\n        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n      };\n    }\n\n    _selectMenuItem({\n      key,\n      target\n    }) {\n      const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);\n\n      if (!items.length) {\n        return;\n      } // if target isn't included in items (e.g. when expanding the dropdown)\n      // allow cycling to get the last item in case key equals ARROW_UP_KEY\n\n\n      getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Dropdown.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      });\n    }\n\n    static clearMenus(event) {\n      if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1)) {\n        return;\n      }\n\n      const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3);\n\n      for (let i = 0, len = toggles.length; i < len; i++) {\n        const context = Dropdown.getInstance(toggles[i]);\n\n        if (!context || context._config.autoClose === false) {\n          continue;\n        }\n\n        if (!context._isShown()) {\n          continue;\n        }\n\n        const relatedTarget = {\n          relatedTarget: context._element\n        };\n\n        if (event) {\n          const composedPath = event.composedPath();\n          const isMenuTarget = composedPath.includes(context._menu);\n\n          if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n            continue;\n          } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n\n\n          if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n            continue;\n          }\n\n          if (event.type === 'click') {\n            relatedTarget.clickEvent = event;\n          }\n        }\n\n        context._completeHide(relatedTarget);\n      }\n    }\n\n    static getParentFromElement(element) {\n      return getElementFromSelector(element) || element.parentNode;\n    }\n\n    static dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY$2 && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {\n        return;\n      }\n\n      const isActive = this.classList.contains(CLASS_NAME_SHOW$6);\n\n      if (!isActive && event.key === ESCAPE_KEY$2) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (isDisabled(this)) {\n        return;\n      }\n\n      const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];\n      const instance = Dropdown.getOrCreateInstance(getToggleButton);\n\n      if (event.key === ESCAPE_KEY$2) {\n        instance.hide();\n        return;\n      }\n\n      if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n        if (!isActive) {\n          instance.show();\n        }\n\n        instance._selectMenuItem(event);\n\n        return;\n      }\n\n      if (!isActive || event.key === SPACE_KEY) {\n        Dropdown.clearMenus();\n      }\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n    event.preventDefault();\n    Dropdown.getOrCreateInstance(this).toggle();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Dropdown to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Dropdown);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/scrollBar.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\n  const SELECTOR_STICKY_CONTENT = '.sticky-top';\n\n  class ScrollBarHelper {\n    constructor() {\n      this._element = document.body;\n    }\n\n    getWidth() {\n      // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n      const documentWidth = document.documentElement.clientWidth;\n      return Math.abs(window.innerWidth - documentWidth);\n    }\n\n    hide() {\n      const width = this.getWidth();\n\n      this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width\n\n\n      this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n\n\n      this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);\n\n      this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);\n    }\n\n    _disableOverFlow() {\n      this._saveInitialAttribute(this._element, 'overflow');\n\n      this._element.style.overflow = 'hidden';\n    }\n\n    _setElementAttributes(selector, styleProp, callback) {\n      const scrollbarWidth = this.getWidth();\n\n      const manipulationCallBack = element => {\n        if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n          return;\n        }\n\n        this._saveInitialAttribute(element, styleProp);\n\n        const calculatedValue = window.getComputedStyle(element)[styleProp];\n        element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;\n      };\n\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n\n    reset() {\n      this._resetElementAttributes(this._element, 'overflow');\n\n      this._resetElementAttributes(this._element, 'paddingRight');\n\n      this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');\n\n      this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');\n    }\n\n    _saveInitialAttribute(element, styleProp) {\n      const actualValue = element.style[styleProp];\n\n      if (actualValue) {\n        Manipulator.setDataAttribute(element, styleProp, actualValue);\n      }\n    }\n\n    _resetElementAttributes(selector, styleProp) {\n      const manipulationCallBack = element => {\n        const value = Manipulator.getDataAttribute(element, styleProp);\n\n        if (typeof value === 'undefined') {\n          element.style.removeProperty(styleProp);\n        } else {\n          Manipulator.removeDataAttribute(element, styleProp);\n          element.style[styleProp] = value;\n        }\n      };\n\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n\n    _applyManipulationCallback(selector, callBack) {\n      if (isElement$1(selector)) {\n        callBack(selector);\n      } else {\n        SelectorEngine.find(selector, this._element).forEach(callBack);\n      }\n    }\n\n    isOverflowing() {\n      return this.getWidth() > 0;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/backdrop.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const Default$7 = {\n    className: 'modal-backdrop',\n    isVisible: true,\n    // if false, we use the backdrop helper without adding any element to the dom\n    isAnimated: false,\n    rootElement: 'body',\n    // give the choice to place backdrop under different elements\n    clickCallback: null\n  };\n  const DefaultType$7 = {\n    className: 'string',\n    isVisible: 'boolean',\n    isAnimated: 'boolean',\n    rootElement: '(element|string)',\n    clickCallback: '(function|null)'\n  };\n  const NAME$8 = 'backdrop';\n  const CLASS_NAME_FADE$4 = 'fade';\n  const CLASS_NAME_SHOW$5 = 'show';\n  const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`;\n\n  class Backdrop {\n    constructor(config) {\n      this._config = this._getConfig(config);\n      this._isAppended = false;\n      this._element = null;\n    }\n\n    show(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n\n      this._append();\n\n      if (this._config.isAnimated) {\n        reflow(this._getElement());\n      }\n\n      this._getElement().classList.add(CLASS_NAME_SHOW$5);\n\n      this._emulateAnimation(() => {\n        execute(callback);\n      });\n    }\n\n    hide(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n\n      this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n\n      this._emulateAnimation(() => {\n        this.dispose();\n        execute(callback);\n      });\n    } // Private\n\n\n    _getElement() {\n      if (!this._element) {\n        const backdrop = document.createElement('div');\n        backdrop.className = this._config.className;\n\n        if (this._config.isAnimated) {\n          backdrop.classList.add(CLASS_NAME_FADE$4);\n        }\n\n        this._element = backdrop;\n      }\n\n      return this._element;\n    }\n\n    _getConfig(config) {\n      config = { ...Default$7,\n        ...(typeof config === 'object' ? config : {})\n      }; // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n\n      config.rootElement = getElement(config.rootElement);\n      typeCheckConfig(NAME$8, config, DefaultType$7);\n      return config;\n    }\n\n    _append() {\n      if (this._isAppended) {\n        return;\n      }\n\n      this._config.rootElement.append(this._getElement());\n\n      EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n        execute(this._config.clickCallback);\n      });\n      this._isAppended = true;\n    }\n\n    dispose() {\n      if (!this._isAppended) {\n        return;\n      }\n\n      EventHandler.off(this._element, EVENT_MOUSEDOWN);\n\n      this._element.remove();\n\n      this._isAppended = false;\n    }\n\n    _emulateAnimation(callback) {\n      executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/focustrap.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const Default$6 = {\n    trapElement: null,\n    // The element to trap focus inside of\n    autofocus: true\n  };\n  const DefaultType$6 = {\n    trapElement: 'element',\n    autofocus: 'boolean'\n  };\n  const NAME$7 = 'focustrap';\n  const DATA_KEY$7 = 'bs.focustrap';\n  const EVENT_KEY$7 = `.${DATA_KEY$7}`;\n  const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`;\n  const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;\n  const TAB_KEY = 'Tab';\n  const TAB_NAV_FORWARD = 'forward';\n  const TAB_NAV_BACKWARD = 'backward';\n\n  class FocusTrap {\n    constructor(config) {\n      this._config = this._getConfig(config);\n      this._isActive = false;\n      this._lastTabNavDirection = null;\n    }\n\n    activate() {\n      const {\n        trapElement,\n        autofocus\n      } = this._config;\n\n      if (this._isActive) {\n        return;\n      }\n\n      if (autofocus) {\n        trapElement.focus();\n      }\n\n      EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop\n\n      EventHandler.on(document, EVENT_FOCUSIN$1, event => this._handleFocusin(event));\n      EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n      this._isActive = true;\n    }\n\n    deactivate() {\n      if (!this._isActive) {\n        return;\n      }\n\n      this._isActive = false;\n      EventHandler.off(document, EVENT_KEY$7);\n    } // Private\n\n\n    _handleFocusin(event) {\n      const {\n        target\n      } = event;\n      const {\n        trapElement\n      } = this._config;\n\n      if (target === document || target === trapElement || trapElement.contains(target)) {\n        return;\n      }\n\n      const elements = SelectorEngine.focusableChildren(trapElement);\n\n      if (elements.length === 0) {\n        trapElement.focus();\n      } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n        elements[elements.length - 1].focus();\n      } else {\n        elements[0].focus();\n      }\n    }\n\n    _handleKeydown(event) {\n      if (event.key !== TAB_KEY) {\n        return;\n      }\n\n      this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n    }\n\n    _getConfig(config) {\n      config = { ...Default$6,\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$7, config, DefaultType$6);\n      return config;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): modal.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$6 = 'modal';\n  const DATA_KEY$6 = 'bs.modal';\n  const EVENT_KEY$6 = `.${DATA_KEY$6}`;\n  const DATA_API_KEY$3 = '.data-api';\n  const ESCAPE_KEY$1 = 'Escape';\n  const Default$5 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true\n  };\n  const DefaultType$5 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean'\n  };\n  const EVENT_HIDE$3 = `hide${EVENT_KEY$6}`;\n  const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$6}`;\n  const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`;\n  const EVENT_SHOW$3 = `show${EVENT_KEY$6}`;\n  const EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`;\n  const EVENT_RESIZE = `resize${EVENT_KEY$6}`;\n  const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;\n  const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;\n  const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;\n  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;\n  const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\n  const CLASS_NAME_OPEN = 'modal-open';\n  const CLASS_NAME_FADE$3 = 'fade';\n  const CLASS_NAME_SHOW$4 = 'show';\n  const CLASS_NAME_STATIC = 'modal-static';\n  const OPEN_SELECTOR$1 = '.modal.show';\n  const SELECTOR_DIALOG = '.modal-dialog';\n  const SELECTOR_MODAL_BODY = '.modal-body';\n  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Modal extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n      this._isShown = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollBar = new ScrollBarHelper();\n    } // Getters\n\n\n    static get Default() {\n      return Default$5;\n    }\n\n    static get NAME() {\n      return NAME$6;\n    } // Public\n\n\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n\n    show(relatedTarget) {\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n        relatedTarget\n      });\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = true;\n\n      if (this._isAnimated()) {\n        this._isTransitioning = true;\n      }\n\n      this._scrollBar.hide();\n\n      document.body.classList.add(CLASS_NAME_OPEN);\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n        EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n          if (event.target === this._element) {\n            this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(() => this._showElement(relatedTarget));\n    }\n\n    hide() {\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = false;\n\n      const isAnimated = this._isAnimated();\n\n      if (isAnimated) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      this._focustrap.deactivate();\n\n      this._element.classList.remove(CLASS_NAME_SHOW$4);\n\n      EventHandler.off(this._element, EVENT_CLICK_DISMISS);\n      EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);\n\n      this._queueCallback(() => this._hideModal(), this._element, isAnimated);\n    }\n\n    dispose() {\n      [window, this._dialog].forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY$6));\n\n      this._backdrop.dispose();\n\n      this._focustrap.deactivate();\n\n      super.dispose();\n    }\n\n    handleUpdate() {\n      this._adjustDialog();\n    } // Private\n\n\n    _initializeBackDrop() {\n      return new Backdrop({\n        isVisible: Boolean(this._config.backdrop),\n        // 'static' option will be translated to true, and booleans will keep their value\n        isAnimated: this._isAnimated()\n      });\n    }\n\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n\n    _getConfig(config) {\n      config = { ...Default$5,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$6, config, DefaultType$5);\n      return config;\n    }\n\n    _showElement(relatedTarget) {\n      const isAnimated = this._isAnimated();\n\n      const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.append(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      this._element.setAttribute('role', 'dialog');\n\n      this._element.scrollTop = 0;\n\n      if (modalBody) {\n        modalBody.scrollTop = 0;\n      }\n\n      if (isAnimated) {\n        reflow(this._element);\n      }\n\n      this._element.classList.add(CLASS_NAME_SHOW$4);\n\n      const transitionComplete = () => {\n        if (this._config.focus) {\n          this._focustrap.activate();\n        }\n\n        this._isTransitioning = false;\n        EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n          relatedTarget\n        });\n      };\n\n      this._queueCallback(transitionComplete, this._dialog, isAnimated);\n    }\n\n    _setEscapeEvent() {\n      if (this._isShown) {\n        EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n          if (this._config.keyboard && event.key === ESCAPE_KEY$1) {\n            event.preventDefault();\n            this.hide();\n          } else if (!this._config.keyboard && event.key === ESCAPE_KEY$1) {\n            this._triggerBackdropTransition();\n          }\n        });\n      } else {\n        EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1);\n      }\n    }\n\n    _setResizeEvent() {\n      if (this._isShown) {\n        EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog());\n      } else {\n        EventHandler.off(window, EVENT_RESIZE);\n      }\n    }\n\n    _hideModal() {\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._element.removeAttribute('role');\n\n      this._isTransitioning = false;\n\n      this._backdrop.hide(() => {\n        document.body.classList.remove(CLASS_NAME_OPEN);\n\n        this._resetAdjustments();\n\n        this._scrollBar.reset();\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n      });\n    }\n\n    _showBackdrop(callback) {\n      EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n        if (this._ignoreBackdropClick) {\n          this._ignoreBackdropClick = false;\n          return;\n        }\n\n        if (event.target !== event.currentTarget) {\n          return;\n        }\n\n        if (this._config.backdrop === true) {\n          this.hide();\n        } else if (this._config.backdrop === 'static') {\n          this._triggerBackdropTransition();\n        }\n      });\n\n      this._backdrop.show(callback);\n    }\n\n    _isAnimated() {\n      return this._element.classList.contains(CLASS_NAME_FADE$3);\n    }\n\n    _triggerBackdropTransition() {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      const {\n        classList,\n        scrollHeight,\n        style\n      } = this._element;\n      const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed\n\n      if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {\n        return;\n      }\n\n      if (!isModalOverflowing) {\n        style.overflowY = 'hidden';\n      }\n\n      classList.add(CLASS_NAME_STATIC);\n\n      this._queueCallback(() => {\n        classList.remove(CLASS_NAME_STATIC);\n\n        if (!isModalOverflowing) {\n          this._queueCallback(() => {\n            style.overflowY = '';\n          }, this._dialog);\n        }\n      }, this._dialog);\n\n      this._element.focus();\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // ----------------------------------------------------------------------\n\n\n    _adjustDialog() {\n      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      const scrollbarWidth = this._scrollBar.getWidth();\n\n      const isBodyOverflowing = scrollbarWidth > 0;\n\n      if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {\n        this._element.style.paddingLeft = `${scrollbarWidth}px`;\n      }\n\n      if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {\n        this._element.style.paddingRight = `${scrollbarWidth}px`;\n      }\n    }\n\n    _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    } // Static\n\n\n    static jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        const data = Modal.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](relatedTarget);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n    const target = getElementFromSelector(this);\n\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    EventHandler.one(target, EVENT_SHOW$3, showEvent => {\n      if (showEvent.defaultPrevented) {\n        // only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      EventHandler.one(target, EVENT_HIDDEN$3, () => {\n        if (isVisible(this)) {\n          this.focus();\n        }\n      });\n    }); // avoid conflict when clicking moddal toggler while another one is open\n\n    const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n\n    if (allReadyOpen) {\n      Modal.getInstance(allReadyOpen).hide();\n    }\n\n    const data = Modal.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  enableDismissTrigger(Modal);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Modal to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Modal);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): offcanvas.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$5 = 'offcanvas';\n  const DATA_KEY$5 = 'bs.offcanvas';\n  const EVENT_KEY$5 = `.${DATA_KEY$5}`;\n  const DATA_API_KEY$2 = '.data-api';\n  const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$5}${DATA_API_KEY$2}`;\n  const ESCAPE_KEY = 'Escape';\n  const Default$4 = {\n    backdrop: true,\n    keyboard: true,\n    scroll: false\n  };\n  const DefaultType$4 = {\n    backdrop: 'boolean',\n    keyboard: 'boolean',\n    scroll: 'boolean'\n  };\n  const CLASS_NAME_SHOW$3 = 'show';\n  const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\n  const OPEN_SELECTOR = '.offcanvas.show';\n  const EVENT_SHOW$2 = `show${EVENT_KEY$5}`;\n  const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;\n  const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;\n  const EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`;\n  const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;\n  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;\n  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Offcanvas extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._isShown = false;\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    static get NAME() {\n      return NAME$5;\n    }\n\n    static get Default() {\n      return Default$4;\n    } // Public\n\n\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n\n    show(relatedTarget) {\n      if (this._isShown) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$2, {\n        relatedTarget\n      });\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = true;\n      this._element.style.visibility = 'visible';\n\n      this._backdrop.show();\n\n      if (!this._config.scroll) {\n        new ScrollBarHelper().hide();\n      }\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      this._element.setAttribute('role', 'dialog');\n\n      this._element.classList.add(CLASS_NAME_SHOW$3);\n\n      const completeCallBack = () => {\n        if (!this._config.scroll) {\n          this._focustrap.activate();\n        }\n\n        EventHandler.trigger(this._element, EVENT_SHOWN$2, {\n          relatedTarget\n        });\n      };\n\n      this._queueCallback(completeCallBack, this._element, true);\n    }\n\n    hide() {\n      if (!this._isShown) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$2);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._focustrap.deactivate();\n\n      this._element.blur();\n\n      this._isShown = false;\n\n      this._element.classList.remove(CLASS_NAME_SHOW$3);\n\n      this._backdrop.hide();\n\n      const completeCallback = () => {\n        this._element.setAttribute('aria-hidden', true);\n\n        this._element.removeAttribute('aria-modal');\n\n        this._element.removeAttribute('role');\n\n        this._element.style.visibility = 'hidden';\n\n        if (!this._config.scroll) {\n          new ScrollBarHelper().reset();\n        }\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$2);\n      };\n\n      this._queueCallback(completeCallback, this._element, true);\n    }\n\n    dispose() {\n      this._backdrop.dispose();\n\n      this._focustrap.deactivate();\n\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$4,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$5, config, DefaultType$4);\n      return config;\n    }\n\n    _initializeBackDrop() {\n      return new Backdrop({\n        className: CLASS_NAME_BACKDROP,\n        isVisible: this._config.backdrop,\n        isAnimated: true,\n        rootElement: this._element.parentNode,\n        clickCallback: () => this.hide()\n      });\n    }\n\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n\n    _addEventListeners() {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n        if (this._config.keyboard && event.key === ESCAPE_KEY) {\n          this.hide();\n        }\n      });\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Offcanvas.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](this);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n    const target = getElementFromSelector(this);\n\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    if (isDisabled(this)) {\n      return;\n    }\n\n    EventHandler.one(target, EVENT_HIDDEN$2, () => {\n      // focus on trigger when it is closed\n      if (isVisible(this)) {\n        this.focus();\n      }\n    }); // avoid conflict when clicking a toggler of an offcanvas, while another is open\n\n    const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n\n    if (allReadyOpen && allReadyOpen !== target) {\n      Offcanvas.getInstance(allReadyOpen).hide();\n    }\n\n    const data = Offcanvas.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));\n  enableDismissTrigger(Offcanvas);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  defineJQueryPlugin(Offcanvas);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  /**\n   * A pattern that recognizes a commonly useful subset of URLs that are safe.\n   *\n   * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  const DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i;\n\n  const allowedAttribute = (attribute, allowedAttributeList) => {\n    const attributeName = attribute.nodeName.toLowerCase();\n\n    if (allowedAttributeList.includes(attributeName)) {\n      if (uriAttributes.has(attributeName)) {\n        return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));\n      }\n\n      return true;\n    }\n\n    const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp); // Check if a regular expression validates the attribute.\n\n    for (let i = 0, len = regExp.length; i < len; i++) {\n      if (regExp[i].test(attributeName)) {\n        return true;\n      }\n    }\n\n    return false;\n  };\n\n  const DefaultAllowlist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n  };\n  function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n    if (!unsafeHtml.length) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    const domParser = new window.DOMParser();\n    const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n\n    for (let i = 0, len = elements.length; i < len; i++) {\n      const element = elements[i];\n      const elementName = element.nodeName.toLowerCase();\n\n      if (!Object.keys(allowList).includes(elementName)) {\n        element.remove();\n        continue;\n      }\n\n      const attributeList = [].concat(...element.attributes);\n      const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n      attributeList.forEach(attribute => {\n        if (!allowedAttribute(attribute, allowedAttributes)) {\n          element.removeAttribute(attribute.nodeName);\n        }\n      });\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): tooltip.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$4 = 'tooltip';\n  const DATA_KEY$4 = 'bs.tooltip';\n  const EVENT_KEY$4 = `.${DATA_KEY$4}`;\n  const CLASS_PREFIX$1 = 'bs-tooltip';\n  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\n  const DefaultType$3 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(array|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacements: 'array',\n    boundary: '(string|element)',\n    customClass: '(string|function)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    allowList: 'object',\n    popperConfig: '(null|object|function)'\n  };\n  const AttachmentMap = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: isRTL() ? 'left' : 'right',\n    BOTTOM: 'bottom',\n    LEFT: isRTL() ? 'right' : 'left'\n  };\n  const Default$3 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"tooltip-arrow\"></div>' + '<div class=\"tooltip-inner\"></div>' + '</div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: [0, 0],\n    container: false,\n    fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n    boundary: 'clippingParents',\n    customClass: '',\n    sanitize: true,\n    sanitizeFn: null,\n    allowList: DefaultAllowlist,\n    popperConfig: null\n  };\n  const Event$2 = {\n    HIDE: `hide${EVENT_KEY$4}`,\n    HIDDEN: `hidden${EVENT_KEY$4}`,\n    SHOW: `show${EVENT_KEY$4}`,\n    SHOWN: `shown${EVENT_KEY$4}`,\n    INSERTED: `inserted${EVENT_KEY$4}`,\n    CLICK: `click${EVENT_KEY$4}`,\n    FOCUSIN: `focusin${EVENT_KEY$4}`,\n    FOCUSOUT: `focusout${EVENT_KEY$4}`,\n    MOUSEENTER: `mouseenter${EVENT_KEY$4}`,\n    MOUSELEAVE: `mouseleave${EVENT_KEY$4}`\n  };\n  const CLASS_NAME_FADE$2 = 'fade';\n  const CLASS_NAME_MODAL = 'modal';\n  const CLASS_NAME_SHOW$2 = 'show';\n  const HOVER_STATE_SHOW = 'show';\n  const HOVER_STATE_OUT = 'out';\n  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\n  const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\n  const EVENT_MODAL_HIDE = 'hide.bs.modal';\n  const TRIGGER_HOVER = 'hover';\n  const TRIGGER_FOCUS = 'focus';\n  const TRIGGER_CLICK = 'click';\n  const TRIGGER_MANUAL = 'manual';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Tooltip extends BaseComponent {\n    constructor(element, config) {\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n      }\n\n      super(element); // private\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this._config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    static get Default() {\n      return Default$3;\n    }\n\n    static get NAME() {\n      return NAME$4;\n    }\n\n    static get Event() {\n      return Event$2;\n    }\n\n    static get DefaultType() {\n      return DefaultType$3;\n    } // Public\n\n\n    enable() {\n      this._isEnabled = true;\n    }\n\n    disable() {\n      this._isEnabled = false;\n    }\n\n    toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    }\n\n    toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        const context = this._initializeOnDelegatedTarget(event);\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    }\n\n    dispose() {\n      clearTimeout(this._timeout);\n      EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n      if (this.tip) {\n        this.tip.remove();\n      }\n\n      this._disposePopper();\n\n      super.dispose();\n    }\n\n    show() {\n      if (this._element.style.display === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      if (!(this.isWithContent() && this._isEnabled)) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW);\n      const shadowRoot = findShadowRoot(this._element);\n      const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);\n\n      if (showEvent.defaultPrevented || !isInTheDom) {\n        return;\n      } // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`\n      // This will be removed later in favor of a `setContent` method\n\n\n      if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {\n        this._disposePopper();\n\n        this.tip.remove();\n        this.tip = null;\n      }\n\n      const tip = this.getTipElement();\n      const tipId = getUID(this.constructor.NAME);\n      tip.setAttribute('id', tipId);\n\n      this._element.setAttribute('aria-describedby', tipId);\n\n      if (this._config.animation) {\n        tip.classList.add(CLASS_NAME_FADE$2);\n      }\n\n      const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;\n\n      const attachment = this._getAttachment(placement);\n\n      this._addAttachmentClass(attachment);\n\n      const {\n        container\n      } = this._config;\n      Data.set(tip, this.constructor.DATA_KEY, this);\n\n      if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n        container.append(tip);\n        EventHandler.trigger(this._element, this.constructor.Event.INSERTED);\n      }\n\n      if (this._popper) {\n        this._popper.update();\n      } else {\n        this._popper = createPopper(this._element, tip, this._getPopperConfig(attachment));\n      }\n\n      tip.classList.add(CLASS_NAME_SHOW$2);\n\n      const customClass = this._resolvePossibleFunction(this._config.customClass);\n\n      if (customClass) {\n        tip.classList.add(...customClass.split(' '));\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(element => {\n          EventHandler.on(element, 'mouseover', noop);\n        });\n      }\n\n      const complete = () => {\n        const prevHoverState = this._hoverState;\n        this._hoverState = null;\n        EventHandler.trigger(this._element, this.constructor.Event.SHOWN);\n\n        if (prevHoverState === HOVER_STATE_OUT) {\n          this._leave(null, this);\n        }\n      };\n\n      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);\n\n      this._queueCallback(complete, this.tip, isAnimated);\n    }\n\n    hide() {\n      if (!this._popper) {\n        return;\n      }\n\n      const tip = this.getTipElement();\n\n      const complete = () => {\n        if (this._isWithActiveTrigger()) {\n          return;\n        }\n\n        if (this._hoverState !== HOVER_STATE_SHOW) {\n          tip.remove();\n        }\n\n        this._cleanTipClass();\n\n        this._element.removeAttribute('aria-describedby');\n\n        EventHandler.trigger(this._element, this.constructor.Event.HIDDEN);\n\n        this._disposePopper();\n      };\n\n      const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(element => EventHandler.off(element, 'mouseover', noop));\n      }\n\n      this._activeTrigger[TRIGGER_CLICK] = false;\n      this._activeTrigger[TRIGGER_FOCUS] = false;\n      this._activeTrigger[TRIGGER_HOVER] = false;\n      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);\n\n      this._queueCallback(complete, this.tip, isAnimated);\n\n      this._hoverState = '';\n    }\n\n    update() {\n      if (this._popper !== null) {\n        this._popper.update();\n      }\n    } // Protected\n\n\n    isWithContent() {\n      return Boolean(this.getTitle());\n    }\n\n    getTipElement() {\n      if (this.tip) {\n        return this.tip;\n      }\n\n      const element = document.createElement('div');\n      element.innerHTML = this._config.template;\n      const tip = element.children[0];\n      this.setContent(tip);\n      tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n      this.tip = tip;\n      return this.tip;\n    }\n\n    setContent(tip) {\n      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);\n    }\n\n    _sanitizeAndSetContent(template, content, selector) {\n      const templateElement = SelectorEngine.findOne(selector, template);\n\n      if (!content && templateElement) {\n        templateElement.remove();\n        return;\n      } // we use append for html objects to maintain js events\n\n\n      this.setElementContent(templateElement, content);\n    }\n\n    setElementContent(element, content) {\n      if (element === null) {\n        return;\n      }\n\n      if (isElement$1(content)) {\n        content = getElement(content); // content is a DOM node or a jQuery\n\n        if (this._config.html) {\n          if (content.parentNode !== element) {\n            element.innerHTML = '';\n            element.append(content);\n          }\n        } else {\n          element.textContent = content.textContent;\n        }\n\n        return;\n      }\n\n      if (this._config.html) {\n        if (this._config.sanitize) {\n          content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn);\n        }\n\n        element.innerHTML = content;\n      } else {\n        element.textContent = content;\n      }\n    }\n\n    getTitle() {\n      const title = this._element.getAttribute('data-bs-original-title') || this._config.title;\n\n      return this._resolvePossibleFunction(title);\n    }\n\n    updateAttachment(attachment) {\n      if (attachment === 'right') {\n        return 'end';\n      }\n\n      if (attachment === 'left') {\n        return 'start';\n      }\n\n      return attachment;\n    } // Private\n\n\n    _initializeOnDelegatedTarget(event, context) {\n      return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n    }\n\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n\n      if (typeof offset === 'string') {\n        return offset.split(',').map(val => Number.parseInt(val, 10));\n      }\n\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n\n      return offset;\n    }\n\n    _resolvePossibleFunction(content) {\n      return typeof content === 'function' ? content.call(this._element) : content;\n    }\n\n    _getPopperConfig(attachment) {\n      const defaultBsPopperConfig = {\n        placement: attachment,\n        modifiers: [{\n          name: 'flip',\n          options: {\n            fallbackPlacements: this._config.fallbackPlacements\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }, {\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'arrow',\n          options: {\n            element: `.${this.constructor.NAME}-arrow`\n          }\n        }, {\n          name: 'onChange',\n          enabled: true,\n          phase: 'afterWrite',\n          fn: data => this._handlePopperPlacementChange(data)\n        }],\n        onFirstUpdate: data => {\n          if (data.options.placement !== data.placement) {\n            this._handlePopperPlacementChange(data);\n          }\n        }\n      };\n      return { ...defaultBsPopperConfig,\n        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n      };\n    }\n\n    _addAttachmentClass(attachment) {\n      this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);\n    }\n\n    _getAttachment(placement) {\n      return AttachmentMap[placement.toUpperCase()];\n    }\n\n    _setListeners() {\n      const triggers = this._config.trigger.split(' ');\n\n      triggers.forEach(trigger => {\n        if (trigger === 'click') {\n          EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event));\n        } else if (trigger !== TRIGGER_MANUAL) {\n          const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;\n          const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;\n          EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event));\n          EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event));\n        }\n      });\n\n      this._hideModalHandler = () => {\n        if (this._element) {\n          this.hide();\n        }\n      };\n\n      EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n      if (this._config.selector) {\n        this._config = { ...this._config,\n          trigger: 'manual',\n          selector: ''\n        };\n      } else {\n        this._fixTitle();\n      }\n    }\n\n    _fixTitle() {\n      const title = this._element.getAttribute('title');\n\n      const originalTitleType = typeof this._element.getAttribute('data-bs-original-title');\n\n      if (title || originalTitleType !== 'string') {\n        this._element.setAttribute('data-bs-original-title', title || '');\n\n        if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n          this._element.setAttribute('aria-label', title);\n        }\n\n        this._element.setAttribute('title', '');\n      }\n    }\n\n    _enter(event, context) {\n      context = this._initializeOnDelegatedTarget(event, context);\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n      }\n\n      if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) {\n        context._hoverState = HOVER_STATE_SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HOVER_STATE_SHOW;\n\n      if (!context._config.delay || !context._config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(() => {\n        if (context._hoverState === HOVER_STATE_SHOW) {\n          context.show();\n        }\n      }, context._config.delay.show);\n    }\n\n    _leave(event, context) {\n      context = this._initializeOnDelegatedTarget(event, context);\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HOVER_STATE_OUT;\n\n      if (!context._config.delay || !context._config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(() => {\n        if (context._hoverState === HOVER_STATE_OUT) {\n          context.hide();\n        }\n      }, context._config.delay.hide);\n    }\n\n    _isWithActiveTrigger() {\n      for (const trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    _getConfig(config) {\n      const dataAttributes = Manipulator.getDataAttributes(this._element);\n      Object.keys(dataAttributes).forEach(dataAttr => {\n        if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = { ...this.constructor.Default,\n        ...dataAttributes,\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config.container = config.container === false ? document.body : getElement(config.container);\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn);\n      }\n\n      return config;\n    }\n\n    _getDelegateConfig() {\n      const config = {};\n\n      for (const key in this._config) {\n        if (this.constructor.Default[key] !== this._config[key]) {\n          config[key] = this._config[key];\n        }\n      } // In the future can be replaced with:\n      // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n      // `Object.fromEntries(keysWithDifferentValues)`\n\n\n      return config;\n    }\n\n    _cleanTipClass() {\n      const tip = this.getTipElement();\n      const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g');\n      const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));\n      }\n    }\n\n    _getBasicClassPrefix() {\n      return CLASS_PREFIX$1;\n    }\n\n    _handlePopperPlacementChange(popperData) {\n      const {\n        state\n      } = popperData;\n\n      if (!state) {\n        return;\n      }\n\n      this.tip = state.elements.popper;\n\n      this._cleanTipClass();\n\n      this._addAttachmentClass(this._getAttachment(state.placement));\n    }\n\n    _disposePopper() {\n      if (this._popper) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tooltip.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Tooltip to jQuery only if jQuery is present\n   */\n\n\n  defineJQueryPlugin(Tooltip);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): popover.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$3 = 'popover';\n  const DATA_KEY$3 = 'bs.popover';\n  const EVENT_KEY$3 = `.${DATA_KEY$3}`;\n  const CLASS_PREFIX = 'bs-popover';\n  const Default$2 = { ...Tooltip.Default,\n    placement: 'right',\n    offset: [0, 8],\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"popover-arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div>' + '</div>'\n  };\n  const DefaultType$2 = { ...Tooltip.DefaultType,\n    content: '(string|element|function)'\n  };\n  const Event$1 = {\n    HIDE: `hide${EVENT_KEY$3}`,\n    HIDDEN: `hidden${EVENT_KEY$3}`,\n    SHOW: `show${EVENT_KEY$3}`,\n    SHOWN: `shown${EVENT_KEY$3}`,\n    INSERTED: `inserted${EVENT_KEY$3}`,\n    CLICK: `click${EVENT_KEY$3}`,\n    FOCUSIN: `focusin${EVENT_KEY$3}`,\n    FOCUSOUT: `focusout${EVENT_KEY$3}`,\n    MOUSEENTER: `mouseenter${EVENT_KEY$3}`,\n    MOUSELEAVE: `mouseleave${EVENT_KEY$3}`\n  };\n  const SELECTOR_TITLE = '.popover-header';\n  const SELECTOR_CONTENT = '.popover-body';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Popover extends Tooltip {\n    // Getters\n    static get Default() {\n      return Default$2;\n    }\n\n    static get NAME() {\n      return NAME$3;\n    }\n\n    static get Event() {\n      return Event$1;\n    }\n\n    static get DefaultType() {\n      return DefaultType$2;\n    } // Overrides\n\n\n    isWithContent() {\n      return this.getTitle() || this._getContent();\n    }\n\n    setContent(tip) {\n      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);\n\n      this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);\n    } // Private\n\n\n    _getContent() {\n      return this._resolvePossibleFunction(this._config.content);\n    }\n\n    _getBasicClassPrefix() {\n      return CLASS_PREFIX;\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Popover.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Popover to jQuery only if jQuery is present\n   */\n\n\n  defineJQueryPlugin(Popover);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): scrollspy.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$2 = 'scrollspy';\n  const DATA_KEY$2 = 'bs.scrollspy';\n  const EVENT_KEY$2 = `.${DATA_KEY$2}`;\n  const DATA_API_KEY$1 = '.data-api';\n  const Default$1 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  const DefaultType$1 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\n  const EVENT_SCROLL = `scroll${EVENT_KEY$2}`;\n  const EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}${DATA_API_KEY$1}`;\n  const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\n  const CLASS_NAME_ACTIVE$1 = 'active';\n  const SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\n  const SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';\n  const SELECTOR_NAV_LINKS = '.nav-link';\n  const SELECTOR_NAV_ITEMS = '.nav-item';\n  const SELECTOR_LIST_ITEMS = '.list-group-item';\n  const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;\n  const SELECTOR_DROPDOWN$1 = '.dropdown';\n  const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\n  const METHOD_OFFSET = 'offset';\n  const METHOD_POSITION = 'position';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class ScrollSpy extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;\n      this._config = this._getConfig(config);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process());\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    static get Default() {\n      return Default$1;\n    }\n\n    static get NAME() {\n      return NAME$2;\n    } // Public\n\n\n    refresh() {\n      const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;\n      const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target);\n      targets.map(element => {\n        const targetSelector = getSelectorFromElement(element);\n        const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;\n\n        if (target) {\n          const targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(item => item).sort((a, b) => a[0] - b[0]).forEach(item => {\n        this._offsets.push(item[0]);\n\n        this._targets.push(item[1]);\n      });\n    }\n\n    dispose() {\n      EventHandler.off(this._scrollElement, EVENT_KEY$2);\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$1,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config.target = getElement(config.target) || document.documentElement;\n      typeCheckConfig(NAME$2, config, DefaultType$1);\n      return config;\n    }\n\n    _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    }\n\n    _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    }\n\n    _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    }\n\n    _process() {\n      const scrollTop = this._getScrollTop() + this._config.offset;\n\n      const scrollHeight = this._getScrollHeight();\n\n      const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        const target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      for (let i = this._offsets.length; i--;) {\n        const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    }\n\n    _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`);\n      const link = SelectorEngine.findOne(queries.join(','), this._config.target);\n      link.classList.add(CLASS_NAME_ACTIVE$1);\n\n      if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n        SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1);\n      } else {\n        SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach(listGroup => {\n          // Set triggered links parents as active\n          // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n          SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1)); // Handle special case when .nav-link is inside .nav-item\n\n          SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS).forEach(navItem => {\n            SelectorEngine.children(navItem, SELECTOR_NAV_LINKS).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1));\n          });\n        });\n      }\n\n      EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n        relatedTarget: target\n      });\n    }\n\n    _clear() {\n      SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE$1)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE$1));\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = ScrollSpy.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n    SelectorEngine.find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .ScrollSpy to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(ScrollSpy);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): tab.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$1 = 'tab';\n  const DATA_KEY$1 = 'bs.tab';\n  const EVENT_KEY$1 = `.${DATA_KEY$1}`;\n  const DATA_API_KEY = '.data-api';\n  const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;\n  const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;\n  const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;\n  const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}${DATA_API_KEY}`;\n  const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';\n  const CLASS_NAME_ACTIVE = 'active';\n  const CLASS_NAME_FADE$1 = 'fade';\n  const CLASS_NAME_SHOW$1 = 'show';\n  const SELECTOR_DROPDOWN = '.dropdown';\n  const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\n  const SELECTOR_ACTIVE = '.active';\n  const SELECTOR_ACTIVE_UL = ':scope > li > .active';\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]';\n  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n  const SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Tab extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$1;\n    } // Public\n\n\n    show() {\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE)) {\n        return;\n      }\n\n      let previous;\n      const target = getElementFromSelector(this._element);\n\n      const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);\n\n      if (listElement) {\n        const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;\n        previous = SelectorEngine.find(itemSelector, listElement);\n        previous = previous[previous.length - 1];\n      }\n\n      const hideEvent = previous ? EventHandler.trigger(previous, EVENT_HIDE$1, {\n        relatedTarget: this._element\n      }) : null;\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$1, {\n        relatedTarget: previous\n      });\n\n      if (showEvent.defaultPrevented || hideEvent !== null && hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._activate(this._element, listElement);\n\n      const complete = () => {\n        EventHandler.trigger(previous, EVENT_HIDDEN$1, {\n          relatedTarget: this._element\n        });\n        EventHandler.trigger(this._element, EVENT_SHOWN$1, {\n          relatedTarget: previous\n        });\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    } // Private\n\n\n    _activate(element, container, callback) {\n      const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine.find(SELECTOR_ACTIVE_UL, container) : SelectorEngine.children(container, SELECTOR_ACTIVE);\n      const active = activeElements[0];\n      const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE$1);\n\n      const complete = () => this._transitionComplete(element, active, callback);\n\n      if (active && isTransitioning) {\n        active.classList.remove(CLASS_NAME_SHOW$1);\n\n        this._queueCallback(complete, element, true);\n      } else {\n        complete();\n      }\n    }\n\n    _transitionComplete(element, active, callback) {\n      if (active) {\n        active.classList.remove(CLASS_NAME_ACTIVE);\n        const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);\n\n        if (dropdownChild) {\n          dropdownChild.classList.remove(CLASS_NAME_ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      element.classList.add(CLASS_NAME_ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      reflow(element);\n\n      if (element.classList.contains(CLASS_NAME_FADE$1)) {\n        element.classList.add(CLASS_NAME_SHOW$1);\n      }\n\n      let parent = element.parentNode;\n\n      if (parent && parent.nodeName === 'LI') {\n        parent = parent.parentNode;\n      }\n\n      if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {\n        const dropdownElement = element.closest(SELECTOR_DROPDOWN);\n\n        if (dropdownElement) {\n          SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tab.getOrCreateInstance(this);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    if (isDisabled(this)) {\n      return;\n    }\n\n    const data = Tab.getOrCreateInstance(this);\n    data.show();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Tab to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Tab);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): toast.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME = 'toast';\n  const DATA_KEY = 'bs.toast';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;\n  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;\n  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;\n  const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility\n\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_NAME_SHOWING = 'showing';\n  const DefaultType = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  const Default = {\n    animation: true,\n    autohide: true,\n    delay: 5000\n  };\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Toast extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._timeout = null;\n      this._hasMouseInteraction = false;\n      this._hasKeyboardInteraction = false;\n\n      this._setListeners();\n    } // Getters\n\n\n    static get DefaultType() {\n      return DefaultType;\n    }\n\n    static get Default() {\n      return Default;\n    }\n\n    static get NAME() {\n      return NAME;\n    } // Public\n\n\n    show() {\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._clearTimeout();\n\n      if (this._config.animation) {\n        this._element.classList.add(CLASS_NAME_FADE);\n      }\n\n      const complete = () => {\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n\n        EventHandler.trigger(this._element, EVENT_SHOWN);\n\n        this._maybeScheduleHide();\n      };\n\n      this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated\n\n\n      reflow(this._element);\n\n      this._element.classList.add(CLASS_NAME_SHOW);\n\n      this._element.classList.add(CLASS_NAME_SHOWING);\n\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n\n    hide() {\n      if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      const complete = () => {\n        this._element.classList.add(CLASS_NAME_HIDE); // @deprecated\n\n\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n\n        this._element.classList.remove(CLASS_NAME_SHOW);\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN);\n      };\n\n      this._element.classList.add(CLASS_NAME_SHOWING);\n\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n\n    dispose() {\n      this._clearTimeout();\n\n      if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n        this._element.classList.remove(CLASS_NAME_SHOW);\n      }\n\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      typeCheckConfig(NAME, config, this.constructor.DefaultType);\n      return config;\n    }\n\n    _maybeScheduleHide() {\n      if (!this._config.autohide) {\n        return;\n      }\n\n      if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n        return;\n      }\n\n      this._timeout = setTimeout(() => {\n        this.hide();\n      }, this._config.delay);\n    }\n\n    _onInteraction(event, isInteracting) {\n      switch (event.type) {\n        case 'mouseover':\n        case 'mouseout':\n          this._hasMouseInteraction = isInteracting;\n          break;\n\n        case 'focusin':\n        case 'focusout':\n          this._hasKeyboardInteraction = isInteracting;\n          break;\n      }\n\n      if (isInteracting) {\n        this._clearTimeout();\n\n        return;\n      }\n\n      const nextElement = event.relatedTarget;\n\n      if (this._element === nextElement || this._element.contains(nextElement)) {\n        return;\n      }\n\n      this._maybeScheduleHide();\n    }\n\n    _setListeners() {\n      EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));\n      EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));\n    }\n\n    _clearTimeout() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Toast.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config](this);\n        }\n      });\n    }\n\n  }\n\n  enableDismissTrigger(Toast);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Toast to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Toast);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): index.umd.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const index_umd = {\n    Alert,\n    Button,\n    Carousel,\n    Collapse,\n    Dropdown,\n    Modal,\n    Offcanvas,\n    Popover,\n    ScrollSpy,\n    Tab,\n    Toast,\n    Tooltip\n  };\n\n  return index_umd;\n\n}));\n//# sourceMappingURL=bootstrap.bundle.js.map\n"
  },
  {
    "path": "www/old/explorer/public/js/bootstrap.js",
    "content": "/*!\n  * Bootstrap v5.1.3 (https://getbootstrap.com/)\n  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core')) :\n  typeof define === 'function' && define.amd ? define(['@popperjs/core'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory(global.Popper));\n})(this, (function (Popper) { 'use strict';\n\n  function _interopNamespace(e) {\n    if (e && e.__esModule) return e;\n    const n = Object.create(null);\n    if (e) {\n      for (const k in e) {\n        if (k !== 'default') {\n          const d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: () => e[k]\n          });\n        }\n      }\n    }\n    n.default = e;\n    return Object.freeze(n);\n  }\n\n  const Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const MAX_UID = 1000000;\n  const MILLISECONDS_MULTIPLIER = 1000;\n  const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  const toType = obj => {\n    if (obj === null || obj === undefined) {\n      return `${obj}`;\n    }\n\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  };\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  const getUID = prefix => {\n    do {\n      prefix += Math.floor(Math.random() * MAX_UID);\n    } while (document.getElementById(prefix));\n\n    return prefix;\n  };\n\n  const getSelector = element => {\n    let selector = element.getAttribute('data-bs-target');\n\n    if (!selector || selector === '#') {\n      let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,\n      // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n      // `document.querySelector` will rightfully complain it is invalid.\n      // See https://github.com/twbs/bootstrap/issues/32273\n\n      if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {\n        return null;\n      } // Just in case some CMS puts out a full URL with the anchor appended\n\n\n      if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n        hrefAttr = `#${hrefAttr.split('#')[1]}`;\n      }\n\n      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;\n    }\n\n    return selector;\n  };\n\n  const getSelectorFromElement = element => {\n    const selector = getSelector(element);\n\n    if (selector) {\n      return document.querySelector(selector) ? selector : null;\n    }\n\n    return null;\n  };\n\n  const getElementFromSelector = element => {\n    const selector = getSelector(element);\n    return selector ? document.querySelector(selector) : null;\n  };\n\n  const getTransitionDurationFromElement = element => {\n    if (!element) {\n      return 0;\n    } // Get transition-duration of the element\n\n\n    let {\n      transitionDuration,\n      transitionDelay\n    } = window.getComputedStyle(element);\n    const floatTransitionDuration = Number.parseFloat(transitionDuration);\n    const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n    if (!floatTransitionDuration && !floatTransitionDelay) {\n      return 0;\n    } // If multiple durations are defined, take the first\n\n\n    transitionDuration = transitionDuration.split(',')[0];\n    transitionDelay = transitionDelay.split(',')[0];\n    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n  };\n\n  const triggerTransitionEnd = element => {\n    element.dispatchEvent(new Event(TRANSITION_END));\n  };\n\n  const isElement = obj => {\n    if (!obj || typeof obj !== 'object') {\n      return false;\n    }\n\n    if (typeof obj.jquery !== 'undefined') {\n      obj = obj[0];\n    }\n\n    return typeof obj.nodeType !== 'undefined';\n  };\n\n  const getElement = obj => {\n    if (isElement(obj)) {\n      // it's a jQuery object or a node element\n      return obj.jquery ? obj[0] : obj;\n    }\n\n    if (typeof obj === 'string' && obj.length > 0) {\n      return document.querySelector(obj);\n    }\n\n    return null;\n  };\n\n  const typeCheckConfig = (componentName, config, configTypes) => {\n    Object.keys(configTypes).forEach(property => {\n      const expectedTypes = configTypes[property];\n      const value = config[property];\n      const valueType = value && isElement(value) ? 'element' : toType(value);\n\n      if (!new RegExp(expectedTypes).test(valueType)) {\n        throw new TypeError(`${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n      }\n    });\n  };\n\n  const isVisible = element => {\n    if (!isElement(element) || element.getClientRects().length === 0) {\n      return false;\n    }\n\n    return getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n  };\n\n  const isDisabled = element => {\n    if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n      return true;\n    }\n\n    if (element.classList.contains('disabled')) {\n      return true;\n    }\n\n    if (typeof element.disabled !== 'undefined') {\n      return element.disabled;\n    }\n\n    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n  };\n\n  const findShadowRoot = element => {\n    if (!document.documentElement.attachShadow) {\n      return null;\n    } // Can find the shadow root otherwise it'll return the document\n\n\n    if (typeof element.getRootNode === 'function') {\n      const root = element.getRootNode();\n      return root instanceof ShadowRoot ? root : null;\n    }\n\n    if (element instanceof ShadowRoot) {\n      return element;\n    } // when we don't find a shadow root\n\n\n    if (!element.parentNode) {\n      return null;\n    }\n\n    return findShadowRoot(element.parentNode);\n  };\n\n  const noop = () => {};\n  /**\n   * Trick to restart an element's animation\n   *\n   * @param {HTMLElement} element\n   * @return void\n   *\n   * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n   */\n\n\n  const reflow = element => {\n    // eslint-disable-next-line no-unused-expressions\n    element.offsetHeight;\n  };\n\n  const getjQuery = () => {\n    const {\n      jQuery\n    } = window;\n\n    if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n      return jQuery;\n    }\n\n    return null;\n  };\n\n  const DOMContentLoadedCallbacks = [];\n\n  const onDOMContentLoaded = callback => {\n    if (document.readyState === 'loading') {\n      // add listener on the first call when the document is in loading state\n      if (!DOMContentLoadedCallbacks.length) {\n        document.addEventListener('DOMContentLoaded', () => {\n          DOMContentLoadedCallbacks.forEach(callback => callback());\n        });\n      }\n\n      DOMContentLoadedCallbacks.push(callback);\n    } else {\n      callback();\n    }\n  };\n\n  const isRTL = () => document.documentElement.dir === 'rtl';\n\n  const defineJQueryPlugin = plugin => {\n    onDOMContentLoaded(() => {\n      const $ = getjQuery();\n      /* istanbul ignore if */\n\n      if ($) {\n        const name = plugin.NAME;\n        const JQUERY_NO_CONFLICT = $.fn[name];\n        $.fn[name] = plugin.jQueryInterface;\n        $.fn[name].Constructor = plugin;\n\n        $.fn[name].noConflict = () => {\n          $.fn[name] = JQUERY_NO_CONFLICT;\n          return plugin.jQueryInterface;\n        };\n      }\n    });\n  };\n\n  const execute = callback => {\n    if (typeof callback === 'function') {\n      callback();\n    }\n  };\n\n  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n    if (!waitForTransition) {\n      execute(callback);\n      return;\n    }\n\n    const durationPadding = 5;\n    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n    let called = false;\n\n    const handler = ({\n      target\n    }) => {\n      if (target !== transitionElement) {\n        return;\n      }\n\n      called = true;\n      transitionElement.removeEventListener(TRANSITION_END, handler);\n      execute(callback);\n    };\n\n    transitionElement.addEventListener(TRANSITION_END, handler);\n    setTimeout(() => {\n      if (!called) {\n        triggerTransitionEnd(transitionElement);\n      }\n    }, emulatedDuration);\n  };\n  /**\n   * Return the previous/next element of a list.\n   *\n   * @param {array} list    The list of elements\n   * @param activeElement   The active element\n   * @param shouldGetNext   Choose to get next or previous element\n   * @param isCycleAllowed\n   * @return {Element|elem} The proper element\n   */\n\n\n  const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n    let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n\n    if (index === -1) {\n      return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];\n    }\n\n    const listLength = list.length;\n    index += shouldGetNext ? 1 : -1;\n\n    if (isCycleAllowed) {\n      index = (index + listLength) % listLength;\n    }\n\n    return list[Math.max(0, Math.min(index, listLength - 1))];\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): dom/event-handler.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\n  const stripNameRegex = /\\..*/;\n  const stripUidRegex = /::\\d+$/;\n  const eventRegistry = {}; // Events storage\n\n  let uidEvent = 1;\n  const customEvents = {\n    mouseenter: 'mouseover',\n    mouseleave: 'mouseout'\n  };\n  const customEventsRegex = /^(mouseenter|mouseleave)/i;\n  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n  /**\n   * ------------------------------------------------------------------------\n   * Private methods\n   * ------------------------------------------------------------------------\n   */\n\n  function getUidEvent(element, uid) {\n    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n  }\n\n  function getEvent(element) {\n    const uid = getUidEvent(element);\n    element.uidEvent = uid;\n    eventRegistry[uid] = eventRegistry[uid] || {};\n    return eventRegistry[uid];\n  }\n\n  function bootstrapHandler(element, fn) {\n    return function handler(event) {\n      event.delegateTarget = element;\n\n      if (handler.oneOff) {\n        EventHandler.off(element, event.type, fn);\n      }\n\n      return fn.apply(element, [event]);\n    };\n  }\n\n  function bootstrapDelegationHandler(element, selector, fn) {\n    return function handler(event) {\n      const domElements = element.querySelectorAll(selector);\n\n      for (let {\n        target\n      } = event; target && target !== this; target = target.parentNode) {\n        for (let i = domElements.length; i--;) {\n          if (domElements[i] === target) {\n            event.delegateTarget = target;\n\n            if (handler.oneOff) {\n              EventHandler.off(element, event.type, selector, fn);\n            }\n\n            return fn.apply(target, [event]);\n          }\n        }\n      } // To please ESLint\n\n\n      return null;\n    };\n  }\n\n  function findHandler(events, handler, delegationSelector = null) {\n    const uidEventList = Object.keys(events);\n\n    for (let i = 0, len = uidEventList.length; i < len; i++) {\n      const event = events[uidEventList[i]];\n\n      if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n        return event;\n      }\n    }\n\n    return null;\n  }\n\n  function normalizeParams(originalTypeEvent, handler, delegationFn) {\n    const delegation = typeof handler === 'string';\n    const originalHandler = delegation ? delegationFn : handler;\n    let typeEvent = getTypeEvent(originalTypeEvent);\n    const isNative = nativeEvents.has(typeEvent);\n\n    if (!isNative) {\n      typeEvent = originalTypeEvent;\n    }\n\n    return [delegation, originalHandler, typeEvent];\n  }\n\n  function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return;\n    }\n\n    if (!handler) {\n      handler = delegationFn;\n      delegationFn = null;\n    } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n    // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n\n\n    if (customEventsRegex.test(originalTypeEvent)) {\n      const wrapFn = fn => {\n        return function (event) {\n          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n            return fn.call(this, event);\n          }\n        };\n      };\n\n      if (delegationFn) {\n        delegationFn = wrapFn(delegationFn);\n      } else {\n        handler = wrapFn(handler);\n      }\n    }\n\n    const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);\n    const events = getEvent(element);\n    const handlers = events[typeEvent] || (events[typeEvent] = {});\n    const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null);\n\n    if (previousFn) {\n      previousFn.oneOff = previousFn.oneOff && oneOff;\n      return;\n    }\n\n    const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''));\n    const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler);\n    fn.delegationSelector = delegation ? handler : null;\n    fn.originalHandler = originalHandler;\n    fn.oneOff = oneOff;\n    fn.uidEvent = uid;\n    handlers[uid] = fn;\n    element.addEventListener(typeEvent, fn, delegation);\n  }\n\n  function removeHandler(element, events, typeEvent, handler, delegationSelector) {\n    const fn = findHandler(events[typeEvent], handler, delegationSelector);\n\n    if (!fn) {\n      return;\n    }\n\n    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n    delete events[typeEvent][fn.uidEvent];\n  }\n\n  function removeNamespacedHandlers(element, events, typeEvent, namespace) {\n    const storeElementEvent = events[typeEvent] || {};\n    Object.keys(storeElementEvent).forEach(handlerKey => {\n      if (handlerKey.includes(namespace)) {\n        const event = storeElementEvent[handlerKey];\n        removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);\n      }\n    });\n  }\n\n  function getTypeEvent(event) {\n    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n    event = event.replace(stripNameRegex, '');\n    return customEvents[event] || event;\n  }\n\n  const EventHandler = {\n    on(element, event, handler, delegationFn) {\n      addHandler(element, event, handler, delegationFn, false);\n    },\n\n    one(element, event, handler, delegationFn) {\n      addHandler(element, event, handler, delegationFn, true);\n    },\n\n    off(element, originalTypeEvent, handler, delegationFn) {\n      if (typeof originalTypeEvent !== 'string' || !element) {\n        return;\n      }\n\n      const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);\n      const inNamespace = typeEvent !== originalTypeEvent;\n      const events = getEvent(element);\n      const isNamespace = originalTypeEvent.startsWith('.');\n\n      if (typeof originalHandler !== 'undefined') {\n        // Simplest case: handler is passed, remove that listener ONLY.\n        if (!events || !events[typeEvent]) {\n          return;\n        }\n\n        removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null);\n        return;\n      }\n\n      if (isNamespace) {\n        Object.keys(events).forEach(elementEvent => {\n          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n        });\n      }\n\n      const storeElementEvent = events[typeEvent] || {};\n      Object.keys(storeElementEvent).forEach(keyHandlers => {\n        const handlerKey = keyHandlers.replace(stripUidRegex, '');\n\n        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n          const event = storeElementEvent[keyHandlers];\n          removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);\n        }\n      });\n    },\n\n    trigger(element, event, args) {\n      if (typeof event !== 'string' || !element) {\n        return null;\n      }\n\n      const $ = getjQuery();\n      const typeEvent = getTypeEvent(event);\n      const inNamespace = event !== typeEvent;\n      const isNative = nativeEvents.has(typeEvent);\n      let jQueryEvent;\n      let bubbles = true;\n      let nativeDispatch = true;\n      let defaultPrevented = false;\n      let evt = null;\n\n      if (inNamespace && $) {\n        jQueryEvent = $.Event(event, args);\n        $(element).trigger(jQueryEvent);\n        bubbles = !jQueryEvent.isPropagationStopped();\n        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n        defaultPrevented = jQueryEvent.isDefaultPrevented();\n      }\n\n      if (isNative) {\n        evt = document.createEvent('HTMLEvents');\n        evt.initEvent(typeEvent, bubbles, true);\n      } else {\n        evt = new CustomEvent(event, {\n          bubbles,\n          cancelable: true\n        });\n      } // merge custom information in our event\n\n\n      if (typeof args !== 'undefined') {\n        Object.keys(args).forEach(key => {\n          Object.defineProperty(evt, key, {\n            get() {\n              return args[key];\n            }\n\n          });\n        });\n      }\n\n      if (defaultPrevented) {\n        evt.preventDefault();\n      }\n\n      if (nativeDispatch) {\n        element.dispatchEvent(evt);\n      }\n\n      if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n        jQueryEvent.preventDefault();\n      }\n\n      return evt;\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): dom/data.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  const elementMap = new Map();\n  const Data = {\n    set(element, key, instance) {\n      if (!elementMap.has(element)) {\n        elementMap.set(element, new Map());\n      }\n\n      const instanceMap = elementMap.get(element); // make it clear we only want one instance per element\n      // can be removed later when multiple key/instances are fine to be used\n\n      if (!instanceMap.has(key) && instanceMap.size !== 0) {\n        // eslint-disable-next-line no-console\n        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n        return;\n      }\n\n      instanceMap.set(key, instance);\n    },\n\n    get(element, key) {\n      if (elementMap.has(element)) {\n        return elementMap.get(element).get(key) || null;\n      }\n\n      return null;\n    },\n\n    remove(element, key) {\n      if (!elementMap.has(element)) {\n        return;\n      }\n\n      const instanceMap = elementMap.get(element);\n      instanceMap.delete(key); // free up element references if there are no instances left for an element\n\n      if (instanceMap.size === 0) {\n        elementMap.delete(element);\n      }\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): base-component.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const VERSION = '5.1.3';\n\n  class BaseComponent {\n    constructor(element) {\n      element = getElement(element);\n\n      if (!element) {\n        return;\n      }\n\n      this._element = element;\n      Data.set(this._element, this.constructor.DATA_KEY, this);\n    }\n\n    dispose() {\n      Data.remove(this._element, this.constructor.DATA_KEY);\n      EventHandler.off(this._element, this.constructor.EVENT_KEY);\n      Object.getOwnPropertyNames(this).forEach(propertyName => {\n        this[propertyName] = null;\n      });\n    }\n\n    _queueCallback(callback, element, isAnimated = true) {\n      executeAfterTransition(callback, element, isAnimated);\n    }\n    /** Static */\n\n\n    static getInstance(element) {\n      return Data.get(getElement(element), this.DATA_KEY);\n    }\n\n    static getOrCreateInstance(element, config = {}) {\n      return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n    }\n\n    static get VERSION() {\n      return VERSION;\n    }\n\n    static get NAME() {\n      throw new Error('You have to implement the static method \"NAME\", for each component!');\n    }\n\n    static get DATA_KEY() {\n      return `bs.${this.NAME}`;\n    }\n\n    static get EVENT_KEY() {\n      return `.${this.DATA_KEY}`;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/component-functions.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const enableDismissTrigger = (component, method = 'hide') => {\n    const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n    const name = component.NAME;\n    EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n      if (['A', 'AREA'].includes(this.tagName)) {\n        event.preventDefault();\n      }\n\n      if (isDisabled(this)) {\n        return;\n      }\n\n      const target = getElementFromSelector(this) || this.closest(`.${name}`);\n      const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n\n      instance[method]();\n    });\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): alert.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$d = 'alert';\n  const DATA_KEY$c = 'bs.alert';\n  const EVENT_KEY$c = `.${DATA_KEY$c}`;\n  const EVENT_CLOSE = `close${EVENT_KEY$c}`;\n  const EVENT_CLOSED = `closed${EVENT_KEY$c}`;\n  const CLASS_NAME_FADE$5 = 'fade';\n  const CLASS_NAME_SHOW$8 = 'show';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Alert extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$d;\n    } // Public\n\n\n    close() {\n      const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n\n      if (closeEvent.defaultPrevented) {\n        return;\n      }\n\n      this._element.classList.remove(CLASS_NAME_SHOW$8);\n\n      const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n\n      this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n    } // Private\n\n\n    _destroyElement() {\n      this._element.remove();\n\n      EventHandler.trigger(this._element, EVENT_CLOSED);\n      this.dispose();\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Alert.getOrCreateInstance(this);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](this);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  enableDismissTrigger(Alert, 'close');\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Alert to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Alert);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): button.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$c = 'button';\n  const DATA_KEY$b = 'bs.button';\n  const EVENT_KEY$b = `.${DATA_KEY$b}`;\n  const DATA_API_KEY$7 = '.data-api';\n  const CLASS_NAME_ACTIVE$3 = 'active';\n  const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\n  const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$b}${DATA_API_KEY$7}`;\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Button extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$c;\n    } // Public\n\n\n    toggle() {\n      // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n      this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Button.getOrCreateInstance(this);\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n    event.preventDefault();\n    const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n    const data = Button.getOrCreateInstance(button);\n    data.toggle();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Button to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Button);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): dom/manipulator.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  function normalizeData(val) {\n    if (val === 'true') {\n      return true;\n    }\n\n    if (val === 'false') {\n      return false;\n    }\n\n    if (val === Number(val).toString()) {\n      return Number(val);\n    }\n\n    if (val === '' || val === 'null') {\n      return null;\n    }\n\n    return val;\n  }\n\n  function normalizeDataKey(key) {\n    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n  }\n\n  const Manipulator = {\n    setDataAttribute(element, key, value) {\n      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n    },\n\n    removeDataAttribute(element, key) {\n      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n    },\n\n    getDataAttributes(element) {\n      if (!element) {\n        return {};\n      }\n\n      const attributes = {};\n      Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {\n        let pureKey = key.replace(/^bs/, '');\n        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n        attributes[pureKey] = normalizeData(element.dataset[key]);\n      });\n      return attributes;\n    },\n\n    getDataAttribute(element, key) {\n      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n    },\n\n    offset(element) {\n      const rect = element.getBoundingClientRect();\n      return {\n        top: rect.top + window.pageYOffset,\n        left: rect.left + window.pageXOffset\n      };\n    },\n\n    position(element) {\n      return {\n        top: element.offsetTop,\n        left: element.offsetLeft\n      };\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): dom/selector-engine.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const NODE_TEXT = 3;\n  const SelectorEngine = {\n    find(selector, element = document.documentElement) {\n      return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n    },\n\n    findOne(selector, element = document.documentElement) {\n      return Element.prototype.querySelector.call(element, selector);\n    },\n\n    children(element, selector) {\n      return [].concat(...element.children).filter(child => child.matches(selector));\n    },\n\n    parents(element, selector) {\n      const parents = [];\n      let ancestor = element.parentNode;\n\n      while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n        if (ancestor.matches(selector)) {\n          parents.push(ancestor);\n        }\n\n        ancestor = ancestor.parentNode;\n      }\n\n      return parents;\n    },\n\n    prev(element, selector) {\n      let previous = element.previousElementSibling;\n\n      while (previous) {\n        if (previous.matches(selector)) {\n          return [previous];\n        }\n\n        previous = previous.previousElementSibling;\n      }\n\n      return [];\n    },\n\n    next(element, selector) {\n      let next = element.nextElementSibling;\n\n      while (next) {\n        if (next.matches(selector)) {\n          return [next];\n        }\n\n        next = next.nextElementSibling;\n      }\n\n      return [];\n    },\n\n    focusableChildren(element) {\n      const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ');\n      return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): carousel.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$b = 'carousel';\n  const DATA_KEY$a = 'bs.carousel';\n  const EVENT_KEY$a = `.${DATA_KEY$a}`;\n  const DATA_API_KEY$6 = '.data-api';\n  const ARROW_LEFT_KEY = 'ArrowLeft';\n  const ARROW_RIGHT_KEY = 'ArrowRight';\n  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  const SWIPE_THRESHOLD = 40;\n  const Default$a = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  const DefaultType$a = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  const ORDER_NEXT = 'next';\n  const ORDER_PREV = 'prev';\n  const DIRECTION_LEFT = 'left';\n  const DIRECTION_RIGHT = 'right';\n  const KEY_TO_DIRECTION = {\n    [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n    [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n  };\n  const EVENT_SLIDE = `slide${EVENT_KEY$a}`;\n  const EVENT_SLID = `slid${EVENT_KEY$a}`;\n  const EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`;\n  const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`;\n  const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`;\n  const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$a}`;\n  const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$a}`;\n  const EVENT_TOUCHEND = `touchend${EVENT_KEY$a}`;\n  const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$a}`;\n  const EVENT_POINTERUP = `pointerup${EVENT_KEY$a}`;\n  const EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;\n  const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`;\n  const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n  const CLASS_NAME_CAROUSEL = 'carousel';\n  const CLASS_NAME_ACTIVE$2 = 'active';\n  const CLASS_NAME_SLIDE = 'slide';\n  const CLASS_NAME_END = 'carousel-item-end';\n  const CLASS_NAME_START = 'carousel-item-start';\n  const CLASS_NAME_NEXT = 'carousel-item-next';\n  const CLASS_NAME_PREV = 'carousel-item-prev';\n  const CLASS_NAME_POINTER_EVENT = 'pointer-event';\n  const SELECTOR_ACTIVE$1 = '.active';\n  const SELECTOR_ACTIVE_ITEM = '.active.carousel-item';\n  const SELECTOR_ITEM = '.carousel-item';\n  const SELECTOR_ITEM_IMG = '.carousel-item img';\n  const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';\n  const SELECTOR_INDICATORS = '.carousel-indicators';\n  const SELECTOR_INDICATOR = '[data-bs-target]';\n  const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\n  const SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\n  const POINTER_TYPE_TOUCH = 'touch';\n  const POINTER_TYPE_PEN = 'pen';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Carousel extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    static get Default() {\n      return Default$a;\n    }\n\n    static get NAME() {\n      return NAME$b;\n    } // Public\n\n\n    next() {\n      this._slide(ORDER_NEXT);\n    }\n\n    nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && isVisible(this._element)) {\n        this.next();\n      }\n    }\n\n    prev() {\n      this._slide(ORDER_PREV);\n    }\n\n    pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n        triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    }\n\n    cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config && this._config.interval && !this._isPaused) {\n        this._updateInterval();\n\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    }\n\n    to(index) {\n      this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      const activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n\n      this._slide(order, this._items[index]);\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$a,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$b, config, DefaultType$a);\n      return config;\n    }\n\n    _handleSwipe() {\n      const absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      const direction = absDeltax / this.touchDeltaX;\n      this.touchDeltaX = 0;\n\n      if (!direction) {\n        return;\n      }\n\n      this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT);\n    }\n\n    _addEventListeners() {\n      if (this._config.keyboard) {\n        EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));\n      }\n\n      if (this._config.pause === 'hover') {\n        EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event));\n        EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event));\n      }\n\n      if (this._config.touch && this._touchSupported) {\n        this._addTouchEventListeners();\n      }\n    }\n\n    _addTouchEventListeners() {\n      const hasPointerPenTouch = event => {\n        return this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);\n      };\n\n      const start = event => {\n        if (hasPointerPenTouch(event)) {\n          this.touchStartX = event.clientX;\n        } else if (!this._pointerEvent) {\n          this.touchStartX = event.touches[0].clientX;\n        }\n      };\n\n      const move = event => {\n        // ensure swiping with one touch and not pinching\n        this.touchDeltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX;\n      };\n\n      const end = event => {\n        if (hasPointerPenTouch(event)) {\n          this.touchDeltaX = event.clientX - this.touchStartX;\n        }\n\n        this._handleSwipe();\n\n        if (this._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          this.pause();\n\n          if (this.touchTimeout) {\n            clearTimeout(this.touchTimeout);\n          }\n\n          this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n        }\n      };\n\n      SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n        EventHandler.on(itemImg, EVENT_DRAG_START, event => event.preventDefault());\n      });\n\n      if (this._pointerEvent) {\n        EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event));\n        EventHandler.on(this._element, EVENT_POINTERUP, event => end(event));\n\n        this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n      } else {\n        EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event));\n        EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event));\n        EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event));\n      }\n    }\n\n    _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      const direction = KEY_TO_DIRECTION[event.key];\n\n      if (direction) {\n        event.preventDefault();\n\n        this._slide(direction);\n      }\n    }\n\n    _getItemIndex(element) {\n      this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : [];\n      return this._items.indexOf(element);\n    }\n\n    _getItemByOrder(order, activeElement) {\n      const isNext = order === ORDER_NEXT;\n      return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap);\n    }\n\n    _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      const targetIndex = this._getItemIndex(relatedTarget);\n\n      const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element));\n\n      return EventHandler.trigger(this._element, EVENT_SLIDE, {\n        relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n    }\n\n    _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE$1, this._indicatorsElement);\n        activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n        activeIndicator.removeAttribute('aria-current');\n        const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement);\n\n        for (let i = 0; i < indicators.length; i++) {\n          if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n            indicators[i].classList.add(CLASS_NAME_ACTIVE$2);\n            indicators[i].setAttribute('aria-current', 'true');\n            break;\n          }\n        }\n      }\n    }\n\n    _updateInterval() {\n      const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      if (!element) {\n        return;\n      }\n\n      const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n\n      if (elementInterval) {\n        this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n        this._config.interval = elementInterval;\n      } else {\n        this._config.interval = this._config.defaultInterval || this._config.interval;\n      }\n    }\n\n    _slide(directionOrOrder, element) {\n      const order = this._directionToOrder(directionOrOrder);\n\n      const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      const activeElementIndex = this._getItemIndex(activeElement);\n\n      const nextElement = element || this._getItemByOrder(order, activeElement);\n\n      const nextElementIndex = this._getItemIndex(nextElement);\n\n      const isCycling = Boolean(this._interval);\n      const isNext = order === ORDER_NEXT;\n      const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n      const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n\n      const eventDirectionName = this._orderToDirection(order);\n\n      if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE$2)) {\n        this._isSliding = false;\n        return;\n      }\n\n      if (this._isSliding) {\n        return;\n      }\n\n      const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.defaultPrevented) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      this._activeElement = nextElement;\n\n      const triggerSlidEvent = () => {\n        EventHandler.trigger(this._element, EVENT_SLID, {\n          relatedTarget: nextElement,\n          direction: eventDirectionName,\n          from: activeElementIndex,\n          to: nextElementIndex\n        });\n      };\n\n      if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n        nextElement.classList.add(orderClassName);\n        reflow(nextElement);\n        activeElement.classList.add(directionalClassName);\n        nextElement.classList.add(directionalClassName);\n\n        const completeCallBack = () => {\n          nextElement.classList.remove(directionalClassName, orderClassName);\n          nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n          activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n          this._isSliding = false;\n          setTimeout(triggerSlidEvent, 0);\n        };\n\n        this._queueCallback(completeCallBack, activeElement, true);\n      } else {\n        activeElement.classList.remove(CLASS_NAME_ACTIVE$2);\n        nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n        this._isSliding = false;\n        triggerSlidEvent();\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    }\n\n    _directionToOrder(direction) {\n      if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n        return direction;\n      }\n\n      if (isRTL()) {\n        return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n      }\n\n      return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n    }\n\n    _orderToDirection(order) {\n      if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n        return order;\n      }\n\n      if (isRTL()) {\n        return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n      }\n\n      return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n    } // Static\n\n\n    static carouselInterface(element, config) {\n      const data = Carousel.getOrCreateInstance(element, config);\n      let {\n        _config\n      } = data;\n\n      if (typeof config === 'object') {\n        _config = { ..._config,\n          ...config\n        };\n      }\n\n      const action = typeof config === 'string' ? config : _config.slide;\n\n      if (typeof config === 'number') {\n        data.to(config);\n      } else if (typeof action === 'string') {\n        if (typeof data[action] === 'undefined') {\n          throw new TypeError(`No method named \"${action}\"`);\n        }\n\n        data[action]();\n      } else if (_config.interval && _config.ride) {\n        data.pause();\n        data.cycle();\n      }\n    }\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        Carousel.carouselInterface(this, config);\n      });\n    }\n\n    static dataApiClickHandler(event) {\n      const target = getElementFromSelector(this);\n\n      if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n        return;\n      }\n\n      const config = { ...Manipulator.getDataAttributes(target),\n        ...Manipulator.getDataAttributes(this)\n      };\n      const slideIndex = this.getAttribute('data-bs-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel.carouselInterface(target, config);\n\n      if (slideIndex) {\n        Carousel.getInstance(target).to(slideIndex);\n      }\n\n      event.preventDefault();\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler);\n  EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n    const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n\n    for (let i = 0, len = carousels.length; i < len; i++) {\n      Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]));\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Carousel to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Carousel);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): collapse.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$a = 'collapse';\n  const DATA_KEY$9 = 'bs.collapse';\n  const EVENT_KEY$9 = `.${DATA_KEY$9}`;\n  const DATA_API_KEY$5 = '.data-api';\n  const Default$9 = {\n    toggle: true,\n    parent: null\n  };\n  const DefaultType$9 = {\n    toggle: 'boolean',\n    parent: '(null|element)'\n  };\n  const EVENT_SHOW$5 = `show${EVENT_KEY$9}`;\n  const EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`;\n  const EVENT_HIDE$5 = `hide${EVENT_KEY$9}`;\n  const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`;\n  const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`;\n  const CLASS_NAME_SHOW$7 = 'show';\n  const CLASS_NAME_COLLAPSE = 'collapse';\n  const CLASS_NAME_COLLAPSING = 'collapsing';\n  const CLASS_NAME_COLLAPSED = 'collapsed';\n  const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\n  const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\n  const WIDTH = 'width';\n  const HEIGHT = 'height';\n  const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing';\n  const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Collapse extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._isTransitioning = false;\n      this._config = this._getConfig(config);\n      this._triggerArray = [];\n      const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n\n      for (let i = 0, len = toggleList.length; i < len; i++) {\n        const elem = toggleList[i];\n        const selector = getSelectorFromElement(elem);\n        const filterElement = SelectorEngine.find(selector).filter(foundElem => foundElem === this._element);\n\n        if (selector !== null && filterElement.length) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._initializeChildren();\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    static get Default() {\n      return Default$9;\n    }\n\n    static get NAME() {\n      return NAME$a;\n    } // Public\n\n\n    toggle() {\n      if (this._isShown()) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    }\n\n    show() {\n      if (this._isTransitioning || this._isShown()) {\n        return;\n      }\n\n      let actives = [];\n      let activesData;\n\n      if (this._config.parent) {\n        const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n        actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth\n      }\n\n      const container = SelectorEngine.findOne(this._selector);\n\n      if (actives.length) {\n        const tempActiveData = actives.find(elem => container !== elem);\n        activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$5);\n\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n\n      actives.forEach(elemActive => {\n        if (container !== elemActive) {\n          Collapse.getOrCreateInstance(elemActive, {\n            toggle: false\n          }).hide();\n        }\n\n        if (!activesData) {\n          Data.set(elemActive, DATA_KEY$9, null);\n        }\n      });\n\n      const dimension = this._getDimension();\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSE);\n\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n      this._element.style[dimension] = 0;\n\n      this._addAriaAndCollapsedClass(this._triggerArray, true);\n\n      this._isTransitioning = true;\n\n      const complete = () => {\n        this._isTransitioning = false;\n\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n        this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n        this._element.style[dimension] = '';\n        EventHandler.trigger(this._element, EVENT_SHOWN$5);\n      };\n\n      const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      const scrollSize = `scroll${capitalizedDimension}`;\n\n      this._queueCallback(complete, this._element, true);\n\n      this._element.style[dimension] = `${this._element[scrollSize]}px`;\n    }\n\n    hide() {\n      if (this._isTransitioning || !this._isShown()) {\n        return;\n      }\n\n      const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$5);\n\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n\n      const dimension = this._getDimension();\n\n      this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n      reflow(this._element);\n\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n      const triggerArrayLength = this._triggerArray.length;\n\n      for (let i = 0; i < triggerArrayLength; i++) {\n        const trigger = this._triggerArray[i];\n        const elem = getElementFromSelector(trigger);\n\n        if (elem && !this._isShown(elem)) {\n          this._addAriaAndCollapsedClass([trigger], false);\n        }\n      }\n\n      this._isTransitioning = true;\n\n      const complete = () => {\n        this._isTransitioning = false;\n\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n        this._element.classList.add(CLASS_NAME_COLLAPSE);\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$5);\n      };\n\n      this._element.style[dimension] = '';\n\n      this._queueCallback(complete, this._element, true);\n    }\n\n    _isShown(element = this._element) {\n      return element.classList.contains(CLASS_NAME_SHOW$7);\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$9,\n        ...Manipulator.getDataAttributes(this._element),\n        ...config\n      };\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      config.parent = getElement(config.parent);\n      typeCheckConfig(NAME$a, config, DefaultType$9);\n      return config;\n    }\n\n    _getDimension() {\n      return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n    }\n\n    _initializeChildren() {\n      if (!this._config.parent) {\n        return;\n      }\n\n      const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);\n      SelectorEngine.find(SELECTOR_DATA_TOGGLE$4, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {\n        const selected = getElementFromSelector(element);\n\n        if (selected) {\n          this._addAriaAndCollapsedClass([element], this._isShown(selected));\n        }\n      });\n    }\n\n    _addAriaAndCollapsedClass(triggerArray, isOpen) {\n      if (!triggerArray.length) {\n        return;\n      }\n\n      triggerArray.forEach(elem => {\n        if (isOpen) {\n          elem.classList.remove(CLASS_NAME_COLLAPSED);\n        } else {\n          elem.classList.add(CLASS_NAME_COLLAPSED);\n        }\n\n        elem.setAttribute('aria-expanded', isOpen);\n      });\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const _config = {};\n\n        if (typeof config === 'string' && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        const data = Collapse.getOrCreateInstance(this, _config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    const selector = getSelectorFromElement(this);\n    const selectorElements = SelectorEngine.find(selector);\n    selectorElements.forEach(element => {\n      Collapse.getOrCreateInstance(element, {\n        toggle: false\n      }).toggle();\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Collapse to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Collapse);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): dropdown.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$9 = 'dropdown';\n  const DATA_KEY$8 = 'bs.dropdown';\n  const EVENT_KEY$8 = `.${DATA_KEY$8}`;\n  const DATA_API_KEY$4 = '.data-api';\n  const ESCAPE_KEY$2 = 'Escape';\n  const SPACE_KEY = 'Space';\n  const TAB_KEY$1 = 'Tab';\n  const ARROW_UP_KEY = 'ArrowUp';\n  const ARROW_DOWN_KEY = 'ArrowDown';\n  const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\n  const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`);\n  const EVENT_HIDE$4 = `hide${EVENT_KEY$8}`;\n  const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`;\n  const EVENT_SHOW$4 = `show${EVENT_KEY$8}`;\n  const EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`;\n  const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const CLASS_NAME_SHOW$6 = 'show';\n  const CLASS_NAME_DROPUP = 'dropup';\n  const CLASS_NAME_DROPEND = 'dropend';\n  const CLASS_NAME_DROPSTART = 'dropstart';\n  const CLASS_NAME_NAVBAR = 'navbar';\n  const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]';\n  const SELECTOR_MENU = '.dropdown-menu';\n  const SELECTOR_NAVBAR_NAV = '.navbar-nav';\n  const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\n  const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\n  const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\n  const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\n  const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\n  const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\n  const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\n  const Default$8 = {\n    offset: [0, 2],\n    boundary: 'clippingParents',\n    reference: 'toggle',\n    display: 'dynamic',\n    popperConfig: null,\n    autoClose: true\n  };\n  const DefaultType$8 = {\n    offset: '(array|string|function)',\n    boundary: '(string|element)',\n    reference: '(string|element|object)',\n    display: 'string',\n    popperConfig: '(null|object|function)',\n    autoClose: '(boolean|string)'\n  };\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Dropdown extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n    } // Getters\n\n\n    static get Default() {\n      return Default$8;\n    }\n\n    static get DefaultType() {\n      return DefaultType$8;\n    }\n\n    static get NAME() {\n      return NAME$9;\n    } // Public\n\n\n    toggle() {\n      return this._isShown() ? this.hide() : this.show();\n    }\n\n    show() {\n      if (isDisabled(this._element) || this._isShown(this._menu)) {\n        return;\n      }\n\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, relatedTarget);\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar\n\n      if (this._inNavbar) {\n        Manipulator.setDataAttribute(this._menu, 'popper', 'none');\n      } else {\n        this._createPopper(parent);\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {\n        [].concat(...document.body.children).forEach(elem => EventHandler.on(elem, 'mouseover', noop));\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      this._menu.classList.add(CLASS_NAME_SHOW$6);\n\n      this._element.classList.add(CLASS_NAME_SHOW$6);\n\n      EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);\n    }\n\n    hide() {\n      if (isDisabled(this._element) || !this._isShown(this._menu)) {\n        return;\n      }\n\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n\n      this._completeHide(relatedTarget);\n    }\n\n    dispose() {\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      super.dispose();\n    }\n\n    update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper) {\n        this._popper.update();\n      }\n    } // Private\n\n\n    _completeHide(relatedTarget) {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      } // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(elem => EventHandler.off(elem, 'mouseover', noop));\n      }\n\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      this._menu.classList.remove(CLASS_NAME_SHOW$6);\n\n      this._element.classList.remove(CLASS_NAME_SHOW$6);\n\n      this._element.setAttribute('aria-expanded', 'false');\n\n      Manipulator.removeDataAttribute(this._menu, 'popper');\n      EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget);\n    }\n\n    _getConfig(config) {\n      config = { ...this.constructor.Default,\n        ...Manipulator.getDataAttributes(this._element),\n        ...config\n      };\n      typeCheckConfig(NAME$9, config, this.constructor.DefaultType);\n\n      if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n        // Popper virtual elements require a getBoundingClientRect method\n        throw new TypeError(`${NAME$9.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n      }\n\n      return config;\n    }\n\n    _createPopper(parent) {\n      if (typeof Popper__namespace === 'undefined') {\n        throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n      }\n\n      let referenceElement = this._element;\n\n      if (this._config.reference === 'parent') {\n        referenceElement = parent;\n      } else if (isElement(this._config.reference)) {\n        referenceElement = getElement(this._config.reference);\n      } else if (typeof this._config.reference === 'object') {\n        referenceElement = this._config.reference;\n      }\n\n      const popperConfig = this._getPopperConfig();\n\n      const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);\n      this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);\n\n      if (isDisplayStatic) {\n        Manipulator.setDataAttribute(this._menu, 'popper', 'static');\n      }\n    }\n\n    _isShown(element = this._element) {\n      return element.classList.contains(CLASS_NAME_SHOW$6);\n    }\n\n    _getMenuElement() {\n      return SelectorEngine.next(this._element, SELECTOR_MENU)[0];\n    }\n\n    _getPlacement() {\n      const parentDropdown = this._element.parentNode;\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n        return PLACEMENT_RIGHT;\n      }\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n        return PLACEMENT_LEFT;\n      } // We need to trim the value because custom properties can also include spaces\n\n\n      const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n        return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n      }\n\n      return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n    }\n\n    _detectNavbar() {\n      return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;\n    }\n\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n\n      if (typeof offset === 'string') {\n        return offset.split(',').map(val => Number.parseInt(val, 10));\n      }\n\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n\n      return offset;\n    }\n\n    _getPopperConfig() {\n      const defaultBsPopperConfig = {\n        placement: this._getPlacement(),\n        modifiers: [{\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }]\n      }; // Disable Popper if we have a static display\n\n      if (this._config.display === 'static') {\n        defaultBsPopperConfig.modifiers = [{\n          name: 'applyStyles',\n          enabled: false\n        }];\n      }\n\n      return { ...defaultBsPopperConfig,\n        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n      };\n    }\n\n    _selectMenuItem({\n      key,\n      target\n    }) {\n      const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);\n\n      if (!items.length) {\n        return;\n      } // if target isn't included in items (e.g. when expanding the dropdown)\n      // allow cycling to get the last item in case key equals ARROW_UP_KEY\n\n\n      getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Dropdown.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      });\n    }\n\n    static clearMenus(event) {\n      if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1)) {\n        return;\n      }\n\n      const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3);\n\n      for (let i = 0, len = toggles.length; i < len; i++) {\n        const context = Dropdown.getInstance(toggles[i]);\n\n        if (!context || context._config.autoClose === false) {\n          continue;\n        }\n\n        if (!context._isShown()) {\n          continue;\n        }\n\n        const relatedTarget = {\n          relatedTarget: context._element\n        };\n\n        if (event) {\n          const composedPath = event.composedPath();\n          const isMenuTarget = composedPath.includes(context._menu);\n\n          if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n            continue;\n          } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n\n\n          if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n            continue;\n          }\n\n          if (event.type === 'click') {\n            relatedTarget.clickEvent = event;\n          }\n        }\n\n        context._completeHide(relatedTarget);\n      }\n    }\n\n    static getParentFromElement(element) {\n      return getElementFromSelector(element) || element.parentNode;\n    }\n\n    static dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY$2 && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {\n        return;\n      }\n\n      const isActive = this.classList.contains(CLASS_NAME_SHOW$6);\n\n      if (!isActive && event.key === ESCAPE_KEY$2) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (isDisabled(this)) {\n        return;\n      }\n\n      const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];\n      const instance = Dropdown.getOrCreateInstance(getToggleButton);\n\n      if (event.key === ESCAPE_KEY$2) {\n        instance.hide();\n        return;\n      }\n\n      if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n        if (!isActive) {\n          instance.show();\n        }\n\n        instance._selectMenuItem(event);\n\n        return;\n      }\n\n      if (!isActive || event.key === SPACE_KEY) {\n        Dropdown.clearMenus();\n      }\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n    event.preventDefault();\n    Dropdown.getOrCreateInstance(this).toggle();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Dropdown to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Dropdown);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/scrollBar.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\n  const SELECTOR_STICKY_CONTENT = '.sticky-top';\n\n  class ScrollBarHelper {\n    constructor() {\n      this._element = document.body;\n    }\n\n    getWidth() {\n      // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n      const documentWidth = document.documentElement.clientWidth;\n      return Math.abs(window.innerWidth - documentWidth);\n    }\n\n    hide() {\n      const width = this.getWidth();\n\n      this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width\n\n\n      this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n\n\n      this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);\n\n      this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);\n    }\n\n    _disableOverFlow() {\n      this._saveInitialAttribute(this._element, 'overflow');\n\n      this._element.style.overflow = 'hidden';\n    }\n\n    _setElementAttributes(selector, styleProp, callback) {\n      const scrollbarWidth = this.getWidth();\n\n      const manipulationCallBack = element => {\n        if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n          return;\n        }\n\n        this._saveInitialAttribute(element, styleProp);\n\n        const calculatedValue = window.getComputedStyle(element)[styleProp];\n        element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;\n      };\n\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n\n    reset() {\n      this._resetElementAttributes(this._element, 'overflow');\n\n      this._resetElementAttributes(this._element, 'paddingRight');\n\n      this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');\n\n      this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');\n    }\n\n    _saveInitialAttribute(element, styleProp) {\n      const actualValue = element.style[styleProp];\n\n      if (actualValue) {\n        Manipulator.setDataAttribute(element, styleProp, actualValue);\n      }\n    }\n\n    _resetElementAttributes(selector, styleProp) {\n      const manipulationCallBack = element => {\n        const value = Manipulator.getDataAttribute(element, styleProp);\n\n        if (typeof value === 'undefined') {\n          element.style.removeProperty(styleProp);\n        } else {\n          Manipulator.removeDataAttribute(element, styleProp);\n          element.style[styleProp] = value;\n        }\n      };\n\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n\n    _applyManipulationCallback(selector, callBack) {\n      if (isElement(selector)) {\n        callBack(selector);\n      } else {\n        SelectorEngine.find(selector, this._element).forEach(callBack);\n      }\n    }\n\n    isOverflowing() {\n      return this.getWidth() > 0;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/backdrop.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const Default$7 = {\n    className: 'modal-backdrop',\n    isVisible: true,\n    // if false, we use the backdrop helper without adding any element to the dom\n    isAnimated: false,\n    rootElement: 'body',\n    // give the choice to place backdrop under different elements\n    clickCallback: null\n  };\n  const DefaultType$7 = {\n    className: 'string',\n    isVisible: 'boolean',\n    isAnimated: 'boolean',\n    rootElement: '(element|string)',\n    clickCallback: '(function|null)'\n  };\n  const NAME$8 = 'backdrop';\n  const CLASS_NAME_FADE$4 = 'fade';\n  const CLASS_NAME_SHOW$5 = 'show';\n  const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`;\n\n  class Backdrop {\n    constructor(config) {\n      this._config = this._getConfig(config);\n      this._isAppended = false;\n      this._element = null;\n    }\n\n    show(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n\n      this._append();\n\n      if (this._config.isAnimated) {\n        reflow(this._getElement());\n      }\n\n      this._getElement().classList.add(CLASS_NAME_SHOW$5);\n\n      this._emulateAnimation(() => {\n        execute(callback);\n      });\n    }\n\n    hide(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n\n      this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n\n      this._emulateAnimation(() => {\n        this.dispose();\n        execute(callback);\n      });\n    } // Private\n\n\n    _getElement() {\n      if (!this._element) {\n        const backdrop = document.createElement('div');\n        backdrop.className = this._config.className;\n\n        if (this._config.isAnimated) {\n          backdrop.classList.add(CLASS_NAME_FADE$4);\n        }\n\n        this._element = backdrop;\n      }\n\n      return this._element;\n    }\n\n    _getConfig(config) {\n      config = { ...Default$7,\n        ...(typeof config === 'object' ? config : {})\n      }; // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n\n      config.rootElement = getElement(config.rootElement);\n      typeCheckConfig(NAME$8, config, DefaultType$7);\n      return config;\n    }\n\n    _append() {\n      if (this._isAppended) {\n        return;\n      }\n\n      this._config.rootElement.append(this._getElement());\n\n      EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n        execute(this._config.clickCallback);\n      });\n      this._isAppended = true;\n    }\n\n    dispose() {\n      if (!this._isAppended) {\n        return;\n      }\n\n      EventHandler.off(this._element, EVENT_MOUSEDOWN);\n\n      this._element.remove();\n\n      this._isAppended = false;\n    }\n\n    _emulateAnimation(callback) {\n      executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/focustrap.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const Default$6 = {\n    trapElement: null,\n    // The element to trap focus inside of\n    autofocus: true\n  };\n  const DefaultType$6 = {\n    trapElement: 'element',\n    autofocus: 'boolean'\n  };\n  const NAME$7 = 'focustrap';\n  const DATA_KEY$7 = 'bs.focustrap';\n  const EVENT_KEY$7 = `.${DATA_KEY$7}`;\n  const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`;\n  const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;\n  const TAB_KEY = 'Tab';\n  const TAB_NAV_FORWARD = 'forward';\n  const TAB_NAV_BACKWARD = 'backward';\n\n  class FocusTrap {\n    constructor(config) {\n      this._config = this._getConfig(config);\n      this._isActive = false;\n      this._lastTabNavDirection = null;\n    }\n\n    activate() {\n      const {\n        trapElement,\n        autofocus\n      } = this._config;\n\n      if (this._isActive) {\n        return;\n      }\n\n      if (autofocus) {\n        trapElement.focus();\n      }\n\n      EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop\n\n      EventHandler.on(document, EVENT_FOCUSIN$1, event => this._handleFocusin(event));\n      EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n      this._isActive = true;\n    }\n\n    deactivate() {\n      if (!this._isActive) {\n        return;\n      }\n\n      this._isActive = false;\n      EventHandler.off(document, EVENT_KEY$7);\n    } // Private\n\n\n    _handleFocusin(event) {\n      const {\n        target\n      } = event;\n      const {\n        trapElement\n      } = this._config;\n\n      if (target === document || target === trapElement || trapElement.contains(target)) {\n        return;\n      }\n\n      const elements = SelectorEngine.focusableChildren(trapElement);\n\n      if (elements.length === 0) {\n        trapElement.focus();\n      } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n        elements[elements.length - 1].focus();\n      } else {\n        elements[0].focus();\n      }\n    }\n\n    _handleKeydown(event) {\n      if (event.key !== TAB_KEY) {\n        return;\n      }\n\n      this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n    }\n\n    _getConfig(config) {\n      config = { ...Default$6,\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$7, config, DefaultType$6);\n      return config;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): modal.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$6 = 'modal';\n  const DATA_KEY$6 = 'bs.modal';\n  const EVENT_KEY$6 = `.${DATA_KEY$6}`;\n  const DATA_API_KEY$3 = '.data-api';\n  const ESCAPE_KEY$1 = 'Escape';\n  const Default$5 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true\n  };\n  const DefaultType$5 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean'\n  };\n  const EVENT_HIDE$3 = `hide${EVENT_KEY$6}`;\n  const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$6}`;\n  const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`;\n  const EVENT_SHOW$3 = `show${EVENT_KEY$6}`;\n  const EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`;\n  const EVENT_RESIZE = `resize${EVENT_KEY$6}`;\n  const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;\n  const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;\n  const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;\n  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;\n  const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\n  const CLASS_NAME_OPEN = 'modal-open';\n  const CLASS_NAME_FADE$3 = 'fade';\n  const CLASS_NAME_SHOW$4 = 'show';\n  const CLASS_NAME_STATIC = 'modal-static';\n  const OPEN_SELECTOR$1 = '.modal.show';\n  const SELECTOR_DIALOG = '.modal-dialog';\n  const SELECTOR_MODAL_BODY = '.modal-body';\n  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Modal extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n      this._isShown = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollBar = new ScrollBarHelper();\n    } // Getters\n\n\n    static get Default() {\n      return Default$5;\n    }\n\n    static get NAME() {\n      return NAME$6;\n    } // Public\n\n\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n\n    show(relatedTarget) {\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n        relatedTarget\n      });\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = true;\n\n      if (this._isAnimated()) {\n        this._isTransitioning = true;\n      }\n\n      this._scrollBar.hide();\n\n      document.body.classList.add(CLASS_NAME_OPEN);\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n        EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n          if (event.target === this._element) {\n            this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(() => this._showElement(relatedTarget));\n    }\n\n    hide() {\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = false;\n\n      const isAnimated = this._isAnimated();\n\n      if (isAnimated) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      this._focustrap.deactivate();\n\n      this._element.classList.remove(CLASS_NAME_SHOW$4);\n\n      EventHandler.off(this._element, EVENT_CLICK_DISMISS);\n      EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);\n\n      this._queueCallback(() => this._hideModal(), this._element, isAnimated);\n    }\n\n    dispose() {\n      [window, this._dialog].forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY$6));\n\n      this._backdrop.dispose();\n\n      this._focustrap.deactivate();\n\n      super.dispose();\n    }\n\n    handleUpdate() {\n      this._adjustDialog();\n    } // Private\n\n\n    _initializeBackDrop() {\n      return new Backdrop({\n        isVisible: Boolean(this._config.backdrop),\n        // 'static' option will be translated to true, and booleans will keep their value\n        isAnimated: this._isAnimated()\n      });\n    }\n\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n\n    _getConfig(config) {\n      config = { ...Default$5,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$6, config, DefaultType$5);\n      return config;\n    }\n\n    _showElement(relatedTarget) {\n      const isAnimated = this._isAnimated();\n\n      const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.append(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      this._element.setAttribute('role', 'dialog');\n\n      this._element.scrollTop = 0;\n\n      if (modalBody) {\n        modalBody.scrollTop = 0;\n      }\n\n      if (isAnimated) {\n        reflow(this._element);\n      }\n\n      this._element.classList.add(CLASS_NAME_SHOW$4);\n\n      const transitionComplete = () => {\n        if (this._config.focus) {\n          this._focustrap.activate();\n        }\n\n        this._isTransitioning = false;\n        EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n          relatedTarget\n        });\n      };\n\n      this._queueCallback(transitionComplete, this._dialog, isAnimated);\n    }\n\n    _setEscapeEvent() {\n      if (this._isShown) {\n        EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n          if (this._config.keyboard && event.key === ESCAPE_KEY$1) {\n            event.preventDefault();\n            this.hide();\n          } else if (!this._config.keyboard && event.key === ESCAPE_KEY$1) {\n            this._triggerBackdropTransition();\n          }\n        });\n      } else {\n        EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1);\n      }\n    }\n\n    _setResizeEvent() {\n      if (this._isShown) {\n        EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog());\n      } else {\n        EventHandler.off(window, EVENT_RESIZE);\n      }\n    }\n\n    _hideModal() {\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._element.removeAttribute('role');\n\n      this._isTransitioning = false;\n\n      this._backdrop.hide(() => {\n        document.body.classList.remove(CLASS_NAME_OPEN);\n\n        this._resetAdjustments();\n\n        this._scrollBar.reset();\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n      });\n    }\n\n    _showBackdrop(callback) {\n      EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n        if (this._ignoreBackdropClick) {\n          this._ignoreBackdropClick = false;\n          return;\n        }\n\n        if (event.target !== event.currentTarget) {\n          return;\n        }\n\n        if (this._config.backdrop === true) {\n          this.hide();\n        } else if (this._config.backdrop === 'static') {\n          this._triggerBackdropTransition();\n        }\n      });\n\n      this._backdrop.show(callback);\n    }\n\n    _isAnimated() {\n      return this._element.classList.contains(CLASS_NAME_FADE$3);\n    }\n\n    _triggerBackdropTransition() {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      const {\n        classList,\n        scrollHeight,\n        style\n      } = this._element;\n      const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed\n\n      if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {\n        return;\n      }\n\n      if (!isModalOverflowing) {\n        style.overflowY = 'hidden';\n      }\n\n      classList.add(CLASS_NAME_STATIC);\n\n      this._queueCallback(() => {\n        classList.remove(CLASS_NAME_STATIC);\n\n        if (!isModalOverflowing) {\n          this._queueCallback(() => {\n            style.overflowY = '';\n          }, this._dialog);\n        }\n      }, this._dialog);\n\n      this._element.focus();\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // ----------------------------------------------------------------------\n\n\n    _adjustDialog() {\n      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      const scrollbarWidth = this._scrollBar.getWidth();\n\n      const isBodyOverflowing = scrollbarWidth > 0;\n\n      if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {\n        this._element.style.paddingLeft = `${scrollbarWidth}px`;\n      }\n\n      if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {\n        this._element.style.paddingRight = `${scrollbarWidth}px`;\n      }\n    }\n\n    _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    } // Static\n\n\n    static jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        const data = Modal.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](relatedTarget);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n    const target = getElementFromSelector(this);\n\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    EventHandler.one(target, EVENT_SHOW$3, showEvent => {\n      if (showEvent.defaultPrevented) {\n        // only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      EventHandler.one(target, EVENT_HIDDEN$3, () => {\n        if (isVisible(this)) {\n          this.focus();\n        }\n      });\n    }); // avoid conflict when clicking moddal toggler while another one is open\n\n    const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);\n\n    if (allReadyOpen) {\n      Modal.getInstance(allReadyOpen).hide();\n    }\n\n    const data = Modal.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  enableDismissTrigger(Modal);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Modal to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Modal);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): offcanvas.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$5 = 'offcanvas';\n  const DATA_KEY$5 = 'bs.offcanvas';\n  const EVENT_KEY$5 = `.${DATA_KEY$5}`;\n  const DATA_API_KEY$2 = '.data-api';\n  const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$5}${DATA_API_KEY$2}`;\n  const ESCAPE_KEY = 'Escape';\n  const Default$4 = {\n    backdrop: true,\n    keyboard: true,\n    scroll: false\n  };\n  const DefaultType$4 = {\n    backdrop: 'boolean',\n    keyboard: 'boolean',\n    scroll: 'boolean'\n  };\n  const CLASS_NAME_SHOW$3 = 'show';\n  const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\n  const OPEN_SELECTOR = '.offcanvas.show';\n  const EVENT_SHOW$2 = `show${EVENT_KEY$5}`;\n  const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;\n  const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;\n  const EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`;\n  const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;\n  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;\n  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Offcanvas extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._isShown = false;\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    static get NAME() {\n      return NAME$5;\n    }\n\n    static get Default() {\n      return Default$4;\n    } // Public\n\n\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n\n    show(relatedTarget) {\n      if (this._isShown) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$2, {\n        relatedTarget\n      });\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = true;\n      this._element.style.visibility = 'visible';\n\n      this._backdrop.show();\n\n      if (!this._config.scroll) {\n        new ScrollBarHelper().hide();\n      }\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      this._element.setAttribute('role', 'dialog');\n\n      this._element.classList.add(CLASS_NAME_SHOW$3);\n\n      const completeCallBack = () => {\n        if (!this._config.scroll) {\n          this._focustrap.activate();\n        }\n\n        EventHandler.trigger(this._element, EVENT_SHOWN$2, {\n          relatedTarget\n        });\n      };\n\n      this._queueCallback(completeCallBack, this._element, true);\n    }\n\n    hide() {\n      if (!this._isShown) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$2);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._focustrap.deactivate();\n\n      this._element.blur();\n\n      this._isShown = false;\n\n      this._element.classList.remove(CLASS_NAME_SHOW$3);\n\n      this._backdrop.hide();\n\n      const completeCallback = () => {\n        this._element.setAttribute('aria-hidden', true);\n\n        this._element.removeAttribute('aria-modal');\n\n        this._element.removeAttribute('role');\n\n        this._element.style.visibility = 'hidden';\n\n        if (!this._config.scroll) {\n          new ScrollBarHelper().reset();\n        }\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$2);\n      };\n\n      this._queueCallback(completeCallback, this._element, true);\n    }\n\n    dispose() {\n      this._backdrop.dispose();\n\n      this._focustrap.deactivate();\n\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$4,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$5, config, DefaultType$4);\n      return config;\n    }\n\n    _initializeBackDrop() {\n      return new Backdrop({\n        className: CLASS_NAME_BACKDROP,\n        isVisible: this._config.backdrop,\n        isAnimated: true,\n        rootElement: this._element.parentNode,\n        clickCallback: () => this.hide()\n      });\n    }\n\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n\n    _addEventListeners() {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n        if (this._config.keyboard && event.key === ESCAPE_KEY) {\n          this.hide();\n        }\n      });\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Offcanvas.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](this);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n    const target = getElementFromSelector(this);\n\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    if (isDisabled(this)) {\n      return;\n    }\n\n    EventHandler.one(target, EVENT_HIDDEN$2, () => {\n      // focus on trigger when it is closed\n      if (isVisible(this)) {\n        this.focus();\n      }\n    }); // avoid conflict when clicking a toggler of an offcanvas, while another is open\n\n    const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n\n    if (allReadyOpen && allReadyOpen !== target) {\n      Offcanvas.getInstance(allReadyOpen).hide();\n    }\n\n    const data = Offcanvas.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));\n  enableDismissTrigger(Offcanvas);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  defineJQueryPlugin(Offcanvas);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): util/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const uriAttributes = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  /**\n   * A pattern that recognizes a commonly useful subset of URLs that are safe.\n   *\n   * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  const DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i;\n\n  const allowedAttribute = (attribute, allowedAttributeList) => {\n    const attributeName = attribute.nodeName.toLowerCase();\n\n    if (allowedAttributeList.includes(attributeName)) {\n      if (uriAttributes.has(attributeName)) {\n        return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));\n      }\n\n      return true;\n    }\n\n    const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp); // Check if a regular expression validates the attribute.\n\n    for (let i = 0, len = regExp.length; i < len; i++) {\n      if (regExp[i].test(attributeName)) {\n        return true;\n      }\n    }\n\n    return false;\n  };\n\n  const DefaultAllowlist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n  };\n  function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n    if (!unsafeHtml.length) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    const domParser = new window.DOMParser();\n    const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n\n    for (let i = 0, len = elements.length; i < len; i++) {\n      const element = elements[i];\n      const elementName = element.nodeName.toLowerCase();\n\n      if (!Object.keys(allowList).includes(elementName)) {\n        element.remove();\n        continue;\n      }\n\n      const attributeList = [].concat(...element.attributes);\n      const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []);\n      attributeList.forEach(attribute => {\n        if (!allowedAttribute(attribute, allowedAttributes)) {\n          element.removeAttribute(attribute.nodeName);\n        }\n      });\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): tooltip.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$4 = 'tooltip';\n  const DATA_KEY$4 = 'bs.tooltip';\n  const EVENT_KEY$4 = `.${DATA_KEY$4}`;\n  const CLASS_PREFIX$1 = 'bs-tooltip';\n  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\n  const DefaultType$3 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(array|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacements: 'array',\n    boundary: '(string|element)',\n    customClass: '(string|function)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    allowList: 'object',\n    popperConfig: '(null|object|function)'\n  };\n  const AttachmentMap = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: isRTL() ? 'left' : 'right',\n    BOTTOM: 'bottom',\n    LEFT: isRTL() ? 'right' : 'left'\n  };\n  const Default$3 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"tooltip-arrow\"></div>' + '<div class=\"tooltip-inner\"></div>' + '</div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: [0, 0],\n    container: false,\n    fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n    boundary: 'clippingParents',\n    customClass: '',\n    sanitize: true,\n    sanitizeFn: null,\n    allowList: DefaultAllowlist,\n    popperConfig: null\n  };\n  const Event$2 = {\n    HIDE: `hide${EVENT_KEY$4}`,\n    HIDDEN: `hidden${EVENT_KEY$4}`,\n    SHOW: `show${EVENT_KEY$4}`,\n    SHOWN: `shown${EVENT_KEY$4}`,\n    INSERTED: `inserted${EVENT_KEY$4}`,\n    CLICK: `click${EVENT_KEY$4}`,\n    FOCUSIN: `focusin${EVENT_KEY$4}`,\n    FOCUSOUT: `focusout${EVENT_KEY$4}`,\n    MOUSEENTER: `mouseenter${EVENT_KEY$4}`,\n    MOUSELEAVE: `mouseleave${EVENT_KEY$4}`\n  };\n  const CLASS_NAME_FADE$2 = 'fade';\n  const CLASS_NAME_MODAL = 'modal';\n  const CLASS_NAME_SHOW$2 = 'show';\n  const HOVER_STATE_SHOW = 'show';\n  const HOVER_STATE_OUT = 'out';\n  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\n  const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\n  const EVENT_MODAL_HIDE = 'hide.bs.modal';\n  const TRIGGER_HOVER = 'hover';\n  const TRIGGER_FOCUS = 'focus';\n  const TRIGGER_CLICK = 'click';\n  const TRIGGER_MANUAL = 'manual';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Tooltip extends BaseComponent {\n    constructor(element, config) {\n      if (typeof Popper__namespace === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n      }\n\n      super(element); // private\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this._config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    static get Default() {\n      return Default$3;\n    }\n\n    static get NAME() {\n      return NAME$4;\n    }\n\n    static get Event() {\n      return Event$2;\n    }\n\n    static get DefaultType() {\n      return DefaultType$3;\n    } // Public\n\n\n    enable() {\n      this._isEnabled = true;\n    }\n\n    disable() {\n      this._isEnabled = false;\n    }\n\n    toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    }\n\n    toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        const context = this._initializeOnDelegatedTarget(event);\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    }\n\n    dispose() {\n      clearTimeout(this._timeout);\n      EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n      if (this.tip) {\n        this.tip.remove();\n      }\n\n      this._disposePopper();\n\n      super.dispose();\n    }\n\n    show() {\n      if (this._element.style.display === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      if (!(this.isWithContent() && this._isEnabled)) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW);\n      const shadowRoot = findShadowRoot(this._element);\n      const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);\n\n      if (showEvent.defaultPrevented || !isInTheDom) {\n        return;\n      } // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title`\n      // This will be removed later in favor of a `setContent` method\n\n\n      if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) {\n        this._disposePopper();\n\n        this.tip.remove();\n        this.tip = null;\n      }\n\n      const tip = this.getTipElement();\n      const tipId = getUID(this.constructor.NAME);\n      tip.setAttribute('id', tipId);\n\n      this._element.setAttribute('aria-describedby', tipId);\n\n      if (this._config.animation) {\n        tip.classList.add(CLASS_NAME_FADE$2);\n      }\n\n      const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;\n\n      const attachment = this._getAttachment(placement);\n\n      this._addAttachmentClass(attachment);\n\n      const {\n        container\n      } = this._config;\n      Data.set(tip, this.constructor.DATA_KEY, this);\n\n      if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n        container.append(tip);\n        EventHandler.trigger(this._element, this.constructor.Event.INSERTED);\n      }\n\n      if (this._popper) {\n        this._popper.update();\n      } else {\n        this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));\n      }\n\n      tip.classList.add(CLASS_NAME_SHOW$2);\n\n      const customClass = this._resolvePossibleFunction(this._config.customClass);\n\n      if (customClass) {\n        tip.classList.add(...customClass.split(' '));\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(element => {\n          EventHandler.on(element, 'mouseover', noop);\n        });\n      }\n\n      const complete = () => {\n        const prevHoverState = this._hoverState;\n        this._hoverState = null;\n        EventHandler.trigger(this._element, this.constructor.Event.SHOWN);\n\n        if (prevHoverState === HOVER_STATE_OUT) {\n          this._leave(null, this);\n        }\n      };\n\n      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);\n\n      this._queueCallback(complete, this.tip, isAnimated);\n    }\n\n    hide() {\n      if (!this._popper) {\n        return;\n      }\n\n      const tip = this.getTipElement();\n\n      const complete = () => {\n        if (this._isWithActiveTrigger()) {\n          return;\n        }\n\n        if (this._hoverState !== HOVER_STATE_SHOW) {\n          tip.remove();\n        }\n\n        this._cleanTipClass();\n\n        this._element.removeAttribute('aria-describedby');\n\n        EventHandler.trigger(this._element, this.constructor.Event.HIDDEN);\n\n        this._disposePopper();\n      };\n\n      const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(element => EventHandler.off(element, 'mouseover', noop));\n      }\n\n      this._activeTrigger[TRIGGER_CLICK] = false;\n      this._activeTrigger[TRIGGER_FOCUS] = false;\n      this._activeTrigger[TRIGGER_HOVER] = false;\n      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);\n\n      this._queueCallback(complete, this.tip, isAnimated);\n\n      this._hoverState = '';\n    }\n\n    update() {\n      if (this._popper !== null) {\n        this._popper.update();\n      }\n    } // Protected\n\n\n    isWithContent() {\n      return Boolean(this.getTitle());\n    }\n\n    getTipElement() {\n      if (this.tip) {\n        return this.tip;\n      }\n\n      const element = document.createElement('div');\n      element.innerHTML = this._config.template;\n      const tip = element.children[0];\n      this.setContent(tip);\n      tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n      this.tip = tip;\n      return this.tip;\n    }\n\n    setContent(tip) {\n      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);\n    }\n\n    _sanitizeAndSetContent(template, content, selector) {\n      const templateElement = SelectorEngine.findOne(selector, template);\n\n      if (!content && templateElement) {\n        templateElement.remove();\n        return;\n      } // we use append for html objects to maintain js events\n\n\n      this.setElementContent(templateElement, content);\n    }\n\n    setElementContent(element, content) {\n      if (element === null) {\n        return;\n      }\n\n      if (isElement(content)) {\n        content = getElement(content); // content is a DOM node or a jQuery\n\n        if (this._config.html) {\n          if (content.parentNode !== element) {\n            element.innerHTML = '';\n            element.append(content);\n          }\n        } else {\n          element.textContent = content.textContent;\n        }\n\n        return;\n      }\n\n      if (this._config.html) {\n        if (this._config.sanitize) {\n          content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn);\n        }\n\n        element.innerHTML = content;\n      } else {\n        element.textContent = content;\n      }\n    }\n\n    getTitle() {\n      const title = this._element.getAttribute('data-bs-original-title') || this._config.title;\n\n      return this._resolvePossibleFunction(title);\n    }\n\n    updateAttachment(attachment) {\n      if (attachment === 'right') {\n        return 'end';\n      }\n\n      if (attachment === 'left') {\n        return 'start';\n      }\n\n      return attachment;\n    } // Private\n\n\n    _initializeOnDelegatedTarget(event, context) {\n      return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n    }\n\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n\n      if (typeof offset === 'string') {\n        return offset.split(',').map(val => Number.parseInt(val, 10));\n      }\n\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n\n      return offset;\n    }\n\n    _resolvePossibleFunction(content) {\n      return typeof content === 'function' ? content.call(this._element) : content;\n    }\n\n    _getPopperConfig(attachment) {\n      const defaultBsPopperConfig = {\n        placement: attachment,\n        modifiers: [{\n          name: 'flip',\n          options: {\n            fallbackPlacements: this._config.fallbackPlacements\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }, {\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'arrow',\n          options: {\n            element: `.${this.constructor.NAME}-arrow`\n          }\n        }, {\n          name: 'onChange',\n          enabled: true,\n          phase: 'afterWrite',\n          fn: data => this._handlePopperPlacementChange(data)\n        }],\n        onFirstUpdate: data => {\n          if (data.options.placement !== data.placement) {\n            this._handlePopperPlacementChange(data);\n          }\n        }\n      };\n      return { ...defaultBsPopperConfig,\n        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n      };\n    }\n\n    _addAttachmentClass(attachment) {\n      this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);\n    }\n\n    _getAttachment(placement) {\n      return AttachmentMap[placement.toUpperCase()];\n    }\n\n    _setListeners() {\n      const triggers = this._config.trigger.split(' ');\n\n      triggers.forEach(trigger => {\n        if (trigger === 'click') {\n          EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event));\n        } else if (trigger !== TRIGGER_MANUAL) {\n          const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;\n          const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;\n          EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event));\n          EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event));\n        }\n      });\n\n      this._hideModalHandler = () => {\n        if (this._element) {\n          this.hide();\n        }\n      };\n\n      EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n      if (this._config.selector) {\n        this._config = { ...this._config,\n          trigger: 'manual',\n          selector: ''\n        };\n      } else {\n        this._fixTitle();\n      }\n    }\n\n    _fixTitle() {\n      const title = this._element.getAttribute('title');\n\n      const originalTitleType = typeof this._element.getAttribute('data-bs-original-title');\n\n      if (title || originalTitleType !== 'string') {\n        this._element.setAttribute('data-bs-original-title', title || '');\n\n        if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n          this._element.setAttribute('aria-label', title);\n        }\n\n        this._element.setAttribute('title', '');\n      }\n    }\n\n    _enter(event, context) {\n      context = this._initializeOnDelegatedTarget(event, context);\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n      }\n\n      if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) {\n        context._hoverState = HOVER_STATE_SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HOVER_STATE_SHOW;\n\n      if (!context._config.delay || !context._config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(() => {\n        if (context._hoverState === HOVER_STATE_SHOW) {\n          context.show();\n        }\n      }, context._config.delay.show);\n    }\n\n    _leave(event, context) {\n      context = this._initializeOnDelegatedTarget(event, context);\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HOVER_STATE_OUT;\n\n      if (!context._config.delay || !context._config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(() => {\n        if (context._hoverState === HOVER_STATE_OUT) {\n          context.hide();\n        }\n      }, context._config.delay.hide);\n    }\n\n    _isWithActiveTrigger() {\n      for (const trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    _getConfig(config) {\n      const dataAttributes = Manipulator.getDataAttributes(this._element);\n      Object.keys(dataAttributes).forEach(dataAttr => {\n        if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = { ...this.constructor.Default,\n        ...dataAttributes,\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config.container = config.container === false ? document.body : getElement(config.container);\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn);\n      }\n\n      return config;\n    }\n\n    _getDelegateConfig() {\n      const config = {};\n\n      for (const key in this._config) {\n        if (this.constructor.Default[key] !== this._config[key]) {\n          config[key] = this._config[key];\n        }\n      } // In the future can be replaced with:\n      // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n      // `Object.fromEntries(keysWithDifferentValues)`\n\n\n      return config;\n    }\n\n    _cleanTipClass() {\n      const tip = this.getTipElement();\n      const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g');\n      const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));\n      }\n    }\n\n    _getBasicClassPrefix() {\n      return CLASS_PREFIX$1;\n    }\n\n    _handlePopperPlacementChange(popperData) {\n      const {\n        state\n      } = popperData;\n\n      if (!state) {\n        return;\n      }\n\n      this.tip = state.elements.popper;\n\n      this._cleanTipClass();\n\n      this._addAttachmentClass(this._getAttachment(state.placement));\n    }\n\n    _disposePopper() {\n      if (this._popper) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tooltip.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Tooltip to jQuery only if jQuery is present\n   */\n\n\n  defineJQueryPlugin(Tooltip);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): popover.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$3 = 'popover';\n  const DATA_KEY$3 = 'bs.popover';\n  const EVENT_KEY$3 = `.${DATA_KEY$3}`;\n  const CLASS_PREFIX = 'bs-popover';\n  const Default$2 = { ...Tooltip.Default,\n    placement: 'right',\n    offset: [0, 8],\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"popover-arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div>' + '</div>'\n  };\n  const DefaultType$2 = { ...Tooltip.DefaultType,\n    content: '(string|element|function)'\n  };\n  const Event$1 = {\n    HIDE: `hide${EVENT_KEY$3}`,\n    HIDDEN: `hidden${EVENT_KEY$3}`,\n    SHOW: `show${EVENT_KEY$3}`,\n    SHOWN: `shown${EVENT_KEY$3}`,\n    INSERTED: `inserted${EVENT_KEY$3}`,\n    CLICK: `click${EVENT_KEY$3}`,\n    FOCUSIN: `focusin${EVENT_KEY$3}`,\n    FOCUSOUT: `focusout${EVENT_KEY$3}`,\n    MOUSEENTER: `mouseenter${EVENT_KEY$3}`,\n    MOUSELEAVE: `mouseleave${EVENT_KEY$3}`\n  };\n  const SELECTOR_TITLE = '.popover-header';\n  const SELECTOR_CONTENT = '.popover-body';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Popover extends Tooltip {\n    // Getters\n    static get Default() {\n      return Default$2;\n    }\n\n    static get NAME() {\n      return NAME$3;\n    }\n\n    static get Event() {\n      return Event$1;\n    }\n\n    static get DefaultType() {\n      return DefaultType$2;\n    } // Overrides\n\n\n    isWithContent() {\n      return this.getTitle() || this._getContent();\n    }\n\n    setContent(tip) {\n      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);\n\n      this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);\n    } // Private\n\n\n    _getContent() {\n      return this._resolvePossibleFunction(this._config.content);\n    }\n\n    _getBasicClassPrefix() {\n      return CLASS_PREFIX;\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Popover.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Popover to jQuery only if jQuery is present\n   */\n\n\n  defineJQueryPlugin(Popover);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): scrollspy.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$2 = 'scrollspy';\n  const DATA_KEY$2 = 'bs.scrollspy';\n  const EVENT_KEY$2 = `.${DATA_KEY$2}`;\n  const DATA_API_KEY$1 = '.data-api';\n  const Default$1 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  const DefaultType$1 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\n  const EVENT_SCROLL = `scroll${EVENT_KEY$2}`;\n  const EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}${DATA_API_KEY$1}`;\n  const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\n  const CLASS_NAME_ACTIVE$1 = 'active';\n  const SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\n  const SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';\n  const SELECTOR_NAV_LINKS = '.nav-link';\n  const SELECTOR_NAV_ITEMS = '.nav-item';\n  const SELECTOR_LIST_ITEMS = '.list-group-item';\n  const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;\n  const SELECTOR_DROPDOWN$1 = '.dropdown';\n  const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\n  const METHOD_OFFSET = 'offset';\n  const METHOD_POSITION = 'position';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class ScrollSpy extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;\n      this._config = this._getConfig(config);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process());\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    static get Default() {\n      return Default$1;\n    }\n\n    static get NAME() {\n      return NAME$2;\n    } // Public\n\n\n    refresh() {\n      const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;\n      const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target);\n      targets.map(element => {\n        const targetSelector = getSelectorFromElement(element);\n        const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;\n\n        if (target) {\n          const targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(item => item).sort((a, b) => a[0] - b[0]).forEach(item => {\n        this._offsets.push(item[0]);\n\n        this._targets.push(item[1]);\n      });\n    }\n\n    dispose() {\n      EventHandler.off(this._scrollElement, EVENT_KEY$2);\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$1,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config.target = getElement(config.target) || document.documentElement;\n      typeCheckConfig(NAME$2, config, DefaultType$1);\n      return config;\n    }\n\n    _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    }\n\n    _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    }\n\n    _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    }\n\n    _process() {\n      const scrollTop = this._getScrollTop() + this._config.offset;\n\n      const scrollHeight = this._getScrollHeight();\n\n      const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        const target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      for (let i = this._offsets.length; i--;) {\n        const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    }\n\n    _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`);\n      const link = SelectorEngine.findOne(queries.join(','), this._config.target);\n      link.classList.add(CLASS_NAME_ACTIVE$1);\n\n      if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n        SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1);\n      } else {\n        SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach(listGroup => {\n          // Set triggered links parents as active\n          // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n          SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1)); // Handle special case when .nav-link is inside .nav-item\n\n          SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS).forEach(navItem => {\n            SelectorEngine.children(navItem, SELECTOR_NAV_LINKS).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1));\n          });\n        });\n      }\n\n      EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n        relatedTarget: target\n      });\n    }\n\n    _clear() {\n      SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE$1)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE$1));\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = ScrollSpy.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n    SelectorEngine.find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .ScrollSpy to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(ScrollSpy);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): tab.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$1 = 'tab';\n  const DATA_KEY$1 = 'bs.tab';\n  const EVENT_KEY$1 = `.${DATA_KEY$1}`;\n  const DATA_API_KEY = '.data-api';\n  const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;\n  const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;\n  const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;\n  const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}${DATA_API_KEY}`;\n  const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';\n  const CLASS_NAME_ACTIVE = 'active';\n  const CLASS_NAME_FADE$1 = 'fade';\n  const CLASS_NAME_SHOW$1 = 'show';\n  const SELECTOR_DROPDOWN = '.dropdown';\n  const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\n  const SELECTOR_ACTIVE = '.active';\n  const SELECTOR_ACTIVE_UL = ':scope > li > .active';\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]';\n  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n  const SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Tab extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$1;\n    } // Public\n\n\n    show() {\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE)) {\n        return;\n      }\n\n      let previous;\n      const target = getElementFromSelector(this._element);\n\n      const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);\n\n      if (listElement) {\n        const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;\n        previous = SelectorEngine.find(itemSelector, listElement);\n        previous = previous[previous.length - 1];\n      }\n\n      const hideEvent = previous ? EventHandler.trigger(previous, EVENT_HIDE$1, {\n        relatedTarget: this._element\n      }) : null;\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$1, {\n        relatedTarget: previous\n      });\n\n      if (showEvent.defaultPrevented || hideEvent !== null && hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._activate(this._element, listElement);\n\n      const complete = () => {\n        EventHandler.trigger(previous, EVENT_HIDDEN$1, {\n          relatedTarget: this._element\n        });\n        EventHandler.trigger(this._element, EVENT_SHOWN$1, {\n          relatedTarget: previous\n        });\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    } // Private\n\n\n    _activate(element, container, callback) {\n      const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine.find(SELECTOR_ACTIVE_UL, container) : SelectorEngine.children(container, SELECTOR_ACTIVE);\n      const active = activeElements[0];\n      const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE$1);\n\n      const complete = () => this._transitionComplete(element, active, callback);\n\n      if (active && isTransitioning) {\n        active.classList.remove(CLASS_NAME_SHOW$1);\n\n        this._queueCallback(complete, element, true);\n      } else {\n        complete();\n      }\n    }\n\n    _transitionComplete(element, active, callback) {\n      if (active) {\n        active.classList.remove(CLASS_NAME_ACTIVE);\n        const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);\n\n        if (dropdownChild) {\n          dropdownChild.classList.remove(CLASS_NAME_ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      element.classList.add(CLASS_NAME_ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      reflow(element);\n\n      if (element.classList.contains(CLASS_NAME_FADE$1)) {\n        element.classList.add(CLASS_NAME_SHOW$1);\n      }\n\n      let parent = element.parentNode;\n\n      if (parent && parent.nodeName === 'LI') {\n        parent = parent.parentNode;\n      }\n\n      if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {\n        const dropdownElement = element.closest(SELECTOR_DROPDOWN);\n\n        if (dropdownElement) {\n          SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tab.getOrCreateInstance(this);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    if (isDisabled(this)) {\n      return;\n    }\n\n    const data = Tab.getOrCreateInstance(this);\n    data.show();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Tab to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Tab);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): toast.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME = 'toast';\n  const DATA_KEY = 'bs.toast';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;\n  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;\n  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;\n  const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility\n\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_NAME_SHOWING = 'showing';\n  const DefaultType = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  const Default = {\n    animation: true,\n    autohide: true,\n    delay: 5000\n  };\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Toast extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._timeout = null;\n      this._hasMouseInteraction = false;\n      this._hasKeyboardInteraction = false;\n\n      this._setListeners();\n    } // Getters\n\n\n    static get DefaultType() {\n      return DefaultType;\n    }\n\n    static get Default() {\n      return Default;\n    }\n\n    static get NAME() {\n      return NAME;\n    } // Public\n\n\n    show() {\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._clearTimeout();\n\n      if (this._config.animation) {\n        this._element.classList.add(CLASS_NAME_FADE);\n      }\n\n      const complete = () => {\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n\n        EventHandler.trigger(this._element, EVENT_SHOWN);\n\n        this._maybeScheduleHide();\n      };\n\n      this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated\n\n\n      reflow(this._element);\n\n      this._element.classList.add(CLASS_NAME_SHOW);\n\n      this._element.classList.add(CLASS_NAME_SHOWING);\n\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n\n    hide() {\n      if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      const complete = () => {\n        this._element.classList.add(CLASS_NAME_HIDE); // @deprecated\n\n\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n\n        this._element.classList.remove(CLASS_NAME_SHOW);\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN);\n      };\n\n      this._element.classList.add(CLASS_NAME_SHOWING);\n\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n\n    dispose() {\n      this._clearTimeout();\n\n      if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n        this._element.classList.remove(CLASS_NAME_SHOW);\n      }\n\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      typeCheckConfig(NAME, config, this.constructor.DefaultType);\n      return config;\n    }\n\n    _maybeScheduleHide() {\n      if (!this._config.autohide) {\n        return;\n      }\n\n      if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n        return;\n      }\n\n      this._timeout = setTimeout(() => {\n        this.hide();\n      }, this._config.delay);\n    }\n\n    _onInteraction(event, isInteracting) {\n      switch (event.type) {\n        case 'mouseover':\n        case 'mouseout':\n          this._hasMouseInteraction = isInteracting;\n          break;\n\n        case 'focusin':\n        case 'focusout':\n          this._hasKeyboardInteraction = isInteracting;\n          break;\n      }\n\n      if (isInteracting) {\n        this._clearTimeout();\n\n        return;\n      }\n\n      const nextElement = event.relatedTarget;\n\n      if (this._element === nextElement || this._element.contains(nextElement)) {\n        return;\n      }\n\n      this._maybeScheduleHide();\n    }\n\n    _setListeners() {\n      EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));\n      EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));\n    }\n\n    _clearTimeout() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Toast.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config](this);\n        }\n      });\n    }\n\n  }\n\n  enableDismissTrigger(Toast);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Toast to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Toast);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.3): index.umd.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const index_umd = {\n    Alert,\n    Button,\n    Carousel,\n    Collapse,\n    Dropdown,\n    Modal,\n    Offcanvas,\n    Popover,\n    ScrollSpy,\n    Tab,\n    Toast,\n    Tooltip\n  };\n\n  return index_umd;\n\n}));\n//# sourceMappingURL=bootstrap.js.map\n"
  },
  {
    "path": "www/old/explorer/public/js/theme_switcher.js",
    "content": "var lightTheme = document.getElementsByTagName('link')[0];\r\nvar darkTheme = document.getElementsByTagName('link')[1];\r\n\r\n\r\nfunction setThemeDark(){\r\n\tlightTheme.disabled = true;\r\n\tdarkTheme.disabled = false;\r\n\twindow.localStorage.setItem('selected_theme', 'dark');\r\n}\r\n\r\nfunction setThemeLight(){\r\n\tlightTheme.disabled = false;\r\n\tdarkTheme.disabled = true;\r\n\twindow.localStorage.setItem('selected_theme', 'light');\r\n}\r\n\r\n\r\nfunction chooseInitalTheme(){\r\n\tlet selected_theme = window.localStorage.getItem('selected_theme');\r\n\tconsole.log(selected_theme);\r\n\r\n\tif (selected_theme == 'dark'){\r\n\t\tsetThemeDark();\r\n\t} else if (selected_theme == 'light'){\r\n\t\tsetThemeLight();\r\n\t} else {\r\n\t\tconst darkThemeMq = window.matchMedia(\"(prefers-color-scheme: dark)\");\r\n\t\tif (darkThemeMq.matches) {\r\n\t\t\tsetThemeDark();\r\n\t\t} else {\r\n\t\t\tsetThemeLight();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n\r\nchooseInitalTheme();\r\n"
  },
  {
    "path": "www/old/explorer/views/address.ejs",
    "content": "\n<h4>Address | <span class=\"font-monospace\"><%= address %></span></h4>\n\n<table class=\"table table-nonfluid\">\n<thead>\n<tr>\n<th>Balance</th>\n<th>Token</th>\n<th>Contract</th>\n</tr>\n</thead>\n<tbody class=\"font-monospace\">\n\n<% balances.forEach(function(entry) { %>\n<tr>\n<td><b><%= entry.value %></b></td>\n<td><%= entry.symbol %></td>\n<td>\n<% if(!entry.is_native) { %>\n<a href=\"/address?addr=<%= entry.contract %>\"><%= entry.contract %></a>\n<% } %>\n</td>\n</tr>\n<% }); %>\n\n<% nfts.forEach(function(entry) { %>\n<tr>\n<td>N/A</td>\n<td>NFT</td>\n<td><a href=\"/address?addr=<%= entry.contract %>\"><%= entry.contract %></a></td>\n</tr>\n<% }); %>\n</tbody>\n</table>\n\n<% if(contract) { %>\n<blockquote class=\"blockquote\">\n<pre>\n<%= JSON.stringify(contract, null, 4) %>\n</pre>\n</blockquote>\n<% } %>\n\n<table class=\"table table-nonfluid\">\n<thead>\n<tr>\n<th>Height</th>\n<th>Type</th>\n<th>Amount</th>\n<th>Token</th>\n<th>Address</th>\n<th></th>\n</tr>\n</thead>\n\n<tbody class=\"font-monospace\">\n<% history.forEach(function(entry) { %>\n<tr>\n<td><%= entry.height %></td>\n<td><%= entry.type %></td>\n<td><b><%= entry.value %></b></td>\n<td>\n<% if(entry.symbol != \"MMX\") { %>\n<a href=\"/address?addr=<%= entry.contract %>\"><%= entry.symbol %></a>\n<% } else { %>\nMMX\n<% } %>\n</td>\n<td><a href=\"address?addr=<%= entry.address %>\"><%= entry.address %></a></td>\n<td><a href=\"transaction?id=<%= entry.txid %>\">TX</a></td>\n</tr>\n<% }); %>\n</tbody>\n</table>\n"
  },
  {
    "path": "www/old/explorer/views/block.ejs",
    "content": "\n<h4>Block | <span class=\"font-monospace\"><%= block.height %></span></h4>\n\n<table class=\"table table-nonfluid mb-5\">\n<tbody class=\"font-monospace\">\n<tr>\n<td><b>Hash</b></td>\n<td><%= block.hash %></td>\n</tr>\n<tr>\n<td><b>Previous</b></td>\n<td><a href=\"block?hash=<%= block.prev %>\"><%= block.prev %></a></td>\n</tr>\n<tr>\n<td><b>Height</b></td>\n<td><%= block.height %></td>\n</tr>\n<tr>\n<td><b>Next</b></td>\n<td><a href=\"block?height=<%= block.height+1 %>\"><%= block.height+1 %></a></td>\n</tr>\n<tr>\n<td><b>K Size</b></td>\n<td><%= block.ksize %></td>\n</tr>\n<tr>\n<td><b>Proof Score</b></td>\n<td><%= block.score %></td>\n</tr>\n\n<% block.rewards.forEach(function(entry, index) { %>\n<tr>\n<td><b>Reward[<%= index %>]</b></td>\n<td><%= entry.value %> | <a href=\"address?addr=<%= entry.address %>\"><%= entry.address %></a></td>\n</tr>\n<% }); %>\n\n<tr>\n<td><b>Farmer Key</b></td>\n<td><%= block.farmer_key %></td>\n</tr>\n</tbody>\n</table>\n\n<table class=\"table table-nonfluid\">\n<tbody class=\"font-monospace\">\n<% block.tx_list.forEach(function(tx, index) { %>\n<tr>\n<td><b>TX[<%= index %>]</b></td>\n<td><a href=\"transaction?id=<%= tx.id %>\"><%= tx.id %></a></td>\n</tr>\n<% }); %>\n</tbody>\n</table>\n\n"
  },
  {
    "path": "www/old/explorer/views/index.ejs",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<title>MMX - Explorer</title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"css/bootstrap_flatly.min.css\" title=\"light\">\n<link rel=\"stylesheet\" type=\"text/css\" href=\"css/bootstrap_darkly.min.css\" title=\"dark\" disabled=\"\">\n<script src=\"js/theme_switcher.js\"></script>\n<style>\n\tbody {\n\t\tpadding-top: 100px;\n\t}\n\ta.title {\n\t\tfont-size: 120%;\n\t\tword-wrap: break-word;\n\t}\n\tspan.url {\n\t\tcolor: rgb(0,100,0);\n\t\tword-wrap: break-word;\n\t}\n\tspan.right {\n\t\tfloat: right\n\t}\n\t.center {\n\t\tdisplay: block;\n\t\tmargin-left: auto;\n\t\tmargin-right: auto;\n\t}\n\ta.bare {\n\t\ttext-decoration: none;\n\t}\n\tth.data, td.data {\n\t\tpadding-left: 5px;\n\t\tpadding-right: 5px;\n\t}\n\ttable.data, th.data, td.data {\n\t\tborder: 1px solid gray;\n\t}\n\n\t.table-nonfluid {\n\t\twidth: auto !important;\n\t}\n</style>\n</head>\n<body>\n\n\n<nav class=\"navbar navbar-expand-lg fixed-top navbar-dark bg-dark\">\n\t<div class=\"container\">\n\t\t<a class=\"navbar-brand\" href=\"/recent\">Blocks</a>\n\t\t<a class=\"navbar-brand\" href=\"/transactions\">Transactions</a>\n\n\t\t<button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\"#navbarSupportedContent\" aria-controls=\"navbarSupportedContent\" aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n\t      <span class=\"navbar-toggler-icon\"></span>\n\t    </button>\n\n\t\t<div class=\"collapse navbar-collapse\" id=\"navbarSupportedContent\">\n\t\t\t<ul class=\"navbar-nav me-auto mb-2 mb-lg-0\">\n\t\t\t\t<li class=\"nav-item dropdown\">\n\t\t\t\t\t<a class=\"nav-link dropdown-toggle\" href=\"#\" id=\"themeDropdown\" role=\"button\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n\t\t\t\t\t\tTheme\n\t\t\t\t\t</a>\n\t\t\t\t\t<ul class=\"dropdown-menu\" aria-labelledby=\"themeDropdown\">\n\t\t\t\t\t\t<li><button class=\"dropdown-item\" onclick=\"setThemeLight()\">Light</button></li>\n\t\t\t\t\t\t<li><button class=\"dropdown-item\" onclick=\"setThemeDark()\">Dark</button></li>\n\t\t\t\t\t</ul>\n\t\t\t\t</li>\n\t\t\t</ul>\n\n\t\t\t<!--\n\t\t\t<form class=\"d-flex\" method=\"GET\" action=\"/search\">\n\t\t\t\t<div class=\"input-group\">\n\t\t\t\t\t<input class=\"form-control search-input\" onfocus=this.value='' type=\"text\" size=\"60\" id=\"value\" name=\"term\" placeholder=\"Addr, TX, Block Hash, Height\">\n\t\t\t\t\t<span class=\"input-group-btn\">\n\t\t\t\t\t\t<button class=\"btn btn-primary\" type=\"submit\" title=\"Search\">\n\t\t\t\t\t\t\tSearch\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t\t-->\n\n\t\t</div>\n\t</div>\n</nav>\n\n<div class=\"container\">\n\n<div class=\"row\">\n<div class=\"col\" style=\"max-width: 680px;\">\n\n<form method=\"GET\" action=\"/address\">\n\t<div class=\"input-group mb-3\">\n\t\t<input class=\"form-control\" onfocus=this.value='' type=\"text\" size=\"60\" id=\"value\" name=\"addr\" placeholder=\"Address\">\n\t\t<span class=\"input-group-append\">\n\t\t\t<input type=\"submit\" value=\"Search\" class=\"btn btn-secondary\">\n\t\t</span>\n\t</div>\n</form>\n\n<form method=\"GET\" action=\"/transaction\">\n\t<div class=\"input-group mb-3\">\n\t\t<input class=\"form-control\" onfocus=this.value='' type=\"text\" size=\"60\" id=\"value\" name=\"id\" placeholder=\"Transaction\">\n\t\t<span class=\"input-group-append\">\n\t\t\t<input type=\"submit\" value=\"Search\" class=\"btn btn-secondary\">\n\t\t</span>\n\t</div>\n</form>\n\n<form method=\"GET\" action=\"/block\">\n\t<div class=\"input-group mb-3\">\n\t\t<input class=\"form-control\" onfocus=this.value='' type=\"text\" size=\"60\" id=\"value\" name=\"hash\" placeholder=\"Block Hash\">\n\t\t<span class=\"input-group-append\">\n\t\t\t<input type=\"submit\" value=\"Search\" class=\"btn btn-secondary\">\n\t\t</span>\n\t</div>\n</form>\n\n<form method=\"GET\" action=\"/block\">\n\t<div class=\"input-group mb-3\">\n\t\t<input class=\"form-control\" onfocus=this.value='' type=\"text\" id=\"value\" name=\"height\" placeholder=\"Block Height\">\n\t\t<span class=\"input-group-append\">\n\t\t\t<input type=\"submit\" value=\"Search\" class=\"btn btn-secondary\">\n\t\t</span>\n\t</div>\n</form>\n\n\n</div>\n</div>\n\n<hr>\n\n<%- include(body) %>\n\n</div>\n<script src=\"js/bootstrap.bundle.min.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "www/old/explorer/views/recent.ejs",
    "content": "\n<table class=\"table table-hover\">\n<thead>\n<tr>\n<th>Height</th>\n<th>TX</th>\n<th>K</th>\n<th>Score</th>\n<th>Reward</th>\n<th>T&#x2010;Diff</th>\n<th>S&#x2010;Diff</th>\n<th>Hash</th>\n</tr>\n</thead>\n\n<tbody class=\"font-monospace\">\n<% blocks.forEach(function(block) { %>\n<tr>\n<td><a href=\"block?height=<%= block.height %>\"><%= block.height %></a></td>\n<td><%= block.tx_count %></td>\n<td><%= block.ksize %></td>\n<td class=\"text-end\"><%= block.score %></td>\n<td><%= block.reward %></td>\n<td class=\"text-end\"><%= block.time_diff %></td>\n<td class=\"text-end\"><%= block.space_diff %></td>\n<td><a href=\"block?hash=<%= block.hash %>\"><%= block.hash %></a></td>\n</tr>\n<% }); %>\n</tbody>\n</table>\n"
  },
  {
    "path": "www/old/explorer/views/recent_transactions.ejs",
    "content": "\n<table class=\"table table-hover\">\n<thead>\n<tr>\n<th>Height</th>\n<th>Fee</th>\n<th>N(In)</th>\n<th>N(Out)</th>\n<th>ID</th>\n</tr>\n</thead>\n\n<tbody class=\"font-monospace\">\n<% transactions.forEach(function(info) { %>\n<tr>\n<td><a href=\"block?hash=<%= info.block %>\"><%= info.height %></a></td>\n<td><%= info.fee.value %> MMX</td>\n<td><%= info.inputs.length %></td>\n<td><%= info.outputs.length %></td>\n<td><a href=\"transaction?id=<%= info.id %>\"><%= info.id %></a></td>\n</tr>\n<% }); %>\n</tbody>\n</table>\n"
  },
  {
    "path": "www/old/explorer/views/transaction.ejs",
    "content": "\n<h4>TX | <span class=\"font-monospace\"><%= tx.id %></span></h4>\n\n<table class=\"table table-nonfluid mt-3\">\n<tbody class=\"font-monospace\">\n<tr>\n<td><b>Block</b></td>\n<td>\n<% if(tx.height) { %>\n<a href=\"/block?hash=<%= tx.block %>\"><%= tx.height %></a>\n<% } else { %>\n<i>unconfirmed</i>\n<% } %>\n</td>\n</tr>\n<tr>\n<td><b>Fee</b></td>\n<td><%= tx.fee.value %></td>\n<td>MMX</td>\n</tr>\n</tbody>\n</table>\n\n<table class=\"table table-nonfluid\">\n<thead>\n<tr>\n<th></th>\n<th>Amount</th>\n<th>Token</th>\n<th>Address</th>\n<th></th>\n</tr>\n</thead>\n<tbody class=\"font-monospace\">\n\n<% tx.inputs.forEach(function(input, index) { %>\n<% if(input.utxo) { %>\n<tr>\n<td><b>Input[<%= index %>]</b></td>\n<td><%= input.value %></td>\n<td>\n<% if(input.contract) { %>\n<a href=\"/address?addr=<%= input.contract %>\"><%= input.symbol %></a>\n<% } else { %>\n<%= input.symbol %>\n<% } %>\n</td>\n<td><a href=\"address?addr=<%= input.address %>\"><%= input.address %></a></td>\n<td><a href=\"transaction?id=<%= input.prev.txid %>\">Prev</a></td>\n</tr>\n<% } %>\n<% }); %>\n\n<% tx.outputs.forEach(function(output, index) { %>\n<tr>\n<td><b>Output[<%= index %>]</b></td>\n<td><%= output.value %></td>\n<td>\n<% if(output.contract) { %>\n<a href=\"/address?addr=<%= output.contract %>\"><%= output.symbol %></a>\n<% } else { %>\n<%= output.symbol %>\n<% } %>\n</td>\n<td><a href=\"address?addr=<%= output.address %>\"><%= output.address %></a></td>\n</tr>\n<% }); %>\n</tbody>\n</table>\n\n\n"
  },
  {
    "path": "www/pool-server/README.md",
    "content": "# pool-server\n\n## MongoDB v8.0 Setup\n\n```\ncurl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \\\n   sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \\\n   --dearmor\necho \"deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.0 multiverse\" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list\nsudo apt-get update\nsudo apt-get install -y mongodb-org\n```\n\n### Config\n\n/etc/mongod.conf\n```\nnet:\n  port: 27017\n  bindIp: 0.0.0.0\nreplication:\n  replSetName: rs\n```\n\n`sudo systemctl restart mongod`\n\n### Firewall\n\n`sudo apt install ufw`\n\n```\n# ufw status\nStatus: active\n\nTo                         Action      From\n--                         ------      ----\n22/tcp                     ALLOW       Anywhere                  \nAnywhere                   ALLOW       69.197.174.72             \nAnywhere                   ALLOW       49.231.43.170             \nAnywhere                   ALLOW       110.164.184.5             \nAnywhere                   ALLOW       89.116.184.19             \n27017                      DENY        Anywhere                  \n22/tcp (v6)                ALLOW       Anywhere (v6)             \n27017 (v6)                 DENY        Anywhere (v6)\n```\n\n### Add Member\n\n```\n$ mongosh\nrs.add({host: 'mmx-si-1.mmx.network', priority: 1})\n```\n\n### Inital Setup\n\n`mongosh` on one server after adding members:\n```\nrs.initiate()\n```\n"
  },
  {
    "path": "www/pool-server/account.js",
    "content": "\nconst mongoose = require('mongoose');\nconst axios = require(\"axios\");\nconst dbs = require('./schema.js');\nconst utils = require('./utils.js');\nconst config = require('./config.js');\n\nvar db = null;\nvar vdf_height = null;\nvar sync_height = null;\nvar balance_lock = false;\n\nconst api_token_header = {\n    headers: {'x-api-token': config.api_token}\n};\n\nasync function query_height()\n{\n    try {\n        vdf_height = await utils.get_vdf_height();\n        sync_height = await utils.get_synced_height();\n        if(!sync_height) {\n            console.log('Waiting for node sync ...');\n        }\n    } catch(e) {\n        console.log(\"Failed to query sync height:\", e.message);\n    }\n}\n\nasync function update_account(address, reward, pool_share, points, count, height, opt)\n{\n    const account = await dbs.Account.findOne({address: address});\n    if(account) {\n        if(reward > 0) {\n            account.balance += reward;\n        }\n        account.pool_share = pool_share;\n        account.points_rate = points / config.share_window;\n        account.partial_rate = count / config.share_window_hours;\n        account.last_update = height;\n        await account.save(opt);\n    }\n}\n\nvar update_lock = false;\n\nasync function update()\n{\n    if(!sync_height) {\n        return;\n    }\n    if(update_lock) {\n        return;\n    }\n    while(balance_lock) {\n        await utils.sleep(1000);\n    }\n    update_lock = true;\n    balance_lock = true;\n    try {\n        const conn = await db.startSession();\n        try {\n            await conn.startTransaction();\n            const opt = {session: conn};\n\n            const start_height = vdf_height - config.share_window;\n\n            const result = await dbs.Partial.aggregate([\n                {$match: {pending: false, valid: true, height: {$gte: start_height}}},\n                {$group: {_id: \"$account\", points: {$sum: \"$points\"}, count: {$sum: 1}}}\n            ]);\n\n            const distribution = await dbs.Partial.aggregate([\n                {$match: {pending: false, valid: true, height: {$gte: start_height}}},\n                {$group: {_id: \"$height\", points: {$sum: \"$points\"}, count: {$sum: 1}}}\n            ]);\n\n            const errors = await dbs.Partial.aggregate([\n                {$match: {pending: false, valid: false, height: {$gte: start_height}}},\n                {$group: {_id: \"$error_code\", points: {$sum: \"$points\"}, count: {$sum: 1}}}\n            ]);\n\n            let uptime = 0;\n            let reward_enable = false;\n            {\n                const blocks_per_hour = 3600 * 1000 / config.block_interval;\n                \n                const map = new Map();\n                for(const entry of distribution) {\n                    const hour = Math.floor((entry._id - start_height) / blocks_per_hour);\n                    map.set(hour, true);\n                }\n                uptime = Math.min(map.size, config.share_window_hours);\n                reward_enable = (uptime > config.share_window_hours / 2);\n            }\n\n            let total_points = 0;\n            let total_partials = 0;\n            for(const entry of result) {\n                total_points += entry.points;\n                total_partials += entry.count;\n            }\n\n            let total_points_failed = 0;\n            for(const entry of errors) {\n                total_points_failed += entry.points;\n            }\n\n            let pool = await dbs.Pool.findOne({id: \"this\"});\n            if(!pool) {\n                pool = new dbs.Pool({id: \"this\"});\n            }\n            pool.farmers = result.length;\n            pool.points_rate = total_points / config.share_window;\n            pool.partial_rate = total_partials / config.share_window_hours;\n\n            const partial_errors = {};\n            for(const entry of errors) {\n                partial_errors[entry._id] = {\n                    points: entry.points,\n                    count: entry.count,\n                    share: entry.points / (total_points + total_points_failed)\n                };\n            }\n            pool.partial_errors = partial_errors;\n            pool.last_update = vdf_height;\n            await pool.save(opt);\n\n            let total_rewards = 0;\n\n            if(reward_enable) {\n                // Find all blocks that are pending and have been confirmed enough\n                const blocks = await dbs.Block.find({\n                    pending: true,\n                    height: {$lte: sync_height - config.account_delay}\n                });\n\n                for(const block of blocks) {\n                    const res = await axios.get(config.node_url + '/wapi/header?height=' + block.height, api_token_header);\n                    const valid = (res.data.hash === block.hash);\n                    if(valid) {\n                        total_rewards += block.reward_value;\n                    }\n                    block.valid = valid;\n                    block.pending = false;\n                    await block.save(opt);\n\n                    if(valid) {\n                        console.log(\"Farmed block\", block.height, \"reward\", block.reward_value, \"MMX\", \"account\", block.account);\n                    } else {\n                        console.log(\"Invalid block\", block.height);\n                    }\n                }\n            }\n            var fee_value = 0;\n            \n            // Take pool fee first\n            if(total_rewards) {\n                fee_value = total_rewards * config.pool_fee;\n                total_rewards -= fee_value;\n\n                let account = await dbs.Account.findOne({address: config.fee_account});\n                if(!account) {\n                    account = new dbs.Account({address: config.fee_account});\n                }\n                account.balance += fee_value;\n                await account.save(opt);\n            }\n\n            // Distribute rewards and update account stats\n            let res = [];\n            for(const entry of result) {\n                const pool_share = entry.points / total_points;\n                const reward_share = total_rewards * pool_share;\n                res.push(update_account(\n                    entry._id, reward_share, pool_share, entry.points, entry.count, vdf_height, opt));\n            }\n            await Promise.all(res);\n\n            await conn.commitTransaction();\n\n            if(total_rewards) {\n                console.log(\n                    \"Distributed\", total_rewards, \"MMX to\", result.length, \"accounts\",\n                    \"fee\", fee_value, \"MMX\", \"total_points\", total_points, \"total_partials\", total_partials);\n            }\n            console.log(\n                \"vdf_height\", vdf_height, \"points_rate\", pool.points_rate, \"partial_rate\", pool.partial_rate, \"farmers\", pool.farmers,\n                \"reward_enable\", reward_enable, \"uptime\", uptime, \"/\", config.share_window_hours, \"hours\"\n            );\n            if(total_points_failed) {\n                console.log(\"partial_errors:\", partial_errors);\n            }\n        } catch(e) {\n            await conn.abortTransaction();\n            throw e;\n        } finally {\n            conn.endSession();\n        }\n    } catch(e) {\n\t\tconsole.log(\"update() failed:\", e.message);\n\t} finally {\n        update_lock = false;\n        balance_lock = false;\n    }\n}\n\nvar find_blocks_lock = false;\n\nasync function find_blocks()\n{\n    if(find_blocks_lock) {\n        return;\n    }\n    find_blocks_lock = true;\n    try {\n        let since = 0;\n        {\n            const latest = await dbs.Block.findOne().sort({height: -1});\n            if(latest) {\n                since = Math.max(latest.height - config.account_delay, 0);\n            }\n        }\n        const res = await axios.get(config.node_url + '/wapi/address/history?id='\n            + config.pool_target + \"&since=\" + since + \"&limit=-1\",\n            api_token_header\n        );\n\n        for(const entry of res.data) {\n            if(entry.type != 'REWARD') {\n                continue;\n            }\n            if(!entry.is_native) {\n                continue;                       // not MMX\n            }\n            const block_hash = entry.txid;      // txid = block hash in case of type == REWARD\n\n            if(await dbs.Block.exists({hash: block_hash})) {\n                continue;\n            }\n            try {\n                const res = await axios.get(config.node_url + '/wapi/header?hash=' + block_hash, api_token_header);\n                const header = res.data;\n                const block = new dbs.Block({\n                    hash: header.hash,\n                    height: header.height,\n                    vdf_height: header.vdf_height,\n                    account: header.reward_account,\n                    contract: header.reward_contract,\n                    reward_addr: header.reward_addr,\n                    farmer_key: header.farmer_key,\n                    reward: entry.amount,\n                    reward_value: entry.value,\n                    time: entry.time_stamp,\n                    pending: true,\n                });\n                await block.save();\n                console.log(\"Added block\", block.height, \"hash\", block.hash, \"reward\", block.reward_value, \"MMX\");\n            } catch(e) {\n                console.log(\"Failed to add block:\", e.message);\n            }\n        }\n    } catch(e) {\n        console.log(\"check() failed:\", e.message);\n    } finally {\n        find_blocks_lock = false;\n    }\n}\n\nvar check_payout_lock = false;\n\nasync function check_payout()\n{\n    if(!sync_height) {\n        return;\n    }\n    const height = sync_height;\n\n    if(check_payout_lock) {\n        return;\n    }\n    while(balance_lock) {\n        await utils.sleep(1000);\n    }\n    check_payout_lock = true;\n    balance_lock = true;\n    try {\n        const list = await dbs.Payout.find({pending: true});\n        for(const payout of list) {\n            let failed = false;\n            let expired = false;\n            let confirmed = false;\n            try {\n                const res = await axios.get(config.node_url + '/wapi/transaction?id=' + payout.txid, api_token_header);\n                const tx = res.data;\n                if(tx.confirm && tx.confirm >= config.account_delay) {\n                    if(tx.did_fail) {\n                        failed = true;\n                        console.log(\"Payout transaction failed with:\", tx.message);\n                    } else {\n                        confirmed = true;\n                    }\n                    payout.tx_fee = tx.fee.value;\n                }\n            } catch(e) {\n                if(height - payout.height > config.payout_tx_expire + 100) {\n                    failed = true;\n                    expired = true;\n                    console.log(\"Payout transaction expired:\", \"height\", payout.height, \"txid\", payout.txid);\n                } else {\n                    console.log(\"Failed to check payout transaction:\", e.message,\n                        \"response\", e.response ? e.response.data : null, \"txid\", payout.txid);\n                }\n            }\n            if(!confirmed && !failed) {\n                continue;\n            }\n            payout.valid = !failed;\n            payout.pending = false;\n\n            const conn = await db.startSession();\n            try {\n                await conn.startTransaction();\n                const opt = {session: conn};\n\n                if(failed) {\n                    // revert balances\n                    for(const entry of payout.amounts) {\n                        const address = entry[0];\n                        const account = await dbs.Account.findOne({address: address});\n                        if(!account) {\n                            throw new Error(\"Account not found: \" + address);\n                        }\n                        account.balance += entry[1];\n                        await account.save(opt);\n                    }\n                    payout.expired = expired;\n\n                    console.log(\"Payout failed:\", \"height\", payout.height, \"txid\", payout.txid);\n                } else {\n                    for(const entry of payout.amounts) {\n                        await dbs.Account.updateOne({address: entry[0]}, {$inc: {total_paid: entry[1]}}, opt);\n                    }\n                    console.log(\"Payout confirmed:\", \"height\", payout.height, \"total_amount\", payout.total_amount,\n                        \"count\", payout.count, \"tx_fee\", payout.tx_fee, \"txid\", payout.txid);\n                }\n                await payout.save(opt);\n\n                if(!expired) {\n                    const account = await dbs.Account.findOne({address: config.fee_account});\n                    if(!account) {\n                        throw new Error(\"Fee account not found: \" + config.fee_account);\n                    }\n                    account.balance -= payout.tx_fee;\n                    await account.save(opt);\n                }\n                await conn.commitTransaction();\n            } catch(e) {\n                await conn.abortTransaction();\n                throw e;\n            } finally {\n                conn.endSession();\n            }\n        }\n    } catch(e) {\n        console.log(\"check() failed:\", e.message);\n    } finally {\n        check_payout_lock = false;\n        balance_lock = false;\n    }\n}\n\nasync function make_payout(height, amounts, opt)\n{\n    const options = {\n        auto_send: false,\n        mark_spent: true,\n        expire_at: height + config.payout_tx_expire,\n    };\n\n    let tx = null;\n    try {\n        const res = await axios.post(config.node_url + '/wapi/wallet/send_many', {\n            index: config.wallet_index,\n            amounts: amounts,\n            currency: \"MMX\",\n            options: options,\n        }, api_token_header);\n        tx = res.data;\n    } catch(e) {\n        throw new Error(\"Failed to create payout transaction: \"\n            + e.message + \" (\" + (e.response ? e.response.data : \"???\") + \")\");\n    }\n\n    if(tx.sender != config.pool_target) {\n        throw new Error(\"Invalid payout transaction sender: \" + tx.sender\n            + \" != \" + config.pool_target + \" (wrong config.wallet_index)\");\n    }\n\n    let total_amount = 0;\n    for(const entry of amounts) {\n        const payout = new dbs.UserPayout({\n            account: entry[0],\n            height: height,\n            amount: entry[1],\n            txid: tx.id,\n        });\n        total_amount += payout.amount;\n        await payout.save(opt);\n    }\n    const payout = new dbs.Payout({\n        txid: tx.id,\n        total_amount: total_amount,\n        amounts: amounts,\n        count: amounts.length,\n        time: Date.now(),\n        height: height,\n        pending: true,\n    });\n    await payout.save(opt);\n\n    console.log(\"Payout transaction created:\", tx.id, \"total_amount\", total_amount, \"count\", amounts.length);\n    return tx;\n}\n\nvar payout_lock = false;\n\nasync function payout()\n{\n    if(!sync_height) {\n        return;\n    }\n    const height = sync_height;\n\n    if(payout_lock) {\n        return;\n    }\n    while(balance_lock) {\n        await utils.sleep(1000);\n    }\n    payout_lock = true;\n    balance_lock = true;\n    try {\n        const pool = await dbs.Pool.findOne({id: \"this\"});\n        if(!pool) {\n            throw new Error(\"Pool state not found\");\n        }\n        if(!pool.payout_enable) {\n            console.log(\"Payouts currently disabled\");\n            return;\n        }\n        if(pool.last_payout && height - pool.last_payout < config.payout_interval) {\n            return;\n        }\n        const conn = await db.startSession();\n        try {\n            await conn.startTransaction();\n            const opt = {session: conn};\n\n            const list = dbs.Account.find({balance: {$gt: config.payout_threshold}});\n\n            // reserve for tx fees\n            const reserve = (list.length * config.tx_output_cost + 1);\n\n            let total_count = 0;\n            let total_amount = 0;\n            let outputs = [];\n            let tx_list = [];\n\n            for await(const account of list)\n            {\n                let amount = account.balance;\n\n                if(account.address == config.fee_account) {\n                    amount -= reserve;\n                    if(amount < config.payout_threshold) {\n                        continue;\n                    }\n                }\n                account.balance -= amount;\n                await account.save(opt);\n\n                console.log(\"Payout triggered for\", account.address, \"amount\", amount, \"MMX\");\n\n                total_count++;\n                total_amount += amount;\n                outputs.push([account.address, amount]);\n\n                if(outputs.length >= config.max_payouts) {\n                    tx_list.push(await make_payout(height, outputs, opt));\n                    outputs = [];\n                }\n            }\n            if(outputs.length) {\n                tx_list.push(await make_payout(height, outputs, opt));\n            }\n            pool.last_payout = height;\n            await pool.save(opt);\n\n            await conn.commitTransaction();\n\n            for(const tx of tx_list) {\n                try {\n                    await axios.post(config.node_url + '/wapi/wallet/send_off', {\n                        index: config.wallet_index,\n                        tx: tx,\n                    }, api_token_header);\n                    console.log(\"Payout transaction sent:\", tx.id);\n                } catch(e) {\n                    console.log(\"Failed to send payout transaction:\",\n                        e.message, \"txid\", tx.id, \"response\", e.response ? e.response.data : \"???\");\n                }\n            }\n            if(tx_list.length) {\n                console.log(\"Payout initiated:\", \"height\", height, \"total_amount\",\n                    total_amount, \"total_count\", total_count, \"tx_count\", tx_list.length);\n            }\n        } catch(e) {\n            await conn.abortTransaction();\n            throw e;\n        } finally {\n            conn.endSession();\n        }\n    } catch(e) {\n        console.log(\"payout() failed:\", e.message);\n    } finally {\n        payout_lock = false;\n        balance_lock = false;\n    }\n}\n\nasync function main()\n{\n    db = await mongoose.connect(config.mongodb_uri);\n\n    await query_height();\n    await update();\n    await payout();\n    await find_blocks();\n    await check_payout();\n\n    setInterval(query_height, config.block_interval / 10);\n    setInterval(update, config.share_interval * 1000);\n    setInterval(payout, 15 * 60 * 1000);\n    setInterval(find_blocks, config.block_interval / 2);\n    setInterval(check_payout, 60 * 1000);\n}\n\nmain();\n"
  },
  {
    "path": "www/pool-server/config.js",
    "content": "const config = {};\n\nconfig.pool_fee = 0.01;                     // [%]\nconfig.partial_expiry = 100;                // [blocks]\nconfig.account_delay = 48;                  // [blocks]\nconfig.share_window = 8640;                 // [blocks]\nconfig.share_window_hours = 24;             // [hours]\nconfig.share_interval = 5 * 60;             // [sec]\nconfig.block_interval = 10 * 1000;          // [ms]\nconfig.min_difficulty = 1;                  // diff 1 gives ~0.7 partials per k32 per height\nconfig.default_difficulty = 10;\nconfig.space_diff_constant = 100000000000;\nconfig.payout_interval = 8640;              // [blocks]\nconfig.payout_tx_expire = 1000;             // [blocks]\nconfig.payout_threshold = 10;               // [MMX]\nconfig.tx_output_cost = 0.01;               // [MMX]\nconfig.max_payout_count = 1000;             // max number of payouts per transaction\n\nconfig.server_port = 8080;\nconfig.wallet_index = 0;                    // for pool wallet (payout)\nconfig.node_url = \"http://localhost:11380\";\nconfig.pool_name = \"MMX Pool\";\nconfig.pool_description = \"MMX Pool (reference implementation)\";\nconfig.logo_path = \"/img/logo.png\";\nconfig.fee_account = \"mmx1e7yktu9vpeyq7hx39cmagzfp2um3kddwjf4tlt8j3kmktwc7fk6qmyc6ns\";      // where the pool fee goes\nconfig.pool_target = \"mmx1uj2dth7r9tcn3vas42f0hzz74dkz8ygv59mpx44n7px7j7yhvv4sfmkf0d\";      // where the block rewards go\nconfig.api_token = \"B01255C3AD4640292FAB5D0078439E945349EE13A9DD8C1DFE9F69FD0AE8B18C\";      // for node API\nconfig.mongodb_uri = \"mongodb://127.0.0.1:27017/mmx-pool?replicaSet=rs\";\n\nmodule.exports = config;"
  },
  {
    "path": "www/pool-server/package.json",
    "content": "{\n  \"dependencies\": {\n    \"axios\": \"^1.7.7\",\n    \"express\": \"^4.21.0\",\n    \"mongoose\": \"^8.6.3\"\n  }\n}\n"
  },
  {
    "path": "www/pool-server/schema.js",
    "content": "\nconst mongoose = require('mongoose');\n\nconst partial = new mongoose.Schema({\n\thash: {type: String, unique: true},\n\theight: {type: Number, index: true},\n    account: {type: String, index: true},\n    contract: {type: String, index: true},\n    harvester: {type: String, index: true},\n    difficulty: Number,\n    lookup_time: Number,\n    response_time: Number,\n    time: {type: Date, index: true},\n    data: Object,\n    points: {type: Number, default: 0},\n    pending: {type: Boolean, default: true, index: true},\n    valid: {type: Boolean, index: true},\n    error_code: {type: String, index: true},\n    error_message: String,\n});\n\nconst account = new mongoose.Schema({\n    address: {type: String, unique: true},\n    balance: {type: Number, default: 0, index: true},\n    total_paid: {type: Number, default: 0, index: true},\n    difficulty: {type: Number, default: 1, index: true},\n    pool_share: {type: Number, default: 0, index: true},\n    points_rate: {type: Number, default: 0, index: true},\n    partial_rate: {type: Number, default: 0, index: true},\n    created: {type: Date, default: Date.now, index: true},\n    last_update: {type: Number, index: true},\n});\n\nconst block = new mongoose.Schema({\n    hash: {type: String, unique: true},\n    height: {type: Number, index: true},\n    vdf_height: {type: Number, index: true},\n    account: {type: String, index: true},\n    contract: {type: String, index: true},\n    farmer_key: {type: String, index: true},\n    reward_addr: {type: String, index: true},\n    reward: String,\n    reward_value: {type: Number, index: true},\n    time: Date,\n    pending: {type: Boolean, default: true, index: true},\n    valid: {type: Boolean, index: true},\n});\n\nconst payout = new mongoose.Schema({\n    txid: {type: String, unique: true},\n    total_amount: Number,\n    tx_fee: Number,\n    amounts: Array,     // [[account, amount], ...]\n    count: Number,\n    time: Date,\n    height: {type: Number, index: true},\n    pending: {type: Boolean, default: true, index: true},\n    expired: {type: Boolean, index: true},\n    valid: {type: Boolean, index: true},\n});\n\nconst user_payout = new mongoose.Schema({\n    account: {type: String, index: true},\n    height: {type: Number, index: true},\n    amount: Number,\n    txid: String,\n});\n\nconst pool = new mongoose.Schema({\n    id: {type: String, unique: true},\n    farmers: {type: Number, default: 0},\n    points_rate: {type: Number, default: 0},\n    partial_rate: {type: Number, default: 0},\n    partial_errors: {type: Object},\n    last_update: {type: Number, default: 0},\n    last_payout: {type: Number, default: 0},\n    payout_enable: {type: Boolean, default: true},\n}, {\n    minimize: false,\n});\n\nexports.Partial = mongoose.model('Partial', partial);\nexports.Account = mongoose.model('Account', account);\nexports.Block = mongoose.model('Block', block);\nexports.Payout = mongoose.model('Payout', payout);\nexports.UserPayout = mongoose.model('UserPayout', user_payout);\nexports.Pool = mongoose.model('Pool', pool);\n"
  },
  {
    "path": "www/pool-server/server.js",
    "content": "\nconst mongoose = require('mongoose');\nconst express = require('express');\nconst http = require('http');\nconst axios = require(\"axios\");\nconst dbs = require('./schema.js');\nconst utils = require('./utils.js');\nconst config = require('./config.js');\nconst { createHash } = require('crypto');\n\nvar db = null;\nvar app = express();\n\nvar vdf_height = false;\nvar sync_time = null;\n\napp.use(express.json());\n\nfunction no_cache(req, res, next) {\n    res.set('Cache-Control', 'no-cache');\n    next();\n}\n\nfunction max_age_cache(max_age = 60) {\n    return (req, res, next) => {\n        res.set('Cache-Control', 'public, max-age=' + max_age);\n        next();\n    }\n}\n\n\napp.get('/pool/info', max_age_cache(60), async (req, res) =>\n{\n    res.json({\n        name: config.pool_name,\n        description: config.pool_description,\n        fee: config.pool_fee,\n        logo_path: config.logo_path,\n        protocol_version: 1,\n        pool_target: config.pool_target,\n        min_difficulty: config.min_difficulty,\n    });\n});\n\napp.get('/pool/stats', max_age_cache(60), async (req, res, next) =>\n{\n    try {\n        const pool = await dbs.Pool.findOne({id: \"this\"});\n        if(!pool) {\n            throw new Error('Not initialized yet');\n        }\n        res.json({\n            estimated_space: utils.calc_eff_space(pool.points_rate),\n            partial_rate: pool.partial_rate,\n            partial_errors: pool.partial_errors,\n            farmers: pool.farmers,\n            last_update: pool.last_update,\n            last_payout: pool.last_payout,\n        });\n    } catch(e) {\n        next(e);\n    }\n});\n\napp.get('/account/info', max_age_cache(60), async (req, res, next) =>\n{\n    const id = req.query.id;\n    try {\n        const account = await dbs.Account.findOne({address: id});\n        if(!account) {\n            throw new Error('Account not found');\n        }\n        const blocks_found = await dbs.Block.countDocuments({account: id, valid: true});\n        res.json({\n            balance: account.balance,\n            total_paid: account.total_paid,\n            difficulty: account.difficulty,\n            pool_share: account.pool_share,\n            partial_rate: account.partial_rate,\n            blocks_found: blocks_found,\n            estimated_space: utils.calc_eff_space(account.points_rate),\n        });\n    } catch(e) {\n        next(e);\n    }\n});\n\napp.get('/difficulty', max_age_cache(30), async (req, res) =>\n{\n    const account = await dbs.Account.findOne({address: req.query.id});\n\n    res.json({difficulty: account ? account.difficulty : config.default_difficulty});\n});\n\napp.post('/partial', no_cache, async (req, res, next) =>\n{\n    try {\n        const now = Date.now();\n        const partial = req.body;\n\n        const out = {\n            valid: false\n        };\n        let is_valid = true;\n        let response_time = null;\n\n        if(vdf_height) {\n            const delta = vdf_height - partial.vdf_height;\n            response_time = delta * config.block_interval + (now - sync_time);\n\n            if(delta >= 0) {\n                is_valid = false;\n                out.error_code = 'PARTIAL_TOO_LATE';\n                out.error_message = 'Partial received ' + response_time / 1e3 + ' sec too late';\n            }\n        } else {\n            is_valid = false;\n            out.error_code = 'POOL_LOST_SYNC';\n            out.error_message = 'Pool lost sync with blockchain';\n        }\n        out.response_time = response_time;\n\n        if(partial.vdf_height < 0 || partial.vdf_height > 4294967295\n            || partial.lookup_time_ms < 0 || partial.lookup_time_ms > 4294967295)\n        {\n            out.error_code = 'INVALID_PARTIAL';\n            out.error_message = 'Invalid numeric value for height or lookup_time_ms';\n            res.json(out);\n            return;\n        }\n        if(!partial.proof) {\n            out.error_code = 'INVALID_PROOF';\n            out.error_message = 'Missing proof';\n            res.json(out);\n            return;\n        }\n        const proof = partial.proof;\n        const partial_diff = proof.difficulty;\n        \n        console.log('/partial', 'height', partial.vdf_height, 'diff', partial_diff,\n            'response', response_time / 1e3, 'time', now, 'account', partial.account);\n\n        if(proof.__type == 'mmx.ProofOfSpaceNFT') {\n            const ksize = proof.ksize;\n            const proof_xs = proof.proof_xs;\n            if(ksize < 0 || ksize > 255) {\n                out.error_code = 'INVALID_PROOF';\n                out.error_message = 'Invalid proof ksize';\n                res.json(out);\n                return;\n            }\n            if(!Array.isArray(proof_xs) || proof_xs.length > 1024) {\n                out.error_code = 'INVALID_PROOF';\n                out.error_message = 'Invalid proof proof_xs';\n                res.json(out);\n                return;\n            }\n            for(const x of proof_xs) {\n                if(x < 0 || x > 4294967295) {\n                    out.error_code = 'INVALID_PROOF';\n                    out.error_message = 'Proof value out of range';\n                    res.json(out);\n                    return;\n                }\n            }\n        }\n\n        if(partial_diff < 1 || partial_diff > 4503599627370495) {\n            out.error_code = 'INVALID_DIFFICULTY';\n            out.error_message = 'Invalid numeric value for difficulty';\n            res.json(out);\n            return;\n        }\n        var msg = proof.plot_id + ':' + proof.challenge;\n\n        switch(proof.__type) {\n            case 'mmx.ProofOfSpaceNFT':\n                msg += ':' + proof.proof_xs.join(',');\n                break;\n            default:\n                out.error_code = 'INVALID_PROOF';\n                out.error_message = 'Invalid proof type: ' + proof.__type;\n                res.json(out);\n                return;\n        }\n        const hash = createHash('sha256').update(msg).digest('hex');\n\n        if(await dbs.Partial.exists({hash: hash})) {\n            out.error_code = 'DUPLICATE_PARTIAL';\n            out.error_message = 'Duplicate partial';\n            res.json(out);\n            return;\n        }\n        let difficulty = config.default_difficulty;\n\n        const account = await dbs.Account.findOne({address: partial.account});\n        if(account) {\n            difficulty = account.difficulty;\n        }\n        if(partial_diff < difficulty) {\n            is_valid = false;\n            out.error_code = 'PARTIAL_NOT_GOOD_ENOUGH';\n            out.error_message = 'Partial difficulty too low: ' + partial_diff + ' < ' + difficulty;\n        }\n\n        const entry = new dbs.Partial({\n            hash: hash,\n            height: partial.vdf_height,\n            account: partial.account,\n            contract: partial.contract,\n            harvester: partial.harvester,\n            difficulty: partial_diff,\n            lookup_time: partial.lookup_time_ms,\n            response_time: response_time,\n            time: now,\n        });\n\n        if(is_valid) {\n            entry.data = partial;\n            entry.points = Math.floor(difficulty);      // need to use current difficulty to avoid cheating\n        } else {\n            entry.valid = false;\n            entry.pending = false;\n            entry.points = 0;\n            entry.error_code = out.error_code;\n            entry.error_message = out.error_message;\n        }\n        await entry.save();\n\n        out.valid = is_valid;\n        out.points = entry.points;\n        res.json(out);\n    } catch(e) {\n        next(e);\n    }\n});\n\napp.use((err, req, res, next) => {\n    console.log('URL', req.url);\n    console.error(err);\n    res.status(500).send(err.message);\n});\n\n\nasync function query_height()\n{\n    try {\n        const now = Date.now();\n        const value = await utils.get_synced_vdf_height();\n        if(value) {\n            if(vdf_height == null) {\n                console.log(\"Node synced at VDF height \" + value);\n            }\n            if(vdf_height == null || value > vdf_height) {\n                console.log(\"New VDF peak at\", value, \"time\", now, \"delta\", now - sync_time);\n                sync_time = now;\n                vdf_height = value;\n            }\n        } else {\n            if(vdf_height) {\n                console.error(\"Node lost sync\");\n            }\n            vdf_height = null;\n        }\n    } catch(e) {\n        if(vdf_height) {\n            console.error(\"Failed to get current height:\", e.message);\n        }\n        vdf_height = null;\n    }\n}\n\nasync function main()\n{\n    db = await mongoose.connect(config.mongodb_uri);\n\n    http.createServer(app).listen(config.server_port);\n\n    setInterval(query_height, 500);\n\n    console.log(\"Listening on port \" + config.server_port);\n}\n\nmain();\n"
  },
  {
    "path": "www/pool-server/start.sh",
    "content": "#!/bin/bash\n\nTHREADS=${1:-max}\n\npm2 start server.js  --name pool-server  --namespace mmx-pool -i $THREADS\npm2 start verify.js  --name pool-verify  --namespace mmx-pool\npm2 start account.js --name pool-account --namespace mmx-pool\n"
  },
  {
    "path": "www/pool-server/utils.js",
    "content": "\nconst axios = require(\"axios\");\nconst config = require('./config.js');\n\nasync function get_synced_height()\n{\n    const res = await axios.get(config.node_url + '/api/node/get_synced_height');\n    return res.data;\n}\n\nasync function get_synced_vdf_height()\n{\n    const res = await axios.get(config.node_url + '/api/node/get_synced_vdf_height');\n    return res.data;\n}\n\nasync function get_vdf_height()\n{\n    const res = await axios.get(config.node_url + '/api/node/get_vdf_height');\n    return res.data;\n}\n\nfunction calc_eff_space(points_rate)\n{\n    // points_rate = points per block (height)\n    return points_rate * config.space_diff_constant * 4.8 * 1e-12;    // [TB]\n}\n\nfunction sleep(ms)\n{\n    return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexports.get_synced_height = get_synced_height;\nexports.get_synced_vdf_height = get_synced_vdf_height;\nexports.get_vdf_height = get_vdf_height;\nexports.calc_eff_space = calc_eff_space;\nexports.sleep = sleep;\n"
  },
  {
    "path": "www/pool-server/verify.js",
    "content": "\nconst mongoose = require('mongoose');\nconst axios = require(\"axios\");\nconst dbs = require('./schema.js');\nconst utils = require('./utils.js');\nconst config = require('./config.js');\n\nvar db = null;\nvar first_sync = null;\n\nasync function verify(partial, vdf_height)\n{\n    try {\n        if(vdf_height > partial.height + config.partial_expiry)\n        {\n            if(partial.height < first_sync) {\n                partial.error_code = 'POOL_LOST_SYNC';\n                partial.error_message = 'Pool server lost sync with blockchain or was offline';\n            } else {\n                partial.error_code = 'SERVER_ERROR';\n                partial.error_message = 'Partial expired for some reason';\n            }\n            partial.data = null;\n            partial.valid = false;\n            partial.pending = false;\n            await partial.save();\n\n            console.log(\"Partial\", partial.hash, \"expired at height\", vdf_height, 'due to', partial.error_code, '(' + partial.error_message + ')');\n            return;\n        }\n\n        const res = await axios.post(config.node_url + '/api/node/verify_partial', {\n            partial: partial.data,\n            pool_target: config.pool_target\n        }, {\n            headers: {'x-api-token': config.api_token}\n        });\n        const [code, message] = res.data;\n\n        // console.log(\"Partial\", partial.hash, \"verified with code\", code, '(' + message + ')');\n\n        if(code == 'NONE') {\n            partial.valid = true;\n        } else {\n            partial.valid = false;\n            partial.error_code = code;\n            partial.error_message = message;\n\n            console.log(\"Partial\", partial.hash, \"failed verification with code\", code, '(' + message + ')');\n        }\n        partial.data = null;\n        partial.pending = false;\n        await partial.save();\n    } catch(e) {\n        console.log(\"Failed to verify partial\", partial.hash, \":\", e.message, '(' + e.response.data + ')');\n    }\n\n    try {\n        if(partial.valid) {\n            let account = await dbs.Account.findOne({address: partial.account});\n            if(!account) {\n                account = new dbs.Account({\n                    address: partial.account,\n                    difficulty: config.default_difficulty,\n                });\n                await account.save();\n\n                console.log(\"Created new account for\", partial.account);\n            }\n        }\n    } catch(e) {\n        console.log(\"Failed to create account:\", e.message);\n    }\n}\n\nvar verify_lock = false;\n\nasync function verify_all()\n{\n    let vdf_height = null;\n    try {\n        vdf_height = await utils.get_synced_vdf_height();\n        if(!vdf_height) {\n            console.log('Waiting for node sync ...');\n            return;\n        }\n    } catch(e) {\n        console.log(\"Failed to query sync height:\", e.message);\n        return;\n    }\n    if(!first_sync) {\n        first_sync = vdf_height;\n    }\n\n    if(verify_lock) {\n        return;\n    }\n    verify_lock = true;\n    try {\n        const list = dbs.Partial.find({pending: true, height: {$lte: vdf_height}});\n\n        let res = [];\n        let total = 0;\n        for await(const partial of list) {\n            res.push(verify(partial, vdf_height));\n            total++;\n        }\n        await Promise.all(res);\n\n        if(total) {\n            console.log(\"Verified\", total, \"partials at height\", vdf_height);\n        }\n    } catch(e) {\n\t\tconsole.log(\"verify_all() failed:\", e.message);\n\t} finally {\n        verify_lock = false;\n    }\n}\n\nasync function main()\n{\n    db = await mongoose.connect(config.mongodb_uri);\n\n    setInterval(verify_all, 1000);\n}\n\nmain();\n"
  },
  {
    "path": "www/rpc-server/.gitignore",
    "content": "/remotes.json\n"
  },
  {
    "path": "www/rpc-server/README.md",
    "content": "\n## Install\n\n```\nnpm install pm2 -g\n```\n\n### SSL certificate\n\n```\nexport BUNNY_API_KEY=...\ncurl https://get.acme.sh | sh -s email=admin@mmx.network\ncd ~/.acme.sh\n./acme.sh --issue --dns dns_bunny -d rpc.mmx.network\n```\n"
  },
  {
    "path": "www/rpc-server/index.js",
    "content": "\nconst max_retry = 1;\nconst latency_gain = 0.5;\nconst load_balance_tick = 500;\t\t// [ms]\nconst check_interval_ms = 10 * 1000;\nconst error_timeout_ms = 3 * check_interval_ms;\n\nconst express = require('express');\nconst axios = require(\"axios\");\nconst https = require('https');\nconst http = require('http');\nconst fs = require('fs');\n\nconst remotes = require('./remotes.json');\n\nvar targets = ['http://localhost:11380/wapi'].concat(remotes);\n\nconsole.log(\"Targets:\", targets);\n\nvar servers = [];\nfor(const entry of targets) {\n\tservers.push({url: entry, count: 0, pending: 0, errors: 0, latency: 1000, timeout: 0, last_request: 0});\n}\nservers[0].latency = 0;\n\nvar http_proxy = require('http-proxy');\nvar proxy = http_proxy.createProxyServer({});\n\nproxy.on('proxyRes', function(proxyRes) {\n\tproxyRes.headers['Access-Control-Allow-Origin'] = \"*\";\n});\n\nvar app = express();\n\napp.all('*', function(req, res)\n{\n\tconst hop_count = req.get('x-hop-count');\n\tconst is_health_check = req.get('x-health-check');\n\t\n\tconsole.log(req.method + ' ' + req.url + ' (hop ' + (hop_count ? hop_count : 0) + ')' + (is_health_check ? \" (check)\" : \"\"));\n\t\n\tif(req.url == \"/server/status\") {\n\t\tres.send(JSON.stringify(servers, null, 4) + '\\n');\n\t\treturn;\n\t}\n\tconst time_begin = Date.now();\n\t\n\tvar server = servers[0];\n\tif(!is_health_check) {\n\t\tif(!hop_count || hop_count <= max_retry) {\n\t\t\tvar is_fallback = server.timeout > time_begin;\n\t\t\tfor(const entry of servers) {\n\t\t\t\tif(time_begin > entry.timeout) {\n\t\t\t\t\tif((entry.pending + 1) * entry.latency < (server.pending + 1) * server.latency || is_fallback) {\n\t\t\t\t\t\tis_fallback = false;\n\t\t\t\t\t\tserver = entry;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tserver.count++;\n\t\tserver.pending++;\n\t\tserver.last_request = time_begin;\n\t}\n\t\n\tres.on('finish', function() {\n\t\tconst now = Date.now();\n\t\tif(res.statusCode >= 500) {\n\t\t\tserver.errors++;\n\t\t\tserver.timeout = now + error_timeout_ms;\n\t\t}\n\t\tconst latency = now - time_begin;\n\t\tconsole.log(req.method + ' ' + server.url + req.url + ' => status ' + res.statusCode + ', took ' + latency + ' ms');\n    });\n    \n\tproxy.web(req, res, {\n\t\ttarget: server.url,\n\t\theaders: {'x-hop-count': (hop_count > 0 ? hop_count + 1 : 1)}\n\t}, function(err) {\n\t\ttry {\n\t\t\tres.status(500);\n\t\t\tres.send(err.code);\n\t\t} catch(e) {\n\t\t\t// ignore\n\t\t}\n\t\tconsole.log(err);\n\t});\n});\n\nfunction health_check() {\n\tfor(const server of servers) {\n\t\tconst time_begin = Date.now();\n\t\taxios.get(server.url + '/node/info', {headers: {'x-health-check': true}})\n\t\t\t.then((res) => {\n\t\t\t\tvar info = {};\n\t\t\t\tif(res.status == 200) {\n\t\t\t\t\tif(res.data) {\n\t\t\t\t\t\tinfo = res.data;\n\t\t\t\t\t}\n\t\t\t\t\tserver.timeout = 0;\n\t\t\t\t}\n\t\t\t\tconst latency = Date.now() - time_begin;\n\t\t\t\tserver.latency = parseInt(server.latency * (1 - latency_gain) + latency * latency_gain);\n\t\t\t\tconsole.log('CHECK ' + server.url + ' => status ' + res.status + ', height ' + info.height + ', latency ' + latency + ' ms');\n\t\t\t}).catch((err) => {\n\t\t\t\tserver.timeout = Date.now() + error_timeout_ms;\n\t\t\t\tconsole.log('CHECK ' + server.url + ' failed with: ' + err.code);\n\t\t\t});\n\t}\n}\n\nfunction reset_pending() {\n\tfor(const server of servers) {\n\t\tserver.pending = 0;\n\t}\n}\n\nhealth_check();\n\nsetInterval(health_check, check_interval_ms);\nsetInterval(reset_pending, load_balance_tick);\n\n{\n\thttp.createServer(app).listen(80);\n\t\n\tconsole.log(\"Listening on port 80 ...\");\n}\n\nconst cert_path = '/root/.acme.sh/rpc.mmx.network_ecc/';\n\nif(fs.existsSync(cert_path))\n{\n\tvar options = {\n\t\tkey: fs.readFileSync(cert_path + 'rpc.mmx.network.key'),\n\t\tcert: fs.readFileSync(cert_path + 'fullchain.cer'),\n\t\tca: fs.readFileSync(cert_path + 'ca.cer')\n\t};\n\n\thttps.createServer(options, app).listen(443);\n\t\n\tconsole.log(\"Listening on port 443 ...\");\n}\n\n"
  },
  {
    "path": "www/rpc-server/package.json",
    "content": "{\n  \"dependencies\": {\n    \"axios\": \"^1.7.2\",\n    \"express\": \"^4.19.2\",\n    \"http-proxy\": \"^1.18.1\"\n  }\n}\n"
  },
  {
    "path": "www/rpc-server/start.sh",
    "content": "#!/bin/bash\n\npm2 start index.js --name mmx-rpc --namespace mmx --cron-restart=\"0 0 * * *\"\n"
  },
  {
    "path": "www/web-gui/public/assets/fonts/material-icons/material-icons.css",
    "content": "/* material-icons-regular - latin */\r\n@font-face {\r\n  font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n  font-family: 'Material Design Icons';\r\n  font-style: normal;\r\n  font-weight: 400;\r\n  src: url('material-icons-v142-latin-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n}\r\n"
  },
  {
    "path": "www/web-gui/public/assets/fonts/roboto/roboto.css",
    "content": "/* roboto-100 - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n@font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 100;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-100.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-100italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 100;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-100italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-300 - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 300;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-300.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-300italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 300;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-300italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-regular - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 400;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-regular.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 400;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-500 - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 500;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-500.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-500italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 500;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-500italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-700 - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 700;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-700.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-700italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 700;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-700italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-900 - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: normal;\r\n    font-weight: 900;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-900.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  \r\n  /* roboto-900italic - cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese */\r\n  @font-face {\r\n    font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */\r\n    font-family: 'Roboto';\r\n    font-style: italic;\r\n    font-weight: 900;\r\n    src: url('roboto-v30-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-900italic.woff2') format('woff2'); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */\r\n  }\r\n  "
  },
  {
    "path": "www/web-gui/public/components/seed.js",
    "content": "\r\nVue.component('seed-autocomplete', {\r\n    props: {\r\n        value: String,\r\n        word_list: Array,\r\n        index: Number,\r\n        word_count: Number,\r\n        disabled: Boolean\r\n\t},\r\n\tmodel: {\r\n\t\tprop: 'value',\r\n\t\tevent: 'input'\r\n\t},\r\n    data() {\r\n        return {\r\n            items: [],\r\n            queryTerm: null,\r\n            word_list: []\r\n        }\r\n    },\r\n    watch: {\r\n        word_list() {\r\n            this.queryTerm = ''\r\n            this.items = this.word_list\r\n        },\r\n    },\r\n    computed: {\r\n        search: {\r\n            get () {\r\n                return this.queryTerm\r\n            },        \r\n            set (searchInput) {\r\n                if (this.queryTerm !== searchInput) {\r\n                    this.queryTerm = (searchInput || '').trim()\r\n                    if(this.queryTerm) {\r\n                        this.items = this.word_list.filter(i => i.indexOf(this.queryTerm) == 0)\r\n                    } else {\r\n                        this.items = this.word_list\r\n                    }\r\n\r\n                    if(this.items[0] == this.queryTerm) {\r\n                        this.value = this.items[0]\r\n                        this.$emit('input', this.value);\r\n                    }\r\n\r\n                    //console.log(this.value, this.queryTerm, this.items)\r\n                }\r\n            }\r\n        },        \r\n    },\r\n    methods: {\r\n        customFilter (item, queryText, itemText) {\r\n            const text = item.toLowerCase().trim()\r\n            const searchText = queryText.toLowerCase().trim()\r\n            return text.indexOf(searchText) == 0\r\n        },        \r\n        onInput(event) {\r\n            this.$emit('input', event);\r\n        },\r\n        onPaste(event) {\r\n            \r\n            this.$emit('paste', event)\r\n\r\n            const text = event.clipboardData.getData('text');\r\n            var wordArray = text.split(' ');            \r\n            if(wordArray.length == this.word_count) {\r\n                event.preventDefault();\r\n                this.value = wordArray[this.index]\r\n                this.queryTerm = wordArray[this.index]\r\n                this.items = this.word_list.filter(i => i.indexOf(this.queryTerm) == 0)\r\n            }            \r\n        }\r\n    },    \r\n    template: \r\n        `\r\n        <v-autocomplete\r\n            v-model=\"value\"\r\n            :items=\"items\"\r\n            :label=\"index+1\"\r\n            :filter=\"customFilter\"\r\n            :search-input.sync=\"search\"\r\n            hide-details\r\n            @input=\"onInput\"\r\n            @paste=\"onPaste\"\r\n            :disabled=\"disabled\"\r\n            outlined\r\n            append-icon=\"\"/>   \r\n        `\r\n});    \r\n\r\nVue.component('seed', {\r\n    props: {\r\n        value: String,\r\n        readonly: Boolean,\r\n        disabled: Boolean\r\n\t},\r\n\tmodel: {\r\n\t\tprop: 'value',\r\n\t\tevent: 'input'\r\n\t},\r\n    data() {\r\n        return {\r\n            words: (this.value || '').split(' '),\r\n            word_count: 24,\r\n            rows: 4,\r\n            cols: 6,\r\n            word_list: []\r\n        }\r\n    },\r\n\tcreated() {\r\n        fetch('/api/wallet/get_mnemonic_wordlist')\r\n            .then(response => response.json())\r\n            .then(data => {\r\n                this.word_list = data;\r\n            });\r\n\t},\r\n\r\n    watch: {\r\n        value() {\r\n            this.words = (this.value || '').split(' ')\r\n        },\r\n    },\r\n\r\n    methods: {\r\n        onPaste(event) {\r\n            const text = event.clipboardData.getData('text');\r\n            var wordArray = text.split(' ');\r\n            if(wordArray.length == this.word_count) {\r\n                this.words = wordArray\r\n            }\r\n        },\r\n        onInput() {\r\n            this.$emit('input', this.words.join(' '))\r\n        }\r\n    },    \r\n\r\n\ttemplate: `\r\n        <div>\r\n            <v-row no-gutters v-for=\"row in [...Array(rows).keys()]\">\r\n\r\n                <v-col\r\n                    v-for=\"col in [...Array(cols).keys()]\"\r\n                    cols=\"12\"\r\n                    sm=\"2\"                                    \r\n                >\r\n                    <div v-if=\"readonly\">\r\n                        <v-text-field \r\n                            :label=\"row * cols + col + 1\"\r\n                            :value=\"words[row * cols + col]\"\r\n                            hide-details\r\n                            outlined\r\n                            readonly\r\n                            class=\"ma-1\" />\r\n                    </div>\r\n\r\n                    <div v-else> \r\n                        <seed-autocomplete\r\n                            v-model=\"words[row * cols + col]\"\r\n                            :word_list=\"word_list\"\r\n                            :word_count=\"word_count\"\r\n                            :index=\"row * cols + col\"\r\n                            @paste=\"onPaste\"\r\n                            @input=\"onInput\"\r\n                            :disabled=\"disabled\"\r\n                            class=\"ma-1\" />\r\n                    </div>\r\n\r\n                </v-col>\r\n            \r\n            </v-row>\r\n\r\n        </div>\r\n    `    \r\n})"
  },
  {
    "path": "www/web-gui/public/explorer.js",
    "content": "\nVue.component('explore-menu', {\n\tdata() {\n\t\treturn {\n\t\t\tinput: null,\n\t\t\terror: null\n\t\t}\n\t},\n\tmethods: {\n\t\tsubmit() {\n\t\t\tconst hex = /[0-9A-Fa-f]{8}/g;\n\t\t\tif(this.input) {\n\t\t\t\tthis.error = null;\n\t\t\t\tif(this.input.startsWith(\"mmx1\")) {\n\t\t\t\t\tthis.$router.push(\"/explore/address/\" + this.input);\n\t\t\t\t}\n\t\t\t\telse if(hex.test(this.input)) {\n\t\t\t\t\tif(this.input.length == 64) {\n\t\t\t\t\t\tfetch(WAPI_URL + '/header?hash=' + this.input)\n\t\t\t\t\t\t\t.then(response => {\n\t\t\t\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\t\t\t\tthis.$router.push(\"/explore/block/hash/\" + this.input);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tthis.$router.push(\"/explore/transaction/\" + this.input);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if(this.input.length == 66) {\n\t\t\t\t\t\tthis.$router.push(\"/explore/farmer/\" + this.input);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.error = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(parseInt(this.input) != NaN) {\n\t\t\t\t\tthis.$router.push(\"/explore/block/height/\" + this.input);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.error = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-text-field class=\"mx-2\"\n\t\t\t\tv-model=\"input\"\n\t\t\t\t@keyup.enter=\"submit\"\n\t\t\t\t@click:append=\"submit\"\n\t\t\t\t:error=\"error\"\n\t\t\t\t:placeholder=\"$t('explore_menu.placeholder')\"\n\t\t\t\tappend-icon=\"mdi-magnify\"></v-text-field>\n\n\t\t\t<v-tabs class=\"mb-2\">\n\t\t\t\t<v-tab to=\"/explore/blocks\">{{ $t('explore_menu.blocks') }}</v-tab>\n\t\t\t\t<v-tab to=\"/explore/transactions\">{{ $t('explore_menu.transactions') }}</v-tab>\n\t\t\t\t<v-tab to=\"/explore/farmers\">{{ $t('explore_menu.farmers') }}</v-tab>\n\t\t\t</v-tabs>\n\t\t</div>\n\t`\n})\n\nVue.component('blocks-table', {\n\tprops: {\n\t\tdata: [],\n\t\tloaded: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('explore_blocks.height'), value: 'height', width: \"5%\"},\n\t\t\t\t{ text: \"VDF\", value: 'vdf_count' },\n\t\t\t\t{ text: this.$t('explore_blocks.tx'), value: 'tx_count' },\n\t\t\t\t{ text: this.$t('explore_blocks.k'), value: 'ksize' },\n\t\t\t\t{ text: this.$t('explore_blocks.score'), value: 'score' },\n\t\t\t\t{ text: this.$t('explore_blocks.reward'), value: 'reward' },\n\t\t\t\t{ text: \"TX Fees\", value: 'tx_fees' },\n\t\t\t\t{ text: this.$t('explore_blocks.size'), value: 'static_cost_ratio' },\n\t\t\t\t{ text: this.$t('explore_blocks.cost'), value: 'total_cost_ratio' },\n\t\t\t\t{ text: this.$t('explore_blocks.hash'), value: 'hash' },\n\t\t\t]\n\t\t}\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.height=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/block/height/' + item.height\">{{item.height}}</router-link>\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.vdf_count=\"{ item }\">\n\t\t\t\t+{{item.vdf_count}}\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.ksize=\"{ item }\">\n\t\t\t\tk{{item.ksize}}\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.reward=\"{ item }\">\n\t\t\t\t{{item.reward_addr ? (item.reward_amount.value).toFixed(3) + \" MMX\" : null}}\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.tx_fees=\"{ item }\">\n\t\t\t\t{{item.tx_count ? (item.tx_fees.value).toFixed(3) + \" MMX\" : null}}\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.static_cost_ratio=\"{ item }\">\n\t\t\t\t{{(item.static_cost_ratio * 100).toFixed(1)}}&nbsp;%\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.total_cost_ratio=\"{ item }\">\n\t\t\t\t{{(item.total_cost_ratio * 100).toFixed(1)}}&nbsp;%\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.hash=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/block/hash/' + item.hash\">{{get_short_hash(item.hash, 16)}}</router-link>\n\t\t\t</template>\n\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('explore-blocks', {\n\tprops: {\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\ttimer: null,\n\t\t\tloaded: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch(WAPI_URL + '/headers?limit=' + this.limit)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<blocks-table :data=\"data\" :loaded=\"loaded\"></blocks-table>\n\t\t`\n})\n\nVue.component('explore-transactions', {\n\tprops: {\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\ttimer: null,\n\t\t\tloaded: false\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('explore_transactions.height'), value: 'height' },\n\t\t\t\t{ text: this.$t('explore_transactions.type'), value: 'type' },\n\t\t\t\t{ text: this.$t('explore_transactions.fee'), value: 'fee' },\n\t\t\t\t{ text: this.$t('explore_transactions.n_in'), value: 'inputs.length' },\n\t\t\t\t{ text: this.$t('explore_transactions.n_out'), value: 'outputs.length' },\n\t\t\t\t{ text: this.$t('explore_transactions.n_op'), value: 'operations.length' },\n\t\t\t\t{ text: this.$t('explore_transactions.transaction_id'), value: 'transaction_id' },\n\t\t\t\t{ text: this.$t('account_tx_history.time'), value: 'time' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch(WAPI_URL + '/transactions?limit=' + this.limit)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\t\t\t\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.height=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/block/height/' + item.height\">{{item.height}}</router-link>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.type=\"{ item }\">\n\t\t\t\t{{item.note ? item.note : \"\"}}\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.fee=\"{ item }\">\n\t\t\t\t<b :class=\"{'red--text': item.did_fail}\">{{item.fee.value}}</b>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.transaction_id=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/transaction/' + item.id\">{{get_short_hash(item.id, 16)}}</router-link>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.time=\"{ item }\">\n\t\t\t\t{{new Date(item.time_stamp).toLocaleString()}}\n\t\t\t</template>\n\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('explore-farmers', {\n\tprops: {\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\ttimer: null,\n\t\t\tloaded: false\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('explore_farmers.no_blocks'), value: 'block_count'},\n\t\t\t\t{ text: this.$t('explore_farmers.farmer_key'), value: 'farmer_key'},\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch(WAPI_URL + '/farmers?limit=' + this.limit)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 30000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t</template>\n\t\t\t<template v-slot:item.farmer_key=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/farmer/' + item.farmer_key\">{{item.farmer_key}}</router-link>\n\t\t\t</template>\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('block-view', {\n\tprops: {\n\t\thash: String,\n\t\theight: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tloading: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tlet url = null;\n\t\t\tif(this.hash) {\n\t\t\t\turl = WAPI_URL + '/block?hash=' + this.hash;\n\t\t\t}\n\t\t\tif(this.height >= 0) {\n\t\t\t\turl = WAPI_URL + '/block?height=' + this.height;\n\t\t\t}\n\t\t\tif(url) {\n\t\t\t\tthis.loading = true;\n\t\t\t\tfetch(url)\n\t\t\t\t\t.then(response => {\n\t\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\t\tresponse.json()\n\t\t\t\t\t\t\t\t.then(data => {\n\t\t\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\t\t\tthis.data = data;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\tthis.data = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\twatch: {\n\t\thash() {\n\t\t\tthis.update();\n\t\t},\n\t\theight() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-toolbar dense flat class=\"pa-0 no-padding\">\n\t\t\t\t<template v-if=\"data\">\n\t\t\t\t\t<v-btn outlined :to=\"'/explore/block/hash/' + data.prev\"><v-icon>mdi-arrow-left</v-icon>{{ $t('block_view.previous') }}</v-btn>\n\t\t\t\t\t<v-spacer></v-spacer>\n\t\t\t\t\t<v-btn outlined :to=\"'/explore/block/height/' + (data.height + 1)\">{{ $t('block_view.next') }}<v-icon>mdi-arrow-right</v-icon></v-btn>\n\t\t\t\t</template>\n\n\t\t\t\t<template v-if=\"!data && height\">\n\t\t\t\t\t<div v-if=\"height > 0\">\n\t\t\t\t\t\t<v-btn outlined :to=\"'/explore/block/height/' + (height - 1)\"><v-icon>mdi-arrow-left</v-icon>{{ $t('block_view.previous') }}</v-btn>\n\t\t\t\t\t</div>\n\t\t\t\t\t<v-spacer></v-spacer>\n\t\t\t\t\t<v-btn outlined :to=\"'/explore/block/height/' + (height + 1)\">{{ $t('block_view.next') }}<v-icon>mdi-arrow-right</v-icon></v-btn>\n\t\t\t\t</template>\n\t\t\t\t<v-progress-linear :active=\"loading\" indeterminate absolute top></v-progress-linear>\n\t\t\t</v-toolbar>\n\n\t\t\t<v-card class=\"my-2\">\n\t\t\t<v-card-text>\n\t\t\t\t<template v-if=\"data\">\n\t\t\t\t\t<v-chip label>{{ $t('block_view.block') }}</v-chip>\n\t\t\t\t\t<v-chip label>{{ data.height }}</v-chip>\n\t\t\t\t\t<v-chip label>{{ data.hash }}</v-chip>\n\t\t\t\t</template>\n\t\t\t\t\t\t\t\n\t\t\t\t<v-alert\n\t\t\t\t\tborder=\"left\"\n\t\t\t\t\tcolored-border\n\t\t\t\t\ttype=\"error\"\n\t\t\t\t\tv-if=\"!data && !loading\"\n\t\t\t\t\televation=\"2\"\n\t\t\t\t\tclass=\"my-2\"\n\t\t\t\t>\n\t\t\t\t\t{{ $t('block_view.no_such_block') }}\n\t\t\t\t</v-alert>\n\t\n\t\t\t\t<template v-if=\"data\">\n\t\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t\t<template v-slot:default>\n\t\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.height') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.height}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.hash') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.hash}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.previous') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.prev}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.time') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{new Date(data.time_stamp).toLocaleString()}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<template v-if=\"data.reward_addr\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Reward Address</td>\n\t\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.reward_addr\">{{data.reward_addr}}</router-link></td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<template v-if=\"data.reward_contract\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Reward Contract</td>\n\t\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.reward_contract\">{{data.reward_contract}}</router-link></td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<template v-if=\"data.reward_account\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Farmer Address</td>\n\t\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.reward_account\">{{data.reward_account}}</router-link></td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Block Reward</td>\n\t\t\t\t\t\t\t\t\t\t<td><b>{{data.reward_amount.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">TX Fees</td>\n\t\t\t\t\t\t\t\t\t\t<td><b>{{data.tx_fees.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.tx_count') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.tx_count}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.time_diff') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.time_diff}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.space_diff') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.space_diff}}<template v-if=\"data.is_space_fork\"> (updated)</template></td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Reward Vote</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.reward_vote}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Reward Vote Sum</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.reward_vote_sum}} / {{data.reward_vote_count}} ({{(data.reward_vote_count / ((data.height % 8640) + 1) * 100).toFixed(1)}} %)</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Base Reward</td>\n\t\t\t\t\t\t\t\t\t\t<td><b>{{data.base_reward.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Avg. TX Fee</td>\n\t\t\t\t\t\t\t\t\t\t<td><b>{{data.average_txfee.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">VDF Height</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.vdf_height}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">VDF Count</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.vdf_count}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.vdf_iterations') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.vdf_iters}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<template v-for=\"(addr, index) in data.vdf_reward_addr\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Timelord [{{index}}]</td>\n\t\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + addr\">{{addr}}</router-link></td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<template v-if=\"data.vdf_reward_payout\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Timelord Reward</td>\n\t\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.vdf_reward_payout\">{{data.vdf_reward_payout}}</router-link></td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.k_size') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.ksize}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.proof_score') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.score}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">No. Proofs</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.proof.length}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Space Fork</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{data.space_fork_proofs}} / {{data.space_fork_len}}</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t<template v-if=\"data.proof[0]\">\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.plot_id') }}</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{{data.proof[0].plot_id}}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">Challenge</td>\n\t\t\t\t\t\t\t\t\t\t\t<td>{{data.proof[0].challenge}}</td>\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('block_view.farmer_key') }}</td>\n\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/farmer/' + data.farmer_key\">{{data.farmer_key}}</router-link></td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</v-simple-table>\n\t\t\t\t\t</v-card>\n\t\n\t\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t\t<v-simple-table v-if=\"data.tx_list.length\">\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th class=\"key-cell\"></th>\n\t\t\t\t\t\t\t\t\t<th>{{ $t('block_view.inputs') }}</th>\n\t\t\t\t\t\t\t\t\t<th>{{ $t('block_view.outputs') }}</th>\n\t\t\t\t\t\t\t\t\t<th>{{ $t('block_view.operations') }}</th>\n\t\t\t\t\t\t\t\t\t<th>{{ $t('block_view.transaction_id') }}</th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr v-for=\"(item, index) in data.tx_list\" :key=\"index\">\n\t\t\t\t\t\t\t\t\t<td class=\"key-cell\">TX[{{index}}]</td>\n\t\t\t\t\t\t\t\t\t<td>{{item.inputs.length + (item.exec_result ? item.exec_result.inputs.length : 0)}}</td>\n\t\t\t\t\t\t\t\t\t<td>{{item.outputs.length + (item.exec_result ? item.exec_result.outputs.length : 0)}}</td>\n\t\t\t\t\t\t\t\t\t<td>{{item.execute.length}}</td>\n\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/transaction/' + item.id\">{{item.id}}</router-link></td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</v-simple-table>\n\t\t\t\t\t</v-card>\n\t\t\t\t</template>\n\t\t\t</v-card-text>\n\t\t\t</v-card>\n\t\t</div>\n\t`\n})\n\nVue.component('transaction-view', {\n\tprops: {\n\t\tid: String\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\ttimer: null,\n\t\t\tloading: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tif(this.id) {\n\t\t\t\tthis.loading = true;\n\t\t\t\tfetch(WAPI_URL + '/transaction?id=' + this.id)\n\t\t\t\t\t.then(response => {\n\t\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\t\tresponse.json()\n\t\t\t\t\t\t\t\t.then(data => {\n\t\t\t\t\t\t\t\t\tfor(const op of data.operations) {\n\t\t\t\t\t\t\t\t\t\tdelete op.solution;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\t\t\tthis.data = data;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\tthis.data = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\twatch: {\n\t\tid() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-card class=\"my-2\">\n\t\t<v-progress-linear :active=\"loading\" indeterminate absolute top></v-progress-linear>\n\t\t<v-card-text>\n\t\t\t<v-chip label>{{ $t('transaction_view.transaction') }}</v-chip>\n\t\t\t<v-chip label>{{ id }}</v-chip>\n\t\t\t\t\t\t\t\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\tv-if=\"!data && !loading\"\n\t\t\t\televation=\"2\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('transaction_view.no_such_transaction') }}\n\t\t\t</v-alert>\n\t\n\t\t\t<template v-if=\"data\">\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.height') }}</td>\n\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t<template v-if=\"data.height != null\">\n\t\t\t\t\t\t\t\t\t<router-link :to=\"'/explore/block/height/' + data.height\">{{data.height}}</router-link>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<template v-if=\"data.height == null\"><i>{{ $t('common.pending') }}</i></template>\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.did_fail\" class=\"red--text\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.message') }}</td>\n\t\t\t\t\t\t\t<td>{{data.message}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.confirm\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.confirmed') }}</td>\n\t\t\t\t\t\t\t<td>{{data.confirm}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.expires < 4294967295\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.expires') }}</td>\n\t\t\t\t\t\t\t<td>{{data.expires}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.note') }}</td>\n\t\t\t\t\t\t\t<td>{{data.note}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.time\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.time') }}</td>\n\t\t\t\t\t\t\t<td>{{new Date(data.time_stamp).toLocaleString()}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.deployed\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.address') }}</td>\n\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.address\">{{data.address}}</router-link></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr v-if=\"data.sender\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.sender') }}</td>\n\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.sender\">{{data.sender}}</router-link></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.cost') }}</td>\n\t\t\t\t\t\t\t<td><b>{{data.cost.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.fee') }}</td>\n\t\t\t\t\t\t\t<td><b>{{data.fee.value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table v-if=\"data.inputs.length\">\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th class=\"key-cell\"></th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.amount') }}</th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.token') }}</th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.address') }}</th>\n\t\t\t\t\t\t\t<th>Memo</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr v-for=\"(item, index) in data.inputs\" :key=\"index\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.input') }}[{{index}}]</td>\n\t\t\t\t\t\t\t<td><b>{{item.value}}</b></td>\n\t\t\t\t\t\t\t<template v-if=\"item.is_native\">\n\t\t\t\t\t\t\t\t<td>{{item.symbol}}</td>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<template v-if=\"!item.is_native\">\n\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.contract\">{{item.is_nft ? \"[NFT]\" : item.symbol}}</router-link></td>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.address\">{{item.address}}</router-link></td>\n\t\t\t\t\t\t\t<td>{{item.memo}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table v-if=\"data.outputs.length\">\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th class=\"key-cell\"></th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.amount') }}</th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.token') }}</th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.address') }}</th>\n\t\t\t\t\t\t\t<th>Memo</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr v-for=\"(item, index) in data.outputs\" :key=\"index\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ $t('transaction_view.output') }}[{{index}}]</td>\n\t\t\t\t\t\t\t<td><b>{{item.value}}</b></td>\n\t\t\t\t\t\t\t<template v-if=\"item.is_native\">\n\t\t\t\t\t\t\t\t<td>{{item.symbol}}</td>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<template v-if=\"!item.is_native\">\n\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.contract\">{{item.is_nft ? \"[NFT]\" : item.symbol}}</router-link></td>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.address\">{{item.address}}</router-link></td>\n\t\t\t\t\t\t\t<td>{{item.memo}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\n\t\t\t\t<div class=\"my-2\" v-for=\"(op, index) in data.operations\" :key=\"index\">\t\t\t\t\n\t\t\t\t\t<v-chip label>Operation[{{index}}]</v-chip>\n\t\t\t\t\t<v-chip label>{{op.__type}}</v-chip>\n\t\t\t\t\t<object-table :data=\"op\" class=\"my-2\"></object-table>\n\t\t\t\t</div>\n\t\n\t\t\t\t<div class=\"my-2\" v-if=\"data.deployed\">\n\t\t\t\t\t<v-chip label>{{data.deployed.__type}}</v-chip>\n\t\t\t\t\t<object-table :data=\"data.deployed\" class=\"my-2\"></object-table>\n\t\t\t\t</div>\n\t\n\t\t\t</template>\n\t\t</v-card-text>\n\t\t</v-card>\n\t`\n})\n\nVue.component('farmer-view', {\n\tprops: {\n\t\tfarmer_key: String,\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tblocks: [],\n\t\t\ttimer: null,\n\t\t\tloaded: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch(WAPI_URL + '/farmer?id=' + this.farmer_key)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t});\n\t\t\tfetch(WAPI_URL + '/farmer/blocks?id=' + this.farmer_key + '&limit=' + this.limit)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.blocks = data;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 30000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-card class=\"my-2\">\n\t\t<v-card-text>\n\t\t\t<v-chip label>Farmer</v-chip>\n\t\t\t<v-chip label>{{farmer_key}}</v-chip>\n\t\t\t<template v-if=\"data\">\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">No. Blocks</td>\n\t\t\t\t\t\t\t<td>{{data.block_count}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">Total Rewards</td>\n\t\t\t\t\t\t\t<td><b>{{data.total_reward_value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th>Reward</th>\n\t\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.address') }}</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr v-for=\"item in data.rewards\" :key=\"item.address\">\n\t\t\t\t\t\t\t<td><b>{{item.value}}</b></td>\n\t\t\t\t\t\t\t<td>MMX</td>\n\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.address\">{{item.address}}</router-link></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\t\t</template>\n\t\t\t<blocks-table :data=\"blocks\" :loaded=\"loaded\"></blocks-table>\n\t\t</v-card-text>\n\t\t</v-card>\n\t`\n})\n\nVue.component('address-view', {\n\tprops: {\n\t\taddress: String\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tthis.loading = true;\n\t\t\tfetch(WAPI_URL + '/contract?id=' + this.address)\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tresponse.json()\n\t\t\t\t\t\t\t.then(data => {\n\t\t\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\t\t\tthis.data = data;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\tthis.data = null;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t},\n\twatch: {\n\t\taddress() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\ttemplate: `\n\t\t<v-card class=\"my-2\">\n\t\t<v-card-text>\n\t\t\t<v-chip label>{{ $t('common.address') }}</v-chip>\n\t\t\t<v-chip label>{{ address }}</v-chip>\n\n\t\t\t<balance-table :address=\"address\" :show_empty=\"true\" class=\"my-2\"></balance-table>\n\n\t\t\t<div v-if=\"data\">\n\t\t\t\t<v-chip label class=\"my-2\">{{ data.__type }}</v-chip>\n\t\t\t\t<object-table :data=\"data\"></object-table>\n\t\t\t</div>\n\n\t\t\t<address-history-table :address=\"address\" :limit=\"200\" :show_empty=\"false\" class=\"my-2\"></address-history-table>\n\t\t</v-card-text>\n\t\t</v-card>\n\t`\n})\n\nVue.component('address-history-table', {\n\tprops: {\n\t\taddress: String,\n\t\tlimit: Number,\n\t\tshow_empty: Boolean\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\tloaded: false,\n\t\t\ttimer: null\t\t\n\t\t}\n\t},\t\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('address_history_table.height'), value: 'height'},\n\t\t\t\t{ text: this.$t('address_history_table.type'), value: 'type'},\n\t\t\t\t{ text: this.$t('address_history_table.amount'), value: 'amount'},\n\t\t\t\t{ text: this.$t('address_history_table.token'), value: 'token'},\n\t\t\t\t{ text: \"Transaction ID\", value: 'txid'},\n\t\t\t\t{ text: \"Memo\", value: 'memo'},\n\t\t\t\t{ text: this.$t('address_history_table.time'), value: 'time'},\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch(WAPI_URL + '/address/history?limit=' + this.limit + '&id=' + this.address)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t\tthis.data = data;\n\t\t\t\t}).catch(() => {\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\twatch: {\n\t\taddress() {\n\t\t\tthis.update();\n\t\t},\n\t\tlimit() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 60000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t\tv-if=\"!loaded || loaded && (data.length || show_empty)\"\n\t\t>\n\t\t\t<template v-slot:item.height=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/block/height/' + item.height\">{{item.height}}</router-link>\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.type=\"{ item }\">\n\t\t\t\t<span :class=\"get_tx_type_color(item.type, $vuetify.theme.dark)\">{{item.type}}</span>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.amount=\"{ item }\">\n\t\t\t\t<b>{{ item.value }}</b>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.token=\"{ item }\">\n\t\t\t\t<template v-if=\"item.is_native\">\n\t\t\t\t\t{{item.symbol}}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<router-link :to=\"'/explore/address/' + item.contract\">{{item.is_nft ? \"[NFT]\" : item.symbol}}</router-link>\n\t\t\t\t</template>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.memo=\"{ item }\">\n\t\t\t\t<span style=\"word-break: break-all;\">{{ item.memo }}</span>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.txid=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/transaction/' + item.txid\">{{get_short_hash(item.txid)}}</router-link>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.time=\"{ item }\">\n\t\t\t\t<span class=\"text-no-wrap\">{{ new Date(item.time_stamp).toLocaleString() }}</span>\n\t\t\t</template>\n\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('object-table', {\n\tprops: {\n\t\tdata: Object\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttt: [],\n\t\t}\n\t},\n\tmethods: {\n\t\tstringify(value) {\n\t\t\treturn JSON.stringify(value, null, 4);\n\t\t}\n\t},\n\ttemplate: `\n\t\t<v-card>\n\t\t\t<v-simple-table class=\"object-table\">\n\t\t\t\t<tbody>\n\t\t\t\t\t<template v-for=\"(value, key) in data\" :key=\"key\">\n\t\t\t\t\t\t<tr v-if=\"key != '__type'\">\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{ key }}</td>\n\t\t\t\t\t\t\t<td v-if=\"value instanceof Object && value.length > 0\">\n\n\t\t\t\t\t\t\t\t\t<v-btn-toggle v-model=\"tt[key]\" class=\"float-right mr-n4\">\n\t\t\t\t\t\t\t\t\t\t<v-btn fab x-small> \n\t\t\t\t\t\t\t\t\t\t\t<v-icon v-if=\"tt[key] != 0\">mdi-arrow-expand</v-icon>\n\t\t\t\t\t\t\t\t\t\t\t<v-icon v-else>mdi-arrow-collapse</v-icon>\n\t\t\t\t\t\t\t\t\t\t</v-btn>\n\t\t\t\t\t\t\t\t\t</v-btn-toggle>\t\t\t\t\n\t\t\n\n\t\t\t\t\t\t\t\t<div v-if=\"tt[key] != 0\" style=\"overflow-wrap: anywhere;\">\n\t\t\t\t\t\t\t\t\t{{ value }}\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t<div v-else>\n\t\t\t\t\t\t\t\t\t<div style=\"white-space: pre-wrap; overflow-wrap: anywhere;\">{{ stringify(value) }}</div>\n\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t<td v-else>\n\t\t\t\t\t\t\t\t{{ value }}\n\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</template>\n\t\t\t\t</tbody>\n\t\t\t</v-simple-table>\n\t\t</v-card>\n\t\t`\n})\n"
  },
  {
    "path": "www/web-gui/public/farmer.js",
    "content": "\nVue.component('farmer-menu', {\n\ttemplate: `\n\t\t<v-tabs>\n\t\t\t<v-tab to=\"/farmer/plots\">{{ $t('farmer_menu.plots') }}</v-tab>\n\t\t\t<v-tab to=\"/farmer/plotnfts\">NFTs</v-tab>\n\t\t\t<v-tab to=\"/farmer/blocks\">{{ $t('farmer_menu.blocks') }}</v-tab>\n\t\t\t<v-tab to=\"/farmer/proofs\">{{ $t('farmer_menu.proofs') }}</v-tab>\n\t\t</v-tabs>\n\t\t`\n})\n\nVue.component('farmer-info', {\n\tdata() {\n\t\treturn {\n\t\t\tinfo: null,\n\t\t\tsummary: null\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/farm/info')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.info = data);\n\t\t\tfetch('/wapi/farm/blocks/summary?since=10000')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.summary = data);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-row class=\"my-2 py-0\">\n\t\t\t\t<v-col cols=\"12\" class=\"my-0 py-0\">\n\t\t\t\t\t<v-card min-height=\"90\">\n\t\t\t\t\t\t<v-card-title>\n\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"info\">{{ (info.total_bytes / Math.pow(1000, 4)).toFixed(3) }} TB</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"></v-skeleton-loader>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\t{{ $t('farmer_info.physical_size') }}\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"info\">{{ (info.total_bytes_effective / Math.pow(1000, 4)).toFixed(3) }} TBe</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"></v-skeleton-loader>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\tEffective Size\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"summary\">{{ summary.num_blocks }}</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"></v-skeleton-loader>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\tNo. Blocks\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"summary\">{{ (summary.total_rewards_value).toFixed(3) }} MMX</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"></v-skeleton-loader>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\tTotal Rewards\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t</v-card-title>\n\t\t\t\t\t</v-card>\n\t\t\t\t</v-col>\n\t\t\t</v-row>\n\t\t</div>\n\t\t`\n})\n\nVue.component('farmer-rewards', {\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tnetspace: null,\t\t// [GB]\n\t\t\tfarm_size: null,\t// [GB]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/farm/blocks/summary?since=10000')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.data = data);\n\t\t\tfetch('/wapi/node/info')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.netspace = data.total_space);\n\t\t\tfetch('/wapi/farm/info')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.farm_size = data.total_bytes_effective / 1e9);\n\t\t}\n\t},\n\tcomputed: {\n\t\test_time_to_win() {\n\t\t\tif(this.netspace && this.farm_size) {\n\t\t\t\tconst est_min = (this.netspace / this.farm_size) / 6;\n\t\t\t\tif(est_min <= 60) {\n\t\t\t\t\treturn Math.floor(est_min) + \" minutes\";\n\t\t\t\t}\n\t\t\t\tconst est_hours = est_min / 60;\n\t\t\t\tif(est_hours <= 24) {\n\t\t\t\t\treturn Math.floor(est_hours) + \" hours and \" + Math.floor(est_min % 60) + \" minutes\";\n\t\t\t\t}\n\t\t\t\tconst est_days = est_hours / 24;\n\t\t\t\treturn Math.floor(est_days) + \" days and \" + Math.floor(est_hours % 24) + \" hours\";\n\t\t\t}\n\t\t\treturn \"N/A\";\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 30000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-card class=\"my-2\">\n\t\t<v-card-text>\n\t\t\t<template v-if=\"data\">\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">No. Blocks</td>\n\t\t\t\t\t\t\t<td>{{data.num_blocks}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">Last Height</td>\n\t\t\t\t\t\t\t<td>{{data.last_height > 0 ? data.last_height : \"N/A\"}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">Total Rewards</td>\n\t\t\t\t\t\t\t<td><b>{{data.total_rewards_value}}</b>&nbsp; MMX</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">Time to win</td>\n\t\t\t\t\t\t\t<td>{{est_time_to_win}} (on average)</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th colspan=\"2\">Reward</th>\n\t\t\t\t\t\t\t<th>{{ $t('transaction_view.address') }}</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr v-for=\"item in data.rewards\" :key=\"item.address\">\n\t\t\t\t\t\t\t<td class=\"collapsing\"><b>{{item.value}}</b></td>\n\t\t\t\t\t\t\t<td>MMX</td>\n\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.address\">{{item.address}}</router-link></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card>\n\t\t\t</template>\n\t\t</v-card-text>\n\t\t</v-card>\n\t\t`\n})\n\nVue.component('farmer-plots', {\n\tdata() {\n\t\treturn {\n\t\t\tloaded: false,\n\t\t\tplot_count: [],\n\t\t\tharvester_bytes: []\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('farmer_plots.type'), value: 'ksize', width: \"20%\" },\n\t\t\t\t{ text: this.$t('farmer_plots.count'), value: 'count' },\n\t\t\t]\n\t\t},\n\t\theaders2() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('common.harvester'), value: 'name' },\n\t\t\t\t{ text: this.$t('farmer_info.physical_size'), value: 'bytes' },\n\t\t\t\t{ text: \"Effective Size\", value: 'effective' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/farm/info')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.plot_count = [];\n\t\t\t\t\tfor(const entry of data.plot_count) {\n\t\t\t\t\t\tthis.plot_count.push({ksize: entry[0], count: entry[1]});\n\t\t\t\t\t}\n\t\t\t\t\tthis.harvester_bytes = [];\n\t\t\t\t\tfor(const entry of data.harvester_bytes) {\n\t\t\t\t\t\tthis.harvester_bytes.push({name: entry[0], bytes: entry[1][0], effective: entry[1][1]});\n\t\t\t\t\t}\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t},\n\t\treload() {\n\t\t\tfetch('/api/harvester/reload').then(this.update());\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-row class=\"my-2\">\n\t\t\t\t<v-col cols=\"4\">\n\t\t\t\t\t<v-data-table\n\t\t\t\t\t\t:headers=\"headers\"\n\t\t\t\t\t\t:items=\"plot_count\"\n\t\t\t\t\t\t:loading=\"!loaded\"\n\t\t\t\t\t\thide-default-footer\n\t\t\t\t\t\tdisable-sort\n\t\t\t\t\t\tdisable-pagination\n\t\t\t\t\t\tclass=\"elevation-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template v-slot:item.ksize=\"{ item }\">\n\t\t\t\t\t\t\tK{{item.ksize}}\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<template v-slot:item.count=\"{ item }\">\n\t\t\t\t\t\t\t<b>{{item.count}}</b>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</v-data-table>\n\t\t\t\t</v-col>\n\t\t\t\t<v-col>\n\t\t\t\t\t<v-data-table\n\t\t\t\t\t\t:headers=\"headers2\"\n\t\t\t\t\t\t:items=\"harvester_bytes\"\n\t\t\t\t\t\t:loading=\"!loaded\"\n\t\t\t\t\t\thide-default-footer\n\t\t\t\t\t\tdisable-sort\n\t\t\t\t\t\tdisable-pagination\n\t\t\t\t\t\tclass=\"elevation-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template v-slot:item.bytes=\"{ item }\">\n\t\t\t\t\t\t\t<b>{{(item.bytes / Math.pow(1000, 4)).toFixed(3)}}</b> TB\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<template v-slot:item.effective=\"{ item }\">\n\t\t\t\t\t\t\t<b>{{(item.effective / Math.pow(1000, 4)).toFixed(3)}}</b> TBe\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</v-data-table>\n\t\t\t\t</v-col>\n\t\t\t</v-row>\n\t\t\t<v-btn outlined @click=\"reload\">{{ $t('farmer_plots.reload_plots') }}</v-btn>\n\t\t</div>\n\t\t`\n})\n\nVue.component('farmer-plot-dirs', {\n\tdata() {\n\t\treturn {\n\t\t\tloaded: false,\n\t\t\tdata: []\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('farmer_plot_dirs.path'), value: 'item' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/farm/info')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data.plot_dirs;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:item.item=\"{ item }\">\n\t\t\t\t{{item}}\n\t\t\t</template>\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('farmer-blocks', {\n\tprops: {\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloaded: false,\n\t\t\tdata: []\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('farmer_blocks.height'), value: 'height' },\n\t\t\t\t{ text: \"TX\", value: 'tx_count' },\n\t\t\t\t{ text: \"K\", value: 'ksize' },\n\t\t\t\t{ text: this.$t('farmer_blocks.score'), value: 'score' },\n\t\t\t\t{ text: this.$t('farmer_blocks.reward'), value: 'reward' },\n\t\t\t\t{ text: this.$t('farmer_blocks.tx_fees'), value: 'tx_fees' },\n\t\t\t\t{ text: this.$t('farmer_blocks.time'), value: 'time' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/farm/blocks?limit=' + this.limit)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 30000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.height=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/block/height/' + item.height\">{{item.height}}</router-link>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.reward=\"{ item }\">\n\t\t\t\t<b>{{item.reward_amount.value}}</b> MMX\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.tx_fees=\"{ item }\">\n\t\t\t\t<b>{{item.tx_fees.value}}</b> MMX\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.time=\"{ item }\">\n\t\t\t\t{{new Date(item.time * 1000).toLocaleString()}}\n\t\t\t</template>\n\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('farmer-proofs', {\n\tprops: {\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloaded: false,\n\t\t\tdata: []\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: \"VDF height\", value: 'vdf_height' },\n\t\t\t\t{ text: this.$t('farmer_proofs.harvester'), value: 'harvester' },\n\t\t\t\t{ text: this.$t('farmer_proofs.score'), value: 'proof.score' },\n\t\t\t\t{ text: this.$t('farmer_proofs.sdiff'), value: 'proof.difficulty' },\n\t\t\t\t{ text: this.$t('farmer_proofs.time'), value: 'lookup_time_ms' },\n\t\t\t\t{ text: this.$t('farmer_proofs.plot_id'), value: 'proof.plot_id' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/farm/proofs?limit=' + this.limit)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.height=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/block/height/' + item.height\">{{item.height}}</router-link>\n\t\t\t</template>\t\n\n\t\t\t<template v-slot:item.lookup_time_ms=\"{ item }\">\n\t\t\t\t{{(item.lookup_time_ms / 1000).toFixed(3)}} sec\n\t\t\t</template>\n\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('farmer-plotnfts', {\n\tdata() {\n\t\treturn {\n\t\t\tlist: null,\n\t\t\ttimer: null,\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/farm/info')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.list = data.pool_info);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\ttimer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<template v-for=\"item in list\">\n\t\t\t\t<plotnft-info :address=\"item[0]\" :data=\"item[1]\"></plotnft-info>\n\t\t\t</template>\n\t\t\t<template v-if=\"list && !list.length\">\n\t\t\t\t<v-alert type=\"warning\" border=\"left\" colored-border>No NFT plots found</v-alert>\n\t\t\t\t<v-alert type=\"info\" border=\"left\" colored-border>Need to create a PlotNFT in Wallet first to plot NFT plots.</v-alert>\n\t\t\t</template>\n\t\t</div>\n\t\t`\n})\n\nVue.component('plotnft-info', {\n\tprops: {\n\t\taddress: String,\n\t\tdata: Object,\n\t},\n\ttemplate: `\n\t\t<v-card class=\"my-2\">\n\t\t\t<v-card-title>\n\t\t\t\t<template v-if=\"data.is_plot_nft\">{{data.name}}</template>\n\t\t\t\t<template v-else>Invalid PlotNFT</template>\n\t\t\t</v-card-title>\n\t\t\t<v-card-text>\n\t\t\t\t<v-simple-table>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td class=\"key-cell\">Address</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t{{address}}\n\t\t\t\t\t\t\t<template v-if=\"navigator.clipboard\">\n\t\t\t\t\t\t\t\t<v-btn @click=\"navigator.clipboard.writeText(address)\" text icon>\n\t\t\t\t\t\t\t\t\t<v-icon small class=\"pr-0\">mdi-content-copy</v-icon>\n\t\t\t\t\t\t\t\t</btn>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td class=\"key-cell\">Pool Server</td>\n\t\t\t\t\t\t<td v-if=\"data.server_url\">{{data.server_url}}</td>\n\t\t\t\t\t\t<td v-else>N/A (solo farming)</td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr v-if=\"data.pool_target\">\n\t\t\t\t\t\t<td class=\"key-cell\">Pool Target</td>\n\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + data.pool_target\">{{data.pool_target}}</router-link></td>\n\t\t\t\t\t<tr>\n\t\t\t\t\t<tr v-if=\"data.server_url\">\n\t\t\t\t\t\t<td class=\"key-cell\">Partial Difficulty</td>\n\t\t\t\t\t\t<td>{{data.partial_diff}}</td>\n\t\t\t\t\t<tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td class=\"key-cell\">Plot Count</td>\n\t\t\t\t\t\t<td>{{data.plot_count}}</td>\n\t\t\t\t\t<tr>\n\t\t\t\t\t</tbody>\n\t\t\t\t</v-simple-table>\n\t\t\t</v-card-text>\n\t\t</v-card>\n\t`\n});\n\n"
  },
  {
    "path": "www/web-gui/public/i18n.utils.js",
    "content": "\nconst availableLanguages = [\n    { code: \"en\", language: \"English\" },\n    { code: \"id\", language: \"Bahasa Indonesia\" },\n    { code: \"de\", language: \"Deutsch\" },\n    { code: \"es\", language: \"Español\" },\n    { code: \"nl\", language: \"Nederlands\" },\n    { code: \"pt\", language: \"Português\" },\n    { code: \"ru\", language: \"Русский\" },\n    { code: \"uk\", language: \"Українська\" },\n    { code: \"zh\", language: \"简体中文\" }\n];\n\nconst defaultLocale = 'en';\nconst loadedLanguages = ['en']\n\nconst i18n = new VueI18n({\n    globalInjection: true,\n    legacy: false,\n    locale: 'en',\n    fallbackLocale: 'en',\n    messages: { \n        'en': mergeDeep({}, commonLocale, enLocale)\n    }\n})\n\nfunction setI18nLanguage(locale) {\n\n    i18n.locale = locale\n\n    /**\n     * NOTE:\n     * If you need to specify the language setting for headers, such as the `fetch` API, set it here.\n     * The following is an example for axios.\n     *\n     * axios.defaults.headers.common['Accept-Language'] = locale\n     */\n    document.querySelector('html').setAttribute('lang', locale)\n}\n\n\nfunction isObject(item) {\n    return (item && typeof item === 'object' && !Array.isArray(item));\n}\n  \nfunction mergeDeep(target, ...sources) {\n\n    if (!sources.length) return target;\n    const source = sources.shift();\n\n    if (isObject(target) && isObject(source)) {\n        for (const key in source) {\n            if (isObject(source[key])) {\n                if (!target[key]) Object.assign(target, {\n                    [key]: {}\n                });\n                mergeDeep(target[key], source[key]);\n            } else {\n                Object.assign(target, {\n                    [key]: source[key]\n                });\n            }\n        }\n    }\n\n    return mergeDeep(target, ...sources);\n}\n\n\nfunction customFallback(msg) {\n    let result = mergeDeep({}, commonLocale, enLocale, msg)\n    return result;\n}   \n\nfunction loadLanguageAsync(locale) {\n    //console.log('loadLanguageAsync', locale);\n\n\t//if (i18n.locale === locale) {\n\t//\treturn Promise.resolve(setI18nLanguage(locale))\n\t//}\n\n\tif (loadedLanguages.includes(locale)) {\n\t\treturn Promise.resolve(setI18nLanguage(locale))\n\t}\n\n    if (availableLanguages.filter( lang => lang.code == locale ).length > 0 ) {\n        return fetch(`./locales/${locale}.json`).then(\n            response => response.json()\n        ).then(\n            messages => {            \n                messages = customFallback(messages);\n                i18n.setLocaleMessage(locale, messages);\n                //console.log('setLocaleMessage', locale, messages);\n                loadedLanguages.push(locale)\n                return setI18nLanguage(locale)\n            },\n        )\n    } else {\n        return Promise.resolve(setI18nLanguage(locale))\n    }\n}\n\n"
  },
  {
    "path": "www/web-gui/public/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <title>MMX-GUI</title>\n    <meta charset=\"utf-8\">\n    <link rel=\"icon\" type=\"image/x-icon\" href=\"/gui/favicon.ico\">\n\n    <link href=\"assets/fonts/roboto/roboto.css\" rel=\"stylesheet\">\n    <link href=\"assets/fonts/materialdesignicons/materialdesignicons.min.css\" rel=\"stylesheet\">\n    <link href=\"assets/vuetify/vuetify.min.css\" rel=\"stylesheet\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui\">\n\n    <script src=\"assets/vuetify/vue.min.js\"></script>\n    <script src=\"assets/vuetify/vue-i18n.min.js\"></script>\n    <script src=\"assets/vuetify/vue-router.min.js\"></script>\n    <script src=\"assets/vuetify/vuetify.min.js\"></script>\n\n    <script src=\"assets/plotly-2.9.0.min.js\"></script>\n    <script src=\"vue-plotly.js\" defer></script>\n\n    <script src=\"index.js\" defer></script>\n    <script src=\"node.js\" defer></script>\n    <script src=\"farmer.js\" defer></script>\n    <script src=\"wallet.js\" defer></script>\n    <script src=\"explorer.js\" defer></script>\n    <script src=\"market.js\" defer></script>\n    <script src=\"swap.js\" defer></script>\n    <script src=\"settings.js\" defer></script>\n        \n    <script src=\"locales/common.js\" defer></script>\n    <script src=\"locales/en.js\" defer></script>\n    <script src=\"i18n.utils.js\" defer></script>\n    \n    <script src=\"components/seed.js\" defer></script>\n\n    <script src=\"mount.js\" defer></script>\n\n\n    <style>\n        .theme--light.v-data-table tbody tr:nth-of-type(odd) td {\n            background-color: rgba(0, 0, 0, .03);\n        }\n        .theme--dark.v-data-table tbody tr:nth-of-type(odd) td {\n            background-color: rgba(0, 0, 0, .5);\n        }\n        .v-data-table.object-table tr:hover {\n            background: transparent !important;\n        }\n\n        .no-padding .v-toolbar__content {\n            padding-left: 0px;\n            padding-right: 0px;\n        }\n        .text-align-right .v-text-field__slot input {\n            text-align: right;\n        }\n        .key-cell {\n            min-width: 150px; \n            width: 5%;\n        }\n        .theme--dark .key-cell {\n            background-color: black !important;\n        }\n        .theme--light .key-cell {\n            background-color: #EEEEEE !important;\n        }\n        .v-tabs-bar {\n            background-color: transparent !important;\n        }\n\n    </style>\n</head>\n<body>\n    <div id=\"app\">\n        <app></app>\n    </div>\n</body>\n</html>\n"
  },
  {
    "path": "www/web-gui/public/index.js",
    "content": "\nconst WAPI_URL = \"/wapi\";\n\nfunction validate_address(address) {\n\treturn address && address.length == 62 && address.startsWith(\"mmx1\");\n}\n\nfunction get_short_addr(address, length) {\n\tif(!length) {\n\t\tlength = 10;\n\t}\n\treturn address.substring(0, length) + '...' + address.substring(62 - length);\n}\n\nfunction get_short_hash(hash, length) {\n\tif(!length) {\n\t\tlength = 10;\n\t}\n\treturn hash.substring(0, length) + '...' + hash.substring(64 - length);\n}\n\nfunction validate_amount(value) {\n\tif(value && value.length && value.match(/^(\\d+([.,]\\d*)?)$/)) {\n\t\treturn true;\n\t}\n\treturn \"invalid amount\";\n}\n\nfunction to_string_hex(number) {\n    let hex = BigInt(number).toString(16);\n    if(hex.length % 2) {\n        hex = '0' + hex; // Ensure even length\n    }\n    return '0x' + hex;\n}\n\nconst intl_format = new Intl.NumberFormat(navigator.language, {minimumFractionDigits: 1, maximumFractionDigits: 12});\n\nfunction amount_format(value) {\n\treturn intl_format.format(value);\n}\n\nfunction get_tx_type_color(type, dark = false) {\n\tif(type == \"REWARD\") return dark ? \"lime--text\" : \"lime--text text--darken-2\";\n\tif(type == \"RECEIVE\" || type == \"REWARD\" || type == \"VDF_REWARD\") return \"green--text\";\n\tif(type == \"SPEND\") return \"red--text\";\n\tif(type == \"TXFEE\") return \"grey--text\";\n\treturn \"\";\n}\n\nfunction get_active_wallet() {\n\tconst value = localStorage.getItem('active_wallet');\n\treturn value != null ? parseInt(value) : null;\n}\n\nconst MMX_ADDR = \"mmx1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqdgytev\";\n\nconst Wallet = {\n\ttemplate: '<wallet-summary></wallet-summary>'\n}\nconst WalletCreate = {\n\ttemplate: '<create-wallet></create-wallet>'\n}\nconst Account = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<v-card>\n\t\t\t<v-card-text>\n\t\t\t\t<account-header :index=\"index\"></account-header>\n\t\t\t\t<account-menu :index=\"index\" class=\"my-2\"></account-menu>\n\t\t\t\t<router-view :index=\"index\"></router-view>\n\t\t\t</v-card-text>\n\t\t</v-card>\n\t`\n}\nconst AccountHome = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<account-balance :index=\"index\" class=\"my-2\"></account-balance>\n\t\t\t<account-history :index=\"index\" :limit=\"50\"></account-history>\n\t\t</div>\n\t`\n}\nconst AccountNFTs = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<nft-table :index=\"index\"></nft-table>\n\t`\n}\nconst AccountContracts = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<create-contract-menu :index=\"index\"></create-contract-menu>\n\t\t\t<account-contracts :index=\"index\"></account-contracts>\n\t\t</div>\n\t`\n}\nconst AccountSend = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<account-send-form :index=\"index\" :target_=\"$route.params.target\"></account-send-form>\n\t`\n}\nconst AccountSendFrom = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<account-send-form :index=\"index\" :source_=\"$route.params.source\"></account-send-form>\n\t`\n}\nconst AccountSplit = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<account-split-form :index=\"index\"></account-split-form>\n\t`\n}\nconst AccountOffer = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<account-offer-form :index=\"index\"></account-offer-form>\n\t`\n}\nconst AccountHistory = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<account-history-form :index=\"index\" :limit=\"200\"></account-history-form>\n\t`\n}\nconst AccountLog = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<account-tx-history :index=\"index\" :limit=\"200\"></account-tx-history>\n\t`\n}\nconst AccountPlotNFTs = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<account-plotnfts :index=\"index\"></account-plotnfts>\n\t\t\t<create-plotnft :index=\"index\"></create-plotnft>\n\t\t</div>\n\t`\n}\nconst AccountLiquid = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<account-liquid :index=\"index\" :limit=\"1000\"></account-liquid>\n\t`\n}\nconst AccountDetails = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<account-details :index=\"index\"></account-details>\n\t`\n}\nconst AccountOptions = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<account-actions :index=\"index\"></account-actions>\n\t`\n}\nconst AccountCreateLocked = {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<create-locked-contract :index=\"index\"></create-locked-contract>\n\t`\n}\n\nconst Market = {\n\tprops: {\n\t\twallet: Number,\n\t\tbid: null,\n\t\task: null,\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<market-menu :wallet_=\"wallet\" :page=\"$route.meta.page\"></market-menu>\n\t\t\t<router-view :key=\"$route.path\" :wallet=\"wallet\" :bid=\"bid\" :ask=\"ask\"></router-view>\n\t\t</div>\n\t\t`\n}\nconst MarketOffers = {\n\tprops: {\n\t\twallet: Number,\n\t\tbid: null,\n\t\task: null,\n\t},\n\ttemplate: `\n\t\t<market-offers :wallet=\"wallet\" :bid=\"bid\" :ask=\"ask\" :limit=\"200\"></market-offers>\n\t\t`\n}\nconst MarketHistory = {\n\tprops: {\n\t\tbid: null,\n\t\task: null,\n\t},\n\ttemplate: `\n\t\t<market-history :bid=\"bid\" :ask=\"ask\" :limit=\"200\"></market-history>\n\t\t`\n}\n\nconst Swap = {\n\tprops: {\n\t\taddress: null,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\twallet: null,\n\t\t}\n\t},\n\ttemplate: `\n\t\t<v-card>\n\t\t\t<v-card-text>\n\t\t\t\t<wallet-menu @wallet-select=\"(i) => wallet=i\"></wallet-menu>\n\t\t\t\t<template v-if=\"address\">\n\t\t\t\t\t<swap-info :address=\"address\"></swap-info>\n\t\t\t\t\t<swap-sub-menu :address=\"address\"></swap-sub-menu>\n\t\t\t\t</template>\n\t\t\t\t<div class=\"my-2\">\n\t\t\t\t\t<router-view :address=\"address\" :wallet=\"wallet\"></router-view>\n\t\t\t\t</div>\n\t\t\t</v-card-text>\n\t\t</v-card>\n\t\t`\n}\nconst SwapMarket = {\n\ttemplate: `\n\t\t<div>\n\t\t\t<swap-menu></swap-menu>\n\t\t\t<swap-list :token=\"$route.params.token\" :currency=\"$route.params.currency\" :limit=\"200\"></swap-list>\n\t\t</div>\n\t\t`\n}\nconst SwapTrade = {\n\tprops: {\n\t\twallet: null,\n\t\taddress: null\n\t},\n\ttemplate: `\n\t\t<swap-trade :wallet=\"wallet\" :address=\"address\"></swap-trade>\n\t\t`\n}\nconst SwapHistory = {\n\tprops: {\n\t\taddress: null\n\t},\n\ttemplate: `\n\t\t<swap-history :address=\"address\" :limit=\"200\"></swap-history>\n\t\t`\n}\nconst SwapLiquid = {\n\tprops: {\n\t\twallet: null,\n\t\taddress: null\n\t},\n\ttemplate: `\n\t\t<swap-liquid :wallet=\"wallet\" :address=\"address\"></swap-liquid>\n\t\t`\n}\n\nconst SwapPool = {\n\tprops: {\n\t\taddress: null\n\t},\n\ttemplate: `\n\t\t<swap-pool-info :address=\"address\"></swap-pool-info>\n\t\t`\n}\n\nconst Explore = {\n\ttemplate: `\n\t\t<div>\n\t\t\t<explore-menu></explore-menu>\n\t\t\t<router-view></router-view>\n\t\t<div>\n\t`\n}\nconst ExploreBlocks = {\n\ttemplate: `\n\t\t<explore-blocks :limit=\"100\"></explore-blocks>\n\t`\n}\nconst ExploreTransactions = {\n\ttemplate: `\n\t\t<explore-transactions :limit=\"100\"></explore-transactions>\n\t`\n}\nconst ExploreFarmers = {\n\ttemplate: `\n\t\t<explore-farmers :limit=\"100\"></explore-farmers>\n\t`\n}\nconst ExploreBlock = {\n\ttemplate: `\n\t\t<block-view :hash=\"$route.params.hash\" :height=\"parseInt($route.params.height)\"></block-view>\n\t`\n}\nconst ExploreFarmer = {\n\ttemplate: `\n\t\t<farmer-view :farmer_key=\"$route.params.id\" limit=\"100\"></farmer-view>\n\t`\n}\nconst ExploreAddress = {\n\ttemplate: `\n\t\t<address-view :address=\"$route.params.address\"></address-view>\n\t`\n}\nconst ExploreTransaction = {\n\ttemplate: `\n\t\t<transaction-view :id=\"$route.params.id\"></transaction-view>\n\t`\n}\n\nconst NodeView = {\n\ttemplate: `\n\t\t<div>\n\t\t\t<node-info></node-info>\n\t\t\t<farmer-info v-if=\"$root.farmer\"></farmer-info>\n\t\t\t<node-menu class=\"mt-4\"></node-menu>\n\t\t\t<router-view class=\"mt-2\"></router-view>\n\t\t</div>\n\t`\n}\nconst NodeBlocks = {\n\ttemplate: `\n\t\t<explore-blocks :limit=\"20\"></explore-blocks>\n\t`\n}\nconst NodeLog = {\n\ttemplate: `\n\t\t<node-log></node-log>\n\t`\n}\nconst NodePeers = {\n\ttemplate: `\n\t\t<node-peers></node-peers>\n\t`\n}\nconst NodeNetspace = {\n\ttemplate: `\n\t\t<netspace-graph :limit=\"1000\" :step=\"90\"></netspace-graph>\n\t`\n}\nconst NodeVDFSpeed = {\n\ttemplate: `\n\t\t<vdf-speed-graph :limit=\"1000\" :step=\"90\"></vdf-speed-graph>\n\t`\n}\nconst NodeBlockReward = {\n\ttemplate: `\n\t\t<block-reward-graph :limit=\"1000\" :step=\"90\"></block-reward-graph>\n\t`\n}\n\nconst Farmer = {\n\ttemplate: `\n\t\t<div>\n\t\t\t<farmer-info></farmer-info>\n\t\t\t<farmer-rewards></farmer-rewards>\n\t\t\t<farmer-menu class=\"mt-4\"></farmer-menu>\n\t\t\t<router-view class=\"mt-2\"></router-view>\n\t\t</div>\n\t`\n}\nconst FarmerBlocks = {\n\ttemplate: `\n\t\t<farmer-blocks limit=\"50\"></farmer-blocks>\n\t`\n}\nconst FarmerProofs = {\n\ttemplate: `\n\t\t<farmer-proofs limit=\"50\"></farmer-proofs>\n\t`\n}\nconst FarmerPlots = {\n\ttemplate: `\n\t\t<div>\n\t\t\t<div class=\"my-2\">\n\t\t\t\t<farmer-plots></farmer-plots>\n\t\t\t</div>\n\t\t\t<div class=\"my-2\">\n\t\t\t\t<farmer-plot-dirs></farmer-plot-dirs>\n\t\t\t</div>\n\t\t</div>\n\t`\n}\nconst FarmerPlotNFTs = {\n\ttemplate: `\n\t\t<farmer-plotnfts></farmer-plotnfts>\n\t`\n}\n\nconst Settings = {\n\ttemplate: `\n\t\t<div>\n\t\t\t<node-settings></node-settings>\n\t\t\t<wallet-settings></wallet-settings>\n\t\t\t<build-version></build-version>\n\t\t</div>\n\t`\n}\n\nconst Login = {\n\tdata() {\n\t\treturn {\n\t\t\tpasswd: null,\n\t\t\tauto_login: false,\n\t\t\terror: null\n\t\t}\n\t},\n\tmethods: {\n\t\tsubmit(passwd) {\n\t\t\tthis.error = null;\n\t\t\tfetch('/server/login', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {'Content-Type': 'application/json'},\n\t\t\t\tbody: JSON.stringify({user: 'mmx-admin', passwd_plain: passwd})\n\t\t\t}).then(response => {\n\t\t\t\tif(response.ok) {\n\t\t\t\t\tlocalStorage.setItem('login-passwd', passwd);\n\t\t\t\t\tthis.$router.push(\"/\");\n\t\t\t\t\tlocation.reload();\n\t\t\t\t} else {\n\t\t\t\t\tthis.error = \"Login failed!\";\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tconst passwd = localStorage.getItem('login-passwd');\n\t\tif(passwd) {\n\t\t\tthis.submit(passwd);\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card>\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<!-- TODO add validation rulues -->\n\t\t\t\t\t<v-text-field\n\t\t\t\t\t\tv-model=\"passwd\"\n\t\t\t\t\t\t:label=\"$t('login.password_label')\"\n\t\t\t\t\t\trequired\n\t\t\t\t\t\ttype=\"password\"/>\n\t\t\t\t\t<v-checkbox v-model=\"auto_login\" label=\"Save in Browser (until Logout)\"></v-checkbox>\n\t\t\t\t\t<v-btn outlined color=\"primary\" @click=\"submit(passwd)\">{{ $t('login.login') }}</v-btn>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\televation=\"2\"\n\t\t\t\tv-if=\"error\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ error }}\n\t\t\t</v-alert>\n\t\t</div>\n\t\t`\n}\n\nVue.component('tx-fee-select', {\n\temits: [\n\t\t\"update-value\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tvalue: null,\n\t\t\titems: [\n\t\t\t\t{text: \"1x (min fee)\", value: 1024},\n\t\t\t\t{text: \"2x\", value: 2048},\n\t\t\t\t{text: \"3x\", value: 3072},\n\t\t\t\t{text: \"5x\", value: 5120},\n\t\t\t\t{text: \"10x\", value: 10240},\n\t\t\t\t{text: \"20x\", value: 20480},\n\t\t\t]\n\t\t}\n\t},\n\twatch: {\n\t\tvalue() {\n\t\t\tthis.$emit('update-value', this.value);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.value = 1024;\n\t},\n\ttemplate: `\n\t\t<v-select\n\t\t\tv-model=\"value\"\n\t\t\t:items=\"items\"\n\t\t\tlabel=\"TX Fee Ratio\"\n\t\t></v-select>\n\t`\n})\n\nVue.component('tx-type-link', {\n\tprops: {\n\t\tid: String,\n\t\ttype: String,\n\t},\n\tcomputed: {\n\t\tlink() {\n\t\t\tswitch(this.type) {\n\t\t\t\tcase 'REWARD':\n\t\t\t\tcase 'VDF_REWARD':\n\t\t\t\tcase 'PROJECT_REWARD':\n\t\t\t\t\treturn '/explore/block/hash/' + this.id;\n\t\t\t\tdefault:\n\t\t\t\t\treturn '/explore/transaction/' + this.id;\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t\t<router-link :to=\"link\">TX</router-link>\n\t`\n})\n\nVue.component('main-menu', {\n\tdata() {\n\t\treturn {\n\t\t\ttimer: null\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/server/session')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tif(!data.user) {\n\t\t\t\t\t\tif(this.$router.currentRoute.path != \"/login\") {\n\t\t\t\t\t\t\tthis.$router.push(\"/login\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\tlogout() {\n\t\t\tfetch('/server/logout')\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tlocalStorage.removeItem('login-passwd');\n\t\t\t\t\t\tthis.$router.push(\"/login\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tif(!this.$isWinGUI && !this.$isQtGUI) {\n\t\t\tthis.update();\n\t\t\tthis.timer = setInterval(() => { this.update(); }, 5000);\n\t\t}\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-tabs>\n\t\t\t<v-img src=\"assets/img/logo_text_color_cy256_square.png\" class=\"mx-2\" :max-width=\"100\"/>\n\t\t\t<v-tab to=\"/node\">{{ $t('main_menu.node') }}</v-tab>\n\t\t\t<v-tab to=\"/wallet\" v-if=\"$root.wallet\">{{ $t('main_menu.wallet') }}</v-tab>\n\t\t\t<v-tab to=\"/farmer\" v-if=\"$root.farmer\">{{ $t('main_menu.farmer') }}</v-tab>\n\t\t\t<v-tab to=\"/explore\">{{ $t('main_menu.explore') }}</v-tab>\n\t\t\t<v-tab to=\"/market\" v-if=\"$root.wallet\">{{ $t('main_menu.market') }}</v-tab>\n\t\t\t<v-tab to=\"/swap\" v-if=\"$root.wallet\">{{ $t('main_menu.swap') }}</v-tab>\n\t\t\t<v-spacer></v-spacer>\n\t\t\t<node-status/>\n\t\t\t<v-tab to=\"/settings\">{{ $t('main_menu.settings') }}</v-tab>\n\t\t\t<template v-if=\"!$route.meta.is_login && !$isWinGUI && !$isQtGUI\">\n\t\t\t\t<v-tab @click=\"logout\">{{ $t('main_menu.logout') }}</v-tab>\n\t\t\t</template>\n\t\t</v-tabs>\n\t\t`\n})\n\nVue.component('node-status', {\n\tdata() {\n\t\treturn {\n            node_status: {\n                DisconnectedFromNode: this.$t('node_status.disconnected'),\n                LoggedOff: this.$t('node_status.logged_off'),\n                Connecting: this.$t('node_status.connecting'),\n                Syncing: this.$t('node_status.syncing'),\n                Synced: this.$t('node_status.synced')\n            },\n\t\t\ttimer: null,\n\t\t\tsession_fails: 99,\n\t\t\tpeer_fails: 99,\n\t\t\tsynced_fails: 99,\n\t\t}\n\t},\n\tmethods: {\n\t\tasync update() {\n\n\t\t\tif(this.status = this.node_status.LoggedOff || this.status == this.node_status.DisconnectedFromNode \n\t\t\t\t|| this.status == node_status.Connecting) {\n\t\t\t\tawait fetch('/server/session')\n\t\t\t\t\t.then( () => this.session_fails = 0 )\n\t\t\t\t\t.catch( () => this.session_fails++ );\n\t\t\t}\n\n\t\t\tif(this.status == this.node_status.Connecting || this.status == this.node_status.Syncing) {\n\t\t\t\tif(this.$root.local_node) {\n\t\t\t\t\tawait fetch('/api/router/get_peer_info')\n\t\t\t\t\t\t.then( response => response.json() )\n\t\t\t\t\t\t.then( data => {\n\t\t\t\t\t\t\tif(data.peers && data.peers.length > 0) {\n\t\t\t\t\t\t\t\tthis.peer_fails = 0\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.peer_fails++\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch( () => this.peer_fails++ );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(this.status == this.node_status.Connecting || this.status == this.node_status.Syncing \n\t\t\t\t|| this.status == this.node_status.Synced) {\n\t\t\t\tawait fetch('/wapi/node/info')\n\t\t\t\t\t.then( response => response.json() )\n\t\t\t\t\t.then( data => {\n\t\t\t\t\t\tthis.$root.nodeInfo = data\n\t\t\t\t\t\tif(data.is_synced) {\n\t\t\t\t\t\t\tthis.synced_fails = 0\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.synced_fails++\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch( () => {\n\t\t\t\t\t\tthis.synced_fails++;\n\t\t\t\t\t\tthis.$root.nodeInfo = null;\n\t\t\t\t\t} );\n\t\t\t}\n\t\t\t\n\t\t\t// console.log('--------------------------------');\n\t\t\t// console.log('session_fails', this.session_fails);\n\t\t\t// console.log('connectedToNode', this.connectedToNode);\n\n\t\t\t// console.log('peer_fails', this.peer_fails);\n\t\t\t// console.log('connectedToNetwork', this.connectedToNetwork);\n\n\t\t\t// console.log('synced_fails', this.synced_fails);\n\t\t\t// console.log('synced', this.synced);\n\t\t},\n\t},\n\tcomputed: {\n\t\tconnectedToNode() {\n\t\t\treturn this.session_fails < 1;\n\t\t},\n\t\tloggedIn() {\n\t\t\treturn !this.$route.meta.is_login || this.$isWinGUI;\n\t\t},\n\t\tconnectedToNetwork() {\n\t\t\treturn this.peer_fails < 1 || !this.$root.local_node;\n\t\t},\n\t\tsynced() {\n\t\t\treturn this.synced_fails == 0;\n\t\t},\n\t\tstatus() {\n\t\t\tlet result = this.node_status.DisconnectedFromNode\n\t\t\tif(this.connectedToNode) {\n\t\t\t\tif(this.loggedIn) {\n\t\t\t\t\tresult = this.node_status.Connecting;\n\t\t\t\t\tif(this.connectedToNetwork) {\n\t\t\t\t\t\tresult = this.node_status.Syncing;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(this.synced) {\n\t\t\t\t\t\tresult = this.node_status.Synced;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresult = this.node_status.LoggedOff;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//console.log(result)\n\t\t\treturn result;\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 5000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div class=\"d-flex align-center px-5\">\n\n\t\t\t<git-update-checker class=\"pr-5\"/>\n\n\t\t\t<t-icon v-if=\"status == node_status.Connecting\"\n\t\t\t\tcolor=\"red\"\n\t\t\t\t:tooltip=\"node_status.Connecting\">mdi-connection</t-icon>\n\n\t\t\t<t-icon v-else-if=\"status == node_status.Syncing\"\n\t\t\t\tcolor=\"yellow darken-3\" \n\t\t\t\t:tooltip=\"node_status.Syncing\">mdi-sync</t-icon>\n\n\t\t\t<t-icon v-else-if=\"status == node_status.Synced\"\n\t\t\t\tcolor=\"green\" \n\t\t\t\t:tooltip=\"node_status.Synced\">mdi-cloud-check</t-icon>\n\n\t\t\t<t-icon v-else-if=\"status == node_status.LoggedOff\" \n\t\t\t\tcolor=\"red\" \n\t\t\t\t:tooltip=\"node_status.LoggedOff\">mdi-shield-key</t-icon>\n\n\t\t\t<t-icon v-else\n\t\t\t\tcolor=\"red\" \n\t\t\t\t:tooltip=\"node_status.DisconnectedFromNode\">mdi-emoticon-dead</t-icon>\n\n\t\t</div>\n\t\t`\n})\n\nVue.component('t-icon', {\n\tprops: {\n\t\tcolor: String,\n\t\ttooltip: String\n\t},\n\ttemplate: `\n\t\t<v-tooltip bottom v-if=\"tooltip\">\n\t\t\t<template v-slot:activator=\"{ on, attrs }\">\n\t\t\t\t<v-icon :color=\"color\" v-on=\"on\"><slot /></v-icon>\n\t\t\t</template>\n\t\t\t<span>{{tooltip}}</span>\n\t\t</v-tooltip>\t\n\t\t<v-icon :color=\"color\" v-else><slot /></v-icon>\t\t\n\t`\n})\n\nVue.component('git-update-checker', {\n\tdata() {\n\t\treturn {\n\t\t\ttimer: null,\n\t\t\tshow: false,\n\t\t\tcommit_status_message: ''\n\t\t}\n\t},\n\tmethods: {\n\t\tasync update() {\n\t\t\tthis.commit_status_message = '';\n\t\t\tthis.show = false;\n\t\t\tfetch('/wapi/config/get?key=build')\n\t\t\t.then( response => {\n                if (!response.ok) {\n                    throw Error(response.statusText);\n                }\n                return response.json();\n            })\n\t\t\t.then( data => {\n\t\t\t\tif(data && data.version) {\n\t\t\t\t\tvar version = data.version;\n\t\t\t\t\tfetch(`https://api.github.com/repos/madMAx43v3r/mmx-node/tags`)\n\t\t\t\t\t.then( response => response.json() )\n\t\t\t\t\t.then( data => {\n\t\t\t\t\t\tif(data) {\n\t\t\t\t\t\t\tvar latest = '';\n\t\t\t\t\t\t\tfor(let item of data) {\n\t\t\t\t\t\t\t\tif(item && item.name.length && item.name[0] === \"v\"){\n\t\t\t\t\t\t\t\t\tlatest = item.name;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tversion = version.split(\"-\", 1)[0];\n\t\t\t\t\t\t\tif(version !== latest) {\n\t\t\t\t\t\t\t\tthis.show = true;\n\t\t\t\t\t\t\t\tthis.commit_status_message += `${version}, compared to ${latest} at`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tconsole.log(`git-update-checker: ${err}`);\n\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tif(!this.$isWinGUI) {\n\t\t\tthis.update();\n\t\t\tthis.timer = setInterval(() => { this.update(); }, 60*60*1000);\n\t\t}\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\tcomputed: {\n\t\ttooltip() {\n\t\t\treturn `This build is ${this.commit_status_message} madMAx43v3r:master`;\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<t-icon v-if=\"show\"\n\t\t\t\tcolor=\"yellow darken-3\"\n\t\t\t\t:tooltip=\"tooltip\"\n\t\t\t>mdi-alert-decagram-outline</t-icon>\n\t\t</div>\n\t`\n}),\n\nVue.component('app', {\n\tcomputed: {\n\t\tcolClass(){\n\t\t\tvar result = '';\n\t\t\tif(!this.$isWinGUI) {\n\t\t\t\tresult = 'cols-12 col-xl-8 offset-xl-2';\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\tfluid() {\n\t\t\treturn this.$isWinGUI || !(this.$vuetify.breakpoint.xl || this.$vuetify.breakpoint.lg);\n\t\t}\n\t},\n\ttemplate: `\n\t\t<v-app>\n\t\t\t<v-app-bar app dense>\n\t\t\t\t<v-container :fluid=\"fluid\" class=\"main_container\">\n\t\t\t\t\t<v-row>\n\t\t\t\t\t\t<v-col :class=\"colClass\">\n\t\t\t\t\t\t\t<main-menu></main-menu>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t</v-container>\n\t\t\t</v-app-bar>\n\t\t\t<v-main>\n\t\t\t\t<v-container :fluid=\"fluid\" class=\"main_container\">\n\t\t\t\t\t<v-row>\n\t\t\t\t\t\t<v-col :class=\"colClass\">\n\t\t\t\t\t\t\t<router-view></router-view>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t</v-container>\n\t\t\t</v-main>\n\t\t\t<!--v-footer app>\n\t\t\t</v-footer-->\n\t\t</v-app>\n\t\t`\n})\n\n"
  },
  {
    "path": "www/web-gui/public/locales/common.js",
    "content": "const commonLocale = {\r\n    \"common\": {\r\n        \"reward_address_placeholder\": \"<@.lower:common.default>\"\r\n    },\r\n\r\n    \"main_menu\": {\r\n        \"node\": \"@:common.node\",\r\n        \"wallet\": \"@:common.wallet\"\r\n    },\r\n\r\n    \"node_menu\": {\r\n        \"netspace\": \"@:node_common.netspace\",\r\n        \"blocks\": \"@:common.blocks\",        \r\n        \"vdf_speed\": \"@:node_common.vdf_speed\",        \r\n        \"block_reward\": \"@:node_common.block_reward\"\r\n    },\r\n\r\n    \"node_info\": {\r\n        \"height\": \"@:common.height\",\r\n        \"netspace\": \"@:node_common.netspace\",\r\n        \"vdf_speed\": \"@:node_common.vdf_speed\",\r\n        \"block_reward\": \"@:node_common.block_reward\",\r\n        \"block_size\": \"@:node_common.block_size\"\r\n    },\r\n\r\n    \"node_log\": {\r\n        \"wallet\": \"@:common.wallet\",\r\n        \"node\": \"@:common.node\",\r\n        \"harvester\": \"@:common.harvester\",\r\n    },\r\n\r\n    \"harvester_settings\": {\r\n        \"harvester\": \"@:common.harvester\"\r\n    },\r\n\r\n    \"node_log_table\": {\r\n        \"time\": \"@:common.time\",\r\n    },\r\n\r\n    \"node_peers\": {\r\n    \t\"ip\": \"IP\",\r\n        \"height\": \"@:common.height\",\r\n        \"type\": \"@:common.type\"\r\n    },\r\n\r\n    \"netspace_graph\": {\r\n        \"title\": \"@:node_common.netspace ({0})\"\r\n    },\r\n\r\n    \"vdf_speed_graph\": {\r\n        \"title\": \"@:node_common.vdf_speed ({0})\"\r\n    },\r\n\r\n    \"block_reward_graph\": {\r\n        \"title\": \"@:node_common.block_reward ({0})\"\r\n    },\r\n    \r\n    \"tx_fees_graph\": {\r\n        \"title\": \"@:node_common.tx_fees ({0})\"\r\n    },    \r\n\r\n    \"wallet_summary\": {\r\n        \"new_wallet\": \"@:wallet_summary.new @:common.wallet\"\r\n    },\r\n\r\n    \"account_menu\": {\r\n        \"balance\": \"@:common.balance\",\r\n        \"log\": \"@:node_menu.log\"\r\n    },\r\n\r\n    \"account_header\": {\r\n        \"wallet\": \"@:common.wallet\"\r\n    },    \r\n\r\n    \"account_addresses\": {\r\n        \"address\": \"@:common.address\",\r\n    },\r\n\r\n    \"account_send_form\": {\r\n        \"amount\": \"@:common.amount\",\r\n        \"wallet\": \"@:common.wallet\", \r\n        \"confirm\": \"@:common.confirm\",\r\n        \"currency\": \"@:common.currency\"\r\n    },\r\n\r\n    \"wallet_settings\": {\r\n        \"name\": \"@:common.name\",\r\n        \"symbol\": \"@:common.symbol\",\r\n        \"contract\": \"@:common.contract\"\r\n    },\r\n\r\n    \"balance_table\": {\r\n        \"token\": \"@:common.token\",\r\n        \"balance\": \"@:common.balance\",\r\n        \"contract\": \"@:common.contract\"\r\n    },\r\n\r\n    \"account_balance\": {\r\n        \"balance\": \"@:common.balance\",\r\n        \"spendable\": \"@:balance_table.spendable\",\r\n        \"token\": \"@:common.token\",\r\n        \"contract\": \"@:balance_table.contract\"\r\n    },\r\n\r\n    \"account_plots\": {\r\n        \"balance\": \"@:common.balance\",\r\n        \"address\": \"@:common.address\"\r\n    },\r\n\r\n    \"account_history\": {\r\n        \"height\": \"@:common.height\",\r\n        \"type\": \"@:common.type\",\r\n        \"amount\": \"@:common.amount\",\r\n        \"token\": \"@:common.token\",\r\n        \"address\": \"@:common.address\",\r\n        \"time\": \"@:common.time\",\r\n        \"link\": \"@:common.link\"\r\n    },    \r\n\r\n    \"account_tx_history\": {\r\n        \"height\": \"@:common.height\",\r\n        \"confirmed\": \"@:transaction_view.confirmed\",\r\n        \"transaction_id\": \"@:explore_transactions.transaction_id\",\r\n        \"time\": \"@:common.time\",\r\n        \"status\": \"@:common.status\",\r\n        \"pending\": \"@:common.pending\",\r\n        \"expired\": \"@:common.expired\",\r\n        \"failed\": \"@:common.failed\"\r\n    },\r\n\r\n    \"account_offers\": {\r\n        \"any\": \"@:common.any\",\r\n        \"height\": \"@:common.height\",\r\n        \"address\": \"@:common.address\",\r\n        \"time\": \"@:common.time\",\r\n        \"deposit\": \"@:common.deposit\",\r\n        \"price\": \"@:common.price\"\r\n    },\r\n\r\n    \"account_offer_form\": {\r\n        \"confirm\": \"@:common.confirm\",\r\n    },    \r\n\r\n    \"explore_menu\": {\r\n        \"blocks\": \"@:common.blocks\",\r\n\r\n        \"transaction_id\": \"@:explore_transactions.transaction_id\",\r\n        \"address\": \"@.lower:common.address\",\r\n\r\n        \"placeholder\": \"@.lower:explore_menu.address | @.lower:explore_menu.transaction_id | @.lower:explore_menu.block_height\"\r\n    },\r\n\r\n    \"explore_blocks\": {\r\n        \"height\": \"@:common.height\",\r\n        \"reward\": \"@:common.reward\",\r\n        \"hash\": \"@:common.hash\"\r\n    },\r\n\r\n    \"explore_transactions\": {\r\n        \"height\": \"@:common.height\",\r\n\r\n        \"type\": \"@:common.type\",\r\n        \"fee\": \"@:common.fee\"\r\n    },\r\n\r\n    \"block_view\": {\r\n        \"height\": \"@:common.height\",\r\n        \"hash\": \"@:common.hash\",\r\n\r\n        \"amount\": \"@:common.amount\",\r\n        \"address\": \"@:common.address\",\r\n        \"reward\": \"@:common.reward\",        \r\n\r\n        \"time\": \"@:common.time\",\r\n\r\n        \"transaction_id\": \"@:explore_transactions.transaction_id\"     \r\n    },\r\n\r\n    \"address_history_table\": {\r\n        \"height\": \"@:common.height\",\r\n        \"type\": \"@:common.type\",\r\n        \"amount\": \"@:common.amount\",\r\n        \"token\": \"@:common.token\",\r\n        \"address\": \"@:common.address\",\r\n        \"time\": \"@:common.time\",\r\n        \"link\": \"@:common.link\"\r\n    },\r\n\r\n    \"transaction_view\": {\r\n\r\n        \"height\": \"@:common.height\",\r\n        \"time\": \"@:common.time\",\r\n        \"address\": \"@:common.address\",\r\n        \"fee\": \"@:common.fee\",\r\n        \"amount\": \"@:common.amount\",\r\n        \"token\": \"@:common.token\"\r\n    },\r\n\r\n    \"market_menu\": {\r\n        \"wallet\": \"@:common.wallet\"\r\n    },\r\n\r\n    \"market_offers\": {\r\n        \"price\": \"@:common.price\",\r\n        \"they_offer\": \"@:market_menu.they_offer\",\r\n        \"they_ask\": \"@:market_menu.they_ask\",\r\n        \"time\": \"@:common.time\",\r\n        \"link\": \"@:common.link\",\r\n        \"address\": \"@:common.address\",\r\n\r\n        \"accept\": \"@:common.accept\",\r\n        \"cancel\": \"@:common.cancel\"\r\n    },\r\n\r\n    \"account_history_form\": {\r\n        \"any\": \"@:common.any\"\r\n    },\r\n\r\n    \"farmer_blocks\": {\r\n        \"height\": \"@:common.height\",\r\n        \"reward\": \"@:common.reward\",\r\n        \"score\": \"@:explore_blocks.score\",\r\n        \"tx_fees\": \"@:node_common.tx_fees\",\r\n        \"time\": \"@:common.time\"\r\n    },\r\n\r\n    \"farmer_proofs\": {\r\n        \"height\": \"@:common.height\",\r\n        \"score\": \"@:explore_blocks.score\",\r\n        \"sdiff\": \"@:explore_blocks.sdiff\",\r\n        \"time\": \"@:common.time\",\r\n        \"plot_id\": \"@:block_view.plot_id\",\r\n        \"harvester\": \"@:common.harvester\"\r\n    },\r\n\r\n    \"swap\": {\r\n        \"volume_24h\": \"@:swap.volume (@:swap.24h)\",\r\n        \"volume_7d\": \"@:swap.volume (@:swap.7d)\"\r\n    }\r\n\r\n}"
  },
  {
    "path": "www/web-gui/public/locales/de.json",
    "content": "{\r\n    \"common\": {\r\n        \"yes\": \"Ja\",\r\n        \"no\": \"Nein\",\r\n        \"default\": \"default\",\r\n        \"node\": \"Knoten\",\r\n        \"wallet\": \"Börse\",\r\n        \"height\": \"Höhe\",\r\n        \"blocks\": \"Blöcke\",\r\n        \"balance\": \"Stand\",\r\n        \"token\": \"Token\",\r\n        \"hash\": \"Hash\",\r\n        \"reward\": \"Belohnung\",\r\n        \"amount\": \"Betrag\",\r\n        \"address\": \"Adresse\",\r\n        \"type\": \"Typ\",\r\n        \"time\": \"Zeit\",\r\n        \"fee\": \"Gebühr\",\r\n        \"pending\": \"ausstehend\",\r\n        \"confirm\": \"Bestätigen\",\r\n        \"deploy\": \"Einsetzen\",\r\n        \"create\": \"Erstellen\",\r\n        \"transaction_has_been_sent\": \"Die Transaktion wurde gesendet\",\r\n        \"failed_with\": \"Fehlgeschlagen mit\",\r\n        \"deployed_as\": \"Eingesetzt als\",\r\n        \"link\": \"Link\"\r\n    },\r\n    \"main_menu\": {\r\n        \"explore\": \"Erkunden\",\r\n        \"market\": \"Marktplatz\",\r\n        \"exchange\": \"Austausch\",\r\n        \"settings\": \"Einstellungen\",\r\n        \"logout\": \"Ausloggen\"\r\n    },\r\n    \"node_common\": {\r\n        \"vdf_speed\": \"VDF Geschwindigkeit\",\r\n        \"block_reward\": \"Block Belohnung\",\r\n        \"netspace\": \"Netzgröße\"\r\n    },\r\n    \"node_menu\": {\r\n        \"log\": \"Log\",\r\n        \"peers\": \"Verbindungen\"\r\n    },\r\n    \"node_info\": {\r\n        \"synced\": \"Synchronisiert\",\r\n        \"supply\": \"Ausgeliefert\",\r\n        \"no_addresses\": \"Anzahl Adressen\"\r\n    },\r\n    \"node_log\": {\r\n        \"terminal\": \"Terminal\",\r\n        \"router\": \"Router\",\r\n        \"farmer\": \"Farmer\",\r\n        \"harvester\": \"Harvester\",\r\n        \"timelord\": \"TimeLord\"\r\n    },\r\n    \"node_peers\": {\r\n        \"version\": \"Version\",\r\n        \"received\": \"Empfangen\",\r\n        \"send\": \"Gesendet\",\r\n        \"ping\": \"Ping\",\r\n        \"duration\": \"Dauer\",\r\n        \"credits\": \"Bewertung\",\r\n        \"tx_gas\": \"Transaktionsgebühr\",\r\n        \"connection\": \"Verbindung\",\r\n        \"outbound\": \"ausgehend\",\r\n        \"inbound\": \"eingehend\"\r\n    },\r\n    \"wallet_summary\": {\r\n        \"new\": \"Neu\"\r\n    },\r\n    \"account_menu\": {\r\n        \"nfts\": \"NFTs\",\r\n        \"contracts\": \"Verträge\",\r\n        \"addresses\": \"Adressen\",\r\n        \"send\": \"Senden\",\r\n        \"offer\": \"Anbieten\",\r\n        \"history\": \"bisherige Transaktionen\",\r\n        \"details\": \"Details\"\r\n    },\r\n    \"account_send_form\": {\r\n        \"source_address\": \"Quell-Adresse\",\r\n        \"destination\": \"Ziel\",\r\n        \"destination_address\": \"Ziel-Adresse\",\r\n        \"address_input\": \"Adress-Eingabe\",\r\n        \"currency\": \"Währung\",\r\n        \"send\": \"Sende\"\r\n    },\r\n    \"balance_table\": {\r\n        \"locked\": \"Gesperrt\",\r\n        \"spendable\": \"Ausgabefähig\",\r\n        \"contract\": \"Vertrag\"\r\n    },\r\n    \"account_balance\": {\r\n        \"reserved\": \"Reserviert\"\r\n    },\r\n    \"account_history\": {\r\n        \"link\": \"@:common.link\"\r\n    },\r\n    \"account_offers\": {\r\n        \"offer\": \"Angebot\",\r\n        \"receive\": \"Empfangen\",\r\n        \"status\": \"Status\",\r\n        \"actions\": \"Aktionen\",\r\n        \"revoke\": \"Zurückziehen\",\r\n        \"accepted\": \"Akzeptiert\",\r\n        \"revoked\": \"Zurückgezogen\",\r\n        \"open\": \"Offen\"\r\n    },\r\n    \"account_offer_form\": {\r\n        \"offer_amount\": \"Betrag anbieten\",\r\n        \"offer_currency\": \"Währung anbieten\",\r\n        \"receive_amount\": \"Betrag empfangen\",\r\n        \"receive_currency_contract\": \"Währungs-Vertrag empfangen\",\r\n        \"symbol\": \"Symbol\",\r\n        \"offer\": \"Jetzt anbieten\"\r\n    },\r\n    \"explore_menu\": {\r\n        \"transactions\": \"Transaktionen\",\r\n        \"address\": \"@.lower:common.address\",\r\n        \"block_height\": \"Blockhöhe\"\r\n    },\r\n    \"explore_blocks\": {\r\n        \"score\": \"Bewertung\"\r\n    },\r\n    \"explore_transactions\": {\r\n        \"transaction_id\": \"Transaktions-ID\"\r\n    },\r\n    \"block_view\": {\r\n        \"previous\": \"Vorhergende\",\r\n        \"next\": \"Nächste\",\r\n        \"block\": \"Block\",\r\n        \"no_such_block\": \"Kein solcher Block!\",\r\n        \"time_diff\": \"Zeitunterschied\",\r\n        \"space_diff\": \"Platzunterschied\",\r\n        \"vdf_iterations\": \"VDF Iterationen\",\r\n        \"tx_base\": \"TX Basis\",\r\n        \"tx_count\": \"TX Anzahl\",\r\n        \"k_size\": \"K Größe\",\r\n        \"proof_score\": \"Nachweisbewertung\",\r\n        \"plot_id\": \"Plot Kennung\",\r\n        \"farmer_key\": \"Farmer Schlüssel\",\r\n        \"inputs\": \"Eingaben\",\r\n        \"outputs\": \"Ausgaben\",\r\n        \"operations\": \"Operationen\"\r\n    },\r\n    \"transaction_view\": {\r\n        \"transaction\": \"Transaktion\",\r\n        \"confirmed\": \"Bestätigt\",\r\n        \"expires\": \"Läuft ab\",\r\n        \"note\": \"Bemerkung\",\r\n        \"sender\": \"Sender\",\r\n        \"cost\": \"Kosten\",\r\n        \"input\": \"Eingabe\",\r\n        \"output\": \"Ausgabe\"\r\n    },\r\n    \"create_contract_menu\": {\r\n        \"contract_type\": \"Vertrags-Typ\"\r\n    },\r\n    \"account_contract_summary\": {\r\n        \"deposit\": \"Hinterlegen\",\r\n        \"withdraw\": \"Abheben\"\r\n    },\r\n    \"node_settings\": {\r\n        \"language\": \"Sprache\",\r\n        \"enable_timelord\": \"TimeLord aktivieren\",\r\n        \"farmer_reward_address\": \"Adresse für die Farmer-Belohnung\",\r\n        \"timeLord_reward_address\": \"Adresse für die TimeLord-Belohnung\",\r\n        \"reward_address_placeholder\": \"<bitte eingeben>\",\r\n        \"restart_needed\": \"(zur Aktivierung neu starten)\"\r\n    },\r\n    \"create_locked_contract\": {\r\n        \"owner_address\": \"Besitzer  Adresse\",\r\n        \"unlock_height\": \"Freischalten bei Höhe der Blockchain\"\r\n    },\r\n    \"create_virtual_plot_contract\": {\r\n        \"farmer_public_key\": \"Öffentlicher Schlüssel des Farmers\",\r\n        \"reward_address\": \"Belohnungs-Adresse (optional, bei pooling)\"\r\n    },\r\n    \"account_details\": {\r\n        \"copy_keys_to_plotter\": \"Kopiere die Schlüssel zum Plotter\"\r\n    },\r\n    \"account_actions\": {\r\n        \"reset_cache\": \"Zwichenspeicher zurücksetzen\",\r\n        \"show_seed\": \"Zeige den Samen\"\r\n    },\r\n    \"create_account\": {\r\n        \"account_index\": \"Konto Index\",\r\n        \"account_name\": \"Konto Name\",\r\n        \"number_of_addresses\": \"Anzahl der Adessen\",\r\n        \"create_account\": \"Konto erstellen\"\r\n    },\r\n    \"create_wallet\": {\r\n        \"use_custom_seed\": \"Nutze individuellen Samen\",\r\n        \"seed_hash\": \"Samen Hash (optional, hex Zeichenkette, 64 Buchstaben)\",\r\n        \"placeholder\": \"<zufällig>\",\r\n        \"create_wallet\": \"Erstelle Börse\"\r\n    },\r\n    \"market_menu\": {\r\n        \"they_offer\": \"Angeboten\",\r\n        \"they_ask\": \"Nachgefragt\",\r\n        \"anything\": \"Alles\",\r\n        \"offers\": \"Angebote\"\r\n    },\r\n    \"market_offers\": {\r\n        \"price\": \"Preis\",\r\n        \"accept\": \"Akzeptieren\",\r\n        \"cancel\": \"Abbrechen\",\r\n        \"accept_offer\": \"Angebot akzeptieren\",\r\n        \"you_receive\": \"Erhalten\",\r\n        \"you_pay\": \"Bezahlen\"\r\n    },\r\n    \"login\": {\r\n        \"password_label\": \"Passwort (Schaue in die PASSWD Datei)\",\r\n        \"login\": \"Einloggen\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "www/web-gui/public/locales/en.js",
    "content": "const enLocale = {\r\n    \"common\": {\r\n        \"yes\": \"Yes\",\r\n        \"no\": \"No\",\r\n\r\n        \"default\": \"default\",\r\n\r\n        \"node\": \"Node\",\r\n        \"wallet\": \"Wallet\",\r\n        \"height\": \"Height\",\r\n        \"blocks\": \"Blocks\",\r\n        \"balance\": \"Balance\",\r\n        \"name\": \"Name\",\r\n        \"token\": \"Token\",\r\n        \"currency\": \"Currency\",\r\n        \"symbol\": \"Symbol\",\r\n        \"price\": \"Price\",\r\n        \"hash\": \"Hash\",\r\n        \"reward\": \"Reward\",\r\n        \"amount\": \"Amount\",\r\n        \"address\": \"Address\",\r\n        \"contract\": \"Contract\",\r\n        \"type\": \"Type\",\r\n        \"time\": \"Time\",\r\n        \"fee\": \"Fee\",\r\n        \"status\": \"Status\",\r\n        \"pending\": \"pending\",\r\n        \"expired\": \"expired\",\r\n        \"failed\": \"failed\",\r\n        \r\n        \"confirm\": \"Confirm\",\r\n        \"deploy\": \"Deploy\",\r\n        \"create\": \"Create\",\r\n        \"remove\": \"Remove\",\r\n\r\n        \"accept\": \"Accept\",\r\n        \"cancel\": \"Cancel\",\r\n\r\n        \"transaction_has_been_sent\": \"Transaction has been sent\",\r\n        \"failed_with\": \"Failed with\",\r\n        \"deployed_as\": \"Deployed as\",\r\n\r\n        \"any\": \"Any\",\r\n\r\n        \"link\": \"Link\",\r\n        \"owner\": \"Owner\",\r\n        \"manage\": \"Manage\",\r\n        \"harvester\": \"Harvester\",\r\n        \"deposit\": \"Deposit\",\r\n\r\n        \"user\": \"User\"\r\n    },\r\n\r\n    \"main_menu\": {\r\n        \"explore\": \"Explore\",\r\n        \"market\": \"Market\",\r\n        \"farmer\": \"Farmer\",\r\n        \"exchange\": \"Exchange\",\r\n        \"swap\": \"Swap\",\r\n        \"settings\": \"Settings\",\r\n        \"logout\": \"Logout\"\r\n    },\r\n\r\n    \"node_status\": {\r\n        \"disconnected\": \"Disconnected from node\",\r\n        \"logged_off\": \"Logged off\",\r\n        \"connecting\": \"Connecting...\",\r\n        \"syncing\": \"Syncing\",\r\n        \"synced\": \"Synced\"\r\n    },\r\n\r\n    \"node_common\": {\r\n        \"vdf_speed\": \"VDF Speed\",\r\n        \"block_reward\": \"Block Reward\",\r\n        \"block_size\": \"Block Size\",\r\n        \"tx_fees\": \"Transaction Fees\",\r\n        \"netspace\": \"Netspace\"\r\n    },\r\n\r\n    \"node_menu\": {\r\n        \"log\": \"Log\",\r\n        \"peers\": \"Peers\"\r\n    },\r\n\r\n    \"node_info\": {\r\n        \"synced\": \"Synced\",\r\n        \"supply\": \"Supply\",\r\n        \"no_addresses\": \"No. Addresses\"\r\n    },\r\n\r\n    \"farmer_info\": {\r\n        \"virtual_balance\": \"Virtual Balance\",\r\n        \"virtual_size\": \"Virtual Size\",\r\n        \"physical_size\": \"Physical Size\",\r\n        \"total_farm_size\": \"Total Farm Size\"\r\n    },\r\n\r\n    \"node_log\": {\r\n        \"terminal\": \"Terminal\",\r\n        \"router\": \"Router\",\r\n        \"farmer\": \"Farmer\",\r\n        \"timelord\": \"TimeLord\"\r\n    },\r\n\r\n    \"node_log_table\": {\r\n        \"module\": \"Module\",\r\n        \"message\": \"Message\"\r\n    },\r\n\r\n    \"node_peers\": {\r\n        \"version\": \"Version\",\r\n        \"received\": \"Received\",\r\n        \"send\": \"Sent\",\r\n        \"ping\": \"Ping\",\r\n        \"duration\": \"Duration\",\r\n        \"credits\": \"Credits\",\r\n        \"tx_gas\": \"TX Gas\",\r\n        \"connection\": \"Connection\",\r\n        \"outbound\": \"outbound\",\r\n        \"inbound\": \"inbound\"\r\n    },\r\n\r\n    \"wallet_summary\": {\r\n        \"new\": \"New\"\r\n    },\r\n\r\n    \"account_menu\": {\r\n        \"nfts\": \"NFTs\",\r\n        \"contracts\": \"Contracts\",\r\n        \"addresses\": \"Addresses\",\r\n        \"send\": \"Send\",\r\n        \"plots\": \"Plots\",\r\n        \"offer\": \"Offer\",\r\n        \"history\": \"History\",\r\n        \"liquidity\": \"Liquidity\",\r\n        \"info\": \"Info\",\r\n        \"details\": \"Details\"\r\n    },\r\n\r\n    \"account_addresses\": {\r\n        \"index\": \"#\",\r\n        \"n_recv\": \"N(Recv)\",\r\n        \"n_spend\": \"N(Spend)\",\r\n        \"last_recv\": \"Last Recv\",\r\n        \"last_spend\": \"Last Spend\"\r\n\t},\r\n\t\r\n\t\"wallet_common\": {\r\n\t\t\"enter_passphrase\": \"Passphrase required\"\r\n\t},\r\n\r\n    \"account_send_form\": {\r\n        \"source_address\": \"Source Address\",\r\n        \"destination\": \"Destination\",\r\n        \"destination_address\": \"Destination Address\",\r\n        \"address_input\": \"Address Input\",\r\n        \"send\": \"Send\"\r\n    },\r\n\r\n    \"balance_table\": {\r\n        \"locked\": \"Locked\",\r\n        \"spendable\": \"Spendable\"\r\n    },\r\n\r\n    \"account_balance\": {\r\n        \"reserved\": \"Reserved\",\r\n        \"show_unknown\": \"Show unknown\"\r\n    },\r\n\r\n    \"account_plots\": {\r\n        \"size\": \"Size\",\r\n        \"new_plot\": \"New Plot\",\r\n\r\n        \"from\": \"from\",\r\n        \"to\": \"to\",\r\n        \r\n        \"deposit_warning\": \"Only 90% of the amount deposited will be returned on withdrawal, the remaining 10% is burned as fee.\",\r\n        \"withdraw_warning\": \"Only 90% of the amount will be returned, the remaining 10% is burned as fee.\"\r\n    },\r\n\r\n    \"account_offers\": {\r\n        \"offering\": \"Offering\",\r\n        \"received\": \"Received\",\r\n        \"status\": \"Status\",\r\n        \"actions\": \"Actions\",\r\n        \"revoke\": \"Revoke\",\r\n\r\n        \"accepted\": \"Accepted\",\r\n        \"revoked\": \"Revoked\",\r\n\r\n        \"open\": \"Open\",\r\n        \"deposit_to\": \"Deposit to\"\r\n    },\r\n\r\n    \"account_offer_form\": {\r\n        \"offer_amount\": \"Offer Amount\",\r\n        \"offer_currency\": \"Offer Currency\",\r\n        \"receive_amount\": \"Receive Amount\",\r\n        \"receive_currency_contract\": \"Receive Currency Contract\",\r\n        \"symbol\": \"Symbol\",\r\n        \"offer\": \"Offer\"\r\n    },\r\n\r\n    \"explore_menu\": {\r\n        \"transactions\": \"Transactions\",\r\n        \"farmers\": \"Farmers\",\r\n        \"block_height\": \"block height\",\r\n    },\r\n\r\n    \"explore_blocks\": {\r\n        \"k\": \"K\",\r\n        \"tx\": \"TX\",\r\n        \r\n        \"score\": \"Score\",\r\n        \r\n        \"tdiff\": \"T-Diff\",\r\n        \"sdiff\": \"S-Diff\",\r\n\r\n        \"size\": \"Size\",\r\n        \"cost\": \"Cost\"\r\n    },\r\n\r\n    \"explore_transactions\": {\r\n        \"n_in\": \"N(in)\",\r\n        \"n_out\": \"N(out)\",\r\n        \"n_op\": \"N(op)\",\r\n        \"transaction_id\": \"Transaction ID\"\r\n    },\r\n\r\n    \"explore_farmers\": {\r\n        \"no_blocks\": \"No. Blocks\",\r\n        \"farmer_key\": \"Farmer Key\"\r\n    },\r\n\r\n    \"block_view\": {\r\n        \"previous\": \"Previous\",\r\n        \"next\": \"Next\",\r\n        \"block\": \"Block\",\r\n        \"no_such_block\": \"No such block!\",\r\n\r\n        \"time_diff\": \"Time Diff\",\r\n        \"space_diff\": \"Space Diff\",\r\n        \"vdf_iterations\": \"VDF Iterations\",\r\n        \"tx_base\": \"TX Base\",\r\n        \"tx_count\": \"TX Count\",\r\n        \"k_size\": \"K Size\",\r\n        \"proof_score\": \"Proof Score\",\r\n        \"plot_id\": \"Plot ID\",\r\n        \"farmer_key\": \"Farmer Key\",\r\n\r\n        \"inputs\": \"Inputs\",\r\n        \"outputs\": \"Outputs\",\r\n        \"operations\": \"Operations\"\r\n    },\r\n\r\n    \"transaction_view\": {\r\n        \"transaction\": \"Transaction\",\r\n        \"message\": \"Message\",\r\n        \"confirmed\": \"Confirmed\",\r\n        \"expires\": \"Expires\",\r\n        \"note\": \"Note\",\r\n\r\n        \"sender\": \"Sender\",\r\n        \"cost\": \"Cost\",\r\n\r\n        \"input\": \"Input\",\r\n        \"output\": \"Output\",\r\n\r\n        \"no_such_transaction\": \"No such transaction!\"\r\n    },\r\n\r\n    \"create_contract_menu\": {\r\n        \"contract_type\": \"Contract Type\"\r\n    },\r\n\r\n    \"account_contract_summary\": {\r\n        \"deposit\": \"Deposit\",\r\n        \"withdraw\": \"Withdraw\"\r\n    },\r\n\r\n    \"node_settings\": {\r\n        \"gui\": \"GUI\",\r\n        \"language\": \"Language\",\r\n\r\n        \"theme\": \"Theme\",\r\n        \"light\": \"Light\",\r\n        \"dark\": \"Dark\",\r\n\r\n        \"general\": \"General\",\r\n        \"enable_timelord\": \"Enable TimeLord\",\r\n        \"enable_timelord_reward\": \"Enable TimeLord Rewards (requires one more CPU core)\",\r\n        \"verify_timelord_reward\": \"Verify TimeLord Rewards (disable to speed up VDF verify)\",\r\n        \"open_port\": \"Open network port to allow incoming connections (UPnP)\",\r\n\r\n        \"reward\": \"Reward\",\r\n        \"farmer_reward_address\": \"Farmer Reward Address\",\r\n        \"timeLord_reward_address\": \"TimeLord Reward Address\",\r\n        \"restart_needed\": \"(restart needed to apply)\",\r\n\r\n        \"opencl_device\": \"OpenCL Device\",\r\n\r\n        \"blockchain\": \"Blockchain\",\r\n        \"revert_db_to_height\": \"Revert DB to height\",\r\n        \"revert\": \"Revert\"\r\n    },\r\n\r\n    \"harvester_settings\": {\r\n        \"harvester_reload_interval\": \"Harvester Reload Interval (sec)\",\r\n        \"plot_directory\": \"Plot Directory\",\r\n        \"add_directory\": \"Add Directory\"\r\n    },\r\n\r\n    \"wallet_settings\": {\r\n        \"token_whitelist\": \"Token Whitelist\",\r\n        \"token_address\": \"Token Address\",\r\n        \"add_token\": \"Add Token\"\r\n    },\r\n\r\n    \"build_version\": {\r\n        \"build\": \"Build\",\r\n        \"version\": \"Version\",\r\n        \"commit\": \"Commit\"\r\n    },\r\n\r\n    \"create_locked_contract\": {\r\n        \"owner_address\": \"Owner Address\",\r\n        \"unlock_height\": \"Unlock at Chain Height\"\r\n    },\r\n\r\n    \"create_virtual_plot_contract\": {\r\n        \"farmer_public_key\": \"Farmer Public Key\",\r\n        \"reward_address\": \"Reward Address (optional, for pooling)\"\r\n    },\r\n    \r\n    \"account_details\": {\r\n        \"copy_keys_to_plotter\": \"Copy keys to plotter\"\r\n    },\r\n\r\n    \"account_actions\": {\r\n        \"reset_cache\": \"Reset Cache\",\r\n        \"show_seed\": \"Show Seed\"\r\n    },\r\n\r\n    \"create_account\": {\r\n        \"account_index\": \"Account Index\",\r\n        \"account_name\": \"Account Name\",\r\n        \"number_of_addresses\": \"Number of Addresses\",\r\n        \"create_account\": \"Create Account\"\r\n    },\r\n\r\n    \"create_wallet\": {\r\n        \"account_name\": \"Account Name\",\r\n        \"number_of_addresses\": \"Number of Addresses\",\r\n        \"use_custom_seed\": \"Use Custom Seed\",\r\n        \"use_passphrase\": \"With Passphrase\",\r\n        \"seed_words\": \"Mnemonic Seed Words (optional, 24 words)\",\r\n        \"passphrase\": \"Passphrase (secure password, 10+ characters)\",\r\n        \"placeholder\": \"<random>\",\r\n        \"create_wallet\": \"Create Wallet\"\r\n    },\r\n\r\n    \"market_menu\": {\r\n        \"they_offer\": \"They Offer\",\r\n        \"they_ask\": \"They Ask\",\r\n        \"anything\": \"Anything\",\r\n        \"offers\": \"Offers\",\r\n        \"history\": \"History\"\r\n    },\r\n\r\n    \"market_offers\": {\r\n        \"accept_offer\": \"Accept Offer\",\r\n        \"wallet_ballance\": \"Wallet Balance\",\r\n        \"you_send\": \"You send\",\r\n        \"you_receive\": \"You Receive\",\r\n        \"you_pay\": \"You Pay\",\r\n\r\n        \"increase\": \"Increase\",\r\n        \"trade\": \"Trade\"\r\n    },\r\n\r\n    \"login\": {\r\n        \"password_label\": \"Password (see PASSWD file)\",\r\n        \"login\": \"Login\"\r\n    },\r\n\r\n    \"account_history_form\": {\r\n        \"spend\": \"Spend\",\r\n        \"receive\": \"Receive\",\r\n        \"reward\": \"Reward\",\r\n        \"tx_fee\": \"TX Fee\"\r\n    },\r\n\r\n    \"farmer_menu\": {\r\n        \"plots\": \"Plots\",\r\n        \"blocks\": \"Blocks\",\r\n        \"proofs\": \"Proofs\"\r\n    },\r\n\r\n    \"farmer_plots\": {\r\n        \"type\": \"Type\",\r\n        \"count\": \"Count\",\r\n        \"reload_plots\": \"Reload Plots\"\r\n    },\r\n\r\n    \"farmer_plot_dirs\": {\r\n        \"path\": \"Path\"\r\n    },\r\n\r\n    \"swap\": {\r\n        \"swap\": \"Swap\",\r\n        \"pool_balance\": \"Pool Balance\",\r\n        \"volume\": \"Volume\",\r\n        \"24h\": \"24h\",\r\n        \"7d\": \"7 days\",\r\n        \"apy\": \"APY\",\r\n\r\n        \"trade\": \"Trade\",\r\n        \"history\": \"History\",\r\n        \"my_liquidity\": \"My Liquidity\",\r\n        \"pool_state\": \"Pool State\",\r\n\r\n        \"my_balance\": \"My Balance\",\r\n        \"fees_earned\": \"Fees Earned\",\r\n        \"fee_level\": \"Fee Level\",\r\n        \"unlock_height\": \"Unlock Height\",\r\n\r\n        \"user_total\": \"User Total\",\r\n\r\n        \"token_amount\": \"Token Amount\",\r\n        \"currency_amount\": \"Currency Amount\",\r\n\r\n        \"price_match\": \"Price Match\",\r\n        \"payout\": \"Payout\",\r\n        \"switch_fee\": \"Switch Fee\",\r\n        \"add_liquidity\": \"Add Liquidity\",\r\n        \"remove_iquidity\": \"Remove Liquidity\",\r\n        \"remove_all\": \"Remove All\",\r\n\r\n        \"wallet_ballance\": \"Wallet Balance\",\r\n        \"buy_amount\": \"Buy Amount\",\r\n        \"sell_amount\": \"Sell Amount\",\r\n        \"trade_fee_estimated\": \"Trade Fee (estimated)\",\r\n        \"you_receive_estimated\": \"You receive (estimated)\",\r\n\r\n        \"sell\": \"Sell\",\r\n        \"buy\": \"Buy\"\r\n    },\r\n\r\n    \"$vuetify\": {\r\n        close: 'Close',\r\n        dataIterator: {\r\n            pageText: '{0}-{1} of {2}',\r\n            noResultsText: 'No matching records found',\r\n            loadingText: 'Loading items...',\r\n        },\r\n        dataTable: {\r\n            itemsPerPageText: 'Rows per page:',\r\n            ariaLabel: {\r\n            sortDescending: ': Sorted descending. Activate to remove sorting.',\r\n            sortAscending: ': Sorted ascending. Activate to sort descending.',\r\n            sortNone: ': Not sorted. Activate to sort ascending.',\r\n            },\r\n            sortBy: 'Sort by',\r\n        },\r\n        dataFooter: {\r\n            itemsPerPageText: 'Items per page:',\r\n            itemsPerPageAll: 'All',\r\n            nextPage: 'Next page',\r\n            prevPage: 'Previous page',\r\n            firstPage: 'First page',\r\n            lastPage: 'Last page',\r\n        },\r\n        datePicker: {\r\n            itemsSelected: '{0} selected',\r\n        },\r\n        noDataText: 'No data available',\r\n        carousel: {\r\n            prev: 'Previous visual',\r\n            next: 'Next visual',\r\n        },\r\n        calendar: {\r\n            moreEvents: '{0} more',\r\n        },\r\n        fileInput: {\r\n            counter: '{0} files',\r\n            counterSize: '{0} files ({1} in total)',\r\n        },\r\n    }\r\n}"
  },
  {
    "path": "www/web-gui/public/locales/es.json",
    "content": "{\r\n    \"common\": {\r\n        \"yes\": \"Si\",\r\n        \"no\": \"No\",\r\n        \"default\": \"por defecto\",\r\n        \"node\": \"Nodo\",\r\n        \"wallet\": \"Billetera\",\r\n        \"height\": \"Altura\",\r\n        \"blocks\": \"Bloques\",\r\n        \"balance\": \"Saldo\",\r\n        \"token\": \"Token\",\r\n        \"hash\": \"Hash\",\r\n        \"reward\": \"Recompensa\",\r\n        \"amount\": \"Cantidad\",\r\n        \"address\": \"Dirección\",\r\n        \"type\": \"Tipo\",\r\n        \"time\": \"hora\",\r\n        \"fee\": \"Comisión\",\r\n        \"pending\": \"pendiente\",\r\n        \"confirm\": \"Confirmar\",\r\n        \"deploy\": \"Desplegar\",\r\n        \"create\": \"Crear\",\r\n        \"transaction_has_been_sent\": \"La transacción ha sido enviada\",\r\n        \"failed_with\": \"Fallado con\",\r\n        \"deployed_as\": \"Desplegado como\",\r\n        \"link\": \"Enlace\"\r\n    },\r\n    \"main_menu\": {\r\n        \"explore\": \"Explorar\",\r\n        \"market\": \"Mercado\",\r\n        \"exchange\": \"Exchange\",\r\n        \"settings\": \"Ajustes\",\r\n        \"logout\": \"Cerrar sesión\"\r\n    },\r\n    \"node_common\": {\r\n        \"vdf_speed\": \"Velocidad VDF\",\r\n        \"block_reward\": \"Recompensa de bloque\",\r\n        \"tx_fees\": \"Comisión de transacción\",\r\n        \"netspace\": \"Espacio de la red\"\r\n    },\r\n    \"node_menu\": {\r\n        \"log\": \"Log\",\r\n        \"peers\": \"Pares\"\r\n    },\r\n    \"node_info\": {\r\n        \"synced\": \"Sincronizado\",\r\n        \"supply\": \"Suministro\",\r\n        \"no_addresses\": \"Numero de dirección\"\r\n    },\r\n    \"node_log\": {\r\n        \"terminal\": \"Terminal\",\r\n        \"router\": \"Router\",\r\n        \"farmer\": \"Granjero\",\r\n        \"harvester\": \"Harvester\",\r\n        \"timelord\": \"Servidor de hora\"\r\n    },\r\n    \"node_peers\": {\r\n        \"version\": \"Versión\",\r\n        \"received\": \"Recibido\",\r\n        \"send\": \"Enviar\",\r\n        \"ping\": \"Ping\",\r\n        \"duration\": \"Duración\",\r\n        \"credits\": \"Creditos\",\r\n        \"tx_gas\": \"TX Gas\",\r\n        \"connection\": \"Conexión\",\r\n        \"outbound\": \"saliente\",\r\n        \"inbound\": \"entrante\"\r\n    },\r\n    \"wallet_summary\": {\r\n        \"new\": \"Nuevo\"\r\n    },\r\n    \"account_menu\": {\r\n        \"nfts\": \"NFTs\",\r\n        \"contracts\": \"Contratos\",\r\n        \"addresses\": \"Direcciones\",\r\n        \"send\": \"Enviar\",\r\n        \"offer\": \"Ofrecer\",\r\n        \"history\": \"Historial\",\r\n        \"details\": \"Detalles\"\r\n    },\r\n    \"account_send_form\": {\r\n        \"source_address\": \"Direccion Origen\",\r\n        \"destination\": \"destino\",\r\n        \"destination_address\": \"Dirección Destino\",\r\n        \"address_input\": \"Direccion de entrada\",\r\n        \"currency\": \"Divisa\",\r\n        \"send\": \"Enviar\"\r\n    },\r\n    \"balance_table\": {\r\n        \"locked\": \"Bloqueado\",\r\n        \"spendable\": \"Gastable\",\r\n        \"contract\": \"Contrato\"\r\n    },\r\n    \"account_balance\": {\r\n        \"reserved\": \"Reservado\"\r\n    },\r\n    \"account_offers\": {\r\n        \"offer\": \"Oferta\",\r\n        \"receive\": \"Recibir\",\r\n        \"status\": \"Estado\",\r\n        \"actions\": \"Acciones\",\r\n        \"revoke\": \"Revocar\",\r\n        \"accepted\": \"Aceptado\",\r\n        \"revoked\": \"Revocado\",\r\n        \"open\": \"Abierto\"\r\n    },\r\n    \"account_offer_form\": {\r\n        \"offer_amount\": \"Cantidad ofrecida\",\r\n        \"offer_currency\": \"Divisa de la oferta\",\r\n        \"receive_amount\": \"Cantidad a recibir\",\r\n        \"receive_currency_contract\": \"Recibir divisa contrato\",\r\n        \"symbol\": \"símbolo\",\r\n        \"offer\": \"Oferta\"\r\n    },\r\n    \"explore_menu\": {\r\n        \"transactions\": \"Transacciones\",\r\n        \"block_height\": \"Altura de bloque\"\r\n    },\r\n    \"explore_blocks\": {\r\n        \"score\": \"Puntucación\"\r\n    },\r\n    \"explore_transactions\": {\r\n        \"transaction_id\": \"ID de Transacción\"\r\n    },\r\n    \"block_view\": {\r\n        \"previous\": \"Anterior\",\r\n        \"next\": \"Siguiente\",\r\n        \"block\": \"Bloque\",\r\n        \"no_such_block\": \"No existe bloque!\",\r\n        \"time_diff\": \"Diferencia de tiempo\",\r\n        \"space_diff\": \"Diferencia de tamaño\",\r\n        \"vdf_iterations\": \"Iteraciones VDF\",\r\n        \"tx_base\": \"Base de TX\",\r\n        \"tx_count\": \"conteo de TX\",\r\n        \"k_size\": \"Tamaño de K\",\r\n        \"proof_score\": \"Puntucuación de prueba\",\r\n        \"plot_id\": \"ID de Plot\",\r\n        \"farmer_key\": \"Llave de Farmer\",\r\n        \"inputs\": \"Entradas\",\r\n        \"outputs\": \"Salidas\",\r\n        \"operations\": \"Operaciones\"\r\n    },\r\n    \"transaction_view\": {\r\n        \"transaction\": \"Transacción\",\r\n        \"confirmed\": \"Confirmado\",\r\n        \"expires\": \"Caduca\",\r\n        \"note\": \"Nota\",\r\n        \"sender\": \"Enviador\",\r\n        \"cost\": \"Coste\",\r\n        \"input\": \"Entrada\",\r\n        \"output\": \"Salida\"\r\n    },\r\n    \"create_contract_menu\": {\r\n        \"contract_type\": \"Tipo de Contrato\"\r\n    },\r\n    \"account_contract_summary\": {\r\n        \"deposit\": \"Depositar\",\r\n        \"withdraw\": \"Retirar\"\r\n    },\r\n    \"node_settings\": {\r\n        \"language\": \"Idioma\",\r\n        \"enable_timelord\": \"Habilitar servidor de tiempo\",\r\n        \"farmer_reward_address\": \"Direccion de granjero para recompensas\",\r\n        \"timeLord_reward_address\": \"Direccion de servidor de tiempo para recompensas\",\r\n        \"reward_address_placeholder\": \"<по умолчанию>\",\r\n        \"restart_needed\": \"(Se requiere reinicio para aplicar)\"\r\n    },\r\n    \"create_locked_contract\": {\r\n        \"owner_address\": \"Direccion de dueño\",\r\n        \"unlock_height\": \"Desbloquear en altura de cadena\"\r\n    },\r\n    \"create_virtual_plot_contract\": {\r\n        \"farmer_public_key\": \"Llave pública granjero\",\r\n        \"reward_address\": \"Direccion de recompensa (opcional, para pooling)\"\r\n    },\r\n    \"account_details\": {\r\n        \"copy_keys_to_plotter\": \"Copiar claves al plotter\"\r\n    },\r\n    \"account_actions\": {\r\n        \"reset_cache\": \"Reiniciar Cache\",\r\n        \"show_seed\": \"Mostrar semilla\"\r\n    },\r\n    \"create_account\": {\r\n        \"account_index\": \"Numero de la cuenta\",\r\n        \"account_name\": \"Nombre de la cuenta\",\r\n        \"number_of_addresses\": \"Numero de direcciones\",\r\n        \"create_account\": \"Crear cuenta\"\r\n    },\r\n    \"create_wallet\": {\r\n        \"use_custom_seed\": \"Usar semilla personalizada\",\r\n        \"seed_hash\": \"Hash de la semilla (opcional, cadena hex de 64 caracteres)\",\r\n        \"placeholder\": \"<random>\",\r\n        \"create_wallet\": \"Crear billetera\"\r\n    },\r\n    \"market_menu\": {\r\n        \"they_offer\": \"Ellos ofrecen\",\r\n        \"they_ask\": \"Ellos preguntan\",\r\n        \"anything\": \"Cualquiera\",\r\n        \"offers\": \"Ofertas\"\r\n    },\r\n    \"market_offers\": {\r\n        \"price\": \"Precio\",\r\n        \"accept\": \"Aceptar\",\r\n        \"cancel\": \"Cancelar\",\r\n        \"accept_offer\": \"Aceptar Oferta\",\r\n        \"you_receive\": \"Tu recibes\",\r\n        \"you_pay\": \"Tu pagas\"\r\n    },\r\n    \"login\": {\r\n        \"password_label\": \"Contraseña (mirar fichero PASSWD)\",\r\n        \"login\": \"Login\"\r\n    }\r\n}"
  },
  {
    "path": "www/web-gui/public/locales/id.json",
    "content": "﻿{\r\n    \"common\": {\r\n\t\"Indonesian_Translation_Version\": \"v0.1 by limsandy\",\r\n        \"yes\": \"Ya\",\r\n        \"no\": \"Tidak\",\r\n        \"default\": \"Setelan Awal\",\r\n        \"node\": \"Node\",\r\n        \"wallet\": \"Dompet\",\r\n        \"height\": \"Ketinggian\",\r\n        \"blocks\": \"Blok\",\r\n        \"balance\": \"Saldo\",\r\n        \"token\": \"Token\",\r\n        \"hash\": \"Hash\",\r\n        \"reward\": \"Imbalan\",\r\n        \"amount\": \"Jumlah\",\r\n        \"address\": \"Alamat\",\r\n        \"type\": \"Tipe\",\r\n        \"time\": \"Waktu\",\r\n        \"fee\": \"Biaya\",\r\n        \"pending\": \"Menunggu\",\r\n        \"confirm\": \"Memastikan\",\r\n        \"deploy\": \"Terapkan\",\r\n        \"create\": \"Buat\",\r\n        \"transaction_has_been_sent\": \"Transaksi telah dikirim\",\r\n        \"failed_with\": \"Gagal karena\",\r\n        \"deployed_as\": \"Diterapkan sebagai\",\r\n        \"link\": \"Tautan\"\r\n    },\r\n    \"main_menu\": {\r\n        \"explore\": \"Jelajah\",\r\n        \"market\": \"Bursa\",\r\n        \"exchange\": \"Exchange\",\r\n        \"settings\": \"Pengaturan\",\r\n        \"logout\": \"Keluar\"\r\n    },\r\n    \"node_common\": {\r\n        \"vdf_speed\": \"Kecepatan VDF\",\r\n        \"block_reward\": \"Imbalan Blok\",\r\n        \"netspace\": \"Ruang di Jaringan\"\r\n    },\r\n    \"node_menu\": {\r\n        \"log\": \"Berkas\",\r\n        \"peers\": \"Rekan\"\r\n    },\r\n    \"node_info\": {\r\n        \"synced\": \"Sinkronisasi\",\r\n        \"supply\": \"Pasokan\",\r\n        \"no_addresses\": \"Jumlah Alamat\"\r\n    },\r\n    \"node_log\": {\r\n        \"terminal\": \"Terminal\",\r\n        \"router\": \"Ruter\",\r\n        \"farmer\": \"Farmer\",\r\n        \"harvester\": \"Harvester\",\r\n        \"timelord\": \"TimeLord\"\r\n    },\r\n    \"node_peers\": {\r\n        \"version\": \"Versi\",\r\n        \"received\": \"Diterima\",\r\n        \"send\": \"Kirim\",\r\n        \"ping\": \"Ping\",\r\n        \"duration\": \"Durasi\",\r\n        \"credits\": \"Kredit\",\r\n        \"tx_gas\": \"Biaya TX\",\r\n        \"connection\": \"Koneksi\",\r\n        \"outbound\": \"Keluar\",\r\n        \"inbound\": \"Masuk\"\r\n    },\r\n    \"wallet_summary\": {\r\n        \"new\": \"Baru\"\r\n    },\r\n    \"account_menu\": {\r\n        \"nfts\": \"NFTs\",\r\n        \"contracts\": \"Kontrak\",\r\n        \"addresses\": \"Alamat\",\r\n        \"send\": \"Kirim\",\r\n        \"offer\": \"Tawarkan\",\r\n        \"history\": \"Sejarah\",\r\n        \"details\": \"Rincian\"\r\n    },\r\n    \"account_send_form\": {\r\n        \"source_address\": \"Alamat Sumber\",\r\n        \"destination\": \"Tujuan\",\r\n        \"destination_address\": \"Alamat Tujuan\",\r\n        \"address_input\": \"Alamat Masukan\",\r\n        \"currency\": \"Mata Uang\",\r\n        \"send\": \"Kirim\"\r\n    },\r\n    \"balance_table\": {\r\n        \"locked\": \"Dikunci\",\r\n        \"spendable\": \"Bisa Dibelanjakan\",\r\n        \"contract\": \"Kontrak\"\r\n    },\r\n    \"account_balance\": {\r\n        \"reserved\": \"Cadangan\"\r\n    },\r\n    \"account_offers\": {\r\n        \"offer\": \"Tawaran\",\r\n        \"receive\": \"Terima\",\r\n        \"status\": \"Status\",\r\n        \"actions\": \"Tindakan\",\r\n        \"revoke\": \"Batalkan\",\r\n        \"accepted\": \"Diterima\",\r\n        \"revoked\": \"Dibatalkan\",\r\n        \"open\": \"Buka\"\r\n    },\r\n    \"account_offer_form\": {\r\n        \"offer_amount\": \"Jumlah Tawaran\",\r\n        \"offer_currency\": \"Mata Uang Tawaran\",\r\n        \"receive_amount\": \"Jumlah Diterima\",\r\n        \"receive_currency_contract\": \"Terima Mata Uang Kontrak\",\r\n        \"symbol\": \"Simbol\",\r\n        \"offer\": \"Tawaran\"\r\n    },\r\n    \"explore_menu\": {\r\n        \"transactions\": \"Transaksi\",\r\n        \"block_height\": \"Ketinggian blok\"\r\n    },\r\n    \"explore_blocks\": {\r\n        \"score\": \"Skor\"\r\n    },\r\n    \"explore_transactions\": {\r\n        \"transaction_id\": \"ID Transaksi\"\r\n    },\r\n    \"block_view\": {\r\n        \"previous\": \"Sebelumnya\",\r\n        \"next\": \"Berikutnya\",\r\n        \"block\": \"Blok\",\r\n        \"no_such_block\": \"Tidak ada blok demikian!\",\r\n        \"time_diff\": \"Perbedaan Waktu\",\r\n        \"space_diff\": \"Perbedaan Ruang\",\r\n        \"vdf_iterations\": \"VDF Iterasi\",\r\n        \"tx_base\": \"TX Dasar\",\r\n        \"tx_count\": \"TX Jumlah\",\r\n        \"k_size\": \"Ukuran k\",\r\n        \"proof_score\": \"Skor Bukti\",\r\n        \"plot_id\": \"ID Plot\",\r\n        \"farmer_key\": \"Kunci Farmer\",\r\n        \"inputs\": \"Masukan\",\r\n        \"outputs\": \"Keluaran\",\r\n        \"operations\": \"Operasi\"\r\n    },\r\n    \"transaction_view\": {\r\n        \"transaction\": \"Transaksi\",\r\n        \"confirmed\": \"Dipastikan\",\r\n        \"expires\": \"Lewat Kadaluarsa\",\r\n        \"note\": \"Catatan\",\r\n        \"sender\": \"Pengirim\",\r\n        \"cost\": \"Biaya\",\r\n        \"input\": \"Masukan\",\r\n        \"output\": \"Keluaran\"\r\n    },\r\n    \"create_contract_menu\": {\r\n        \"contract_type\": \"Tipe Kontrak\"\r\n    },\r\n    \"account_contract_summary\": {\r\n        \"deposit\": \"Setoran\",\r\n        \"withdraw\": \"Tarikan\"\r\n    },\r\n    \"node_settings\": {\r\n        \"language\": \"Bahasa\",\r\n        \"enable_timelord\": \"Nyalakan TimeLord\",\r\n        \"farmer_reward_address\": \"Alamat Imbalan Farmer\",\r\n        \"timeLord_reward_address\": \"Alamat Imbalan TimeLord\",\r\n        \"reward_address_placeholder\": \"Alamat Imbalan Sementara\",\r\n        \"restart_needed\": \"Perlu Dimulai Ulang\"\r\n    },\r\n    \"create_locked_contract\": {\r\n        \"owner_address\": \"Alamat Pemilik\",\r\n        \"unlock_height\": \"Dibuat Pada Ketinggian Blok\"\r\n    },\r\n    \"create_virtual_plot_contract\": {\r\n        \"farmer_public_key\": \"Kunci Umum Farmer\",\r\n        \"reward_address\": \"Alamat Imbalan (untuk pooling)\"\r\n    },\r\n    \"account_details\": {\r\n        \"copy_keys_to_plotter\": \"Salin Kunci ke plotter\"\r\n    },\r\n    \"account_actions\": {\r\n        \"reset_cache\": \"Bersihkan Cache\",\r\n        \"show_seed\": \"Tunjukkan Seed\"\r\n    },\r\n    \"create_account\": {\r\n        \"account_index\": \"Indeks Akun\",\r\n        \"account_name\": \"Nama Akun\",\r\n        \"number_of_addresses\": \"Jumlah Alamat\",\r\n        \"create_account\": \"Buat Akun\"\r\n    },\r\n    \"create_wallet\": {\r\n        \"use_custom_seed\": \"Pakai Seed Sendiri\",\r\n        \"seed_hash\": \"Seed Hash (optional, hex string, 64 karakter)\",\r\n        \"placeholder\": \"Sementara\",\r\n        \"create_wallet\": \"Buat Dompet\"\r\n    },\r\n    \"market_menu\": {\r\n        \"they_offer\": \"Tawaran Mereka\",\r\n        \"they_ask\": \"Tuntutan Mereka\",\r\n        \"anything\": \"Apa Aja\",\r\n        \"offers\": \"Tawaran\"\r\n    },\r\n    \"market_offers\": {\r\n        \"price\": \"Harga\",\r\n        \"accept\": \"Terima\",\r\n        \"cancel\": \"Batalkan\",\r\n        \"accept_offer\": \"Terima Tawaran\",\r\n        \"you_receive\": \"Kamu Menerima\",\r\n        \"you_pay\": \"Kamu Bayar\"\r\n    },\r\n    \"login\": {\r\n        \"password_label\": \"Password (lihat file PASSWD)\",\r\n        \"login\": \"Masuk\"\r\n    }\r\n}"
  },
  {
    "path": "www/web-gui/public/locales/nl.json",
    "content": "{\r\n    \"common\": {\r\n        \"yes\": \"Ja\",\r\n        \"no\": \"Nee\",\r\n        \"default\": \"standaard\",\r\n        \"node\": \"Node\",\r\n        \"wallet\": \"Portemonnee\",\r\n        \"height\": \"Hoogte\",\r\n        \"blocks\": \"Blokken\",\r\n        \"balance\": \"Saldo\",\r\n        \"token\": \"Token\",\r\n        \"hash\": \"Hash\",\r\n        \"reward\": \"Beloning\",\r\n        \"amount\": \"Aantal\",\r\n        \"address\": \"Adres\",\r\n        \"type\": \"Type\",\r\n        \"time\": \"Tijd\",\r\n        \"fee\": \"Tarief\",\r\n        \"pending\": \"in afwachting\",\r\n        \"confirm\": \"Bevestigen\",\r\n        \"deploy\": \"Implementeren\",\r\n        \"create\": \"Creëren\",\r\n        \"transaction_has_been_sent\": \"Transactie is verzonden\",\r\n        \"failed_with\": \"Mislukt met\",\r\n        \"deployed_as\": \"Geïmplementeerd als\",\r\n        \"link\": \"Link\"\r\n    },\r\n    \"main_menu\": {\r\n        \"explore\": \"Ontdekken\",\r\n        \"market\": \"Markt\",\r\n        \"exchange\": \"Beurs\",\r\n        \"settings\": \"Instellingen\",\r\n        \"logout\": \"Uitloggen\"\r\n    },\r\n    \"node_common\": {\r\n        \"vdf_speed\": \"VDF snelheid\",\r\n        \"block_reward\": \"Blok beloning\",\r\n        \"netspace\": \"Netruimte\"\r\n    },\r\n    \"node_menu\": {\r\n        \"log\": \"Log\",\r\n        \"peers\": \"Peers\"\r\n    },\r\n    \"node_info\": {\r\n        \"synced\": \"Gesynchroniseerd\",\r\n        \"supply\": \"Aanbod\",\r\n        \"no_addresses\": \"Nr. adressen\"\r\n    },\r\n    \"node_log\": {\r\n        \"terminal\": \"Terminal\",\r\n        \"router\": \"Router\",\r\n        \"farmer\": \"Farmer\",\r\n        \"harvester\": \"Harvester\",\r\n        \"timelord\": \"TimeLord\"\r\n    },\r\n    \"node_peers\": {\r\n        \"version\": \"Versie\",\r\n        \"received\": \"Ontvangen\",\r\n        \"send\": \"Verzonden\",\r\n        \"ping\": \"Ping\",\r\n        \"duration\": \"Looptijd\",\r\n        \"credits\": \"Krediet\",\r\n        \"tx_gas\": \"TX Gas\",\r\n        \"connection\": \"Verbinding\",\r\n        \"outbound\": \"uitgaand\",\r\n        \"inbound\": \"inkomend\"\r\n    },\r\n    \"wallet_summary\": {\r\n        \"new\": \"Nieuw\"\r\n    },\r\n    \"account_menu\": {\r\n        \"nfts\": \"NFTs\",\r\n        \"contracts\": \"Contracten\",\r\n        \"addresses\": \"Adressen\",\r\n        \"send\": \"Versturen\",\r\n        \"offer\": \"Bieden\",\r\n        \"history\": \"Geschiedenis\",\r\n        \"details\": \"Details\"\r\n    },\r\n    \"account_send_form\": {\r\n        \"source_address\": \"Bronadres\",\r\n        \"destination\": \"Bestemming\",\r\n        \"destination_address\": \"Bestemmingsadres\",\r\n        \"address_input\": \"Adresinvoer\",\r\n        \"currency\": \"Valuta\",\r\n        \"send\": \"Versturen\"\r\n    },\r\n    \"balance_table\": {\r\n        \"locked\": \"Op slot\",\r\n        \"spendable\": \"Besteedbaar\",\r\n        \"contract\": \"Contract\"\r\n    },\r\n    \"account_balance\": {\r\n        \"reserved\": \"Gereserveerd\"\r\n    },\r\n    \"account_offers\": {\r\n        \"offer\": \"Bieden\",\r\n        \"receive\": \"Ontvangen\",\r\n        \"status\": \"Status\",\r\n        \"actions\": \"Acties\",\r\n        \"revoke\": \"Intrekken\",\r\n        \"accepted\": \"Geaccepteerd\",\r\n        \"revoked\": \"Ingetrokken\",\r\n        \"open\": \"Open\"\r\n    },\r\n    \"account_offer_form\": {\r\n        \"offer_amount\": \"Te verzenden bedrag\",\r\n        \"offer_currency\": \"Te verzenden valuta\",\r\n        \"receive_amount\": \"Te ontvangen bedrag\",\r\n        \"receive_currency_contract\": \"Te ontvangen valuta contract\",\r\n        \"symbol\": \"Symbool\",\r\n        \"offer\": \"Bieden\"\r\n    },\r\n    \"explore_menu\": {\r\n        \"transactions\": \"Transacties\",\r\n        \"block_height\": \"blokhoogte\"\r\n    },\r\n    \"explore_blocks\": {\r\n        \"score\": \"Score\"\r\n    },\r\n    \"explore_transactions\": {\r\n        \"transaction_id\": \"Transactie ID\"\r\n    },\r\n    \"block_view\": {\r\n        \"previous\": \"Vorige\",\r\n        \"next\": \"Volgende\",\r\n        \"block\": \"Blok\",\r\n        \"no_such_block\": \"Blok bestaat niet!\",\r\n        \"time_diff\": \"Tijdsverschil\",\r\n        \"space_diff\": \"Ruimte verschil\",\r\n        \"vdf_iterations\": \"VDF iteraties\",\r\n        \"tx_base\": \"TX basis\",\r\n        \"tx_count\": \"TX aantal\",\r\n        \"k_size\": \"K maat\",\r\n        \"proof_score\": \"Bewijsscore\",\r\n        \"plot_id\": \"Plot ID\",\r\n        \"farmer_key\": \"Farmer sleutel\",\r\n        \"inputs\": \"Ingangen\",\r\n        \"outputs\": \"Uitgangen\",\r\n        \"operations\": \"Operaties\"\r\n    },\r\n    \"transaction_view\": {\r\n        \"transaction\": \"Transactie\",\r\n        \"confirmed\": \"Bevestigd\",\r\n        \"expires\": \"Verloopt\",\r\n        \"note\": \"Opmerking\",\r\n        \"sender\": \"Afzender\",\r\n        \"cost\": \"Kosten\",\r\n        \"input\": \"Invoer\",\r\n        \"output\": \"Uitvoer\"\r\n    },\r\n    \"create_contract_menu\": {\r\n        \"contract_type\": \"Contract type\"\r\n    },\r\n    \"account_contract_summary\": {\r\n        \"deposit\": \"Storten\",\r\n        \"withdraw\": \"Opnemen\"\r\n    },\r\n    \"node_settings\": {\r\n        \"language\": \"Taal\",\r\n        \"enable_timelord\": \"TimeLord inschakelen\",\r\n        \"farmer_reward_address\": \"Farmer beloningsadres\",\r\n        \"timeLord_reward_address\": \"TimeLord beloningsadres\",\r\n        \"reward_address_placeholder\": \"beloningsadres\",\r\n        \"restart_needed\": \"(herstart nodig om toe te passen)\"\r\n    },\r\n    \"create_locked_contract\": {\r\n        \"owner_address\": \"Eigenaar adres\",\r\n        \"unlock_height\": \"Ontgrendelen op blokhoogte\"\r\n    },\r\n    \"create_virtual_plot_contract\": {\r\n        \"farmer_public_key\": \"Farmer publieke sleutel\",\r\n        \"reward_address\": \"Beloningsadres (optioneel, voor poolen)\"\r\n    },\r\n    \"account_details\": {\r\n        \"copy_keys_to_plotter\": \"Kopieer sleutels naar plotter\"\r\n    },\r\n    \"account_actions\": {\r\n        \"reset_cache\": \"Cache resetten\",\r\n        \"show_seed\": \"Toon seed\"\r\n    },\r\n    \"create_account\": {\r\n        \"account_index\": \"Account index\",\r\n        \"account_name\": \"Accountnaam\",\r\n        \"number_of_addresses\": \"Aantal adressen\",\r\n        \"create_account\": \"Account aanmaken\"\r\n    },\r\n    \"create_wallet\": {\r\n        \"use_custom_seed\": \"Gebruik aangepaste seed\",\r\n        \"seed_hash\": \"Seed hash (optioneel, hex string, 64 karakters)\",\r\n        \"placeholder\": \"<random>\",\r\n        \"create_wallet\": \"Portemonnee maken\"\r\n    },\r\n    \"market_menu\": {\r\n        \"they_offer\": \"Zij bieden aan\",\r\n        \"they_ask\": \"Zij vragen\",\r\n        \"anything\": \"Alles\",\r\n        \"offers\": \"Aanbiedingen\"\r\n    },\r\n    \"market_offers\": {\r\n        \"price\": \"Prijs\",\r\n        \"accept\": \"Accepteren\",\r\n        \"cancel\": \"Annuleren\",\r\n        \"accept_offer\": \"Aanbieding accepteren\",\r\n        \"you_receive\": \"Jij ontvangt\",\r\n        \"you_pay\": \"Jij betaald\"\r\n    },\r\n    \"login\": {\r\n        \"password_label\": \"Wachtwoord (zie PASSWD bestand)\",\r\n        \"login\": \"Log in\"\r\n    }\r\n}"
  },
  {
    "path": "www/web-gui/public/locales/pt.json",
    "content": "{\r\n    \"common\": {\r\n        \"yes\": \"Sim\",\r\n        \"no\": \"Não\",\r\n        \"default\": \"Por omissão\",\r\n        \"node\": \"Node\",\r\n        \"wallet\": \"Wallet\",\r\n        \"height\": \"Height\",\r\n        \"blocks\": \"Blocks\",\r\n        \"balance\": \"Saldo\",\r\n        \"token\": \"Token\",\r\n        \"hash\": \"Hash\",\r\n        \"reward\": \"Recompensa\",\r\n        \"amount\": \"Montante\",\r\n        \"address\": \"Endereço\",\r\n        \"type\": \"Tipo\",\r\n        \"time\": \"Tempo\",\r\n        \"fee\": \"Taxa\",\r\n        \"pending\": \"pendente\",\r\n        \"confirm\": \"Confirmar\",\r\n        \"deploy\": \"Deploy\",\r\n        \"create\": \"Criar\",\r\n        \"transaction_has_been_sent\": \"A transacção foi enviada\",\r\n        \"failed_with\": \"Falhou com \",\r\n        \"deployed_as\": \"Deployed as\",\r\n        \"link\": \"Link\"\r\n    },\r\n    \"main_menu\": {\r\n        \"explore\": \"Explorar\",\r\n        \"market\": \"Mercado\",\r\n        \"exchange\": \"Exchange\",\r\n        \"settings\": \"Definições\",\r\n        \"logout\": \"Sair\"\r\n    },\r\n    \"node_common\": {\r\n        \"vdf_speed\": \"Velocidade do VDF\",\r\n        \"block_reward\": \"Recompensa pelo bloco\",\r\n        \"netspace\": \"Dimensão da rede\"\r\n    },\r\n    \"node_menu\": {\r\n        \"log\": \"Log\",\r\n        \"peers\": \"Peers\"\r\n    },\r\n    \"node_info\": {\r\n        \"synced\": \"Sincronizado\",\r\n        \"supply\": \"Oferta\",\r\n        \"no_addresses\": \"Num endereços\"\r\n    },\r\n    \"node_log\": {\r\n        \"terminal\": \"Terminal\",\r\n        \"router\": \"Router\",\r\n        \"farmer\": \"Farmer\",\r\n        \"harvester\": \"Harvester\",\r\n        \"timelord\": \"TimeLord\"\r\n    },\r\n    \"node_peers\": {\r\n        \"version\": \"Versão\",\r\n        \"received\": \"Recebido\",\r\n        \"send\": \"Enviar\",\r\n        \"ping\": \"Ping\",\r\n        \"duration\": \"Duração\",\r\n        \"credits\": \"Créditos\",\r\n        \"tx_gas\": \"TX Gas\",\r\n        \"connection\": \"Conexão\",\r\n        \"outbound\": \"saída\",\r\n        \"inbound\": \"entrada\"\r\n    },\r\n    \"wallet_summary\": {\r\n        \"new\": \"Criar\"\r\n    },\r\n    \"account_menu\": {\r\n        \"nfts\": \"NFTs\",\r\n        \"contracts\": \"Contratos\",\r\n        \"addresses\": \"Endereços\",\r\n        \"send\": \"Enviar\",\r\n        \"offer\": \"Oferta\",\r\n        \"history\": \"Histórico\",\r\n        \"details\": \"Detalhes\"\r\n    },\r\n    \"account_send_form\": {\r\n        \"source_address\": \"Endereço de origem\",\r\n        \"destination\": \"Destino\",\r\n        \"destination_address\": \"Endereço de destino\",\r\n        \"address_input\": \"Introduza o endereço\",\r\n        \"currency\": \"Moeda\",\r\n        \"send\": \"Enviar\"\r\n    },\r\n    \"balance_table\": {\r\n        \"locked\": \"Bloqueado\",\r\n        \"spendable\": \"Pode ser gasto\",\r\n        \"contract\": \"Contrato\"\r\n    },\r\n    \"account_balance\": {\r\n        \"reserved\": \"Reservado\"\r\n    },\r\n    \"account_offers\": {\r\n        \"offer\": \"Oferta\",\r\n        \"receive\": \"Receber\",\r\n        \"status\": \"Estado\",\r\n        \"actions\": \"Acções\",\r\n        \"revoke\": \"Revogar\",\r\n        \"accepted\": \"Aceite\",\r\n        \"revoked\": \"Revogado\",\r\n        \"open\": \"Abrir\"\r\n    },\r\n    \"account_offer_form\": {\r\n        \"offer_amount\": \"Montante da oferta\",\r\n        \"offer_currency\": \"Moeda da oferta\",\r\n        \"receive_amount\": \"Montante recebido\",\r\n        \"receive_currency_contract\": \"Contrato para receber a moeda\",\r\n        \"symbol\": \"Simbolo\",\r\n        \"offer\": \"Oferta\"\r\n    },\r\n    \"explore_menu\": {\r\n        \"transactions\": \"Transacções\",\r\n        \"block_height\": \"height do bloco\"\r\n    },\r\n    \"explore_blocks\": {\r\n        \"score\": \"Pontuação\"\r\n    },\r\n    \"explore_transactions\": {\r\n        \"transaction_id\": \"ID da transacção\"\r\n    },\r\n    \"block_view\": {\r\n        \"previous\": \"Anterior\",\r\n        \"next\": \"Seguinte\",\r\n        \"block\": \"Bloco\",\r\n        \"no_such_block\": \"O bloco não existe!\",\r\n        \"time_diff\": \"Diferença de tempo\",\r\n        \"space_diff\": \"Diferença de espaço\",\r\n        \"vdf_iterations\": \"Iterações VDF\",\r\n        \"tx_base\": \"TX Base\",\r\n        \"tx_count\": \"TX Contador\",\r\n        \"k_size\": \"K Tamanho\",\r\n        \"proof_score\": \"Prova da pontuação\",\r\n        \"plot_id\": \"Plot ID\",\r\n        \"farmer_key\": \"Chave do Farmer\",\r\n        \"inputs\": \"Entradas\",\r\n        \"outputs\": \"Saidas\",\r\n        \"operations\": \"Operações\"\r\n    },\r\n    \"transaction_view\": {\r\n        \"transaction\": \"Transacção\",\r\n        \"confirmed\": \"Confirmado\",\r\n        \"expires\": \"Expira\",\r\n        \"note\": \"Nota\",\r\n        \"sender\": \"Quem enviou\",\r\n        \"cost\": \"Custo\",\r\n        \"input\": \"Entrada\",\r\n        \"output\": \"Saida\"\r\n    },\r\n    \"create_contract_menu\": {\r\n        \"contract_type\": \"Tipo de contrato\"\r\n    },\r\n    \"account_contract_summary\": {\r\n        \"deposit\": \"Depositar\",\r\n        \"withdraw\": \"Levantar\"\r\n    },\r\n    \"node_settings\": {\r\n        \"language\": \"Idioma\",\r\n        \"enable_timelord\": \"Activar o TimeLord\",\r\n        \"farmer_reward_address\": \"Endereço de recompensa do Farmer\",\r\n        \"timeLord_reward_address\": \"Endereço de recompensa do TimeLord\",\r\n        \"reward_address_placeholder\": \"<по умолчанию>\",\r\n        \"restart_needed\": \"(é necessário reiniciar para produzir efeito)\"\r\n    },\r\n    \"create_locked_contract\": {\r\n        \"owner_address\": \"Endereço do proprietário\",\r\n        \"unlock_height\": \"Desbloqueado no Chain Height\"\r\n    },\r\n    \"create_virtual_plot_contract\": {\r\n        \"farmer_public_key\": \"Farmer Public Key\",\r\n        \"reward_address\": \"Endereço de recompensa (opcional, para pooling)\"\r\n    },\r\n    \"account_details\": {\r\n        \"copy_keys_to_plotter\": \"Copiar chaves para o plotter\"\r\n    },\r\n    \"account_actions\": {\r\n        \"reset_cache\": \"Limpar Cache\",\r\n        \"show_seed\": \"Mostrar Seed\"\r\n    },\r\n    \"create_account\": {\r\n        \"account_index\": \"Índice da conta\",\r\n        \"account_name\": \"Nome da conta\",\r\n        \"number_of_addresses\": \"Número de endereços\",\r\n        \"create_account\": \"Criar conta\"\r\n    },\r\n    \"create_wallet\": {\r\n        \"use_custom_seed\": \"Usar Seed personalizada\",\r\n        \"seed_hash\": \"Seed Hash (opcional, string hexadecimal, 64 caracteres)\",\r\n        \"placeholder\": \"<aleatório>\",\r\n        \"create_wallet\": \"Criar Wallet\"\r\n    },\r\n    \"market_menu\": {\r\n        \"they_offer\": \"Oferecido por outro\",\r\n        \"they_ask\": \"Pediram\",\r\n        \"anything\": \"Qualquer coisa\",\r\n        \"offers\": \"Ofertas\"\r\n    },\r\n    \"market_offers\": {\r\n        \"price\": \"Preço\",\r\n        \"accept\": \"Aceitar\",\r\n        \"cancel\": \"Cancelar\",\r\n        \"accept_offer\": \"Aceitar oferta\",\r\n        \"you_receive\": \"Vais receber\",\r\n        \"you_pay\": \"Vais pagar\"\r\n    },\r\n    \"login\": {\r\n        \"password_label\": \"Palavra-passe (ver o ficheiro PASSWD)\",\r\n        \"login\": \"Entrar\"\r\n    }\r\n}\r\n"
  },
  {
    "path": "www/web-gui/public/locales/ru.json",
    "content": "{\r\n    \"common\": {\r\n        \"yes\": \"Да\",\r\n        \"no\": \"Нет\",\r\n\r\n        \"default\": \"по умолчанию\",\r\n\r\n        \"node\": \"Узел\",\r\n        \"wallet\": \"Кошелёк\",\r\n        \"height\": \"Высота\",\r\n        \"blocks\": \"Блоки\",\r\n        \"balance\": \"Баланс\",\r\n        \"name\": \"Название\",\r\n        \"token\": \"Токен\",\r\n        \"currency\": \"Валюта\",\r\n        \"symbol\": \"Символ\",\r\n        \"price\": \"Цена\",\r\n        \"hash\": \"Хэш\",\r\n        \"reward\": \"Награда\",\r\n        \"amount\": \"Сумма\",\r\n        \"address\": \"Адрес\",\r\n        \"contract\": \"Контракт\",\r\n        \"type\": \"Тип\",\r\n        \"time\": \"Время\",\r\n        \"fee\": \"Комиссия\",\r\n        \"pending\": \"ожидается\",\r\n\r\n        \"confirm\": \"Подтвердить\",\r\n        \"deploy\": \"Развернуть\",\r\n        \"create\": \"Создать\",\r\n\t\t\"remove\": \"Удалить\",\r\n\r\n        \"accept\": \"Принять\",\r\n        \"cancel\": \"Отмена\",\r\n\t\t\r\n        \"transaction_has_been_sent\": \"Транзакция отправлена\",\r\n        \"failed_with\": \"Ошибка\",\r\n        \"deployed_as\": \"Развёрнут как\",\r\n\r\n        \"any\": \"Все\",\r\n\r\n        \"link\": \"Ссылка\",\r\n        \"owner\": \"Владелец\",\r\n        \"manage\": \"Управлять\",\r\n        \"harvester\": \"Комбайн\",\r\n        \"deposit\": \"Вклад\",\r\n\r\n        \"user\": \"Пользователь\"\r\n    },\r\n\r\n    \"main_menu\": {\r\n        \"explore\": \"Обозреватель\",\r\n        \"farmer\": \"Фермер\",\r\n        \"market\": \"Торговля\",\r\n        \"exchange\": \"Биржа\",\r\n        \"settings\": \"Настройки\",\r\n        \"logout\": \"Выйти\"\r\n    },\r\n\r\n    \"node_status\": {\r\n        \"disconnected\": \"Отключено от узла\",\r\n        \"logged_off\": \"Вылогенненый\",\r\n        \"connecting\": \"Подключение\",\r\n        \"syncing\": \"Синхронизация\",\r\n        \"synced\": \"Синхронизировано\"\r\n    },    \r\n\r\n    \"node_common\": {\r\n        \"vdf_speed\": \"Скорость VDF\",\r\n        \"block_reward\": \"Награда за блок\",\r\n        \"block_size\": \"Объем блока\",\r\n        \"tx_fees\": \"Комиссии\",\r\n        \"netspace\": \"Пространство сети\"\r\n    },\r\n\r\n    \"node_menu\": {\r\n        \"log\": \"Журнал\",\r\n        \"peers\": \"Пиры\"\r\n    },\r\n\r\n    \"node_info\": {\r\n        \"synced\": \"Синхронизировано\",\r\n        \"supply\": \"Эмиссия\",\r\n        \"no_addresses\": \"Количество адресов\"\r\n    },\r\n\r\n    \"farmer_info\": {\r\n        \"virtual_balance\": \"Виртуальный баланс\",\r\n        \"virtual_size\": \"Виртуальный объем\",\r\n        \"physical_size\": \"Физический объем\",\r\n        \"total_farm_size\": \"Общий объем фермы\"\r\n    },    \r\n\r\n    \"node_log\": {\r\n        \"terminal\": \"Терминал\",\r\n        \"router\": \"Маршрутизатор\",\r\n        \"farmer\": \"Фермер\",\r\n        \"timelord\": \"Таймлорд\"\r\n    },\r\n\r\n    \"node_log_table\": {\r\n        \"module\": \"Модуль\",\r\n        \"message\": \"Сообщение\"\r\n    },\r\n\r\n    \"node_peers\": {\r\n        \"version\": \"Версия\",\r\n        \"received\": \"Загрузка\",\r\n        \"send\": \"Отдача\",\r\n        \"ping\": \"Пинг\",\r\n        \"duration\": \"Время\",\r\n        \"credits\": \"Кредиты\",\r\n        \"tx_gas\": \"TX Газ\",\r\n        \"connection\": \"Соединение\",\r\n        \"outbound\": \"исходящее\",\r\n        \"inbound\": \"входящее\"\r\n    },\r\n\r\n    \"wallet_summary\": {\r\n        \"new\": \"Новый\"\r\n    },\r\n\r\n    \"account_menu\": {\r\n        \"nfts\": \"NFT\",\r\n        \"contracts\": \"Контракты\",\r\n        \"addresses\": \"Адреса\",\r\n        \"send\": \"Отправить\",\r\n        \"plots\": \"Плоты\",\r\n        \"offer\": \"Офферы\",\r\n        \"history\": \"История\",\r\n        \"liquidity\": \"Ликвидность\",\r\n        \"info\": \"Информация\",\r\n        \"details\": \"Подробности\"\r\n    },\r\n\r\n    \"account_send_form\": {\r\n        \"source_address\": \"Исходный адрес\",\r\n        \"destination\": \"Получатель\",\r\n        \"destination_address\": \"Адрес получателя\",\r\n        \"address_input\": \"Ввод адреса\",\r\n        \"send\": \"Отправить\"\r\n    },\r\n\r\n    \"balance_table\": {\r\n        \"locked\": \"Заблокировано\",\r\n        \"spendable\": \"Доступно\"\r\n    },\r\n\r\n    \"account_balance\": {\r\n        \"reserved\": \"Зарезервировано\",\r\n        \"show_unknown\": \"Показывать неизвестные\"\r\n    },\r\n\r\n    \"account_plots\": {\r\n        \"size\": \"Объём\",\r\n        \"new_plot\": \"Новый плот\",\r\n\r\n        \"from\": \"с\",\r\n        \"to\": \"на\",\r\n\r\n        \"deposit_warning\": \"Только 90% суммы депозита будет возвращено при снятии средств, остальное сжигается в качестве комиссии.\",\r\n        \"withdraw_warning\": \"Возвращается только 90% суммы, остальное сжигается в качестве комиссии.\"\r\n    },\r\n\r\n    \"account_offers\": {\r\n        \"offering\": \"Предложено\",\r\n        \"received\": \"Получено\",\r\n        \"status\": \"Статус\",\r\n        \"actions\": \"Действия\",\r\n        \"revoke\": \"Отозвать\",\r\n\r\n        \"accepted\": \"Принято\",\r\n        \"revoked\": \"Отозвано\",\r\n        \"open\": \"Открыто\",\r\n        \"deposit_to\": \"Сделать вклад на\"\r\n    },\r\n\r\n    \"account_offer_form\": {\r\n        \"offer_amount\": \"Сумма оффера\",\r\n        \"offer_currency\": \"Валюта оффера\",\r\n        \"receive_amount\": \"Сумма получения\",\r\n        \"receive_currency_contract\": \"Валюта получения (контракт)\",\r\n        \"symbol\": \"Символ\",\r\n        \"offer\": \"Предложить\"\r\n    },\r\n\r\n    \"explore_menu\": {\r\n        \"transactions\": \"Транзакции\",\r\n        \"farmers\": \"Фермеры\",\r\n        \"block_height\": \"Высота блока\"\r\n    },\r\n\r\n    \"explore_blocks\": {\r\n        \"score\": \"Оценка\",\r\n        \"size\": \"Объём\",\r\n        \"cost\": \"Расходы\"\r\n    },\r\n\r\n    \"explore_transactions\": {\r\n        \"transaction_id\": \"ID транзакции\"\r\n    },\r\n\r\n    \"explore_farmers\": {\r\n        \"no_blocks\": \"Кол-во блоков\",\r\n        \"farmer_key\": \"Ключ фермера\"\r\n    },    \r\n\r\n    \"block_view\": {\r\n        \"previous\": \"Предыдущий\",\r\n        \"next\": \"Следующий\",\r\n        \"block\": \"Блок\",\r\n        \"no_such_block\": \"Нет такого блока!\",\r\n\r\n        \"time_diff\": \"Time Diff\",\r\n        \"space_diff\": \"Space Diff\",\r\n        \"vdf_iterations\": \"Итерации VDF\",\r\n        \"tx_base\": \"TX Base\",\r\n        \"tx_count\": \"Кол-во транзакций\",\r\n        \"k_size\": \"K Размер\",\r\n        \"proof_score\": \"Оценка доказательства\",\r\n        \"plot_id\": \"ID плота\",\r\n        \"farmer_key\": \"Ключ фермера\",\r\n        \r\n        \"inputs\": \"Входы\",\r\n        \"outputs\": \"Выходы\",\r\n        \"operations\": \"Операции\"\r\n    },\r\n\r\n    \"transaction_view\": {\r\n        \"transaction\": \"Транзакция\",\r\n        \"confirmed\": \"Подтверждения\",\r\n        \"expires\": \"Истекает\",\r\n        \"note\": \"Заметка\",\r\n\r\n        \"sender\": \"Отправитель\",\r\n        \"cost\": \"Стоимость\",\r\n\r\n        \"input\": \"Ввод\",\r\n        \"output\": \"Вывод\",\r\n\r\n        \"no_such_transaction\": \"Нет такой транзакции!\"\r\n    },\r\n\r\n    \"create_contract_menu\": {\r\n        \"contract_type\": \"Тип контракта\"\r\n    },\r\n\r\n    \"account_contract_summary\": {\r\n        \"deposit\": \"Вклад\",\r\n        \"withdraw\": \"Вывод\"\r\n    },\r\n\r\n    \"node_settings\": {\r\n        \"gui\": \"Графический интерфейс\",\r\n        \"language\": \"Язык\",\r\n\r\n        \"theme\": \"Тема\",\r\n        \"light\": \"Светлая\",\r\n        \"dark\": \"Темная\",\r\n\r\n        \"general\": \"Основные\",\r\n        \"enable_timelord\": \"Включить Таймлорд\",\r\n        \"enable_timelord_reward\": \"Включить вознаграждения Таймлорда (требуется еще одно ядро ЦП)\",\r\n        \"verify_timelord_reward\": \"Подтверждать вознаграждения Таймлорда (отключить, чтобы ускорить проверку VDF)\",\r\n        \"open_port\": \"Открыть сетевой порт, чтобы разрешить входящие подключения (UPnP)\",\r\n        \"farmer_reward_address\": \"Адрес награды Фермера\",\r\n        \"timeLord_reward_address\": \"Адрес награды Таймлорда\",\r\n        \"restart_needed\": \"(необходим перезапуск)\",\r\n\r\n        \"opencl_device\": \"Устройство OpenCL\",\r\n\r\n        \"blockchain\": \"Блокчейн\",\r\n        \"revert_db_to_height\": \"Откатить базу данных на высоту\",\r\n        \"revert\": \"Откатить\"\r\n    },\r\n\r\n    \"harvester_settings\": {\r\n        \"harvester_reload_interval\": \"Интервал перезарядки комбайна (сек)\",\r\n        \"plot_directory\": \"Каталог с плотами\",\r\n        \"add_directory\": \"Добавить каталог\"\r\n    },\r\n\r\n    \"wallet_settings\": {\r\n        \"token_whitelist\": \"Белый список токенов\",\r\n        \"token_address\": \"Адрес токена\",\r\n        \"add_token\": \"Добавить токен\"\r\n    },\r\n\r\n    \"create_locked_contract\": {\r\n        \"owner_address\": \"Адрес владельца\",\r\n        \"unlock_height\": \"Высота разблокировки\"\r\n    },\r\n\r\n    \"create_virtual_plot_contract\": {\r\n        \"farmer_public_key\": \"Публичный ключ Фермера\",\r\n        \"reward_address\": \"Адрес награды (опционально, для пулинга)\"\r\n    },\r\n    \r\n    \"account_details\": {\r\n        \"copy_keys_to_plotter\": \"Копировать ключи в плоттер\"\r\n    },\r\n\r\n    \"account_actions\": {\r\n        \"reset_cache\": \"Сбросить кэш\",\r\n        \"show_seed\": \"Показать мнемонику\"\r\n    },\r\n\r\n    \"create_account\": {\r\n        \"account_index\": \"Индекс аккаунта\",\r\n        \"account_name\": \"Имя аккаунта\",\r\n        \"number_of_addresses\": \"Количество адресов\",\r\n        \"create_account\": \"Создать аккаунт\"\r\n    },\r\n\r\n    \"create_wallet\": {\r\n        \"use_custom_seed\": \"Использовать пользовательскую мнемонику\",\r\n        \"seed_hash\": \"Хеш мнемоники (опционально, шестнадцатеричная строка, 64 символа)\",\r\n        \"placeholder\": \"<случайный>\",\r\n        \"create_wallet\": \"Создать Кошелек\"\r\n    },\r\n\r\n    \"market_menu\": {\r\n        \"they_offer\": \"Предлагают\",\r\n        \"they_ask\": \"Запрашивают\",\r\n        \"anything\": \"Всё\",\r\n        \"offers\": \"Офферы\",\r\n        \"history\": \"История\"\r\n    },\r\n\r\n    \"market_offers\": {\r\n        \"accept_offer\": \"Принять оффер\",\r\n        \"wallet_ballance\": \"Баланс кошелька\",\r\n        \"you_send\": \"Вы отправляете\",\r\n        \"you_receive\": \"Вы получите\",\r\n        \"you_pay\": \"Вы платите\",\r\n\r\n        \"increase\": \"Увеличить\",\r\n        \"trade\": \"Обменять\"\r\n    },\r\n\r\n    \"login\": {\r\n        \"password_label\": \"Пароль (см. файл PASSWD)\",\r\n        \"login\": \"Войти\"\r\n    },\r\n\r\n    \"account_history_form\": {\r\n        \"any\": \"Все\",\r\n        \"spend\": \"Отправлено\",\r\n        \"receive\": \"Получено\",\r\n        \"reward\": \"Награды\",\r\n        \"tx_fee\": \"TX Комиссии\"\r\n    },\r\n\r\n    \"farmer_menu\": {\r\n        \"plots\": \"Плоты\",\r\n        \"blocks\": \"Блоки\",\r\n        \"proofs\": \"Доказательства\"\r\n    },\r\n\r\n    \"farmer_plots\": {\r\n        \"type\": \"Тип\",\r\n        \"count\": \"Кол-во\",\r\n        \"reload_plots\": \"Перезагрузить плоты\"\r\n    },\r\n\r\n    \"farmer_plot_dirs\": {\r\n        \"path\": \"Путь\"\r\n    },\r\n\r\n    \"swap\": {\r\n        \"pool_balance\": \"Баланс пула\",\r\n        \"volume\": \"Объем\",\r\n        \"24h\": \"24ч\",\r\n        \"7d\": \"7 дней\",\r\n\r\n        \"trade\": \"Обмен\",\r\n        \"history\": \"История\",\r\n        \"my_liquidity\": \"Моя ликвидность\",\r\n        \"pool_state\": \"Состояние пула\",\r\n\r\n        \"my_balance\": \"Мой баланс\",\r\n        \"fees_earned\": \"Заработанная комиссия\",\r\n        \"fee_level\": \"Уровень комиссии\",\r\n        \"unlock_height\": \"Высота разблокировки\",\r\n\r\n        \"user_total\": \"Всего\",\r\n\r\n        \"token_amount\": \"Количество токенов\",\r\n        \"currency_amount\": \"Количество валюты\",\r\n\r\n        \"price_match\": \"Price Match\",\r\n        \"payout\": \"Выплата\",\r\n        \"switch_fee\": \"Изменить уровень комиссии\",\r\n        \"add_liquidity\": \"Добавить ликвидность\",\r\n        \"remove_iquidity\": \"Забрать ликвидность\",\r\n        \"remove_all\": \"Забрать всё\",\r\n\r\n        \"wallet_ballance\": \"Баланс кошелька\",\r\n        \"buy_amount\": \"Сумма покупки\",\r\n        \"sell_amount\": \"Сумма продажи\",\r\n        \"trade_fee_estimated\": \"Комиссия (предполагаемая)\",\r\n        \"you_receive_estimated\": \"Вы получите (предположительно)\",\r\n\r\n        \"sell\": \"Продать\",\r\n        \"buy\": \"Kупить\"\r\n    },\r\n\r\n    \"$vuetify\": {\r\n        \"dataIterator\": {\r\n            \"loadingText\": \"Данные загружаются...\"\r\n        },\r\n        \"noDataText\": \"Данные отсутствуют\"\r\n    }\r\n}"
  },
  {
    "path": "www/web-gui/public/locales/template.json",
    "content": "{\r\n    \"common\": {\r\n        \"yes\": \"Yes\",\r\n        \"no\": \"No\",\r\n        \"default\": \"default\",\r\n        \"node\": \"Node\",\r\n        \"wallet\": \"Wallet\",\r\n        \"height\": \"Height\",\r\n        \"blocks\": \"Blocks\",\r\n        \"balance\": \"Balance\",\r\n        \"token\": \"Token\",\r\n        \"symbol\": \"Symbol\",\r\n        \"hash\": \"Hash\",\r\n        \"reward\": \"Reward\",\r\n        \"amount\": \"Amount\",\r\n        \"address\": \"Address\",\r\n        \"contract\": \"Contract\",\r\n        \"type\": \"Type\",\r\n        \"time\": \"Time\",\r\n        \"fee\": \"Fee\",\r\n        \"status\": \"Status\",\r\n        \"pending\": \"pending\",\r\n        \"expired\": \"expired\",\r\n        \"failed\": \"failed\",\r\n        \r\n        \"confirm\": \"Confirm\",\r\n        \"deploy\": \"Deploy\",\r\n        \"create\": \"Create\",\r\n        \"remove\": \"Remove\",\r\n\r\n        \"transaction_has_been_sent\": \"Transaction has been sent\",\r\n        \"failed_with\": \"Failed with\",\r\n        \"deployed_as\": \"Deployed as\",\r\n        \"any\": \"Any\",\r\n        \"link\": \"Link\"\r\n    },\r\n    \"main_menu\": {\r\n        \"explore\": \"Explore\",\r\n        \"market\": \"Market\",\r\n        \"farmer\": \"Farmer\",\r\n        \"exchange\": \"Exchange\",\r\n        \"settings\": \"Settings\",\r\n        \"logout\": \"Logout\"\r\n    },\r\n    \"node_common\": {\r\n        \"vdf_speed\": \"VDF Speed\",\r\n        \"block_reward\": \"Block Reward\",\r\n        \"block_size\": \"Block Size\",\r\n        \"tx_fees\": \"Transaction Fees\",\r\n        \"netspace\": \"Netspace\"\r\n    },\r\n    \"node_menu\": {\r\n        \"log\": \"Log\",\r\n        \"peers\": \"Peers\"\r\n    },\r\n    \"node_info\": {\r\n        \"synced\": \"Synced\",\r\n        \"supply\": \"Supply\",\r\n        \"no_addresses\": \"No. Addresses\"\r\n    },\r\n\r\n    \"farmer_info\": {\r\n        \"virtual_balance\": \"Virtual Balance\",\r\n        \"virtual_size\": \"Virtual Size\",\r\n        \"physical_size\": \"Physical Size\",\r\n        \"total_farm_size\": \"Total Farm Size\"\r\n    },\r\n\r\n    \"node_log\": {\r\n        \"terminal\": \"Terminal\",\r\n        \"router\": \"Router\",\r\n        \"farmer\": \"Farmer\",\r\n        \"harvester\": \"Harvester\",\r\n        \"timelord\": \"TimeLord\"\r\n    },\r\n\r\n    \"node_log_table\": {\r\n        \"module\": \"Module\",\r\n        \"message\": \"Message\"\r\n    },\r\n\r\n    \"node_peers\": {\r\n        \"version\": \"Version\",\r\n        \"received\": \"Received\",\r\n        \"send\": \"Send\",\r\n        \"ping\": \"Ping\",\r\n        \"duration\": \"Duration\",\r\n        \"credits\": \"Credits\",\r\n        \"tx_gas\": \"TX Gas\",\r\n        \"connection\": \"Connection\",\r\n        \"outbound\": \"outbound\",\r\n        \"inbound\": \"inbound\"\r\n    },\r\n    \"wallet_summary\": {\r\n        \"new\": \"New\"\r\n    },\r\n    \"account_menu\": {\r\n        \"nfts\": \"NFTs\",\r\n        \"contracts\": \"Contracts\",\r\n        \"addresses\": \"Addresses\",\r\n        \"send\": \"Send\",\r\n        \"offer\": \"Offer\",\r\n        \"history\": \"History\",\r\n        \"details\": \"Details\"\r\n    },\r\n\r\n    \"account_addresses\": {\r\n        \"index\": \"#\",\r\n        \"n_recv\": \"N(Recv)\",\r\n        \"n_spend\": \"N(Spend)\",\r\n        \"last_recv\": \"Last Recv\",\r\n        \"last_spend\": \"Last Spend\"\r\n\t},\r\n\t\r\n\t\"wallet_common\": {\r\n\t\t\"enter_passphrase\": \"Passphrase required\"\r\n\t},\r\n\r\n    \"account_send_form\": {\r\n        \"source_address\": \"Source Address\",\r\n        \"destination\": \"Destination\",\r\n        \"destination_address\": \"Destination Address\",\r\n        \"address_input\": \"Address Input\",\r\n        \"currency\": \"Currency\",\r\n        \"send\": \"Send\"\r\n    },\r\n    \"balance_table\": {\r\n        \"locked\": \"Locked\",\r\n        \"spendable\": \"Spendable\"\r\n    },\r\n    \"account_balance\": {\r\n        \"reserved\": \"Reserved\"\r\n    },\r\n    \"account_offers\": {\r\n        \"offer\": \"Offer\",\r\n        \"receive\": \"Receive\",\r\n        \"status\": \"Status\",\r\n        \"actions\": \"Actions\",\r\n        \"revoke\": \"Revoke\",\r\n        \"accepted\": \"Accepted\",\r\n        \"revoked\": \"Revoked\",\r\n        \"open\": \"Open\"\r\n    },\r\n    \"account_offer_form\": {\r\n        \"offer_amount\": \"Offer Amount\",\r\n        \"offer_currency\": \"Offer Currency\",\r\n        \"receive_amount\": \"Receive Amount\",\r\n        \"receive_currency_contract\": \"Receive Currency Contract\",\r\n        \"symbol\": \"Symbol\",\r\n        \"offer\": \"Offer\"\r\n    },\r\n    \"explore_menu\": {\r\n        \"transactions\": \"Transactions\",\r\n        \"block_height\": \"block height\"\r\n    },\r\n    \"explore_blocks\": {\r\n        \"score\": \"Score\"\r\n    },\r\n    \"explore_transactions\": {\r\n        \"transaction_id\": \"Transaction ID\"\r\n    },\r\n    \"block_view\": {\r\n        \"previous\": \"Previous\",\r\n        \"next\": \"Next\",\r\n        \"block\": \"Block\",\r\n        \"no_such_block\": \"No such block!\",\r\n        \"time_diff\": \"Time Diff\",\r\n        \"space_diff\": \"Space Diff\",\r\n        \"vdf_iterations\": \"VDF Iterations\",\r\n        \"tx_base\": \"TX Base\",\r\n        \"tx_count\": \"TX Count\",\r\n        \"k_size\": \"K Size\",\r\n        \"proof_score\": \"Proof Score\",\r\n        \"plot_id\": \"Plot ID\",\r\n        \"farmer_key\": \"Farmer Key\",\r\n        \"inputs\": \"Inputs\",\r\n        \"outputs\": \"Outputs\",\r\n        \"operations\": \"Operations\"\r\n    },\r\n    \"transaction_view\": {\r\n        \"transaction\": \"Transaction\",\r\n        \"message\": \"Message\",\r\n        \"confirmed\": \"Confirmed\",\r\n        \"expires\": \"Expires\",\r\n        \"note\": \"Note\",\r\n        \"sender\": \"Sender\",\r\n        \"cost\": \"Cost\",\r\n        \"input\": \"Input\",\r\n        \"output\": \"Output\",\r\n\r\n        \"no_such_transaction\": \"No such transaction!\"\r\n    },\r\n    \"create_contract_menu\": {\r\n        \"contract_type\": \"Contract Type\"\r\n    },\r\n    \"account_contract_summary\": {\r\n        \"deposit\": \"Deposit\",\r\n        \"withdraw\": \"Withdraw\"\r\n    },\r\n    \"node_settings\": {\r\n        \"language\": \"Language\",\r\n        \"enable_timelord\": \"Enable TimeLord\",\r\n        \"farmer_reward_address\": \"Farmer Reward Address\",\r\n        \"timeLord_reward_address\": \"TimeLord Reward Address\",\r\n        \"restart_needed\": \"(restart needed to apply)\",\r\n        \"theme\": \"Theme\",\r\n        \"light\": \"Light\",\r\n        \"dark\": \"Dark\",\r\n        \"opencl_device\": \"OpenCL Device\"\r\n    },\r\n\r\n    \"wallet_settings\": {\r\n        \"token_whitelist\": \"Token Whitelist\",\r\n        \"name\": \"Name\",\r\n        \"token_address\": \"Token Address\",\r\n        \"add_token\": \"Add Token\"\r\n    },\r\n\r\n    \"create_locked_contract\": {\r\n        \"owner_address\": \"Owner Address\",\r\n        \"unlock_height\": \"Unlock at Chain Height\"\r\n    },\r\n    \"create_virtual_plot_contract\": {\r\n        \"farmer_public_key\": \"Farmer Public Key\",\r\n        \"reward_address\": \"Reward Address (optional, for pooling)\"\r\n    },\r\n    \"account_details\": {\r\n        \"copy_keys_to_plotter\": \"Copy keys to plotter\"\r\n    },\r\n    \"account_actions\": {\r\n        \"reset_cache\": \"Reset Cache\",\r\n        \"show_seed\": \"Show Seed\"\r\n    },\r\n    \"create_account\": {\r\n        \"account_index\": \"Account Index\",\r\n        \"account_name\": \"Account Name\",\r\n        \"number_of_addresses\": \"Number of Addresses\",\r\n        \"create_account\": \"Create Account\"\r\n    },\r\n    \"create_wallet\": {\r\n        \"account_name\": \"Account Name\",\r\n        \"number_of_addresses\": \"Number of Addresses\",\r\n        \"use_custom_seed\": \"Use Custom Seed\",\r\n        \"use_passphrase\": \"With Passphrase\",\r\n        \"seed_words\": \"Mnemonic Seed Words (optional, 24 words)\",\r\n        \"passphrase\": \"Passphrase (secure password, 10+ characters)\",\r\n        \"placeholder\": \"<random>\",\r\n        \"create_wallet\": \"Create Wallet\"\r\n    },\r\n    \"market_menu\": {\r\n        \"they_offer\": \"They Offer\",\r\n        \"they_ask\": \"They Ask\",\r\n        \"anything\": \"Anything\",\r\n        \"offers\": \"Offers\"\r\n    },\r\n    \"market_offers\": {\r\n        \"price\": \"Price\",\r\n        \"accept\": \"Accept\",\r\n        \"cancel\": \"Cancel\",\r\n        \"accept_offer\": \"Accept Offer\",\r\n        \"you_receive\": \"You Receive\",\r\n        \"you_pay\": \"You Pay\"\r\n    },\r\n    \"login\": {\r\n        \"password_label\": \"Password (see PASSWD file)\",\r\n        \"login\": \"Login\"\r\n    },\r\n    \"account_history_form\": {\r\n        \"spend\": \"Spend\",\r\n        \"receive\": \"Receive\",\r\n        \"reward\": \"Reward\",\r\n        \"tx_fee\": \"TX Fee\"\r\n    },\r\n\r\n    \"farmer_menu\": {\r\n        \"plots\": \"Plots\",\r\n        \"blocks\": \"Blocks\",\r\n        \"proofs\": \"Proofs\"\r\n    },\r\n\r\n    \"farmer_plots\": {\r\n        \"type\": \"Type\",\r\n        \"count\": \"Count\",\r\n        \"reload_plots\": \"Reload Plots\"\r\n    },\r\n\r\n    \"farmer_plot_dirs\": {\r\n        \"path\": \"Path\"\r\n    },\r\n\r\n    \"$vuetify\": {\r\n        \"dataIterator\": {\r\n            \"loadingText\": \"Loading items...\"\r\n        },\r\n        \"noDataText\": \"No data available\"\r\n    }\r\n}"
  },
  {
    "path": "www/web-gui/public/locales/uk.json",
    "content": "{\r\n    \"common\": {\r\n        \"yes\": \"Так\",\r\n        \"no\": \"Ні\",\r\n        \"default\": \"за умовчанням\",\r\n        \"node\": \"Вузол\",\r\n        \"wallet\": \"Гаманець\",\r\n        \"height\": \"Висота\",\r\n        \"blocks\": \"Блоки\",\r\n        \"balance\": \"Баланс\",\r\n        \"token\": \"Токен\",\r\n        \"hash\": \"Хеш\",\r\n        \"reward\": \"Нагорода\",\r\n        \"amount\": \"Сума\",\r\n        \"address\": \"Адреса\",\r\n        \"type\": \"Тип\",\r\n        \"time\": \"Час\",\r\n        \"fee\": \"Комісія\",\r\n        \"pending\": \"очікується\",\r\n        \"confirm\": \"Підтвердити\",\r\n        \"deploy\": \"Розгорнути\",\r\n        \"create\": \"Створити\",\r\n        \"transaction_has_been_sent\": \"Переказ був надісланий\",\r\n        \"failed_with\": \"Помилка\",\r\n        \"deployed_as\": \"Розгорнути як\",\r\n        \"link\": \"Посилання\"\r\n    },\r\n    \"main_menu\": {\r\n        \"explore\": \"Провідник\",\r\n        \"market\": \"Торгівля\",\r\n        \"exchange\": \"Біржа\",\r\n        \"settings\": \"Налаштування\",\r\n        \"logout\": \"Вийти\"\r\n    },\r\n    \"node_common\": {\r\n        \"vdf_speed\": \"Швидкість VDF\",\r\n        \"block_reward\": \"Винагорода за блок\",\r\n        \"netspace\": \"Мережевий простір\"\r\n    },\r\n    \"node_menu\": {\r\n        \"log\": \"Журнал\",\r\n        \"peers\": \"Піри\"\r\n    },\r\n    \"node_info\": {\r\n        \"synced\": \"Синхронізовано\",\r\n        \"supply\": \"Емісія\",\r\n        \"no_addresses\": \"Кількість адрес\"\r\n    },\r\n    \"node_log\": {\r\n        \"terminal\": \"Термінал\",\r\n        \"router\": \"Маршрутизатор\",\r\n        \"farmer\": \"Фермер\",\r\n        \"harvester\": \"Комбайн\",\r\n        \"timelord\": \"Таймлорд\"\r\n    },\r\n    \"node_peers\": {\r\n        \"version\": \"Версія\",\r\n        \"received\": \"Завантеження\",\r\n        \"send\": \"Віддача\",\r\n        \"ping\": \"Пінг\",\r\n        \"duration\": \"Час\",\r\n        \"credits\": \"Кредити\",\r\n        \"tx_gas\": \"TX Газ\",\r\n        \"connection\": \"З'єднання\",\r\n        \"outbound\": \"вихідний\",\r\n        \"inbound\": \"вхідний\"\r\n    },\r\n    \"wallet_summary\": {\r\n        \"new\": \"Новий\"\r\n    },\r\n    \"account_menu\": {\r\n        \"nfts\": \"NFT\",\r\n        \"contracts\": \"Контракти\",\r\n        \"addresses\": \"Адреси\",\r\n        \"send\": \"Відправити\",\r\n        \"offer\": \"Пропозиція\",\r\n        \"history\": \"Історія\",\r\n        \"details\": \"Детальніше\"\r\n    },\r\n    \"account_send_form\": {\r\n        \"source_address\": \"Адреса джерела\",\r\n        \"destination\": \"Отримувач\",\r\n        \"destination_address\": \"Адреса отримувача\",\r\n        \"address_input\": \"Введення адреси\",\r\n        \"currency\": \"Валюта\",\r\n        \"send\": \"Відправити\"\r\n    },\r\n    \"balance_table\": {\r\n        \"locked\": \"Заблоковано\",\r\n        \"spendable\": \"Доступно\",\r\n        \"contract\": \"Контракт\"\r\n    },\r\n    \"account_balance\": {\r\n        \"reserved\": \"Зарезервовано\"\r\n    },\r\n    \"account_history\": {\r\n        \"link\": \"@:common.link\"\r\n    },\r\n    \"account_offers\": {\r\n        \"offer\": \"Пропонувати\",\r\n        \"receive\": \"Отримати\",\r\n        \"status\": \"Статус\",\r\n        \"actions\": \"Дії\",\r\n        \"revoke\": \"Відкликати\",\r\n        \"accepted\": \"Прийнято\",\r\n        \"revoked\": \"Скасовано\",\r\n        \"open\": \"Відчинено\"\r\n    },\r\n    \"account_offer_form\": {\r\n        \"offer_amount\": \"Сума пропозиції\",\r\n        \"offer_currency\": \"Валюта пропозиції\",\r\n        \"receive_amount\": \"Отримати суму\",\r\n        \"receive_currency_contract\": \"Валюта отримання (контракт)\",\r\n        \"symbol\": \"Символ\",\r\n        \"offer\": \"Пропозиція\"\r\n    },\r\n    \"explore_menu\": {\r\n        \"transactions\": \"Транзакції\",\r\n        \"address\": \"Адреса\",\r\n        \"block_height\": \"Висота блоку\"\r\n    },\r\n    \"explore_blocks\": {\r\n        \"score\": \"Оцінка\"\r\n    },\r\n    \"explore_transactions\": {\r\n        \"transaction_id\": \"ID Транзакції\"\r\n    },\r\n    \"block_view\": {\r\n        \"previous\": \"Попередній\",\r\n        \"next\": \"Наступний\",\r\n        \"block\": \"Блок\",\r\n        \"no_such_block\": \"Немає такого блоку!\",\r\n        \"time_diff\": \"Time Diff\",\r\n        \"space_diff\": \"Space Diff\",\r\n        \"vdf_iterations\": \"Ітерації VDF\",\r\n        \"tx_base\": \"TX Base\",\r\n        \"tx_count\": \"Кількість транзакцій\",\r\n        \"k_size\": \"K Розмір\",\r\n        \"proof_score\": \"Оцінка доказу\",\r\n        \"plot_id\": \"ID плоту\",\r\n        \"farmer_key\": \"Ключ фермера\",\r\n        \"inputs\": \"Входи\",\r\n        \"outputs\": \"Виходи\",\r\n        \"operations\": \"Операції\"\r\n    },\r\n    \"transaction_view\": {\r\n        \"transaction\": \"Транзакція\",\r\n        \"confirmed\": \"Підтверджено\",\r\n        \"expires\": \"Термін дії закінчується\",\r\n        \"note\": \"Замітка\",\r\n        \"sender\": \"Відправник\",\r\n        \"cost\": \"Вартість\",\r\n        \"input\": \"Вхідні дані\",\r\n        \"output\": \"Вихідні дані\"\r\n    },\r\n    \"create_contract_menu\": {\r\n        \"contract_type\": \"Тип контракту\"\r\n    },\r\n    \"account_contract_summary\": {\r\n        \"deposit\": \"Депозит\",\r\n        \"withdraw\": \"Зняти\"\r\n    },\r\n    \"node_settings\": {\r\n        \"language\": \"Мова\",\r\n        \"enable_timelord\": \"Вибрати Таймлорд\",\r\n        \"farmer_reward_address\": \"Адреса винагороди фермера\",\r\n        \"timeLord_reward_address\": \"Адреса винагороди Таймлорда\",\r\n        \"reward_address_placeholder\": \"<за умовчанням>\",\r\n        \"restart_needed\": \"(Для застосування необхідне перезавантеження)\"\r\n    },\r\n    \"create_locked_contract\": {\r\n        \"owner_address\": \"Адреса власника\",\r\n        \"unlock_height\": \"Висота розблокування\"\r\n    },\r\n    \"create_virtual_plot_contract\": {\r\n        \"farmer_public_key\": \"Відкритий ключ фермера\",\r\n        \"reward_address\": \"Алреса винагороди (опціонально, для об'єднання)\"\r\n    },\r\n    \"account_details\": {\r\n        \"copy_keys_to_plotter\": \"Копіювати ключі в плоттер\"\r\n    },\r\n    \"account_actions\": {\r\n        \"reset_cache\": \"Скинути кеш\",\r\n        \"show_seed\": \"Показати мнемоніку\"\r\n    },\r\n    \"create_account\": {\r\n        \"account_index\": \"Індекс облікового запису\",\r\n        \"account_name\": \"Ім'я облікового запису\",\r\n        \"number_of_addresses\": \"Кількість адрес\",\r\n        \"create_account\": \"Створити аккаунт\"\r\n    },\r\n    \"create_wallet\": {\r\n        \"use_custom_seed\": \"Використовувати мнемоніку користувача\",\r\n        \"seed_hash\": \"Хеш мнемоніки (опціонально, шістнадцятирічний рядок, 64 символи)\",\r\n        \"placeholder\": \"<Випадковий>\",\r\n        \"create_wallet\": \"Створити гаманець\"\r\n    },\r\n    \"market_menu\": {\r\n        \"they_offer\": \"Пропонують\",\r\n        \"they_ask\": \"Запитують\",\r\n        \"anything\": \"Усе\",\r\n        \"offers\": \"Пропозиції\"\r\n    },\r\n    \"market_offers\": {\r\n        \"price\": \"Ціна\",\r\n        \"accept\": \"Прийняти\",\r\n        \"cancel\": \"Відмінити\",\r\n        \"accept_offer\": \"Прийняти пропозицію\",\r\n        \"you_receive\": \"Ви отримуєте\",\r\n        \"you_pay\": \"Ти платиш\"\r\n    },\r\n    \"login\": {\r\n        \"password_label\": \"Пароль (оглянути файл PASSWD)\",\r\n        \"login\": \"Увійти\"\r\n    }\r\n}"
  },
  {
    "path": "www/web-gui/public/locales/zh.json",
    "content": "{\r\n    \"common\": {\r\n        \"yes\": \"是的\",\r\n        \"no\": \"否\",\r\n        \"default\": \"默认的\",\r\n        \"node\": \"节点\",\r\n        \"wallet\": \"钱包\",\r\n        \"height\": \"高度\",\r\n        \"blocks\": \"区块\",\r\n        \"balance\": \"余额\",\r\n        \"token\": \"代币\",\r\n        \"hash\": \"哈希\",\r\n        \"reward\": \"奖励\",\r\n        \"amount\": \"数量\",\r\n        \"address\": \"地址\",\r\n        \"type\": \"类型\",\r\n        \"time\": \"时间\",\r\n        \"fee\": \"费用\",\r\n        \"pending\": \"等待中\",\r\n        \"confirm\": \"确认\",\r\n        \"deploy\": \" 部署\",\r\n        \"create\": \"创建\",\r\n        \"transaction_has_been_sent\": \"交易已发送 \",\r\n        \"failed_with\": \"失败原因\",\r\n        \"deployed_as\": \"部署为 \",\r\n        \"link\": \"链接\"\r\n    },\r\n    \"main_menu\": {\r\n        \"explore\": \"浏览器\",\r\n        \"market\": \"市场\",\r\n        \"exchange\": \"交换\",\r\n        \"settings\": \"设置\",\r\n        \"logout\": \"退出\"\r\n    },\r\n    \"node_common\": {\r\n        \"vdf_speed\": \"VDF 速度\",\r\n        \"block_reward\": \"区块奖励\",\r\n        \"tx_fees\": \"交易费\",\r\n        \"netspace\": \"网络空间\"\r\n    },\r\n    \"node_menu\": {\r\n        \"log\": \"日志\",\r\n        \"peers\": \"节点\"\r\n    },\r\n    \"node_info\": {\r\n        \"synced\": \"已同步\",\r\n        \"supply\": \"供应\",\r\n        \"no_addresses\": \"No. Addresses\"\r\n    },\r\n    \"node_log\": {\r\n        \"terminal\": \"终端\",\r\n        \"router\": \"路由\",\r\n        \"farmer\": \"农民\",\r\n        \"harvester\": \"收割机\",\r\n        \"timelord\": \"时间领主\"\r\n    },\r\n    \"node_peers\": {\r\n        \"version\": \"版本\",\r\n        \"received\": \"已接收\",\r\n        \"send\": \"发送\",\r\n        \"ping\": \"Ping\",\r\n        \"duration\": \"期间\",\r\n        \"credits\": \"信用\",\r\n        \"tx_gas\": \"TX Gas\",\r\n        \"connection\": \"连接\",\r\n        \"outbound\": \"向外的\",\r\n        \"inbound\": \"向内的\"\r\n    },\r\n    \"wallet_summary\": {\r\n        \"new\": \"新建\"\r\n    },\r\n    \"account_menu\": {\r\n        \"nfts\": \"NFTs\",\r\n        \"contracts\": \"合同\",\r\n        \"addresses\": \"地址\",\r\n        \"send\": \"发送\",\r\n        \"offer\": \"提供\",\r\n        \"history\": \"历史\",\r\n        \"details\": \"详情\"\r\n    },\r\n    \"account_send_form\": {\r\n        \"source_address\": \"源地址\",\r\n        \"destination\": \"目的地\",\r\n        \"destination_address\": \"目的地地址\",\r\n        \"address_input\": \"地址输入\",\r\n        \"currency\": \"货币\",\r\n        \"send\": \"发送\"\r\n    },\r\n    \"balance_table\": {\r\n        \"locked\": \"已锁定\",\r\n        \"spendable\": \"可花费\",\r\n        \"contract\": \"合同\"\r\n    },\r\n    \"account_balance\": {\r\n        \"reserved\": \"保留的\"\r\n    },\r\n    \"account_offers\": {\r\n        \"offer\": \"提供\",\r\n        \"receive\": \"收到\",\r\n        \"status\": \"状态\",\r\n        \"actions\": \"行动\",\r\n        \"revoke\": \"撤销\",\r\n        \"accepted\": \"已收到\",\r\n        \"revoked\": \"已撤销\",\r\n        \"open\": \"打开\"\r\n    },\r\n    \"account_offer_form\": {\r\n        \"offer_amount\": \"提供的数量\",\r\n        \"offer_currency\": \"提供的货币\",\r\n        \"receive_amount\": \"接收的数量\",\r\n        \"receive_currency_contract\": \"接收货币合同\",\r\n        \"symbol\": \"标志\",\r\n        \"offer\": \"提供\"\r\n    },\r\n    \"explore_menu\": {\r\n        \"transactions\": \"交易\",\r\n        \"block_height\": \"区块高度\"\r\n    },\r\n    \"explore_blocks\": {\r\n        \"score\": \"分数\"\r\n    },\r\n    \"explore_transactions\": {\r\n        \"transaction_id\": \"交易ID\"\r\n    },\r\n    \"block_view\": {\r\n        \"previous\": \"先前的\",\r\n        \"next\": \"接下来的\",\r\n        \"block\": \"区块\",\r\n        \"no_such_block\": \"没有这个区块\",\r\n        \"time_diff\": \"时间差异\",\r\n        \"space_diff\": \"空间差异\",\r\n        \"vdf_iterations\": \"VDF 迭代次数\",\r\n        \"tx_base\": \"TX 基数\",\r\n        \"tx_count\": \"TX 总数\",\r\n        \"k_size\": \"K 大小\",\r\n        \"proof_score\": \"证明分数\",\r\n        \"plot_id\": \"Plot ID\",\r\n        \"farmer_key\": \"农民密钥\",\r\n        \"inputs\": \"输入\",\r\n        \"outputs\": \"输出\",\r\n        \"operations\": \"操作\"\r\n    },\r\n    \"transaction_view\": {\r\n        \"transaction\": \"交易\",\r\n        \"confirmed\": \"确认的\",\r\n        \"expires\": \"过期\",\r\n        \"note\": \"笔记\",\r\n        \"sender\": \"发送人\",\r\n        \"cost\": \"费用\",\r\n        \"input\": \"输入\",\r\n        \"output\": \"输出\"\r\n    },\r\n    \"create_contract_menu\": {\r\n        \"contract_type\": \"合同类型\"\r\n    },\r\n    \"account_contract_summary\": {\r\n        \"deposit\": \"押金\",\r\n        \"withdraw\": \"撤回\"\r\n    },\r\n    \"node_settings\": {\r\n        \"language\": \"语言\",\r\n        \"enable_timelord\": \"开启时间领主\",\r\n        \"farmer_reward_address\": \"农民奖励地址\",\r\n        \"timeLord_reward_address\": \"时间领主奖励地址\",\r\n        \"reward_address_placeholder\": \"<默认奖励地址>\",\r\n        \"restart_needed\": \"(需要重新启动)\"\r\n    },\r\n    \"create_locked_contract\": {\r\n        \"owner_address\": \"所有者地址\",\r\n        \"unlock_height\": \"在某区块高度解锁\"\r\n    },\r\n    \"create_virtual_plot_contract\": {\r\n        \"farmer_public_key\": \"农民公钥\",\r\n        \"reward_address\": \"奖励地址 (可选的, 用于池)\"\r\n    },\r\n    \"account_details\": {\r\n        \"copy_keys_to_plotter\": \"将密钥复制到绘图仪\"\r\n    },\r\n    \"account_actions\": {\r\n        \"reset_cache\": \"重置缓存\",\r\n        \"show_seed\": \"显示种子\"\r\n    },\r\n    \"create_account\": {\r\n        \"account_index\": \"账户序号\",\r\n        \"account_name\": \"账户名称\",\r\n        \"number_of_addresses\": \"地址数量\",\r\n        \"create_account\": \"创建帐户\"\r\n    },\r\n    \"create_wallet\": {\r\n        \"use_custom_seed\": \"使用自定义种子\",\r\n        \"seed_hash\": \"种子哈希 (可选的, 十六进制字符串, 64字符)\",\r\n        \"placeholder\": \"<random>\",\r\n        \"create_wallet\": \"创建钱包\"\r\n    },\r\n    \"market_menu\": {\r\n        \"they_offer\": \"他们提供\",\r\n        \"they_ask\": \"他们问\",\r\n        \"anything\": \"任何事物\",\r\n        \"offers\": \"提供物\"\r\n    },\r\n    \"market_offers\": {\r\n        \"price\": \"价格\",\r\n        \"accept\": \"接受\",\r\n        \"cancel\": \"取消\",\r\n        \"accept_offer\": \"接受报价\",\r\n        \"you_receive\": \"你收到\",\r\n        \"you_pay\": \"你支付\"\r\n    },\r\n    \"login\": {\r\n        \"password_label\": \"密码 (查看密码文件)\",\r\n        \"login\": \"登录\"\r\n    }\r\n}"
  },
  {
    "path": "www/web-gui/public/market.js",
    "content": "\nVue.component('market-menu', {\n\tprops: {\n\t\twallet_: Number,\n\t\tpage: String,\n\t\tloading: false\n\t},\n\tdata() {\n\t\treturn {\n\t\t\twallets: [],\n\t\t\twallet: null,\n\t\t\ttokens: [],\n\t\t\tbid: null,\n\t\t\task: null,\n\t\t\tcurrentItem: 0\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tthis.loading = true;\n\t\t\tfetch('/wapi/wallet/accounts')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.wallets = data;\n\t\t\t\t\tif(this.wallet == null && data.length) {\n\t\t\t\t\t\tthis.wallet = data[0].account;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(error => {\n\t\t\t\t\tsetTimeout(this.update, 1000);\n\t\t\t\t\tthrow(error);\n\t\t\t\t});\n\t\t\tfetch('/wapi/wallet/tokens')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.tokens = data);\n\t\t},\n\t\tsubmit(page) {\n\t\t\tif(!page) {\n\t\t\t\tif(this.page) {\n\t\t\t\t\tpage = this.page;\n\t\t\t\t} else {\n\t\t\t\t\tpage = \"offers\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tlocalStorage.setItem('active_wallet', this.wallet);\n\t\t\tthis.$router.push('/market/' + page + '/' + this.wallet + '/' + this.bid + '/' + this.ask).catch(()=>{});\n\t\t}\n\t},\n\tcreated() {\n\t\tif(this.wallet_ != null) {\n\t\t\tthis.wallet = this.wallet_;\n\t\t} else {\n\t\t\tthis.wallet = get_active_wallet();\n\t\t}\n\t\tthis.update();\n\t},\n\twatch: {\n\t\twallet() {\n\t\t\tthis.submit();\n\t\t},\n\t\tbid() {\n\t\t\tthis.submit();\n\t\t},\n\t\task() {\n\t\t\tthis.submit();\n\t\t}\n\t},\n\tcomputed: {\n\t\tselectItems() {\n\t\t\tvar result = [];\n\t\t\t\n\t\t\tresult.push({ text: this.$t('market_menu.anything'), value: null});\n\n\t\t\tthis.tokens.map(item => {\n\t\t\t\tvar text = item.symbol;\n\t\t\t\tif(item.currency != MMX_ADDR) {\n\t\t\t\t\ttext += ` - [${item.currency}]`;\n\t\t\t\t}\n\t\t\t\tresult.push(\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: text,\n\t\t\t\t\t\tvalue: item.currency\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn result;\n\t\t}\n\t},\t\n\ttemplate: `\n\t\t<div class=\"mb-2\">\n\t\t\t<div v-if=\"loading\">\n\t\t\t\t<v-card>\n\t\t\t\t\t<v-card-text>\n\t\t\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t\t\t<v-skeleton-loader type=\"heading\" class=\"my-6\"/>\n\t\t\t\t\t\t<v-skeleton-loader type=\"heading\" class=\"my-6\"/>\n\t\t\t\t\t\t<v-skeleton-loader type=\"heading\" class=\"my-6\"/>\n\t\t\t\t\t</v-card-text>\n\t\t\t\t</v-card>\n\n\t\t\t\t<v-skeleton-loader type=\"button\" class=\"my-6\"/>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"!loading\">\n\t\t\t\t<v-card>\n\t\t\t\t\t<v-card-text>\n\n\t\t\t\t\t\t<v-select\n\t\t\t\t\t\t\tv-model=\"wallet\"\n\t\t\t\t\t\t\t:items=\"wallets\"\n\t\t\t\t\t\t\t:label=\"$t('common.wallet')\"\n\t\t\t\t\t\t\titem-text=\"account\"\n\t\t\t\t\t\t\titem-value=\"account\">\n\t\t\t\t\t\t\t<template v-for=\"slotName in ['item', 'selection']\" v-slot:[slotName]=\"{ item }\">\n\t\t\t\t\t\t\t\t{{ $t('market_menu.wallet') }} #{{item.account}} ({{item.address}})\n\t\t\t\t\t\t\t</template>\t\t\t\t\n\t\t\t\t\t\t</v-select>\n\n\t\t\t\t\t\t<v-select\n\t\t\t\t\t\t\tv-model=\"bid\"\n\t\t\t\t\t\t\t:items=\"selectItems\"\n\t\t\t\t\t\t\t:label=\"$t('market_menu.they_offer')\"\n\t\t\t\t\t\t\titem-text=\"text\"\n\t\t\t\t\t\t\titem-value=\"value\"\n\t\t\t\t\t\t></v-select>\n\n\t\t\t\t\t\t<v-select\n\t\t\t\t\t\t\tv-model=\"ask\"\n\t\t\t\t\t\t\t:items=\"selectItems\"\n\t\t\t\t\t\t\t:label=\"$t('market_menu.they_ask')\"\n\t\t\t\t\t\t\titem-text=\"text\"\n\t\t\t\t\t\t\titem-value=\"value\"\t\t\t\n\t\t\t\t\t\t></v-select>\n\n\t\t\t\t\t</v-card-text>\n\t\t\t\t</v-card>\n\n\t\t\t\t<v-tabs>\n\t\t\t\t\t<v-tab :to=\"'/market/offers/' + wallet + '/' + bid + '/' + ask\">{{ $t('market_menu.offers') }}</v-tab>\n\t\t\t\t\t<v-tab :to=\"'/market/history/' + wallet + '/' + bid + '/' + ask\">{{ $t('market_menu.history') }}</v-tab>\n\t\t\t\t</v-tabs>\n\t\t\t</div>\n\n\t\t</div>\n\n\t\t`\n})\n\nVue.component('market-offers', {\n\tprops: {\n\t\twallet: Number,\n\t\tbid: null,\n\t\task: null,\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\toffer: {},\n\t\t\ttokens: null,\n\t\t\tbid_symbol: null,\n\t\t\tbid_decimals: null,\n\t\t\tmin_bid_amount: null,\n\t\t\taccepted: new Set(),\n\t\t\ttimer: null,\n\t\t\tresult: null,\n\t\t\terror: null,\n\t\t\tloading: false,\n\t\t\ttrade_dialog: false,\n\t\t\taccept_dialog: false,\n\t\t\ttrade_amount: null,\n\t\t\ttrade_estimate: null,\n\t\t\ttrade_estimate_data: null,\n\t\t\twallet_balance: null,\n\t\t\tfee_ratio: 1024,\n\t\t\tfee_amount: null,\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tif(this.tokens) {\n\t\t\t\tthis.loading = true;\n\t\t\t\tlet query = '/wapi/offers?limit=' + this.limit;\n\t\t\t\tif(this.bid) {\n\t\t\t\t\tquery += '&bid=' + this.bid;\n\t\t\t\t}\n\t\t\t\tif(this.ask) {\n\t\t\t\t\tquery += '&ask=' + this.ask;\n\t\t\t\t}\n\t\t\t\tif(this.min_bid_amount > 0) {\n\t\t\t\t\tquery += '&min_bid=' + parseInt(this.min_bid_amount * Math.pow(10, this.bid_decimals));\n\t\t\t\t}\n\t\t\t\tfetch(query)\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => {\n\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\tthis.data = data;\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfetch('/wapi/wallet/tokens')\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => {\n\t\t\t\t\t\tthis.tokens = new Set();\n\t\t\t\t\t\tfor(const token of data) {\n\t\t\t\t\t\t\tif(token.currency == this.bid) {\n\t\t\t\t\t\t\t\tthis.bid_symbol = token.symbol;\n\t\t\t\t\t\t\t\tthis.bid_decimals = token.decimals;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.tokens.add(token.currency);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tupdate_estimate() {\n\t\t\tthis.trade_estimate = null;\n\t\t\tfetch('/wapi/offer/trade_estimate?id=' + this.offer.address + '&amount=' + (this.trade_amount > 0 ? this.trade_amount : 0))\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.trade_estimate = data.trade.value;\n\t\t\t\t\tthis.trade_estimate_data = data;\n\t\t\t\t});\n\t\t\tthis.submit_trade(true);\n\t\t},\n\t\tupdate_fee_ratio(value) {\n\t\t\tthis.fee_ratio = value;\n\t\t\tif(this.trade_dialog) {\n\t\t\t\tthis.submit_trade(true);\n\t\t\t}\n\t\t\tif(this.accept_dialog) {\n\t\t\t\tthis.submit_accept(true);\n\t\t\t}\n\t\t},\n\t\tupdate_balance(currency) {\n\t\t\tthis.wallet_balance = null;\n\t\t\tfetch('/wapi/wallet/balance?index=' + this.wallet + '&currency=' + currency)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.wallet_balance = data ? data.spendable : 0);\n\t\t},\n\t\ttrade(offer) {\n\t\t\tthis.update_balance(offer.ask_currency);\n\t\t\tthis.offer = offer;\n\t\t\tthis.fee_amount = null;\n\t\t\tthis.trade_amount = null;\n\t\t\tthis.trade_estimate = null;\n\t\t\tthis.trade_dialog = true;\n\t\t},\n\t\taccept(offer) {\n\t\t\tthis.update_balance(offer.ask_currency);\n\t\t\tthis.offer = offer;\n\t\t\tthis.fee_amount = null;\n\t\t\tthis.submit_accept(true);\n\t\t\tthis.accept_dialog = true;\n\t\t},\n\t\tincrease() {\n\t\t\tthis.trade_amount = this.trade_estimate_data.next_input.value;\n\t\t},\n\t\tsubmit_trade(estimate = false) {\n\t\t\tconst req = {};\n\t\t\treq.index = this.wallet;\n\t\t\treq.address = this.offer.address;\n\t\t\treq.amount = this.trade_amount;\n\t\t\treq.price = this.trade_estimate_data ? this.trade_estimate_data.inv_price : this.offer.inv_price;\n\t\t\treq.options = {};\n\t\t\treq.options.fee_ratio = this.fee_ratio;\n\t\t\tif(estimate) {\n\t\t\t\treq.options.auto_send = false;\n\t\t\t}\n\t\t\tif(!(req.amount > 0)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfetch('/wapi/wallet/offer_trade', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tresponse.json().then(data => {\n\t\t\t\t\t\t\tthis.error = null;\n\t\t\t\t\t\t\tif(estimate) {\n\t\t\t\t\t\t\t\tthis.fee_amount = data.exec_result.total_fee_value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.result = data;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if(!estimate) {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\tthis.error = data;\n\t\t\t\t\t\t\tthis.result = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\tif(!estimate) {\n\t\t\t\tthis.trade_dialog = false;\n\t\t\t}\n\t\t},\n\t\tsubmit_accept(estimate = false) {\n\t\t\tconst address = this.offer.address;\n\t\t\tconst req = {};\n\t\t\treq.index = this.wallet;\n\t\t\treq.address = address;\n\t\t\treq.price = this.offer.inv_price;\n\t\t\treq.options = {};\n\t\t\treq.options.fee_ratio = this.fee_ratio;\n\t\t\tif(estimate) {\n\t\t\t\treq.options.auto_send = false;\n\t\t\t}\n\t\t\tfetch('/wapi/wallet/accept_offer', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tresponse.json().then(data => {\n\t\t\t\t\t\t\tthis.error = null;\n\t\t\t\t\t\t\tif(estimate) {\n\t\t\t\t\t\t\t\tthis.fee_amount = data.exec_result.total_fee_value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.result = data;\n\t\t\t\t\t\t\t\tthis.accepted.add(address);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if(!estimate) {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\tthis.error = data;\n\t\t\t\t\t\t\tthis.result = null;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\tif(!estimate) {\n\t\t\t\tthis.accept_dialog = false;\n\t\t\t}\n\t\t},\n\t\tis_valid_trade() {\n\t\t\tconst bid_amount = this.trade_estimate_data ? parseFloat(this.trade_estimate_data.trade.amount) : 0;\n\t\t\treturn this.offer\n\t\t\t\t&& this.trade_amount > 0\n\t\t\t\t&& this.trade_amount <= this.wallet_balance\n\t\t\t\t&& bid_amount > 0\n\t\t\t\t&& bid_amount <= this.offer.bid_balance;\n\t\t},\n\t\tis_valid_trade_amount() {\n\t\t\tif(this.trade_amount > this.wallet_balance) {\n\t\t\t\treturn \"insufficient funds\";\n\t\t\t}\n\t\t\tif(this.trade_amount == null || this.trade_amount == \"\" || this.trade_amount > 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn \"invalid amount\";\n\t\t},\n\t\tis_valid_bid_amount() {\n\t\t\tif(this.trade_estimate != null) {\n\t\t\t\tif(this.trade_estimate > this.offer.bid_balance_value) {\n\t\t\t\t\treturn \"exceeding offer\";\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t},\n\twatch: {\n\t\ttrade_amount() {\n\t\t\tif(this.offer) {\n\t\t\t\tthis.update_estimate();\n\t\t\t}\n\t\t},\n\t\tmin_bid_amount() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 60000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-alert border=\"left\" colored-border type=\"success\" elevation=\"2\" v-if=\"result\" class=\"my-2\">\n\t\t\t\t{{ $t('common.transaction_has_been_sent') }}: <router-link :to=\"'/explore/transaction/' + result.id\">{{result.id}}</router-link>\n\t\t\t</v-alert>\n\t\t\t<v-alert border=\"left\" colored-border type=\"error\" elevation=\"2\" v-if=\"error\" class=\"my-2\">\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\n\t\t\t<v-dialog v-model=\"trade_dialog\" max-width=\"900\">\n\t\t\t\t<template v-slot:default=\"dialog\">\n\t\t\t\t\t<v-card>\n\t\t\t\t\t\t<v-toolbar color=\"primary\" dark></v-toolbar>\n\t\t\t\t\t\t<v-card-title>\n\t\t\t\t\t\t\tTrade - {{offer.address}}\n\t\t\t\t\t\t</v-card-title>\n\t\t\t\t\t\t<v-card-text>\n\t\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t\t<v-col class=\"pb-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"wallet_balance\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('market_offers.wallet_ballance')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"offer.ask_symbol\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"pb-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"trade_amount\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('market_offers.you_send')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"offer.ask_symbol\"\n\t\t\t\t\t\t\t\t\t\t:rules=\"[is_valid_trade_amount]\">\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"offer.bid_balance_value\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"They Offer\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"offer.bid_symbol\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"trade_estimate\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('market_offers.you_receive')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"offer.bid_symbol\"\n\t\t\t\t\t\t\t\t\t\t:rules=\"[is_valid_bid_amount]\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t<v-row justify=\"end\">\n\t\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => update_fee_ratio(value)\"></tx-fee-select>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"TX Fee\"\n\t\t\t\t\t\t\t\t\t\tv-model.number=\"fee_amount\" suffix=\"MMX\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t</v-card-text>\n\t\t\t\t\t\t<v-card-actions class=\"justify-end\">\n\t\t\t\t\t\t\t<v-btn color=\"primary\" @click=\"submit_trade()\" :disabled=\"!is_valid_trade()\">{{ $t('market_offers.trade') }}</v-btn>\n\t\t\t\t\t\t\t<v-btn @click=\"increase()\">{{ $t('market_offers.increase') }}</v-btn>\n\t\t\t\t\t\t\t<v-btn @click=\"trade_dialog = false\">{{ $t('market_offers.cancel') }}</v-btn>\n\t\t\t\t\t\t</v-card-actions>\n\t\t\t\t\t</v-card>\n\t\t\t\t</template>\n\t\t\t</v-dialog>\n\t\t\t\n\t\t\t<v-dialog v-model=\"accept_dialog\" max-width=\"900\">\n\t\t\t\t<template v-slot:default=\"dialog\">\n\t\t\t\t\t<v-card>\n\t\t\t\t\t\t<v-toolbar color=\"primary\" dark></v-toolbar>\n\t\t\t\t\t\t<v-card-title>\n\t\t\t\t\t\t\tAccept - {{offer.address}}\n\t\t\t\t\t\t</v-card-title>\n\t\t\t\t\t\t<v-card-text>\n\t\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t\t<v-col class=\"pb-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"wallet_balance\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('market_offers.wallet_ballance')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"offer.ask_symbol\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"pb-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"offer.ask_value\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('market_offers.you_send')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"offer.ask_symbol\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t<v-row justify=\"end\">\n\t\t\t\t\t\t\t\t<v-col cols=\"6\" class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"offer.bid_balance_value\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('market_offers.you_receive')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"offer.bid_symbol\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t<v-row justify=\"end\">\n\t\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => update_fee_ratio(value)\"></tx-fee-select>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"TX Fee\"\n\t\t\t\t\t\t\t\t\t\tv-model.number=\"fee_amount\" suffix=\"MMX\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t</v-card-text>\n\t\t\t\t\t\t<v-card-actions class=\"justify-end\">\n\t\t\t\t\t\t\t<v-btn color=\"primary\" @click=\"submit_accept()\">{{ $t('market_offers.accept') }}</v-btn>\n\t\t\t\t\t\t\t<v-btn @click=\"accept_dialog = false\">{{ $t('market_offers.cancel') }}</v-btn>\n\t\t\t\t\t\t</v-card-actions>\n\t\t\t\t\t</v-card>\n\t\t\t\t</template>\n\t\t\t</v-dialog>\n\t\t\t\n\t\t\t<template v-if=\"bid\">\n\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t<v-card-text>\n\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t<v-col cols=\"3\" class=\"pb-0\">\n\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\tv-model=\"min_bid_amount\"\n\t\t\t\t\t\t\t\t\tlabel=\"Minimum Offer\"\n\t\t\t\t\t\t\t\t\t:suffix=\"bid_symbol\">\n\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t</v-row>\n\t\t\t\t\t</v-card-text>\n\t\t\t\t</v-card>\n\t\t\t</template>\n\n\t\t\t<v-card>\n\t\t\t\t<div v-if=\"!data && loading\">\n\t\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\"/>\n\t\t\t\t</div>\n\n\t\t\t\t<template v-if=\"data\">\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th>{{ $t('market_offers.they_offer') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('market_offers.they_ask') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('market_offers.price') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('market_offers.time') }}</th>\n\t\t\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr v-for=\"item in data\" :key=\"item.address\">\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<b>{{item.bid_balance_value}}</b>&nbsp;\n\t\t\t\t\t\t\t\t\t<template v-if=\"item.bid_symbol == 'MMX'\">MMX</template>\n\t\t\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t\t\t<router-link :to=\"'/explore/address/' + item.bid_currency\">\n\t\t\t\t\t\t\t\t\t\t\t<template v-if=\"tokens.has(item.bid_currency)\">{{item.bid_symbol}}</template>\n\t\t\t\t\t\t\t\t\t\t\t<template v-else>{{item.bid_symbol}}?</template>\n\t\t\t\t\t\t\t\t\t\t</router-link>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<b>{{parseFloat((item.bid_balance_value * item.display_price).toPrecision(6))}}</b>&nbsp;\n\t\t\t\t\t\t\t\t\t<template v-if=\"item.ask_symbol == 'MMX'\">MMX</template>\n\t\t\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t\t\t<router-link :to=\"'/explore/address/' + item.ask_currency\">\n\t\t\t\t\t\t\t\t\t\t\t<template v-if=\"tokens.has(item.ask_currency)\">{{item.ask_symbol}}</template>\n\t\t\t\t\t\t\t\t\t\t\t<template v-else>{{item.ask_symbol}}?</template>\n\t\t\t\t\t\t\t\t\t\t</router-link>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td><b>{{ parseFloat( (1 / item.display_price).toPrecision(3) ) }}</b>&nbsp; {{item.bid_symbol}} / {{item.ask_symbol}}</td>\n\t\t\t\t\t\t\t\t<td>{{new Date(item.time * 1000).toLocaleString()}}</td>\n\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.address\">TX</router-link></td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<v-btn outlined text @click=\"trade(item)\">{{ $t('market_offers.trade') }}</v-btn>\n\t\t\t\t\t\t\t\t\t<template v-if=\"!accepted.has(item.address)\">\n\t\t\t\t\t\t\t\t\t\t<v-btn outlined text color=\"green darken-1\" @click=\"accept(item)\">{{ $t('common.accept') }}</v-btn>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</template>\n\t\t\t</v-card>\n\t\t</div>\n\t\t`\n})\n\nVue.component('market-history', {\n\tprops: {\n\t\tbid: null,\n\t\task: null,\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\ttokens: null,\n\t\t\ttimer: null,\n\t\t\tloading: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tif(this.tokens) {\n\t\t\t\tthis.loading = true;\n\t\t\t\tlet query = '/wapi/trade_history?limit=' + this.limit;\n\t\t\t\tif(this.bid) {\n\t\t\t\t\tquery += '&bid=' + this.bid;\n\t\t\t\t}\n\t\t\t\tif(this.ask) {\n\t\t\t\t\tquery += '&ask=' + this.ask;\n\t\t\t\t}\n\t\t\t\tfetch(query)\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => {\n\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\tthis.data = data;\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfetch('/wapi/wallet/tokens')\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => {\n\t\t\t\t\t\tthis.tokens = new Set();\n\t\t\t\t\t\tfor(const token of data) {\n\t\t\t\t\t\t\tthis.tokens.add(token.currency);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 60000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card>\n\t\t\t\t<div v-if=\"!data && loading\">\n\t\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\"/>\n\t\t\t\t</div>\n\n\t\t\t\t<template v-if=\"data\">\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th>{{ $t('market_offers.they_offer') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('market_offers.they_ask') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('market_offers.price') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('market_offers.time') }}</th>\n\t\t\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr v-for=\"item in data\" :key=\"item.address\">\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<b>{{item.bid_value}}</b>&nbsp;\n\t\t\t\t\t\t\t\t\t<template v-if=\"item.bid_symbol == 'MMX'\">MMX</template>\n\t\t\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t\t\t<router-link :to=\"'/explore/address/' + item.bid_currency\">\n\t\t\t\t\t\t\t\t\t\t\t<template v-if=\"tokens.has(item.bid_currency)\">{{item.bid_symbol}}</template>\n\t\t\t\t\t\t\t\t\t\t\t<template v-else>{{item.bid_symbol}}?</template>\n\t\t\t\t\t\t\t\t\t\t</router-link>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<b>{{item.ask_value}}</b>&nbsp;\n\t\t\t\t\t\t\t\t\t<template v-if=\"item.ask_symbol == 'MMX'\">MMX</template>\n\t\t\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t\t\t<router-link :to=\"'/explore/address/' + item.ask_currency\">\n\t\t\t\t\t\t\t\t\t\t\t<template v-if=\"tokens.has(item.ask_currency)\">{{item.ask_symbol}}</template>\n\t\t\t\t\t\t\t\t\t\t\t<template v-else>{{item.ask_symbol}}?</template>\n\t\t\t\t\t\t\t\t\t\t</router-link>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td><b>{{parseFloat((1 / item.display_price).toPrecision(3))}}</b>&nbsp; {{item.bid_symbol}} / {{item.ask_symbol}}</td>\n\t\t\t\t\t\t\t\t<td>{{new Date(item.time * 1000).toLocaleString()}}</td>\n\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.address\">Offer</router-link></td>\n\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/transaction/' + item.txid\">TX</router-link></td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</template>\n\t\t\t</v-card>\n\t\t</div>\n\t`\n})\n"
  },
  {
    "path": "www/web-gui/public/mount.js",
    "content": "\nconst routes = [\n\t{ path: '/', redirect: \"/node\" },\n\t{ path: '/login', component: Login, meta: { is_login: true } },\n\t{ path: '/wallet', component: Wallet, meta: { is_wallet: true } },\n\t{ path: '/wallet/create', component: WalletCreate, meta: { is_wallet: true } },\n\t{ path: '/wallet/account/:index',\n\t\tcomponent: Account,\n\t\tmeta: { is_wallet: true },\n\t\tprops: route => ({ index: parseInt(route.params.index) }),\n\t\tchildren: [\n\t\t\t{ path: '', component: AccountHome, meta: { page: 'balance' } },\n\t\t\t{ path: 'nfts', component: AccountNFTs, meta: { page: 'nfts' } },\n\t\t\t{ path: 'contracts', component: AccountContracts, meta: { page: 'contracts' } },\n\t\t\t{ path: 'send/:target?', component: AccountSend, meta: { page: 'send' } },\n\t\t\t{ path: 'send_from/:source?', component: AccountSendFrom, meta: { page: 'send' } },\n\t\t\t{ path: 'split', component: AccountSplit, meta: { page: 'split' } },\n\t\t\t{ path: 'offer', component: AccountOffer, meta: { page: 'offer' } },\n\t\t\t{ path: 'history', component: AccountHistory, meta: { page: 'history' } },\n\t\t\t{ path: 'log', component: AccountLog, meta: { page: 'log' } },\n\t\t\t{ path: 'liquid', component: AccountLiquid, meta: { page: 'liquid' } },\n\t\t\t{ path: 'plotnfts', component: AccountPlotNFTs, meta: { page: 'plotnfts' } },\n\t\t\t{ path: 'details', component: AccountDetails, meta: { page: 'details' } },\n\t\t\t{ path: 'options', component: AccountOptions, meta: { page: 'options' } },\n\t\t\t{ path: 'create/locked', component: AccountCreateLocked },\n\t\t]\n\t},\n\t{ path: '/market',\n\t\tcomponent: Market,\n\t\tredirect: '/market/offers/null/null/null',\n\t\tmeta: { is_market: true },\n\t\tprops: route => ({\n\t\t\twallet: route.params.wallet == 'null' ? null : parseInt(route.params.wallet),\n\t\t\tbid: route.params.bid == 'null' ? null : route.params.bid,\n\t\t\task: route.params.ask == 'null' ? null : route.params.ask,\n\t\t}),\n\t\tchildren: [\n\t\t\t{ path: 'offers/:wallet/:bid/:ask', component: MarketOffers, meta: { page: 'offers' } },\n\t\t\t{ path: 'history/:wallet/:bid/:ask', component: MarketHistory, meta: { page: 'history' } },\n\t\t]\n\t},\n\t{ path: '/swap',\n\t\tcomponent: Swap,\n\t\tredirect: '/swap/market/null/null',\n\t\tmeta: { is_swap: true },\n\t\tprops: route => ({\n\t\t\taddress: route.params.address\n\t\t}),\n\t\tchildren: [\n\t\t\t{ path: 'market/:token/:currency', component: SwapMarket, meta: { page: 'market' } },\n\t\t\t{ path: 'trade/:address', component: SwapTrade, meta: { page: 'trade' } },\n\t\t\t{ path: 'history/:address', component: SwapHistory, meta: { page: 'history' } },\n\t\t\t{ path: 'liquid/:address', component: SwapLiquid, meta: { page: 'liquid' } },\n\t\t\t{ path: 'pool/:address', component: SwapPool, meta: { page: 'pool' } },\n\t\t]\n\t},\n\t{ path: '/explore',\n\t\tcomponent: Explore,\n\t\tredirect: \"/explore/blocks\",\n\t\tmeta: { is_explorer: true },\n\t\tchildren: [\n\t\t\t{ path: 'blocks', component: ExploreBlocks, meta: { page: 'blocks' } },\n\t\t\t{ path: 'transactions', component: ExploreTransactions, meta: { page: 'transactions' } },\n\t\t\t{ path: 'farmers', component: ExploreFarmers, meta: { page: 'farmers' } },\n\t\t\t{ path: 'block/hash/:hash', component: ExploreBlock, meta: { page: 'block' } },\n\t\t\t{ path: 'block/height/:height', component: ExploreBlock, meta: { page: 'block' } },\n\t\t\t{ path: 'farmer/:id', component: ExploreFarmer, meta: { page: 'farmer' } },\n\t\t\t{ path: 'address/:address', component: ExploreAddress, meta: { page: 'address' } },\n\t\t\t{ path: 'transaction/:id', component: ExploreTransaction, meta: { page: 'transaction' } },\n\t\t]\n\t},\n\t{ path: '/node',\n\t\tcomponent: NodeView,\n\t\tredirect: \"/node/log\",\n\t\tmeta: { is_node: true },\n\t\tchildren: [\n\t\t\t{ path: 'log', component: NodeLog, meta: { page: 'log' } },\n\t\t\t{ path: 'peers', component: NodePeers, meta: { page: 'peers' } },\n\t\t\t{ path: 'blocks', component: NodeBlocks, meta: { page: 'blocks' } },\n\t\t\t{ path: 'netspace', component: NodeNetspace, meta: { page: 'netspace' } },\n\t\t\t{ path: 'vdf_speed', component: NodeVDFSpeed, meta: { page: 'vdf_speed' } },\n\t\t\t{ path: 'reward', component: NodeBlockReward, meta: { page: 'reward' } },\n\t\t]\n\t},\n\t{ path: '/farmer',\n\t\tcomponent: Farmer,\n\t\tredirect: \"/farmer/plots\",\n\t\tmeta: { is_farmer: true },\n\t\tchildren: [\n\t\t\t{ path: 'plots', component: FarmerPlots, meta: { page: 'plots' } },\n\t\t\t{ path: 'blocks', component: FarmerBlocks, meta: { page: 'blocks' } },\n\t\t\t{ path: 'proofs', component: FarmerProofs, meta: { page: 'proofs' } },\n\t\t\t{ path: 'plotnfts', component: FarmerPlotNFTs, meta: { page: 'plotnfts' } },\n\t\t]\n\t},\n\t{ path: '/settings', component: Settings, meta: { is_settings: true } },\n]\n\nconst router = new VueRouter({\n\troutes\n})\n\nvar vuetify = new Vuetify({\n\tlang: {\n\t\tt: (key, ...params) => i18n.t(key, params),\n\t},\n});\n\nVue.prototype.$isQtGUI = typeof window.mmx_qtgui !== 'undefined';\nVue.prototype.$isWinGUI = typeof window.mmx !== 'undefined';\n\n(async () => {\n\n    var locale;\n\n    if(Vue.prototype.$isWinGUI) {\n        locale = window.mmx.locale;\n    } else {\n        locale = localStorage.getItem('language');\n    }\n\n    if (locale) {\n        await loadLanguageAsync(locale);\n    } else {\n        setI18nLanguage('en');\n    }\n\n    new Vue({\n        data: {\n\t\t\tfarmer: false,\n\t\t\twallet: false,\n\t\t\tlocal_node: false,\n\t\t\tparams: null,\n            nodeInfo: null\n        },\n        el: '#app',\n        vuetify: vuetify,\n        router: router,\n        i18n: i18n,\n    \n        beforeMount() {\n            if(this.$isWinGUI) {\n                this.$vuetify.theme.dark = window.mmx.theme_dark;\n\n                setInterval( () => { \n                    var locale = window.mmx.locale;\t\n                    if (i18n.locale != locale) {\n                        loadLanguageAsync(locale);\n                    }\n                    this.$vuetify.theme.dark = window.mmx.theme_dark;\n                }, 1000);\n\n            } else {\n                this.$vuetify.theme.dark = localStorage.getItem('theme_dark') === 'true';\n            }\n        },\n\t\tcreated() {\n\t\t\tfetch('/wapi/chain/info')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.params = data);\n\t\t\tfetch('/wapi/config/get?key=farmer')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.farmer = data || data == null ? true : false);\n\t\t\tfetch('/wapi/config/get?key=wallet')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.wallet = data || data == null ? true : false);\n\t\t\tfetch('/wapi/config/get?key=local_node')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.local_node = data || data == null ? true : false);\n\t\t}\n\n    });\n})();\n\n\n\n\n\n"
  },
  {
    "path": "www/web-gui/public/node.js",
    "content": "\nVue.component('node-menu', {\n\ttemplate: `\n\t\t<v-tabs>\n\t\t\t<v-tab to=\"/node/log\">{{ $t('node_menu.log') }}</v-tab>\n\t\t\t<v-tab to=\"/node/peers\" v-if=\"$root.local_node\">{{ $t('node_menu.peers') }}</v-tab>\n\t\t\t<v-tab to=\"/node/blocks\">{{ $t('node_menu.blocks') }}</v-tab>\n\t\t\t<v-tab to=\"/node/netspace\">{{ $t('node_menu.netspace') }}</v-tab>\n\t\t\t<v-tab to=\"/node/vdf_speed\">{{ $t('node_menu.vdf_speed') }}</v-tab>\n\t\t\t<v-tab to=\"/node/reward\">{{ $t('node_menu.block_reward') }}</v-tab>\n\t\t</v-tabs>\n\t\t`\n})\n\nVue.component('node-info', {\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\ttimer: null\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/node/info')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.data = data);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 5000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-row class=\"my-2 py-0\">\n\t\t\t\t<v-col cols=\"12\" class=\"my-0 py-0\">\n\t\t\t\t\t<v-card min-height=\"90\">\n\t\t\t\t\t\t<v-card-title>\n\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"data\">{{ data.is_synced ? $t('common.yes') : $t('common.no') }}</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"/>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\t{{ $t('node_info.synced') }}\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" width=100>\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"data\">{{ data.height }}</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"/>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\t{{ $t('node_info.height') }}\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"data\">{{ (data.total_space / Math.pow(1000, 2)).toFixed(3) }} PB</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"/>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\t{{ $t('node_info.netspace') }}\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"data\">{{ data.vdf_speed.toFixed(3) }} MH/s</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"/>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\t{{ $t('node_info.vdf_speed') }}\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t</v-card-title>\n\t\t\t\t\t</v-card>\n\t\t\t\t</v-col>\n\t\t\t</v-row>\n\t\t\t\n\t\t\t<v-row class=\"my-2 py-0\">\n\t\t\t\t<v-col cols=\"12\" class=\"my-0 py-0\">\n\t\t\t\t\t<v-card min-height=\"90\">\n\t\t\t\t\t\t<v-card-title>\n\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"data\">{{ data.address_count }}</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"/>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\t{{ $t('node_info.no_addresses') }}\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"data\">{{ (data.block_size * 100).toFixed(2) }} %</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"/>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\t{{ $t('node_info.block_size') }}\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"data\">{{ data.average_txfee.value > 1 ? data.average_txfee.value.toPrecision(6) : data.average_txfee.value }} MMX</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"/>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\tAvg. TX Fee\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\n\t\t\t\t\t\t\t\t<v-col cols=\"12\" xl=\"3\" md=\"3\" sm=\"6\" class=\"text-center my-2\">\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\">\n\t\t\t\t\t\t\t\t\t\t<div v-if=\"data\">{{ (data.block_reward.value).toFixed(3) }} MMX</div>\n\t\t\t\t\t\t\t\t\t\t<v-skeleton-loader v-else type=\"heading\" width=\"50%\" align=\"center\"/>\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t\t<v-row align=\"center\" justify=\"space-around\" class=\"subtitle-1\">\n\t\t\t\t\t\t\t\t\t\t{{ $t('node_info.block_reward') }}\n\t\t\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t\t</v-col>\n\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t</v-card-title>\n\t\t\t\t\t</v-card>\n\t\t\t\t</v-col>\n\t\t\t</v-row>\n\n\t\t</div>\n\t\t`\n})\n\nVue.component('node-peers', {\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\ttimer: null,\n\t\t\tloaded: false\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('node_peers.ip'), value: 'address', width: \"5%\" },\n\t\t\t\t{ text: this.$t('node_peers.height'), value: 'height', width: \"5%\" },\n\t\t\t\t{ text: this.$t('node_peers.type'), value: 'type', width: \"5%\"},\n\t\t\t\t{ text: this.$t('node_peers.version'), value: 'version', width: \"5%\" },\n\t\t\t\t{ text: this.$t('node_peers.received'), value: 'received', width: \"10%\" },\n\t\t\t\t{ text: this.$t('node_peers.send'), value: 'send', width: \"10%\" },\n\t\t\t\t{ text: this.$t('node_peers.ping'), value: 'ping', width: \"10%\" },\n\t\t\t\t{ text: this.$t('node_peers.duration'), value: 'duration', width: \"10%\" },\n\t\t\t\t{ text: this.$t('node_peers.connection'), value: 'connection', width: \"10%\" },\n\t\t\t\t{ text: \"Action\", value: 'action'},\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/api/router/get_peer_info')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data; \n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t},\n\t\tkick_peer(address) {\n\t\t\tconst args = {};\n\t\t\targs.address = address;\n\t\t\tfetch('/api/router/kick_peer', {body: JSON.stringify(args), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 5000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data.peers\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.height=\"{ item }\">\n\t\t\t\t{{item.is_synced ? \"\" : \"!\"}}{{item.height}}\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.version=\"{ item }\">\n\t\t\t\t{{(item.version / 100).toFixed()}}.{{item.version % 100}}\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.received=\"{ item }\">\n\t\t\t\t<b>{{(item.bytes_recv / 1024 / 1024).toFixed(1)}}</b> MB\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.send=\"{ item }\">\n\t\t\t\t<b>{{(item.bytes_send / 1024 / 1024).toFixed(1)}}</b> MB\n\t\t\t</template>\t\n\t\t\t\n\t\t\t<template v-slot:item.ping=\"{ item }\">\n\t\t\t\t<b>{{item.ping_ms}}</b> ms\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.duration=\"{ item }\">\n\t\t\t\t<b>{{(item.connect_time_ms / 1000 / 60).toFixed()}}</b> min\n\t\t\t</template>\t\t\t\n\n\t\t\t<template v-slot:item.connection=\"{ item }\">\n\t\t\t\t{{item.is_outbound ? $t('node_peers.outbound') : $t('node_peers.inbound') }}\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.action=\"{ item }\">\n\t\t\t\t<v-btn @click=\"kick_peer(item.address)\" outlined text>Kick</v-btn>\n\t\t\t</template>\n\t\t</v-data-table>\t\n\t\t`\n})\n\nVue.component('netspace-graph', {\n\tprops: {\n\t\tlimit: Number,\n\t\tstep: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tlayout: {\n\t\t\t\ttitle: this.$t('netspace_graph.title', ['PB']),\n\t\t\t\txaxis: {\n\t\t\t\t\ttitle: this.$t('common.height')\n\t\t\t\t},\n\t\t\t\tyaxis: {\n\t\t\t\t\ttitle: \"PB\"\n\t\t\t\t}\n\t\t\t},\n\t\t\ttimer: null,\n\t\t\tloading: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tthis.loading = true;\n\t\t\tfetch('/wapi/node/graph/blocks?limit=' + this.limit + '&step=' + (this.step ? this.step : 90))\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tconst tmp = {x: [], y: [], type: \"scatter\"};\n\t\t\t\t\tfor(const item of data) {\n\t\t\t\t\t\ttmp.x.push(item.height);\n\t\t\t\t\t\ttmp.y.push(item.netspace);\n\t\t\t\t\t}\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.data = [tmp];\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 60 * 1000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card>\n\t\t\t\t<v-skeleton-loader type=\"image@3\" height=\"482\" v-if=\"!data && loading\"/>\n\t\t\t\t<v-fade-transition>\n\t\t\t\t\t<v-card-text v-if=\"data\">\n\t\t\t\t\t\t<vue-plotly :data=\"data\" :layout=\"layout\" :display-mode-bar=\"false\"></vue-plotly>\n\t\t\t\t\t</v-card-text>\n\t\t\t\t</v-fade-transition>\n\t\t\t</v-card>\n\t\t</div>\n\t\t`\n})\n\nVue.component('vdf-speed-graph', {\n\tprops: {\n\t\tlimit: Number,\n\t\tstep: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tlayout: {\n\t\t\t\ttitle: this.$t('vdf_speed_graph.title', ['MH/s']),\n\t\t\t\txaxis: {\n\t\t\t\t\ttitle: this.$t('common.height')\n\t\t\t\t},\n\t\t\t\tyaxis: {\n\t\t\t\t\ttitle: \"MH/s\"\n\t\t\t\t}\n\t\t\t},\n\t\t\ttimer: null,\n\t\t\tloading: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tthis.loading = true;\n\t\t\tfetch('/wapi/node/graph/blocks?limit=' + this.limit + '&step=' + (this.step ? this.step : 90))\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tconst tmp = {x: [], y: [], type: \"scatter\"};\n\t\t\t\t\tfor(const item of data) {\n\t\t\t\t\t\ttmp.x.push(item.height);\n\t\t\t\t\t\ttmp.y.push(item.vdf_speed);\n\t\t\t\t\t}\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.data = [tmp];\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 60 * 1000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card>\n\t\t\t\t<v-skeleton-loader type=\"image@3\" height=\"482\" v-if=\"!data && loading\"/>\n\t\t\t\t<v-fade-transition>\t\t\t\t\t\n\t\t\t\t\t<v-card-text v-if=\"data\">\n\t\t\t\t\t\t<vue-plotly :data=\"data\" :layout=\"layout\" :display-mode-bar=\"false\"></vue-plotly>\n\t\t\t\t\t</v-card-text>\n\t\t\t\t</v-fade-transition>\n\t\t\t</v-card>\n\t\t</div>\n\t\t`\n})\n\nVue.component('block-reward-graph', {\n\tprops: {\n\t\tlimit: Number,\n\t\tstep: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tbase_data: null,\n\t\t\tfee_data: null,\n\t\t\tbase_layout: {\n\t\t\t\ttitle: this.$t('block_reward_graph.title', ['MMX']),\n\t\t\t\txaxis: {\n\t\t\t\t\ttitle: this.$t('common.height')\n\t\t\t\t},\n\t\t\t\tyaxis: {\n\t\t\t\t\ttitle: \"MMX\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tfee_layout: {\n\t\t\t\ttitle: this.$t('tx_fees_graph.title', ['MMX']),\n\t\t\t\txaxis: {\n\t\t\t\t\ttitle: this.$t('common.height')\n\t\t\t\t},\n\t\t\t\tyaxis: {\n\t\t\t\t\ttitle: \"MMX\"\n\t\t\t\t}\n\t\t\t},\n\t\t\ttimer: null,\n\t\t\tloading: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tthis.loading = true;\n\t\t\tfetch('/wapi/node/graph/blocks?limit=' + this.limit + '&step=' + (this.step ? this.step : 90))\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\t{\n\t\t\t\t\t\tconst tmp = {x: [], y: [], type: \"scatter\"};\n\t\t\t\t\t\tfor(const item of data) {\n\t\t\t\t\t\t\ttmp.x.push(item.height);\n\t\t\t\t\t\t\ttmp.y.push(item.reward);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.base_data = [tmp];\n\t\t\t\t\t}\n\t\t\t\t\t{\n\t\t\t\t\t\tconst tmp = {x: [], y: [], type: \"scatter\"};\n\t\t\t\t\t\tfor(const item of data) {\n\t\t\t\t\t\t\ttmp.x.push(item.height);\n\t\t\t\t\t\t\ttmp.y.push(item.tx_fees);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.fee_data = [tmp];\n\t\t\t\t\t}\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 60 * 1000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\n\t\t\t<v-card>\n\t\t\t\t<v-skeleton-loader type=\"image@3\" height=\"482\" v-if=\"!base_data && loading\"/>\n\t\t\t\t<v-fade-transition>\t\t\t\t\t\n\t\t\t\t\t<v-card-text v-if=\"base_data\">\n\t\t\t\t\t\t<vue-plotly :data=\"base_data\" :layout=\"base_layout\" :display-mode-bar=\"false\"></vue-plotly>\n\t\t\t\t\t</v-card-text>\n\t\t\t\t</v-fade-transition>\n\t\t\t</v-card>\t\t\t\t\n\t\t\n\t\t\t<v-card class=\"my-2\">\n\t\t\t\t<v-skeleton-loader type=\"image@3\" height=\"482\" v-if=\"!fee_data && loading\"/>\n\t\t\t\t<v-fade-transition>\n\t\t\t\t\t<v-card-text v-if=\"fee_data\">\n\t\t\t\t\t\t<vue-plotly :data=\"fee_data\" :layout=\"fee_layout\" :display-mode-bar=\"false\"></vue-plotly>\n\t\t\t\t\t</v-card-text>\n\t\t\t\t</v-fade-transition>\n\t\t\t</v-card>\n\t\t\t\n\t\t</div>\n\t\t`\n})\n\nVue.component('node-log', {\n\tdata() {\n\t\treturn {\n\t\t\tlimit: 100,\n\t\t\tlevel: 3,\n\t\t\tmodule: null,\n\t\t\tcurrentItem: 0\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-btn-toggle\n\t\t\t\tv-model=\"currentItem\"\n\t\t\t\tdense\n\t\t\t\tclass=\"mb-2\"\n\t\t\t>\n\t\t\t\t<v-btn @click=\"module = null\">{{ $t('node_log.terminal') }}</v-btn>\n\t\t\t\t<v-btn @click=\"module = 'Node'\">{{ $t('node_log.node') }}</v-btn>\n\t\t\t\t<v-btn @click=\"module = 'Router'\">{{ $t('node_log.router') }}</v-btn>\n\t\t\t\t<v-btn @click=\"module = 'Wallet'\">{{ $t('node_log.wallet') }}</v-btn>\n\t\t\t\t<v-btn @click=\"module = 'Farmer'\">{{ $t('node_log.farmer') }}</v-btn>\n\t\t\t\t<v-btn @click=\"module = 'Harvester'\">{{ $t('node_log.harvester') }}</v-btn>\n\t\t\t\t<v-btn @click=\"module = 'TimeLord'\">{{ $t('node_log.timelord') }}</v-btn>\n\t\t\t</v-btn-toggle>\n\t  \t\t<node-log-table :limit=\"limit\" :level=\"level\" :module=\"module\"></node-log-table>\n\t\t</div>\t\t\n\t\t`\n})\n\nVue.component('node-log-table', {\n\tprops: {\n\t\tlimit: Number,\n\t\tlevel: Number,\n\t\tmodule: String\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\ttimer: null,\n\t\t\tloaded: false\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('node_log_table.time'), value: 'time', align: 'left', width: \"10%\"},\n\t\t\t\t{ text: this.$t('node_log_table.module'), value: 'module', width: \"10%\"},\n\t\t\t\t{ text: this.$t('node_log_table.message'), value: 'message' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/node/log?limit=' + this.limit + \"&level=\" + this.level + (this.module ? \"&module=\" + this.module : \"\"))\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tif(this.$isWinGUI) \n\t\t\t\t\t{\n\t\t\t\t\t\tthis.data = this.data.filter( item => item.module != 'HttpServer');\n\t\t\t\t\t}\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t});\n\t\t},\n\t\titemClass(item) {\n\t\t\tvar result = \"\";\n\n\t\t\tswitch(item.level) {\n\t\t\t\tcase 1:\n\t\t\t\t\tresult = 'error';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tresult = 'warning';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tresult = '';\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t},\n\twatch: {\n\t\tlimit() {\n\t\t\tthis.update();\n\t\t},\n\t\tlevel() {\n\t\t\tthis.update();\n\t\t},\n\t\tmodule() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 2000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-data-table\n\t\t\t\t:headers=\"headers\"\n\t\t\t\t:items=\"data\"\n\t\t\t\t:loading=\"!loaded\"\n\t\t\t\t:item-class=\"itemClass\"\n\t\t\t\thide-default-footer\n\t\t\t\tdisable-sort\n\t\t\t\tdisable-pagination\n\t\t\t\tdense\n\t\t\t\tclass=\"elevation-2\"\n\t\t\t>\n\t\t\t\t<template v-slot:progress>\n\t\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t\t</template>\n\n\t\t\t\t<template v-slot:item.time=\"{ item }\">\n\t\t\t\t\t{{ new Date(item.time / 1000).toLocaleTimeString() }}\n\t\t\t\t</template>\n\n\t\t\t</v-data-table>\n\t\t</div>\n\t\t`\n})\n\n"
  },
  {
    "path": "www/web-gui/public/robots.txt",
    "content": "User-agent: *\r\nDisallow: /"
  },
  {
    "path": "www/web-gui/public/settings.js",
    "content": "\nVue.component('node-settings', {\n\tdata() {\n\t\treturn {\n\t\t\terror: null,\n\t\t\tresult: null,\n\t\t\tloading: true,\n\t\t\ttimelord: null,\n\t\t\topen_port: null,\n\t\t\tallow_remote: null,\n\t\t\tcuda_enable: null,\n\t\t\topencl_device_list_relidx: null,\n\t\t\topencl_device: null,\n\t\t\topencl_device_list: null,\n\t\t\tfarmer_reward_addr: \"null\",\n\t\t\ttimelord_reward_addr: \"null\",\n\t\t\tharv_num_threads: null,\n\t\t\treload_interval: null,\n\t\t\trecursive_search: null,\n\t\t\tplot_dirs: [],\n\t\t\tnew_plot_dir: null,\n\t\t\trevert_height: null,\n\t\t\tavailableLanguages: availableLanguages\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/config/get')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.timelord = data.timelord ? true : false;\n\t\t\t\t\tthis.open_port = data[\"Router.open_port\"] ? true : false;\n\t\t\t\t\tthis.allow_remote = data[\"allow_remote\"] ? true : false;\n\t\t\t\t\tthis.cuda_enable = data[\"cuda.enable\"] ? true : false;\n\t\t\t\t\tthis.opencl_device = data[\"Node.opencl_device_select\"] != null ? data[\"Node.opencl_device_select\"] : -1;\n\t\t\t\t\tthis.opencl_device_list_relidx = [];\n\t\t\t\t\tthis.opencl_device_list = [{name: \"None\", value: -1}];\n\t\t\t\t\t{\n\t\t\t\t\t\tlet list = data[\"Node.opencl_device_list\"];\n\t\t\t\t\t\tif(list) {\n\t\t\t\t\t\t\tfor(const [i, device] of list.entries()) {\n\t\t\t\t\t\t\t\tthis.opencl_device_list_relidx.push({name: device[0], index: device[1]});\n\t\t\t\t\t\t\t\tthis.opencl_device_list.push({name: device[0], value: i});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.farmer_reward_addr = data[\"Farmer.reward_addr\"];\n\t\t\t\t\tthis.timelord_reward_addr = data[\"TimeLord.reward_addr\"];\n\t\t\t\t\tthis.harv_num_threads = data[\"Harvester.num_threads\"];\n\t\t\t\t\tthis.reload_interval = data[\"Harvester.reload_interval\"];\n\t\t\t\t\tthis.recursive_search = data[\"Harvester.recursive_search\"];\n\t\t\t\t\tthis.plot_dirs = data[\"Harvester.plot_dirs\"];\n\t\t\t\t});\n\t\t},\n\t\tset_config(key, value, restart, tmp_only = false) {\n\t\t\tvar req = {};\n\t\t\treq.key = key;\n\t\t\treq.value = value;\n\t\t\treq.tmp_only = tmp_only;\n\t\t\tfetch('/wapi/config/set', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tthis.result = {key: req.key, value: req.value, restart};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\tthis.error = data;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\tadd_plot_dir(path) {\n\t\t\tif(path == null || path == \"\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar req = {};\n\t\t\treq.path = path;\n\t\t\tfetch('/api/harvester/add_plot_dir', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\tthis.result = {key: \"Harvester.plot_dirs\", value: \"+ \" + req.path, restart: false};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\tthis.error = data;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\trem_plot_dir(path) {\n\t\t\tvar req = {};\n\t\t\treq.path = path;\n\t\t\tfetch('/api/harvester/rem_plot_dir', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\tthis.result = {key: \"Harvester.plot_dirs\", value: \"- \" + req.path, restart: false};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\tthis.error = data;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\trevert_sync(height) {\n\t\t\tif(height == null) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\theight = parseInt(height)\n\t\t\tif(!(height >= 0)) {\n\t\t\t\tthis.error = \"invalid height\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar req = {};\n\t\t\treq.height = parseInt(height);\n\t\t\tfetch('/api/node/revert_sync', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tthis.result = {key: \"Node.revert_sync\", value: height, restart: false};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\tthis.error = data;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis.revert_height = null;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\tcomputed: {\n\t\tthemes() {\n\t\t\treturn [ \n\t\t\t\t\t{ value: false, text: this.$t('node_settings.light') },\n\t\t\t\t\t{ value: true, text: this.$t('node_settings.dark') }\n\t\t\t\t];\n\t\t}\t\t\t\t\t\t\n\t},\n\twatch: {\n\t\ttimelord(value, prev) {\n\t\t\tif(prev != null) {\n\t\t\t\tthis.set_config(\"timelord\", value, true);\n\t\t\t}\n\t\t},\n\t\topen_port(value, prev) {\n\t\t\tif(prev != null) {\n\t\t\t\tthis.set_config(\"Router.open_port\", value, true);\n\t\t\t}\n\t\t},\n\t\tallow_remote(value, prev) {\n\t\t\tif(prev != null) {\n\t\t\t\tthis.set_config(\"allow_remote\", value, true);\n\t\t\t}\n\t\t},\n\t\topencl_device(value, prev) {\n\t\t\tif(prev != null) {\n\t\t\t\tthis.set_config(\"Node.opencl_device_select\", value, true, true);\n\t\t\t\tthis.set_config(\"opencl.platform\", null, true);\n\t\t\t\tthis.set_config(\"Node.opencl_device\", (value >= 0) ? this.opencl_device_list_relidx[value].index : -1, true);\n\t\t\t\tthis.set_config(\"Node.opencl_device_name\", (value >= 0) ? this.opencl_device_list_relidx[value].name : null, true);\n\t\t\t}\n\t\t},\n\t\tcuda_enable(value, prev) {\n\t\t\tif(prev != null) {\n\t\t\t\tthis.set_config(\"cuda.enable\", value, true);\n\t\t\t}\n\t\t},\n\t\tfarmer_reward_addr(value, prev) {\n\t\t\tif(prev != \"null\") {\n\t\t\t\tthis.set_config(\"Farmer.reward_addr\", value.length ? value : null, true);\n\t\t\t}\n\t\t},\n\t\ttimelord_reward_addr(value, prev) {\n\t\t\tif(prev != \"null\") {\n\t\t\t\tthis.set_config(\"TimeLord.reward_addr\", value.length ? value : null, true);\n\t\t\t}\n\t\t},\n\t\tenable_timelord_reward(value, prev) {\n\t\t\tif(prev != null) {\n\t\t\t\tthis.set_config(\"TimeLord.enable_reward\", value, true);\n\t\t\t}\n\t\t},\n\t\tverify_timelord_reward(value, prev) {\n\t\t\tif(prev != null) {\n\t\t\t\tthis.set_config(\"Node.verify_vdf_rewards\", value, true);\n\t\t\t}\n\t\t},\n\t\tharv_num_threads(value, prev) {\n\t\t\tif(prev != null) {\n\t\t\t\tthis.set_config(\"Harvester.num_threads\", value, true);\n\t\t\t}\n\t\t},\n\t\trecursive_search(value, prev) {\n\t\t\tif(prev != null) {\n\t\t\t\tthis.set_config(\"Harvester.recursive_search\", value ? true : false, true);\n\t\t\t}\n\t\t},\n\t\treload_interval(value, prev) {\n\t\t\tif(prev != null) {\n\t\t\t\tthis.set_config(\"Harvester.reload_interval\", value, true);\n\t\t\t}\n\t\t},\n\t\tresult(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.error = null;\n\t\t\t}\n\t\t},\n\t\terror(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.result = null;\n\t\t\t}\n\t\t},\n\t\t'$i18n.locale': async function (newVal, oldVal) {\n\t\t\tlocalStorage.setItem('language', newVal);\n\t\t\tawait loadLanguageAsync(newVal);\t\t\t\n\t\t},\n\t\t'$vuetify.theme.dark': async function (newVal, oldVal) {\n\t\t\tlocalStorage.setItem('theme_dark', newVal);\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card v-if=\"!$isWinGUI\">\n\t\t\t\t<v-card-title>{{ $t('node_settings.gui') }}</v-card-title>\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-select\n\t\t\t\t\t\tv-model=\"$i18n.locale\"\n\t\t\t\t\t\t:label=\"$t('node_settings.language')\"\n\t\t\t\t\t\t:items=\"availableLanguages\" \n\t\t\t\t\t\titem-text=\"language\"\n\t\t\t\t\t\titem-value=\"code\">\n\t\t\t\t\t</v-select>\n\t\t\t\t\t\n\t\t\t\t\t<v-select\n\t\t\t\t\t\tv-model=\"$vuetify.theme.dark\"\n\t\t\t\t\t\t:label=\"$t('node_settings.theme')\"\n\t\t\t\t\t\t:items=\"themes\" \n\t\t\t\t\t\titem-text=\"text\"\n\t\t\t\t\t\titem-value=\"value\">\n\t\t\t\t\t</v-select>\n\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\n\t\t\t<v-card v-if=\"$root.local_node\" class=\"my-2\">\n\t\t\t\t<v-card-title>Node</v-card-title>\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-progress-linear :active=\"loading\" indeterminate absolute top></v-progress-linear>\n\t\t\t\t\t\n\t\t\t\t\t<v-checkbox\n\t\t\t\t\t\tv-model=\"timelord\"\n\t\t\t\t\t\t:label=\"$t('node_settings.enable_timelord')\"\n\t\t\t\t\t\tclass=\"my-0\"\n\t\t\t\t\t></v-checkbox>\n\t\t\t\t\t<v-checkbox\n\t\t\t\t\t\tv-model=\"open_port\"\n\t\t\t\t\t\t:label=\"$t('node_settings.open_port')\"\n\t\t\t\t\t\tclass=\"my-0\"\n\t\t\t\t\t></v-checkbox>\n\t\t\t\t\t<v-checkbox\n\t\t\t\t\t\tv-model=\"allow_remote\"\n\t\t\t\t\t\tlabel=\"Allow remote service access (for remote harvesters)\"\n\t\t\t\t\t\tclass=\"my-0\"\n\t\t\t\t\t></v-checkbox>\n\n\t\t\t\t\t<v-select\n\t\t\t\t\t\tv-model=\"opencl_device\"\n\t\t\t\t\t\t:label=\"$t('node_settings.opencl_device')\"\n\t\t\t\t\t\t:items=\"opencl_device_list\"\n\t\t\t\t\t\titem-text=\"name\"\n\t\t\t\t\t\titem-value=\"value\"\n\t\t\t\t\t></v-select>\n\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\n\t\t\t<v-card v-if=\"$root.farmer || $root.local_node\" class=\"my-2\">\n\t\t\t\t<v-card-title>{{ $t('node_settings.reward') }}</v-card-title>\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-text-field\n\t\t\t\t\t\tv-if=\"$root.farmer\"\n\t\t\t\t\t\t:label=\"$t('node_settings.farmer_reward_address')\"\n\t\t\t\t\t\t:placeholder=\"$t('common.reward_address_placeholder')\"\n\t\t\t\t\t\t:value=\"farmer_reward_addr\" @change=\"value => farmer_reward_addr = value\"\t\n\t\t\t\t\t></v-text-field>\n\n\t\t\t\t\t<v-text-field\n\t\t\t\t\t\tv-if=\"$root.local_node\"\n\t\t\t\t\t\t:label=\"$t('node_settings.timeLord_reward_address')\"\n\t\t\t\t\t\t:placeholder=\"$t('common.reward_address_placeholder')\"\n\t\t\t\t\t\t:value=\"timelord_reward_addr\" @change=\"value => timelord_reward_addr = value\"\n\t\t\t\t\t></v-text-field>\n\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\t\t\t\n\t\t\t<v-card v-if=\"$root.farmer\" class=\"my-2\">\n\t\t\t\t<v-card-title>{{ $t('harvester_settings.harvester') }}</v-card-title>\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-progress-linear :active=\"loading\" indeterminate absolute top></v-progress-linear>\n\t\t\t\t\t\n\t\t\t\t\t<v-text-field\n\t\t\t\t\t\tlabel=\"Num. Threads (for lookups, reload)\"\n\t\t\t\t\t\t:value=\"harv_num_threads\" @change=\"value => harv_num_threads = parseInt(value)\"\n\t\t\t\t\t></v-text-field>\n\t\t\t\t\t\n\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t:label=\"$t('harvester_settings.harvester_reload_interval')\"\n\t\t\t\t\t\t:value=\"reload_interval\" @change=\"value => reload_interval = parseInt(value)\"\n\t\t\t\t\t></v-text-field>\n\t\t\t\t\t\n\t\t\t\t\t<v-checkbox\n\t\t\t\t\t\tv-model=\"recursive_search\"\n\t\t\t\t\t\tlabel=\"Recursive Search\"\n\t\t\t\t\t\tclass=\"my-0\"\n\t\t\t\t\t></v-checkbox>\n\t\t\t\t\t\n\t\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t<th>{{ $t('harvester_settings.plot_directory') }}</th>\n\t\t\t\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t<tr v-for=\"item in plot_dirs\" :key=\"item\">\n\t\t\t\t\t\t\t\t\t<td>{{item}}</td>\n\t\t\t\t\t\t\t\t\t<td><v-btn outlined text @click=\"rem_plot_dir(item)\">Remove</v-btn></td>\n\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</v-simple-table>\n\t\t\t\t\t</v-card>\n\t\t\t\t\t\n\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t:label=\"$t('harvester_settings.plot_directory')\"\n\t\t\t\t\t\tv-model=\"new_plot_dir\"\n\t\t\t\t\t></v-text-field>\n\t\t\t\t\t<v-btn @click=\"add_plot_dir(new_plot_dir)\" outlined color=\"primary\">{{ $t('harvester_settings.add_directory') }}</v-btn>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\n\t\t\t<v-card v-if=\"$root.farmer || $root.local_node\" class=\"my-2\">\n\t\t\t\t<v-card-title>CUDA</v-card-title>\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-checkbox\n\t\t\t\t\t\tv-model=\"cuda_enable\"\n\t\t\t\t\t\tlabel=\"Enable CUDA compute (farming and proof verify)\"\n\t\t\t\t\t\tclass=\"my-0\"\n\t\t\t\t\t></v-checkbox>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\n\t\t\t<v-card v-if=\"$root.local_node\" class=\"my-2\">\n\t\t\t\t<v-card-title>{{ $t('node_settings.blockchain') }}</v-card-title>\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t:label=\"$t('node_settings.revert_db_to_height')\"\n\t\t\t\t\t\tv-model=\"revert_height\"\n\t\t\t\t\t></v-text-field>\n\t\t\t\t\t<v-btn @click=\"revert_sync(revert_height)\" outlined color=\"error\">{{ $t('node_settings.revert') }}</v-btn>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\t\t\t\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"success\"\n\t\t\t\tv-if=\"result\"\n\t\t\t\televation=\"2\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\tSet <b>{{result.key}}</b> to\n\t\t\t\t<b><template v-if=\"result.value != null\"> '{{result.value}}' </template><template v-else> null </template></b>\n\t\t\t\t<template v-if=\"result.restart\">{{ $t('node_settings.restart_needed') }}</template>\n\t\t\t</v-alert>\t\n\t\t\t\t\t\t\t\t\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\tv-if=\"error\"\n\t\t\t\televation=\"2\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\t\t</div>\t\n\t\t`\n})\n\nVue.component('wallet-settings', {\n\tdata() {\n\t\treturn {\n\t\t\terror: null,\n\t\t\tresult: null,\n\t\t\tloading: true,\n\t\t\ttokens: [],\n\t\t\tnew_token_addr: null\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/tokens')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {this.tokens = data; this.loading = false;});\n\t\t},\n\t\tadd_token(address) {\n\t\t\tfetch('/api/wallet/add_token?address=' + address)\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\tthis.result = \"Added token to whitelist: \" + address;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\tthis.error = data;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\trem_token(address) {\n\t\t\tfetch('/api/wallet/rem_token?address=' + address)\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t\tthis.result = \"Removed token from whitelist: \" + address;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\tthis.error = data;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\twatch: {\n\t\tresult(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.error = null;\n\t\t\t}\n\t\t},\n\t\terror(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.result = null;\n\t\t\t}\n\t\t}\n\t},\n\t// TODO: i18n\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card class=\"my-2\">\n\t\t\t\t<v-card-title>{{ $t('wallet_settings.token_whitelist') }}</v-card-title>\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-progress-linear :active=\"loading\" indeterminate absolute top></v-progress-linear>\n\t\t\t\t\t\n\t\t\t\t\t<v-card class=\"my-2\">\n\t\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th>{{ $t('wallet_settings.name') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('wallet_settings.symbol') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('wallet_settings.contract') }}</th>\n\t\t\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<template v-for=\"item in tokens\" :key=\"item.currency\">\n\t\t\t\t\t\t\t\t<template v-if=\"!item.is_native\">\n\t\t\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t\t\t<td>{{item.name}}</td>\n\t\t\t\t\t\t\t\t\t\t<td>{{item.symbol}}</td>\n\t\t\t\t\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.currency\">{{item.currency}}</router-link></td>\n\t\t\t\t\t\t\t\t\t\t<td><v-btn outlined text @click=\"rem_token(item.currency)\">{{ $t('common.remove') }}</v-btn></td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</v-simple-table>\n\t\t\t\t\t</v-card>\n\t\t\t\t\t\n\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t:label=\"$t('wallet_settings.token_address')\"\n\t\t\t\t\t\tv-model=\"new_token_addr\" \n\t\t\t\t\t\tplaceholder=\"mmx1...\"\n\t\t\t\t\t></v-text-field>\n\t\t\t\t\t<v-btn @click=\"add_token(new_token_addr)\" outlined color=\"primary\">{{ $t('wallet_settings.add_token') }}</v-btn>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\t\t\t\t\t\t\t\t\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"success\"\n\t\t\t\tv-if=\"result\"\n\t\t\t\televation=\"2\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t<b>{{result}}</b>\n\t\t\t</v-alert>\n\t\t\t\t\t\t\t\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\tv-if=\"error\"\n\t\t\t\televation=\"2\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\n\t\t</div>\n\t\t`\n})\n\nVue.component('build-version', {\n\tdata() {\n\t\treturn {\n\t\t\tversion: null,\n\t\t\tcommit: null\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/config/get?key=build')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.version = data.version;\n\t\t\t\t\tthis.commit = data.commit;\n\t\t\t\t});\n\t\t},\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card class=\"my-2\">\n\t\t\t\t<v-card-title>{{ $t('build_version.build') }}</v-card-title>\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>{{ $t('build_version.version') }}</td>\n\t\t\t\t\t\t\t\t<td>{{ this.version }}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td>{{ $t('build_version.commit') }}</td>\n\t\t\t\t\t\t\t\t<td>{{ this.commit }}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\t\t</div>\n\t\t`\n})\n"
  },
  {
    "path": "www/web-gui/public/swap.js",
    "content": "\nVue.component('swap-menu', {\n\tprops: {\n\t\tloading: false\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttokens: [],\n\t\t\ttoken: null,\n\t\t\tcurrency: null\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tthis.loading = true;\n\t\t\tfetch('/wapi/wallet/tokens')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.tokens = data;\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t});\n\t\t},\n\t\tsubmit() {\n\t\t\tthis.$router.push('/swap/market/' + this.token + '/' + this.currency).catch(()=>{});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.submit();\n\t},\n\twatch: {\n\t\ttoken() {\n\t\t\tthis.submit();\n\t\t},\n\t\tcurrency() {\n\t\t\tthis.submit();\n\t\t}\n\t},\n\tcomputed: {\n\t\tselectItems() {\n\t\t\tvar result = [];\n\t\t\t\n\t\t\tresult.push({ text: this.$t('market_menu.anything'), value: null});\n\n\t\t\tthis.tokens.map(item => {\n\t\t\t\tvar text = item.symbol;\n\t\t\t\tif(item.currency != MMX_ADDR) {\n\t\t\t\t\ttext += ` - [${item.currency}]`;\n\t\t\t\t}\n\t\t\t\tresult.push(\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: text,\n\t\t\t\t\t\tvalue: item.currency\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn result;\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-select\n\t\t\t\tv-model=\"token\"\n\t\t\t\t:items=\"selectItems\"\n\t\t\t\t:label=\"$t('common.token')\"\n\t\t\t\titem-text=\"text\"\n\t\t\t\titem-value=\"value\"\n\t\t\t></v-select>\n\n\t\t\t<v-select\n\t\t\t\tv-model=\"currency\"\n\t\t\t\t:items=\"selectItems\"\n\t\t\t\t:label=\"$t('common.currency')\"\n\t\t\t\titem-text=\"text\"\n\t\t\t\titem-value=\"value\"\n\t\t\t></v-select>\n\t\t</div>\n\t\t`\n})\n\nVue.component('swap-list', {\n\tprops: {\n\t\ttoken: null,\n\t\tcurrency: null,\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\toffer: {},\n\t\t\ttokens: null,\n\t\t\ttimer: null,\n\t\t\tloading: false,\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tif(this.tokens) {\n\t\t\t\tthis.loading = true;\n\t\t\t\tlet query = '/wapi/swap/list?limit=' + this.limit;\n\t\t\t\tif(this.token) {\n\t\t\t\t\tquery += '&token=' + this.token;\n\t\t\t\t}\n\t\t\t\tif(this.currency) {\n\t\t\t\t\tquery += '&currency=' + this.currency;\n\t\t\t\t}\n\t\t\t\tfetch(query)\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => {\n\t\t\t\t\t\tthis.loading = false;\n\t\t\t\t\t\tthis.data = data;\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tfetch('/wapi/wallet/tokens')\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => {\n\t\t\t\t\t\tthis.tokens = new Set();\n\t\t\t\t\t\tfor(const token of data) {\n\t\t\t\t\t\t\tthis.tokens.add(token.currency);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n\twatch: {\n\t\ttoken() {\n\t\t\tthis.update();\n\t\t},\n\t\tcurrency() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 60000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card>\n\t\t\t\t<div v-if=\"!data && loading\">\n\t\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\"/>\n\t\t\t\t</div>\n\n\t\t\t\t<template v-if=\"data\">\n\t\t\t\t\t<v-simple-table>\n\t\t\t\t\t\t<thead>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<th>{{ $t('common.name') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('common.token') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('common.currency') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('common.price') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('swap.pool_balance') }}</th>\n\t\t\t\t\t\t\t\t<th>{{ $t('swap.pool_balance') }}</th>\n\t\t\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</thead>\n\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t<tr v-for=\"item in data\" :key=\"item.address\">\n\t\t\t\t\t\t\t\t<td>{{item.name}}</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<template v-if=\"item.symbols[0] == 'MMX'\">MMX</template>\n\t\t\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t\t\t<router-link :to=\"'/explore/address/' + item.tokens[0]\">\n\t\t\t\t\t\t\t\t\t\t\t<template v-if=\"tokens.has(item.tokens[0])\">{{item.symbols[0]}}</template>\n\t\t\t\t\t\t\t\t\t\t\t<template v-else>{{item.symbols[0]}}?</template>\n\t\t\t\t\t\t\t\t\t\t</router-link>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<template v-if=\"item.symbols[1] == 'MMX'\">MMX</template>\n\t\t\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t\t\t<router-link :to=\"'/explore/address/' + item.tokens[1]\">\n\t\t\t\t\t\t\t\t\t\t\t<template v-if=\"tokens.has(item.tokens[1])\">{{item.symbols[1]}}</template>\n\t\t\t\t\t\t\t\t\t\t\t<template v-else>{{item.symbols[1]}}?</template>\n\t\t\t\t\t\t\t\t\t\t</router-link>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td><b>{{ item.price ? parseFloat( (item.price).toPrecision(6) ) : \"N/A\" }}</b>&nbsp; {{item.symbols[1]}} / {{item.symbols[0]}}</td>\n\t\t\t\t\t\t\t\t<td><b>{{ parseFloat( (item.balance[0].value).toPrecision(6) ) }}</b>&nbsp; {{item.symbols[0]}}</td>\n\t\t\t\t\t\t\t\t<td><b>{{ parseFloat( (item.balance[1].value).toPrecision(6) ) }}</b>&nbsp; {{item.symbols[1]}}</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<v-btn :to=\"'/swap/trade/' + item.address\" outlined text>{{ $t('swap.swap') }}</v-btn>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</tbody>\n\t\t\t\t\t</v-simple-table>\n\t\t\t\t</template>\n\t\t\t</v-card>\n\t\t</div>\n\t\t`\n})\n\nVue.component('swap-sub-menu', {\n\tprops: {\n\t\taddress: String\n\t},\n\ttemplate: `\n\t\t<v-tabs>\n\t\t\t<v-tab :to=\"'/swap/trade/' + address\">{{ $t('swap.trade') }}</v-tab>\n\t\t\t<v-tab :to=\"'/swap/history/' + address\">{{ $t('swap.history') }}</v-tab>\n\t\t\t<v-tab :to=\"'/swap/liquid/' + address\">{{ $t('swap.my_liquidity') }}</v-tab>\n\t\t\t<v-tab :to=\"'/swap/pool/' + address\">{{ $t('swap.pool_state') }}</v-tab>\n\t\t</v-tabs>\n\t`\n})\n\nVue.component('swap-info', {\n\tprops: {\n\t\taddress: String\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\ttimer: null,\n\t\t\tloading: true,\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/swap/info?id=' + this.address)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 5000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<template v-if=\"data\">\n\t\t\t\t<v-chip label>{{ $t('swap.swap') }}</v-chip>\n\t\t\t\t<v-chip label>{{data.price ? parseFloat((data.price).toPrecision(6)) : \"N/A\"}}&nbsp; {{data.symbols[1]}} / {{data.symbols[0]}}</v-chip>\n\t\t\t\t<v-chip label>{{data.address}}</v-chip>\n\t\t\t</template>\n\t\t\t\n\t\t\t<v-card class=\"my-2\">\n\t\t\t\t<div v-if=\"!data && loading\">\n\t\t\t\t\t<v-progress-linear indeterminate></v-progress-linear>\n\t\t\t\t\t<v-skeleton-loader type=\"table-row-divider@2\"/>\n\t\t\t\t</div>\n\n\t\t\t\t<v-simple-table v-if=\"data\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th></th>\n\t\t\t\t\t\t\t<th>{{ $t('swap.pool_balance') }}</th>\n\t\t\t\t\t\t\t<th>{{ $t('swap.volume') }} ({{ $t('swap.24h') }})</th>\n\t\t\t\t\t\t\t<th>{{ $t('swap.volume') }} ({{ $t('swap.7d') }})</th>\n\t\t\t\t\t\t\t<th>{{ $t('swap.apy') }} ({{ $t('swap.24h') }})</th>\n\t\t\t\t\t\t\t<th>{{ $t('swap.apy') }} ({{ $t('swap.7d') }})</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<template v-for=\"i in [0, 1]\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td class=\"key-cell\">{{i == 0 ? $t('common.token') : $t('common.currency') }}</td>\n\t\t\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t\t\t<b>{{ parseFloat( (data.balance[i].value).toPrecision(6) ) }}</b>\n\t\t\t\t\t\t\t\t\t<template v-if=\"data.symbols[i] == 'MMX'\">MMX</template>\n\t\t\t\t\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t\t\t\t\t<router-link :to=\"'/explore/address/' + data.tokens[i]\">{{data.symbols[i]}}</router-link>\n\t\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t<td><b>{{parseFloat(data.volume_1d[i].value.toPrecision(6))}}</b> {{data.symbols[i]}}</td>\n\t\t\t\t\t\t\t\t<td><b>{{parseFloat(data.volume_7d[i].value.toPrecision(6))}}</b> {{data.symbols[i]}}</td>\n\t\t\t\t\t\t\t\t<td>{{(data.avg_apy_1d[i] * 100).toFixed(2)}} %</td>\n\t\t\t\t\t\t\t\t<td>{{(data.avg_apy_7d[i] * 100).toFixed(2)}} %</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</tbody>\n\t\t\t\t</v-simple-table>\n\t\t\t</v-card>\n\t\t</div>\n\t`\n})\n\nVue.component('swap-pool-info', {\n\tprops: {\n\t\taddress: String\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\ttimer: null,\n\t\t\tloading: true,\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/swap/info?id=' + this.address)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-card>\n\t\t\t<div v-if=\"!data && loading\">\n\t\t\t\t<v-progress-linear indeterminate></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@10\"/>\n\t\t\t</div>\n\n\t\t\t<v-simple-table v-if=\"data\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th>{{ $t('swap.fee_level') }}</th>\n\t\t\t\t\t\t<th>{{ $t('common.balance') }}</th>\n\t\t\t\t\t\t<th>{{ $t('common.balance') }}</th>\n\t\t\t\t\t\t<th>Price</th>\n\t\t\t\t\t\t<th>{{ $t('swap.user_total') }}</th>\n\t\t\t\t\t\t<th>{{ $t('swap.user_total') }}</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<template v-for=\"(fee_rate, k) in data.fee_rates\">\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td class=\"key-cell\">{{fee_rate * 100}} %</td>\n\t\t\t\t\t\t\t<template v-for=\"i in [0, 1]\">\n\t\t\t\t\t\t\t\t<td><b>{{ parseFloat( (data.pools[k].balance[i].value).toPrecision(6) ) }}</b> {{data.symbols[i]}}</td>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t<td>{{data.pools[k].price != null ? parseFloat((data.pools[k].price).toPrecision(6)) : \"N/A\"}}</td>\n\t\t\t\t\t\t\t<template v-for=\"i in [0, 1]\">\n\t\t\t\t\t\t\t\t<td><b>{{ parseFloat( (data.pools[k].user_total[i].value).toPrecision(6) ) }}</b> {{data.symbols[i]}}</td>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</template>\n\t\t\t\t</tbody>\n\t\t\t</v-simple-table>\n\t\t</v-card>\n\t`\n})\n\nVue.component('swap-user-info', {\n\tprops: {\n\t\taddress: String,\n\t\tuser: String\n\t},\n\temits: [\n\t\t\"user-update\"\n\t],\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\ttimer: null,\n\t\t\tloading: true\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/swap/user_info?id=' + this.address + \"&user=\" + this.user)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.$emit('user-update', data);\n\t\t\t\t});\n\t\t}\n\t},\n\twatch: {\n\t\tuser(value) {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-card>\n\t\t\t<div v-if=\"!data && loading\">\n\t\t\t\t<v-progress-linear indeterminate></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@2\"/>\n\t\t\t</div>\n\n\t\t\t<v-simple-table v-if=\"data\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th>{{ $t('swap.my_balance') }}</th>\n\t\t\t\t\t\t<th>{{ $t('swap.my_liquidity') }}</th>\n\t\t\t\t\t\t<th>{{ $t('swap.fees_earned') }}</th>\n\t\t\t\t\t\t<th>{{ $t('swap.fee_level') }}</th>\n\t\t\t\t\t\t<th>{{ $t('swap.unlock_height') }}</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<template v-for=\"i in [0, 1]\">\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<td><b>{{ parseFloat( (data.balance[i].value).toPrecision(6) ) }}</b> {{data.symbols[i]}}</td>\n\t\t\t\t\t\t\t<td><b>{{ parseFloat( (data.equivalent_liquidity[i].value).toPrecision(6) ) }}</b> {{data.symbols[i]}}</td>\n\t\t\t\t\t\t\t<td><b>{{ parseFloat( (data.fees_earned[i].value).toPrecision(6) ) }}</b> {{data.symbols[i]}}</td>\n\t\t\t\t\t\t\t<td><template v-if=\"data.pool_idx >= 0\">{{(data.swap.fee_rates[data.pool_idx] * 100).toFixed(2)}} %</template></td>\n\t\t\t\t\t\t\t<td>{{data.unlock_height}}</td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</template>\n\t\t\t\t</tbody>\n\t\t\t</v-simple-table>\n\t\t</v-card>\n\t`\n})\n\nVue.component('swap-history', {\n\tprops: {\n\t\taddress: String,\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\tcolor_map: new Map([\n\t\t\t\t[\"BUY\", \"green\"],\n\t\t\t\t[\"SELL\", \"red\"],\n\t\t\t]),\n\t\t\tloading: true,\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('common.height'), value: 'height' },\n\t\t\t\t{ text: this.$t('common.type'), value: 'type' },\n\t\t\t\t{ text: this.$t('common.amount'), value: 'value' },\n\t\t\t\t{ text: this.$t('common.symbol'), value: 'symbol' },\n\t\t\t\t{ text: this.$t('common.user'), value: 'user' },\n\t\t\t\t{ text: this.$t('common.link'), value: 'txid' },\n\t\t\t\t{ text: this.$t('common.time'), value: 'time' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/swap/history?id=' + this.address + '&limit=' + this.limit)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t});\n\t\t},\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-data-table\n\t\t\t\t:headers=\"headers\"\n\t\t\t\t:items=\"data\"\n\t\t\t\t:loading=\"loading\"\n\t\t\t\thide-default-footer\n\t\t\t\tdisable-sort\n\t\t\t\tdisable-pagination\n\t\t\t\tclass=\"elevation-2\"\n\t\t\t>\n\t\t\t\t<template v-slot:progress>\n\t\t\t\t\t<v-progress-linear indeterminate></v-progress-linear>\n\t\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t\t</template>\n\t\t\t\t\n\t\t\t\t<template v-slot:item.type=\"{ item }\">\n\t\t\t\t\t<div :class=\"color_map.get(item.type) + '--text'\">{{item.type}}</div>\n\t\t\t\t</template>\n\t\t\t\t\n\t\t\t\t<template v-slot:item.value=\"{ item }\">\n\t\t\t\t\t<b>{{item.value}}</b>\n\t\t\t\t</template>\n\t\t\t\t\n\t\t\t\t<template v-slot:item.user=\"{ item }\">\n\t\t\t\t\t<router-link :to=\"'/explore/address/' + item.user\">{{get_short_addr(item.user, 20)}}</router-link>\n\t\t\t\t</template>\n\t\t\t\t\n\t\t\t\t<template v-slot:item.txid=\"{ item }\">\n\t\t\t\t\t<router-link :to=\"'/explore/transaction/' + item.txid\">TX</router-link>\n\t\t\t\t</template>\n\t\n\t\t\t\t<template v-slot:item.time=\"{ item }\">\n\t\t\t\t\t{{new Date(item.time * 1000).toLocaleString()}}\n\t\t\t\t</template>\n\t\t\t</v-data-table>\n\t\t</div>\n\t\t`\n})\n\nVue.component('swap-trade', {\n\tprops: {\n\t\taddress: String,\n\t\twallet: null\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tbuy_fee: null,\n\t\t\tbuy_price: null,\n\t\t\tbuy_amount: null,\n\t\t\tbuy_balance: null,\n\t\t\tbuy_estimate: null,\n\t\t\tbuy_num_iter: 5,\n\t\t\tbuy_slippage: 0.98,\n\t\t\tbuy_tx_fee_ratio: null,\n\t\t\tbuy_tx_fee_amount: null,\n\t\t\tsell_fee: null,\n\t\t\tsell_price: null,\n\t\t\tsell_amount: null,\n\t\t\tsell_balance: null,\n\t\t\tsell_estimate: null,\n\t\t\tsell_num_iter: 5,\n\t\t\tsell_slippage: 0.98,\n\t\t\tsell_tx_fee_ratio: null,\n\t\t\tsell_tx_fee_amount: null,\n\t\t\tresult: null,\n\t\t\terror: null,\n\t\t\tnum_iter_items: [1, 5, 20, 100],\n\t\t\tslippage_items: [\n\t\t\t\t{text: \"0.5 %\", value: 0.995},\n\t\t\t\t{text: \"1 %\", value: 0.99},\n\t\t\t\t{text: \"2 %\", value: 0.98},\n\t\t\t\t{text: \"5 %\", value: 0.95},\n\t\t\t\t{text: \"10 %\", value: 0.9},\n\t\t\t],\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/swap/info?id=' + this.address)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.update_wallet();\n\t\t\t\t});\n\t\t},\n\t\tupdate_wallet() {\n\t\t\tfetch('/wapi/wallet/balance?index=' + this.wallet + '&currency=' + this.data.tokens[0])\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.sell_balance = data ? data.spendable : 0);\n\t\t\tfetch('/wapi/wallet/balance?index=' + this.wallet + '&currency=' + this.data.tokens[1])\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.buy_balance = data ? data.spendable : 0);\n\t\t},\n\t\tsubmit(index, amount, min_trade, num_iter, fee_ratio, estimate = false) {\n\t\t\tconst req = {};\n\t\t\treq.wallet = this.wallet;\n\t\t\treq.address = this.address;\n\t\t\treq.index = index;\n\t\t\treq.amount = amount;\n\t\t\treq.min_trade = min_trade;\n\t\t\treq.num_iter = num_iter;\n\t\t\treq.options = {};\n\t\t\tif(fee_ratio) {\n\t\t\t\treq.options.fee_ratio = fee_ratio;\n\t\t\t}\n\t\t\tif(estimate) {\n\t\t\t\treq.options.auto_send = false;\n\t\t\t}\n\t\t\tfetch('/wapi/wallet/swap/trade', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tresponse.json().then(data => {\n\t\t\t\t\t\t\tif(estimate) {\n\t\t\t\t\t\t\t\tif(index == 1) {\n\t\t\t\t\t\t\t\t\tthis.buy_tx_fee_amount = data.exec_result.total_fee_value;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tthis.sell_tx_fee_amount = data.exec_result.total_fee_value;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.result = data;\n\t\t\t\t\t\t\t\tthis.error = null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if(!estimate) {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\tthis.result = null;\n\t\t\t\t\t\t\tthis.error = data;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\tif(!estimate) {\n\t\t\t\tif(index == 1) {\n\t\t\t\t\tthis.buy_amount = null;\n\t\t\t\t} else {\n\t\t\t\t\tthis.sell_amount = null;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tsubmit_buy(estimate = false) {\n\t\t\tthis.submit(1, this.buy_amount, this.buy_estimate * this.buy_slippage, this.buy_num_iter, this.buy_tx_fee_ratio, estimate);\n\t\t},\n\t\tsubmit_sell(estimate = false) {\n\t\t\tthis.submit(0, this.sell_amount, this.sell_estimate * this.sell_slippage, this.sell_num_iter, this.sell_tx_fee_ratio, estimate);\n\t\t},\n\t\tupdate_buy_estimate() {\n\t\t\tthis.buy_fee = null;\n\t\t\tthis.buy_price = null;\n\t\t\tthis.buy_estimate = null;\n\t\t\tif(this.is_valid_buy()) {\n\t\t\t\tfetch('/wapi/swap/trade_estimate?id=' + this.address + '&index=1&amount=' + this.buy_amount + '&iters=' + this.buy_num_iter)\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => {\n\t\t\t\t\t\tthis.buy_fee = data.fee_percent.toFixed(2);\n\t\t\t\t\t\tthis.buy_price = parseFloat((1 / data.avg_price).toPrecision(6));\n\t\t\t\t\t\tthis.buy_estimate = data.trade.value;\n\t\t\t\t\t});\n\t\t\t\tthis.submit_buy(true);\n\t\t\t} else {\n\t\t\t\tthis.buy_tx_fee_amount = null;\n\t\t\t}\n\t\t},\n\t\tupdate_sell_estimate() {\n\t\t\tthis.sell_fee = null;\n\t\t\tthis.sell_price = null;\n\t\t\tthis.sell_estimate = null;\n\t\t\tif(this.is_valid_sell()) {\n\t\t\t\tfetch('/wapi/swap/trade_estimate?id=' + this.address + '&index=0&amount=' + this.sell_amount + '&iters=' + this.sell_num_iter)\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => {\n\t\t\t\t\t\tthis.sell_fee = data.fee_percent.toFixed(2);\n\t\t\t\t\t\tthis.sell_price = parseFloat(data.avg_price.toPrecision(6));\n\t\t\t\t\t\tthis.sell_estimate = data.trade.value;\n\t\t\t\t\t});\n\t\t\t\tthis.submit_sell(true);\n\t\t\t} else {\n\t\t\t\tthis.sell_tx_fee_amount = null;\n\t\t\t}\n\t\t},\n\t\tis_valid_buy_amount(value) {\n\t\t\treturn value < this.buy_balance ? true : \"insufficient funds\";\n\t\t},\n\t\tis_valid_sell_amount(value) {\n\t\t\treturn value < this.sell_balance ? true : \"insufficient funds\";\n\t\t},\n\t\tis_valid_buy() {\n\t\t\treturn this.buy_amount > 0 && this.buy_amount <= this.buy_balance;\n\t\t},\n\t\tis_valid_sell() {\n\t\t\treturn this.sell_amount > 0 && this.sell_amount <= this.sell_balance;\n\t\t}\n\t},\n\twatch: {\n\t\twallet() {\n\t\t\tif(this.data) {\n\t\t\t\tthis.update_wallet();\n\t\t\t}\n\t\t},\n\t\tbuy_amount() {\n\t\t\tthis.update_buy_estimate();\n\t\t},\n\t\tbuy_num_iter() {\n\t\t\tthis.update_buy_estimate();\n\t\t},\n\t\tbuy_tx_fee_ratio() {\n\t\t\tthis.update_buy_estimate();\n\t\t},\n\t\tsell_amount() {\n\t\t\tthis.update_sell_estimate();\n\t\t},\n\t\tsell_num_iter() {\n\t\t\tthis.update_sell_estimate();\n\t\t},\n\t\tsell_tx_fee_ratio() {\n\t\t\tthis.update_sell_estimate();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 30000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-row v-if=\"data\">\n\t\t\t\t<v-col>\n\t\t\t\t\t<v-card>\n\t\t\t\t\t\t<v-toolbar color=\"green lighten-1\" elevation=\"1\" dense></v-toolbar>\n\t\t\t\t\t\t<v-card-text>\n\t\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t\t<v-col class=\"pb-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"buy_balance\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('swap.wallet_ballance')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"data.symbols[1]\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"pb-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"buy_amount\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('swap.buy_amount')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"data.symbols[1]\"\n\t\t\t\t\t\t\t\t\t\t:rules=\"[is_valid_buy_amount]\">\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"buy_fee\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('swap.trade_fee_estimated')\"\n\t\t\t\t\t\t\t\t\t\tsuffix=\"%\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"buy_estimate\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('swap.you_receive_estimated')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"data.symbols[0]\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t\t<v-col cols=\"3\" class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-select\n\t\t\t\t\t\t\t\t\t\tv-model=\"buy_num_iter\"\n\t\t\t\t\t\t\t\t\t\t:items=\"num_iter_items\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"Iterations\"\n\t\t\t\t\t\t\t\t\t></v-select>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"buy_price\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"Trade Price (average, including fee)\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"data.symbols[1] + ' / ' + data.symbols[0]\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t\t<v-col cols=\"3\" class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-select\n\t\t\t\t\t\t\t\t\t\tv-model=\"buy_slippage\"\n\t\t\t\t\t\t\t\t\t\t:items=\"slippage_items\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"Max Slippage\"\n\t\t\t\t\t\t\t\t\t></v-select>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => this.buy_tx_fee_ratio = value\"></tx-fee-select>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"TX Fee\"\n\t\t\t\t\t\t\t\t\t\tv-model.number=\"buy_tx_fee_amount\" suffix=\"MMX\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t</v-card-text>\n\t\t\t\t\t\t<v-card-actions class=\"justify-end\">\n\t\t\t\t\t\t\t<v-btn @click=\"update_buy_estimate()\" :disabled=\"!(buy_amount > 0)\">Update</v-btn>\n\t\t\t\t\t\t\t<v-btn color=\"green lighten-1\" @click=\"submit_buy()\" :disabled=\"!is_valid_buy() || !(buy_estimate > 0)\">{{ $t('swap.buy') }}</v-btn>\n\t\t\t\t\t\t</v-card-actions>\n\t\t\t\t\t</v-card>\n\t\t\t\t</v-col>\n\t\t\t\t<v-col>\n\t\t\t\t\t<v-card>\n\t\t\t\t\t\t<v-toolbar color=\"red lighten-1\" elevation=\"1\" dense></v-toolbar>\n\t\t\t\t\t\t<v-card-text>\n\t\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t\t<v-col class=\"pb-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"sell_balance\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('swap.wallet_ballance')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"data.symbols[0]\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"pb-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"sell_amount\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('swap.sell_amount')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"data.symbols[0]\"\n\t\t\t\t\t\t\t\t\t\t:rules=\"[is_valid_sell_amount]\">\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"sell_fee\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('swap.trade_fee_estimated')\"\n\t\t\t\t\t\t\t\t\t\tsuffix=\"%\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"sell_estimate\"\n\t\t\t\t\t\t\t\t\t\t:label=\"$t('swap.you_receive_estimated')\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"data.symbols[1]\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t\t<v-col cols=\"3\" class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-select\n\t\t\t\t\t\t\t\t\t\tv-model=\"sell_num_iter\"\n\t\t\t\t\t\t\t\t\t\t:items=\"num_iter_items\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"Iterations\"\n\t\t\t\t\t\t\t\t\t></v-select>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tv-model=\"sell_price\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"Trade Price (average, including fee)\"\n\t\t\t\t\t\t\t\t\t\t:suffix=\"data.symbols[1] + ' / ' + data.symbols[0]\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t\t<v-row>\n\t\t\t\t\t\t\t\t<v-col cols=\"3\" class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-select\n\t\t\t\t\t\t\t\t\t\tv-model=\"sell_slippage\"\n\t\t\t\t\t\t\t\t\t\t:items=\"slippage_items\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"Max Slippage\"\n\t\t\t\t\t\t\t\t\t></v-select>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => this.sell_tx_fee_ratio = value\"></tx-fee-select>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\t\tlabel=\"TX Fee\"\n\t\t\t\t\t\t\t\t\t\tv-model.number=\"sell_tx_fee_amount\" suffix=\"MMX\" disabled>\n\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t</v-row>\n\t\t\t\t\t\t</v-card-text>\n\t\t\t\t\t\t<v-card-actions class=\"justify-end\">\n\t\t\t\t\t\t\t<v-btn @click=\"update_sell_estimate()\" :disabled=\"!(sell_amount > 0)\">Update</v-btn>\n\t\t\t\t\t\t\t<v-btn color=\"red lighten-1\" @click=\"submit_sell()\" :disabled=\"!is_valid_sell() || !(sell_estimate > 0)\">{{ $t('swap.sell') }}</v-btn>\n\t\t\t\t\t\t</v-card-actions>\n\t\t\t\t\t</v-card>\n\t\t\t\t</v-col>\n\t\t\t</v-row>\n\t\t\t\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"success\"\n\t\t\t\televation=\"2\"\n\t\t\t\tv-if=\"result\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.transaction_has_been_sent') }}: <router-link :to=\"'/explore/transaction/' + result.id\">{{result.id}}</router-link>\n\t\t\t</v-alert>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\televation=\"2\"\n\t\t\t\tv-if=\"error\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\t\t</div>\n\t`\n})\n\nVue.component('swap-liquid', {\n\tprops: {\n\t\taddress: String,\n\t\twallet: null\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tpaid: false,\n\t\t\tuser: null,\n\t\t\tuser_address: null,\n\t\t\tpool_idx: -1,\n\t\t\tamount_0: null,\n\t\t\tamount_1: null,\n\t\t\tbalance_0: null,\n\t\t\tbalance_1: null,\n\t\t\tfee_ratio: 1024,\n\t\t\tprice: null,\n\t\t\tresult: null,\n\t\t\terror: null,\n\t\t\tloading: true,\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tif(this.wallet != null) {\n\t\t\t\tthis.update_user();\n\t\t\t}\n\t\t\tfetch('/wapi/swap/info?id=' + this.address)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.update_wallet();\n\t\t\t\t});\n\t\t},\n\t\tupdate_wallet() {\n\t\t\tif(!this.data) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfetch('/wapi/wallet/balance?index=' + this.wallet + '&currency=' + this.data.tokens[0])\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.balance_0 = data ? data.spendable : 0);\n\t\t\tfetch('/wapi/wallet/balance?index=' + this.wallet + '&currency=' + this.data.tokens[1])\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.balance_1 = data ? data.spendable : 0);\n\t\t},\n\t\tupdate_user() {\n\t\t\tfetch('/wapi/wallet/address?index=' + this.wallet)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.user_address = data);\n\t\t\tthis.update_wallet();\n\t\t},\n\t\tupdate_price() {\n\t\t\tif(this.amount_0 && this.amount_1) {\n\t\t\t\tthis.price = (this.amount_1 / this.amount_0).toPrecision(6);\n\t\t\t} else {\n\t\t\t\tthis.price = null;\n\t\t\t}\n\t\t},\n\t\tmatch() {\n\t\t\tif(this.amount_0 && !this.amount_1) {\n\t\t\t\tthis.amount_1 = parseFloat((this.amount_0 * this.data.price).toFixed(this.data.decimals[1]));\n\t\t\t} else if(!this.amount_0 && this.amount_1) {\n\t\t\t\tthis.amount_0 = parseFloat((this.amount_1 / this.data.price).toFixed(this.data.decimals[0]));\n\t\t\t}\n\t\t},\n\t\ton_response(response, type) {\n\t\t\tif(response.ok) {\n\t\t\t\tresponse.json().then(data => {\n\t\t\t\t\tthis.result = data;\n\t\t\t\t\tthis.error = null;\n\t\t\t\t\tif(type == \"payout\") {\n\t\t\t\t\t\tthis.paid = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\tthis.result = null;\n\t\t\t\t\tthis.error = data;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tsubmit(mode) {\n\t\t\tconst req = {options: {}};\n\t\t\treq.index = this.wallet;\n\t\t\treq.address = this.address;\n\t\t\treq.pool_idx = this.pool_idx;\n\t\t\treq.amount = [this.amount_0, this.amount_1];\n\t\t\treq.options.fee_ratio = this.fee_ratio;\n\t\t\tfetch('/wapi/wallet/swap/' + (mode ? \"add\" : \"rem\") + \"_liquid\", {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => this.on_response(response));\n\t\t\tthis.amount_0 = null;\n\t\t\tthis.amount_1 = null;\n\t\t},\n\t\tpayout() {\n\t\t\tconst req = {options: {}};\n\t\t\treq.index = this.wallet;\n\t\t\treq.address = this.address;\n\t\t\treq.options.fee_ratio = this.fee_ratio;\n\t\t\tfetch('/wapi/wallet/swap/payout', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => this.on_response(response, \"payout\"));\n\t\t},\n\t\tswitch_pool() {\n\t\t\tconst req = {options: {}};\n\t\t\treq.index = this.wallet;\n\t\t\treq.address = this.address;\n\t\t\treq.pool_idx = this.pool_idx;\n\t\t\treq.options.fee_ratio = this.fee_ratio;\n\t\t\tfetch('/wapi/wallet/swap/switch_pool', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => this.on_response(response, \"switch_pool\"));\n\t\t},\n\t\trem_all_liquid() {\n\t\t\tconst req = {options: {}};\n\t\t\treq.index = this.wallet;\n\t\t\treq.address = this.address;\n\t\t\treq.options.fee_ratio = this.fee_ratio;\n\t\t\tfetch('/wapi/wallet/swap/rem_all_liquid', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => this.on_response(response, \"rem_all_liquid\"));\n\t\t}\n\t},\n\twatch: {\n\t\tdata(value) {\n\t\t\tvar fee_rates = [];\n\t\t\tfor(let i = 0; i < value.fee_rates.length; ++i) {\n\t\t\t\tfee_rates.push({text: (value.fee_rates[i] * 100).toFixed(2) + \" %\", value: i});\n\t\t\t}\n\t\t\tthis.fee_rates = fee_rates;\n\t\t},\n\t\tuser(value) {\n\t\t\tif(value && this.pool_idx < 0 && value.pool_idx >= 0) {\n\t\t\t\tthis.pool_idx = value.pool_idx;\n\t\t\t}\n\t\t},\n\t\twallet() {\n\t\t\tthis.paid = false;\n\t\t\tthis.pool_idx = -1;\n\t\t\tthis.update_user();\n\t\t},\n\t\tamount_0() {\n\t\t\tthis.update_price();\n\t\t},\n\t\tamount_1() {\n\t\t\tthis.update_price();\n\t\t}\n\t},\n\tcomputed: {\n\t\tdisable_add_rem() {\n\t\t\treturn !(this.amount_0 || this.amount_1) || this.pool_idx < 0;\n\t\t},\n\t\tdisable_add() {\n\t\t\treturn (this.user.pool_idx >= 0 && this.pool_idx != this.user.pool_idx\n\t\t\t\t\t&& (this.user.balance[0].amount != 0 || this.user.balance[1].amount != 0));\n\t\t},\n\t\tdisable_payout() {\n\t\t\treturn !this.user || this.paid || !(this.user.fees_earned[0].amount != 0 || this.user.fees_earned[1].amount != 0);\n\t\t},\n\t\tdisable_switch() {\n\t\t\treturn this.pool_idx < 0 || this.user.pool_idx < 0 || this.pool_idx == this.user.pool_idx\n\t\t\t\t|| (this.user && this.user.balance[0].amount == 0 && this.user.balance[1].amount == 0);\n\t\t},\n\t\tdisable_rem_all() {\n\t\t\treturn this.amount_0 || this.amount_1 || !this.user || !(this.user.balance[0].amount != 0 || this.user.balance[1].amount != 0);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 30000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<div v-if=\"!data && loading\">\n\t\t\t\t<v-progress-linear indeterminate></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@2\"/>\n\t\t\t</div>\n\t\t\t\n\t\t\t<swap-user-info v-if=\"user_address\" :address=\"address\" :user=\"user_address\" @user-update=\"arg => this.user = arg\"></swap-user-info>\n\t\t\t\n\t\t\t<v-card v-if=\"data\" class=\"my-2\">\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-row justify=\"end\">\n\t\t\t\t\t\t<v-col cols=\"2\" class=\"pb-0\">\n\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => this.fee_ratio = value\"></tx-fee-select>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col cols=\"3\" class=\"pb-0\">\n\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\tv-model=\"balance_0\"\n\t\t\t\t\t\t\t\t:label=\"$t('swap.wallet_ballance')\"\n\t\t\t\t\t\t\t\t:suffix=\"data.symbols[0]\" disabled>\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col cols=\"3\" class=\"pb-0\">\n\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\tv-model=\"balance_1\"\n\t\t\t\t\t\t\t\t:label=\"$t('swap.wallet_ballance')\"\n\t\t\t\t\t\t\t\t:suffix=\"data.symbols[1]\" disabled>\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t\t<v-row justify=\"end\">\n\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t<v-select\n\t\t\t\t\t\t\t\tv-model=\"pool_idx\"\n\t\t\t\t\t\t\t\t:items=\"fee_rates\"\n\t\t\t\t\t\t\t\t:label=\"$t('swap.fee_level')\"\n\t\t\t\t\t\t\t\titem-text=\"text\"\n\t\t\t\t\t\t\t\titem-value=\"value\"\n\t\t\t\t\t\t\t></v-select>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\tv-model=\"price\"\n\t\t\t\t\t\t\t\t:label=\"$t('common.price')\"\n\t\t\t\t\t\t\t\t:suffix=\"data.symbols[1] + ' / ' + data.symbols[0]\"\n\t\t\t\t\t\t\t\tdisabled>\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\tv-model=\"amount_0\"\n\t\t\t\t\t\t\t\t:label=\"$t('swap.token_amount')\"\n\t\t\t\t\t\t\t\t:suffix=\"data.symbols[0]\">\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\tv-model=\"amount_1\"\n\t\t\t\t\t\t\t\t:label=\"$t('swap.currency_amount')\"\n\t\t\t\t\t\t\t\t:suffix=\"data.symbols[1]\">\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t</v-card-text>\n\t\t\t\t<v-card-actions class=\"justify-end\">\n\t\t\t\t\t<v-btn @click=\"payout()\" :disabled=\"disable_payout\">{{ $t('swap.payout') }}</v-btn>\n\t\t\t\t\t<v-btn @click=\"switch_pool()\" :disabled=\"disable_switch\">{{ $t('swap.switch_fee') }}</v-btn>\n\t\t\t\t\t<v-btn @click=\"match()\">{{ $t('swap.price_match') }}</v-btn>\n\t\t\t\t\t<v-btn color=\"green lighten-1\" @click=\"submit(true)\" :disabled=\"disable_add_rem || disable_add\">{{ $t('swap.add_liquidity') }}</v-btn>\n\t\t\t\t\t<v-btn color=\"red lighten-1\" @click=\"submit(false)\" :disabled=\"disable_add_rem\">{{ $t('swap.remove_iquidity') }}</v-btn>\n\t\t\t\t\t<v-btn color=\"red lighten-1\" @click=\"rem_all_liquid()\" :disabled=\"disable_rem_all\">{{ $t('swap.remove_all') }}</v-btn>\n\t\t\t\t</v-card-actions>\n\t\t\t</v-card>\n\t\t\t\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"success\"\n\t\t\t\televation=\"2\"\n\t\t\t\tv-if=\"result\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.transaction_has_been_sent') }}: <router-link :to=\"'/explore/transaction/' + result.id\">{{result.id}}</router-link>\n\t\t\t</v-alert>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\televation=\"2\"\n\t\t\t\tv-if=\"error\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\t\t</div>\n\t`\n})\n"
  },
  {
    "path": "www/web-gui/public/vue-plotly.js",
    "content": "\nconst eventsName = [\n  \"AfterExport\",\n  \"AfterPlot\",\n  \"Animated\",\n  \"AnimatingFrame\",\n  \"AnimationInterrupted\",\n  \"AutoSize\",\n  \"BeforeExport\",\n  \"ButtonClicked\",\n  \"Click\",\n  \"ClickAnnotation\",\n  \"Deselect\",\n  \"DoubleClick\",\n  \"Framework\",\n  \"Hover\",\n  \"LegendClick\",\n  \"LegendDoubleClick\",\n  \"Relayout\",\n  \"Restyle\",\n  \"Redraw\",\n  \"Selected\",\n  \"Selecting\",\n  \"SliderChange\",\n  \"SliderEnd\",\n  \"SliderStart\",\n  \"Transitioning\",\n  \"TransitionInterrupted\",\n  \"Unhover\"\n];\n\nconst eventsP = eventsName\n  .map(evt => evt.toLocaleLowerCase())\n  .map(eventName => ({\n    completeName: \"plotly_\" + eventName,\n    handler: context => (...args) => {\n      context.$emit.apply(context, [eventName, ...args]);\n    }\n  }));\n\nconst plotlyFunctions = [\"restyle\", \"relayout\", \"update\", \"addTraces\", \"deleteTraces\", \"moveTraces\", \"extendTraces\", \"prependTraces\", \"purge\"];\n\nconst methods = plotlyFunctions.reduce((all, functionName) => {\n  all[functionName] = function(...args) {\n    return Plotly[functionName].apply(Plotly, [this.$el, ...args]);\n  };\n  return all;\n}, {});\n\nfunction cached(fn) {\n  const cache = Object.create(null);\n  return function cachedFn(str) {\n    const hit = cache[str];\n    return hit || (cache[str] = fn(str));\n  };\n}\n\nconst regex = /-(\\w)/g;\nconst camelizeP = cached(str => str.replace(regex, (_, c) => (c ? c.toUpperCase() : \"\")));\n\nconst darkTemplate = {\n  \"data\": {\n      \"barpolar\": [\n          {\n              \"marker\": {\n                  \"line\": {\n                      \"color\": \"rgb(30,30,30)\",\n                      \"width\": 0.5\n                  },\n                  \"pattern\": {\n                      \"fillmode\": \"overlay\",\n                      \"size\": 10,\n                      \"solidity\": 0.2\n                  }\n              },\n              \"type\": \"barpolar\"\n          }\n      ],\n      \"bar\": [\n          {\n              \"error_x\": {\n                  \"color\": \"#f2f5fa\"\n              },\n              \"error_y\": {\n                  \"color\": \"#f2f5fa\"\n              },\n              \"marker\": {\n                  \"line\": {\n                      \"color\": \"rgb(30,30,30)\",\n                      \"width\": 0.5\n                  },\n                  \"pattern\": {\n                      \"fillmode\": \"overlay\",\n                      \"size\": 10,\n                      \"solidity\": 0.2\n                  }\n              },\n              \"type\": \"bar\"\n          }\n      ],\n      \"carpet\": [\n          {\n              \"aaxis\": {\n                  \"endlinecolor\": \"#A2B1C6\",\n                  \"gridcolor\": \"#506784\",\n                  \"linecolor\": \"#506784\",\n                  \"minorgridcolor\": \"#506784\",\n                  \"startlinecolor\": \"#A2B1C6\"\n              },\n              \"baxis\": {\n                  \"endlinecolor\": \"#A2B1C6\",\n                  \"gridcolor\": \"#506784\",\n                  \"linecolor\": \"#506784\",\n                  \"minorgridcolor\": \"#506784\",\n                  \"startlinecolor\": \"#A2B1C6\"\n              },\n              \"type\": \"carpet\"\n          }\n      ],\n      \"choropleth\": [\n          {\n              \"colorbar\": {\n                  \"outlinewidth\": 0,\n                  \"ticks\": \"\"\n              },\n              \"type\": \"choropleth\"\n          }\n      ],\n      \"contourcarpet\": [\n          {\n              \"colorbar\": {\n                  \"outlinewidth\": 0,\n                  \"ticks\": \"\"\n              },\n              \"type\": \"contourcarpet\"\n          }\n      ],\n      \"contour\": [\n          {\n              \"colorbar\": {\n                  \"outlinewidth\": 0,\n                  \"ticks\": \"\"\n              },\n              \"colorscale\": [\n                  [\n                      0.0,\n                      \"#0d0887\"\n                  ],\n                  [\n                      0.1111111111111111,\n                      \"#46039f\"\n                  ],\n                  [\n                      0.2222222222222222,\n                      \"#7201a8\"\n                  ],\n                  [\n                      0.3333333333333333,\n                      \"#9c179e\"\n                  ],\n                  [\n                      0.4444444444444444,\n                      \"#bd3786\"\n                  ],\n                  [\n                      0.5555555555555556,\n                      \"#d8576b\"\n                  ],\n                  [\n                      0.6666666666666666,\n                      \"#ed7953\"\n                  ],\n                  [\n                      0.7777777777777778,\n                      \"#fb9f3a\"\n                  ],\n                  [\n                      0.8888888888888888,\n                      \"#fdca26\"\n                  ],\n                  [\n                      1.0,\n                      \"#f0f921\"\n                  ]\n              ],\n              \"type\": \"contour\"\n          }\n      ],\n      \"heatmapgl\": [\n          {\n              \"colorbar\": {\n                  \"outlinewidth\": 0,\n                  \"ticks\": \"\"\n              },\n              \"colorscale\": [\n                  [\n                      0.0,\n                      \"#0d0887\"\n                  ],\n                  [\n                      0.1111111111111111,\n                      \"#46039f\"\n                  ],\n                  [\n                      0.2222222222222222,\n                      \"#7201a8\"\n                  ],\n                  [\n                      0.3333333333333333,\n                      \"#9c179e\"\n                  ],\n                  [\n                      0.4444444444444444,\n                      \"#bd3786\"\n                  ],\n                  [\n                      0.5555555555555556,\n                      \"#d8576b\"\n                  ],\n                  [\n                      0.6666666666666666,\n                      \"#ed7953\"\n                  ],\n                  [\n                      0.7777777777777778,\n                      \"#fb9f3a\"\n                  ],\n                  [\n                      0.8888888888888888,\n                      \"#fdca26\"\n                  ],\n                  [\n                      1.0,\n                      \"#f0f921\"\n                  ]\n              ],\n              \"type\": \"heatmapgl\"\n          }\n      ],\n      \"heatmap\": [\n          {\n              \"colorbar\": {\n                  \"outlinewidth\": 0,\n                  \"ticks\": \"\"\n              },\n              \"colorscale\": [\n                  [\n                      0.0,\n                      \"#0d0887\"\n                  ],\n                  [\n                      0.1111111111111111,\n                      \"#46039f\"\n                  ],\n                  [\n                      0.2222222222222222,\n                      \"#7201a8\"\n                  ],\n                  [\n                      0.3333333333333333,\n                      \"#9c179e\"\n                  ],\n                  [\n                      0.4444444444444444,\n                      \"#bd3786\"\n                  ],\n                  [\n                      0.5555555555555556,\n                      \"#d8576b\"\n                  ],\n                  [\n                      0.6666666666666666,\n                      \"#ed7953\"\n                  ],\n                  [\n                      0.7777777777777778,\n                      \"#fb9f3a\"\n                  ],\n                  [\n                      0.8888888888888888,\n                      \"#fdca26\"\n                  ],\n                  [\n                      1.0,\n                      \"#f0f921\"\n                  ]\n              ],\n              \"type\": \"heatmap\"\n          }\n      ],\n      \"histogram2dcontour\": [\n          {\n              \"colorbar\": {\n                  \"outlinewidth\": 0,\n                  \"ticks\": \"\"\n              },\n              \"colorscale\": [\n                  [\n                      0.0,\n                      \"#0d0887\"\n                  ],\n                  [\n                      0.1111111111111111,\n                      \"#46039f\"\n                  ],\n                  [\n                      0.2222222222222222,\n                      \"#7201a8\"\n                  ],\n                  [\n                      0.3333333333333333,\n                      \"#9c179e\"\n                  ],\n                  [\n                      0.4444444444444444,\n                      \"#bd3786\"\n                  ],\n                  [\n                      0.5555555555555556,\n                      \"#d8576b\"\n                  ],\n                  [\n                      0.6666666666666666,\n                      \"#ed7953\"\n                  ],\n                  [\n                      0.7777777777777778,\n                      \"#fb9f3a\"\n                  ],\n                  [\n                      0.8888888888888888,\n                      \"#fdca26\"\n                  ],\n                  [\n                      1.0,\n                      \"#f0f921\"\n                  ]\n              ],\n              \"type\": \"histogram2dcontour\"\n          }\n      ],\n      \"histogram2d\": [\n          {\n              \"colorbar\": {\n                  \"outlinewidth\": 0,\n                  \"ticks\": \"\"\n              },\n              \"colorscale\": [\n                  [\n                      0.0,\n                      \"#0d0887\"\n                  ],\n                  [\n                      0.1111111111111111,\n                      \"#46039f\"\n                  ],\n                  [\n                      0.2222222222222222,\n                      \"#7201a8\"\n                  ],\n                  [\n                      0.3333333333333333,\n                      \"#9c179e\"\n                  ],\n                  [\n                      0.4444444444444444,\n                      \"#bd3786\"\n                  ],\n                  [\n                      0.5555555555555556,\n                      \"#d8576b\"\n                  ],\n                  [\n                      0.6666666666666666,\n                      \"#ed7953\"\n                  ],\n                  [\n                      0.7777777777777778,\n                      \"#fb9f3a\"\n                  ],\n                  [\n                      0.8888888888888888,\n                      \"#fdca26\"\n                  ],\n                  [\n                      1.0,\n                      \"#f0f921\"\n                  ]\n              ],\n              \"type\": \"histogram2d\"\n          }\n      ],\n      \"histogram\": [\n          {\n              \"marker\": {\n                  \"pattern\": {\n                      \"fillmode\": \"overlay\",\n                      \"size\": 10,\n                      \"solidity\": 0.2\n                  }\n              },\n              \"type\": \"histogram\"\n          }\n      ],\n      \"mesh3d\": [\n          {\n              \"colorbar\": {\n                  \"outlinewidth\": 0,\n                  \"ticks\": \"\"\n              },\n              \"type\": \"mesh3d\"\n          }\n      ],\n      \"parcoords\": [\n          {\n              \"line\": {\n                  \"colorbar\": {\n                      \"outlinewidth\": 0,\n                      \"ticks\": \"\"\n                  }\n              },\n              \"type\": \"parcoords\"\n          }\n      ],\n      \"pie\": [\n          {\n              \"automargin\": true,\n              \"type\": \"pie\"\n          }\n      ],\n      \"scatter3d\": [\n          {\n              \"line\": {\n                  \"colorbar\": {\n                      \"outlinewidth\": 0,\n                      \"ticks\": \"\"\n                  }\n              },\n              \"marker\": {\n                  \"colorbar\": {\n                      \"outlinewidth\": 0,\n                      \"ticks\": \"\"\n                  }\n              },\n              \"type\": \"scatter3d\"\n          }\n      ],\n      \"scattercarpet\": [\n          {\n              \"marker\": {\n                  \"colorbar\": {\n                      \"outlinewidth\": 0,\n                      \"ticks\": \"\"\n                  }\n              },\n              \"type\": \"scattercarpet\"\n          }\n      ],\n      \"scattergeo\": [\n          {\n              \"marker\": {\n                  \"colorbar\": {\n                      \"outlinewidth\": 0,\n                      \"ticks\": \"\"\n                  }\n              },\n              \"type\": \"scattergeo\"\n          }\n      ],\n      \"scattergl\": [\n          {\n              \"marker\": {\n                  \"line\": {\n                      \"color\": \"#283442\"\n                  }\n              },\n              \"type\": \"scattergl\"\n          }\n      ],\n      \"scattermapbox\": [\n          {\n              \"marker\": {\n                  \"colorbar\": {\n                      \"outlinewidth\": 0,\n                      \"ticks\": \"\"\n                  }\n              },\n              \"type\": \"scattermapbox\"\n          }\n      ],\n      \"scatterpolargl\": [\n          {\n              \"marker\": {\n                  \"colorbar\": {\n                      \"outlinewidth\": 0,\n                      \"ticks\": \"\"\n                  }\n              },\n              \"type\": \"scatterpolargl\"\n          }\n      ],\n      \"scatterpolar\": [\n          {\n              \"marker\": {\n                  \"colorbar\": {\n                      \"outlinewidth\": 0,\n                      \"ticks\": \"\"\n                  }\n              },\n              \"type\": \"scatterpolar\"\n          }\n      ],\n      \"scatter\": [\n          {\n              \"marker\": {\n                  \"line\": {\n                      \"color\": \"#283442\"\n                  }\n              },\n              \"type\": \"scatter\"\n          }\n      ],\n      \"scatterternary\": [\n          {\n              \"marker\": {\n                  \"colorbar\": {\n                      \"outlinewidth\": 0,\n                      \"ticks\": \"\"\n                  }\n              },\n              \"type\": \"scatterternary\"\n          }\n      ],\n      \"surface\": [\n          {\n              \"colorbar\": {\n                  \"outlinewidth\": 0,\n                  \"ticks\": \"\"\n              },\n              \"colorscale\": [\n                  [\n                      0.0,\n                      \"#0d0887\"\n                  ],\n                  [\n                      0.1111111111111111,\n                      \"#46039f\"\n                  ],\n                  [\n                      0.2222222222222222,\n                      \"#7201a8\"\n                  ],\n                  [\n                      0.3333333333333333,\n                      \"#9c179e\"\n                  ],\n                  [\n                      0.4444444444444444,\n                      \"#bd3786\"\n                  ],\n                  [\n                      0.5555555555555556,\n                      \"#d8576b\"\n                  ],\n                  [\n                      0.6666666666666666,\n                      \"#ed7953\"\n                  ],\n                  [\n                      0.7777777777777778,\n                      \"#fb9f3a\"\n                  ],\n                  [\n                      0.8888888888888888,\n                      \"#fdca26\"\n                  ],\n                  [\n                      1.0,\n                      \"#f0f921\"\n                  ]\n              ],\n              \"type\": \"surface\"\n          }\n      ],\n      \"table\": [\n          {\n              \"cells\": {\n                  \"fill\": {\n                      \"color\": \"#506784\"\n                  },\n                  \"line\": {\n                      \"color\": \"rgb(30,30,30)\"\n                  }\n              },\n              \"header\": {\n                  \"fill\": {\n                      \"color\": \"#2a3f5f\"\n                  },\n                  \"line\": {\n                      \"color\": \"rgb(30,30,30)\"\n                  }\n              },\n              \"type\": \"table\"\n          }\n      ]\n  },\n  \"layout\": {\n      \"annotationdefaults\": {\n          \"arrowcolor\": \"#f2f5fa\",\n          \"arrowhead\": 0,\n          \"arrowwidth\": 1\n      },\n      \"autotypenumbers\": \"strict\",\n      \"coloraxis\": {\n          \"colorbar\": {\n              \"outlinewidth\": 0,\n              \"ticks\": \"\"\n          }\n      },\n      \"colorscale\": {\n          \"diverging\": [\n              [\n                  0,\n                  \"#8e0152\"\n              ],\n              [\n                  0.1,\n                  \"#c51b7d\"\n              ],\n              [\n                  0.2,\n                  \"#de77ae\"\n              ],\n              [\n                  0.3,\n                  \"#f1b6da\"\n              ],\n              [\n                  0.4,\n                  \"#fde0ef\"\n              ],\n              [\n                  0.5,\n                  \"#f7f7f7\"\n              ],\n              [\n                  0.6,\n                  \"#e6f5d0\"\n              ],\n              [\n                  0.7,\n                  \"#b8e186\"\n              ],\n              [\n                  0.8,\n                  \"#7fbc41\"\n              ],\n              [\n                  0.9,\n                  \"#4d9221\"\n              ],\n              [\n                  1,\n                  \"#276419\"\n              ]\n          ],\n          \"sequential\": [\n              [\n                  0.0,\n                  \"#0d0887\"\n              ],\n              [\n                  0.1111111111111111,\n                  \"#46039f\"\n              ],\n              [\n                  0.2222222222222222,\n                  \"#7201a8\"\n              ],\n              [\n                  0.3333333333333333,\n                  \"#9c179e\"\n              ],\n              [\n                  0.4444444444444444,\n                  \"#bd3786\"\n              ],\n              [\n                  0.5555555555555556,\n                  \"#d8576b\"\n              ],\n              [\n                  0.6666666666666666,\n                  \"#ed7953\"\n              ],\n              [\n                  0.7777777777777778,\n                  \"#fb9f3a\"\n              ],\n              [\n                  0.8888888888888888,\n                  \"#fdca26\"\n              ],\n              [\n                  1.0,\n                  \"#f0f921\"\n              ]\n          ],\n          \"sequentialminus\": [\n              [\n                  0.0,\n                  \"#0d0887\"\n              ],\n              [\n                  0.1111111111111111,\n                  \"#46039f\"\n              ],\n              [\n                  0.2222222222222222,\n                  \"#7201a8\"\n              ],\n              [\n                  0.3333333333333333,\n                  \"#9c179e\"\n              ],\n              [\n                  0.4444444444444444,\n                  \"#bd3786\"\n              ],\n              [\n                  0.5555555555555556,\n                  \"#d8576b\"\n              ],\n              [\n                  0.6666666666666666,\n                  \"#ed7953\"\n              ],\n              [\n                  0.7777777777777778,\n                  \"#fb9f3a\"\n              ],\n              [\n                  0.8888888888888888,\n                  \"#fdca26\"\n              ],\n              [\n                  1.0,\n                  \"#f0f921\"\n              ]\n          ]\n      },\n      \"colorway\": [\n          \"#636efa\",\n          \"#EF553B\",\n          \"#00cc96\",\n          \"#ab63fa\",\n          \"#FFA15A\",\n          \"#19d3f3\",\n          \"#FF6692\",\n          \"#B6E880\",\n          \"#FF97FF\",\n          \"#FECB52\"\n      ],\n      \"font\": {\n          \"color\": \"#f2f5fa\"\n      },\n      \"geo\": {\n          \"bgcolor\": \"rgb(30,30,30)\",\n          \"lakecolor\": \"rgb(30,30,30)\",\n          \"landcolor\": \"rgb(30,30,30)\",\n          \"showlakes\": true,\n          \"showland\": true,\n          \"subunitcolor\": \"#506784\"\n      },\n      \"hoverlabel\": {\n          \"align\": \"left\"\n      },\n      \"hovermode\": \"closest\",\n      \"mapbox\": {\n          \"style\": \"dark\"\n      },\n      \"paper_bgcolor\": \"rgb(30,30,30)\",\n      \"plot_bgcolor\": \"rgb(30,30,30)\",\n      \"polar\": {\n          \"angularaxis\": {\n              \"gridcolor\": \"#506784\",\n              \"linecolor\": \"#506784\",\n              \"ticks\": \"\"\n          },\n          \"bgcolor\": \"rgb(30,30,30)\",\n          \"radialaxis\": {\n              \"gridcolor\": \"#506784\",\n              \"linecolor\": \"#506784\",\n              \"ticks\": \"\"\n          }\n      },\n      \"scene\": {\n          \"xaxis\": {\n              \"backgroundcolor\": \"rgb(30,30,30)\",\n              \"gridcolor\": \"#506784\",\n              \"gridwidth\": 2,\n              \"linecolor\": \"#506784\",\n              \"showbackground\": true,\n              \"ticks\": \"\",\n              \"zerolinecolor\": \"#C8D4E3\"\n          },\n          \"yaxis\": {\n              \"backgroundcolor\": \"rgb(30,30,30)\",\n              \"gridcolor\": \"#506784\",\n              \"gridwidth\": 2,\n              \"linecolor\": \"#506784\",\n              \"showbackground\": true,\n              \"ticks\": \"\",\n              \"zerolinecolor\": \"#C8D4E3\"\n          },\n          \"zaxis\": {\n              \"backgroundcolor\": \"rgb(30,30,30)\",\n              \"gridcolor\": \"#506784\",\n              \"gridwidth\": 2,\n              \"linecolor\": \"#506784\",\n              \"showbackground\": true,\n              \"ticks\": \"\",\n              \"zerolinecolor\": \"#C8D4E3\"\n          }\n      },\n      \"shapedefaults\": {\n          \"line\": {\n              \"color\": \"#f2f5fa\"\n          }\n      },\n      \"sliderdefaults\": {\n          \"bgcolor\": \"#C8D4E3\",\n          \"bordercolor\": \"rgb(30,30,30)\",\n          \"borderwidth\": 1,\n          \"tickwidth\": 0\n      },\n      \"ternary\": {\n          \"aaxis\": {\n              \"gridcolor\": \"#506784\",\n              \"linecolor\": \"#506784\",\n              \"ticks\": \"\"\n          },\n          \"baxis\": {\n              \"gridcolor\": \"#506784\",\n              \"linecolor\": \"#506784\",\n              \"ticks\": \"\"\n          },\n          \"bgcolor\": \"rgb(30,30,30)\",\n          \"caxis\": {\n              \"gridcolor\": \"#506784\",\n              \"linecolor\": \"#506784\",\n              \"ticks\": \"\"\n          }\n      },\n\n      \"updatemenudefaults\": {\n          \"bgcolor\": \"#506784\",\n          \"borderwidth\": 0\n      },\n      \"xaxis\": {\n          \"automargin\": true,\n          \"gridcolor\": \"#283442\",\n          \"linecolor\": \"#506784\",\n          \"ticks\": \"\",\n          \"title\": {\n              \"standoff\": 15\n          },\n          \"zerolinecolor\": \"#283442\",\n          \"zerolinewidth\": 2\n      },\n      \"yaxis\": {\n          \"automargin\": true,\n          \"gridcolor\": \"#283442\",\n          \"linecolor\": \"#506784\",\n          \"ticks\": \"\",\n          \"title\": {\n              \"standoff\": 15\n          },\n          \"zerolinecolor\": \"#283442\",\n          \"zerolinewidth\": 2\n      }\n  }\n}\n\nVue.component('vue-plotly',\n{\n  inheritAttrs: false,\n  props: {\n    data: {\n      type: Array\n    },\n    layout: {\n      type: Object\n    },\n    id: {\n      type: String,\n      required: false,\n      default: null\n    }\n  },\n  data() {\n    return {\n      scheduled: null,\n      innerLayout: { ...this.layout }\n    };\n  },\n  mounted() {\n    this.innerLayout = { ...this.layout, template: this.template };\n    Plotly.newPlot(this.$el, this.data, this.innerLayout, this.options);\n    eventsP.forEach(evt => {\n      this.$el.on(evt.completeName, evt.handler(this));\n    });\n  },\n  watch: {\n    data: {\n      handler() {\n        this.schedule({ replot: true });\n      },\n      deep: true\n    },\n    options: {\n      handler(value, old) {\n        if (JSON.stringify(value) === JSON.stringify(old)) {\n          return;\n        }\n        this.schedule({ replot: true });\n      },\n      deep: true\n    },\n    layout(layout) {\n      this.innerLayout = { ...layout, template: this.template };\n      this.schedule({ replot: false });\n    }\n  },\n  computed: {\n    template() {\n      return this.$vuetify.theme.dark? darkTemplate : null;\n    },\n    options() {\n      const optionsFromAttrs = Object.keys(this.$attrs).reduce((acc, key) => {\n        acc[camelizeP(key)] = this.$attrs[key];\n        return acc;\n      }, {});\n      return {\n        responsive: false,\n        ...optionsFromAttrs\n      };\n    }\n  },\n  beforeDestroy() {\n    eventsP.forEach(event => this.$el.removeAllListeners(event.completeName));\n    Plotly.purge(this.$el);\n  },\n  methods: {\n    ...methods,\n    onResize() {\n      Plotly.Plots.resize(this.$el);\n    },\n    schedule(context) {\n      const { scheduled } = this;\n      if (scheduled) {\n        scheduled.replot = scheduled.replot || context.replot;\n        return;\n      }\n      this.scheduled = context;\n      this.$nextTick(() => {\n        const {\n          scheduled: { replot }\n        } = this;\n        this.scheduled = null;\n        if (replot) {\n          this.react();\n          return;\n        }\n        this.relayout(this.innerLayout);\n      });\n    },\n    toImage(options) {\n      const allOptions = Object.assign(this.getPrintOptions(), options);\n      return Plotly.toImage(this.$el, allOptions);\n    },\n    downloadImage(options) {\n      const filename = `plot--${new Date().toISOString()}`;\n      const allOptions = Object.assign(this.getPrintOptions(), { filename }, options);\n      return Plotly.downloadImage(this.$el, allOptions);\n    },\n    getPrintOptions() {\n      const { $el } = this;\n      return {\n        format: \"png\",\n        width: $el.clientWidth,\n        height: $el.clientHeight\n      };\n    },\n    react() {\n      Plotly.react(this.$el, this.data, this.innerLayout, this.options);\n    }\n  },\n  template: `\n    <div :id=\"id\"></div>\n  `\n})\n"
  },
  {
    "path": "www/web-gui/public/wallet.js",
    "content": "Vue.component('wallet-summary', {\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tloading: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tthis.loading = true;\n\t\t\tfetch('/wapi/wallet/accounts')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.data = data;\n\t\t\t\t})\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-progress-linear :active=\"loading\" indeterminate absolute top></v-progress-linear>\n\n\t\t\t<div v-for=\"item in data\" :key=\"item.address\">\n\t\t\t\t<account-summary :index=\"item.account\" :account=\"item\"></account-summary>\n\t\t\t</div>\n\n\t\t\t<v-btn to=\"/wallet/create\" outlined color=\"primary\" class=\"my-2\">{{ $t('wallet_summary.new_wallet') }}</v-btn>\n\t\t</div>\n\t\t`\n})\n\nVue.component('account-menu', {\n\tprops: {\n\t\tindex: Number\n\t},\n\ttemplate: `\n\t\t<v-btn-toggle class=\"d-flex flex-wrap\">\n\t\t\t<v-btn :to=\"'/wallet/account/' + index\" exact>{{ $t('account_menu.balance') }}</v-btn>\n\t\t\t<v-btn :to=\"'/wallet/account/' + index + '/nfts'\" v-if=false>{{ $t('account_menu.nfts') }}</v-btn>\n\t\t\t<v-btn :to=\"'/wallet/account/' + index + '/contracts'\">{{ $t('account_menu.contracts') }}</v-btn>\n\t\t\t<v-btn :to=\"'/wallet/account/' + index + '/send'\">{{ $t('account_menu.send') }}</v-btn>\n\t\t\t<v-btn :to=\"'/wallet/account/' + index + '/history'\">{{ $t('account_menu.history') }}</v-btn>\n\t\t\t<v-btn :to=\"'/wallet/account/' + index + '/log'\">{{ $t('account_menu.log') }}</v-btn>\n\t\t\t<v-btn :to=\"'/wallet/account/' + index + '/offer'\">{{ $t('account_menu.offer') }}</v-btn>\n\t\t\t<v-btn :to=\"'/wallet/account/' + index + '/liquid'\">{{ $t('account_menu.liquidity') }}</v-btn>\n\t\t\t<v-btn :to=\"'/wallet/account/' + index + '/plotnfts'\">PlotNFTs</v-btn>\n\t\t\t<v-btn :to=\"'/wallet/account/' + index + '/details'\">{{ $t('account_menu.info') }}</v-btn>\n\t\t\t<v-btn :to=\"'/wallet/account/' + index + '/options'\"><v-icon>mdi-cog</v-icon></v-btn>\n\t\t</v-btn-toggle>\n\t\t`\n})\n\nVue.component('account-header', {\n\tprops: {\n\t\tindex: Number,\n\t\taccount: Object\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tinfo: {\n\t\t\t\tname: null,\n\t\t\t\tindex: null,\n\t\t\t\taddress: null,\n\t\t\t\twith_passphrase: null\n\t\t\t},\n\t\t\tis_locked: null,\n\t\t\tpassphrase_dialog: false\n\t\t}\n\t},\n\tcomputed: {\n\t\taddress() {\n\t\t\treturn this.info.address ? this.info.address : \"N/A\";\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tif(this.account) {\n\t\t\t\tthis.info = this.account;\n\t\t\t} else {\n\t\t\t\tfetch('/wapi/wallet/account?index=' + this.index)\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => this.info = data);\n\t\t\t}\n\t\t\tthis.update_lock();\n\t\t},\n\t\tupdate_lock() {\n\t\t\tfetch('/api/wallet/is_locked?index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.is_locked = data);\n\t\t},\n\t\ttoggle_lock() {\n\t\t\tif(this.is_locked) {\n\t\t\t\tthis.passphrase_dialog = true;\n\t\t\t} else {\n\t\t\t\tconst req = {};\n\t\t\t\treq.index = this.index;\n\t\t\t\tfetch('/api/wallet/lock', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t\t.then(() => this.update_lock());\n\t\t\t}\n\t\t},\n\t\tunlock(passphrase) {\n\t\t\tconst req = {};\n\t\t\treq.index = this.index;\n\t\t\treq.passphrase = passphrase;\n\t\t\tfetch('/api/wallet/unlock', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tthis.update();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\talert(data);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\tcopyToClipboard(address) {\n\t\t\tnavigator.clipboard.writeText(address);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update_lock(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-chip label>{{ $t('account_header.wallet') }} #{{index}}</v-chip>\n\t\t\t<template v-if=\"info.address\">\n\t\t\t\t<v-chip label :class=\"{'pr-0': navigator.clipboard}\">\n\t\t\t\t\t{{ address }}\n\t\t\t\t\t<template v-if=\"navigator.clipboard\">\n\t\t\t\t\t\t<v-btn @click=\"copyToClipboard(address)\" text icon>\n\t\t\t\t\t\t\t<v-icon small class=\"pr-0\">mdi-content-copy</v-icon>\n\t\t\t\t\t\t</btn>\n\t\t\t\t\t</template>\n\t\t\t\t</v-chip>\n\t\t\t</template>\n\t\t\t<v-chip v-if=\"info.name\" label>{{info.name}}</v-chip>\n\t\t\t<v-btn v-if=\"info.with_passphrase && (is_locked != null)\" @click=\"toggle_lock()\" text icon>\n\t\t\t\t<v-icon small class=\"pr-0\">{{ is_locked ? \"mdi-lock\" : \"mdi-lock-open-variant\" }}</v-icon>\n\t\t\t</btn>\n\t\t\t<passphrase-dialog v-model=\"passphrase_dialog\" @submit=\"p => unlock(p)\"/>\n\t\t</div>\n\t\t`\n})\n\nVue.component('account-summary', {\n\tprops: {\n\t\tindex: Number,\n\t\taccount: Object\n\t},\n\ttemplate: `\n\t\t<v-card class=\"my-2\">\n\t\t\t<v-card-text>\n\t\t\t\t<account-header :index=\"index\" :account=\"account\"></account-header>\n\t\t\t\t<account-menu :index=\"index\" class=\"my-2\"></account-menu>\t\t\t\t\n\t\t\t\t<account-balance :index=\"index\"></account-balance>\n\t\t\t</v-card-text>\n\t\t</v-card>\n\t\t`\n})\n\nVue.component('account-balance', {\n\tprops: {\n\t\tindex: Number,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\tloaded: false,\n\t\t\ttimer: null\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('account_balance.balance'), value: 'total' },\n\t\t\t\t{ text: this.$t('account_balance.reserved'), value: 'reserved' },\n\t\t\t\t{ text: this.$t('account_balance.spendable'), value: 'spendable' },\n\t\t\t\t{ text: this.$t('account_balance.token'), value: 'token' },\n\t\t\t\t{ text: this.$t('account_balance.contract'), value: 'contract', width: '50%' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/balance?index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t\tthis.data = data.balances;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@3\" v-if=\"data.length == 0\"/>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.contract=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/address/' + item.contract\">{{item.is_native ? '' : item.contract}}</router-link>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.total=\"{ item }\">\n\t\t\t\t<b>{{amount_format(item.total)}}</b>\n\t\t\t</template>\n\t\t\t<template v-slot:item.reserved=\"{ item }\">\n\t\t\t\t<b>{{amount_format(item.reserved)}}</b>\n\t\t\t</template>\n\t\t\t<template v-slot:item.spendable=\"{ item }\">\n\t\t\t\t<b>{{amount_format(item.spendable)}}</b>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.token=\"{ item }\">\n\t\t\t\t<div :class=\"{'text--disabled': !item.is_validated}\">{{item.symbol}}</div>\n\t\t\t</template>\n\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('balance-table', {\n\tprops: {\n\t\taddress: String,\n\t\tshow_empty: Boolean\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\tloading: false,\n\t\t\tloaded: false,\n\t\t\ttimer: null\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('balance_table.balance'), value: 'total'},\n\t\t\t\t{ text: this.$t('balance_table.locked'), value: 'locked'},\n\t\t\t\t{ text: this.$t('balance_table.spendable'), value: 'spendable'},\n\t\t\t\t{ text: this.$t('balance_table.token'), value: 'symbol'},\n\t\t\t\t{ text: this.$t('balance_table.contract'), value: 'contract', width: '50%'},\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tthis.loading = true;\n\t\t\tfetch('/wapi/balance?id=' + this.address)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.loaded = true;\n\t\t\t\t\tthis.data = data.balances;\n\t\t\t\t});\n\t\t}\n\t},\n\twatch: {\n\t\taddress() {\n\t\t\tthis.update();\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"!loaded\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t\tv-if=\"!loaded || loaded && (data.length || show_empty)\"\n\t\t>\n\t\t\t<template v-slot:item.total=\"{ item }\">\n\t\t\t\t<b>{{amount_format(item.total)}}</b>\n\t\t\t</template>\n\t\t\t<template v-slot:item.locked=\"{ item }\">\n\t\t\t\t<b>{{amount_format(item.locked)}}</b>\n\t\t\t</template>\n\t\t\t<template v-slot:item.spendable=\"{ item }\">\n\t\t\t\t<b>{{amount_format(item.spendable)}}</b>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.contract=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/address/' + item.contract\">{{item.is_native ? '' : item.contract}}</router-link>\n\t\t\t</template>\n\t\t</v-data-table>\n\n\t\t<template v-if=\"!data && loading\">\n\t\t\t<div class=\"ui basic loading placeholder segment\"></div>\n\t\t</template>\n\t\t</div>\n\t\t`\n})\n\nVue.component('nft-table', {\n\tprops: {\n\t\tindex: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tnfts: []\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: 'NFT', value: 'item' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/balance?index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.nfts = data.nfts);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update()\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"nfts\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:item.item=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/address/' + item\">{{item}}</router-link>\n\t\t\t</template>\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('account-history', {\n\tprops: {\n\t\tindex: Number,\n\t\tlimit: Number,\n\t\tmemo: {\n\t\t\tdefault: null,\n\t\t\ttype: String\n\t\t},\n\t\ttype: {\n\t\t\tdefault: null,\n\t\t\ttype: String\n\t\t},\n\t\tcurrency: {\n\t\t\tdefault: null,\n\t\t\ttype: String\n\t\t}\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\tloading: true,\n\t\t\ttimer: null \n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('account_history.height'), value: 'height' },\n\t\t\t\t{ text: this.$t('account_history.type'), value: 'type' },\n\t\t\t\t{ text: this.$t('account_history.amount'), value: 'value' },\n\t\t\t\t{ text: this.$t('account_history.token'), value: 'token' },\n\t\t\t\t{ text: this.$t('account_history.address'), value: 'address' },\n\t\t\t\t{ text: \"Memo\", value: 'memo' },\n\t\t\t\t{ text: this.$t('account_history.link'), value: 'link' },\n\t\t\t\t{ text: this.$t('account_history.time'), value: 'time' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate(reload) {\n\t\t\tif(reload) {\n\t\t\t\tthis.data = [];\n\t\t\t\tthis.loading = true;\n\t\t\t}\n\t\t\tfetch('/wapi/wallet/history?limit=' + this.limit + '&index=' + this.index + '&type=' + this.type + '&memo=' + this.memo + '&currency=' + this.currency)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.data = data;\n\t\t\t\t});\n\t\t}\n\t},\n\twatch: {\n\t\ttype() {\n\t\t\tthis.update(true);\n\t\t},\n\t\tcurrency() {\n\t\t\tthis.update(true);\n\t\t},\n\t\tmemo() {\n\t\t\tthis.update(false);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 60000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"loading\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.height=\"{ item }\">\n\t\t\t\t<template v-if=\"item.is_pending\">\n\t\t\t\t\t<i>pending</i>\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<router-link :to=\"'/explore/block/height/' + item.height\">{{item.height}}</router-link>\n\t\t\t\t</template>\n\t\t\t</template>\t\n\t\t\t\n\t\t\t<template v-slot:item.type=\"{ item }\">\n\t\t\t\t<span :class=\"get_tx_type_color(item.type, $vuetify.theme.dark)\">{{item.type}}</span>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.value=\"{ item }\">\n\t\t\t\t<b>{{item.value}}</b>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.token=\"{ item }\">\n\t\t\t\t<template v-if=\"item.is_native\">\n\t\t\t\t\t{{item.symbol}}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<router-link :to=\"'/explore/address/' + item.contract\">{{item.is_nft ? \"[NFT]\" : item.symbol}}{{item.is_validated ? \"\" : \"?\"}}</router-link>\n\t\t\t\t</template>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.memo=\"{ item }\">\n\t\t\t\t<span style=\"word-break: break-all;\">{{ item.memo }}</span>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.address=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/address/' + item.address\">{{get_short_addr(item.address)}}</router-link>\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.link=\"{ item }\">\n\t\t\t\t<tx-type-link :type=\"item.type\" :id=\"item.txid\"/>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.time=\"{ item }\">\n\t\t\t\t<template v-if=\"!item.is_pending\">\n\t\t\t\t\t<span class=\"text-no-wrap\">{{new Date(item.time * 1000).toLocaleString()}}</span>\n\t\t\t\t</template>\n\t\t\t</template>\n\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('account-history-form', {\n\tprops: {\n\t\tindex: Number,\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttype: null,\n\t\t\tcurrency: null,\n\t\t\tmemo: null,\n\t\t\ttokens: []\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/tokens')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.tokens = data);\n\t\t}\n\t},\n\tcomputed: {\n\t\tselect_types() {\n\t\t\treturn [\n\t\t\t\t{text: this.$t('account_history_form.any'), value: null},\n\t\t\t\t{text: this.$t('account_history_form.spend'), value: \"SPEND\"},\n\t\t\t\t{text: this.$t('account_history_form.receive'), value: \"RECEIVE\"},\n\t\t\t\t{text: this.$t('account_history_form.reward'), value: \"REWARD\"},\n\t\t\t\t{text: \"VDF \" + this.$t('account_history_form.reward'), value: \"VDF_REWARD\"},\n\t\t\t\t{text: this.$t('account_history_form.tx_fee'), value: \"TXFEE\"}\n\t\t\t];\n\t\t},\n\t\tselect_tokens() {\n\t\t\tconst res = [{text: this.$t('account_history_form.any'), value: null}];\n\t\t\tfor(const token of this.tokens) {\n\t\t\t\tlet text = token.symbol;\n\t\t\t\tif(!token.is_native) {\n\t\t\t\t\ttext += \" - [\" + token.currency + \"]\";\n\t\t\t\t}\n\t\t\t\tres.push({text: text, value: token.currency});\n\t\t\t}\n\t\t\treturn res;\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card class=\"my-2\">\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-row>\n\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t<v-select v-model=\"type\" :label=\"$t('account_history.type')\"\n\t\t\t\t\t\t\t\t:items=\"select_types\" item-text=\"text\" item-value=\"value\" :disabled=\"memo != null && memo.length > 0\">\n\t\t\t\t\t\t\t</v-select>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col>\n\t\t\t\t\t\t\t<v-select v-model=\"currency\" :label=\"$t('account_history.token')\"\n\t\t\t\t\t\t\t\t:items=\"select_tokens\" item-text=\"text\" item-value=\"value\">\n\t\t\t\t\t\t\t</v-select>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t\t<v-text-field type=\"text\" label=\"Memo\" v-model=\"memo\"/>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\t\t\t<account-history :index=\"index\" :limit=\"limit\" :type=\"type\" :memo=\"memo\" :currency=\"currency\"></account-history>\n\t\t</div>\n\t`\n})\n\nVue.component('account-tx-history', {\n\tprops: {\n\t\tindex: Number,\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\tloading: true,\n\t\t\ttimer: null\t\t\t\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('account_tx_history.height'), value: 'height' },\n\t\t\t\t{ text: \"Type\", value: 'note' },\n\t\t\t\t{ text: \"Fee\", value: 'fee' },\n\t\t\t\t{ text: this.$t('account_tx_history.confirmed'), value: 'confirmed' },\n\t\t\t\t{ text: this.$t('account_tx_history.status'), value: 'state' },\n\t\t\t\t{ text: this.$t('account_tx_history.transaction_id'), value: 'transaction_id' },\n\t\t\t\t{ text: this.$t('account_tx_history.time'), value: 'time' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/tx_history?limit=' + this.limit + '&index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.data = data;\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-data-table\n\t\t\t:headers=\"headers\"\n\t\t\t:items=\"data\"\n\t\t\t:loading=\"loading\"\n\t\t\thide-default-footer\n\t\t\tdisable-sort\n\t\t\tdisable-pagination\n\t\t\tclass=\"elevation-2\"\n\t\t>\n\n\t\t\t<template v-slot:progress>\n\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.height=\"{ item }\">\n\t\t\t\t<template v-if=\"item.height\">\n\t\t\t\t\t<router-link :to=\"'/explore/block/height/' + item.height\">{{item.height}}</router-link>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.fee=\"{ item }\">\n\t\t\t\t<template v-if=\"item.height && item.fee\">\n\t\t\t\t\t<b>{{(item.fee.value).toFixed(3)}}</b> MMX\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t\t\n\t\t\t<template v-slot:item.state=\"{ item }\">\n\t\t\t\t<div :class=\"{'red--text': item.state == 'failed'}\">{{ $t(item.state) }}</div>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.transaction_id=\"{ item }\">\n\t\t\t\t<router-link :to=\"'/explore/transaction/' + item.id\">{{get_short_hash(item.id, 16)}}</router-link>\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.confirmed=\"{ item }\">\n\t\t\t\t{{item.confirm ? item.confirm > 1000 ? \"> 1000\" : item.confirm : null}}\n\t\t\t</template>\n\n\t\t\t<template v-slot:item.time=\"{ item }\">\n\t\t\t\t{{new Date(item.time).toLocaleString()}}\n\t\t\t</template>\n\n\t\t</v-data-table>\n\t\t`\n})\n\nVue.component('account-contract-summary', {\n\tprops: {\n\t\tindex: Number,\n\t\taddress: String,\n\t\tcontract: Object\n\t},\n\tmethods: {\n\t\tdeposit() {\n\t\t\tthis.$router.push(\"/wallet/account/\" + this.index + \"/send/\" + this.address);\n\t\t},\n\t\twithdraw() {\n\t\t\tthis.$router.push(\"/wallet/account/\" + this.index + \"/send_from/\" + this.address);\n\t\t}\n\t},\n\ttemplate: `\n\t\t<v-card class=\"my-2\">\n\t\t\t<v-card-text>\n\t\t\t\t<v-chip label>{{contract.__type}}</v-chip>\n\t\t\t\t<v-chip label>{{address}}</v-chip>\n\t\t\t\t<object-table :data=\"contract\" class=\"my-2\"></object-table>\n\t\t\t\t<balance-table :address=\"address\"></balance-table>\n\t\t\t\t<div v-if=\"contract.__type != 'mmx.contract.Executable'\" class=\"mt-4\">\n\t\t\t\t\t<v-btn outlined @click=\"deposit\">{{ $t('account_contract_summary.deposit') }}</v-btn>\n\t\t\t\t\t<v-btn outlined @click=\"withdraw\">{{ $t('account_contract_summary.withdraw') }}</v-btn>\n\t\t\t\t</div>\n\t\t\t</v-card-text>\n\t\t</v-card>\n\t\t`\n})\n\nVue.component('account-contracts', {\n\tprops: {\n\t\tindex: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tloading: false,\n\t\t\tcontractFilter: [],\n\t\t\tcontractFilterValues: []\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tthis.loading = true;\n\t\t\tfetch('/wapi/wallet/contracts?index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.contractFilter = Array.from(Array(data.length).keys())\n\t\t\t\t\tthis.contractFilterValues = data.map(item => item.__type).filter((value, index, self) => self.indexOf(value) === index)\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\tcomputed: {\n\t\tselectedContractFilterValues() {\n\t\t\treturn this.contractFilterValues.filter((value, index, self) => this.contractFilter.some( i => i === index) );\n\t\t},\n\t\tfilteredData() {\n\t\t\tif(this.data) {\n\t\t\t\treturn this.data.filter( (item, index, self) => this.selectedContractFilterValues.some( r => item.__type == r) );\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t},\n\ttemplate: `\n\t\t<v-card outlined color=\"transparent\">\n\t\t\t<v-progress-linear  v-if=\"!data && loading\" indeterminate absolute top></v-progress-linear>\n\n\t\t\t<v-chip-group column multiple v-model=\"contractFilter\">\n\t\t\t\t<v-chip v-for=\"item in contractFilterValues\" filter outlined>{{item}}</v-chip>\n\t\t\t</v-chip-group>\n\n\t\t\t<account-contract-summary v-if=\"filteredData\" v-for=\"item in filteredData\" :key=\"item.address\" :index=\"index\" :address=\"item.address\" :contract=\"item\">\n\t\t\t</account-contract-summary>\n\t\t</v-card>\n\t\t`\n})\n\nVue.component('account-liquid', {\n\tprops: {\n\t\tindex: Number,\n\t\tlimit: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\tloading: true,\n\t\t}\n\t},\n\tcomputed: {\n\t\theaders() {\n\t\t\treturn [\n\t\t\t\t{ text: this.$t('common.balance'), value: 'balance' },\n\t\t\t\t{ text: this.$t('common.symbol'), value: 'symbol' },\n\t\t\t\t{ text: this.$t('common.address'), value: 'address' },\n\t\t\t\t{ text: \"\", value: 'actions' },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/swap/liquid?index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.loading = false;\n\t\t\t\t\tthis.data = data;\n\t\t\t\t});\n\t\t},\n\t},\n\tcreated() {\n\t\tthis.update()\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-data-table\n\t\t\t\t:headers=\"headers\"\n\t\t\t\t:items=\"data\"\n\t\t\t\t:loading=\"loading\"\n\t\t\t\thide-default-footer\n\t\t\t\tdisable-sort\n\t\t\t\tdisable-pagination\n\t\t\t\tclass=\"elevation-2\"\n\t\t\t>\n\t\t\t\t<template v-slot:progress>\n\t\t\t\t\t<v-progress-linear indeterminate absolute top></v-progress-linear>\n\t\t\t\t\t<v-skeleton-loader type=\"table-row-divider@6\" />\n\t\t\t\t</template>\n\t\t\t\t\n\t\t\t\t<template v-slot:item.balance=\"{ item }\">\n\t\t\t\t\t<b>{{item.balance.value}}</b>\n\t\t\t\t</template>\n\t\t\t\t\n\t\t\t\t<template v-slot:item.symbol=\"{ item }\">\n\t\t\t\t\t<template v-if=\"item.symbol != 'MMX'\">\n\t\t\t\t\t\t<router-link :to=\"'/explore/address/' + item.currency\">{{item.symbol}}</router-link>\n\t\t\t\t\t</template>\n\t\t\t\t\t<template v-else>\n\t\t\t\t\t\t{{item.symbol}}\n\t\t\t\t\t</template>\n\t\t\t\t</template>\n\t\t\t\t\n\t\t\t\t<template v-slot:item.address=\"{ item }\">\n\t\t\t\t\t<router-link :to=\"'/swap/trade/' + item.address\">{{item.address}}</router-link>\n\t\t\t\t</template>\n\t\t\t\t\n\t\t\t\t<template v-slot:item.actions=\"{ item }\">\n\t\t\t\t\t<router-link :to=\"'/swap/liquid/' + item.address\">\n\t\t\t\t\t\t<v-btn outlined>{{ $t('common.manage') }}</v-btn>\n\t\t\t\t\t</router-link>\n\t\t\t\t</template>\n\t\t\t</v-data-table>\n\t\t</div>\n\t\t`\n})\n\nVue.component('account-details', {\n\tprops: {\n\t\tindex: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\taccount: null,\n\t\t\taddresses: null,\n\t\t\tkeys: null\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/account?index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tdelete data.is_hidden;\n\t\t\t\t\tthis.account = data;\n\t\t\t\t});\n\t\t\tfetch('/wapi/wallet/address?index=' + this.index + '&limit=1000')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.addresses = data);\n\t\t\tfetch('/wapi/wallet/keys?index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.keys = data);\n\t\t},\n\t\tcopyKeysToPlotter() {\n\t\t\twindow.mmx.copyKeysToPlotter(JSON.stringify(this.keys))\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<object-table :data=\"account\"></object-table>\n\t\t\t<object-table :data=\"keys\" class=\"my-2\"></object-table>\n\n\t\t\t<v-btn v-if=\"$isWinGUI && this.keys\" @click=\"copyKeysToPlotter\" color=\"primary\">{{ $t('account_details.copy_keys_to_plotter') }}</v-btn>\n\t\t\t\n\t\t\t<v-simple-table>\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<th>Index</th><th>Address</th>\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t<tr v-for=\"(address, index) in addresses\" :key=\"address\">\n\t\t\t\t\t\t<td class=\"key-cell\"><b>{{index}}</b></td>\n\t\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + address\">{{address}}</router-link></td>\n\t\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</v-simple-table>\n\t\t</div>\n\t\t`\n})\n\nVue.component('account-actions', {\n\tprops: {\n\t\tindex: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\taccount: null,\n\t\t\tseed: null,\n\t\t\tinfo: null,\n\t\t\tname: null,\n\t\t\tnum_addresses: null,\n\t\t\terror: null,\n\t\t\tseed_dialog: false,\n\t\t\tremove_dialog: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/account?index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.account = data;\n\t\t\t\t\tthis.name = data.name;\n\t\t\t\t\tthis.num_addresses = data.num_addresses;\n\t\t\t\t});\n\t\t},\n\t\treset_cache() {\n\t\t\tconst req = {};\n\t\t\treq.index = this.index;\n\t\t\tfetch('/api/wallet/reset_cache', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(res => this.on_response(res));\n\t\t},\n\t\tupdate_config() {\n\t\t\tif(this.num_addresses != this.account.num_addresses) {\n\t\t\t\tfetch('/api/wallet/set_address_count?index=' + this.index + \"&count=\" + this.num_addresses)\n\t\t\t\t\t.then(res => this.on_response(res));\n\t\t\t}\n\t\t},\n\t\tshow_seed() {\n\t\t\tfetch('/wapi/wallet/seed?index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.seed = data;\n\t\t\t\t\tthis.seed_dialog = true;\n\t\t\t\t});\n\t\t},\n\t\tremove() {\n\t\t\tfetch('/api/wallet/remove_account?index=' + this.index + \"&account=\" + this.account.index)\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) this.$router.push('/wallet/');\n\t\t\t\t});\n\t\t},\n\t\ton_response(res) {\n\t\t\tif(res.ok) {\n\t\t\t\tthis.info = \"Success\";\n\t\t\t\tthis.error = null;\n\t\t\t} else {\n\t\t\t\tres.text().then(data => {\n\t\t\t\t\tthis.info = null;\n\t\t\t\t\tthis.error = data;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tcopyToClipboard(value) {\n\t\t\tnavigator.clipboard.writeText(value).then(() => {});\n\t\t}\t\t\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\ttemplate: `\n\t\t<div>\t\t\t\n\t\t\t<v-card>\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-row>\n\t\t\t\t\t\t<v-col>\n\t\t\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t\t\tv-model=\"name\"\n\t\t\t\t\t\t\t\t:label=\"$t('create_wallet.account_name')\"\n\t\t\t\t\t\t\t\tdisabled>\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col cols=4>\n\t\t\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t\t\tv-model.number=\"num_addresses\"\n\t\t\t\t\t\t\t\t:label=\"$t('create_wallet.number_of_addresses')\"\n\t\t\t\t\t\t\t\tclass=\"text-align-right\">\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t\t\n\t\t\t\t\t<v-btn outlined @click=\"update_config\">Update</v-btn>\n\t\t\t\t\t<v-btn outlined @click=\"reset_cache\">{{ $t('account_actions.reset_cache') }}</v-btn>\n\n\t\t\t\t\t<v-dialog v-model=\"seed_dialog\" max-width=\"800\">\n\t\t\t\t\t\t<template v-slot:activator=\"{ on, attrs }\">\n\t\t\t\t\t\t\t<v-btn outlined @click=\"show_seed\">{{ $t('account_actions.show_seed') }}</v-btn>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-slot:default=\"dialog\">\n\t\t\t\t\t\t\t<v-card>\n\t\t\t\t\t\t\t\t<v-toolbar color=\"primary\"></v-toolbar>\n\t\t\t\t\t\t\t\t<v-card-text class=\"pb-0\">\n\t\t\t\t\t\t\t\t\t<v-container>\n\t\t\t\t\t\t\t\t\t\t<seed v-model=\"seed.string\" readonly></seed>\n\t\t\t\t\t\t\t\t\t\t<v-text-field class=\"mt-2\"\n\t\t\t\t\t\t\t\t\t\t\tv-if=\"account.with_passphrase\"\n\t\t\t\t\t\t\t\t\t\t\tv-model=\"account.finger_print\"\n\t\t\t\t\t\t\t\t\t\t\tlabel=\"Fingerprint (needed to verify passphrase)\"\n\t\t\t\t\t\t\t\t\t\t\treadonly>\n\t\t\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\t\t</v-container>\n\t\t\t\t\t\t\t\t</v-card-text>\n\t\t\t\t\t\t\t\t<v-card-actions>\n\t\t\t\t\t\t\t\t\t<v-spacer></v-spacer>\n\t\t\t\t\t\t\t\t\t<v-btn text @click=\"copyToClipboard(seed.string)\">Copy</v-btn>\n\t\t\t\t\t\t\t\t\t<v-btn text @click=\"seed_dialog = false\">Close</v-btn>\n\t\t\t\t\t\t\t\t</v-card-actions>\n\t\t\t\t\t\t\t</v-card>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</v-dialog>\n\t\t\t\t\t\n\t\t\t\t\t<v-dialog v-model=\"remove_dialog\" max-width=\"800\">\n\t\t\t\t\t\t<template v-slot:activator=\"{ on, attrs }\">\n\t\t\t\t\t\t\t<v-btn v-if=\"index >= 100\" outlined color=\"red\" @click=\"remove_dialog = true\">Remove</v-btn>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-slot:default=\"dialog\">\n\t\t\t\t\t\t\t<v-card>\n\t\t\t\t\t\t\t\t<v-toolbar color=\"primary\"></v-toolbar>\n\t\t\t\t\t\t\t\t<v-card-text class=\"pb-0\">\n\t\t\t\t\t\t\t\t\t<v-container>\n\t\t\t\t\t\t\t\t\t\t<v-alert border=\"left\" colored-border type=\"warning\" elevation=\"2\">\n\t\t\t\t\t\t\t\t\t\t\tTo recover any funds you will need to re-create the wallet from a stored backup!\n\t\t\t\t\t\t\t\t\t\t</v-alert>\n\t\t\t\t\t\t\t\t\t\t<v-alert border=\"left\" colored-border type=\"info\" elevation=\"2\">\n\t\t\t\t\t\t\t\t\t\t\t'{{account.key_file}}' needs to be deleted manually.\n\t\t\t\t\t\t\t\t\t\t</v-alert>\n\t\t\t\t\t\t\t\t\t</v-container>\n\t\t\t\t\t\t\t\t</v-card-text>\n\t\t\t\t\t\t\t\t<v-card-actions class=\"justify-end\">\n\t\t\t\t\t\t\t\t\t<v-btn color=\"error\" @click=\"remove()\">Remove</v-btn>\n\t\t\t\t\t\t\t\t\t<v-btn @click=\"remove_dialog = false\">{{ $t('common.cancel') }}</v-btn>\n\t\t\t\t\t\t\t\t</v-card-actions>\n\t\t\t\t\t\t\t</v-card>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</v-dialog>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"success\"\n\t\t\t\televation=\"2\"\n\t\t\t\tv-if=\"info\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{info}}\n\t\t\t</v-alert>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\televation=\"2\"\n\t\t\t\tv-if=\"error\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\t\t</div>\n\t\t`\n})\n\nVue.component('create-account', {\n\tprops: {\n\t\tindex: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tname: null,\n\t\t\toffset: null,\n\t\t\tnum_addresses: 1,\n\t\t\terror: null\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/account?index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.data = data);\n\t\t},\n\t\tsubmit() {\n\t\t\tif(this.offset < 1) {\n\t\t\t\tthis.error = \"'Account Index' cannot be less than 1\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst req = {};\n\t\t\treq.config = {};\n\t\t\treq.config.name = this.name;\n\t\t\treq.config.index = this.offset;\n\t\t\treq.config.key_file = this.data.key_file;\n\t\t\treq.config.num_addresses = this.num_addresses;\n\t\t\tfetch('/api/wallet/create_account', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tthis.$router.push('/wallet/');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\tthis.error = data;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card>\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-row >\n\t\t\t\t\t\t<v-col>\n\t\t\t\t\t\t\t<v-text-field type=\"text\" :label=\"$t('create_account.account_index')\" v-model.number=\"offset\" class=\"text-align-right\"/>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col cols=\"6\">\n\t\t\t\t\t\t\t<v-text-field type=\"text\" :label=\"$t('create_account.account_name')\" v-model=\"name\"/>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col>\n\t\t\t\t\t\t\t<v-text-field type=\"text\" :label=\"$t('create_account.number_of_addresses')\" v-model.number=\"num_addresses\"/>\t\t\t\t\t\t\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t\t<v-btn outlined @click=\"submit\">{{ $t('create_account.create_account') }}</v-btn>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\televation=\"2\"\n\t\t\t\tv-if=\"error\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\t\t</div>\n\t\t`\n})\n\nVue.component('create-wallet', {\n\tdata() {\n\t\treturn {\n\t\t\tname: null,\n\t\t\tnum_addresses: 1,\n\t\t\twith_seed: false,\n\t\t\twith_passphrase: false,\n\t\t\tseed: null,\n\t\t\tpassphrase: null,\n\t\t\tfinger_print: null,\n\t\t\terror: null,\n\t\t\tshow_passphrase: false\n\t\t}\n\t},\n\tmethods: {\n\t\tsubmit() {\n\t\t\tconst req = {};\n\t\t\treq.config = {};\n\t\t\treq.config.name = this.name;\n\t\t\treq.config.num_addresses = this.num_addresses;\n\t\t\tif(this.with_seed) {\n\t\t\t\treq.words = this.seed;\n\t\t\t}\n\t\t\tif(this.with_passphrase) {\n\t\t\t\treq.passphrase = this.passphrase;\n\t\t\t}\n\t\t\tfetch('/api/wallet/create_wallet', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tthis.$router.push('/wallet/');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => {\n\t\t\t\t\t\t\tthis.error = data;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\tvalidate() {\n\t\t\tif(this.with_seed && this.with_passphrase && this.finger_print) {\n\t\t\t\tconst req = {};\n\t\t\t\treq.words = this.seed;\n\t\t\t\treq.finger_print = this.finger_print;\n\t\t\t\treq.passphrase = this.passphrase;\n\t\t\t\tfetch('/wapi/passphrase/validate', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t\t.then(response => {\n\t\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\t\tthis.submit();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.error = \"Wrong passphrase!\";\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.submit();\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card>\n\t\t\t\t<v-card-text>\n\n\t\t\t\t\t<v-row>\n\t\t\t\t\t\t<v-col>\n\t\t\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t\t\tv-model=\"name\"\n\t\t\t\t\t\t\t\t:label=\"$t('create_wallet.account_name')\">\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col cols=4>\n\n\t\t\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t\t\tv-model.number=\"num_addresses\"\n\t\t\t\t\t\t\t\t:label=\"$t('create_wallet.number_of_addresses')\"\n\t\t\t\t\t\t\t\tclass=\"text-align-right\">\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\n\t\t\t\t\t<v-checkbox\n\t\t\t\t\t\tv-model=\"with_seed\"\n\t\t\t\t\t\t:label=\"$t('create_wallet.use_custom_seed')\">\n\t\t\t\t\t</v-checkbox>\n\n\t\t\t\t\t<v-card v-if=\"with_seed\">\n\t\t\t\t\t\t<v-card-title class=\"text-subtitle-1\">\n\t\t\t\t\t\t\t{{$t('create_wallet.seed_words')}}\n\t\t\t\t\t\t</v-card-title>\n\t\t\t\t\t\t<v-card-text v-show=\"with_seed\">\n\t\t\t\t\t\t\t<seed v-model=\"seed\" :disabled=\"!with_seed\"/>\n\t\t\t\t\t\t</v-card-text>\n\t\t\t\t\t</v-card>\n\n\t\t\t\t\t<v-checkbox\n\t\t\t\t\t\tv-model=\"with_passphrase\"\n\t\t\t\t\t\t:label=\"$t('create_wallet.use_passphrase')\">\n\t\t\t\t\t</v-checkbox>\n\n\t\t\t\t\t<v-card v-if=\"with_passphrase\" class=\"pt-0\">\n\t\t\t\t\t\t<v-card-text class=\"pt-2 pb-0\">\n\t\t\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t\t\tv-model=\"passphrase\"\n\t\t\t\t\t\t\t\t:label=\"$t('create_wallet.passphrase')\"\n\t\t\t\t\t\t\t\t:disabled=\"!with_passphrase\"\n\t\t\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\t\t\t:type=\"show_passphrase ? 'text' : 'password'\"\n\t\t\t\t\t\t\t\t:append-icon=\"show_passphrase ? 'mdi-eye' : 'mdi-eye-off'\"\n\t\t\t\t\t\t\t\t@click:append=\"show_passphrase = !show_passphrase\">\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t\t\tv-if=\"with_seed\"\n\t\t\t\t\t\t\t\tv-model=\"finger_print\"\n\t\t\t\t\t\t\t\tlabel=\"Fingerprint (optional, to validate passphrase)\"\n\t\t\t\t\t\t\t\tplaceholder=\"123456789\">\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-card-text>\n\t\t\t\t\t</v-card>\n\t\t\t\t\t\n\t\t\t\t\t<v-btn @click=\"validate()\" class=\"mt-5\" outlined color=\"primary\">{{ $t('create_wallet.create_wallet') }}</v-btn>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\t\t\t\t\t\t\t\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\tv-if=\"error\"\n\t\t\t\televation=\"2\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\t\t</div>\n\t\t`\n})\n\nVue.component('passphrase-dialog', {\n\tprops: {\n\t\tshow: Boolean\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tpassphrase: null,\n\t\t\tshow_passphrase: false\n\t\t}\n\t},\t\n\tmodel: {\n\t\tprop: 'show',\n\t\tevent: 'close'\n\t},\n\tmethods: {\n\t\tonSubmit() {\n\t\t\tthis.$emit('submit', this.passphrase);\n\t\t\tthis.passphrase = null;\n\t\t\tthis.onClose();\n\t\t},\n\t\tonClose() {\n\t\t\tthis.show = false\n\t\t\tthis.$emit('close');\n\t\t}\n\t},\t\n\ttemplate: `\n\t\t<v-dialog v-model=\"show\" max-width=\"800\" persistent>\n\t\t\t<template v-slot:default=\"dialog\">\n\t\t\t\t<v-card>\n\t\t\t\t\t<v-toolbar color=\"primary\"></v-toolbar>\n\t\t\t\t\t<v-card-text class=\"pb-0 pt-2\">\n\t\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t\tv-model=\"passphrase\"\n\t\t\t\t\t\t\t:label=\"$t('wallet_common.enter_passphrase')\"\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\tautocomplete=\"new-password\"\n\t\t\t\t\t\t\t:type=\"show_passphrase ? 'text' : 'password'\"\n\t\t\t\t\t\t\t:append-icon=\"show_passphrase ? 'mdi-eye' : 'mdi-eye-off'\"\n\t\t\t\t\t\t\t@click:append=\"show_passphrase = !show_passphrase\"\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t</v-card-text>\n\t\t\t\t\t<v-card-actions>\n\t\t\t\t\t\t<v-spacer></v-spacer>\n\t\t\t\t\t\t<v-btn text @click=\"onClose\">Cancel</v-btn>\n\t\t\t\t\t\t<v-btn color=\"primary\" text @click=\"onSubmit\">Submit</v-btn>\n\t\t\t\t\t</v-card-actions>\n\t\t\t\t</v-card>\n\t\t\t</template>\n\t\t</v-dialog>\n\t`\n})\n\nVue.component('account-send-form', {\n\tprops: {\n\t\tindex: Number,\n\t\ttarget_: String,\t\t// fixed destination address (optional)\n\t\tsource_: String,\t\t// withdraw from contract (optional)\n\t},\n\tdata() {\n\t\treturn {\n\t\t\taccounts: [],\n\t\t\tbalances: [],\n\t\t\tamount: null,\n\t\t\ttarget: null,\n\t\t\tsource: null,\n\t\t\tmemo: null,\n\t\t\taddress: \"\",\n\t\t\tcurrency: null,\n\t\t\tfee_ratio: 1024,\n\t\t\tfee_amount: null,\n\t\t\tconfirmed: false,\n\t\t\tresult: null,\n\t\t\terror: null,\n\t\t\tpassphrase_dialog: false\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/accounts')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.accounts = data);\n\t\t\tif(this.source) {\n\t\t\t\tfetch('/wapi/address?id=' + this.source)\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => this.balances = data.balances);\n\t\t\t} else {\n\t\t\t\tfetch('/wapi/wallet/balance?index=' + this.index)\n\t\t\t\t\t.then(response => response.json())\n\t\t\t\t\t.then(data => this.balances = data.balances);\n\t\t\t}\n\t\t},\n\t\tasync is_locked() {\n\t\t\treturn fetch('/api/wallet/is_locked?index=' + this.index).then(res => res.json());\n\t\t},\n\t\tasync update_fee() {\n\t\t\tif(await this.is_locked() || !this.is_valid()) {\n\t\t\t\tthis.fee_amount = \"?\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst req = this.create_request();\n\t\t\treq.options.auto_send = false;\n\t\t\t\n\t\t\tfetch('/wapi/wallet/send', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tresponse.json().then(tx => this.fee_amount = tx.exec_result.total_fee_value);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.fee_amount = \"?\";\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\tcreate_request() {\n\t\t\tconst req = {options: {}};\n\t\t\treq.index = this.index;\n\t\t\treq.amount = this.amount;\n\t\t\treq.currency = this.currency;\n\t\t\tif(this.source) {\n\t\t\t\treq.src_addr = this.source;\n\t\t\t}\n\t\t\treq.dst_addr = this.target;\n\t\t\treq.options.memo = this.memo ? this.memo : null;\n\t\t\treq.options.fee_ratio = this.fee_ratio;\n\t\t\treturn req;\n\t\t},\n\t\tasync submit() {\n\t\t\tif(await this.is_locked()) {\n\t\t\t\tthis.passphrase_dialog = true;\n\t\t\t} else {\n\t\t\t\tthis.submit_ex(null);\n\t\t\t}\n\t\t},\n\t\tsubmit_ex(passphrase) {\n\t\t\tthis.confirmed = false;\n\t\t\tif(!validate_address(this.target)) {\n\t\t\t\tthis.error = \"invalid destination address\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst req = this.create_request();\n\t\t\treq.options.passphrase = passphrase;\n\t\t\t\n\t\t\tfetch('/wapi/wallet/send', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tresponse.json().then(data => this.result = data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => this.error = data);\n\t\t\t\t\t}\n\t\t\t\t\tthis.update();\n\t\t\t\t\tthis.$refs.balance.update();\n\t\t\t\t\tthis.$refs.history.update();\n\t\t\t\t});\n\t\t},\n\t\tmemo_rule(value) {\n\t\t\tif(value && value.length > 64) {\n\t\t\t\treturn \"maximum length is 64\";\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\t\tis_valid() {\n\t\t\treturn this.target && this.currency && validate_amount(this.amount) == true;\n\t\t}\n\t},\n\tcreated() {\n\t\tif(this.source_) {\n\t\t\tthis.source = this.source_;\n\t\t}\n\t\tif(this.target_) {\n\t\t\tthis.address = \"\";\n\t\t\tthis.target = this.target_;\n\t\t}\n\t\tthis.update();\n\t},\n\twatch: {\n\t\taddress(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.target = value;\n\t\t\t} else {\n\t\t\t\tthis.target = null;\n\t\t\t}\n\t\t\tthis.confirmed = false;\n\t\t},\n\t\ttarget() {\n\t\t\tthis.confirmed = false;\n\t\t},\n\t\tcurrency() {\n\t\t\tthis.confirmed = false;\n\t\t},\n\t\tamount() {\n\t\t\tthis.confirmed = false;\n\t\t},\n\t\tmemo() {\n\t\t\tthis.confirmed = false;\n\t\t},\n\t\tfee_ratio() {\n\t\t\tif(this.confirmed) {\n\t\t\t\tthis.update_fee();\n\t\t\t}\n\t\t},\n\t\tconfirmed(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.update_fee();\n\t\t\t} else {\n\t\t\t\tthis.fee_amount = null;\n\t\t\t}\n\t\t},\n\t\tresult(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.error = null;\n\t\t\t}\n\t\t},\n\t\terror(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.result = null;\n\t\t\t}\n\t\t}\n\t},\t\n\tcomputed: {\n\t\tselectAccounts() {\n\t\t\tvar result = [];\n\t\t\t\n\t\t\tresult.push({ text: this.$t('account_send_form.address_input'), value: \"\"});\n\n\t\t\tthis.accounts.map(item => {\n\t\t\t\tresult.push(\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: `${this.$t('account_send_form.wallet') } #${item.account} (${item.address})`,\n\t\t\t\t\t\tvalue: item.address\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn result;\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<passphrase-dialog v-model=\"passphrase_dialog\" @submit=\"p => submit_ex(p)\"/>\n\n\t\t\t<balance-table :address=\"source\" :show_empty=\"true\" v-if=\"source\" ref=\"balance\"></balance-table>\n\t\t\t<account-balance :index=\"index\" v-if=\"!source\" ref=\"balance\"></account-balance>\n\n\t\t\t<v-card class=\"my-2\">\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-text-field \n\t\t\t\t\t\tv-if=\"!!source\"\n\t\t\t\t\t\tv-model=\"source\" \n\t\t\t\t\t\t:label=\"$t('account_send_form.source_address')\" disabled>\n\t\t\t\t\t</v-text-field>\n\n\t\t\t\t\t<v-select \n\t\t\t\t\t\tv-model=\"address\"\n\t\t\t\t\t\t:label=\"$t('account_send_form.destination')\"\n\t\t\t\t\t\t:items=\"selectAccounts\"\n\t\t\t\t\t\titem-text=\"text\"\n\t\t\t\t\t\titem-value=\"value\"\n\t\t\t\t\t\t:disabled=\"!!target_\">\n\t\t\t\t\t</v-select>\n\n\t\t\t\t\t<v-text-field\n\t\t\t\t\t\tv-model=\"target\"\n\t\t\t\t\t\t:label=\"$t('account_send_form.destination_address')\"\n\t\t\t\t\t\t:disabled=\"!!address || !!target_\"\n\t\t\t\t\t\tplaceholder=\"mmx1...\" clearable\n\t\t\t\t\t></v-text-field>\n\n\t\t\t\t\t<v-row>\n\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t:label=\"$t('account_send_form.amount')\"\n\t\t\t\t\t\t\t\tv-model=\"amount\"\n\t\t\t\t\t\t\t\tplaceholder=\"1.23\"\n\t\t\t\t\t\t\t\t:rules=\"[validate_amount]\"\n\t\t\t\t\t\t\t></v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col>\n\t\t\t\t\t\t\t<v-select\n\t\t\t\t\t\t\t\tv-model=\"currency\"\n\t\t\t\t\t\t\t\t:label=\"$t('account_send_form.currency')\"\n\t\t\t\t\t\t\t\t:items=\"balances\"\n\t\t\t\t\t\t\t\titem-text=\"contract\"\n\t\t\t\t\t\t\t\titem-value=\"contract\">\n\n\t\t\t\t\t\t\t\t<template v-for=\"slotName in ['item', 'selection']\" v-slot:[slotName]=\"{ item }\">\n\t\t\t\t\t\t\t\t\t{{item.symbol + (item.is_validated || source ? '' : '?')}}\n\t\t\t\t\t\t\t\t\t<template v-if=\"!item.is_native\"> - [{{item.contract}}]</template>\n\t\t\t\t\t\t\t\t</template>\n\n\t\t\t\t\t\t\t</v-select>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t\t\n\t\t\t\t\t<v-text-field v-model=\"memo\" label=\"Memo\" :rules=\"[memo_rule]\"\" clearable></v-text-field>\n\t\t\t\t\t\n\t\t\t\t\t<v-row justify=\"end\">\n\t\t\t\t\t\t<v-col cols=\"2\">\n\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => this.fee_ratio = value\"></tx-fee-select>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col cols=\"2\">\n\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\tlabel=\"TX Fee\"\n\t\t\t\t\t\t\t\tv-model.number=\"fee_amount\" suffix=\"MMX\" disabled>\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t\t\n\t\t\t\t\t<v-card-actions class=\"py-0\">\n\t\t\t\t\t\t<v-spacer></v-spacer>\n\t\t\t\t\t\t<v-switch v-model=\"confirmed\" :label=\"$t('account_offer_form.confirm')\" class=\"d-inline-block\" style=\"margin-right: 50px\"></v-switch>\n\t\t\t\t\t\t<v-btn @click=\"submit\" outlined color=\"primary\" :disabled=\"!this.confirmed || !is_valid()\">{{ $t('account_send_form.send') }}</v-btn>\n\t\t\t\t\t</v-card-actions>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"success\"\n\t\t\t\televation=\"2\"\n\t\t\t\tv-if=\"result\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.transaction_has_been_sent') }}: <router-link :to=\"'/explore/transaction/' + result.id\">{{result.id}}</router-link>\n\t\t\t</v-alert>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\televation=\"2\"\n\t\t\t\tv-if=\"error\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\n\t\t\t<account-tx-history :index=\"index\" :limit=\"10\" ref=\"history\"></account-tx-history>\n\t\t</div>\n\t\t`\n})\n\nVue.component('account-offer-form', {\n\tprops: {\n\t\tindex: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttokens: [],\n\t\t\tbalances: [],\n\t\t\tprice: null,\n\t\t\tbid_amount: null,\n\t\t\task_symbol: null,\n\t\t\tbid_symbol: null,\n\t\t\tbid_currency: null,\n\t\t\task_currency: null,\n\t\t\tfee_ratio: 1024,\n\t\t\tfee_amount: null,\n\t\t\tconfirmed: false,\n\t\t\ttimer: null,\n\t\t\tresult: null,\n\t\t\terror: null\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/tokens')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.tokens = data);\n\t\t\tfetch('/wapi/wallet/balance?index=' + this.index)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.balances = data.balances);\n\t\t},\n\t\tupdate_fee() {\n\t\t\tif(this.is_valid()) {\n\t\t\t\tconst req = this.create_request();\n\t\t\t\treq.options.auto_send = false;\n\t\t\t\tfetch('/wapi/wallet/make_offer', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t\t.then(response => {\n\t\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\t\tresponse.json().then(tx => this.fee_amount = tx.exec_result.total_fee_value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.fee_amount = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.fee_amount = null;\n\t\t\t}\n\t\t},\n\t\tcreate_request() {\n\t\t\tconst req = {options: {}};\n\t\t\treq.index = this.index;\n\t\t\treq.bid = this.bid_amount;\n\t\t\treq.price = this.price;\n\t\t\treq.bid_currency = this.bid_currency.contract;\n\t\t\treq.ask_currency = this.ask_currency.currency;\n\t\t\treq.options.fee_ratio = this.fee_ratio;\n\t\t\treturn req;\n\t\t},\n\t\tsubmit() {\n\t\t\tthis.confirmed = false;\n\t\t\tfetch('/wapi/wallet/make_offer', {body: JSON.stringify(this.create_request()), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tresponse.json().then(data => this.result = data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => this.error = data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t},\n\t\tis_valid() {\n\t\t\treturn this.bid_currency && this.ask_currency\n\t\t\t\t&& validate_address(this.bid_currency.contract) && validate_address(this.ask_currency.currency)\n\t\t\t\t&& validate_amount(this.bid_amount) == true && this.price > 0;\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\twatch: {\n\t\tprice() {\n\t\t\tthis.confirmed = false;\n\t\t},\n\t\tbid_amount() {\n\t\t\tthis.confirmed = false;\n\t\t},\n\t\task_currency() {\n\t\t\tthis.confirmed = false;\n\t\t},\n\t\tbid_currency() {\n\t\t\tthis.confirmed = false;\n\t\t},\n\t\tfee_ratio() {\n\t\t\tthis.update_fee();\n\t\t},\n\t\tconfirmed(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.update_fee();\n\t\t\t}\n\t\t},\n\t\tresult(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.error = null;\n\t\t\t}\n\t\t},\n\t\terror(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.result = null;\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<account-balance :index=\"index\" ref=\"balance\"></account-balance>\n\t\t\t<v-card class=\"my-2\">\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-row>\n\t\t\t\t\t\t<v-col cols=\"4\" class=\"pb-0\">\n\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t:label=\"$t('account_offer_form.offer_amount')\"\n\t\t\t\t\t\t\t\tplaceholder=\"1.23\"\n\t\t\t\t\t\t\t\tv-model=\"bid_amount\"\n\t\t\t\t\t\t\t\t:rules=\"[validate_amount]\"\n\t\t\t\t\t\t\t></v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col class=\"pb-0\">\n\t\t\t\t\t\t\t<v-select\n\t\t\t\t\t\t\t\tv-model=\"bid_currency\"\n\t\t\t\t\t\t\t\t:label=\"$t('account_offer_form.offer_currency')\"\n\t\t\t\t\t\t\t\t:items=\"balances\">\n\n\t\t\t\t\t\t\t\t<template v-for=\"slotName in ['item', 'selection']\" v-slot:[slotName]=\"{ item }\">\n\t\t\t\t\t\t\t\t\t{{item.symbol + (item.is_validated ? '' : '?')}}\n\t\t\t\t\t\t\t\t\t<template v-if=\"!item.is_native\"> - [{{item.contract}}]</template>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</v-select>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t\t<v-row>\n\t\t\t\t\t\t<v-col cols=\"4\" class=\"py-0\">\n\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t:label=\"$t('account_offers.price')\"\n\t\t\t\t\t\t\t\tv-model=\"price\"\n\t\t\t\t\t\t\t\t:suffix=\"ask_currency && bid_currency ? bid_currency.symbol + ' / ' + ask_currency.symbol : null\"\n\t\t\t\t\t\t\t></v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col class=\"py-0\">\n\t\t\t\t\t\t\t<v-select\n\t\t\t\t\t\t\t\tv-model=\"ask_currency\"\n\t\t\t\t\t\t\t\tlabel=\"Receive Currency\"\n\t\t\t\t\t\t\t\t:items=\"tokens\">\n\n\t\t\t\t\t\t\t\t<template v-for=\"slotName in ['item', 'selection']\" v-slot:[slotName]=\"{ item }\">\n\t\t\t\t\t\t\t\t\t{{item.symbol}}\n\t\t\t\t\t\t\t\t\t<template v-if=\"item.currency != MMX_ADDR\"> - [{{item.currency}}]</template>\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t</v-select>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t\t<v-row justify=\"end\">\n\t\t\t\t\t\t<v-col cols=\"2\" class=\"py-0\">\n\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => this.fee_ratio = value\"></tx-fee-select>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col cols=\"2\" class=\"py-0\">\n\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\tlabel=\"TX Fee\"\n\t\t\t\t\t\t\t\tv-model.number=\"fee_amount\" suffix=\"MMX\" disabled>\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\t\t\t\t\t<v-card-actions class=\"pb-0\">\n\t\t\t\t\t\t<v-spacer></v-spacer>\n\t\t\t\t\t\t<v-switch v-model=\"confirmed\" :label=\"$t('account_offer_form.confirm')\" class=\"d-inline-block\" style=\"margin-right: 50px\"></v-switch>\n\t\t\t\t\t\t<v-btn @click=\"submit\" outlined color=\"primary\" :disabled=\"!this.confirmed || !is_valid()\">{{ $t('account_offer_form.offer') }}</v-btn>\n\t\t\t\t\t</v-card-actions>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\t\t\t\n\t\t\t<v-alert border=\"left\" colored-border type=\"success\" elevation=\"2\" v-if=\"result\" class=\"my-2\">\n\t\t\t\t{{ $t('common.transaction_has_been_sent') }}: <router-link :to=\"'/explore/transaction/' + result.id\">{{result.id}}</router-link>\n\t\t\t</v-alert>\n\t\t\t<v-alert border=\"left\" colored-border type=\"error\" elevation=\"2\" v-if=\"error\" class=\"my-2\">\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\t\t\t\n\t\t\t<account-offers :index=\"index\" ref=\"offers\"></account-offers>\n\t\t</div>\n\t\t`\n})\n\nVue.component('account-offers', {\n\tprops: {\n\t\tindex: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: [],\n\t\t\terror: null,\n\t\t\tresult: null,\n\t\t\ttimer: null,\n\t\t\tstate: true,\n\t\t\tdialog_item: null,\n\t\t\tdialog_cancel: false,\n\t\t\tdialog_deposit: false,\n\t\t\tdialog_withdraw: false,\n\t\t\tdialog_update: false,\n\t\t\tdeposit_amount: null,\n\t\t\tnew_price: null,\n\t\t\tfee_amount: null,\n\t\t\trequest: null,\n\t\t\trequest_url: null,\n\t\t\tcanceled: new Set(),\n\t\t\twithdrawn: new Set()\n\t\t}\n\t},\n\tcomputed: {\n\t\tselect_states() {\n\t\t\treturn [\n\t\t\t\t{text: this.$t('account_offers.any'), value: false},\n\t\t\t\t{text: this.$t('account_offers.open'), value: true},\n\t\t\t];\n\t\t},\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/offers?index=' + this.index + '&state=' + this.state)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.data = data.sort((L, R) => R.height - L.height));\n\t\t},\n\t\tupdate_fee() {\n\t\t\tif(this.request) {\n\t\t\t\tconst req = this.request;\n\t\t\t\tconst url = this.request_url;\n\t\t\t\treq.options.auto_send = false;\n\t\t\t\tfetch(url, {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t\t.then(response => {\n\t\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\t\tresponse.json().then(tx => this.fee_amount = tx.exec_result.total_fee_value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.fee_amount = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.fee_amount = null;\n\t\t\t}\n\t\t},\n\t\tupdate_fee_ratio(value) {\n\t\t\tif(this.request) {\n\t\t\t\tthis.request.options.fee_ratio = value;\n\t\t\t\tthis.update_fee();\n\t\t\t}\n\t\t},\n\t\tcancel(item) {\n\t\t\tconst args = {options: {}};\n\t\t\targs.index = this.index;\n\t\t\targs.address = item.address;\n\t\t\tthis.request = args;\n\t\t\tthis.request_url = '/wapi/wallet/cancel_offer';\n\t\t\tthis.update_fee();\n\t\t\t\n\t\t\tthis.dialog_item = item;\n\t\t\tthis.dialog_cancel = true;\n\t\t},\n\t\twithdraw(item) {\n\t\t\tconst args = {options: {}};\n\t\t\targs.index = this.index;\n\t\t\targs.address = item.address;\n\t\t\tthis.request = args;\n\t\t\tthis.request_url = '/wapi/wallet/offer_withdraw';\n\t\t\tthis.update_fee();\n\t\t\t\n\t\t\tthis.dialog_item = item;\n\t\t\tthis.dialog_withdraw = true;\n\t\t},\n\t\tdeposit(item) {\n\t\t\tconst args = {options: {}};\n\t\t\targs.index = this.index;\n\t\t\targs.currency = item.bid_currency;\n\t\t\targs.dst_addr = item.address;\n\t\t\tthis.request = args;\n\t\t\tthis.request_url = '/wapi/wallet/send';\n\t\t\t\n\t\t\tthis.dialog_item = item;\n\t\t\tthis.deposit_amount = null;\n\t\t\tthis.dialog_deposit = true;\n\t\t},\n\t\tupdate_price(item) {\n\t\t\tconst args = {options: {\n\t\t\t\tuser: item.owner\n\t\t\t}};\n\t\t\targs.index = this.index;\n\t\t\targs.address = item.address;\n\t\t\targs.method = \"set_price\";\n\t\t\targs.args = [1];\n\t\t\tthis.request = args;\n\t\t\tthis.request_url = '/wapi/wallet/execute';\n\t\t\tthis.update_fee();\n\n\t\t\tthis.dialog_item = item;\n\t\t\tthis.new_price = null;\n\t\t\tthis.dialog_update = true;\n\t\t},\n\t\tsubmit() {\n\t\t\tconst url = this.request_url;\n\t\t\tconst item = this.dialog_item;\n\t\t\tconst req = this.request;\n\t\t\treq.options.auto_send = true;\n\t\t\tfetch(url, {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tif(url == '/wapi/wallet/send') {\n\t\t\t\t\t\t\tthis.canceled.delete(item.address);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(url == '/wapi/wallet/cancel_offer') {\n\t\t\t\t\t\t\tthis.canceled.add(item.address);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(url == '/wapi/wallet/offer_withdraw') {\n\t\t\t\t\t\t\tthis.withdrawn.add(item.address);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresponse.json().then(data => {\n\t\t\t\t\t\t\tthis.result = data;\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => this.error = data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\tthis.dialog_cancel = false;\n\t\t\tthis.dialog_withdraw = false;\n\t\t\tthis.dialog_deposit = false;\n\t\t\tthis.dialog_update = false;\n\t\t\tthis.request = null;\n\t\t\tthis.request_url = null;\n\t\t\tthis.deposit_amount = null;\n\t\t}\n\t},\n\twatch: {\n\t\tstate(value) {\n\t\t\tthis.update();\n\t\t},\n\t\tindex(value) {\n\t\t\tthis.update();\n\t\t},\n\t\tdeposit_amount(value) {\n\t\t\tif(this.request) {\n\t\t\t\tthis.request.amount = value;\n\t\t\t\tthis.update_fee();\n\t\t\t}\n\t\t},\n\t\tnew_price(value) {\n\t\t\tif(this.request) {\n\t\t\t\tconst new_price = value * Math.pow(2, 64) * Math.pow(10, this.dialog_item.bid_decimals - this.dialog_item.ask_decimals);\n\t\t\t\tthis.request.args = [to_string_hex(new_price)];\n\t\t\t\tthis.update_fee();\n\t\t\t}\n\t\t},\n\t\tresult(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.error = null;\n\t\t\t}\n\t\t},\n\t\terror(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.result = null;\n\t\t\t}\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t<v-card class=\"my-2\">\n\t\t\t<v-card-text>\n\t\t\t\t<v-select v-model=\"state\" :label=\"$t('account_offers.status')\"\n\t\t\t\t\t:items=\"select_states\" item-text=\"text\" item-value=\"value\">\n\t\t\t\t</v-select>\n\t\t\t</v-card-text>\n\t\t</v-card>\n\t\t<v-card>\n\t\t\t<v-simple-table>\n\t\t\t\t<thead>\n\t\t\t\t<tr>\n\t\t\t\t\t<th colspan=\"2\">{{ $t('account_offers.offering') }}</th>\n\t\t\t\t\t<th colspan=\"2\">{{ $t('account_offers.received') }}</th>\n\t\t\t\t\t<th colspan=\"2\">{{ $t('account_offers.price') }}</th>\n\t\t\t\t\t<th></th>\n\t\t\t\t\t<th></th>\n\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t<tr v-for=\"item in data\" :key=\"item.address\">\n\t\t\t\t\t<td class=\"collapsing\"><b>{{item.bid_balance_value}}</b></td>\n\t\t\t\t\t<td>{{item.bid_symbol}}</td>\n\t\t\t\t\t<td class=\"collapsing\"><b>{{item.ask_balance_value}}</b></td>\n\t\t\t\t\t<td>{{item.ask_symbol}}</td>\n\t\t\t\t\t<td class=\"collapsing\"><b>{{parseFloat((1/item.display_price).toPrecision(6))}}</b></td>\n\t\t\t\t\t<td>{{item.bid_symbol}} / {{item.ask_symbol}}</td>\n\t\t\t\t\t<td><router-link :to=\"'/explore/address/' + item.address\">TX</router-link></td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<template v-if=\"item.bid_balance > 0 && !canceled.has(item.address)\">\n\t\t\t\t\t\t\t<v-btn outlined text small color=\"red darken-1\" @click=\"cancel(item)\">{{ $t('account_offers.revoke') }}</v-btn>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-if=\"item.ask_balance > 0 && !withdrawn.has(item.address)\">\n\t\t\t\t\t\t\t<v-btn outlined text small @click=\"withdraw(item)\">Withdraw</v-btn>\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<v-btn outlined text small color=\"green darken-1\" @click=\"deposit(item)\">{{ $t('account_offers.deposit') }}</v-btn>\n\t\t\t\t\t\t<v-btn outlined text small color=\"blue darken-1\" @click=\"update_price(item)\">Update</v-btn>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t</tbody>\n\t\t\t</v-simple-table>\n\t\t</v-card>\n\t\t\n\t\t<v-dialog v-model=\"dialog_cancel\" max-width=\"1000\">\n\t\t\t<template v-slot:default=\"dialog\">\n\t\t\t\t<v-card>\n\t\t\t\t\t<v-toolbar color=\"primary\"></v-toolbar>\n\t\t\t\t\t<v-card-title>{{ $t('account_offers.revoke') }} {{dialog_item.address}}</v-card-title>\n\t\t\t\t\t<v-card-text class=\"pb-0\">\n\t\t\t\t\t\t<v-row justify=\"end\">\n\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => update_fee_ratio(value)\"></tx-fee-select>\n\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\tlabel=\"TX Fee\"\n\t\t\t\t\t\t\t\t\tv-model.number=\"fee_amount\" suffix=\"MMX\" disabled>\n\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t</v-row>\n\t\t\t\t\t</v-card-text>\n\t\t\t\t\t<v-card-actions class=\"justify-end\">\n\t\t\t\t\t\t<v-btn @click=\"submit()\" color=\"primary\">{{ $t('account_offers.revoke') }}</v-btn>\n\t\t\t\t\t\t<v-btn @click=\"dialog_cancel = false\">{{ $t('common.cancel') }}</v-btn>\n\t\t\t\t\t</v-card-actions>\n\t\t\t\t</v-card>\n\t\t\t</template>\n\t\t</v-dialog>\n\t\t\n\t\t<v-dialog v-model=\"dialog_withdraw\" max-width=\"1000\">\n\t\t\t<template v-slot:default=\"dialog\">\n\t\t\t\t<v-card>\n\t\t\t\t\t<v-toolbar color=\"primary\"></v-toolbar>\n\t\t\t\t\t<v-card-title>Withdraw from {{dialog_item.address}}</v-card-title>\n\t\t\t\t\t<v-card-text class=\"pb-0\">\n\t\t\t\t\t\t<v-row justify=\"end\">\n\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => update_fee_ratio(value)\"></tx-fee-select>\n\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\tlabel=\"TX Fee\"\n\t\t\t\t\t\t\t\t\tv-model.number=\"fee_amount\" suffix=\"MMX\" disabled>\n\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t</v-row>\n\t\t\t\t\t</v-card-text>\n\t\t\t\t\t<v-card-actions class=\"justify-end\">\n\t\t\t\t\t\t<v-btn @click=\"submit()\" color=\"primary\">Withdraw</v-btn>\n\t\t\t\t\t\t<v-btn @click=\"dialog_withdraw = false\">{{ $t('common.cancel') }}</v-btn>\n\t\t\t\t\t</v-card-actions>\n\t\t\t\t</v-card>\n\t\t\t</template>\n\t\t</v-dialog>\n\t\t\n\t\t<v-dialog v-model=\"dialog_deposit\" max-width=\"1000\">\n\t\t\t<template v-slot:default=\"dialog\">\n\t\t\t\t<v-card>\n\t\t\t\t\t<v-toolbar color=\"primary\"></v-toolbar>\n\t\t\t\t\t<v-card-title>{{ $t('account_offers.deposit_to') }} {{dialog_item.address}}</v-card-title>\n\t\t\t\t\t<v-card-text class=\"pb-0\">\n\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\tv-model=\"deposit_amount\"\n\t\t\t\t\t\t\t:label=\"$t('common.amount')\"\n\t\t\t\t\t\t\t:suffix=\"dialog_item.bid_symbol\">\n\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t<v-row justify=\"end\">\n\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => update_fee_ratio(value)\"></tx-fee-select>\n\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\tlabel=\"TX Fee\"\n\t\t\t\t\t\t\t\t\tv-model.number=\"fee_amount\" suffix=\"MMX\" disabled>\n\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t</v-row>\n\t\t\t\t\t</v-card-text>\n\t\t\t\t\t<v-card-actions class=\"justify-end\">\n\t\t\t\t\t\t<v-btn @click=\"submit()\" color=\"primary\" :disabled=\"!(deposit_amount > 0)\">{{ $t('common.deposit') }}</v-btn>\n\t\t\t\t\t\t<v-btn @click=\"dialog_deposit = false\">{{ $t('common.cancel') }}</v-btn>\n\t\t\t\t\t</v-card-actions>\n\t\t\t\t</v-card>\n\t\t\t</template>\n\t\t</v-dialog>\n\n\t\t<v-dialog v-model=\"dialog_update\" max-width=\"1000\">\n\t\t\t<template v-slot:default=\"dialog\">\n\t\t\t\t<v-card>\n\t\t\t\t\t<v-toolbar color=\"primary\"></v-toolbar>\n\t\t\t\t\t<v-card-title>Update {{dialog_item.address}}</v-card-title>\n\t\t\t\t\t<v-card-text class=\"pb-0\">\n\t\t\t\t\t\t<v-row justify=\"end\">\n\t\t\t\t\t\t\t<v-col cols=\"4\">\n\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\tv-model=\"new_price\"\n\t\t\t\t\t\t\t\t\tlabel=\"New Price\"\n\t\t\t\t\t\t\t\t\t:suffix=\"dialog_item.bid_symbol + ' / ' + dialog_item.ask_symbol\">\n\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => update_fee_ratio(value)\"></tx-fee-select>\n\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t\t<v-col cols=\"3\">\n\t\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\t\tlabel=\"TX Fee\"\n\t\t\t\t\t\t\t\t\tv-model.number=\"fee_amount\" suffix=\"MMX\" disabled>\n\t\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t</v-row>\n\t\t\t\t\t</v-card-text>\n\t\t\t\t\t<v-card-actions class=\"justify-end\">\n\t\t\t\t\t\t<v-btn @click=\"submit()\" color=\"primary\" :disabled=\"!(new_price > 0)\">Update</v-btn>\n\t\t\t\t\t\t<v-btn @click=\"dialog_update = false\">{{ $t('common.cancel') }}</v-btn>\n\t\t\t\t\t</v-card-actions>\n\t\t\t\t</v-card>\n\t\t\t</template>\n\t\t</v-dialog>\n\t\t\n\t\t<v-alert border=\"left\" colored-border type=\"success\" elevation=\"2\" v-if=\"result\" class=\"my-2\">\n\t\t\t{{ $t('common.transaction_has_been_sent') }}: <router-link :to=\"'/explore/transaction/' + result.id\">{{result.id}}</router-link>\n\t\t</v-alert>\n\n\t\t<v-alert border=\"left\" colored-border type=\"error\" elevation=\"2\" v-if=\"error\" class=\"my-2\">\n\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t</v-alert>\n\t\t</div>\n\t\t`\n})\n\nVue.component('create-contract-menu', {\n\tprops: {\n\t\tindex: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\ttype: null,\n\t\t\ttypes: [\n// \t\t\t\t{ value: \"virtualplot\", text: \"mmx.contract.VirtualPlot\" },\n\t\t\t]\n\t\t}\n\t},\n\tmethods: {\n\t\tsubmit() {\n\t\t\tthis.$router.push(\"/wallet/account/\" + this.index + \"/create/\" + this.type);\n\t\t}\n\t},\n\ttemplate: `\n\t\t<v-card>\n\t\t\t<v-card-text>\n\t\t\t\t<v-select v-model=\"type\" :items=\"types\" :label=\"$t('create_contract_menu.contract_type')\">\n\t\t\t\t</v-select>\n\t\t\t\t<v-btn outlined @click=\"submit\" :disabled=\"!type\">{{ $t('common.create') }}</v-btn>\n\t\t\t</v-card-text>\n\t\t</v-card>\n\t\t`\n})\n\nVue.component('create-locked-contract', {\n\tprops: {\n\t\tindex: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\towner: null,\n\t\t\tunlock_height: null,\n\t\t\tvalid: false,\n\t\t\tconfirmed: false,\n\t\t\tresult: null,\n\t\t\terror: null\n\t\t}\n\t},\n\tmethods: {\n\t\tcheck_valid() {\n\t\t\tthis.valid = validate_address(this.owner) && this.unlock_height;\n\t\t\tif(!this.valid) {\n\t\t\t\tthis.confirmed = false;\n\t\t\t}\n\t\t},\n\t\tsubmit() {\n\t\t\t// TODO\n\t\t},\n\t\tsubmit_ex(passphrase) {\n\t\t\tthis.confirmed = false;\n\t\t\tconst contract = {};\n\t\t\tcontract.__type = \"mmx.contract.Executable\";\n\t\t\t// TODO\n\t\t\tcontract.owner = this.owner;\n\t\t\tcontract.unlock_height = this.unlock_height;\n\t\t\tconst req = {};\n\t\t\treq.index = this.index;\n\t\t\treq.payload = contract;\n\t\t\treq.options = {passphrase: passphrase};\n\t\t\tfetch('/wapi/wallet/deploy', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tresponse.json().then(data => this.result = data);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => this.error = data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t},\n\twatch: {\n\t\towner(value) {\n\t\t\tthis.check_valid();\n\t\t},\n\t\tunlock_height(value) {\n\t\t\tthis.check_valid();\n\t\t},\n\t\tresult(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.error = null;\n\t\t\t}\n\t\t},\n\t\terror(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.result = null;\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-chip label>{{ $t('common.create') }}</v-chip>\n\t\t\t<v-chip label>mmx.contract.TimeLock</v-chip>\n\n\t\t\t<v-card class=\"my-2\">\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-text-field \n\t\t\t\t\t\t:label=\"$t('create_locked_contract.owner_address')\"\n\t\t\t\t\t\tv-model=\"owner\" \n\t\t\t\t\t\tplaceholder=\"mmx1...\">\n\t\t\t\t\t</v-text-field>\n\n\t\t\t\t\t<v-text-field \n\t\t\t\t\t\t:label=\"$t('create_locked_contract.unlock_height')\"\n\t\t\t\t\t\tv-model.number=\"unlock_height\">\n\t\t\t\t\t</v-text-field>\n\n\t\t\t\t\t<v-switch \n\t\t\t\t\t\tv-model=\"confirmed\"\n\t\t\t\t\t\t:disabled=\"!valid\"\n\t\t\t\t\t\t:label=\"$t('common.confirm')\"\n\t\t\t\t\t\tclass=\"d-inline-block\">\n\t\t\t\t\t</v-switch><br>\n\n\t\t\t\t\t<v-btn @click=\"submit\" outlined color=\"primary\" :disabled=\"!confirmed\">{{ $t('common.deploy') }}</v-btn>\n\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"success\"\n\t\t\t\tv-if=\"result\"\n\t\t\t\televation=\"2\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.deployed_as') }}: <b>{{result}}</b>\n\t\t\t</v-alert>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\tv-if=\"error\"\n\t\t\t\televation=\"2\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\t\t</div>\n\t\t`\n})\n\nVue.component('create-plotnft', {\n\tprops: {\n\t\tindex: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tname: null,\n\t\t\tvalid: false,\n\t\t\tfee_ratio: 1024,\n\t\t\tconfirmed: false,\n\t\t\tresult: null,\n\t\t\terror: null\n\t\t}\n\t},\n\tmethods: {\n\t\tcheck_valid() {\n\t\t\tthis.valid = this.name && this.name.length > 0;\n\t\t\tif(!this.valid) {\n\t\t\t\tthis.confirmed = false;\n\t\t\t}\n\t\t},\n\t\tsubmit() {\n\t\t\tthis.submit_ex(null);\n\t\t},\n\t\tsubmit_ex(passphrase) {\n\t\t\tthis.confirmed = false;\n\t\t\tconst req = {};\n\t\t\treq.index = this.index;\n\t\t\treq.name = this.name;\n\t\t\treq.options = {\n\t\t\t\tfee_ratio: this.fee_ratio,\n\t\t\t\tpassphrase: passphrase\n\t\t\t};\n\t\t\tfetch('/api/wallet/plotnft_create', {body: JSON.stringify(req), method: \"post\"})\n\t\t\t\t.then(response => {\n\t\t\t\t\tif(response.ok) {\n\t\t\t\t\t\tthis.result = this.name;\n\t\t\t\t\t\tthis.name = null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresponse.text().then(data => this.error = data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t},\n\tcomputed: {\n\t\tfee_amount() {\n\t\t\treturn parseFloat((0.095 * this.fee_ratio / 1024).toFixed(3));\n\t\t}\n\t},\n\twatch: {\n\t\tname(value) {\n\t\t\tthis.confirmed = false;\n\t\t\tthis.check_valid();\n\t\t},\n\t\tresult(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.error = null;\n\t\t\t}\n\t\t},\n\t\terror(value) {\n\t\t\tif(value) {\n\t\t\t\tthis.result = null;\n\t\t\t}\n\t\t}\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<v-card class=\"my-2\">\n\t\t\t\t<v-card-text>\n\t\t\t\t\t<v-row>\n\t\t\t\t\t\t<v-col>\n\t\t\t\t\t\t\t<v-text-field\n\t\t\t\t\t\t\t\tlabel=\"New PlotNFT Name\"\n\t\t\t\t\t\t\t\tv-model=\"name\">\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col cols=\"2\">\n\t\t\t\t\t\t\t<tx-fee-select @update-value=\"value => this.fee_ratio = value\"></tx-fee-select>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t\t<v-col cols=\"2\">\n\t\t\t\t\t\t\t<v-text-field class=\"text-align-right\"\n\t\t\t\t\t\t\t\tlabel=\"TX Fee\"\n\t\t\t\t\t\t\t\tv-model.number=\"fee_amount\" suffix=\"MMX\" disabled>\n\t\t\t\t\t\t\t</v-text-field>\n\t\t\t\t\t\t</v-col>\n\t\t\t\t\t</v-row>\n\n\t\t\t\t\t<v-card-actions class=\"py-0\">\n\t\t\t\t\t\t<v-spacer></v-spacer>\n\t\t\t\t\t\t<v-switch \n\t\t\t\t\t\t\tv-model=\"confirmed\"\n\t\t\t\t\t\t\t:disabled=\"!valid\"\n\t\t\t\t\t\t\t:label=\"$t('common.confirm')\"\n\t\t\t\t\t\t\tclass=\"d-inline-block\" style=\"margin-right: 50px\">\n\t\t\t\t\t\t</v-switch>\n\t\t\t\t\t\t<v-btn @click=\"submit\" outlined color=\"primary\" :disabled=\"!confirmed\">{{ $t('common.create') }}</v-btn>\n\t\t\t\t\t</v-card-actions>\n\t\t\t\t</v-card-text>\n\t\t\t</v-card>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"success\"\n\t\t\t\tv-if=\"result\"\n\t\t\t\televation=\"2\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\tCreated new PlotNFT: {{result}}\n\t\t\t</v-alert>\n\n\t\t\t<v-alert\n\t\t\t\tborder=\"left\"\n\t\t\t\tcolored-border\n\t\t\t\ttype=\"error\"\n\t\t\t\tv-if=\"error\"\n\t\t\t\televation=\"2\"\n\t\t\t\tclass=\"my-2\"\n\t\t\t>\n\t\t\t\t{{ $t('common.failed_with') }}: <b>{{error}}</b>\n\t\t\t</v-alert>\n\t\t</div>\n\t\t`\n})\n\nVue.component('account-plotnfts', {\n\tprops: {\n\t\tindex: Number\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tlist: [],\n\t\t\ttimer: null,\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tif(!this.$root.params) {\n\t\t\t\tsetTimeout(() => { this.update(); }, 500);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfetch('/wapi/wallet/contracts?index=' + this.index + '&type_hash=' + this.$root.params.plot_nft_binary + '&owned=true')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.list = data);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\ttimer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<div>\n\t\t\t<template v-for=\"item in list\">\n\t\t\t\t<plotnft-control :address=\"item.address\"></plotnft-control>\n\t\t\t</template>\n\t\t</div>\n\t\t`\n})\n\nVue.component('plotnft-control', {\n\tprops: {\n\t\taddress: String\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\ttimer: null,\n\t\t}\n\t},\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/plotnft?id=' + this.address)\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => this.data = data);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.update();\n\t\ttimer = setInterval(() => { this.update(); }, 10000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-card v-if=\"data\" class=\"my-2\">\n\t\t\t<v-card-title>\n\t\t\t\t{{data.name}}\n\t\t\t</v-card-title>\n\t\t\t<v-card-text>\n\t\t\t\t<v-simple-table>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td class=\"key-cell\">Address</td>\n\t\t\t\t\t\t<td>\n\t\t\t\t\t\t\t{{data.address}}\n\t\t\t\t\t\t\t<template v-if=\"navigator.clipboard\">\n\t\t\t\t\t\t\t\t<v-btn @click=\"navigator.clipboard.writeText(data.address)\" text icon>\n\t\t\t\t\t\t\t\t\t<v-icon small class=\"pr-0\">mdi-content-copy</v-icon>\n\t\t\t\t\t\t\t\t</btn>\n\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t<td class=\"key-cell\">Pool Server</td>\n\t\t\t\t\t\t<td v-if=\"data.server_url\">{{data.server_url}}</td>\n\t\t\t\t\t\t<td v-else>N/A (solo farming)</td>\n\t\t\t\t\t</tr>\n\t\t\t\t\t<tr v-if=\"data.is_locked\">\n\t\t\t\t\t\t<td class=\"key-cell\">Unlock Height</td>\n\t\t\t\t\t\t<td>{{data.unlock_height}}</td>\n\t\t\t\t\t<tr>\n\t\t\t\t\t</tbody>\n\t\t\t\t</v-simple-table>\n\t\t\t</v-card-text>\n\t\t</v-card>\n\t`\n});\n\nVue.component('wallet-menu', {\n\tdata() {\n\t\treturn {\n\t\t\twallets: [],\n\t\t\twallet: null,\n\t\t\ttimer: null,\n\t\t}\n\t},\n\temits: [\n\t\t\"wallet-select\"\n\t],\n\tmethods: {\n\t\tupdate() {\n\t\t\tfetch('/wapi/wallet/accounts')\n\t\t\t\t.then(response => response.json())\n\t\t\t\t.then(data => {\n\t\t\t\t\tthis.wallets = data;\n\t\t\t\t\tif(this.wallet == null && data.length) {\n\t\t\t\t\t\tthis.wallet = data[0].account;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}\n\t},\n\twatch: {\n\t\twallet(value) {\n\t\t\tlocalStorage.setItem('active_wallet', value);\n\t\t\tthis.$emit('wallet-select', value);\n\t\t}\n\t},\n\tcreated() {\n\t\tthis.wallet = get_active_wallet();\n\t\tthis.update();\n\t\tthis.timer = setInterval(() => { this.update(); }, 60000);\n\t},\n\tbeforeDestroy() {\n\t\tclearInterval(this.timer);\n\t},\n\ttemplate: `\n\t\t<v-select\n\t\t\tv-model=\"wallet\"\n\t\t\t:items=\"wallets\"\n\t\t\t:label=\"$t('market_menu.wallet')\"\n\t\t\titem-text=\"account\"\n\t\t\titem-value=\"account\">\n\t\t\t<template v-for=\"slotName in ['item', 'selection']\" v-slot:[slotName]=\"{ item }\">\n\t\t\t\t{{ $t('market_menu.wallet') }} #{{item.account}} ({{item.address}})\n\t\t\t</template>\n\t\t</v-select>\n\t`\n})\n"
  }
]